diff --git a/.github/workflows/check-python-deps.yml b/.github/workflows/check-python-deps.yml index 844b7bee94e..0201ea817cd 100644 --- a/.github/workflows/check-python-deps.yml +++ b/.github/workflows/check-python-deps.yml @@ -8,6 +8,10 @@ on: pull_request: types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + pull-requests: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index c52e5b9f980..987eac5b73b 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -17,13 +17,12 @@ jobs: steps: - name: Check if user is allowed id: check + env: + COMMENTER: ${{ github.event.comment.user.login }} run: | # List of allowed users ALLOWED_USERS="mistercrunch,rusackas" - # Get the commenter's username - COMMENTER="${{ github.event.comment.user.login }}" - echo "Checking permissions for user: $COMMENTER" # Check if user is in allowed list @@ -45,9 +44,12 @@ jobs: steps: - name: Comment access denied uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + COMMENTER_LOGIN: ${{ github.event.comment.user.login || github.event.review.user.login || github.event.issue.user.login }} with: script: | - const message = `πŸ‘‹ Hi @${{ github.event.comment.user.login || github.event.review.user.login || github.event.issue.user.login }}! + const commenter = process.env.COMMENTER_LOGIN; + const message = `πŸ‘‹ Hi @${commenter}! Thanks for trying to use Claude Code, but currently only certain team members have access to this feature. diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 5ae6ebd2c02..c37f04e5173 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4 + uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -53,6 +53,6 @@ jobs: - name: Perform CodeQL Analysis if: steps.check.outputs.python || steps.check.outputs.frontend - uses: github/codeql-action/analyze@v4 + uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 13d05bcbc9a..dc66ffc48ba 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -29,7 +29,7 @@ jobs: - name: "Checkout Repository" uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: "Dependency Review" - uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4.9.0 + uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0 continue-on-error: true with: fail-on-severity: critical diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 930f94b1484..0b50cfc664e 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -9,6 +9,10 @@ on: branches: - "master" +permissions: + contents: read + pull-requests: read + concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} cancel-in-progress: true diff --git a/.github/workflows/embedded-sdk-release.yml b/.github/workflows/embedded-sdk-release.yml index 8bcf42a56be..0d4296e84f6 100644 --- a/.github/workflows/embedded-sdk-release.yml +++ b/.github/workflows/embedded-sdk-release.yml @@ -6,6 +6,9 @@ on: - "master" - "[0-9].[0-9]*" +permissions: + contents: read + jobs: config: runs-on: ubuntu-24.04 diff --git a/.github/workflows/embedded-sdk-test.yml b/.github/workflows/embedded-sdk-test.yml index 9d5237fce34..b5be1cbdf81 100644 --- a/.github/workflows/embedded-sdk-test.yml +++ b/.github/workflows/embedded-sdk-test.yml @@ -6,6 +6,9 @@ on: - "superset-embedded-sdk/**" types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/ephemeral-env-pr-close.yml b/.github/workflows/ephemeral-env-pr-close.yml index 1752031c22f..b7f79c69283 100644 --- a/.github/workflows/ephemeral-env-pr-close.yml +++ b/.github/workflows/ephemeral-env-pr-close.yml @@ -58,7 +58,7 @@ jobs: - name: Login to Amazon ECR if: steps.describe-services.outputs.active == 'true' id: login-ecr - uses: aws-actions/amazon-ecr-login@19d944daaa35f0fa1d3f7f8af1d3f2e5de25c5b7 # v2 + uses: aws-actions/amazon-ecr-login@fa648b43de3d4d023bcb3f89ed6940096949c419 # v2 - name: Delete ECR image tag if: steps.describe-services.outputs.active == 'true' diff --git a/.github/workflows/ephemeral-env.yml b/.github/workflows/ephemeral-env.yml index 8b6b403a0d4..8dd91b80c98 100644 --- a/.github/workflows/ephemeral-env.yml +++ b/.github/workflows/ephemeral-env.yml @@ -199,7 +199,7 @@ jobs: - name: Login to Amazon ECR id: login-ecr - uses: aws-actions/amazon-ecr-login@19d944daaa35f0fa1d3f7f8af1d3f2e5de25c5b7 # v2 + uses: aws-actions/amazon-ecr-login@fa648b43de3d4d023bcb3f89ed6940096949c419 # v2 - name: Load, tag and push image to ECR id: push-image @@ -235,7 +235,7 @@ jobs: - name: Login to Amazon ECR id: login-ecr - uses: aws-actions/amazon-ecr-login@19d944daaa35f0fa1d3f7f8af1d3f2e5de25c5b7 # v2 + uses: aws-actions/amazon-ecr-login@fa648b43de3d4d023bcb3f89ed6940096949c419 # v2 - name: Check target image exists in ECR id: check-image diff --git a/.github/workflows/generate-FOSSA-report.yml b/.github/workflows/generate-FOSSA-report.yml index 1962626100d..fe1000a4844 100644 --- a/.github/workflows/generate-FOSSA-report.yml +++ b/.github/workflows/generate-FOSSA-report.yml @@ -6,6 +6,9 @@ on: - "master" - "[0-9].[0-9]*" +permissions: + contents: read + jobs: config: runs-on: ubuntu-24.04 diff --git a/.github/workflows/github-action-validator.yml b/.github/workflows/github-action-validator.yml index 9a341871c76..4d4a7030683 100644 --- a/.github/workflows/github-action-validator.yml +++ b/.github/workflows/github-action-validator.yml @@ -8,6 +8,9 @@ on: pull_request: types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + jobs: validate-all-ghas: diff --git a/.github/workflows/latest-release-tag.yml b/.github/workflows/latest-release-tag.yml index 97cd73df462..4a4f38320a8 100644 --- a/.github/workflows/latest-release-tag.yml +++ b/.github/workflows/latest-release-tag.yml @@ -29,7 +29,7 @@ jobs: - name: Run latest-tag uses: ./.github/actions/latest-tag - if: (! ${{ steps.latest-tag.outputs.SKIP_TAG }} ) + if: steps.latest-tag.outputs.SKIP_TAG != 'true' with: description: Superset latest release tag-name: latest diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index b1796c4b07d..775e08d0ca8 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -4,6 +4,9 @@ on: pull_request: types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/superset-app-cli.yml b/.github/workflows/superset-app-cli.yml index 1c6d8ec9d41..0340a0bf045 100644 --- a/.github/workflows/superset-app-cli.yml +++ b/.github/workflows/superset-app-cli.yml @@ -8,6 +8,10 @@ on: pull_request: types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + pull-requests: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/superset-docs-deploy.yml b/.github/workflows/superset-docs-deploy.yml index f260a442568..dbe4deb1839 100644 --- a/.github/workflows/superset-docs-deploy.yml +++ b/.github/workflows/superset-docs-deploy.yml @@ -17,6 +17,16 @@ on: workflow_dispatch: {} +# Serialize deploys: the action pushes to apache/superset-site without +# rebasing, so concurrent runs race on the final push and the loser fails +# with `! [rejected] asf-site -> asf-site (fetch first)`. Cancel any +# in-progress run as soon as a newer one starts β€” the destination repo +# isn't touched until the final push step, so canceling mid-build is safe, +# and the freshest content always wins. +concurrency: + group: docs-deploy-asf-site + cancel-in-progress: true + jobs: config: runs-on: ubuntu-24.04 diff --git a/.github/workflows/superset-extensions-cli.yml b/.github/workflows/superset-extensions-cli.yml index da8d12aee58..bd374334278 100644 --- a/.github/workflows/superset-extensions-cli.yml +++ b/.github/workflows/superset-extensions-cli.yml @@ -8,6 +8,10 @@ on: pull_request: types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + pull-requests: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/superset-helm-lint.yml b/.github/workflows/superset-helm-lint.yml index b616aedeaf8..f76a39b2cde 100644 --- a/.github/workflows/superset-helm-lint.yml +++ b/.github/workflows/superset-helm-lint.yml @@ -6,6 +6,9 @@ on: paths: - "helm/**" +permissions: + contents: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/superset-python-unittest.yml b/.github/workflows/superset-python-unittest.yml index 4065e81d86c..18077700bd2 100644 --- a/.github/workflows/superset-python-unittest.yml +++ b/.github/workflows/superset-python-unittest.yml @@ -54,6 +54,7 @@ jobs: SUPERSET_SECRET_KEY: not-a-secret run: | pytest --durations-min=0.5 --cov=superset/sql/ ./tests/unit_tests/sql/ --cache-clear --cov-fail-under=100 + pytest --durations-min=0.5 --cov=superset/semantic_layers/ ./tests/unit_tests/semantic_layers/ --cache-clear --cov-fail-under=100 - name: Upload code coverage uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v5 with: diff --git a/.github/workflows/superset-translations.yml b/.github/workflows/superset-translations.yml index 3223eb5fa88..8de7b404519 100644 --- a/.github/workflows/superset-translations.yml +++ b/.github/workflows/superset-translations.yml @@ -8,6 +8,10 @@ on: pull_request: types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + pull-requests: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.github/workflows/superset-websocket.yml b/.github/workflows/superset-websocket.yml index 83458b7a609..58e5ffe0552 100644 --- a/.github/workflows/superset-websocket.yml +++ b/.github/workflows/superset-websocket.yml @@ -11,6 +11,9 @@ on: - "superset-websocket/**" types: [synchronize, opened, reopened, ready_for_review] +permissions: + contents: read + # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} diff --git a/.rat-excludes b/.rat-excludes index 44cf26ac6a3..30b1ef1da9d 100644 --- a/.rat-excludes +++ b/.rat-excludes @@ -43,6 +43,9 @@ _build/* _static/* .buildinfo searchindex.js +# auto-generated by docs/scripts/convert-api-sidebar.mjs from openapi.json +sidebar.js +sidebar.ts # auto generated requirements/* # vendorized diff --git a/RELEASING/verify_release.py b/RELEASING/verify_release.py index 61bbf073ab0..9e0347bc146 100755 --- a/RELEASING/verify_release.py +++ b/RELEASING/verify_release.py @@ -56,8 +56,33 @@ def verify_sha512(filename: str) -> str: # Part 2: Verify RSA key - this is the same as running `gpg --verify {release}.asc {release}` and comparing the RSA key and email address against the KEYS file # noqa: E501 +KEYS_URL = "https://downloads.apache.org/superset/KEYS" + + +def ensure_keys_imported() -> None: + """Import the Apache Superset KEYS file into the local GPG keyring. + + Without this, `gpg --verify` returns "No public key" and the signature + cannot actually be verified β€” only the key ID in the signature metadata + is visible. + """ + try: + keys = requests.get(KEYS_URL, timeout=30) + except requests.RequestException as exc: + print(f"Warning: could not fetch KEYS file for import: {exc}") + return + if keys.status_code != 200: + print(f"Warning: could not fetch KEYS file (HTTP {keys.status_code})") + return + subprocess.run( # noqa: S603 + ["gpg", "--import"], # noqa: S607 + input=keys.content, + capture_output=True, + ) + + def get_gpg_info(filename: str) -> tuple[Optional[str], Optional[str]]: - """Run the GPG verify command and extract RSA key and email address.""" + """Run the GPG verify command and extract RSA/EDDSA key and email address.""" asc_filename = filename + ".asc" result = subprocess.run( # noqa: S603 ["gpg", "--verify", asc_filename, filename], # noqa: S607 @@ -65,25 +90,50 @@ def get_gpg_info(filename: str) -> tuple[Optional[str], Optional[str]]: ) output = result.stderr.decode() + # If no public key was available, import KEYS and retry so that + # `Good signature from "Name "` appears in the output. + if "No public key" in output: + ensure_keys_imported() + result = subprocess.run( # noqa: S603 + ["gpg", "--verify", asc_filename, filename], # noqa: S607 + capture_output=True, # noqa: S607 + ) + output = result.stderr.decode() + rsa_key = re.search(r"RSA key ([0-9A-F]+)", output) eddsa_key = re.search(r"EDDSA key ([0-9A-F]+)", output) - email = re.search(r'issuer "([^"]+)"', output) + + # Try multiple patterns β€” `Good signature from` is the most reliable + # source of the email; `issuer` is a fallback for older gpg output. + email_patterns = ( + r'Good signature from ".*?<([^>]+)>"', + r'aka ".*?<([^>]+)>"', + r'issuer "([^"]+)"', + ) + email_result: Optional[str] = None + for pattern in email_patterns: + match = re.search(pattern, output) + if match: + email_result = match.group(1) + break rsa_key_result = rsa_key.group(1) if rsa_key else None eddsa_key_result = eddsa_key.group(1) if eddsa_key else None - email_result = email.group(1) if email else None - key_result = rsa_key_result or eddsa_key_result - # Debugging: if key_result: print("RSA or EDDSA Key found") else: print("Warning: No RSA or EDDSA key found in GPG verification output.") if email_result: - print("email found") + print(f"Email found: {email_result}") else: print("Warning: No email address found in GPG verification output.") + if "No public key" in output: + print( + "Hint: public key is not in your keyring. Import it with:\n" + f" curl -s {KEYS_URL} | gpg --import" + ) return key_result, email_result diff --git a/UPDATING.md b/UPDATING.md index 27fc3428b9e..2012f59e6f7 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -46,6 +46,13 @@ The Deck.gl MapBox chart's **Opacity**, **Default longitude**, **Default latitud **To restore fit-to-data behavior:** Open the chart in Explore, clear the **Default longitude**, **Default latitude**, and **Zoom** fields in the Viewport section, and re-save the chart. +### Combined datasource list endpoint + +Added a new combined datasource list endpoint at `GET /api/v1/datasource/` to serve datasets and semantic views in one response. + +- The endpoint is available to users with at least one of `can_read` on `Dataset` or `SemanticView`. +- Semantic views are included only when the `SEMANTIC_LAYERS` feature flag is enabled. +- The endpoint enforces strict `order_column` validation and returns `400` for invalid sort columns. ### ClickHouse minimum driver version bump The minimum required version of `clickhouse-connect` has been raised to `>=0.13.0`. If you are using the ClickHouse connector, please upgrade your `clickhouse-connect` package. The `_mutate_label` workaround that appended hash suffixes to column aliases has also been removed, as it is no longer needed with modern versions of the driver. @@ -321,7 +328,7 @@ Note: Pillow is now a required dependency (previously optional) to support image - [33116](https://github.com/apache/superset/pull/33116) In Echarts Series charts (e.g. Line, Area, Bar, etc.) charts, the `x_axis_sort_series` and `x_axis_sort_series_ascending` form data items have been renamed with `x_axis_sort` and `x_axis_sort_asc`. There's a migration added that can potentially affect a significant number of existing charts. - [32317](https://github.com/apache/superset/pull/32317) The horizontal filter bar feature is now out of testing/beta development and its feature flag `HORIZONTAL_FILTER_BAR` has been removed. -- [31590](https://github.com/apache/superset/pull/31590) Marks the begining of intricate work around supporting dynamic Theming, and breaks support for [THEME_OVERRIDES](https://github.com/apache/superset/blob/732de4ac7fae88e29b7f123b6cbb2d7cd411b0e4/superset/config.py#L671) in favor of a new theming system based on AntD V5. Likely this will be in disrepair until settling over the 5.x lifecycle. +- [31590](https://github.com/apache/superset/pull/31590) Marks the beginning of intricate work around supporting dynamic Theming, and breaks support for [THEME_OVERRIDES](https://github.com/apache/superset/blob/732de4ac7fae88e29b7f123b6cbb2d7cd411b0e4/superset/config.py#L671) in favor of a new theming system based on AntD V5. Likely this will be in disrepair until settling over the 5.x lifecycle. - [32432](https://github.com/apache/superset/pull/32432) Moves the List Roles FAB view to the frontend and requires `FAB_ADD_SECURITY_API` to be enabled in the configuration and `superset init` to be executed. - [34319](https://github.com/apache/superset/pull/34319) Drill to Detail and Drill By is now supported in Embedded mode, and also with the `DASHBOARD_RBAC` FF. If you don't want to expose these features in Embedded / `DASHBOARD_RBAC`, make sure the roles used for Embedded / `DASHBOARD_RBAC`don't have the required permissions to perform D2D actions. @@ -336,7 +343,7 @@ Note: Pillow is now a required dependency (previously optional) to support image - [31774](https://github.com/apache/superset/pull/31774): Fixes the spelling of the `USE-ANALAGOUS-COLORS` feature flag. Please update any scripts/configuration item to use the new/corrected `USE-ANALOGOUS-COLORS` flag spelling. - [31582](https://github.com/apache/superset/pull/31582) Removed the legacy Area, Bar, Event Flow, Heatmap, Histogram, Line, Sankey, and Sankey Loop charts. They were all automatically migrated to their ECharts counterparts with the exception of the Event Flow and Sankey Loop charts which were removed as they were not actively maintained and not widely used. If you were using the Event Flow or Sankey Loop charts, you will need to find an alternative solution. - [31198](https://github.com/apache/superset/pull/31198) Disallows by default the use of the following ClickHouse functions: "version", "currentDatabase", "hostName". -- [29798](https://github.com/apache/superset/pull/29798) Since 3.1.0, the intial schedule for an alert or report was mistakenly offset by the specified timezone's relation to UTC. The initial schedule should now begin at the correct time. +- [29798](https://github.com/apache/superset/pull/29798) Since 3.1.0, the initial schedule for an alert or report was mistakenly offset by the specified timezone's relation to UTC. The initial schedule should now begin at the correct time. - [30021](https://github.com/apache/superset/pull/30021) The `dev` layer in our Dockerfile no long includes firefox binaries, only Chromium to reduce bloat/docker-build-time. - [30099](https://github.com/apache/superset/pull/30099) Translations are no longer included in the default docker image builds. If your environment requires translations, you'll want to set the docker build arg `BUILD_TRANSLATIONS=true`. - [31262](https://github.com/apache/superset/pull/31262) NOTE: deprecated `pylint` in favor of `ruff` as our only python linter. Only affect development workflows positively (not the release itself). It should cover most important rules, be much faster, but some things linting rules that were enforced before may not be enforce in the exact same way as before. @@ -349,7 +356,7 @@ Note: Pillow is now a required dependency (previously optional) to support image - [25166](https://github.com/apache/superset/pull/25166) Changed the default configuration of `UPLOAD_FOLDER` from `/app/static/uploads/` to `/static/uploads/`. It also removed the unused `IMG_UPLOAD_FOLDER` and `IMG_UPLOAD_URL` configuration options. - [30284](https://github.com/apache/superset/pull/30284) Deprecated GLOBAL_ASYNC_QUERIES_REDIS_CONFIG in favor of the new GLOBAL_ASYNC_QUERIES_CACHE_BACKEND configuration. To leverage Redis Sentinel, set CACHE_TYPE to RedisSentinelCache, or use RedisCache for standalone Redis - [31961](https://github.com/apache/superset/pull/31961) Upgraded React from version 16.13.1 to 17.0.2. If you are using custom frontend extensions or plugins, you may need to update them to be compatible with React 17. -- [31260](https://github.com/apache/superset/pull/31260) Docker images now use `uv pip install` instead of `pip install` to manage the python envrionment. Most docker-based deployments will be affected, whether you derive one of the published images, or have custom bootstrap script that install python libraries (drivers) +- [31260](https://github.com/apache/superset/pull/31260) Docker images now use `uv pip install` instead of `pip install` to manage the python environment. Most docker-based deployments will be affected, whether you derive one of the published images, or have custom bootstrap script that install python libraries (drivers) ### Potential Downtime @@ -426,7 +433,7 @@ Note: Pillow is now a required dependency (previously optional) to support image - [26462](https://github.com/apache/superset/issues/26462): Removes the Profile feature given that it's not actively maintained and not widely used. - [26377](https://github.com/apache/superset/pull/26377): Removes the deprecated Redirect API that supported short URLs used before the permalink feature. - [26329](https://github.com/apache/superset/issues/26329): Removes the deprecated `DASHBOARD_NATIVE_FILTERS` feature flag. The previous value of the feature flag was `True` and now the feature is permanently enabled. -- [25510](https://github.com/apache/superset/pull/25510): Reenforces that any newly defined Python data format (other than epoch) must adhere to the ISO 8601 standard (enforced by way of validation at the API and database level) after a previous relaxation to include slashes in addition to dashes. From now on when specifying new columns, dataset owners will need to use a SQL expression instead to convert their string columns of the form %Y/%m/%d etc. to a `DATE`, `DATETIME`, etc. type. +- [25510](https://github.com/apache/superset/pull/25510): Reinforces that any newly defined Python data format (other than epoch) must adhere to the ISO 8601 standard (enforced by way of validation at the API and database level) after a previous relaxation to include slashes in addition to dashes. From now on when specifying new columns, dataset owners will need to use a SQL expression instead to convert their string columns of the form %Y/%m/%d etc. to a `DATE`, `DATETIME`, etc. type. - [26372](https://github.com/apache/superset/issues/26372): Removes the deprecated `GENERIC_CHART_AXES` feature flag. The previous value of the feature flag was `True` and now the feature is permanently enabled. ### Potential Downtime diff --git a/docker/pythonpath_dev/superset_config.py b/docker/pythonpath_dev/superset_config.py index 108305cf900..ce7f1998708 100644 --- a/docker/pythonpath_dev/superset_config.py +++ b/docker/pythonpath_dev/superset_config.py @@ -105,7 +105,13 @@ class CeleryConfig: CELERY_CONFIG = CeleryConfig -FEATURE_FLAGS = {"ALERT_REPORTS": True, "DATASET_FOLDERS": True} +FEATURE_FLAGS = { + "ALERT_REPORTS": True, + "DATASET_FOLDERS": True, + "ENABLE_EXTENSIONS": True, + "SEMANTIC_LAYERS": True, +} +EXTENSIONS_PATH = "/app/docker/extensions" ALERT_REPORTS_NOTIFICATION_DRY_RUN = True WEBDRIVER_BASEURL = f"http://superset_app{os.environ.get('SUPERSET_APP_ROOT', '/')}/" # When using docker compose baseurl should be http://superset_nginx{ENV{BASEPATH}}/ # noqa: E501 # The base URL for the email report hyperlinks. diff --git a/docs/DOCS_CLAUDE.md b/docs/DOCS_CLAUDE.md index 1ac49462afe..3e60b73b0d3 100644 --- a/docs/DOCS_CLAUDE.md +++ b/docs/DOCS_CLAUDE.md @@ -31,8 +31,9 @@ You are currently in the `/docs` subdirectory of the Apache Superset repository. β”œβ”€β”€ superset-frontend/ # React/TypeScript frontend └── docs/ # Documentation site (YOU ARE HERE) β”œβ”€β”€ docs/ # Main documentation content - β”œβ”€β”€ developer_portal/ # Developer guides (currently disabled) - β”œβ”€β”€ components/ # Component playground (currently disabled) + β”œβ”€β”€ admin_docs/ # Admin-focused guides + β”œβ”€β”€ developer_docs/ # Developer guides + β”œβ”€β”€ components/ # Component playground └── docusaurus.config.ts # Site configuration ``` @@ -46,12 +47,19 @@ yarn build # Build production site yarn serve # Serve built site locally # Version Management (USE THESE, NOT docusaurus commands) +# The add scripts auto-run `generate:smart` so auto-gen content (database +# pages, API reference, component pages) is fresh before snapshotting. +# For maximum-detail databases.json, drop the `database-diagnostics` +# artifact from Python-Integration CI at src/data/databases.json before +# cutting. See README.md "Before You Cut". yarn version:add:docs # Add new docs version -yarn version:add:developer_portal # Add developer portal version +yarn version:add:admin_docs # Add admin docs version +yarn version:add:developer_docs # Add developer docs version yarn version:add:components # Add components version yarn version:remove:docs # Remove docs version -yarn version:remove:developer_portal # Remove developer portal version -yarn version:remove:components # Remove components version +yarn version:remove:admin_docs # Remove admin docs version +yarn version:remove:developer_docs # Remove developer docs version +yarn version:remove:components # Remove components version # Quality Checks yarn typecheck # TypeScript validation @@ -95,15 +103,14 @@ docs/ └── [security guides] ``` -### Developer Portal (`/developer_portal`) - Currently Disabled -When enabled, contains developer-focused content: -- API documentation -- Architecture guides -- CLI tools -- Code examples +### Admin Docs (`/admin_docs`) +Admin-focused content: installation, configuration, security. -### Component Playground (`/components`) - Currently Disabled -When enabled, provides interactive component examples for UI development. +### Developer Docs (`/developer_docs`) +Developer-focused content: API documentation, architecture guides, CLI tools, code examples. + +### Component Playground (`/components`) +Interactive component examples for UI development. ## πŸ“ Documentation Standards diff --git a/docs/README.md b/docs/README.md index 6f3a6b4902e..f5b8e719445 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,23 +37,45 @@ Each section maintains its own version history and can be versioned independentl To create a new version for any section, use the Docusaurus version command with the appropriate plugin ID or use our automated scripts: +#### Before You Cut + +The cut snapshots whatever's on disk into a frozen historical version, including auto-generated content (database pages from `superset/db_engine_specs/`, API reference from `static/resources/openapi.json`, component pages from Storybook stories). The cut script refreshes these via `generate:smart` before snapshotting, but the **`databases.json` diagnostics file** needs special care to capture full detail: + +1. **Canonical release cut**: download the `database-diagnostics` artifact from a green `Python-Integration` run on master, place it at `docs/src/data/databases.json`, then run the cut script with `--skip-generate` to preserve it. This is what the production deploy uses and includes full Flask-context diagnostics (driver versions, feature support matrix, etc.). +2. **Local dev cut**: just run the script normally. `generate:smart` will regenerate `databases.json` using your local Flask environment β€” accurate to whatever drivers/extras you have installed, but typically less complete than the CI artifact. +3. **No Flask available**: also fine β€” the database generator falls back to AST parsing of engine spec files. The MDX pages are still correct; only the diagnostics JSON is leaner. + +Also: confirm `master` CI is green, and that your local checkout matches the SHA you intend to cut from. + #### Using Automated Scripts (Required) -**⚠️ Important:** Always use these custom commands instead of the native Docusaurus commands. These scripts ensure that both the Docusaurus versioning system AND the `versions-config.json` file are updated correctly. +**⚠️ Important:** Always use these custom commands instead of the native Docusaurus commands. These scripts ensure that both the Docusaurus versioning system AND the `versions-config.json` file are updated correctly, AND that auto-generated content is refreshed before snapshotting. ```bash # Main Documentation yarn version:add:docs 1.2.0 -# Developer Portal -yarn version:add:developer_portal 1.2.0 +# Admin Docs +yarn version:add:admin_docs 1.2.0 -# Component Playground (when enabled) +# Developer Docs +yarn version:add:developer_docs 1.2.0 + +# Component Playground yarn version:add:components 1.2.0 ``` +What the script does: +1. Refreshes auto-generated content via `generate:smart` (database pages, API reference, component pages). +2. Calls `yarn docusaurus docs:version` (or the per-section equivalent) to snapshot the section. +3. Freezes any data-file imports (`@site/static/*.json`, `../../data/*.json`) into a snapshot-local `_versioned_data/` dir so the historical version doesn't silently mutate when the source files change. +4. Adjusts relative import paths (`../../src/...` β†’ `../../../src/...`) for files now one directory deeper. +5. Updates `versions-config.json` and `
_versions.json`. + **Do NOT use** the native Docusaurus commands directly (`yarn docusaurus docs:version`), as they will: - ❌ Create version files but NOT update `versions-config.json` +- ❌ Skip auto-gen refresh, freezing whatever was on disk +- ❌ Skip data-import freezing, leaving the snapshot pointed at live data - ❌ Cause versions to not appear in dropdown menus - ❌ Require manual fixes to synchronize the configuration @@ -91,8 +113,11 @@ If creating versions manually, you'll need to: # Main Documentation yarn version:remove:docs 1.0.0 -# Developer Portal -yarn version:remove:developer_portal 1.0.0 +# Admin Docs +yarn version:remove:admin_docs 1.0.0 + +# Developer Docs +yarn version:remove:developer_docs 1.0.0 # Component Playground yarn version:remove:components 1.0.0 @@ -103,17 +128,20 @@ To manually remove a version: 1. **Delete the version folder** from the appropriate location: - Main docs: `versioned_docs/version-X.X.X/` (no prefix for main) - - Developer Portal: `developer_portal_versioned_docs/version-X.X.X/` + - Admin Docs: `admin_docs_versioned_docs/version-X.X.X/` + - Developer Docs: `developer_docs_versioned_docs/version-X.X.X/` - Components: `components_versioned_docs/version-X.X.X/` 2. **Delete the version metadata file**: - Main docs: `versioned_sidebars/version-X.X.X-sidebars.json` (no prefix) - - Developer Portal: `developer_portal_versioned_sidebars/version-X.X.X-sidebars.json` + - Admin Docs: `admin_docs_versioned_sidebars/version-X.X.X-sidebars.json` + - Developer Docs: `developer_docs_versioned_sidebars/version-X.X.X-sidebars.json` - Components: `components_versioned_sidebars/version-X.X.X-sidebars.json` 3. **Update the versions list file**: - Main docs: `versions.json` - - Developer Portal: `developer_portal_versions.json` + - Admin Docs: `admin_docs_versions.json` + - Developer Docs: `developer_docs_versions.json` - Components: `components_versions.json` 4. **Update configuration**: @@ -145,12 +173,12 @@ docs: { } ``` -#### Developer Portal & Components (custom plugins) +#### Developer Docs & Components (custom plugins) ```typescript { - id: 'developer_portal', - path: 'developer_portal', - routeBasePath: 'developer_portal', + id: 'developer_docs', + path: 'developer_docs', + routeBasePath: 'developer-docs', includeCurrentVersion: true, lastVersion: '1.1.0', // Default version onlyIncludeVersions: ['current', '1.1.0', '1.0.0'], @@ -194,7 +222,7 @@ For other issues: #### Broken Links in Versioned Documentation When creating a new version, links in the documentation are preserved as-is. Common issues: -- **Cross-section links**: Links between sections (e.g., from developer_portal to docs) need to be version-aware +- **Cross-section links**: Links between sections (e.g., from developer_docs to docs) need to be version-aware - **Absolute vs relative paths**: Use relative paths within the same section - **Version-specific URLs**: Update hardcoded URLs to use version variables diff --git a/docs/admin_docs/configuration/alerts-reports.mdx b/docs/admin_docs/configuration/alerts-reports.mdx index b66f641e290..f5c4efc42ed 100644 --- a/docs/admin_docs/configuration/alerts-reports.mdx +++ b/docs/admin_docs/configuration/alerts-reports.mdx @@ -81,6 +81,87 @@ SLACK_CACHE_TIMEOUT = int(timedelta(days=2).total_seconds()) SLACK_API_RATE_LIMIT_RETRY_COUNT = 5 ``` +### Webhook integration + +Superset can send alert and report notifications to any HTTP endpoint β€” useful for chat platforms, incident management tools, or custom automation. + +#### Enabling Webhooks + +Enable the feature flag in `superset_config.py`: + +```python +FEATURE_FLAGS = { + "ALERT_REPORTS": True, + "ALERT_REPORT_WEBHOOK": True, +} +``` + +#### Configuring a Webhook Recipient + +When creating or editing an alert or report, select **Webhook** as the notification method and enter your endpoint URL. + +#### Payload Format + +Superset sends an HTTP POST with `Content-Type: application/json`: + +```json +{ + "name": "My Alert", + "header": { + "notification_format": "JSON", + "notification_type": "Alert", + "notification_source": "Alert", + "chart_id": 42, + "dashboard_id": null + }, + "text": "Alert condition met: value exceeded threshold", + "description": "Monthly revenue dropped below target", + "url": "https://your-superset-host/superset/dashboard/1/" +} +``` + +When a report includes file attachments (CSV, PDF, or PNG screenshots), the request is sent as `multipart/form-data` instead. In that case, each top-level payload field (`name`, `text`, `description`, `url`) becomes its own form field, and nested structures like `header` are serialized as a JSON-encoded string in their own field. Every attachment is added as a repeated form field named `files`: + +``` +POST /webhook HTTP/1.1 +Content-Type: multipart/form-data; boundary=... + +--... +Content-Disposition: form-data; name="name" + +My Alert +--... +Content-Disposition: form-data; name="header" + +{"notification_format": "JSON", "notification_type": "Alert", ...} +--... +Content-Disposition: form-data; name="text" + +Alert condition met: value exceeded threshold +--... +Content-Disposition: form-data; name="files"; filename="report.csv" +Content-Type: text/csv + + +--... +``` + +Webhook consumers should branch on `Content-Type`: parse the body as JSON when `application/json`, or read the individual form fields (decoding `header` as JSON) when `multipart/form-data`. + +#### HTTPS Enforcement + +To require HTTPS webhook URLs (recommended for production), set: + +```python +ALERT_REPORTS_WEBHOOK_HTTPS_ONLY = True +``` + +When enabled, Superset rejects webhook configurations that use `http://` URLs. + +#### Retry Behavior + +Superset automatically retries webhook deliveries on `429 Too Many Requests` and `5xx` server errors using exponential backoff. + ### Kubernetes-specific - You must have a `celery beat` pod running. If you're using the chart included in the GitHub repository under [helm/superset](https://github.com/apache/superset/tree/master/helm/superset), you need to put `supersetCeleryBeat.enabled = true` in your values override. diff --git a/docs/admin_docs/configuration/configuring-superset.mdx b/docs/admin_docs/configuration/configuring-superset.mdx index becdf70888b..daf92b1c943 100644 --- a/docs/admin_docs/configuration/configuring-superset.mdx +++ b/docs/admin_docs/configuration/configuring-superset.mdx @@ -472,6 +472,38 @@ FEATURE_FLAGS = { A current list of feature flags can be found in the [Feature Flags](/admin-docs/configuration/feature-flags) documentation. +## Security Configuration + +### HASH_ALGORITHM + +Controls the hashing algorithm used for internal checksums and cache keys (thumbnails, cache keys, etc.). The default is `sha256`, which satisfies environments with stricter compliance requirements (e.g., FedRAMP). Set it to `md5` to retain the legacy behavior from older Superset deployments: + +```python +HASH_ALGORITHM = "sha256" # default; set to "md5" for legacy behavior +``` + +A companion `HASH_ALGORITHM_FALLBACKS` list (default: `["md5"]`) lets UUID lookups fall back to older algorithms, which enables gradual migration without breaking existing entries. Set it to `[]` for strict mode (use only `HASH_ALGORITHM`). + +:::note +This setting affects internal Superset operations only, not user passwords or authentication tokens. Changing it in an existing deployment may invalidate cached values but does not require a database migration. +::: + +## SQL Lab Query History Pruning + +SQL Lab query history is stored in the metadata database and is **not** pruned by default. To trim older rows, enable the `prune_query` Celery beat task by uncommenting it in `CELERY_BEAT_SCHEDULE` and choosing a retention window: + +```python +CELERY_BEAT_SCHEDULE = { + "prune_query": { + "task": "prune_query", + "schedule": crontab(minute=0, hour=0, day_of_month=1), + "kwargs": {"retention_period_days": 180}, + }, +} +``` + +Adjust `retention_period_days` to control how long query rows are kept. Companion opt-in tasks (`prune_logs`, `prune_tasks`) exist for pruning the logs and tasks tables; see the commented-out examples in `superset/config.py`. Without enabling these tasks, the metadata database will grow unbounded over time. + :::resources - [Blog: Feature Flags in Apache Superset](https://preset.io/blog/feature-flags-in-apache-superset-and-preset/) ::: diff --git a/docs/admin_docs/configuration/theming.mdx b/docs/admin_docs/configuration/theming.mdx index 99774c4b27f..ce013889e85 100644 --- a/docs/admin_docs/configuration/theming.mdx +++ b/docs/admin_docs/configuration/theming.mdx @@ -122,6 +122,17 @@ When `ENABLE_UI_THEME_ADMINISTRATION = True`: 3. Administrators can change system themes without restarting Superset 4. Configuration file themes serve as fallbacks when no UI themes are set +### Theme Validation and Fallback + +Superset validates theme JSON when it is saved, either through the UI or via configuration. If a theme contains invalid tokens or an unrecognized structure, Superset logs a warning and falls back to the built-in default theme rather than applying a broken configuration. This prevents a bad theme from rendering the application unusable. + +The fallback order is: +1. **UI-configured system theme** (highest priority, if `ENABLE_UI_THEME_ADMINISTRATION = True`) +2. **`THEME_DEFAULT` / `THEME_DARK`** from `superset_config.py` +3. **Built-in Superset default theme** (always present as a safety net) + +If you see unexpected styling after a config change, check the Superset server logs for theme validation warnings. + ### Copying Themes Between Systems To export a theme for use in configuration files or another instance: @@ -143,7 +154,11 @@ Superset supports custom fonts through the theme configuration, allowing you to ### Default Fonts -By default, Superset uses Inter and Fira Code fonts which are bundled with the application via `@fontsource` packages. These fonts work offline and require no external network calls. +By default, Superset uses **Inter** for UI text and **IBM Plex Mono** for code (SQL editors, JSON fields, and other monospace contexts). Both fonts are bundled with the application via `@fontsource` packages and work offline without any external network calls. + +:::note +IBM Plex Mono replaced Fira Code as the default code font in Superset 6.1. If you have an existing theme that explicitly sets `fontFamilyCode: "Fira Code, ..."`, you may want to update it. +::: ### Configuring Custom Fonts diff --git a/docs/admin_docs/security/security.mdx b/docs/admin_docs/security/security.mdx index b4261c60bf5..6190925d8ab 100644 --- a/docs/admin_docs/security/security.mdx +++ b/docs/admin_docs/security/security.mdx @@ -205,6 +205,57 @@ FAB_ADD_SECURITY_API = True Once configured, the documentation for additional "Security" endpoints will be visible in Swagger for you to explore. +### API Key Authentication + +Superset supports long-lived API keys for service accounts, CI/CD pipelines, and programmatic integrations (including MCP clients). + +#### Enabling API Key Authentication + +API key authentication is **disabled by default**. To turn it on, set the Flask-AppBuilder config value in `superset_config.py` and also enable the matching feature flag so the management UI is exposed: + +```python +FAB_API_KEY_ENABLED = True + +FEATURE_FLAGS = { + "FAB_API_KEY_ENABLED": True, +} +``` + +The config value registers the `ApiKeyApi` blueprint on the backend; the feature flag controls whether the UI for managing keys appears for the user. See the [Feature Flags](/admin-docs/configuration/feature-flags) documentation for more on feature flag configuration. + +#### Creating an API Key + +Once enabled, each user manages their own keys from their profile page: + +1. Open the user menu (top-right) and click **Info** to navigate to the User Info page +2. Expand the **API Keys** section +3. Click **+ API Key** +4. Enter a name and (optionally) an expiration date +5. Copy the generated token β€” it is shown only once + +Only users with the `can_read` and `can_write` permissions on `ApiKey` (granted by default to Admins) can manage API keys. + +#### Using an API Key + +Pass the key as a Bearer token in the `Authorization` header: + +``` +Authorization: Bearer +``` + +This works for all REST API endpoints and the MCP server. The request is executed with the permissions of the user who created the key. + +#### Use Cases + +- **CI/CD pipelines** β€” automated chart/dashboard exports and imports +- **MCP integrations** β€” connect AI assistants without interactive login +- **External services** β€” dashboards embedded in other applications +- **Service accounts** β€” long-lived credentials that don't expire with session cookies + +:::caution +Store API keys securely. Anyone with a valid key can make requests on behalf of the creating user. Revoke keys promptly if they are compromised by deleting them from the **API Keys** section of your User Info page. +::: + ### Customizing Permissions The permissions exposed by FAB are very granular and allow for a great level of diff --git a/docs/components/versions.json b/docs/components/versions.json deleted file mode 100644 index fe51488c706..00000000000 --- a/docs/components/versions.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/docs/developer_docs/extensions/contribution-types.md b/docs/developer_docs/extensions/contribution-types.md index 6fa8bf7f9a5..6e66aa8a67c 100644 --- a/docs/developer_docs/extensions/contribution-types.md +++ b/docs/developer_docs/extensions/contribution-types.md @@ -224,3 +224,52 @@ async def analysis_guide(ctx: Context) -> str: ``` See [MCP Integration](./mcp) for implementation details. + +### Semantic Layers + +Extensions can register custom semantic layer implementations that allow Superset to connect to external data modeling frameworks. Each semantic layer defines how to authenticate, discover semantic views (tables/metrics/dimensions), and execute queries against the external system. + +```python +from superset_core.semantic_layers.decorators import semantic_layer +from superset_core.semantic_layers.layer import SemanticLayer + +from my_extension.config import MyConfig +from my_extension.view import MySemanticView + + +@semantic_layer( + id="my_platform", + name="My Data Platform", + description="Connect to My Data Platform's semantic layer", +) +class MySemanticLayer(SemanticLayer[MyConfig, MySemanticView]): + configuration_class = MyConfig + + @classmethod + def from_configuration(cls, configuration: dict) -> "MySemanticLayer": + config = MyConfig.model_validate(configuration) + return cls(config) + + @classmethod + def get_configuration_schema(cls, configuration=None) -> dict: + return MyConfig.model_json_schema() + + @classmethod + def get_runtime_schema(cls, configuration=None, runtime_data=None) -> dict: + return {"type": "object", "properties": {}} + + def get_semantic_views(self, runtime_configuration: dict) -> set[MySemanticView]: + # Return available views from the external platform + ... + + def get_semantic_view(self, name: str, additional_configuration: dict) -> MySemanticView: + # Return a specific view by name + ... +``` + +**Note**: The `@semantic_layer` decorator automatically detects context and applies appropriate ID prefixing: + +- **Extension context**: ID prefixed as `extensions.{publisher}.{name}.{id}` +- **Host context**: Original ID used as-is + +The decorator registers the class in the semantic layers registry, making it available in the UI for users to create connections. The `configuration_class` should be a Pydantic model that defines the fields needed to connect (credentials, project, database, etc.). Superset uses the model's JSON schema to render the configuration form dynamically. diff --git a/docs/developer_docs/versions.json b/docs/developer_docs/versions.json deleted file mode 100644 index fe51488c706..00000000000 --- a/docs/developer_docs/versions.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/docs/developer_portal_versions.json b/docs/developer_portal_versions.json deleted file mode 100644 index fe51488c706..00000000000 --- a/docs/developer_portal_versions.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/docs/docs/using-superset/handlebars-chart.mdx b/docs/docs/using-superset/handlebars-chart.mdx new file mode 100644 index 00000000000..f560f923f51 --- /dev/null +++ b/docs/docs/using-superset/handlebars-chart.mdx @@ -0,0 +1,143 @@ +--- +title: Handlebars Chart +hide_title: true +sidebar_position: 10 +version: 1 +--- + +## Handlebars Chart + +The Handlebars chart lets you render query results using a custom [Handlebars](https://handlebarsjs.com/) template. This gives you full control over how your data is displayed β€” from simple tables to rich HTML layouts. + +### Basic Usage + +In the chart editor, write a Handlebars template in the **Template** field. Your query results are available as `data`, an array of row objects. + +```handlebars +{{#each data}} +

{{this.name}}: {{this.value}}

+{{/each}} +``` + +### Built-in Helpers + +Superset registers several custom helpers on top of the standard Handlebars built-ins. + +#### `dateFormat` + +Formats a date value using [Day.js](https://day.js.org/) format strings. + +```handlebars +{{dateFormat my_date format="MMMM YYYY"}} +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `format` | `YYYY-MM-DD` | A Day.js-compatible format string | + +--- + +#### `stringify` + +Converts an object to a JSON string, or any other value to its string representation. + +```handlebars +{{stringify myObj}} +``` + +--- + +#### `formatNumber` + +Formats a number using locale-aware formatting. + +```handlebars +{{formatNumber myNumber "en-US"}} +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `locale` | `en-US` | A BCP 47 language tag | + +--- + +#### `parseJson` + +Parses a JSON string into an object that can be used in your template. + +```handlebars +{{parseJson myJsonString}} +``` + +--- + +#### `groupBy` + +Groups an array of objects by a key, powered by [handlebars-group-by](https://github.com/nicktindall/handlebars-group-by). + +```handlebars +{{#groupBy data "department"}} +

{{value}}

+ {{#each items}} +

{{this.name}}

+ {{/each}} +{{/groupBy}} +``` + +--- + +### Helpers from just-handlebars-helpers + +Superset also registers all helpers from the [just-handlebars-helpers](https://github.com/leapfrogtechnology/just-handlebars-helpers) library. These include a wide range of comparison, math, string, and conditional helpers. Commonly used ones include: + +#### Comparison + +| Helper | Description | Example | +|--------|-------------|---------| +| `eq` | Strict equality | `{{#if (eq status "active")}}` | +| `eqw` | Weak equality | `{{#if (eqw count "5")}}` | +| `neq` | Strict inequality | `{{#if (neq role "admin")}}` | +| `lt` | Less than | `{{#if (lt score 50)}}` | +| `lte` | Less than or equal | `{{#if (lte score 100)}}` | +| `gt` | Greater than | `{{#if (gt price 0)}}` | +| `gte` | Greater than or equal | `{{#if (gte age 18)}}` | + +#### Logical + +| Helper | Description | Example | +|--------|-------------|---------| +| `and` | Logical AND | `{{#if (and isActive isVerified)}}` | +| `or` | Logical OR | `{{#if (or isAdmin isMod)}}` | +| `not` | Logical NOT | `{{#if (not isDisabled)}}` | +| `ifx` | Inline conditional | `{{ifx isActive "Yes" "No"}}` | +| `coalesce` | Returns first non-falsy value | `{{coalesce nickname name "Anonymous"}}` | + +#### String + +| Helper | Description | Example | +|--------|-------------|---------| +| `capitalize` | Capitalizes first letter | `{{capitalize name}}` | +| `uppercase` | Converts to uppercase | `{{uppercase status}}` | +| `lowercase` | Converts to lowercase | `{{lowercase email}}` | +| `truncate` | Truncates a string | `{{truncate description 100}}` | +| `contains` | Checks if string contains substring | `{{#if (contains tag "urgent")}}` | + +#### Math + +| Helper | Description | Example | +|--------|-------------|---------| +| `add` | Addition | `{{add a b}}` | +| `subtract` | Subtraction | `{{subtract total discount}}` | +| `multiply` | Multiplication | `{{multiply price quantity}}` | +| `divide` | Division | `{{divide total count}}` | +| `ceil` | Ceiling | `{{ceil value}}` | +| `floor` | Floor | `{{floor value}}` | +| `round` | Round | `{{round value}}` | + +For the full list of available helpers, see the [just-handlebars-helpers documentation](https://github.com/leapfrogtechnology/just-handlebars-helpers). + +### Tips + +- Use raw blocks to escape Handlebars syntax if you need to display double curly braces literally. +- Comparison helpers like `eq` must be wrapped in a subexpression when used with `#if`: `{{#if (eq myVal "foo")}}`. +- HTML output is sanitized by default based on your Superset configuration (`HTML_SANITIZATION`). diff --git a/docs/package.json b/docs/package.json index 3e51df1c4bc..af522416ebe 100644 --- a/docs/package.json +++ b/docs/package.json @@ -33,20 +33,22 @@ "version:add": "node scripts/manage-versions.mjs add", "version:remove": "node scripts/manage-versions.mjs remove", "version:add:docs": "node scripts/manage-versions.mjs add docs", - "version:add:developer_portal": "node scripts/manage-versions.mjs add developer_portal", + "version:add:admin_docs": "node scripts/manage-versions.mjs add admin_docs", + "version:add:developer_docs": "node scripts/manage-versions.mjs add developer_docs", "version:add:components": "node scripts/manage-versions.mjs add components", "version:remove:docs": "node scripts/manage-versions.mjs remove docs", - "version:remove:developer_portal": "node scripts/manage-versions.mjs remove developer_portal", + "version:remove:admin_docs": "node scripts/manage-versions.mjs remove admin_docs", + "version:remove:developer_docs": "node scripts/manage-versions.mjs remove developer_docs", "version:remove:components": "node scripts/manage-versions.mjs remove components" }, "dependencies": { - "@ant-design/icons": "^6.2.2", - "@docusaurus/core": "^3.10.0", - "@docusaurus/faster": "^3.10.0", - "@docusaurus/plugin-client-redirects": "^3.10.0", - "@docusaurus/preset-classic": "3.10.0", - "@docusaurus/theme-live-codeblock": "^3.10.0", - "@docusaurus/theme-mermaid": "^3.10.0", + "@ant-design/icons": "^6.2.3", + "@docusaurus/core": "^3.10.1", + "@docusaurus/faster": "^3.10.1", + "@docusaurus/plugin-client-redirects": "^3.10.1", + "@docusaurus/preset-classic": "3.10.1", + "@docusaurus/theme-live-codeblock": "^3.10.1", + "@docusaurus/theme-mermaid": "^3.10.1", "@emotion/core": "^11.0.0", "@emotion/react": "^11.13.3", "@emotion/styled": "^11.14.1", @@ -67,12 +69,12 @@ "@storybook/preview-api": "^8.6.18", "@storybook/theming": "^8.6.15", "@superset-ui/core": "^0.20.4", - "@swc/core": "^1.15.32", + "@swc/core": "^1.15.33", "antd": "^6.3.7", - "baseline-browser-mapping": "^2.10.24", - "caniuse-lite": "^1.0.30001791", - "docusaurus-plugin-openapi-docs": "^5.0.1", - "docusaurus-theme-openapi-docs": "^5.0.1", + "baseline-browser-mapping": "^2.10.29", + "caniuse-lite": "^1.0.30001792", + "docusaurus-plugin-openapi-docs": "^5.0.2", + "docusaurus-theme-openapi-docs": "^5.0.2", "js-yaml": "^4.1.1", "js-yaml-loader": "^1.2.2", "json-bigint": "^1.0.0", @@ -92,21 +94,21 @@ "unist-util-visit": "^5.1.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.10.0", + "@docusaurus/module-type-aliases": "^3.10.1", "@docusaurus/tsconfig": "^3.10.1", "@eslint/js": "^9.39.2", "@types/js-yaml": "^4.0.9", "@types/react": "^19.1.8", - "@typescript-eslint/eslint-plugin": "^8.52.0", - "@typescript-eslint/parser": "^8.59.0", + "@typescript-eslint/eslint-plugin": "^8.59.3", + "@typescript-eslint/parser": "^8.59.3", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", - "globals": "^17.5.0", + "globals": "^17.6.0", "prettier": "^3.8.3", "typescript": "~6.0.3", - "typescript-eslint": "^8.59.1", + "typescript-eslint": "^8.59.3", "webpack": "^5.106.2" }, "browserslist": { @@ -124,8 +126,7 @@ "resolutions": { "react-redux": "^9.2.0", "@reduxjs/toolkit": "^2.5.0", - "baseline-browser-mapping": "^2.9.19", - "webpackbar": "^7.0.0" + "baseline-browser-mapping": "^2.9.19" }, "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" } diff --git a/docs/scripts/generate-database-docs.mjs b/docs/scripts/generate-database-docs.mjs index 0491683b951..93cb5d766b8 100644 --- a/docs/scripts/generate-database-docs.mjs +++ b/docs/scripts/generate-database-docs.mjs @@ -141,6 +141,47 @@ def eval_node(node): return "" return None +def static_return_bool(func_node): + """ + Statically resolve a method's return value to a bool when possible. + + Returns True/False for functions whose body is (effectively) a single + \`return True\` / \`return False\` β€” allowing a leading docstring and + ignoring pure-comment/pass statements. Returns None for anything more + complex (conditional returns, computed values, no return, etc.). + + Used by \`has_implicit_cancel\` handling: \`diagnose()\` in lib.py calls + the method and checks the return value, so an override that explicitly + returns False must NOT be treated as enabling query cancelation. + """ + returns = [] + other_logic = False + docstring_skipped = False + for stmt in func_node.body: + # Skip docstring (only the FIRST expression statement that is a + # string constant β€” later bare string literals are not docstrings + # and should count as non-trivial logic). + if (not docstring_skipped + and isinstance(stmt, ast.Expr) + and isinstance(stmt.value, ast.Constant) + and isinstance(stmt.value.value, str)): + docstring_skipped = True + continue + if isinstance(stmt, ast.Pass): + continue + if isinstance(stmt, ast.Return): + returns.append(stmt) + continue + # Any other statement (if/for/assign/etc.) means control flow is + # non-trivial; bail out to be conservative. + other_logic = True + break + if other_logic or len(returns) != 1: + return None + val = eval_node(returns[0].value) + return val if isinstance(val, bool) else None + + def deep_merge(base, override): """Deep merge two dictionaries. Override values take precedence.""" if base is None: @@ -186,8 +227,55 @@ if not os.path.isdir(specs_dir): print(json.dumps({"error": f"Directory not found: {specs_dir}", "cwd": os.getcwd()})) sys.exit(1) -# First pass: collect all class info (name, bases, metadata) -class_info = {} # class_name -> {bases: [], metadata: {}, engine_name: str, filename: str} +# Capability flag attributes with their defaults from BaseEngineSpec +CAP_ATTR_DEFAULTS = { + 'supports_dynamic_schema': False, + 'supports_catalog': False, + 'supports_dynamic_catalog': False, + 'disable_ssh_tunneling': False, + 'supports_file_upload': True, + 'allows_joins': True, + 'allows_subqueries': True, +} + +# Maps source capability attribute -> output field name used in databases.json. +# When a cap attr is assigned an unevaluable expression (e.g. +# allows_joins = is_feature_enabled("DRUID_JOINS")), the JS layer uses this +# mapping to preserve the corresponding field from the previously-generated +# JSON rather than silently inheriting an incorrect parent default. +CAP_ATTR_TO_OUTPUT_FIELD = { + 'allows_joins': 'joins', + 'allows_subqueries': 'subqueries', + 'supports_dynamic_schema': 'supports_dynamic_schema', + 'supports_catalog': 'supports_catalog', + 'supports_dynamic_catalog': 'supports_dynamic_catalog', + 'disable_ssh_tunneling': 'ssh_tunneling', + 'supports_file_upload': 'supports_file_upload', +} + +# Methods that indicate a capability when overridden by a non-BaseEngineSpec class. +# Mirrors the has_custom_method checks in superset/db_engine_specs/lib.py. +# cancel_query / has_implicit_cancel -> query_cancelation +# (diagnose() checks cancel_query override OR has_implicit_cancel() == True; +# base has_implicit_cancel returns False, so overriding it is the static +# equivalent of that method returning True. get_cancel_query_id is NOT +# part of the diagnose() heuristic and is intentionally excluded.) +# estimate_statement_cost / estimate_query_cost -> query_cost_estimation +# impersonate_user / update_impersonation_config / get_url_for_impersonation -> user_impersonation +# validate_sql -> sql_validation (not used yet; validation is engine-based) +CAP_METHODS = { + 'cancel_query', 'has_implicit_cancel', + 'estimate_statement_cost', 'estimate_query_cost', + 'impersonate_user', 'update_impersonation_config', 'get_url_for_impersonation', + 'validate_sql', +} + +# Only the literal BaseEngineSpec is excluded from method-override tracking. +# Intermediate base classes (e.g. PrestoBaseEngineSpec) do count as overrides. +TRUE_BASE_CLASS = 'BaseEngineSpec' + +# First pass: collect all class info (name, bases, metadata, cap_attrs, direct_methods) +class_info = {} # class_name -> {bases: [], metadata: {}, engine_name: str, filename: str, ...} for filename in sorted(os.listdir(specs_dir)): if not filename.endswith('.py') or filename in ('__init__.py', 'lib.py', 'lint_metadata.py'): @@ -218,30 +306,54 @@ for filename in sorted(os.listdir(specs_dir)): # Extract class attributes engine_name = None + engine_attr = None metadata = None + cap_attrs = {} # capability flag attributes defined directly in this class + # Cap attrs assigned via expressions we can't statically resolve + # (e.g. is_feature_enabled("FLAG")). Tracked so the JS layer can + # fall back to the previously-generated databases.json value + # rather than inherit a parent default that would be wrong. + unresolved_cap_attrs = set() + direct_methods = set() # capability methods defined directly in this class for item in node.body: if isinstance(item, ast.Assign): for target in item.targets: - if isinstance(target, ast.Name): - if target.id == 'engine_name': - val = eval_node(item.value) - if isinstance(val, str): - engine_name = val - elif target.id == 'metadata': - metadata = eval_node(item.value) + if not isinstance(target, ast.Name): + continue + if target.id == 'engine_name': + val = eval_node(item.value) + if isinstance(val, str): + engine_name = val + elif target.id == 'engine': + val = eval_node(item.value) + if isinstance(val, str): + engine_attr = val + elif target.id == 'metadata': + metadata = eval_node(item.value) + elif target.id in CAP_ATTR_DEFAULTS: + val = eval_node(item.value) + if isinstance(val, bool): + cap_attrs[target.id] = val + else: + # Unevaluable expression β€” defer to JS fallback. + unresolved_cap_attrs.add(target.id) + elif isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)): + if item.name in CAP_METHODS: + # has_implicit_cancel is special: diagnose() uses the + # method's RETURN VALUE, not just its presence. If the + # override statically returns False, treat it as if + # the method weren't overridden so query_cancelation + # matches diagnose(). Unresolvable / True / anything + # else falls through as an override (conservative). + if item.name == 'has_implicit_cancel': + if static_return_bool(item) is False: + continue + direct_methods.add(item.name) # Check for engine attribute with non-empty value to distinguish # true base classes from product classes like OceanBaseEngineSpec - has_non_empty_engine = False - for item in node.body: - if isinstance(item, ast.Assign): - for target in item.targets: - if isinstance(target, ast.Name) and target.id == 'engine': - # Check if engine value is non-empty string - if isinstance(item.value, ast.Constant): - has_non_empty_engine = bool(item.value.value) - break + has_non_empty_engine = engine_attr is not None and bool(engine_attr) # True base classes: end with BaseEngineSpec AND don't define engine # or have empty engine (like PostgresBaseEngineSpec with engine = "") @@ -254,13 +366,18 @@ for filename in sorted(os.listdir(specs_dir)): 'bases': base_names, 'metadata': metadata, 'engine_name': engine_name, + 'engine': engine_attr, 'filename': filename, 'is_base_or_mixin': is_true_base, + 'cap_attrs': cap_attrs, + 'unresolved_cap_attrs': unresolved_cap_attrs, + 'direct_methods': direct_methods, } except Exception as e: errors.append(f"{filename}: {str(e)}") -# Second pass: resolve inheritance and build final metadata +# Second pass: resolve inheritance and build final metadata + capability flags + def get_inherited_metadata(class_name, visited=None): """Recursively get metadata from parent classes.""" if visited is None: @@ -286,6 +403,64 @@ def get_inherited_metadata(class_name, visited=None): return inherited +def get_resolved_caps(class_name, visited=None): + """ + Resolve capability flags and method overrides with inheritance. + + Returns (attr_values, unresolved, methods): + - attr_values: {attr: bool} for attrs where the nearest MRO assignment + was a literal bool. Defaults are applied at the call site. + - unresolved: attrs where the nearest MRO assignment was an unevaluable + expression (e.g. is_feature_enabled("FLAG")). The JS layer falls + back to the previously-generated JSON value for these. + - methods: capability methods defined directly in some non-base ancestor, + matching the has_custom_method() logic in db_engine_specs/lib.py. + + attr_values and unresolved are disjoint β€” an attr is in at most one. + """ + if visited is None: + visited = set() + if class_name in visited: + return {}, set(), set() + visited.add(class_name) + + info = class_info.get(class_name) + if not info: + return {}, set(), set() + + attr_values = {} + unresolved = set() + resolved_methods = set() + + # Collect from parents, iterating right-to-left so leftmost bases win + # (matches Python MRO: for class C(A, B), A's attributes take precedence). + for base_name in reversed(info['bases']): + p_vals, p_unres, p_meth = get_resolved_caps(base_name, visited.copy()) + # A parent's literal assignments overwrite whatever we inherited so far. + for attr, val in p_vals.items(): + attr_values[attr] = val + unresolved.discard(attr) + # A parent's unresolved assignments likewise take precedence. + for attr in p_unres: + unresolved.add(attr) + attr_values.pop(attr, None) + resolved_methods.update(p_meth) + + # Apply this class's own assignments (override parents). + for attr, val in info['cap_attrs'].items(): + attr_values[attr] = val + unresolved.discard(attr) + for attr in info['unresolved_cap_attrs']: + unresolved.add(attr) + attr_values.pop(attr, None) + + # Accumulate method overrides, but skip the literal BaseEngineSpec + # (its implementations are stubs; only non-base overrides count). + if class_name != TRUE_BASE_CLASS: + resolved_methods.update(info['direct_methods']) + + return attr_values, unresolved, resolved_methods + for class_name, info in class_info.items(): # Skip base classes and mixins if info['is_base_or_mixin']: @@ -310,7 +485,14 @@ for class_name, info in class_info.items(): if final_metadata and isinstance(final_metadata, dict) and display_name: debug_info["classes_with_metadata"] += 1 - databases[display_name] = { + + # Resolve capability flags from Python source + attr_values, unresolved_caps, cap_methods = get_resolved_caps(class_name) + cap_attrs = dict(CAP_ATTR_DEFAULTS) + cap_attrs.update(attr_values) + engine_attr = info.get('engine') or '' + + entry = { 'engine': display_name.lower().replace(' ', '_'), 'engine_name': display_name, 'module': info['filename'][:-3], # Remove .py extension @@ -318,19 +500,40 @@ for class_name, info in class_info.items(): 'time_grains': {}, 'score': 0, 'max_score': 0, - 'joins': True, - 'subqueries': True, - 'supports_dynamic_schema': False, - 'supports_catalog': False, - 'supports_dynamic_catalog': False, - 'ssh_tunneling': False, - 'query_cancelation': False, - 'supports_file_upload': False, - 'user_impersonation': False, - 'query_cost_estimation': False, - 'sql_validation': False, + # Capability flags read from engine spec class attributes/methods + 'joins': cap_attrs['allows_joins'], + 'subqueries': cap_attrs['allows_subqueries'], + 'supports_dynamic_schema': cap_attrs['supports_dynamic_schema'], + 'supports_catalog': cap_attrs['supports_catalog'], + 'supports_dynamic_catalog': cap_attrs['supports_dynamic_catalog'], + 'ssh_tunneling': not cap_attrs['disable_ssh_tunneling'], + 'supports_file_upload': cap_attrs['supports_file_upload'], + # Method-based flags: True only when a non-base class overrides them. + # Matches diagnose() in lib.py: cancel_query override OR + # has_implicit_cancel() returning True (which, given the base + # returns False, is equivalent to overriding has_implicit_cancel). + 'query_cancelation': bool({'cancel_query', 'has_implicit_cancel'} & cap_methods), + 'query_cost_estimation': bool({'estimate_statement_cost', 'estimate_query_cost'} & cap_methods), + # SQL validation is implemented in external validator classes keyed by engine name + 'sql_validation': engine_attr in {'presto', 'postgresql'}, + 'user_impersonation': bool( + {'impersonate_user', 'update_impersonation_config', 'get_url_for_impersonation'} & cap_methods + ), } + # Tell the JS layer which output fields were populated from the + # BaseEngineSpec default because the source assignment was an + # unevaluable expression; those get overridden from existing JSON. + unresolved_fields = sorted( + CAP_ATTR_TO_OUTPUT_FIELD[attr] + for attr in unresolved_caps + if attr in CAP_ATTR_TO_OUTPUT_FIELD + ) + if unresolved_fields: + entry['_unresolved_cap_fields'] = unresolved_fields + + databases[display_name] = entry + if errors and not databases: print(json.dumps({"error": "Parse errors", "details": errors, "debug": debug_info}), file=sys.stderr) @@ -851,24 +1054,52 @@ function loadExistingData() { } } +/** + * Fall back to the previously-generated databases.json for capability flags + * whose source assignment couldn't be statically resolved (e.g. + * `allows_joins = is_feature_enabled("DRUID_JOINS")`). The Python extractor + * flags these via the internal `_unresolved_cap_fields` marker; without this + * fallback those fields would silently inherit the BaseEngineSpec default + * and disagree with runtime behavior. The marker is stripped before output. + */ +function fallbackUnresolvedCaps(newDatabases, existingData) { + for (const [name, db] of Object.entries(newDatabases)) { + const unresolved = db._unresolved_cap_fields; + if (!unresolved || unresolved.length === 0) { + delete db._unresolved_cap_fields; + continue; + } + const existingDb = existingData?.databases?.[name]; + if (existingDb) { + for (const field of unresolved) { + if (existingDb[field] !== undefined) { + db[field] = existingDb[field]; + } + } + } + delete db._unresolved_cap_fields; + } + return newDatabases; +} + /** * Merge new documentation with existing diagnostics - * Preserves score, time_grains, and feature flags from existing data + * Preserves score, max_score, and time_grains from existing data (these require + * Flask context to generate and cannot be derived from static source analysis). + * Capability flags (joins, supports_catalog, etc.) are NOT preserved here β€” they + * are read fresh from the Python engine spec source by extractEngineSpecMetadata(), + * with a separate fallback for expression-based assignments (see fallbackUnresolvedCaps). */ function mergeWithExistingDiagnostics(newDatabases, existingData) { if (!existingData?.databases) return newDatabases; - const diagnosticFields = [ - 'score', 'max_score', 'time_grains', 'joins', 'subqueries', - 'supports_dynamic_schema', 'supports_catalog', 'supports_dynamic_catalog', - 'ssh_tunneling', 'query_cancelation', 'supports_file_upload', - 'user_impersonation', 'query_cost_estimation', 'sql_validation' - ]; + // Only preserve fields that require Flask/runtime context to generate + const diagnosticFields = ['score', 'max_score', 'time_grains']; for (const [name, db] of Object.entries(newDatabases)) { const existingDb = existingData.databases[name]; if (existingDb && existingDb.score > 0) { - // Preserve diagnostics from existing data + // Preserve score/time_grain diagnostics from existing data for (const field of diagnosticFields) { if (existingDb[field] !== undefined) { db[field] = existingDb[field]; @@ -879,7 +1110,7 @@ function mergeWithExistingDiagnostics(newDatabases, existingData) { const preserved = Object.values(newDatabases).filter(d => d.score > 0).length; if (preserved > 0) { - console.log(`Preserved diagnostics for ${preserved} databases from existing data`); + console.log(`Preserved score/time_grains for ${preserved} databases from existing data`); } return newDatabases; @@ -927,6 +1158,12 @@ async function main() { databases = mergeWithExistingDiagnostics(databases, existingData); } + // For cap flags assigned via unevaluable expressions (e.g. + // `is_feature_enabled(...)`), prefer the value from a previously-generated + // JSON. Runs regardless of scores since it addresses static-analysis gaps, + // not missing Flask diagnostics. Always strips the internal marker. + databases = fallbackUnresolvedCaps(databases, existingData); + // Extract and merge custom_errors for troubleshooting documentation const customErrors = extractCustomErrors(); mergeCustomErrors(databases, customErrors); diff --git a/docs/scripts/manage-versions.mjs b/docs/scripts/manage-versions.mjs index d96dfc355a9..2318344157c 100644 --- a/docs/scripts/manage-versions.mjs +++ b/docs/scripts/manage-versions.mjs @@ -30,9 +30,11 @@ const __dirname = path.dirname(__filename); const CONFIG_FILE = path.join(__dirname, '..', 'versions-config.json'); // Parse command line arguments -const args = process.argv.slice(2); +const rawArgs = process.argv.slice(2); +const skipGenerate = rawArgs.includes('--skip-generate'); +const args = rawArgs.filter((a) => a !== '--skip-generate'); const command = args[0]; // 'add' or 'remove' -const section = args[1]; // 'docs', 'developer_portal', or 'components' +const section = args[1]; // 'docs', 'admin_docs', 'developer_docs', or 'components' const version = args[2]; // version string like '1.2.0' function loadConfig() { @@ -43,36 +45,158 @@ function saveConfig(config) { fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n'); } -function fixVersionedImports(version) { - const versionedDocsPath = path.join(__dirname, '..', 'versioned_docs', `version-${version}`); +function freezeDataImports(section, version) { + // MDX files can `import` JSON/YAML data from outside the section, either + // via escaping relative paths (e.g. country-map-tools.mdx imports + // `../../data/countries.json`) or via the `@site/` alias (e.g. + // feature-flags.mdx imports `@site/static/feature-flags.json`). Without + // intervention the snapshot keeps reading the live file, so the + // historical version's content silently changes whenever the data file + // is updated. Copy each escaping data import into a snapshot-local + // `_versioned_data/` dir and rewrite the import to point there. + const sectionRoot = section === 'docs' + ? path.join(__dirname, '..', 'docs') + : path.join(__dirname, '..', section); + const docsRoot = path.join(__dirname, '..'); + const versionedDocsDir = section === 'docs' + ? `versioned_docs/version-${version}` + : `${section}_versioned_docs/version-${version}`; + const versionedDocsPath = path.join(__dirname, '..', versionedDocsDir); + const frozenDataDir = path.join(versionedDocsPath, '_versioned_data'); - // Files that need import path fixes - const filesToFix = [ - 'contributing/resources.mdx', - 'configuration/country-map-tools.mdx' - ]; + if (!fs.existsSync(versionedDocsPath)) { + return; + } - console.log(` Fixing relative imports in versioned docs...`); + console.log(` Freezing data imports in ${versionedDocsDir}...`); - filesToFix.forEach(filePath => { - const fullPath = path.join(versionedDocsPath, filePath); - if (fs.existsSync(fullPath)) { - let content = fs.readFileSync(fullPath, 'utf8'); + // Matches data file imports in two flavors: + // `from '../../foo/bar.json'` (relative, must escape one or more dirs) + // `from '@site/static/foo.json'` (Docusaurus site-root alias) + const dataImportRe = /(from\s+['"])((?:\.\.\/)+|@site\/)([^'"\s]+\.(?:json|ya?ml))(['"])/g; - // Fix imports that go up two directories to go up three instead - content = content.replace( - /from ['"]\.\.\/\.\.\/src\//g, - "from '../../../src/" - ); - content = content.replace( - /from ['"]\.\.\/\.\.\/data\//g, - "from '../../../data/" - ); - - fs.writeFileSync(fullPath, content); - console.log(` Fixed imports in ${filePath}`); + function freezeOne(fullPath, depth, prefix, pathSpec, importPath, suffix) { + let resolvedSource; + if (pathSpec === '@site/') { + // `@site/...` always resolves relative to the docs root. + resolvedSource = path.join(docsRoot, importPath); + } else { + // Relative path β€” must escape the file's depth within the section + // to point at content outside the section. Imports that stay inside + // are copied wholesale by Docusaurus, so we leave them alone. + const upCount = pathSpec.match(/\.\.\//g).length; + if (upCount <= depth) return null; + const relativeFromVersioned = path.relative(versionedDocsPath, fullPath); + const originalDir = path.dirname(path.join(sectionRoot, relativeFromVersioned)); + resolvedSource = path.resolve(originalDir, pathSpec + importPath); } - }); + // Skip imports that land inside the section root β€” those get copied + // with the section snapshot already. + const relFromSection = path.relative(sectionRoot, resolvedSource); + if (!relFromSection.startsWith('..')) return null; + const relFromDocsRoot = path.relative(docsRoot, resolvedSource); + if (relFromDocsRoot.startsWith('..') || !fs.existsSync(resolvedSource)) { + return null; + } + const destPath = path.join(frozenDataDir, relFromDocsRoot); + fs.mkdirSync(path.dirname(destPath), { recursive: true }); + fs.copyFileSync(resolvedSource, destPath); + const rewritten = path + .relative(path.dirname(fullPath), destPath) + .split(path.sep) + .join('/'); + const finalImport = rewritten.startsWith('.') ? rewritten : `./${rewritten}`; + return `${prefix}${finalImport}${suffix}`; + } + + function walk(dir, depth) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name.startsWith('_')) continue; + walk(fullPath, depth + 1); + } else if (entry.isFile() && /\.(md|mdx)$/.test(entry.name)) { + const original = fs.readFileSync(fullPath, 'utf8'); + let inFence = false; + let mutated = false; + const updated = original.split('\n').map(line => { + if (/^\s*(```|~~~)/.test(line)) { + inFence = !inFence; + return line; + } + if (inFence) return line; + return line.replace(dataImportRe, (match, prefix, pathSpec, importPath, suffix) => { + const rewritten = freezeOne(fullPath, depth, prefix, pathSpec, importPath, suffix); + if (rewritten === null) return match; + mutated = true; + return rewritten; + }); + }).join('\n'); + if (mutated) { + fs.writeFileSync(fullPath, updated); + const rel = path.relative(versionedDocsPath, fullPath); + console.log(` Froze data imports in ${rel}`); + } + } + } + } + + walk(versionedDocsPath, 0); +} + +function fixVersionedImports(section, version) { + // Versioned content lands one directory deeper than the source content, + // so any `../../src/` or `../../data/` imports in .md/.mdx files need + // an extra `../` to keep reaching docs/src and docs/data. + const versionedDocsDir = section === 'docs' + ? `versioned_docs/version-${version}` + : `${section}_versioned_docs/version-${version}`; + const versionedDocsPath = path.join(__dirname, '..', versionedDocsDir); + + if (!fs.existsSync(versionedDocsPath)) { + return; + } + + console.log(` Fixing relative imports in ${versionedDocsDir}...`); + + // Imports whose `../` count exceeds the file's depth within the section + // escape the section root, so they need one extra `../` once the file + // lives one level deeper inside the snapshot dir. Imports that stay + // inside the section are unaffected (the section copies wholesale). + function walk(dir, depth) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + walk(fullPath, depth + 1); + } else if (entry.isFile() && /\.(md|mdx)$/.test(entry.name)) { + const original = fs.readFileSync(fullPath, 'utf8'); + // Track fenced code blocks so we don't rewrite import samples inside + // ```ts / ```js (etc.) blocks that are documentation, not real imports. + let inFence = false; + const updated = original.split('\n').map(line => { + if (/^\s*(```|~~~)/.test(line)) { + inFence = !inFence; + return line; + } + if (inFence) return line; + return line.replace( + /(from\s+['"])((?:\.\.\/)+)/g, + (match, prefix, dots) => { + const upCount = dots.match(/\.\.\//g).length; + return upCount > depth ? `${prefix}../${dots}` : match; + }, + ); + }).join('\n'); + if (updated !== original) { + fs.writeFileSync(fullPath, updated); + const rel = path.relative(versionedDocsPath, fullPath); + console.log(` Fixed imports in ${rel}`); + } + } + } + } + + walk(versionedDocsPath, 0); } function addVersion(section, version) { @@ -91,6 +215,28 @@ function addVersion(section, version) { console.log(`Creating version ${version} for ${section}...`); + // Refresh auto-generated content (database pages, API reference, + // component playground) so the snapshot captures the current state of + // master rather than whatever happened to be on disk. `generate:smart` + // hashes its inputs and skips unchanged generators, so this is cheap + // when the dev already has fresh output. + // + // Use --skip-generate if you've placed a CI-artifact databases.json + // (the `database-diagnostics` artifact from Python-Integration) and + // want to preserve it instead of letting the local env regenerate it. + // See docs/README.md "Before You Cut" for the canonical release flow. + if (skipGenerate) { + console.log(` Skipping auto-gen refresh (--skip-generate set)`); + } else { + console.log(` Refreshing auto-generated docs...`); + try { + execSync('yarn run generate:smart', { stdio: 'inherit' }); + } catch (error) { + console.error(`Failed to refresh auto-generated docs: ${error.message}`); + process.exit(1); + } + } + // Run Docusaurus version command const docusaurusCommand = section === 'docs' ? `yarn docusaurus docs:version ${version}` @@ -103,10 +249,12 @@ function addVersion(section, version) { process.exit(1); } - // Fix relative imports in versioned docs (for main docs section only) - if (section === 'docs') { - fixVersionedImports(version); - } + // Freeze data imports BEFORE adjusting paths, so the depth-aware rewriter + // doesn't process the now-local imports we just rewrote. + freezeDataImports(section, version); + + // Fix relative imports in versioned content + fixVersionedImports(section, version); // Update config // Add to onlyIncludeVersions array (after 'current') @@ -121,10 +269,15 @@ function addVersion(section, version) { banner: 'none' }; - // Optionally update lastVersion if this is the first non-current version - if (config[section].onlyIncludeVersions.length === 2) { - config[section].lastVersion = version; - } + // Note: we deliberately do NOT auto-bump `lastVersion` to the new + // version. Superset's docs site keeps `lastVersion: 'current'` so + // the canonical URLs (`/user-docs/...`, `/admin-docs/...`, + // `/developer-docs/...`, `/components/...`) always render master + // content; cut versions are accessed only via their explicit version + // segment. (`/docs/...` paths are legacy and handled via per-page + // redirects in docusaurus.config.ts β€” not a current canonical + // form.) If you want a different policy, edit versions-config.json + // after cutting. saveConfig(config); console.log(`βœ… Version ${version} added successfully to ${section}`); @@ -185,8 +338,17 @@ function removeVersion(section, version) { const versionIndex = versions.indexOf(version); if (versionIndex > -1) { versions.splice(versionIndex, 1); - fs.writeFileSync(versionsJsonPath, JSON.stringify(versions, null, 2) + '\n'); - console.log(` Updated ${versionsJsonFile}`); + if (versions.length === 0) { + // Sections with no versions shouldn't carry an empty versions file + // on disk β€” Docusaurus doesn't require it, and an empty `[]` file + // gets picked up by `docusaurus version` and snapshotted into the + // next cut. + fs.unlinkSync(versionsJsonPath); + console.log(` Removed empty ${versionsJsonFile}`); + } else { + fs.writeFileSync(versionsJsonPath, JSON.stringify(versions, null, 2) + '\n'); + console.log(` Updated ${versionsJsonFile}`); + } } } @@ -211,17 +373,20 @@ function removeVersion(section, version) { function printUsage() { console.log(` Usage: - node scripts/manage-versions.js add
- node scripts/manage-versions.js remove
+ node scripts/manage-versions.mjs add
[--skip-generate] + node scripts/manage-versions.mjs remove
Where: - - section: 'docs', 'developer_portal', or 'components' + - section: 'docs', 'developer_docs', 'admin_docs', or 'components' - version: version string (e.g., '1.2.0', '2.0.0') + - --skip-generate: skip refreshing auto-generated docs before snapshotting + (use when you've already placed a fresh databases.json + from CI and want to preserve it) Examples: - node scripts/manage-versions.js add docs 2.0.0 - node scripts/manage-versions.js add developer_portal 1.3.0 - node scripts/manage-versions.js remove components 1.0.0 + node scripts/manage-versions.mjs add docs 2.0.0 + node scripts/manage-versions.mjs add developer_docs 1.3.0 + node scripts/manage-versions.mjs remove components 1.0.0 `); } diff --git a/docs/src/data/databases.json b/docs/src/data/databases.json index a10bf0303e5..8a766c481c8 100644 --- a/docs/src/data/databases.json +++ b/docs/src/data/databases.json @@ -1,96 +1,18 @@ { - "generated": "2026-04-25T02:18:43.905Z", + "generated": "2026-04-17T17:08:35.132Z", "statistics": { - "totalDatabases": 73, - "withDocumentation": 73, - "withConnectionString": 73, - "withDrivers": 36, + "totalDatabases": 80, + "withDocumentation": 80, + "withConnectionString": 80, + "withDrivers": 28, "withAuthMethods": 5, - "supportsJoins": 69, - "supportsSubqueries": 70, - "supportsDynamicSchema": 15, - "supportsCatalog": 9, - "averageScore": 31, + "supportsJoins": 74, + "supportsSubqueries": 77, + "supportsDynamicSchema": 29, + "supportsCatalog": 20, + "averageScore": 54, "maxScore": 201, "byCategory": { - "Other Databases": [ - "Arc", - "Shillelagh", - "Superset meta database" - ], - "Proprietary": [ - "Arc", - "Amazon Athena", - "Google BigQuery", - "Databend", - "Google Datastore", - "IBM Db2", - "Denodo", - "Dremio", - "Amazon DynamoDB", - "Exasol", - "Firebolt", - "SAP HANA", - "Hologres", - "IBM Db2 for i", - "Azure Data Explorer", - "MongoDB", - "Microsoft SQL Server", - "Azure Synapse", - "IBM Netezza Performance Server", - "Ocient", - "Oracle", - "Amazon Redshift", - "SingleStore", - "Snowflake", - "SAP Sybase", - "Teradata", - "Vertica" - ], - "Cloud Data Warehouses": [ - "Ascend", - "Cloudflare D1", - "Databend", - "Databricks", - "MotherDuck", - "Firebolt", - "Hologres", - "Azure Synapse", - "Snowflake", - "YugabyteDB" - ], - "Analytical Databases": [ - "Ascend", - "Google BigQuery", - "ClickHouse", - "Databend", - "Databricks", - "Apache Doris", - "DuckDB", - "MotherDuck", - "Exasol", - "Firebolt", - "Hologres", - "Azure Data Explorer", - "Apache Kylin", - "Azure Synapse", - "Ocient", - "Apache Phoenix", - "Amazon Redshift", - "RisingWave", - "SingleStore", - "Snowflake", - "StarRocks", - "TimescaleDB", - "Vertica" - ], - "Hosted Open Source": [ - "Ascend", - "Cloudflare D1", - "Databricks", - "MotherDuck", - "Google Sheets" - ], "Cloud - AWS": [ "Amazon Athena", "Amazon DynamoDB", @@ -98,77 +20,128 @@ ], "Query Engines": [ "Amazon Athena", - "Databricks Interactive Cluster", - "Denodo", - "Dremio", "Apache Drill", "Apache Hive", "Apache Impala", - "Presto", "Apache Spark SQL", + "Databricks Interactive Cluster", + "Denodo", + "Dremio", + "Presto", "Trino" ], - "Traditional RDBMS": [ - "Aurora MySQL (Data API)", - "Aurora PostgreSQL (Data API)", - "Aurora MySQL", - "Aurora PostgreSQL", - "CockroachDB", - "Cloudflare D1", + "Proprietary": [ + "Amazon Athena", + "Amazon DynamoDB", + "Amazon Redshift", + "Arc", + "Azure Data Explorer", + "Azure Synapse", + "Databend", + "Denodo", + "Dremio", + "Exasol", + "Firebolt", + "Google BigQuery", + "Google Datastore", + "Hologres", "IBM Db2", - "Firebird", - "Greenplum", - "SAP HANA", "IBM Db2 for i", - "MariaDB", - "MonetDB", - "Microsoft SQL Server", - "MySQL", "IBM Netezza Performance Server", - "OceanBase", + "Microsoft SQL Server", + "MongoDB", + "Ocient", "Oracle", - "PostgreSQL", - "SQLite", + "SAP HANA", "SAP Sybase", + "SingleStore", + "Snowflake", "Teradata", - "YDB", - "YugabyteDB" + "Vertica" + ], + "Search & NoSQL": [ + "Amazon DynamoDB", + "Apache Solr", + "Couchbase", + "Elasticsearch", + "Google Datastore", + "MongoDB", + "Parseable" + ], + "Analytical Databases": [ + "Amazon Redshift", + "Apache Doris", + "Apache Kylin", + "Apache Phoenix", + "Ascend", + "Azure Data Explorer", + "Azure Synapse", + "ClickHouse", + "Databend", + "Databricks", + "DuckDB", + "Exasol", + "Firebolt", + "Google BigQuery", + "Hologres", + "MotherDuck", + "Ocient", + "RisingWave", + "SingleStore", + "Snowflake", + "StarRocks", + "TimescaleDB", + "Vertica" + ], + "Apache Projects": [ + "Apache Doris", + "Apache Drill", + "Apache Druid", + "Apache Hive", + "Apache Impala", + "Apache IoTDB", + "Apache Kylin", + "Apache Phoenix", + "Apache Pinot", + "Apache Solr", + "Apache Spark SQL", + "Databricks Interactive Cluster" ], "Open Source": [ - "Aurora MySQL (Data API)", - "Aurora PostgreSQL (Data API)", + "Apache Doris", + "Apache Drill", + "Apache Druid", + "Apache Hive", + "Apache Impala", + "Apache IoTDB", + "Apache Kylin", + "Apache Phoenix", + "Apache Pinot", + "Apache Solr", + "Apache Spark SQL", "Aurora MySQL", + "Aurora MySQL (Data API)", "Aurora PostgreSQL", + "Aurora PostgreSQL (Data API)", "ClickHouse", "CockroachDB", "Couchbase", "CrateDB", "Databricks Interactive Cluster", - "Apache Doris", - "Apache Drill", - "Apache Druid", "DuckDB", "Elasticsearch", "Firebird", "Greenplum", - "Apache Hive", - "Apache Impala", - "Apache IoTDB", - "Apache Kylin", "MariaDB", "MonetDB", "MySQL", "OceanBase", "Parseable", - "Apache Phoenix", - "Apache Pinot", "PostgreSQL", "Presto", "RisingWave", - "Shillelagh", - "Apache Solr", - "Apache Spark SQL", "SQLite", + "Shillelagh", "StarRocks", "TDengine", "TimescaleDB", @@ -176,146 +149,148 @@ "YDB", "YugabyteDB" ], + "Time Series Databases": [ + "Apache Druid", + "Apache IoTDB", + "Apache Pinot", + "CrateDB", + "TDengine" + ], + "Other Databases": [ + "Arc", + "Azure Data Explorer (KQL)", + "ClickHouse (sqlalchemy)", + "Databend (legacy)", + "Databricks (legacy)", + "Databricks SQL Endpoint", + "OpenSearch (OpenDistro)", + "Shillelagh", + "Superset meta database", + "base" + ], + "Cloud Data Warehouses": [ + "Ascend", + "Azure Synapse", + "Cloudflare D1", + "Databend", + "Databricks", + "Firebolt", + "Hologres", + "MotherDuck", + "Snowflake", + "YugabyteDB" + ], + "Hosted Open Source": [ + "Ascend", + "Cloudflare D1", + "Databricks", + "Google Sheets", + "MotherDuck" + ], + "Traditional RDBMS": [ + "Aurora MySQL", + "Aurora MySQL (Data API)", + "Aurora PostgreSQL", + "Aurora PostgreSQL (Data API)", + "Cloudflare D1", + "CockroachDB", + "Firebird", + "Greenplum", + "IBM Db2", + "IBM Db2 for i", + "IBM Netezza Performance Server", + "MariaDB", + "Microsoft SQL Server", + "MonetDB", + "MySQL", + "OceanBase", + "Oracle", + "PostgreSQL", + "SAP HANA", + "SAP Sybase", + "SQLite", + "Teradata", + "YDB", + "YugabyteDB" + ], + "Cloud - Azure": [ + "Azure Data Explorer" + ], "Cloud - Google": [ "Google BigQuery", "Google Datastore", "Google Sheets" - ], - "Search & NoSQL": [ - "Couchbase", - "Google Datastore", - "Amazon DynamoDB", - "Elasticsearch", - "MongoDB", - "Parseable", - "Apache Solr" - ], - "Time Series Databases": [ - "CrateDB", - "Apache Druid", - "Apache IoTDB", - "Apache Pinot", - "TDengine" - ], - "Apache Projects": [ - "Databricks Interactive Cluster", - "Apache Doris", - "Apache Drill", - "Apache Druid", - "Apache Hive", - "Apache Impala", - "Apache IoTDB", - "Apache Kylin", - "Apache Phoenix", - "Apache Pinot", - "Apache Solr", - "Apache Spark SQL" - ], - "Cloud - Azure": [ - "Azure Data Explorer" ] } }, "databases": { - "Arc": { - "engine": "arc", - "engine_name": "Arc", - "module": "arc", - "documentation": { - "description": "Arc is a data platform with multiple connection options.", - "categories": [ - "OTHER", - "PROPRIETARY" - ], - "pypi_packages": [ - "arc-superset-arrow" - ], - "connection_string": "arc+arrow://{api_key}@{hostname}:{port}/{database}", - "parameters": { - "api_key": "Arc API key", - "hostname": "Arc hostname", - "port": "Arc port", - "database": "Database name" - }, - "drivers": [ - { - "name": "Apache Arrow (Recommended)", - "pypi_package": "arc-superset-arrow", - "connection_string": "arc+arrow://{api_key}@{hostname}:{port}/{database}", - "is_recommended": true, - "notes": "Recommended for production. Provides 3-5x better performance using Apache Arrow IPC." - }, - { - "name": "JSON", - "pypi_package": "arc-superset-dialect", - "connection_string": "arc+json://{api_key}@{hostname}:{port}/{database}", - "is_recommended": false - } - ], - "notes": "Arc supports multiple databases (schemas) within a single instance. Each Arc database appears as a schema in SQL Lab." - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Ascend": { - "engine": "ascend", - "engine_name": "Ascend", - "module": "ascend", - "documentation": { - "description": "Ascend.io is a data automation platform for building data pipelines.", - "logo": "ascend.webp", - "homepage_url": "https://www.ascend.io/", - "pypi_packages": [ - "impyla", - "impyla" - ], - "connection_string": "ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true", - "default_port": 21050, - "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "HOSTED_OPEN_SOURCE" - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, "Amazon Athena": { - "engine": "amazon_athena", - "engine_name": "Amazon Athena", - "module": "athena", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.athena", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": false, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": false, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 30, + "max_score": 201, "documentation": { "description": "Amazon Athena is an interactive query service for analyzing data in S3 using SQL.", "logo": "amazon-athena.jpg", "homepage_url": "https://aws.amazon.com/athena/", "categories": [ - "CLOUD_AWS", - "QUERY_ENGINES", - "PROPRIETARY" + "Cloud - AWS", + "Query Engines", + "Proprietary" ], "pypi_packages": [ "pyathena[pandas]" @@ -349,6 +324,7 @@ } ], "notes": "URL-encode special characters in s3_staging_dir (e.g., s3:// becomes s3%3A//).", + "category": "Cloud - AWS", "custom_errors": [ { "regex_name": "SYNTAX_ERROR_REGEX", @@ -362,361 +338,475 @@ } ] }, - "time_grains": {}, - "score": 0, - "max_score": 0, + "engine": "awsathena", + "engine_name": "Amazon Athena", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Amazon DynamoDB": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.dynamodb", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Aurora MySQL (Data API)": { - "engine": "aurora_mysql_(data_api)", - "engine_name": "Aurora MySQL (Data API)", - "module": "aurora", + "sql_validation": false, + "score": 32, + "max_score": 201, "documentation": { - "description": "MySQL is a popular open-source relational database.", - "logo": "mysql.png", - "homepage_url": "https://www.mysql.com/", + "description": "Amazon DynamoDB is a serverless NoSQL database with SQL via PartiQL.", + "logo": "aws.png", + "homepage_url": "https://aws.amazon.com/dynamodb/", "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "Cloud - AWS", + "Search & NoSQL", + "Proprietary" ], "pypi_packages": [ - "mysqlclient" + "pydynamodb" ], - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "default_port": 3306, + "connection_string": "dynamodb://{aws_access_key_id}:{aws_secret_access_key}@dynamodb.{region}.amazonaws.com:443?connector=superset", + "parameters": { + "aws_access_key_id": "AWS access key ID", + "aws_secret_access_key": "AWS secret access key", + "region": "AWS region (e.g., us-east-1)" + }, + "notes": "Uses PartiQL for SQL queries. Requires connector=superset parameter.", + "docs_url": "https://github.com/passren/PyDynamoDB", + "category": "Cloud - AWS" + }, + "engine": "dynamodb", + "engine_name": "Amazon DynamoDB", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Amazon Redshift": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.redshift", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 127, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 44, + "max_score": 201, + "documentation": { + "description": "Amazon Redshift is a fully managed data warehouse service.", + "logo": "redshift.png", + "homepage_url": "https://aws.amazon.com/redshift/", + "categories": [ + "Cloud - AWS", + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "sqlalchemy-redshift" + ], + "connection_string": "redshift+psycopg2://{username}:{password}@{host}:5439/{database}", + "default_port": 5439, "parameters": { "username": "Database username", "password": "Database password", - "host": "localhost, 127.0.0.1, IP address, or hostname", + "host": "AWS Endpoint", + "port": "Default 5439", "database": "Database name" }, - "host_examples": [ - { - "platform": "Localhost", - "host": "localhost or 127.0.0.1" - }, - { - "platform": "Docker on Linux", - "host": "172.18.0.1" - }, - { - "platform": "Docker on macOS", - "host": "docker.for.mac.host.internal" - }, - { - "platform": "On-premise", - "host": "IP address or hostname" - } - ], "drivers": [ { - "name": "mysqlclient", - "pypi_package": "mysqlclient", - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "is_recommended": true, - "notes": "Recommended driver. May fail with caching_sha2_password auth." + "name": "psycopg2", + "pypi_package": "psycopg2", + "connection_string": "redshift+psycopg2://{username}:{password}@{host}:5439/{database}", + "is_recommended": true }, { - "name": "mysql-connector-python", - "pypi_package": "mysql-connector-python", - "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", + "name": "redshift_connector", + "pypi_package": "redshift_connector", + "connection_string": "redshift+redshift_connector://{username}:{password}@{host}:5439/{database}", "is_recommended": false, - "notes": "Required for newer MySQL databases using caching_sha2_password authentication." - } - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Aurora PostgreSQL (Data API)": { - "engine": "aurora_postgresql_(data_api)", - "engine_name": "Aurora PostgreSQL (Data API)", - "module": "aurora", - "documentation": { - "description": "PostgreSQL is an advanced open-source relational database.", - "logo": "postgresql.svg", - "homepage_url": "https://www.postgresql.org/", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "psycopg2" - ], - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", - "default_port": 5432, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "For localhost: localhost or 127.0.0.1. For AWS: endpoint URL", - "port": "Default 5432", - "database": "Database name" - }, - "notes": "The psycopg2 library comes bundled with Superset Docker images.", - "connection_examples": [ - { - "description": "Basic connection", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" - }, - { - "description": "With SSL required", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" + "notes": "Supports IAM-based credentials for clusters and serverless." } ], - "docs_url": "https://www.postgresql.org/docs/", - "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html" - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Aurora MySQL": { - "engine": "aurora_mysql", - "engine_name": "Aurora MySQL", - "module": "aurora", - "documentation": { - "description": "MySQL is a popular open-source relational database.", - "logo": "mysql.png", - "homepage_url": "https://www.mysql.com/", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "mysqlclient" - ], - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "default_port": 3306, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "localhost, 127.0.0.1, IP address, or hostname", - "database": "Database name" - }, - "host_examples": [ - { - "platform": "Localhost", - "host": "localhost or 127.0.0.1" - }, - { - "platform": "Docker on Linux", - "host": "172.18.0.1" - }, - { - "platform": "Docker on macOS", - "host": "docker.for.mac.host.internal" - }, - { - "platform": "On-premise", - "host": "IP address or hostname" - } - ], - "drivers": [ - { - "name": "mysqlclient", - "pypi_package": "mysqlclient", - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "is_recommended": true, - "notes": "Recommended driver. May fail with caching_sha2_password auth." - }, - { - "name": "mysql-connector-python", - "pypi_package": "mysql-connector-python", - "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", - "is_recommended": false, - "notes": "Required for newer MySQL databases using caching_sha2_password authentication." - } - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Aurora PostgreSQL": { - "engine": "aurora_postgresql", - "engine_name": "Aurora PostgreSQL", - "module": "aurora", - "documentation": { - "description": "PostgreSQL is an advanced open-source relational database.", - "logo": "postgresql.svg", - "homepage_url": "https://www.postgresql.org/", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "psycopg2" - ], - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", - "default_port": 5432, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "For localhost: localhost or 127.0.0.1. For AWS: endpoint URL", - "port": "Default 5432", - "database": "Database name" - }, - "notes": "The psycopg2 library comes bundled with Superset Docker images.", - "connection_examples": [ - { - "description": "Basic connection", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" - }, - { - "description": "With SSL required", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" - } - ], - "docs_url": "https://www.postgresql.org/docs/", - "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html" - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Google BigQuery": { - "engine": "google_bigquery", - "engine_name": "Google BigQuery", - "module": "bigquery", - "documentation": { - "description": "Google BigQuery is a serverless, highly scalable data warehouse.", - "logo": "google-big-query.svg", - "homepage_url": "https://cloud.google.com/bigquery/", - "categories": [ - "CLOUD_GCP", - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "sqlalchemy-bigquery" - ], - "connection_string": "bigquery://{project_id}", - "install_instructions": "echo \"sqlalchemy-bigquery\" >> ./docker/requirements-local.txt", "authentication_methods": [ { - "name": "Service Account JSON", - "description": "Upload service account credentials JSON or paste in Secure Extra", - "secure_extra": { - "credentials_info": { - "type": "service_account", - "project_id": "...", - "private_key_id": "...", - "private_key": "...", - "client_email": "...", - "client_id": "...", - "auth_uri": "...", - "token_uri": "..." + "name": "IAM Credentials (Cluster)", + "description": "Use IAM-based temporary database credentials for Redshift clusters", + "requirements": "IAM role must have redshift:GetClusterCredentials permission", + "connection_string": "redshift+redshift_connector://", + "engine_parameters": { + "connect_args": { + "iam": true, + "database": "", + "cluster_identifier": "", + "db_user": "" + } + } + }, + { + "name": "IAM Role (Serverless)", + "description": "Authenticate using the IAM role attached to the environment (EC2 instance profile, ECS task role, etc.). No credentials needed.", + "requirements": "The attached IAM role must have redshift-serverless:GetCredentials and redshift-serverless:GetWorkgroup permissions.", + "connection_string": "redshift+redshift_connector://", + "engine_parameters": { + "connect_args": { + "iam": true, + "is_serverless": true, + "serverless_acct_id": "", + "serverless_work_group": "", + "database": "", + "user": "IAMR:" + } + } + }, + { + "name": "IAM Access Key (Serverless)", + "description": "Authenticate using explicit AWS access key and secret. Suitable for local development or CI environments without an attached IAM role.", + "requirements": "The IAM user must have redshift-serverless:GetCredentials and redshift-serverless:GetWorkgroup permissions.", + "connection_string": "redshift+redshift_connector://", + "engine_parameters": { + "connect_args": { + "iam": true, + "is_serverless": true, + "serverless_acct_id": "", + "serverless_work_group": "", + "database": "", + "host": "", + "port": 5439, + "region": "", + "access_key_id": "", + "secret_access_key": "" } } } ], - "notes": "Create a Service Account via GCP console with access to BigQuery datasets. For CSV/Excel uploads, also install pandas_gbq.", - "warnings": [ - "Google BigQuery Python SDK is not compatible with gevent. Use a worker type other than gevent when deploying with gunicorn." - ], - "docs_url": "https://github.com/googleapis/python-bigquery-sqlalchemy", + "category": "Cloud - AWS", "custom_errors": [ { - "regex_name": "CONNECTION_DATABASE_PERMISSIONS_REGEX", - "message_template": "Unable to connect. Verify that the following roles are set on the service account: \"BigQuery Data Viewer\", \"BigQuery Metadata Viewer\", \"BigQuery Job User\" and the following permissions are set \"bigquery.readsessions.create\", \"bigquery.readsessions.getData\"", - "error_type": "CONNECTION_DATABASE_PERMISSIONS_ERROR", - "category": "Permissions", - "description": "Insufficient permissions", + "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", + "message_template": "Either the username \"%(username)s\" or the password is incorrect.", + "error_type": "CONNECTION_ACCESS_DENIED_ERROR", + "category": "Authentication", + "description": "Access denied", "issue_codes": [ - 1017 + 1014, + 1015 + ], + "invalid_fields": [ + "username", + "password" ] }, { - "regex_name": "TABLE_DOES_NOT_EXIST_REGEX", - "message_template": "The table \"%(table)s\" does not exist. A valid table must be used to run this query.", - "error_type": "TABLE_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Table not found", + "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", + "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", + "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", + "category": "Connection", + "description": "Invalid hostname", "issue_codes": [ - 1003, - 1005 + 1007 + ], + "invalid_fields": [ + "host" ] }, { - "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", - "message_template": "We can't seem to resolve column \"%(column)s\" at line %(location)s.", - "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Column not found", + "regex_name": "CONNECTION_PORT_CLOSED_REGEX", + "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", + "error_type": "CONNECTION_PORT_CLOSED_ERROR", + "category": "Connection", + "description": "Port closed or refused", "issue_codes": [ - 1003, - 1004 + 1008 + ], + "invalid_fields": [ + "host", + "port" ] }, { - "regex_name": "SCHEMA_DOES_NOT_EXIST_REGEX", - "message_template": "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.", - "error_type": "SCHEMA_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Schema not found", + "regex_name": "CONNECTION_HOST_DOWN_REGEX", + "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", + "error_type": "CONNECTION_HOST_DOWN_ERROR", + "category": "Connection", + "description": "Host unreachable", "issue_codes": [ - 1003, - 1016 + 1009 + ], + "invalid_fields": [ + "host", + "port" + ] + }, + { + "regex_name": "CONNECTION_UNKNOWN_DATABASE_REGEX", + "message_template": "We were unable to connect to your database named \"%(database)s\". Please verify your database name and try again.", + "error_type": "CONNECTION_UNKNOWN_DATABASE_ERROR", + "category": "Connection", + "description": "Unknown database", + "issue_codes": [ + 1015 + ], + "invalid_fields": [ + "database" + ] + } + ] + }, + "engine": "redshift", + "engine_name": "Amazon Redshift", + "engine_aliases": [], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Doris": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.doris", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 79, + "max_score": 201, + "documentation": { + "description": "Apache Doris is a high-performance real-time analytical database.", + "logo": "doris.png", + "homepage_url": "https://doris.apache.org/", + "categories": [ + "Apache Projects", + "Analytical Databases", + "Open Source" + ], + "pypi_packages": [ + "pydoris" + ], + "connection_string": "doris://{username}:{password}@{host}:{port}/{catalog}.{database}", + "default_port": 9030, + "parameters": { + "username": "User name", + "password": "Password", + "host": "Doris FE Host", + "port": "Doris FE port", + "catalog": "Catalog name", + "database": "Database name" + }, + "category": "Apache Projects", + "custom_errors": [ + { + "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", + "message_template": "Either the username \"%(username)s\" or the password is incorrect.", + "error_type": "CONNECTION_ACCESS_DENIED_ERROR", + "category": "Authentication", + "description": "Access denied", + "issue_codes": [ + 1014, + 1015 + ], + "invalid_fields": [ + "username", + "password" + ] + }, + { + "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", + "message_template": "Unknown Doris server host \"%(hostname)s\".", + "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", + "category": "Connection", + "description": "Invalid hostname", + "issue_codes": [ + 1007 + ], + "invalid_fields": [ + "host" + ] + }, + { + "regex_name": "CONNECTION_HOST_DOWN_REGEX", + "message_template": "The host \"%(hostname)s\" might be down and can't be reached.", + "error_type": "CONNECTION_HOST_DOWN_ERROR", + "category": "Connection", + "description": "Host unreachable", + "issue_codes": [ + 1009 + ], + "invalid_fields": [ + "host", + "port" + ] + }, + { + "regex_name": "CONNECTION_UNKNOWN_DATABASE_REGEX", + "message_template": "Unable to connect to database \"%(database)s\".", + "error_type": "CONNECTION_UNKNOWN_DATABASE_ERROR", + "category": "Connection", + "description": "Unknown database", + "issue_codes": [ + 1015 + ], + "invalid_fields": [ + "database" ] }, { "regex_name": "SYNTAX_ERROR_REGEX", - "message_template": "Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, try running your query again.", + "message_template": "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.", "error_type": "SYNTAX_ERROR", "category": "Query", "description": "SQL syntax error", @@ -726,32 +816,2350 @@ } ] }, - "time_grains": {}, - "score": 0, - "max_score": 0, + "engine": "pydoris", + "engine_name": "Apache Doris", + "engine_aliases": [ + "doris" + ], + "default_driver": "pydoris", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Apache Drill": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.drill", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 50, + "max_score": 201, + "documentation": { + "description": "Apache Drill is a schema-free SQL query engine for Hadoop and NoSQL.", + "logo": "apache-drill.png", + "homepage_url": "https://drill.apache.org/", + "categories": [ + "Apache Projects", + "Query Engines", + "Open Source" + ], + "pypi_packages": [ + "sqlalchemy-drill" + ], + "connection_string": "drill+sadrill://{username}:{password}@{host}:{port}/{storage_plugin}?use_ssl=True", + "default_port": 8047, + "drivers": [ + { + "name": "SQLAlchemy (REST)", + "pypi_package": "sqlalchemy-drill", + "connection_string": "drill+sadrill://{username}:{password}@{host}:{port}/{storage_plugin}?use_ssl=True", + "is_recommended": true + }, + { + "name": "JDBC", + "pypi_package": "sqlalchemy-drill", + "connection_string": "drill+jdbc://{username}:{password}@{host}:{port}", + "is_recommended": false, + "notes": "Requires Drill JDBC Driver installation.", + "docs_url": "https://drill.apache.org/docs/using-the-jdbc-driver/" + }, + { + "name": "ODBC", + "pypi_package": "sqlalchemy-drill", + "is_recommended": false, + "notes": "See Apache Drill documentation for ODBC setup.", + "docs_url": "https://drill.apache.org/docs/installing-the-driver-on-linux/" + } + ], + "connection_examples": [ + { + "description": "Local embedded mode", + "connection_string": "drill+sadrill://localhost:8047/dfs?use_ssl=False" + } + ], + "category": "Apache Projects" + }, + "engine": "drill", + "engine_name": "Apache Drill", + "engine_aliases": [], + "default_driver": "sadrill", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Druid": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.druid", + "limit_method": 1, + "limit_clause": true, + "joins": false, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 47, + "max_score": 201, + "documentation": { + "description": "Apache Druid is a high performance real-time analytics database.", + "logo": "druid.png", + "homepage_url": "https://druid.apache.org/", + "categories": [ + "Apache Projects", + "Time Series Databases", + "Open Source" + ], + "pypi_packages": [ + "pydruid" + ], + "connection_string": "druid://{username}:{password}@{host}:{port}/druid/v2/sql", + "default_port": 9088, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "IP address or URL of the host", + "port": "Default 9088" + }, + "ssl_configuration": { + "custom_certificate": "Add certificate in Root Certificate field. pydruid will automatically use https.", + "disable_ssl_verification": { + "engine_params": { + "connect_args": { + "scheme": "https", + "ssl_verify_cert": false + } + } + } + }, + "advanced_features": { + "aggregations": "Define common aggregations in datasource edit view under List Druid Column tab.", + "post_aggregations": "Create metrics with postagg as Metric Type and provide valid JSON post-aggregation definition." + }, + "notes": "A native Druid connector ships with Superset (behind DRUID_IS_ACTIVE flag) but SQLAlchemy connector via pydruid is preferred.", + "compatible_databases": [ + { + "name": "Imply", + "description": "Imply is a fully-managed cloud platform and enterprise distribution built on Apache Druid. It provides real-time analytics with enterprise security and support.", + "logo": "imply.png", + "homepage_url": "https://imply.io/", + "categories": [ + "Time Series Databases", + "Cloud Data Warehouses", + "Hosted Open Source" + ], + "pypi_packages": [ + "pydruid" + ], + "connection_string": "druid://{username}:{password}@{host}/druid/v2/sql", + "docs_url": "https://docs.imply.io/" + } + ], + "category": "Apache Projects" + }, + "engine": "druid", + "engine_name": "Apache Druid", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, + "supports_dynamic_catalog": false + }, + "Apache Hive": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.hive", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": false, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 767, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": true, + "expand_data": true, + "query_cost_estimation": true, + "sql_validation": false, + "score": 140, + "max_score": 201, + "documentation": { + "description": "Apache Hive is a data warehouse infrastructure built on Hadoop.", + "logo": "apache-hive.svg", + "homepage_url": "https://hive.apache.org/", + "categories": [ + "Apache Projects", + "Query Engines", + "Open Source" + ], + "pypi_packages": [ + "pyhive" + ], + "connection_string": "hive://hive@{hostname}:{port}/{database}", + "default_port": 10000, + "category": "Apache Projects" + }, + "engine": "hive", + "engine_name": "Apache Hive", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Apache Impala": { + "time_grains": { + "SECOND": false, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.impala", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 37, + "max_score": 201, + "documentation": { + "description": "Apache Impala is an open-source massively parallel processing SQL query engine.", + "logo": "apache-impala.png", + "homepage_url": "https://impala.apache.org/", + "categories": [ + "Apache Projects", + "Query Engines", + "Open Source" + ], + "pypi_packages": [ + "impyla" + ], + "connection_string": "impala://{hostname}:{port}/{database}", + "default_port": 21050, + "category": "Apache Projects" + }, + "engine": "impala", + "engine_name": "Apache Impala", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache IoTDB": { + "time_grains": { + "SECOND": false, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": false, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": false, + "SIX_HOURS": false, + "DAY": false, + "WEEK": false, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": false, + "QUARTER": false, + "QUARTER_YEAR": false, + "YEAR": false + }, + "module": "superset.db_engine_specs.iotdb", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 20, + "max_score": 201, + "documentation": { + "description": "Apache IoTDB is a time series database designed for IoT data, with efficient storage and query capabilities for massive time series data.", + "logo": "apache-iotdb.svg", + "homepage_url": "https://iotdb.apache.org/", + "categories": [ + "Apache Projects", + "Time Series Databases", + "Open Source" + ], + "pypi_packages": [ + "apache-iotdb" + ], + "connection_string": "iotdb://{username}:{password}@{hostname}:{port}", + "default_port": 6667, + "parameters": { + "username": "Database username (default: root)", + "password": "Database password (default: root)", + "hostname": "IP address or hostname", + "port": "Default 6667" + }, + "notes": "The IoTDB SQLAlchemy dialect was written to integrate with Apache Superset. IoTDB uses a hierarchical data model, which is reorganized into a relational model for SQL queries.", + "category": "Apache Projects" + }, + "engine": "iotdb", + "engine_name": "Apache IoTDB", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Kylin": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.kylin", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 28, + "max_score": 201, + "documentation": { + "description": "Apache Kylin is an open-source OLAP engine for big data.", + "logo": "apache-kylin.png", + "homepage_url": "https://kylin.apache.org/", + "categories": [ + "Apache Projects", + "Analytical Databases", + "Open Source" + ], + "pypi_packages": [ + "kylinpy" + ], + "connection_string": "kylin://{username}:{password}@{hostname}:{port}/{project}?{param1}={value1}&{param2}={value2}", + "default_port": 7070, + "category": "Apache Projects" + }, + "engine": "kylin", + "engine_name": "Apache Kylin", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Phoenix": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.phoenix", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 28, + "max_score": 201, + "documentation": { + "description": "Apache Phoenix is a relational database layer over Apache HBase, providing low-latency SQL queries over HBase data.", + "logo": "apache-phoenix.png", + "homepage_url": "https://phoenix.apache.org/", + "categories": [ + "Apache Projects", + "Analytical Databases", + "Open Source" + ], + "pypi_packages": [ + "phoenixdb" + ], + "connection_string": "phoenix://{hostname}:{port}/", + "default_port": 8765, + "notes": "Phoenix provides a SQL interface to Apache HBase. The phoenixdb driver connects via the Phoenix Query Server and supports a subset of SQLAlchemy.", + "category": "Apache Projects" + }, + "engine": "phoenix", + "engine_name": "Apache Phoenix", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Pinot": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.pinot", + "limit_method": 1, + "limit_clause": true, + "joins": false, + "subqueries": false, + "alias_in_select": false, + "alias_in_orderby": false, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 32, + "max_score": 201, + "documentation": { + "description": "Apache Pinot is a real-time distributed OLAP datastore.", + "logo": "apache-pinot.svg", + "homepage_url": "https://pinot.apache.org/", + "categories": [ + "Apache Projects", + "Time Series Databases", + "Open Source" + ], + "pypi_packages": [ + "pinotdb" + ], + "connection_string": "pinot+http://{broker_host}:{broker_port}/query?controller=http://{controller_host}:{controller_port}/", + "default_port": 8099, + "connection_examples": [ + { + "description": "With authentication", + "connection_string": "pinot://{username}:{password}@{broker_host}:{broker_port}/query/sql?controller=http://{controller_host}:{controller_port}/verify_ssl=true" + } + ], + "engine_parameters": [ + { + "name": "Multi-stage Query Engine", + "description": "Enable for Explore view, joins, window functions", + "json": { + "connect_args": { + "use_multistage_engine": "true" + } + }, + "docs_url": "https://docs.pinot.apache.org/reference/multi-stage-engine" + } + ], + "category": "Apache Projects" + }, + "engine": "pinot", + "engine_name": "Apache Pinot", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Solr": { + "time_grains": { + "SECOND": false, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": false, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": false, + "SIX_HOURS": false, + "DAY": false, + "WEEK": false, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": false, + "QUARTER": false, + "QUARTER_YEAR": false, + "YEAR": false + }, + "module": "superset.db_engine_specs.solr", + "limit_method": 1, + "limit_clause": true, + "joins": false, + "subqueries": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 20, + "max_score": 201, + "documentation": { + "description": "Apache Solr is an open-source enterprise search platform.", + "logo": "apache-solr.png", + "homepage_url": "https://solr.apache.org/", + "categories": [ + "Apache Projects", + "Search & NoSQL", + "Open Source" + ], + "pypi_packages": [ + "sqlalchemy-solr" + ], + "connection_string": "solr://{username}:{password}@{host}:{port}/{server_path}/{collection}[/?use_ssl=true|false]", + "default_port": 8983, + "category": "Apache Projects" + }, + "engine": "solr", + "engine_name": "Apache Solr", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Apache Spark SQL": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.spark", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": false, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 767, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": true, + "expand_data": true, + "query_cost_estimation": true, + "sql_validation": false, + "score": 140, + "max_score": 201, + "documentation": { + "description": "Apache Spark SQL is a module for structured data processing.", + "logo": "apache-spark.png", + "homepage_url": "https://spark.apache.org/sql/", + "categories": [ + "Apache Projects", + "Query Engines", + "Open Source" + ], + "pypi_packages": [ + "pyhive" + ], + "connection_string": "hive://hive@{hostname}:{port}/{database}", + "default_port": 10000, + "category": "Apache Projects" + }, + "engine": "hive", + "engine_name": "Apache Spark SQL", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Arc": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.arc", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 28, + "max_score": 201, + "documentation": { + "description": "Arc is a data platform with multiple connection options.", + "categories": [ + "Other Databases", + "Proprietary" + ], + "pypi_packages": [ + "arc-superset-arrow" + ], + "connection_string": "arc+arrow://{api_key}@{hostname}:{port}/{database}", + "parameters": { + "api_key": "Arc API key", + "hostname": "Arc hostname", + "port": "Arc port", + "database": "Database name" + }, + "drivers": [ + { + "name": "Apache Arrow (Recommended)", + "pypi_package": "arc-superset-arrow", + "connection_string": "arc+arrow://{api_key}@{hostname}:{port}/{database}", + "is_recommended": true, + "notes": "Recommended for production. Provides 3-5x better performance using Apache Arrow IPC." + }, + { + "name": "JSON", + "pypi_package": "arc-superset-dialect", + "connection_string": "arc+json://{api_key}@{hostname}:{port}/{database}", + "is_recommended": false + } + ], + "notes": "Arc supports multiple databases (schemas) within a single instance. Each Arc database appears as a schema in SQL Lab.", + "category": "Other Databases" + }, + "engine": "arc", + "engine_name": "Arc", + "engine_aliases": [], + "default_driver": "arrow", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Ascend": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.ascend", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 38, + "max_score": 201, + "documentation": { + "description": "Ascend.io is a data automation platform for building data pipelines.", + "logo": "ascend.webp", + "homepage_url": "https://www.ascend.io/", + "categories": [ + "Cloud Data Warehouses", + "Analytical Databases", + "Hosted Open Source" + ], + "pypi_packages": [ + "impyla" + ], + "connection_string": "ascend://{username}:{password}@{hostname}:{port}/{database}?auth_mechanism=PLAIN;use_ssl=true", + "category": "Other Databases" + }, + "engine": "ascend", + "engine_name": "Ascend", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Aurora MySQL": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.aurora", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 59, + "max_score": 201, + "documentation": { + "description": "MySQL is a popular open-source relational database.", + "logo": "mysql.png", + "homepage_url": "https://www.mysql.com/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [ + "mysqlclient" + ], + "connection_string": "mysql://{username}:{password}@{host}/{database}", + "default_port": 3306, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "localhost, 127.0.0.1, IP address, or hostname", + "database": "Database name" + }, + "host_examples": [ + { + "platform": "Localhost", + "host": "localhost or 127.0.0.1" + }, + { + "platform": "Docker on Linux", + "host": "172.18.0.1" + }, + { + "platform": "Docker on macOS", + "host": "docker.for.mac.host.internal" + }, + { + "platform": "On-premise", + "host": "IP address or hostname" + } + ], + "drivers": [ + { + "name": "mysqlclient", + "pypi_package": "mysqlclient", + "connection_string": "mysql://{username}:{password}@{host}/{database}", + "is_recommended": true, + "notes": "Recommended driver. May fail with caching_sha2_password auth." + }, + { + "name": "mysql-connector-python", + "pypi_package": "mysql-connector-python", + "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", + "is_recommended": false, + "notes": "Required for newer MySQL databases using caching_sha2_password authentication." + } + ], + "compatible_databases": [ + { + "name": "MariaDB", + "description": "MariaDB is a community-developed fork of MySQL, fully compatible with MySQL.", + "logo": "mariadb.png", + "homepage_url": "https://mariadb.org/", + "pypi_packages": [ + "mysqlclient" + ], + "connection_string": "mysql://{username}:{password}@{host}:{port}/{database}", + "categories": [ + "Open Source" + ] + }, + { + "name": "Amazon Aurora MySQL", + "description": "Amazon Aurora MySQL is a fully managed, MySQL-compatible relational database with up to 5x the throughput of standard MySQL.", + "logo": "aws-aurora.jpg", + "homepage_url": "https://aws.amazon.com/rds/aurora/", + "pypi_packages": [ + "sqlalchemy-aurora-data-api" + ], + "connection_string": "mysql+auroradataapi://{aws_access_id}:{aws_secret_access_key}@/{database_name}?aurora_cluster_arn={aurora_cluster_arn}&secret_arn={secret_arn}®ion_name={region_name}", + "parameters": { + "aws_access_id": "AWS Access Key ID", + "aws_secret_access_key": "AWS Secret Access Key", + "database_name": "Database name", + "aurora_cluster_arn": "Aurora cluster ARN", + "secret_arn": "Secrets Manager ARN for credentials", + "region_name": "AWS region (e.g., us-east-1)" + }, + "notes": "Uses the Data API for serverless access. Standard MySQL connections also work with mysqlclient.", + "categories": [ + "Cloud - AWS", + "Hosted Open Source" + ] + } + ], + "category": "Traditional RDBMS" + }, + "engine": "mysql", + "engine_name": "Aurora MySQL", + "engine_aliases": [], + "default_driver": "mysqldb", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Aurora MySQL (Data API)": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.aurora", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 59, + "max_score": 201, + "documentation": { + "description": "MySQL is a popular open-source relational database.", + "logo": "mysql.png", + "homepage_url": "https://www.mysql.com/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [ + "mysqlclient" + ], + "connection_string": "mysql://{username}:{password}@{host}/{database}", + "default_port": 3306, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "localhost, 127.0.0.1, IP address, or hostname", + "database": "Database name" + }, + "host_examples": [ + { + "platform": "Localhost", + "host": "localhost or 127.0.0.1" + }, + { + "platform": "Docker on Linux", + "host": "172.18.0.1" + }, + { + "platform": "Docker on macOS", + "host": "docker.for.mac.host.internal" + }, + { + "platform": "On-premise", + "host": "IP address or hostname" + } + ], + "drivers": [ + { + "name": "mysqlclient", + "pypi_package": "mysqlclient", + "connection_string": "mysql://{username}:{password}@{host}/{database}", + "is_recommended": true, + "notes": "Recommended driver. May fail with caching_sha2_password auth." + }, + { + "name": "mysql-connector-python", + "pypi_package": "mysql-connector-python", + "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", + "is_recommended": false, + "notes": "Required for newer MySQL databases using caching_sha2_password authentication." + } + ], + "compatible_databases": [ + { + "name": "MariaDB", + "description": "MariaDB is a community-developed fork of MySQL, fully compatible with MySQL.", + "logo": "mariadb.png", + "homepage_url": "https://mariadb.org/", + "pypi_packages": [ + "mysqlclient" + ], + "connection_string": "mysql://{username}:{password}@{host}:{port}/{database}", + "categories": [ + "Open Source" + ] + }, + { + "name": "Amazon Aurora MySQL", + "description": "Amazon Aurora MySQL is a fully managed, MySQL-compatible relational database with up to 5x the throughput of standard MySQL.", + "logo": "aws-aurora.jpg", + "homepage_url": "https://aws.amazon.com/rds/aurora/", + "pypi_packages": [ + "sqlalchemy-aurora-data-api" + ], + "connection_string": "mysql+auroradataapi://{aws_access_id}:{aws_secret_access_key}@/{database_name}?aurora_cluster_arn={aurora_cluster_arn}&secret_arn={secret_arn}®ion_name={region_name}", + "parameters": { + "aws_access_id": "AWS Access Key ID", + "aws_secret_access_key": "AWS Secret Access Key", + "database_name": "Database name", + "aurora_cluster_arn": "Aurora cluster ARN", + "secret_arn": "Secrets Manager ARN for credentials", + "region_name": "AWS region (e.g., us-east-1)" + }, + "notes": "Uses the Data API for serverless access. Standard MySQL connections also work with mysqlclient.", + "categories": [ + "Cloud - AWS", + "Hosted Open Source" + ] + } + ], + "category": "Traditional RDBMS" + }, + "engine": "mysql", + "engine_name": "Aurora MySQL (Data API)", + "engine_aliases": [], + "default_driver": "auroradataapi", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Aurora PostgreSQL": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.aurora", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 63, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": true, + "score": 104, + "max_score": 201, + "documentation": { + "description": "PostgreSQL is an advanced open-source relational database.", + "logo": "postgresql.svg", + "homepage_url": "https://www.postgresql.org/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "default_port": 5432, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "For localhost: localhost or 127.0.0.1. For AWS: endpoint URL", + "port": "Default 5432", + "database": "Database name" + }, + "notes": "The psycopg2 library comes bundled with Superset Docker images.", + "connection_examples": [ + { + "description": "Basic connection", + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" + }, + { + "description": "With SSL required", + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" + } + ], + "docs_url": "https://www.postgresql.org/docs/", + "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html", + "compatible_databases": [ + { + "name": "Hologres", + "description": "Alibaba Cloud real-time interactive analytics service, fully compatible with PostgreSQL 11.", + "logo": "hologres.png", + "homepage_url": "https://www.alibabacloud.com/product/hologres", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql+psycopg2://{username}:{password}@{host}:{port}/{database}", + "parameters": { + "username": "AccessKey ID of your Alibaba Cloud account", + "password": "AccessKey secret of your Alibaba Cloud account", + "host": "Public endpoint of the Hologres instance", + "port": "Port number of the Hologres instance", + "database": "Name of the Hologres database" + }, + "categories": [ + "Proprietary" + ] + }, + { + "name": "TimescaleDB", + "description": "Open-source relational database for time-series and analytics, built on PostgreSQL.", + "logo": "timescale.png", + "homepage_url": "https://www.timescale.com/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "connection_examples": [ + { + "description": "Timescale Cloud (SSL required)", + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" + } + ], + "notes": "psycopg2 comes bundled with Superset Docker images.", + "docs_url": "https://docs.timescale.com/", + "categories": [ + "Open Source" + ] + }, + { + "name": "YugabyteDB", + "description": "Distributed SQL database built on top of PostgreSQL.", + "logo": "yugabyte.png", + "homepage_url": "https://www.yugabyte.com/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "notes": "psycopg2 comes bundled with Superset Docker images.", + "docs_url": "https://www.yugabyte.com/", + "categories": [ + "Open Source" + ] + }, + { + "name": "Supabase", + "description": "Open-source Firebase alternative built on top of PostgreSQL, providing a full backend-as-a-service with a hosted Postgres database.", + "logo": "supabase.svg", + "homepage_url": "https://supabase.com/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "connection_examples": [ + { + "description": "Supabase project (connection pooler)", + "connection_string": "postgresql://{username}.{project_ref}:{password}@aws-0-{region}.pooler.supabase.com:6543/{database}" + } + ], + "parameters": { + "username": "Database user (default: postgres)", + "password": "Database password", + "host": "Supabase project host (from project settings)", + "port": "Default 5432 (direct) or 6543 (pooler)", + "database": "Database name (default: postgres)", + "project_ref": "Supabase project reference (from project settings)", + "region": "Supabase project region (e.g., us-east-1)" + }, + "notes": "Find connection details in your Supabase project dashboard under Settings > Database. Use the connection pooler (port 6543) for better connection management.", + "docs_url": "https://supabase.com/docs/guides/database/connecting-to-postgres", + "categories": [ + "Hosted Open Source" + ] + }, + { + "name": "Google AlloyDB", + "description": "Google Cloud's PostgreSQL-compatible database service for demanding transactional and analytical workloads.", + "logo": "alloydb.png", + "homepage_url": "https://cloud.google.com/alloydb", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "parameters": { + "username": "Database user (default: postgres)", + "password": "Database password", + "host": "AlloyDB instance IP or Auth Proxy address", + "port": "Default 5432", + "database": "Database name" + }, + "notes": "For public IP connections, use the AlloyDB Auth Proxy for secure access. Private IP connections can connect directly.", + "docs_url": "https://cloud.google.com/alloydb/docs", + "categories": [ + "Cloud - Google", + "Hosted Open Source" + ] + }, + { + "name": "Neon", + "description": "Serverless PostgreSQL with branching, scale-to-zero, and bottomless storage.", + "logo": "neon.png", + "homepage_url": "https://neon.tech/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}/{database}?sslmode=require", + "parameters": { + "username": "Neon role name", + "password": "Neon role password", + "host": "Neon hostname (e.g., ep-cool-name-123456.us-east-2.aws.neon.tech)", + "database": "Database name (default: neondb)" + }, + "notes": "SSL is required for all connections. Find connection details in the Neon console under Connection Details.", + "docs_url": "https://neon.tech/docs/connect/connect-from-any-app", + "categories": [ + "Hosted Open Source" + ] + }, + { + "name": "Amazon Aurora PostgreSQL", + "description": "Amazon Aurora PostgreSQL is a fully managed, PostgreSQL-compatible relational database with up to 5x the throughput of standard PostgreSQL.", + "logo": "aws-aurora.jpg", + "homepage_url": "https://aws.amazon.com/rds/aurora/", + "pypi_packages": [ + "sqlalchemy-aurora-data-api" + ], + "connection_string": "postgresql+auroradataapi://{aws_access_id}:{aws_secret_access_key}@/{database_name}?aurora_cluster_arn={aurora_cluster_arn}&secret_arn={secret_arn}®ion_name={region_name}", + "parameters": { + "aws_access_id": "AWS Access Key ID", + "aws_secret_access_key": "AWS Secret Access Key", + "database_name": "Database name", + "aurora_cluster_arn": "Aurora cluster ARN", + "secret_arn": "Secrets Manager ARN for credentials", + "region_name": "AWS region (e.g., us-east-1)" + }, + "notes": "Uses the Data API for serverless access. Standard PostgreSQL connections also work with psycopg2.", + "categories": [ + "Cloud - AWS", + "Hosted Open Source" + ] + } + ], + "category": "Traditional RDBMS" + }, + "engine": "postgresql", + "engine_name": "Aurora PostgreSQL", + "engine_aliases": [ + "postgres" + ], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Aurora PostgreSQL (Data API)": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.aurora", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 63, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": true, + "score": 104, + "max_score": 201, + "documentation": { + "description": "PostgreSQL is an advanced open-source relational database.", + "logo": "postgresql.svg", + "homepage_url": "https://www.postgresql.org/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "default_port": 5432, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "For localhost: localhost or 127.0.0.1. For AWS: endpoint URL", + "port": "Default 5432", + "database": "Database name" + }, + "notes": "The psycopg2 library comes bundled with Superset Docker images.", + "connection_examples": [ + { + "description": "Basic connection", + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" + }, + { + "description": "With SSL required", + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" + } + ], + "docs_url": "https://www.postgresql.org/docs/", + "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html", + "compatible_databases": [ + { + "name": "Hologres", + "description": "Alibaba Cloud real-time interactive analytics service, fully compatible with PostgreSQL 11.", + "logo": "hologres.png", + "homepage_url": "https://www.alibabacloud.com/product/hologres", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql+psycopg2://{username}:{password}@{host}:{port}/{database}", + "parameters": { + "username": "AccessKey ID of your Alibaba Cloud account", + "password": "AccessKey secret of your Alibaba Cloud account", + "host": "Public endpoint of the Hologres instance", + "port": "Port number of the Hologres instance", + "database": "Name of the Hologres database" + }, + "categories": [ + "Proprietary" + ] + }, + { + "name": "TimescaleDB", + "description": "Open-source relational database for time-series and analytics, built on PostgreSQL.", + "logo": "timescale.png", + "homepage_url": "https://www.timescale.com/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "connection_examples": [ + { + "description": "Timescale Cloud (SSL required)", + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" + } + ], + "notes": "psycopg2 comes bundled with Superset Docker images.", + "docs_url": "https://docs.timescale.com/", + "categories": [ + "Open Source" + ] + }, + { + "name": "YugabyteDB", + "description": "Distributed SQL database built on top of PostgreSQL.", + "logo": "yugabyte.png", + "homepage_url": "https://www.yugabyte.com/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "notes": "psycopg2 comes bundled with Superset Docker images.", + "docs_url": "https://www.yugabyte.com/", + "categories": [ + "Open Source" + ] + }, + { + "name": "Supabase", + "description": "Open-source Firebase alternative built on top of PostgreSQL, providing a full backend-as-a-service with a hosted Postgres database.", + "logo": "supabase.svg", + "homepage_url": "https://supabase.com/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "connection_examples": [ + { + "description": "Supabase project (connection pooler)", + "connection_string": "postgresql://{username}.{project_ref}:{password}@aws-0-{region}.pooler.supabase.com:6543/{database}" + } + ], + "parameters": { + "username": "Database user (default: postgres)", + "password": "Database password", + "host": "Supabase project host (from project settings)", + "port": "Default 5432 (direct) or 6543 (pooler)", + "database": "Database name (default: postgres)", + "project_ref": "Supabase project reference (from project settings)", + "region": "Supabase project region (e.g., us-east-1)" + }, + "notes": "Find connection details in your Supabase project dashboard under Settings > Database. Use the connection pooler (port 6543) for better connection management.", + "docs_url": "https://supabase.com/docs/guides/database/connecting-to-postgres", + "categories": [ + "Hosted Open Source" + ] + }, + { + "name": "Google AlloyDB", + "description": "Google Cloud's PostgreSQL-compatible database service for demanding transactional and analytical workloads.", + "logo": "alloydb.png", + "homepage_url": "https://cloud.google.com/alloydb", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", + "parameters": { + "username": "Database user (default: postgres)", + "password": "Database password", + "host": "AlloyDB instance IP or Auth Proxy address", + "port": "Default 5432", + "database": "Database name" + }, + "notes": "For public IP connections, use the AlloyDB Auth Proxy for secure access. Private IP connections can connect directly.", + "docs_url": "https://cloud.google.com/alloydb/docs", + "categories": [ + "Cloud - Google", + "Hosted Open Source" + ] + }, + { + "name": "Neon", + "description": "Serverless PostgreSQL with branching, scale-to-zero, and bottomless storage.", + "logo": "neon.png", + "homepage_url": "https://neon.tech/", + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql://{username}:{password}@{host}/{database}?sslmode=require", + "parameters": { + "username": "Neon role name", + "password": "Neon role password", + "host": "Neon hostname (e.g., ep-cool-name-123456.us-east-2.aws.neon.tech)", + "database": "Database name (default: neondb)" + }, + "notes": "SSL is required for all connections. Find connection details in the Neon console under Connection Details.", + "docs_url": "https://neon.tech/docs/connect/connect-from-any-app", + "categories": [ + "Hosted Open Source" + ] + }, + { + "name": "Amazon Aurora PostgreSQL", + "description": "Amazon Aurora PostgreSQL is a fully managed, PostgreSQL-compatible relational database with up to 5x the throughput of standard PostgreSQL.", + "logo": "aws-aurora.jpg", + "homepage_url": "https://aws.amazon.com/rds/aurora/", + "pypi_packages": [ + "sqlalchemy-aurora-data-api" + ], + "connection_string": "postgresql+auroradataapi://{aws_access_id}:{aws_secret_access_key}@/{database_name}?aurora_cluster_arn={aurora_cluster_arn}&secret_arn={secret_arn}®ion_name={region_name}", + "parameters": { + "aws_access_id": "AWS Access Key ID", + "aws_secret_access_key": "AWS Secret Access Key", + "database_name": "Database name", + "aurora_cluster_arn": "Aurora cluster ARN", + "secret_arn": "Secrets Manager ARN for credentials", + "region_name": "AWS region (e.g., us-east-1)" + }, + "notes": "Uses the Data API for serverless access. Standard PostgreSQL connections also work with psycopg2.", + "categories": [ + "Cloud - AWS", + "Hosted Open Source" + ] + } + ], + "category": "Traditional RDBMS" + }, + "engine": "postgresql", + "engine_name": "Aurora PostgreSQL (Data API)", + "engine_aliases": [ + "postgres" + ], + "default_driver": "auroradataapi", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Azure Data Explorer": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": false, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.kusto", + "limit_method": 2, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": false, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 54, + "max_score": 201, + "documentation": { + "description": "Azure Data Explorer (Kusto) is a fast, fully managed data analytics service from Microsoft Azure. Query data using SQL or native KQL syntax.", + "logo": "kusto.png", + "homepage_url": "https://azure.microsoft.com/en-us/products/data-explorer/", + "categories": [ + "Cloud - Azure", + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "sqlalchemy-kusto" + ], + "connection_string": "kustosql+https://{cluster}.kusto.windows.net/{database}?msi=False&azure_ad_client_id={client_id}&azure_ad_client_secret={client_secret}&azure_ad_tenant_id={tenant_id}", + "parameters": { + "cluster": "Azure Data Explorer cluster name", + "database": "Database name", + "client_id": "Azure AD application (client) ID", + "client_secret": "Azure AD application secret", + "tenant_id": "Azure AD tenant ID" + }, + "drivers": [ + { + "name": "SQL Interface (Recommended)", + "pypi_package": "sqlalchemy-kusto", + "connection_string": "kustosql+https://{cluster}.kusto.windows.net/{database}?msi=False&azure_ad_client_id={client_id}&azure_ad_client_secret={client_secret}&azure_ad_tenant_id={tenant_id}", + "is_recommended": true, + "notes": "Use familiar SQL syntax to query Azure Data Explorer." + }, + { + "name": "KQL (Kusto Query Language)", + "pypi_package": "sqlalchemy-kusto", + "connection_string": "kustokql+https://{cluster}.kusto.windows.net/{database}?msi=False&azure_ad_client_id={client_id}&azure_ad_client_secret={client_secret}&azure_ad_tenant_id={tenant_id}", + "is_recommended": false, + "notes": "Use native Kusto Query Language for advanced analytics." + } + ], + "category": "Cloud - Azure" + }, + "engine": "kustosql", + "engine_name": "Azure Data Explorer", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Azure Data Explorer (KQL)": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": false, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.kusto", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": false, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 40, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "engine+driver://user:password@host:port/dbname[?key=value&key=value...]", + "category": "Cloud - Azure" + }, + "engine": "kustokql", + "engine_name": "Azure Data Explorer (KQL)", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Azure Synapse": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.mssql", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": false, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 44, + "max_score": 201, + "documentation": { + "description": "Azure Synapse Analytics is a cloud-based enterprise data warehouse from Microsoft that combines big data and data warehousing.", + "logo": "azure.svg", + "homepage_url": "https://azure.microsoft.com/en-us/products/synapse-analytics/", + "categories": [ + "Cloud Data Warehouses", + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "pymssql" + ], + "connection_string": "mssql+pymssql://{username}@{server}:{password}@{server}.database.windows.net:1433/{database}", + "category": "Cloud - Azure", + "custom_errors": [ + { + "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", + "message_template": "Either the username \"%(username)s\", password, or database name \"%(database)s\" is incorrect.", + "error_type": "CONNECTION_ACCESS_DENIED_ERROR", + "category": "Authentication", + "description": "Access denied", + "issue_codes": [ + 1014, + 1015 + ] + }, + { + "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", + "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", + "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", + "category": "Connection", + "description": "Invalid hostname", + "issue_codes": [ + 1007 + ] + }, + { + "regex_name": "CONNECTION_PORT_CLOSED_REGEX", + "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", + "error_type": "CONNECTION_PORT_CLOSED_ERROR", + "category": "Connection", + "description": "Port closed or refused", + "issue_codes": [ + 1008 + ] + }, + { + "regex_name": "CONNECTION_HOST_DOWN_REGEX", + "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", + "error_type": "CONNECTION_HOST_DOWN_ERROR", + "category": "Connection", + "description": "Host unreachable", + "issue_codes": [ + 1009 + ] + } + ] + }, + "engine": "mssql", + "engine_name": "Azure Synapse", + "engine_aliases": [], + "default_driver": "pyodbc", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "ClickHouse": { - "engine": "clickhouse", - "engine_name": "ClickHouse", - "module": "clickhouse", + "time_grains": { + "SECOND": false, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.clickhouse", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": false, + "file_upload": false, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 61, + "max_score": 201, "documentation": { "description": "ClickHouse is an open-source column-oriented database for real-time analytics using SQL. It's known for extremely fast query performance on large datasets.", "logo": "clickhouse.png", "homepage_url": "https://clickhouse.com/", "categories": [ - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" + "Analytical Databases", + "Open Source" ], "pypi_packages": [ "clickhouse-connect>=0.13.0" @@ -792,9 +3200,9 @@ "logo": "clickhouse.png", "homepage_url": "https://clickhouse.cloud/", "categories": [ - "ANALYTICAL_DATABASES", - "CLOUD_DATA_WAREHOUSES", - "HOSTED_OPEN_SOURCE" + "Analytical Databases", + "Cloud Data Warehouses", + "Hosted Open Source" ], "pypi_packages": [ "clickhouse-connect>=0.13.0" @@ -814,9 +3222,9 @@ "logo": "altinity.png", "homepage_url": "https://altinity.cloud/", "categories": [ - "ANALYTICAL_DATABASES", - "CLOUD_DATA_WAREHOUSES", - "HOSTED_OPEN_SOURCE" + "Analytical Databases", + "Cloud Data Warehouses", + "Hosted Open Source" ], "pypi_packages": [ "clickhouse-connect>=0.13.0" @@ -824,8 +3232,19 @@ "connection_string": "clickhousedb://{username}:{password}@{host}/{database}?secure=true", "docs_url": "https://docs.altinity.com/" } - ] + ], + "category": "Analytical Databases" }, + "engine": "clickhousedb", + "engine_name": "ClickHouse", + "engine_aliases": [], + "default_driver": "connect", + "supports_file_upload": false, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "ClickHouse (sqlalchemy)": { "time_grains": { "SECOND": false, "FIVE_SECONDS": false, @@ -849,59 +3268,145 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 51, - "max_score": 201, + "module": "superset.db_engine_specs.clickhouse", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": false, + "file_upload": false, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 51, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "engine+driver://user:password@host:port/dbname[?key=value&key=value...]", + "category": "Analytical Databases" + }, + "engine": "clickhouse", + "engine_name": "ClickHouse (sqlalchemy)", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": false, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Cloudflare D1": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": true, + "YEAR": true + }, + "module": "superset.db_engine_specs.d1", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": true, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": false, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 41, + "max_score": 201, + "documentation": { + "description": "Cloudflare D1 is a serverless SQLite database.", + "logo": "cloudflare.png", + "homepage_url": "https://developers.cloudflare.com/d1/", + "categories": [ + "Cloud Data Warehouses", + "Traditional RDBMS", + "Hosted Open Source" + ], + "pypi_packages": [ + "superset-engine-d1" + ], + "connection_string": "d1://{cloudflare_account_id}:{cloudflare_api_token}@{cloudflare_d1_database_id}", + "parameters": { + "cloudflare_account_id": "Cloudflare account ID", + "cloudflare_api_token": "Cloudflare API token", + "cloudflare_d1_database_id": "D1 database ID" + }, + "install_instructions": "pip install superset-engine-d1", + "category": "Other Databases" + }, + "engine": "d1", + "engine_name": "Cloudflare D1", + "engine_aliases": [], + "default_driver": "d1", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "CockroachDB": { - "engine": "cockroachdb", - "engine_name": "CockroachDB", - "module": "cockroachdb", - "documentation": { - "description": "CockroachDB is a distributed SQL database built for cloud applications.", - "logo": "cockroachdb.png", - "homepage_url": "https://www.cockroachlabs.com/", - "pypi_packages": [ - "psycopg2", - "cockroachdb" - ], - "connection_string": "cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable", - "default_port": 26257, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "For localhost: localhost or 127.0.0.1. For AWS: endpoint URL", - "port": "Default 5432", - "database": "Database name" - }, - "notes": "The psycopg2 library comes bundled with Superset Docker images.", - "connection_examples": [ - { - "description": "Basic connection", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" - }, - { - "description": "With SSL required", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" - } - ], - "docs_url": "https://github.com/cockroachdb/sqlalchemy-cockroachdb", - "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ] - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": true, @@ -925,53 +3430,69 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 94, - "max_score": 201, + "module": "superset.db_engine_specs.cockroachdb", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": true, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 63, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, "ssh_tunneling": true, "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": true, - "sql_validation": false - }, - "Couchbase": { - "engine": "couchbase", - "engine_name": "Couchbase", - "module": "couchbase", + "sql_validation": false, + "score": 94, + "max_score": 201, "documentation": { - "description": "Couchbase is a distributed NoSQL document database with SQL++ support.", - "logo": "couchbase.svg", - "homepage_url": "https://www.couchbase.com/", + "description": "CockroachDB is a distributed SQL database built for cloud applications.", + "logo": "cockroachdb.png", + "homepage_url": "https://www.cockroachlabs.com/", "categories": [ - "SEARCH_NOSQL", - "OPEN_SOURCE" + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ - "couchbase-sqlalchemy" + "cockroachdb" ], - "connection_string": "couchbase://{username}:{password}@{host}:{port}?ssl=true", - "default_port": 8091, - "parameters": { - "username": "Couchbase username", - "password": "Couchbase password", - "host": "Couchbase host or connection string for cloud", - "port": "Couchbase port (default 8091)", - "database": "Couchbase database/bucket name" - }, - "drivers": [ - { - "name": "couchbase-sqlalchemy", - "pypi_package": "couchbase-sqlalchemy", - "connection_string": "couchbase://{username}:{password}@{host}:{port}?ssl=true", - "is_recommended": true - } - ] + "connection_string": "cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable", + "default_port": 26257, + "docs_url": "https://github.com/cockroachdb/sqlalchemy-cockroachdb", + "category": "Other Databases" }, + "engine": "cockroachdb", + "engine_name": "CockroachDB", + "engine_aliases": [ + "postgres" + ], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Couchbase": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -995,51 +3516,83 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 27, - "max_score": 201, + "module": "superset.db_engine_specs.couchbase", + "limit_method": 1, + "limit_clause": true, "joins": false, "subqueries": false, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "CrateDB": { - "engine": "cratedb", - "engine_name": "CrateDB", - "module": "crate", + "sql_validation": false, + "score": 27, + "max_score": 201, "documentation": { - "description": "CrateDB is a distributed SQL database for machine data and IoT workloads.", - "logo": "cratedb.svg", - "homepage_url": "https://cratedb.com", + "description": "Couchbase is a distributed NoSQL document database with SQL++ support.", + "logo": "couchbase.svg", + "homepage_url": "https://www.couchbase.com/", "categories": [ - "TIME_SERIES", - "OPEN_SOURCE" + "Search & NoSQL", + "Open Source" ], "pypi_packages": [ - "crate", - "sqlalchemy-cratedb" + "couchbase-sqlalchemy" ], - "connection_string": "crate://{host}:{port}", - "default_port": 4200, + "connection_string": "couchbase://{username}:{password}@{host}:{port}?ssl=true", + "default_port": 8091, "parameters": { - "host": "CrateDB host", - "port": "CrateDB HTTP port (default 4200)" + "username": "Couchbase username", + "password": "Couchbase password", + "host": "Couchbase host or connection string for cloud", + "port": "Couchbase port (default 8091)", + "database": "Couchbase database/bucket name" }, "drivers": [ { - "name": "crate", - "pypi_package": "crate[sqlalchemy]", - "connection_string": "crate://{host}:{port}", + "name": "couchbase-sqlalchemy", + "pypi_package": "couchbase-sqlalchemy", + "connection_string": "couchbase://{username}:{password}@{host}:{port}?ssl=true", "is_recommended": true } - ] + ], + "category": "Search & NoSQL" }, + "engine": "couchbase", + "engine_name": "Couchbase", + "engine_aliases": [ + "couchbasedb" + ], + "default_driver": "couchbase", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "CrateDB": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -1063,86 +3616,79 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 28, - "max_score": 201, + "module": "superset.db_engine_specs.crate", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Cloudflare D1": { - "engine": "cloudflare_d1", - "engine_name": "Cloudflare D1", - "module": "d1", + "sql_validation": false, + "score": 28, + "max_score": 201, "documentation": { - "description": "Cloudflare D1 is a serverless SQLite database.", - "logo": "cloudflare.png", - "homepage_url": "https://developers.cloudflare.com/d1/", - "pypi_packages": [ - "superset-engine-d1" - ], - "connection_string": "d1://{cloudflare_account_id}:{cloudflare_api_token}@{cloudflare_d1_database_id}", - "notes": "No additional library needed. SQLite is bundled with Python.", + "description": "CrateDB is a distributed SQL database for machine data and IoT workloads.", + "logo": "cratedb.svg", + "homepage_url": "https://cratedb.com", "categories": [ - "CLOUD_DATA_WAREHOUSES", - "TRADITIONAL_RDBMS", - "HOSTED_OPEN_SOURCE" + "Time Series Databases", + "Open Source" ], + "pypi_packages": [ + "crate", + "sqlalchemy-cratedb" + ], + "connection_string": "crate://{host}:{port}", + "default_port": 4200, "parameters": { - "cloudflare_account_id": "Cloudflare account ID", - "cloudflare_api_token": "Cloudflare API token", - "cloudflare_d1_database_id": "D1 database ID" + "host": "CrateDB host", + "port": "CrateDB HTTP port (default 4200)" }, - "install_instructions": "pip install superset-engine-d1" + "drivers": [ + { + "name": "crate", + "pypi_package": "crate[sqlalchemy]", + "connection_string": "crate://{host}:{port}", + "is_recommended": true + } + ], + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "crate", + "engine_name": "CrateDB", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "Databend": { - "engine": "databend", - "engine_name": "Databend", - "module": "databend", - "documentation": { - "description": "Databend is a modern cloud-native data warehouse with instant elasticity and pay-as-you-go pricing. Built in Rust for high performance.", - "logo": "databend.png", - "homepage_url": "https://www.databend.com/", - "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "databend-sqlalchemy" - ], - "connection_string": "databend://{username}:{password}@{host}:{port}/{database}?secure=true", - "default_port": 443, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "Databend host", - "port": "Databend port (default 443 for HTTPS)", - "database": "Database name" - } - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -1166,81 +3712,213 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 51, - "max_score": 201, + "module": "superset.db_engine_specs.databend", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": false, + "file_upload": false, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Databricks Interactive Cluster": { - "engine": "databricks_interactive_cluster", - "engine_name": "Databricks Interactive Cluster", - "module": "databricks", + "sql_validation": false, + "score": 51, + "max_score": 201, "documentation": { - "description": "Apache Hive is a data warehouse infrastructure built on Hadoop.", - "logo": "apache-hive.svg", - "homepage_url": "https://hive.apache.org/", - "pypi_packages": [ - "pyhive", - "pyhive" - ], - "install_instructions": "pip install \"apache-superset[presto]\"", - "connection_string": "hive://hive@{hostname}:{port}/{database}", - "default_port": 10000, - "parameters": { - "hostname": "Presto coordinator hostname", - "port": "Presto coordinator port (default 8080)", - "database": "Catalog name" - }, - "drivers": [ - { - "name": "PyHive", - "pypi_package": "pyhive", - "connection_string": "presto://{hostname}:{port}/{database}", - "is_recommended": true - } - ], + "description": "Databend is a modern cloud-native data warehouse with instant elasticity and pay-as-you-go pricing. Built in Rust for high performance.", + "logo": "databend.png", + "homepage_url": "https://www.databend.com/", "categories": [ - "APACHE_PROJECTS", - "QUERY_ENGINES", - "OPEN_SOURCE" - ] + "Cloud Data Warehouses", + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "databend-sqlalchemy" + ], + "connection_string": "databend://{username}:{password}@{host}:{port}/{database}?secure=true", + "default_port": 443, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "Databend host", + "port": "Databend port (default 443 for HTTPS)", + "database": "Database name" + }, + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "databend", + "engine_name": "Databend", + "engine_aliases": [], + "default_driver": "databend", + "supports_file_upload": false, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, + "supports_dynamic_catalog": false + }, + "Databend (legacy)": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.databend", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, "user_impersonation": false, + "file_upload": false, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 51, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "engine+driver://user:password@host:port/dbname[?key=value&key=value...]", + "category": "Other Databases" + }, + "engine": "databend", + "engine_name": "Databend (legacy)", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": false, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "Databricks": { - "engine": "databricks", - "engine_name": "Databricks", - "module": "databricks", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.databricks", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": true, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 70, + "max_score": 201, "documentation": { "description": "Databricks is a unified analytics platform built on Apache Spark, providing data engineering, data science, and machine learning capabilities in the cloud. Use the Python Connector for SQL warehouses and clusters.", "logo": "databricks.png", "homepage_url": "https://www.databricks.com/", "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "HOSTED_OPEN_SOURCE" + "Cloud Data Warehouses", + "Analytical Databases", + "Hosted Open Source" ], "pypi_packages": [ "apache-superset[databricks]" @@ -1282,185 +3960,19 @@ "is_recommended": false, "notes": "Legacy connector. Use Python Connector for new deployments." } - ] + ], + "category": "Cloud Data Warehouses" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "engine": "databricks", + "engine_name": "Databricks", + "engine_aliases": [], + "default_driver": "databricks-sql-python", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true }, - "Google Datastore": { - "engine": "google_datastore", - "engine_name": "Google Datastore", - "module": "datastore", - "documentation": { - "description": "Google Cloud Datastore is a highly scalable NoSQL database for your applications.", - "logo": "datastore.png", - "homepage_url": "https://cloud.google.com/datastore/", - "categories": [ - "CLOUD_GCP", - "SEARCH_NOSQL", - "PROPRIETARY" - ], - "pypi_packages": [ - "python-datastore-sqlalchemy" - ], - "connection_string": "datastore://{project_id}/?database={database_id}", - "authentication_methods": [ - { - "name": "Service Account JSON", - "description": "Upload service account credentials JSON or paste in Secure Extra", - "secure_extra": { - "credentials_info": { - "type": "service_account", - "project_id": "...", - "private_key_id": "...", - "private_key": "...", - "client_email": "...", - "client_id": "...", - "auth_uri": "...", - "token_uri": "..." - } - } - } - ], - "notes": "Create a Service Account via GCP console with access to datastore datasets.", - "docs_url": "https://github.com/splasky/Python-datastore-sqlalchemy", - "custom_errors": [ - { - "regex_name": "CONNECTION_DATABASE_PERMISSIONS_REGEX", - "message_template": "Unable to connect. Verify that the following roles are set on the service account: \"Cloud Datastore Viewer\", \"Cloud Datastore User\", \"Cloud Datastore Creator\"", - "error_type": "CONNECTION_DATABASE_PERMISSIONS_ERROR", - "category": "Permissions", - "description": "Insufficient permissions", - "issue_codes": [ - 1017 - ] - }, - { - "regex_name": "TABLE_DOES_NOT_EXIST_REGEX", - "message_template": "The table \"%(table)s\" does not exist. A valid table must be used to run this query.", - "error_type": "TABLE_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Table not found", - "issue_codes": [ - 1003, - 1005 - ] - }, - { - "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", - "message_template": "We can't seem to resolve column \"%(column)s\" at line %(location)s.", - "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Column not found", - "issue_codes": [ - 1003, - 1004 - ] - }, - { - "regex_name": "SCHEMA_DOES_NOT_EXIST_REGEX", - "message_template": "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.", - "error_type": "SCHEMA_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Schema not found", - "issue_codes": [ - 1003, - 1016 - ] - }, - { - "regex_name": "SYNTAX_ERROR_REGEX", - "message_template": "Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, try running your query again.", - "error_type": "SYNTAX_ERROR", - "category": "Query", - "description": "SQL syntax error", - "issue_codes": [ - 1030 - ] - } - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "IBM Db2": { - "engine": "ibm_db2", - "engine_name": "IBM Db2", - "module": "db2", - "documentation": { - "description": "IBM Db2 is a family of data management products for enterprise workloads, available on-premises, in containers, and across cloud platforms.", - "logo": "ibm-db2.svg", - "homepage_url": "https://www.ibm.com/db2", - "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" - ], - "pypi_packages": [ - "ibm_db_sa" - ], - "connection_string": "db2+ibm_db://{username}:{password}@{hostname}:{port}/{database}", - "default_port": 50000, - "drivers": [ - { - "name": "ibm_db_sa (with LIMIT)", - "connection_string": "db2+ibm_db://{username}:{password}@{hostname}:{port}/{database}", - "is_recommended": true - }, - { - "name": "ibm_db_sa (without LIMIT syntax)", - "connection_string": "ibm_db_sa://{username}:{password}@{hostname}:{port}/{database}", - "is_recommended": false, - "notes": "Use for older DB2 versions without LIMIT [n] syntax. Recommended for SQL Lab." - } - ], - "compatible_databases": [ - { - "name": "IBM Db2 for i (AS/400)", - "description": "Db2 for i is a fully integrated database engine on IBM i (AS/400) systems. Uses a different SQLAlchemy driver optimized for IBM i.", - "logo": "ibm-db2.svg", - "homepage_url": "https://www.ibm.com/products/db2-for-i", - "pypi_packages": [ - "sqlalchemy-ibmi" - ], - "connection_string": "ibmi://{username}:{password}@{host}/{database}", - "parameters": { - "username": "IBM i username", - "password": "IBM i password", - "host": "IBM i system host", - "database": "Library/schema name" - }, - "docs_url": "https://github.com/IBM/sqlalchemy-ibmi", - "categories": [ - "PROPRIETARY" - ] - } - ], - "docs_url": "https://github.com/ibmdb/python-ibmdbsa" - }, + "Databricks (legacy)": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -1475,6 +3987,236 @@ "SIX_HOURS": false, "DAY": true, "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.databricks", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": true, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 70, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "databricks+connector://token:{access_token}@{host}:{port}/{database_name}", + "category": "Cloud Data Warehouses" + }, + "engine": "databricks", + "engine_name": "Databricks (legacy)", + "engine_aliases": [], + "default_driver": "connector", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Databricks Interactive Cluster": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.databricks", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": false, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 767, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": true, + "expand_data": true, + "query_cost_estimation": true, + "sql_validation": false, + "score": 140, + "max_score": 201, + "documentation": { + "description": "Apache Hive is a data warehouse infrastructure built on Hadoop.", + "logo": "apache-hive.svg", + "homepage_url": "https://hive.apache.org/", + "categories": [ + "Apache Projects", + "Query Engines", + "Open Source" + ], + "pypi_packages": [ + "pyhive" + ], + "connection_string": "hive://hive@{hostname}:{port}/{database}", + "default_port": 10000, + "category": "Cloud Data Warehouses" + }, + "engine": "databricks", + "engine_name": "Databricks Interactive Cluster", + "engine_aliases": [], + "default_driver": "pyhive", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Databricks SQL Endpoint": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.databricks", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 30, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "engine+driver://user:password@host:port/dbname[?key=value&key=value...]", + "category": "Cloud Data Warehouses" + }, + "engine": "databricks", + "engine_name": "Databricks SQL Endpoint", + "engine_aliases": [], + "default_driver": "pyodbc", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Denodo": { + "time_grains": { + "SECOND": false, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, "WEEK_STARTING_SUNDAY": false, "WEEK_STARTING_MONDAY": false, "WEEK_ENDING_SATURDAY": false, @@ -1484,31 +4226,48 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 38, - "max_score": 201, + "module": "superset.db_engine_specs.denodo", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Denodo": { - "engine": "denodo", - "engine_name": "Denodo", - "module": "denodo", + "sql_validation": false, + "score": 27, + "max_score": 201, "documentation": { "description": "Denodo is a data virtualization platform for logical data management.", "logo": "denodo.png", "homepage_url": "https://www.denodo.com/", "categories": [ - "QUERY_ENGINES", - "PROPRIETARY" + "Query Engines", + "Proprietary" ], "pypi_packages": [ "psycopg2" @@ -1531,6 +4290,7 @@ "notes": "Uses PostgreSQL wire protocol." } ], + "category": "Other Databases", "custom_errors": [ { "message_template": "Incorrect username or password.", @@ -1646,8 +4406,18 @@ } ] }, + "engine": "denodo", + "engine_name": "Denodo", + "engine_aliases": [], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Dremio": { "time_grains": { - "SECOND": false, + "SECOND": true, "FIVE_SECONDS": false, "THIRTY_SECONDS": false, "MINUTE": true, @@ -1669,197 +4439,48 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 27, - "max_score": 201, + "module": "superset.db_engine_specs.dremio", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Doris": { - "engine": "apache_doris", - "engine_name": "Apache Doris", - "module": "doris", - "documentation": { - "description": "Apache Doris is a high-performance real-time analytical database.", - "logo": "doris.png", - "homepage_url": "https://doris.apache.org/", - "pypi_packages": [ - "mysqlclient", - "pydoris" - ], - "connection_string": "doris://{username}:{password}@{host}:{port}/{catalog}.{database}", - "default_port": 9030, - "parameters": { - "username": "User name", - "password": "Password", - "host": "Doris FE Host", - "database": "Database name", - "port": "Doris FE port", - "catalog": "Catalog name" - }, - "host_examples": [ - { - "platform": "Localhost", - "host": "localhost or 127.0.0.1" - }, - { - "platform": "Docker on Linux", - "host": "172.18.0.1" - }, - { - "platform": "Docker on macOS", - "host": "docker.for.mac.host.internal" - }, - { - "platform": "On-premise", - "host": "IP address or hostname" - } - ], - "drivers": [ - { - "name": "mysqlclient", - "pypi_package": "mysqlclient", - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "is_recommended": true, - "notes": "Recommended driver. May fail with caching_sha2_password auth." - }, - { - "name": "mysql-connector-python", - "pypi_package": "mysql-connector-python", - "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", - "is_recommended": false, - "notes": "Required for newer MySQL databases using caching_sha2_password authentication." - } - ], - "categories": [ - "APACHE_PROJECTS", - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" - ], - "custom_errors": [ - { - "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", - "message_template": "Either the username \"%(username)s\" or the password is incorrect.", - "error_type": "CONNECTION_ACCESS_DENIED_ERROR", - "category": "Authentication", - "description": "Access denied", - "issue_codes": [ - 1014, - 1015 - ], - "invalid_fields": [ - "username", - "password" - ] - }, - { - "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", - "message_template": "Unknown Doris server host \"%(hostname)s\".", - "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", - "category": "Connection", - "description": "Invalid hostname", - "issue_codes": [ - 1007 - ], - "invalid_fields": [ - "host" - ] - }, - { - "regex_name": "CONNECTION_HOST_DOWN_REGEX", - "message_template": "The host \"%(hostname)s\" might be down and can't be reached.", - "error_type": "CONNECTION_HOST_DOWN_ERROR", - "category": "Connection", - "description": "Host unreachable", - "issue_codes": [ - 1009 - ], - "invalid_fields": [ - "host", - "port" - ] - }, - { - "regex_name": "CONNECTION_UNKNOWN_DATABASE_REGEX", - "message_template": "Unable to connect to database \"%(database)s\".", - "error_type": "CONNECTION_UNKNOWN_DATABASE_ERROR", - "category": "Connection", - "description": "Unknown database", - "issue_codes": [ - 1015 - ], - "invalid_fields": [ - "database" - ] - }, - { - "regex_name": "SYNTAX_ERROR_REGEX", - "message_template": "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.", - "error_type": "SYNTAX_ERROR", - "category": "Query", - "description": "SQL syntax error", - "issue_codes": [ - 1030 - ] - } - ] - }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": true, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 79, + "sql_validation": false, + "score": 28, "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": true, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Dremio": { - "engine": "dremio", - "engine_name": "Dremio", - "module": "dremio", "documentation": { "description": "Dremio is a data lakehouse platform for fast, self-service analytics.", "logo": "dremio.png", "homepage_url": "https://www.dremio.com/", "categories": [ - "QUERY_ENGINES", - "PROPRIETARY" + "Query Engines", + "Proprietary" ], "pypi_packages": [ "sqlalchemy_dremio" @@ -1882,8 +4503,21 @@ "is_recommended": false, "notes": "Requires Dremio ODBC drivers installed." } - ] + ], + "category": "Other Databases" }, + "engine": "dremio", + "engine_name": "Dremio", + "engine_aliases": [ + "dremio+flight" + ], + "default_driver": "flight", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "DuckDB": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -1907,212 +4541,48 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 28, - "max_score": 201, + "module": "superset.db_engine_specs.duckdb", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": false, - "supports_file_upload": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Drill": { - "engine": "apache_drill", - "engine_name": "Apache Drill", - "module": "drill", - "documentation": { - "description": "Apache Drill is a schema-free SQL query engine for Hadoop and NoSQL.", - "logo": "apache-drill.png", - "homepage_url": "https://drill.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "QUERY_ENGINES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "sqlalchemy-drill" - ], - "connection_string": "drill+sadrill://{username}:{password}@{host}:{port}/{storage_plugin}?use_ssl=True", - "default_port": 8047, - "drivers": [ - { - "name": "SQLAlchemy (REST)", - "pypi_package": "sqlalchemy-drill", - "connection_string": "drill+sadrill://{username}:{password}@{host}:{port}/{storage_plugin}?use_ssl=True", - "is_recommended": true - }, - { - "name": "JDBC", - "pypi_package": "sqlalchemy-drill", - "connection_string": "drill+jdbc://{username}:{password}@{host}:{port}", - "is_recommended": false, - "notes": "Requires Drill JDBC Driver installation.", - "docs_url": "https://drill.apache.org/docs/using-the-jdbc-driver/" - }, - { - "name": "ODBC", - "pypi_package": "sqlalchemy-drill", - "is_recommended": false, - "notes": "See Apache Drill documentation for ODBC setup.", - "docs_url": "https://drill.apache.org/docs/installing-the-driver-on-linux/" - } - ], - "connection_examples": [ - { - "description": "Local embedded mode", - "connection_string": "drill+sadrill://localhost:8047/dfs?use_ssl=False" - } - ] - }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": true, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 50, - "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Druid": { - "engine": "apache_druid", - "engine_name": "Apache Druid", - "module": "druid", - "documentation": { - "description": "Apache Druid is a high performance real-time analytics database.", - "logo": "druid.png", - "homepage_url": "https://druid.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "TIME_SERIES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "pydruid" - ], - "connection_string": "druid://{username}:{password}@{host}:{port}/druid/v2/sql", - "default_port": 9088, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "IP address or URL of the host", - "port": "Default 9088" - }, - "ssl_configuration": { - "custom_certificate": "Add certificate in Root Certificate field. pydruid will automatically use https.", - "disable_ssl_verification": { - "engine_params": { - "connect_args": { - "scheme": "https", - "ssl_verify_cert": false - } - } - } - }, - "advanced_features": { - "aggregations": "Define common aggregations in datasource edit view under List Druid Column tab.", - "post_aggregations": "Create metrics with postagg as Metric Type and provide valid JSON post-aggregation definition." - }, - "notes": "A native Druid connector ships with Superset (behind DRUID_IS_ACTIVE flag) but SQLAlchemy connector via pydruid is preferred.", - "compatible_databases": [ - { - "name": "Imply", - "description": "Imply is a fully-managed cloud platform and enterprise distribution built on Apache Druid. It provides real-time analytics with enterprise security and support.", - "logo": "imply.png", - "homepage_url": "https://imply.io/", - "categories": [ - "TIME_SERIES", - "CLOUD_DATA_WAREHOUSES", - "HOSTED_OPEN_SOURCE" - ], - "pypi_packages": [ - "pydruid" - ], - "connection_string": "druid://{username}:{password}@{host}/druid/v2/sql", - "docs_url": "https://docs.imply.io/" - } - ] - }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": true, - "THIRTY_SECONDS": true, - "MINUTE": true, - "FIVE_MINUTES": true, - "TEN_MINUTES": true, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": true, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": true, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": true, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": true, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 47, + "sql_validation": false, + "score": 38, "max_score": 201, - "joins": false, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "DuckDB": { - "engine": "duckdb", - "engine_name": "DuckDB", - "module": "duckdb", "documentation": { "description": "DuckDB is an in-process OLAP database designed for fast analytical queries on local data. Supports CSV, Parquet, JSON, and many other file formats.", "logo": "duckdb.png", "homepage_url": "https://duckdb.org/", "categories": [ - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" + "Analytical Databases", + "Open Source" ], "pypi_packages": [ "duckdb-engine" @@ -2144,10 +4614,11 @@ }, "notes": "Cloud-hosted DuckDB with collaboration features.", "categories": [ - "HOSTED_OPEN_SOURCE" + "Hosted Open Source" ] } ], + "category": "Other Databases", "custom_errors": [ { "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", @@ -2162,6 +4633,16 @@ } ] }, + "engine": "duckdb", + "engine_name": "DuckDB", + "engine_aliases": [], + "default_driver": "duckdb_engine", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Elasticsearch": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -2181,143 +4662,52 @@ "WEEK_ENDING_SATURDAY": false, "WEEK_ENDING_SUNDAY": false, "MONTH": true, - "QUARTER": true, + "QUARTER": false, "QUARTER_YEAR": false, "YEAR": true }, - "score": 38, - "max_score": 201, - "joins": true, + "module": "superset.db_engine_specs.elasticsearch", + "limit_method": 1, + "limit_clause": true, + "joins": false, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": false, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "MotherDuck": { - "engine": "motherduck", - "engine_name": "MotherDuck", - "module": "duckdb", - "documentation": { - "description": "MotherDuck is a serverless cloud analytics platform built on DuckDB. It combines the simplicity of DuckDB with cloud-scale data sharing and collaboration.", - "logo": "motherduck.png", - "homepage_url": "https://motherduck.com/", - "pypi_packages": [ - "duckdb-engine", - "duckdb", - "duckdb-engine" - ], - "connection_string": "duckdb:///md:{database}?motherduck_token={token}", - "drivers": [ - { - "name": "duckdb-engine", - "pypi_package": "duckdb-engine", - "connection_string": "duckdb:////path/to/duck.db", - "is_recommended": true - }, - { - "name": "duckdb-engine", - "pypi_package": "duckdb-engine", - "connection_string": "duckdb:///md:{database}?motherduck_token={token}", - "is_recommended": true - } - ], - "notes": "DuckDB supports both local file and in-memory databases. Use `:memory:` for in-memory database.", - "categories": [ - "ANALYTICAL_DATABASES", - "CLOUD_DATA_WAREHOUSES", - "HOSTED_OPEN_SOURCE" - ], - "parameters": { - "database": "MotherDuck database name", - "token": "Service token from MotherDuck dashboard" - }, - "docs_url": "https://motherduck.com/docs/getting-started/", - "custom_errors": [ - { - "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", - "message_template": "We can't seem to resolve the column \"%(column_name)s\"", - "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Column not found", - "issue_codes": [ - 1003, - 1004 - ] - } - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Amazon DynamoDB": { - "engine": "amazon_dynamodb", - "engine_name": "Amazon DynamoDB", - "module": "dynamodb", - "documentation": { - "description": "Amazon DynamoDB is a serverless NoSQL database with SQL via PartiQL.", - "logo": "aws.png", - "homepage_url": "https://aws.amazon.com/dynamodb/", - "categories": [ - "CLOUD_AWS", - "SEARCH_NOSQL", - "PROPRIETARY" - ], - "pypi_packages": [ - "pydynamodb" - ], - "connection_string": "dynamodb://{aws_access_key_id}:{aws_secret_access_key}@dynamodb.{region}.amazonaws.com:443?connector=superset", - "parameters": { - "aws_access_key_id": "AWS access key ID", - "aws_secret_access_key": "AWS secret access key", - "region": "AWS region (e.g., us-east-1)" - }, - "notes": "Uses PartiQL for SQL queries. Requires connector=superset parameter.", - "docs_url": "https://github.com/passren/PyDynamoDB" - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Elasticsearch": { - "engine": "elasticsearch", - "engine_name": "Elasticsearch", - "module": "elasticsearch", + "sql_validation": false, + "score": 37, + "max_score": 201, "documentation": { "description": "Elasticsearch is a distributed search and analytics engine. Query data using Elasticsearch SQL or OpenSearch SQL syntax.", "logo": "elasticsearch.png", "homepage_url": "https://www.elastic.co/elasticsearch/", "categories": [ - "SEARCH_NOSQL", - "OPEN_SOURCE" + "Search & NoSQL", + "Open Source" ], "pypi_packages": [ "elasticsearch-dbapi" @@ -2352,8 +4742,8 @@ "logo": "elasticsearch.png", "homepage_url": "https://www.elastic.co/cloud/", "categories": [ - "SEARCH_NOSQL", - "HOSTED_OPEN_SOURCE" + "Search & NoSQL", + "Hosted Open Source" ], "pypi_packages": [ "elasticsearch-dbapi" @@ -2367,9 +4757,9 @@ "logo": "elasticsearch.png", "homepage_url": "https://aws.amazon.com/opensearch-service/", "categories": [ - "SEARCH_NOSQL", - "CLOUD_AWS", - "HOSTED_OPEN_SOURCE" + "Search & NoSQL", + "Cloud - AWS", + "Hosted Open Source" ], "pypi_packages": [ "elasticsearch-dbapi" @@ -2377,34 +4767,84 @@ "connection_string": "odelasticsearch+https://{user}:{password}@{host}:443/", "docs_url": "https://docs.aws.amazon.com/opensearch-service/latest/developerguide/" } - ] + ], + "category": "Search & NoSQL" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "elasticsearch", + "engine_name": "Elasticsearch", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "Exasol": { - "engine": "exasol", - "engine_name": "Exasol", - "module": "exasol", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.exasol", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 28, + "max_score": 201, "documentation": { "description": "Exasol is a high-performance, in-memory, MPP analytical database.", "logo": "exasol.png", "homepage_url": "https://www.exasol.com/", "categories": [ - "ANALYTICAL_DATABASES", - "PROPRIETARY" + "Analytical Databases", + "Proprietary" ], "pypi_packages": [ "sqlalchemy-exasol" @@ -2438,70 +4878,19 @@ "is_recommended": false, "notes": "Pure Python, no ODBC required." } - ] + ], + "category": "Other Databases" }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 28, - "max_score": 201, - "joins": true, - "subqueries": true, + "engine": "exa", + "engine_name": "Exasol", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "Firebird": { - "engine": "firebird", - "engine_name": "Firebird", - "module": "firebird", - "documentation": { - "description": "Firebird is an open-source relational database.", - "logo": "firebird.png", - "homepage_url": "https://firebirdsql.org/", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "sqlalchemy-firebird" - ], - "version_requirements": "sqlalchemy-firebird>=0.7.0,<0.8", - "connection_string": "firebird+fdb://{username}:{password}@{host}:{port}//{path_to_db_file}", - "default_port": 3050, - "connection_examples": [ - { - "description": "Local database", - "connection_string": "firebird+fdb://SYSDBA:masterkey@192.168.86.38:3050//Library/Frameworks/Firebird.framework/Versions/A/Resources/examples/empbuild/employee.fdb" - } - ] - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -2525,53 +4914,73 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 26, - "max_score": 201, + "module": "superset.db_engine_specs.firebird", + "limit_method": 3, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Firebolt": { - "engine": "firebolt", - "engine_name": "Firebolt", - "module": "firebolt", + "sql_validation": false, + "score": 26, + "max_score": 201, "documentation": { - "description": "Firebolt is a cloud data warehouse designed for high-performance analytics.", - "logo": "firebolt.png", - "homepage_url": "https://www.firebolt.io/", + "description": "Firebird is an open-source relational database.", + "logo": "firebird.png", + "homepage_url": "https://firebirdsql.org/", "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "PROPRIETARY" + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ - "firebolt-sqlalchemy" + "sqlalchemy-firebird" ], - "connection_string": "firebolt://{client_id}:{client_secret}@{database}/{engine_name}?account_name={account_name}", - "parameters": { - "client_id": "Service account client ID", - "client_secret": "Service account client secret", - "database": "Database name", - "engine_name": "Engine name", - "account_name": "Account name" - }, - "drivers": [ + "version_requirements": "sqlalchemy-firebird>=0.7.0,<0.8", + "connection_string": "firebird+fdb://{username}:{password}@{host}:{port}//{path_to_db_file}", + "default_port": 3050, + "connection_examples": [ { - "name": "firebolt-sqlalchemy", - "pypi_package": "firebolt-sqlalchemy", - "connection_string": "firebolt://{client_id}:{client_secret}@{database}/{engine_name}?account_name={account_name}", - "is_recommended": true + "description": "Local database", + "connection_string": "firebird+fdb://SYSDBA:masterkey@192.168.86.38:3050//Library/Frameworks/Firebird.framework/Versions/A/Resources/examples/empbuild/employee.fdb" } - ] + ], + "category": "Other Databases" }, + "engine": "firebird", + "engine_name": "Firebird", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Firebolt": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -2595,98 +5004,224 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 28, - "max_score": 201, + "module": "superset.db_engine_specs.firebolt", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Greenplum": { - "engine": "greenplum", - "engine_name": "Greenplum", - "module": "greenplum", + "sql_validation": false, + "score": 28, + "max_score": 201, "documentation": { - "description": "VMware Greenplum is a massively parallel processing (MPP) database built on PostgreSQL.", - "logo": "greenplum.png", - "homepage_url": "https://greenplum.org/", - "pypi_packages": [ - "psycopg2", - "sqlalchemy-greenplum", - "psycopg2" + "description": "Firebolt is a cloud data warehouse designed for high-performance analytics.", + "logo": "firebolt.png", + "homepage_url": "https://www.firebolt.io/", + "categories": [ + "Cloud Data Warehouses", + "Analytical Databases", + "Proprietary" ], - "connection_string": "greenplum://{username}:{password}@{host}:{port}/{database}", - "default_port": 5432, + "pypi_packages": [ + "firebolt-sqlalchemy" + ], + "connection_string": "firebolt://{client_id}:{client_secret}@{database}/{engine_name}?account_name={account_name}", "parameters": { - "username": "Database username", - "password": "Database password", - "host": "Greenplum coordinator host", - "port": "Default 5432", - "database": "Database name" + "client_id": "Service account client ID", + "client_secret": "Service account client secret", + "database": "Database name", + "engine_name": "Engine name", + "account_name": "Account name" }, - "notes": "The psycopg2 library comes bundled with Superset Docker images.", - "connection_examples": [ + "drivers": [ { - "description": "Basic connection", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" - }, - { - "description": "With SSL required", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" + "name": "firebolt-sqlalchemy", + "pypi_package": "firebolt-sqlalchemy", + "connection_string": "firebolt://{client_id}:{client_secret}@{database}/{engine_name}?account_name={account_name}", + "is_recommended": true } ], - "docs_url": "https://docs.vmware.com/en/VMware-Greenplum/", - "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ] + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "firebolt", + "engine_name": "Firebolt", + "engine_aliases": [], + "default_driver": "firebolt", + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, + "supports_dynamic_catalog": false + }, + "Google BigQuery": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.bigquery", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": true, + "cte_in_subquery": true, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": false, + "catalog": true, + "dynamic_catalog": true, "ssh_tunneling": false, "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Google Sheets": { - "engine": "google_sheets", - "engine_name": "Google Sheets", - "module": "gsheets", + "get_metrics": false, + "where_latest_partition": true, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": false, + "score": 83, + "max_score": 201, "documentation": { - "description": "Google Sheets allows querying spreadsheets as SQL tables via shillelagh.", - "logo": "google-sheets.svg", - "homepage_url": "https://www.google.com/sheets/about/", - "pypi_packages": [ - "shillelagh[gsheetsapi]", - "shillelagh[gsheetsapi]" - ], - "connection_string": "gsheets://", - "notes": "Requires Google service account credentials or OAuth2 authentication. See docs for setup instructions.", + "description": "Google BigQuery is a serverless, highly scalable data warehouse.", + "logo": "google-big-query.svg", + "homepage_url": "https://cloud.google.com/bigquery/", "categories": [ - "CLOUD_GCP", - "HOSTED_OPEN_SOURCE" + "Cloud - Google", + "Analytical Databases", + "Proprietary" ], - "install_instructions": "pip install \"apache-superset[gsheets]\"", + "pypi_packages": [ + "sqlalchemy-bigquery" + ], + "connection_string": "bigquery://{project_id}", + "install_instructions": "echo \"sqlalchemy-bigquery\" >> ./docker/requirements-local.txt", + "authentication_methods": [ + { + "name": "Service Account JSON", + "description": "Upload service account credentials JSON or paste in Secure Extra", + "secure_extra": { + "credentials_info": { + "type": "service_account", + "project_id": "...", + "private_key_id": "...", + "private_key": "...", + "client_email": "...", + "client_id": "...", + "auth_uri": "...", + "token_uri": "..." + } + } + } + ], + "notes": "Create a Service Account via GCP console with access to BigQuery datasets. For CSV/Excel uploads, also install pandas_gbq.", + "warnings": [ + "Google BigQuery Python SDK is not compatible with gevent. Use a worker type other than gevent when deploying with gunicorn." + ], + "docs_url": "https://github.com/googleapis/python-bigquery-sqlalchemy", + "category": "Cloud - Google", "custom_errors": [ + { + "regex_name": "CONNECTION_DATABASE_PERMISSIONS_REGEX", + "message_template": "Unable to connect. Verify that the following roles are set on the service account: \"BigQuery Data Viewer\", \"BigQuery Metadata Viewer\", \"BigQuery Job User\" and the following permissions are set \"bigquery.readsessions.create\", \"bigquery.readsessions.getData\"", + "error_type": "CONNECTION_DATABASE_PERMISSIONS_ERROR", + "category": "Permissions", + "description": "Insufficient permissions", + "issue_codes": [ + 1017 + ] + }, + { + "regex_name": "TABLE_DOES_NOT_EXIST_REGEX", + "message_template": "The table \"%(table)s\" does not exist. A valid table must be used to run this query.", + "error_type": "TABLE_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Table not found", + "issue_codes": [ + 1003, + 1005 + ] + }, + { + "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", + "message_template": "We can't seem to resolve column \"%(column)s\" at line %(location)s.", + "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Column not found", + "issue_codes": [ + 1003, + 1004 + ] + }, + { + "regex_name": "SCHEMA_DOES_NOT_EXIST_REGEX", + "message_template": "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.", + "error_type": "SCHEMA_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Schema not found", + "issue_codes": [ + 1003, + 1016 + ] + }, { "regex_name": "SYNTAX_ERROR_REGEX", - "message_template": "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.", + "message_template": "Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, try running your query again.", "error_type": "SYNTAX_ERROR", "category": "Query", "description": "SQL syntax error", @@ -2696,6 +5231,174 @@ } ] }, + "engine": "bigquery", + "engine_name": "Google BigQuery", + "engine_aliases": [], + "default_driver": "bigquery", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Google Datastore": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.datastore", + "limit_method": 3, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": true, + "cte_in_subquery": true, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": true, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": false, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 73, + "max_score": 201, + "documentation": { + "description": "Google Cloud Datastore is a highly scalable NoSQL database for your applications.", + "logo": "datastore.png", + "homepage_url": "https://cloud.google.com/datastore/", + "categories": [ + "Cloud - Google", + "Search & NoSQL", + "Proprietary" + ], + "pypi_packages": [ + "python-datastore-sqlalchemy" + ], + "connection_string": "datastore://{project_id}/?database={database_id}", + "authentication_methods": [ + { + "name": "Service Account JSON", + "description": "Upload service account credentials JSON or paste in Secure Extra", + "secure_extra": { + "credentials_info": { + "type": "service_account", + "project_id": "...", + "private_key_id": "...", + "private_key": "...", + "client_email": "...", + "client_id": "...", + "auth_uri": "...", + "token_uri": "..." + } + } + } + ], + "notes": "Create a Service Account via GCP console with access to datastore datasets.", + "docs_url": "https://github.com/splasky/Python-datastore-sqlalchemy", + "category": "Cloud - Google", + "custom_errors": [ + { + "regex_name": "CONNECTION_DATABASE_PERMISSIONS_REGEX", + "message_template": "Unable to connect. Verify that the following roles are set on the service account: \"Cloud Datastore Viewer\", \"Cloud Datastore User\", \"Cloud Datastore Creator\"", + "error_type": "CONNECTION_DATABASE_PERMISSIONS_ERROR", + "category": "Permissions", + "description": "Insufficient permissions", + "issue_codes": [ + 1017 + ] + }, + { + "regex_name": "TABLE_DOES_NOT_EXIST_REGEX", + "message_template": "The table \"%(table)s\" does not exist. A valid table must be used to run this query.", + "error_type": "TABLE_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Table not found", + "issue_codes": [ + 1003, + 1005 + ] + }, + { + "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", + "message_template": "We can't seem to resolve column \"%(column)s\" at line %(location)s.", + "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Column not found", + "issue_codes": [ + 1003, + 1004 + ] + }, + { + "regex_name": "SCHEMA_DOES_NOT_EXIST_REGEX", + "message_template": "The schema \"%(schema)s\" does not exist. A valid schema must be used to run this query.", + "error_type": "SCHEMA_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Schema not found", + "issue_codes": [ + 1003, + 1016 + ] + }, + { + "regex_name": "SYNTAX_ERROR_REGEX", + "message_template": "Please check your query for syntax errors at or near \"%(syntax_error)s\". Then, try running your query again.", + "error_type": "SYNTAX_ERROR", + "category": "Query", + "description": "SQL syntax error", + "issue_codes": [ + 1030 + ] + } + ] + }, + "engine": "datastore", + "engine_name": "Google Datastore", + "engine_aliases": [], + "default_driver": "datastore", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Google Sheets": { "time_grains": { "SECOND": true, "FIVE_SECONDS": true, @@ -2719,55 +5422,93 @@ "QUARTER_YEAR": true, "YEAR": true }, - "score": 61, - "max_score": 201, + "module": "superset.db_engine_specs.gsheets", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": true, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": false, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "SAP HANA": { - "engine": "sap_hana", - "engine_name": "SAP HANA", - "module": "hana", + "sql_validation": false, + "score": 61, + "max_score": 201, "documentation": { - "description": "SAP HANA is an in-memory relational database and application platform.", - "logo": "sap-hana.png", - "homepage_url": "https://www.sap.com/products/technology-platform/hana.html", + "description": "Google Sheets allows querying spreadsheets as SQL tables via shillelagh.", + "logo": "google-sheets.svg", + "homepage_url": "https://www.google.com/sheets/about/", "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" + "Cloud - Google", + "Hosted Open Source" ], "pypi_packages": [ - "hdbcli", - "sqlalchemy-hana" + "shillelagh[gsheetsapi]" ], - "install_instructions": "pip install apache_superset[hana]", - "connection_string": "hana://{username}:{password}@{host}:{port}", - "default_port": 30015, - "docs_url": "https://github.com/SAP/sqlalchemy-hana" + "install_instructions": "pip install \"apache-superset[gsheets]\"", + "connection_string": "gsheets://", + "notes": "Requires Google service account credentials or OAuth2 authentication. See docs for setup instructions.", + "category": "Cloud - Google", + "custom_errors": [ + { + "regex_name": "SYNTAX_ERROR_REGEX", + "message_template": "Please check your query for syntax errors near \"%(server_error)s\". Then, try running your query again.", + "error_type": "SYNTAX_ERROR", + "category": "Query", + "description": "SQL syntax error", + "issue_codes": [ + 1030 + ] + } + ] }, + "engine": "gsheets", + "engine_name": "Google Sheets", + "engine_aliases": [], + "default_driver": "apsw", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Greenplum": { "time_grains": { "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, "HALF_HOUR": false, "HOUR": true, "SIX_HOURS": false, "DAY": true, - "WEEK": false, + "WEEK": true, "WEEK_STARTING_SUNDAY": false, "WEEK_STARTING_MONDAY": false, "WEEK_ENDING_SATURDAY": false, @@ -2777,54 +5518,169 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 27, - "max_score": 201, + "module": "superset.db_engine_specs.greenplum", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 63, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": false, + "score": 94, + "max_score": 201, + "documentation": { + "description": "VMware Greenplum is a massively parallel processing (MPP) database built on PostgreSQL.", + "logo": "greenplum.png", + "homepage_url": "https://greenplum.org/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [ + "sqlalchemy-greenplum", + "psycopg2" + ], + "connection_string": "greenplum://{username}:{password}@{host}:{port}/{database}", + "default_port": 5432, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "Greenplum coordinator host", + "port": "Default 5432", + "database": "Database name" + }, + "docs_url": "https://docs.vmware.com/en/VMware-Greenplum/", + "category": "Other Databases" + }, + "engine": "greenplum", + "engine_name": "Greenplum", + "engine_aliases": [ + "postgres" + ], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Hologres": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.hologres", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Hive": { - "engine": "apache_hive", - "engine_name": "Apache Hive", - "module": "hive", + "sql_validation": false, + "score": 34, + "max_score": 201, "documentation": { - "description": "Apache Hive is a data warehouse infrastructure built on Hadoop.", - "logo": "apache-hive.svg", - "homepage_url": "https://hive.apache.org/", - "pypi_packages": [ - "pyhive", - "pyhive" - ], - "install_instructions": "pip install \"apache-superset[presto]\"", - "connection_string": "hive://hive@{hostname}:{port}/{database}", - "default_port": 10000, - "parameters": { - "hostname": "Presto coordinator hostname", - "port": "Presto coordinator port (default 8080)", - "database": "Catalog name" - }, - "drivers": [ - { - "name": "PyHive", - "pypi_package": "pyhive", - "connection_string": "presto://{hostname}:{port}/{database}", - "is_recommended": true - } - ], + "description": "Alibaba Cloud Hologres is a real-time interactive analytics service, fully compatible with PostgreSQL 11.", + "logo": "hologres.png", + "homepage_url": "https://www.alibabacloud.com/product/hologres", "categories": [ - "APACHE_PROJECTS", - "QUERY_ENGINES", - "OPEN_SOURCE" - ] + "Cloud Data Warehouses", + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "psycopg2" + ], + "connection_string": "postgresql+psycopg2://{username}:{password}@{host}:{port}/{database}", + "parameters": { + "username": "AccessKey ID of your Alibaba Cloud account", + "password": "AccessKey secret of your Alibaba Cloud account", + "host": "Public endpoint of the Hologres instance", + "port": "Port number of the Hologres instance", + "database": "Name of the Hologres database" + }, + "default_port": 80, + "notes": "Uses the PostgreSQL driver. psycopg2 comes bundled with Superset.", + "category": "Other Databases" }, + "engine": "hologres", + "engine_name": "Hologres", + "engine_aliases": [], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "IBM Db2": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -2839,82 +5695,57 @@ "SIX_HOURS": false, "DAY": true, "WEEK": true, - "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_SUNDAY": false, "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SATURDAY": false, "WEEK_ENDING_SUNDAY": false, "MONTH": true, "QUARTER": true, "QUARTER_YEAR": false, "YEAR": true }, - "score": 140, - "max_score": 201, + "module": "superset.db_engine_specs.db2", + "limit_method": 2, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": true, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": true, - "query_cost_estimation": true, - "sql_validation": false - }, - "Hologres": { - "engine": "hologres", - "engine_name": "Hologres", - "module": "hologres", - "documentation": { - "description": "Alibaba Cloud Hologres is a real-time interactive analytics service, fully compatible with PostgreSQL 11.", - "logo": "hologres.png", - "homepage_url": "https://www.alibabacloud.com/product/hologres", - "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "psycopg2" - ], - "connection_string": "postgresql+psycopg2://{username}:{password}@{host}:{port}/{database}", - "parameters": { - "username": "AccessKey ID of your Alibaba Cloud account", - "password": "AccessKey secret of your Alibaba Cloud account", - "host": "Public endpoint of the Hologres instance", - "port": "Port number of the Hologres instance", - "database": "Name of the Hologres database" - }, - "default_port": 80, - "notes": "Uses the PostgreSQL driver. psycopg2 comes bundled with Superset." - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 30, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "IBM Db2 for i": { - "engine": "ibm_db2_for_i", - "engine_name": "IBM Db2 for i", - "module": "ibmi", + "sql_validation": false, + "score": 38, + "max_score": 201, "documentation": { "description": "IBM Db2 is a family of data management products for enterprise workloads, available on-premises, in containers, and across cloud platforms.", "logo": "ibm-db2.svg", "homepage_url": "https://www.ibm.com/db2", "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" + "Traditional RDBMS", + "Proprietary" ], "pypi_packages": [ "ibm_db_sa" @@ -2934,195 +5765,43 @@ "notes": "Use for older DB2 versions without LIMIT [n] syntax. Recommended for SQL Lab." } ], - "docs_url": "https://github.com/ibmdb/python-ibmdbsa" - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Impala": { - "engine": "apache_impala", - "engine_name": "Apache Impala", - "module": "impala", - "documentation": { - "description": "Apache Impala is an open-source massively parallel processing SQL query engine.", - "logo": "apache-impala.png", - "homepage_url": "https://impala.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "QUERY_ENGINES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "impyla" - ], - "connection_string": "impala://{hostname}:{port}/{database}", - "default_port": 21050 - }, - "time_grains": { - "SECOND": false, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 37, - "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Apache IoTDB": { - "engine": "apache_iotdb", - "engine_name": "Apache IoTDB", - "module": "iotdb", - "documentation": { - "description": "Apache IoTDB is a time series database designed for IoT data, with efficient storage and query capabilities for massive time series data.", - "logo": "apache-iotdb.svg", - "homepage_url": "https://iotdb.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "TIME_SERIES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "apache-iotdb" - ], - "connection_string": "iotdb://{username}:{password}@{hostname}:{port}", - "default_port": 6667, - "parameters": { - "username": "Database username (default: root)", - "password": "Database password (default: root)", - "hostname": "IP address or hostname", - "port": "Default 6667" - }, - "notes": "The IoTDB SQLAlchemy dialect was written to integrate with Apache Superset. IoTDB uses a hierarchical data model, which is reorganized into a relational model for SQL queries." - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Azure Data Explorer": { - "engine": "azure_data_explorer", - "engine_name": "Azure Data Explorer", - "module": "kusto", - "documentation": { - "description": "Azure Data Explorer (Kusto) is a fast, fully managed data analytics service from Microsoft Azure. Query data using SQL or native KQL syntax.", - "logo": "kusto.png", - "homepage_url": "https://azure.microsoft.com/en-us/products/data-explorer/", - "categories": [ - "CLOUD_AZURE", - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "sqlalchemy-kusto" - ], - "connection_string": "kustosql+https://{cluster}.kusto.windows.net/{database}?msi=False&azure_ad_client_id={client_id}&azure_ad_client_secret={client_secret}&azure_ad_tenant_id={tenant_id}", - "parameters": { - "cluster": "Azure Data Explorer cluster name", - "database": "Database name", - "client_id": "Azure AD application (client) ID", - "client_secret": "Azure AD application secret", - "tenant_id": "Azure AD tenant ID" - }, - "drivers": [ + "compatible_databases": [ { - "name": "SQL Interface (Recommended)", - "pypi_package": "sqlalchemy-kusto", - "connection_string": "kustosql+https://{cluster}.kusto.windows.net/{database}?msi=False&azure_ad_client_id={client_id}&azure_ad_client_secret={client_secret}&azure_ad_tenant_id={tenant_id}", - "is_recommended": true, - "notes": "Use familiar SQL syntax to query Azure Data Explorer." - }, - { - "name": "KQL (Kusto Query Language)", - "pypi_package": "sqlalchemy-kusto", - "connection_string": "kustokql+https://{cluster}.kusto.windows.net/{database}?msi=False&azure_ad_client_id={client_id}&azure_ad_client_secret={client_secret}&azure_ad_tenant_id={tenant_id}", - "is_recommended": false, - "notes": "Use native Kusto Query Language for advanced analytics." + "name": "IBM Db2 for i (AS/400)", + "description": "Db2 for i is a fully integrated database engine on IBM i (AS/400) systems. Uses a different SQLAlchemy driver optimized for IBM i.", + "logo": "ibm-db2.svg", + "homepage_url": "https://www.ibm.com/products/db2-for-i", + "pypi_packages": [ + "sqlalchemy-ibmi" + ], + "connection_string": "ibmi://{username}:{password}@{host}/{database}", + "parameters": { + "username": "IBM i username", + "password": "IBM i password", + "host": "IBM i system host", + "database": "Library/schema name" + }, + "docs_url": "https://github.com/IBM/sqlalchemy-ibmi", + "categories": [ + "Proprietary" + ] } - ] + ], + "docs_url": "https://github.com/ibmdb/python-ibmdbsa", + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, + "engine": "db2", + "engine_name": "IBM Db2", + "engine_aliases": [ + "ibm_db_sa" + ], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": true, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, - "Apache Kylin": { - "engine": "apache_kylin", - "engine_name": "Apache Kylin", - "module": "kylin", - "documentation": { - "description": "Apache Kylin is an open-source OLAP engine for big data.", - "logo": "apache-kylin.png", - "homepage_url": "https://kylin.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "kylinpy" - ], - "connection_string": "kylin://{username}:{password}@{hostname}:{port}/{project}?{param1}={value1}&{param2}={value2}", - "default_port": 7070 - }, + "IBM Db2 for i": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -3146,80 +5825,187 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 28, - "max_score": 201, + "module": "superset.db_engine_specs.ibmi", + "limit_method": 2, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "MariaDB": { - "engine": "mariadb", - "engine_name": "MariaDB", - "module": "mariadb", + "sql_validation": false, + "score": 38, + "max_score": 201, "documentation": { - "description": "MariaDB is a community-developed fork of MySQL.", - "logo": "mariadb.png", - "homepage_url": "https://mariadb.org/", + "description": "IBM Db2 is a family of data management products for enterprise workloads, available on-premises, in containers, and across cloud platforms.", + "logo": "ibm-db2.svg", + "homepage_url": "https://www.ibm.com/db2", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], "pypi_packages": [ - "mysqlclient", - "mysqlclient" - ], - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "default_port": 3306, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "localhost, 127.0.0.1, IP address, or hostname", - "database": "Database name" - }, - "host_examples": [ - { - "platform": "Localhost", - "host": "localhost or 127.0.0.1" - }, - { - "platform": "Docker on Linux", - "host": "172.18.0.1" - }, - { - "platform": "Docker on macOS", - "host": "docker.for.mac.host.internal" - }, - { - "platform": "On-premise", - "host": "IP address or hostname" - } + "ibm_db_sa" ], + "connection_string": "db2+ibm_db://{username}:{password}@{hostname}:{port}/{database}", + "default_port": 50000, "drivers": [ { - "name": "mysqlclient", - "pypi_package": "mysqlclient", - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "is_recommended": true, - "notes": "Recommended driver. May fail with caching_sha2_password auth." + "name": "ibm_db_sa (with LIMIT)", + "connection_string": "db2+ibm_db://{username}:{password}@{hostname}:{port}/{database}", + "is_recommended": true }, { - "name": "mysql-connector-python", - "pypi_package": "mysql-connector-python", - "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", + "name": "ibm_db_sa (without LIMIT syntax)", + "connection_string": "ibm_db_sa://{username}:{password}@{hostname}:{port}/{database}", "is_recommended": false, - "notes": "Required for newer MySQL databases using caching_sha2_password authentication." + "notes": "Use for older DB2 versions without LIMIT [n] syntax. Recommended for SQL Lab." } ], - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "compatible_databases": [ + { + "name": "IBM Db2 for i (AS/400)", + "description": "Db2 for i is a fully integrated database engine on IBM i (AS/400) systems. Uses a different SQLAlchemy driver optimized for IBM i.", + "logo": "ibm-db2.svg", + "homepage_url": "https://www.ibm.com/products/db2-for-i", + "pypi_packages": [ + "sqlalchemy-ibmi" + ], + "connection_string": "ibmi://{username}:{password}@{host}/{database}", + "parameters": { + "username": "IBM i username", + "password": "IBM i password", + "host": "IBM i system host", + "database": "Library/schema name" + }, + "docs_url": "https://github.com/IBM/sqlalchemy-ibmi", + "categories": [ + "Proprietary" + ] + } ], - "notes": "Uses the MySQL driver. Fully compatible with MySQL connector." + "docs_url": "https://github.com/ibmdb/python-ibmdbsa", + "category": "Other Databases" }, + "engine": "ibmi", + "engine_name": "IBM Db2 for i", + "engine_aliases": [ + "ibm_db_sa" + ], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "IBM Netezza Performance Server": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.netezza", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 28, + "max_score": 201, + "documentation": { + "description": "IBM Netezza Performance Server is a data warehouse appliance.", + "logo": "netezza.png", + "homepage_url": "https://www.ibm.com/products/netezza", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], + "pypi_packages": [ + "nzalchemy" + ], + "connection_string": "netezza+nzpy://{username}:{password}@{hostname}:{port}/{database}", + "default_port": 5480, + "category": "Other Databases" + }, + "engine": "netezza", + "engine_name": "IBM Netezza Performance Server", + "engine_aliases": [], + "default_driver": "nzpy", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "MariaDB": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -3243,31 +6029,274 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 59, - "max_score": 201, + "module": "superset.db_engine_specs.mariadb", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 59, + "max_score": 201, + "documentation": { + "description": "MariaDB is a community-developed fork of MySQL.", + "logo": "mariadb.png", + "homepage_url": "https://mariadb.org/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [ + "mysqlclient" + ], + "connection_string": "mysql://{username}:{password}@{host}/{database}", + "default_port": 3306, + "notes": "Uses the MySQL driver. Fully compatible with MySQL connector.", + "category": "Traditional RDBMS" + }, + "engine": "mariadb", + "engine_name": "MariaDB", + "engine_aliases": [], + "default_driver": "mysqldb", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Microsoft SQL Server": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.mssql", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": false, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 44, + "max_score": 201, + "documentation": { + "description": "Microsoft SQL Server is a relational database management system.", + "logo": "msql.png", + "homepage_url": "https://www.microsoft.com/en-us/sql-server", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], + "pypi_packages": [ + "pymssql" + ], + "connection_string": "mssql+pymssql://{username}:{password}@{host}:{port}/{database}", + "default_port": 1433, + "drivers": [ + { + "name": "pymssql", + "pypi_package": "pymssql", + "connection_string": "mssql+pymssql://{username}:{password}@{host}:{port}/{database}", + "is_recommended": true + }, + { + "name": "pyodbc", + "pypi_package": "pyodbc", + "connection_string": "mssql+pyodbc:///?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3A%3C{host}%3E%2C1433%3BDatabase%3D{database}%3BUid%3D{username}%3BPwd%3D{password}%3BEncrypt%3Dyes%3BConnection+Timeout%3D30", + "is_recommended": false, + "notes": "Connection string must be URL-encoded. Special characters like @ need encoding." + } + ], + "docs_url": "https://docs.sqlalchemy.org/en/20/core/engines.html#escaping-special-characters-such-as-signs-in-passwords", + "category": "Cloud - Azure", + "custom_errors": [ + { + "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", + "message_template": "Either the username \"%(username)s\", password, or database name \"%(database)s\" is incorrect.", + "error_type": "CONNECTION_ACCESS_DENIED_ERROR", + "category": "Authentication", + "description": "Access denied", + "issue_codes": [ + 1014, + 1015 + ] + }, + { + "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", + "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", + "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", + "category": "Connection", + "description": "Invalid hostname", + "issue_codes": [ + 1007 + ] + }, + { + "regex_name": "CONNECTION_PORT_CLOSED_REGEX", + "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", + "error_type": "CONNECTION_PORT_CLOSED_ERROR", + "category": "Connection", + "description": "Port closed or refused", + "issue_codes": [ + 1008 + ] + }, + { + "regex_name": "CONNECTION_HOST_DOWN_REGEX", + "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", + "error_type": "CONNECTION_HOST_DOWN_ERROR", + "category": "Connection", + "description": "Host unreachable", + "issue_codes": [ + 1009 + ] + } + ] + }, + "engine": "mssql", + "engine_name": "Microsoft SQL Server", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "MonetDB": { - "engine": "monetdb", - "engine_name": "MonetDB", - "module": "monetdb", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": false, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": false, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.monetdb", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 26, + "max_score": 201, "documentation": { "description": "MonetDB is an open-source column-oriented relational database for high-performance analytics.", "logo": "monet-db.png", "homepage_url": "https://www.monetdb.org/", "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ "sqlalchemy-monetdb", @@ -3282,34 +6311,84 @@ "port": "Default 50000", "database": "Database name" }, - "docs_url": "https://www.monetdb.org/documentation/" + "docs_url": "https://www.monetdb.org/documentation/", + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "monetdb", + "engine_name": "MonetDB", + "engine_aliases": [], + "default_driver": "pymonetdb", + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "MongoDB": { - "engine": "mongodb", - "engine_name": "MongoDB", - "module": "mongodb", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.mongodb", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 32, + "max_score": 201, "documentation": { "description": "MongoDB is a document-oriented, operational NoSQL database.", "logo": "mongodb.png", "homepage_url": "https://www.mongodb.com/", "categories": [ - "SEARCH_NOSQL", - "PROPRIETARY" + "Search & NoSQL", + "Proprietary" ], "pypi_packages": [ "pymongosql" @@ -3339,115 +6418,146 @@ } ], "notes": "Uses PartiQL for SQL queries. Requires mode=superset parameter.", - "docs_url": "https://github.com/passren/PyMongoSQL" + "docs_url": "https://github.com/passren/PyMongoSQL", + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "mongodb", + "engine_name": "MongoDB", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, - "Microsoft SQL Server": { - "engine": "microsoft_sql_server", - "engine_name": "Microsoft SQL Server", - "module": "mssql", - "documentation": { - "description": "Microsoft SQL Server is a relational database management system.", - "logo": "msql.png", - "homepage_url": "https://www.microsoft.com/en-us/sql-server", - "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" - ], - "pypi_packages": [ - "pymssql" - ], - "connection_string": "mssql+pymssql://{username}:{password}@{host}:{port}/{database}", - "default_port": 1433, - "drivers": [ - { - "name": "pymssql", - "pypi_package": "pymssql", - "connection_string": "mssql+pymssql://{username}:{password}@{host}:{port}/{database}", - "is_recommended": true - }, - { - "name": "pyodbc", - "pypi_package": "pyodbc", - "connection_string": "mssql+pyodbc:///?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3A%3C{host}%3E%2C1433%3BDatabase%3D{database}%3BUid%3D{username}%3BPwd%3D{password}%3BEncrypt%3Dyes%3BConnection+Timeout%3D30", - "is_recommended": false, - "notes": "Connection string must be URL-encoded. Special characters like @ need encoding." - } - ], - "docs_url": "https://docs.sqlalchemy.org/en/20/core/engines.html#escaping-special-characters-such-as-signs-in-passwords", - "custom_errors": [ - { - "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", - "message_template": "Either the username \"%(username)s\", password, or database name \"%(database)s\" is incorrect.", - "error_type": "CONNECTION_ACCESS_DENIED_ERROR", - "category": "Authentication", - "description": "Access denied", - "issue_codes": [ - 1014, - 1015 - ] - }, - { - "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", - "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", - "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", - "category": "Connection", - "description": "Invalid hostname", - "issue_codes": [ - 1007 - ] - }, - { - "regex_name": "CONNECTION_PORT_CLOSED_REGEX", - "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", - "error_type": "CONNECTION_PORT_CLOSED_ERROR", - "category": "Connection", - "description": "Port closed or refused", - "issue_codes": [ - 1008 - ] - }, - { - "regex_name": "CONNECTION_HOST_DOWN_REGEX", - "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", - "error_type": "CONNECTION_HOST_DOWN_ERROR", - "category": "Connection", - "description": "Host unreachable", - "issue_codes": [ - 1009 - ] - } - ] - }, + "MotherDuck": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, "THIRTY_SECONDS": false, "MINUTE": true, - "FIVE_MINUTES": true, - "TEN_MINUTES": true, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, "HALF_HOUR": false, "HOUR": true, "SIX_HOURS": false, "DAY": true, "WEEK": true, - "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.duckdb", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 58, + "max_score": 201, + "documentation": { + "description": "MotherDuck is a serverless cloud analytics platform built on DuckDB. It combines the simplicity of DuckDB with cloud-scale data sharing and collaboration.", + "logo": "motherduck.png", + "homepage_url": "https://motherduck.com/", + "categories": [ + "Analytical Databases", + "Cloud Data Warehouses", + "Hosted Open Source" + ], + "pypi_packages": [ + "duckdb", + "duckdb-engine" + ], + "connection_string": "duckdb:///md:{database}?motherduck_token={token}", + "parameters": { + "database": "MotherDuck database name", + "token": "Service token from MotherDuck dashboard" + }, + "docs_url": "https://motherduck.com/docs/getting-started/", + "drivers": [ + { + "name": "duckdb-engine", + "pypi_package": "duckdb-engine", + "connection_string": "duckdb:///md:{database}?motherduck_token={token}", + "is_recommended": true + } + ], + "category": "Other Databases", + "custom_errors": [ + { + "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", + "message_template": "We can't seem to resolve the column \"%(column_name)s\"", + "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Column not found", + "issue_codes": [ + 1003, + 1004 + ] + } + ] + }, + "engine": "motherduck", + "engine_name": "MotherDuck", + "engine_aliases": [ + "duckdb" + ], + "default_driver": "duckdb_engine", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "MySQL": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, "WEEK_STARTING_MONDAY": true, "WEEK_ENDING_SATURDAY": false, "WEEK_ENDING_SUNDAY": false, @@ -3456,125 +6566,48 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 44, - "max_score": 201, + "module": "superset.db_engine_specs.mysql", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, - "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Azure Synapse": { - "engine": "azure_synapse", - "engine_name": "Azure Synapse", - "module": "mssql", - "documentation": { - "description": "Azure Synapse Analytics is a cloud-based enterprise data warehouse from Microsoft that combines big data and data warehousing.", - "logo": "azure.svg", - "homepage_url": "https://azure.microsoft.com/en-us/products/synapse-analytics/", - "pypi_packages": [ - "pymssql", - "pymssql" - ], - "connection_string": "mssql+pymssql://{username}@{server}:{password}@{server}.database.windows.net:1433/{database}", - "default_port": 1433, - "drivers": [ - { - "name": "pymssql", - "pypi_package": "pymssql", - "connection_string": "mssql+pymssql://{username}:{password}@{host}:{port}/{database}", - "is_recommended": true - }, - { - "name": "pyodbc", - "pypi_package": "pyodbc", - "connection_string": "mssql+pyodbc:///?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3A%3C{host}%3E%2C1433%3BDatabase%3D{database}%3BUid%3D{username}%3BPwd%3D{password}%3BEncrypt%3Dyes%3BConnection+Timeout%3D30", - "is_recommended": false, - "notes": "Connection string must be URL-encoded. Special characters like @ need encoding." - } - ], - "docs_url": "https://docs.sqlalchemy.org/en/20/core/engines.html#escaping-special-characters-such-as-signs-in-passwords", - "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "custom_errors": [ - { - "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", - "message_template": "Either the username \"%(username)s\", password, or database name \"%(database)s\" is incorrect.", - "error_type": "CONNECTION_ACCESS_DENIED_ERROR", - "category": "Authentication", - "description": "Access denied", - "issue_codes": [ - 1014, - 1015 - ] - }, - { - "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", - "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", - "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", - "category": "Connection", - "description": "Invalid hostname", - "issue_codes": [ - 1007 - ] - }, - { - "regex_name": "CONNECTION_PORT_CLOSED_REGEX", - "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", - "error_type": "CONNECTION_PORT_CLOSED_ERROR", - "category": "Connection", - "description": "Port closed or refused", - "issue_codes": [ - 1008 - ] - }, - { - "regex_name": "CONNECTION_HOST_DOWN_REGEX", - "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", - "error_type": "CONNECTION_HOST_DOWN_ERROR", - "category": "Connection", - "description": "Host unreachable", - "issue_codes": [ - 1009 - ] - } - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "MySQL": { - "engine": "mysql", - "engine_name": "MySQL", - "module": "mysql", + "sql_validation": false, + "score": 59, + "max_score": 201, "documentation": { "description": "MySQL is a popular open-source relational database.", "logo": "mysql.png", "homepage_url": "https://www.mysql.com/", "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ "mysqlclient" @@ -3632,7 +6665,7 @@ ], "connection_string": "mysql://{username}:{password}@{host}:{port}/{database}", "categories": [ - "OPEN_SOURCE" + "Open Source" ] }, { @@ -3654,11 +6687,12 @@ }, "notes": "Uses the Data API for serverless access. Standard MySQL connections also work with mysqlclient.", "categories": [ - "CLOUD_AWS", - "HOSTED_OPEN_SOURCE" + "Cloud - AWS", + "Hosted Open Source" ] } ], + "category": "Traditional RDBMS", "custom_errors": [ { "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", @@ -3727,6 +6761,16 @@ } ] }, + "engine": "mysql", + "engine_name": "MySQL", + "engine_aliases": [], + "default_driver": "mysqldb", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "OceanBase": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -3750,111 +6794,54 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 59, - "max_score": 201, + "module": "superset.db_engine_specs.oceanbase", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "IBM Netezza Performance Server": { - "engine": "ibm_netezza_performance_server", - "engine_name": "IBM Netezza Performance Server", - "module": "netezza", - "documentation": { - "description": "IBM Netezza Performance Server is a data warehouse appliance.", - "logo": "netezza.png", - "homepage_url": "https://www.ibm.com/products/netezza", - "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" - ], - "pypi_packages": [ - "nzalchemy" - ], - "connection_string": "netezza+nzpy://{username}:{password}@{hostname}:{port}/{database}", - "default_port": 5480 - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "OceanBase": { - "engine": "oceanbase", - "engine_name": "OceanBase", - "module": "oceanbase", + "sql_validation": false, + "score": 59, + "max_score": 201, "documentation": { "description": "OceanBase is a distributed relational database.", "logo": "oceanbase.svg", "homepage_url": "https://www.oceanbase.com/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], "pypi_packages": [ - "mysqlclient", "oceanbase_py" ], "connection_string": "oceanbase://{username}:{password}@{host}:{port}/{database}", - "default_port": 3306, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "localhost, 127.0.0.1, IP address, or hostname", - "database": "Database name" - }, - "host_examples": [ - { - "platform": "Localhost", - "host": "localhost or 127.0.0.1" - }, - { - "platform": "Docker on Linux", - "host": "172.18.0.1" - }, - { - "platform": "Docker on macOS", - "host": "docker.for.mac.host.internal" - }, - { - "platform": "On-premise", - "host": "IP address or hostname" - } - ], - "drivers": [ - { - "name": "mysqlclient", - "pypi_package": "mysqlclient", - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "is_recommended": true, - "notes": "Recommended driver. May fail with caching_sha2_password auth." - }, - { - "name": "mysql-connector-python", - "pypi_package": "mysql-connector-python", - "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", - "is_recommended": false, - "notes": "Required for newer MySQL databases using caching_sha2_password authentication." - } - ], - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ], + "category": "Other Databases", "custom_errors": [ { "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", @@ -3923,36 +6910,89 @@ } ] }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, + "engine": "oceanbase", + "engine_name": "OceanBase", + "engine_aliases": [ + "oceanbase", + "oceanbase_py" + ], + "default_driver": "oceanbase", + "supports_file_upload": true, + "supports_dynamic_schema": true, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "Ocient": { - "engine": "ocient", - "engine_name": "Ocient", - "module": "ocient", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": false, + "QUARTER_YEAR": true, + "YEAR": true + }, + "module": "superset.db_engine_specs.ocient", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": false, + "max_column_name": 30, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 38, + "max_score": 201, "documentation": { "description": "Ocient is a hyperscale data analytics database.", "categories": [ - "ANALYTICAL_DATABASES", - "PROPRIETARY" + "Analytical Databases", + "Proprietary" ], "pypi_packages": [ "sqlalchemy-ocient" ], "connection_string": "ocient://{username}:{password}@{host}:{port}/{database}", "install_instructions": "pip install sqlalchemy-ocient", + "category": "Other Databases", "custom_errors": [ { "regex_name": "CONNECTION_INVALID_USERNAME_REGEX", @@ -4043,6 +7083,16 @@ } ] }, + "engine": "ocient", + "engine_name": "Ocient", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "OpenSearch (OpenDistro)": { "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -4056,50 +7106,66 @@ "HOUR": true, "SIX_HOURS": false, "DAY": true, - "WEEK": true, + "WEEK": false, "WEEK_STARTING_SUNDAY": false, "WEEK_STARTING_MONDAY": false, "WEEK_ENDING_SATURDAY": false, "WEEK_ENDING_SUNDAY": false, "MONTH": true, "QUARTER": false, - "QUARTER_YEAR": true, + "QUARTER_YEAR": false, "YEAR": true }, - "score": 38, - "max_score": 201, - "joins": true, + "module": "superset.db_engine_specs.elasticsearch", + "limit_method": 1, + "limit_clause": true, + "joins": false, "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": true, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": false, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 26, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "engine+driver://user:password@host:port/dbname[?key=value&key=value...]", + "category": "Other Databases" + }, + "engine": "odelasticsearch", + "engine_name": "OpenSearch (OpenDistro)", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "Oracle": { - "engine": "oracle", - "engine_name": "Oracle", - "module": "oracle", - "documentation": { - "description": "Oracle Database is a multi-model database management system.", - "logo": "oraclelogo.png", - "homepage_url": "https://www.oracle.com/database/", - "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" - ], - "pypi_packages": [ - "oracledb" - ], - "connection_string": "oracle://{username}:{password}@{hostname}:{port}", - "default_port": 1521, - "notes": "Previously used cx_Oracle, now uses oracledb.", - "docs_url": "https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html" - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -4123,29 +7189,131 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 28, - "max_score": 201, + "module": "superset.db_engine_specs.oracle", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 28, + "max_score": 201, + "documentation": { + "description": "Oracle Database is a multi-model database management system.", + "logo": "oraclelogo.png", + "homepage_url": "https://www.oracle.com/database/", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], + "pypi_packages": [ + "oracledb" + ], + "connection_string": "oracle://{username}:{password}@{hostname}:{port}", + "default_port": 1521, + "notes": "Previously used cx_Oracle, now uses oracledb.", + "docs_url": "https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html", + "category": "Other Databases" + }, + "engine": "oracle", + "engine_name": "Oracle", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "Parseable": { - "engine": "parseable", - "engine_name": "Parseable", - "module": "parseable", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.parseable", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 28, + "max_score": 201, "documentation": { "description": "Parseable is a distributed log analytics database with SQL-like query interface.", "categories": [ - "SEARCH_NOSQL", - "OPEN_SOURCE" + "Search & NoSQL", + "Open Source" ], "pypi_packages": [ "sqlalchemy-parseable" @@ -4158,121 +7326,23 @@ } ], "notes": "Stream name in URI represents the Parseable logstream to query. Supports HTTP (80) and HTTPS (443).", - "docs_url": "https://www.parseable.io" + "docs_url": "https://www.parseable.io", + "category": "Other Databases" }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 28, - "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": false, + "engine": "parseable", + "engine_name": "Parseable", + "engine_aliases": [], + "default_driver": null, "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Phoenix": { - "engine": "apache_phoenix", - "engine_name": "Apache Phoenix", - "module": "phoenix", - "documentation": { - "description": "Apache Phoenix is a relational database layer over Apache HBase, providing low-latency SQL queries over HBase data.", - "logo": "apache-phoenix.png", - "homepage_url": "https://phoenix.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "phoenixdb" - ], - "connection_string": "phoenix://{hostname}:{port}/", - "default_port": 8765, - "notes": "Phoenix provides a SQL interface to Apache HBase. The phoenixdb driver connects via the Phoenix Query Server and supports a subset of SQLAlchemy." - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, - "Apache Pinot": { - "engine": "apache_pinot", - "engine_name": "Apache Pinot", - "module": "pinot", - "documentation": { - "description": "Apache Pinot is a real-time distributed OLAP datastore.", - "logo": "apache-pinot.svg", - "homepage_url": "https://pinot.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "TIME_SERIES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "pinotdb" - ], - "connection_string": "pinot+http://{broker_host}:{broker_port}/query?controller=http://{controller_host}:{controller_port}/", - "default_port": 8099, - "connection_examples": [ - { - "description": "With authentication", - "connection_string": "pinot://{username}:{password}@{broker_host}:{broker_port}/query/sql?controller=http://{controller_host}:{controller_port}/verify_ssl=true" - } - ], - "engine_parameters": [ - { - "name": "Multi-stage Query Engine", - "description": "Enable for Explore view, joins, window functions", - "json": { - "connect_args": { - "use_multistage_engine": "true" - } - }, - "docs_url": "https://docs.pinot.apache.org/reference/multi-stage-engine" - } - ] - }, + "PostgreSQL": { "time_grains": { "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, "MINUTE": true, "FIVE_MINUTES": true, "TEN_MINUTES": true, @@ -4292,31 +7362,48 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 32, - "max_score": 201, - "joins": false, - "subqueries": false, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": false, - "supports_file_upload": true, + "module": "superset.db_engine_specs.postgres", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 63, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "PostgreSQL": { - "engine": "postgresql", - "engine_name": "PostgreSQL", - "module": "postgres", + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": true, + "score": 104, + "max_score": 201, "documentation": { "description": "PostgreSQL is an advanced open-source relational database.", "logo": "postgresql.svg", "homepage_url": "https://www.postgresql.org/", "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ "psycopg2" @@ -4361,7 +7448,7 @@ "database": "Name of the Hologres database" }, "categories": [ - "PROPRIETARY" + "Proprietary" ] }, { @@ -4382,7 +7469,7 @@ "notes": "psycopg2 comes bundled with Superset Docker images.", "docs_url": "https://docs.timescale.com/", "categories": [ - "OPEN_SOURCE" + "Open Source" ] }, { @@ -4397,7 +7484,7 @@ "notes": "psycopg2 comes bundled with Superset Docker images.", "docs_url": "https://www.yugabyte.com/", "categories": [ - "OPEN_SOURCE" + "Open Source" ] }, { @@ -4427,7 +7514,7 @@ "notes": "Find connection details in your Supabase project dashboard under Settings > Database. Use the connection pooler (port 6543) for better connection management.", "docs_url": "https://supabase.com/docs/guides/database/connecting-to-postgres", "categories": [ - "HOSTED_OPEN_SOURCE" + "Hosted Open Source" ] }, { @@ -4449,8 +7536,8 @@ "notes": "For public IP connections, use the AlloyDB Auth Proxy for secure access. Private IP connections can connect directly.", "docs_url": "https://cloud.google.com/alloydb/docs", "categories": [ - "CLOUD_GCP", - "HOSTED_OPEN_SOURCE" + "Cloud - Google", + "Hosted Open Source" ] }, { @@ -4471,7 +7558,7 @@ "notes": "SSL is required for all connections. Find connection details in the Neon console under Connection Details.", "docs_url": "https://neon.tech/docs/connect/connect-from-any-app", "categories": [ - "HOSTED_OPEN_SOURCE" + "Hosted Open Source" ] }, { @@ -4493,11 +7580,12 @@ }, "notes": "Uses the Data API for serverless access. Standard PostgreSQL connections also work with psycopg2.", "categories": [ - "CLOUD_AWS", - "HOSTED_OPEN_SOURCE" + "Cloud - AWS", + "Hosted Open Source" ] } ], + "category": "Traditional RDBMS", "custom_errors": [ { "regex_name": "CONNECTION_INVALID_USERNAME_REGEX", @@ -4617,6 +7705,18 @@ } ] }, + "engine": "postgresql", + "engine_name": "PostgreSQL", + "engine_aliases": [ + "postgres" + ], + "default_driver": "psycopg2", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "Presto": { "time_grains": { "SECOND": true, "FIVE_SECONDS": true, @@ -4625,46 +7725,63 @@ "FIVE_MINUTES": true, "TEN_MINUTES": true, "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": true, - "HALF_HOUR": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": true, "HOUR": true, - "SIX_HOURS": false, + "SIX_HOURS": true, "DAY": true, "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, "MONTH": true, "QUARTER": true, "QUARTER_YEAR": false, "YEAR": true }, - "score": 104, - "max_score": 201, + "module": "superset.db_engine_specs.presto", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": true, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": true, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, "ssh_tunneling": true, "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": true, + "expand_data": true, "query_cost_estimation": true, - "sql_validation": true - }, - "Presto": { - "engine": "presto", - "engine_name": "Presto", - "module": "presto", + "sql_validation": true, + "score": 159, + "max_score": 201, "documentation": { "description": "Presto is a distributed SQL query engine for big data.", "logo": "presto-og.png", "homepage_url": "https://prestodb.io/", "categories": [ - "QUERY_ENGINES", - "OPEN_SOURCE" + "Query Engines", + "Open Source" ], "pypi_packages": [ "pyhive" @@ -4685,6 +7802,7 @@ "is_recommended": true } ], + "category": "Query Engines", "custom_errors": [ { "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", @@ -4772,261 +7890,16 @@ } ] }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": true, - "THIRTY_SECONDS": true, - "MINUTE": true, - "FIVE_MINUTES": true, - "TEN_MINUTES": true, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": false, - "HALF_HOUR": true, - "HOUR": true, - "SIX_HOURS": true, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": true, - "WEEK_STARTING_MONDAY": true, - "WEEK_ENDING_SATURDAY": true, - "WEEK_ENDING_SUNDAY": true, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 159, - "max_score": 201, - "joins": true, - "subqueries": true, + "engine": "presto", + "engine_name": "Presto", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": true, "supports_catalog": true, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": true, - "query_cost_estimation": true, - "sql_validation": true - }, - "Amazon Redshift": { - "engine": "amazon_redshift", - "engine_name": "Amazon Redshift", - "module": "redshift", - "documentation": { - "description": "Amazon Redshift is a fully managed data warehouse service.", - "logo": "redshift.png", - "homepage_url": "https://aws.amazon.com/redshift/", - "categories": [ - "CLOUD_AWS", - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "sqlalchemy-redshift" - ], - "connection_string": "redshift+psycopg2://{username}:{password}@{host}:5439/{database}", - "default_port": 5439, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "AWS Endpoint", - "port": "Default 5439", - "database": "Database name" - }, - "drivers": [ - { - "name": "psycopg2", - "pypi_package": "psycopg2", - "connection_string": "redshift+psycopg2://{username}:{password}@{host}:5439/{database}", - "is_recommended": true - }, - { - "name": "redshift_connector", - "pypi_package": "redshift_connector", - "connection_string": "redshift+redshift_connector://{username}:{password}@{host}:5439/{database}", - "is_recommended": false, - "notes": "Supports IAM-based credentials for clusters and serverless." - } - ], - "authentication_methods": [ - { - "name": "IAM Credentials (Cluster)", - "description": "Use IAM-based temporary database credentials for Redshift clusters", - "requirements": "IAM role must have redshift:GetClusterCredentials permission", - "connection_string": "redshift+redshift_connector://", - "engine_parameters": { - "connect_args": { - "iam": true, - "database": "", - "cluster_identifier": "", - "db_user": "" - } - } - }, - { - "name": "IAM Role (Serverless)", - "description": "Authenticate using the IAM role attached to the environment (EC2 instance profile, ECS task role, etc.). No credentials needed.", - "requirements": "The attached IAM role must have redshift-serverless:GetCredentials and redshift-serverless:GetWorkgroup permissions.", - "connection_string": "redshift+redshift_connector://", - "engine_parameters": { - "connect_args": { - "iam": true, - "is_serverless": true, - "serverless_acct_id": "", - "serverless_work_group": "", - "database": "", - "user": "IAMR:" - } - } - }, - { - "name": "IAM Access Key (Serverless)", - "description": "Authenticate using explicit AWS access key and secret. Suitable for local development or CI environments without an attached IAM role.", - "requirements": "The IAM user must have redshift-serverless:GetCredentials and redshift-serverless:GetWorkgroup permissions.", - "connection_string": "redshift+redshift_connector://", - "engine_parameters": { - "connect_args": { - "iam": true, - "is_serverless": true, - "serverless_acct_id": "", - "serverless_work_group": "", - "database": "", - "host": "", - "port": 5439, - "region": "", - "access_key_id": "", - "secret_access_key": "" - } - } - } - ], - "custom_errors": [ - { - "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", - "message_template": "Either the username \"%(username)s\" or the password is incorrect.", - "error_type": "CONNECTION_ACCESS_DENIED_ERROR", - "category": "Authentication", - "description": "Access denied", - "issue_codes": [ - 1014, - 1015 - ], - "invalid_fields": [ - "username", - "password" - ] - }, - { - "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", - "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", - "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", - "category": "Connection", - "description": "Invalid hostname", - "issue_codes": [ - 1007 - ], - "invalid_fields": [ - "host" - ] - }, - { - "regex_name": "CONNECTION_PORT_CLOSED_REGEX", - "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", - "error_type": "CONNECTION_PORT_CLOSED_ERROR", - "category": "Connection", - "description": "Port closed or refused", - "issue_codes": [ - 1008 - ], - "invalid_fields": [ - "host", - "port" - ] - }, - { - "regex_name": "CONNECTION_HOST_DOWN_REGEX", - "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", - "error_type": "CONNECTION_HOST_DOWN_ERROR", - "category": "Connection", - "description": "Host unreachable", - "issue_codes": [ - 1009 - ], - "invalid_fields": [ - "host", - "port" - ] - }, - { - "regex_name": "CONNECTION_UNKNOWN_DATABASE_REGEX", - "message_template": "We were unable to connect to your database named \"%(database)s\". Please verify your database name and try again.", - "error_type": "CONNECTION_UNKNOWN_DATABASE_ERROR", - "category": "Connection", - "description": "Unknown database", - "issue_codes": [ - 1015 - ], - "invalid_fields": [ - "database" - ] - } - ] - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": true }, "RisingWave": { - "engine": "risingwave", - "engine_name": "RisingWave", - "module": "risingwave", - "documentation": { - "description": "RisingWave is a distributed streaming database.", - "logo": "risingwave.svg", - "homepage_url": "https://risingwave.com/", - "pypi_packages": [ - "psycopg2", - "sqlalchemy-risingwave" - ], - "connection_string": "risingwave://root@{hostname}:{port}/{database}?sslmode=disable", - "default_port": 4566, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "For localhost: localhost or 127.0.0.1. For AWS: endpoint URL", - "port": "Default 5432", - "database": "Database name" - }, - "notes": "The psycopg2 library comes bundled with Superset Docker images.", - "connection_examples": [ - { - "description": "Basic connection", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}" - }, - { - "description": "With SSL required", - "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}?sslmode=require" - } - ], - "docs_url": "https://github.com/risingwavelabs/sqlalchemy-risingwave", - "sqlalchemy_docs_url": "https://docs.sqlalchemy.org/en/13/dialects/postgresql.html", - "categories": [ - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" - ] - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": true, @@ -5050,86 +7923,424 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 94, - "max_score": 201, + "module": "superset.db_engine_specs.risingwave", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": true, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 63, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, "ssh_tunneling": true, "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": true, - "sql_validation": false + "sql_validation": false, + "score": 94, + "max_score": 201, + "documentation": { + "description": "RisingWave is a distributed streaming database.", + "logo": "risingwave.svg", + "homepage_url": "https://risingwave.com/", + "categories": [ + "Analytical Databases", + "Open Source" + ], + "pypi_packages": [ + "sqlalchemy-risingwave" + ], + "connection_string": "risingwave://root@{hostname}:{port}/{database}?sslmode=disable", + "default_port": 4566, + "docs_url": "https://github.com/risingwavelabs/sqlalchemy-risingwave", + "category": "Other Databases" + }, + "engine": "risingwave", + "engine_name": "RisingWave", + "engine_aliases": [ + "postgres" + ], + "default_driver": "", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true + }, + "SAP HANA": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": false, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.hana", + "limit_method": 2, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 30, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 27, + "max_score": 201, + "documentation": { + "description": "SAP HANA is an in-memory relational database and application platform.", + "logo": "sap-hana.png", + "homepage_url": "https://www.sap.com/products/technology-platform/hana.html", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], + "pypi_packages": [ + "hdbcli", + "sqlalchemy-hana" + ], + "install_instructions": "pip install apache_superset[hana]", + "connection_string": "hana://{username}:{password}@{host}:{port}", + "default_port": 30015, + "docs_url": "https://github.com/SAP/sqlalchemy-hana", + "category": "Other Databases" + }, + "engine": "hana", + "engine_name": "SAP HANA", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "SAP Sybase": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.sybase", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": false, + "max_column_name": 128, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 44, + "max_score": 201, + "documentation": { + "description": "SAP ASE (formerly Sybase) is an enterprise relational database.", + "logo": "sybase.png", + "homepage_url": "https://www.sap.com/products/technology-platform/sybase-ase.html", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], + "pypi_packages": [ + "sqlalchemy-sybase", + "pyodbc" + ], + "connection_string": "sybase+pyodbc://{username}:{password}@{dsn}", + "parameters": { + "username": "Database username", + "password": "Database password", + "dsn": "ODBC Data Source Name configured for SAP ASE" + }, + "notes": "Requires SAP ASE ODBC driver installed and configured as a DSN.", + "docs_url": "https://help.sap.com/docs/SAP_ASE", + "category": "Other Databases" + }, + "engine": "sybase", + "engine_name": "SAP Sybase", + "engine_aliases": [ + "sybase_sqlany" + ], + "default_driver": "pyodbc", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "SQLite": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": true, + "YEAR": true + }, + "module": "superset.db_engine_specs.sqlite", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": true, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": false, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 41, + "max_score": 201, + "documentation": { + "description": "SQLite is a self-contained, serverless SQL database engine.", + "logo": "sqlite.png", + "homepage_url": "https://www.sqlite.org/", + "categories": [ + "Traditional RDBMS", + "Open Source" + ], + "pypi_packages": [], + "connection_string": "sqlite:///path/to/file.db?check_same_thread=false", + "notes": "No additional library needed. SQLite is bundled with Python.", + "category": "Traditional RDBMS", + "custom_errors": [ + { + "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", + "message_template": "We can't seem to resolve the column \"%(column_name)s\"", + "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Column not found", + "issue_codes": [ + 1003, + 1004 + ] + } + ] + }, + "engine": "sqlite", + "engine_name": "SQLite", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "Shillelagh": { - "engine": "shillelagh", - "engine_name": "Shillelagh", - "module": "shillelagh", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": true, + "YEAR": true + }, + "module": "superset.db_engine_specs.shillelagh", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": true, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": false, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 41, + "max_score": 201, "documentation": { "description": "Shillelagh is a Python library that allows querying many data sources using SQL, including Google Sheets, CSV files, and APIs.", "logo": "shillelagh.png", "homepage_url": "https://shillelagh.readthedocs.io/", + "categories": [ + "Other Databases", + "Open Source" + ], "pypi_packages": [ "shillelagh[gsheetsapi]" ], "connection_string": "shillelagh://", "notes": "Shillelagh uses virtual tables to query external data sources. Google Sheets requires OAuth credentials configured.", - "categories": [ - "OTHER", - "OPEN_SOURCE" - ] + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "shillelagh", + "engine_name": "Shillelagh", + "engine_aliases": [], + "default_driver": "apsw", + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "SingleStore": { - "engine": "singlestore", - "engine_name": "SingleStore", - "module": "singlestore", - "documentation": { - "description": "SingleStore is a distributed SQL database for real-time analytics and transactions.", - "logo": "singlestore.png", - "homepage_url": "https://www.singlestore.com/", - "categories": [ - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "singlestoredb" - ], - "connection_string": "singlestoredb://{username}:{password}@{host}:{port}/{database}", - "default_port": 3306, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "SingleStore host", - "port": "SingleStore port (default 3306)", - "database": "Database name" - }, - "drivers": [ - { - "name": "singlestoredb", - "pypi_package": "singlestoredb", - "connection_string": "singlestoredb://{username}:{password}@{host}:{port}/{database}", - "is_recommended": true - } - ] - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -5153,32 +8364,147 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 68, - "max_score": 201, + "module": "superset.db_engine_specs.singlestore", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 256, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 68, + "max_score": 201, + "documentation": { + "description": "SingleStore is a distributed SQL database for real-time analytics and transactions.", + "logo": "singlestore.png", + "homepage_url": "https://www.singlestore.com/", + "categories": [ + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "singlestoredb" + ], + "connection_string": "singlestoredb://{username}:{password}@{host}:{port}/{database}", + "default_port": 3306, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "SingleStore host", + "port": "SingleStore port (default 3306)", + "database": "Database name" + }, + "drivers": [ + { + "name": "singlestoredb", + "pypi_package": "singlestoredb", + "connection_string": "singlestoredb://{username}:{password}@{host}:{port}/{database}", + "is_recommended": true + } + ], + "category": "Other Databases" + }, + "engine": "singlestoredb", + "engine_name": "SingleStore", + "engine_aliases": [], + "default_driver": "singlestoredb", + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "Snowflake": { - "engine": "snowflake", - "engine_name": "Snowflake", - "module": "snowflake", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.snowflake", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 256, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 72, + "max_score": 201, "documentation": { "description": "Snowflake is a cloud-native data warehouse.", "logo": "snowflake.svg", "homepage_url": "https://www.snowflake.com/", "categories": [ - "CLOUD_DATA_WAREHOUSES", - "ANALYTICAL_DATABASES", - "PROPRIETARY" + "Cloud Data Warehouses", + "Analytical Databases", + "Proprietary" ], "pypi_packages": [ "snowflake-sqlalchemy" @@ -5205,6 +8531,7 @@ ], "notes": "Schema is not required in connection string. Ensure user has privileges for all databases/schemas/tables/views/warehouses.", "docs_url": "https://docs.snowflake.com/en/user-guide/key-pair-auth.html", + "category": "Cloud Data Warehouses", "custom_errors": [ { "regex_name": "OBJECT_DOES_NOT_EXIST_REGEX", @@ -5228,247 +8555,83 @@ } ] }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": true, - "TEN_MINUTES": true, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": true, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 72, - "max_score": 201, - "joins": true, - "subqueries": true, + "engine": "snowflake", + "engine_name": "Snowflake", + "engine_aliases": [], + "default_driver": "snowflake", + "supports_file_upload": true, "supports_dynamic_schema": true, "supports_catalog": true, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Solr": { - "engine": "apache_solr", - "engine_name": "Apache Solr", - "module": "solr", - "documentation": { - "description": "Apache Solr is an open-source enterprise search platform.", - "logo": "apache-solr.png", - "homepage_url": "https://solr.apache.org/", - "categories": [ - "APACHE_PROJECTS", - "SEARCH_NOSQL", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "sqlalchemy-solr" - ], - "connection_string": "solr://{username}:{password}@{host}:{port}/{server_path}/{collection}[/?use_ssl=true|false]", - "default_port": 8983 - }, - "time_grains": { - "SECOND": false, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": false, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": false, - "SIX_HOURS": false, - "DAY": false, - "WEEK": false, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": false, - "QUARTER": false, - "QUARTER_YEAR": false, - "YEAR": false - }, - "score": 20, - "max_score": 201, - "joins": false, - "subqueries": false, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "Apache Spark SQL": { - "engine": "apache_spark_sql", - "engine_name": "Apache Spark SQL", - "module": "spark", - "documentation": { - "description": "Apache Spark SQL is a module for structured data processing.", - "logo": "apache-spark.png", - "homepage_url": "https://spark.apache.org/sql/", - "pypi_packages": [ - "pyhive", - "pyhive", - "pyhive" - ], - "install_instructions": "pip install \"apache-superset[presto]\"", - "connection_string": "hive://hive@{hostname}:{port}/{database}", - "default_port": 10000, - "parameters": { - "hostname": "Presto coordinator hostname", - "port": "Presto coordinator port (default 8080)", - "database": "Catalog name" - }, - "drivers": [ - { - "name": "PyHive", - "pypi_package": "pyhive", - "connection_string": "presto://{hostname}:{port}/{database}", - "is_recommended": true - } - ], - "categories": [ - "APACHE_PROJECTS", - "QUERY_ENGINES", - "OPEN_SOURCE" - ] - }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": true, - "WEEK_STARTING_MONDAY": false, - "WEEK_ENDING_SATURDAY": true, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 140, - "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": true, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": true, - "query_cost_estimation": true, - "sql_validation": false - }, - "SQLite": { - "engine": "sqlite", - "engine_name": "SQLite", - "module": "sqlite", - "documentation": { - "description": "SQLite is a self-contained, serverless SQL database engine.", - "logo": "sqlite.png", - "homepage_url": "https://www.sqlite.org/", - "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" - ], - "pypi_packages": [], - "connection_string": "sqlite:///path/to/file.db?check_same_thread=false", - "notes": "No additional library needed. SQLite is bundled with Python.", - "custom_errors": [ - { - "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", - "message_template": "We can't seem to resolve the column \"%(column_name)s\"", - "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", - "category": "Query", - "description": "Column not found", - "issue_codes": [ - 1003, - 1004 - ] - } - ] - }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": true, - "THIRTY_SECONDS": true, - "MINUTE": true, - "FIVE_MINUTES": true, - "TEN_MINUTES": true, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": true, - "HALF_HOUR": true, - "HOUR": true, - "SIX_HOURS": true, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": true, - "WEEK_STARTING_MONDAY": true, - "WEEK_ENDING_SATURDAY": true, - "WEEK_ENDING_SUNDAY": true, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": true, - "YEAR": true - }, - "score": 41, - "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": true }, "StarRocks": { - "engine": "starrocks", - "engine_name": "StarRocks", - "module": "starrocks", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": false, + "MINUTE": true, + "FIVE_MINUTES": false, + "TEN_MINUTES": false, + "FIFTEEN_MINUTES": false, + "THIRTY_MINUTES": false, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.starrocks", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": false, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 89, + "max_score": 201, "documentation": { "description": "StarRocks is a high-performance analytical database for real-time analytics.", "logo": "starrocks.png", "homepage_url": "https://www.starrocks.io/", + "categories": [ + "Analytical Databases", + "Open Source" + ], "pypi_packages": [ - "mysqlclient", "starrocks" ], "connection_string": "starrocks://{username}:{password}@{host}:{port}/{catalog}.{database}", @@ -5477,43 +8640,11 @@ "username": "Database username", "password": "Database password", "host": "StarRocks FE host", - "database": "Database name", "port": "Query port (default 9030)", - "catalog": "Catalog name" + "catalog": "Catalog name", + "database": "Database name" }, - "host_examples": [ - { - "platform": "Localhost", - "host": "localhost or 127.0.0.1" - }, - { - "platform": "Docker on Linux", - "host": "172.18.0.1" - }, - { - "platform": "Docker on macOS", - "host": "docker.for.mac.host.internal" - }, - { - "platform": "On-premise", - "host": "IP address or hostname" - } - ], "drivers": [ - { - "name": "mysqlclient", - "pypi_package": "mysqlclient", - "connection_string": "mysql://{username}:{password}@{host}/{database}", - "is_recommended": true, - "notes": "Recommended driver. May fail with caching_sha2_password auth." - }, - { - "name": "mysql-connector-python", - "pypi_package": "mysql-connector-python", - "connection_string": "mysql+mysqlconnector://{username}:{password}@{host}/{database}", - "is_recommended": false, - "notes": "Required for newer MySQL databases using caching_sha2_password authentication." - }, { "name": "starrocks", "pypi_package": "starrocks", @@ -5535,10 +8666,6 @@ "notes": "Pure Python MySQL driver, no compilation required." } ], - "categories": [ - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" - ], "compatible_databases": [ { "name": "CelerData", @@ -5546,9 +8673,9 @@ "logo": "celerdata.png", "homepage_url": "https://celerdata.com/", "categories": [ - "ANALYTICAL_DATABASES", - "CLOUD_DATA_WAREHOUSES", - "HOSTED_OPEN_SOURCE" + "Analytical Databases", + "Cloud Data Warehouses", + "Hosted Open Source" ], "pypi_packages": [ "starrocks" @@ -5565,6 +8692,7 @@ "docs_url": "https://docs.celerdata.com/" } ], + "category": "Analytical Databases", "custom_errors": [ { "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", @@ -5596,158 +8724,96 @@ } ] }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": false, - "THIRTY_SECONDS": false, - "MINUTE": true, - "FIVE_MINUTES": false, - "TEN_MINUTES": false, - "FIFTEEN_MINUTES": false, - "THIRTY_MINUTES": false, - "HALF_HOUR": false, - "HOUR": true, - "SIX_HOURS": false, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": false, - "WEEK_STARTING_MONDAY": true, - "WEEK_ENDING_SATURDAY": false, - "WEEK_ENDING_SUNDAY": false, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 69, - "max_score": 201, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": true, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, + "engine": "starrocks", + "engine_name": "StarRocks", + "engine_aliases": [], + "default_driver": "starrocks", "supports_file_upload": true, - "user_impersonation": true, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true }, "Superset meta database": { - "engine": "superset_meta_database", - "engine_name": "Superset meta database", - "module": "superset", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": true, + "YEAR": true + }, + "module": "superset.db_engine_specs.superset", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": true, + "user_impersonation": false, + "file_upload": false, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": false, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 31, + "max_score": 201, "documentation": { "description": "Superset meta database is an experimental feature that enables querying across multiple configured databases using a single connection.", "logo": "superset.svg", "homepage_url": "https://superset.apache.org/", - "pypi_packages": [ - "shillelagh[gsheetsapi]" + "categories": [ + "Other Databases" ], + "pypi_packages": [], "connection_string": "superset://", "notes": "This is an internal Superset feature. Enable with ENABLE_SUPERSET_META_DB feature flag. Allows cross-database queries using virtual tables.", - "categories": [ - "OTHER" - ] + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "superset", + "engine_name": "Superset meta database", + "engine_aliases": [], + "default_driver": "", + "supports_file_upload": false, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false - }, - "SAP Sybase": { - "engine": "sap_sybase", - "engine_name": "SAP Sybase", - "module": "sybase", - "documentation": { - "description": "SAP ASE (formerly Sybase) is an enterprise relational database.", - "logo": "sybase.png", - "homepage_url": "https://www.sap.com/products/technology-platform/sybase-ase.html", - "pypi_packages": [ - "pymssql", - "sqlalchemy-sybase", - "pyodbc" - ], - "connection_string": "sybase+pyodbc://{username}:{password}@{dsn}", - "default_port": 1433, - "drivers": [ - { - "name": "pymssql", - "pypi_package": "pymssql", - "connection_string": "mssql+pymssql://{username}:{password}@{host}:{port}/{database}", - "is_recommended": true - }, - { - "name": "pyodbc", - "pypi_package": "pyodbc", - "connection_string": "mssql+pyodbc:///?odbc_connect=Driver%3D%7BODBC+Driver+17+for+SQL+Server%7D%3BServer%3Dtcp%3A%3C{host}%3E%2C1433%3BDatabase%3D{database}%3BUid%3D{username}%3BPwd%3D{password}%3BEncrypt%3Dyes%3BConnection+Timeout%3D30", - "is_recommended": false, - "notes": "Connection string must be URL-encoded. Special characters like @ need encoding." - } - ], - "docs_url": "https://help.sap.com/docs/SAP_ASE", - "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" - ], - "parameters": { - "username": "Database username", - "password": "Database password", - "dsn": "ODBC Data Source Name configured for SAP ASE" - }, - "notes": "Requires SAP ASE ODBC driver installed and configured as a DSN." - }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "TDengine": { - "engine": "tdengine", - "engine_name": "TDengine", - "module": "tdengine", - "documentation": { - "description": "TDengine is a high-performance time-series database for IoT.", - "logo": "tdengine.png", - "homepage_url": "https://tdengine.com/", - "categories": [ - "TIME_SERIES", - "OPEN_SOURCE" - ], - "pypi_packages": [ - "taospy", - "taos-ws-py" - ], - "connection_string": "taosws://{user}:{password}@{host}:{port}", - "default_port": 6041, - "connection_examples": [ - { - "description": "Local connection", - "connection_string": "taosws://root:taosdata@127.0.0.1:6041" - } - ], - "docs_url": "https://www.tdengine.com" - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": false, @@ -5771,54 +8837,74 @@ "QUARTER_YEAR": false, "YEAR": false }, - "score": 25, - "max_score": 201, + "module": "superset.db_engine_specs.tdengine", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 64, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "Teradata": { - "engine": "teradata", - "engine_name": "Teradata", - "module": "teradata", + "sql_validation": false, + "score": 25, + "max_score": 201, "documentation": { - "description": "Teradata is an enterprise data warehouse platform.", - "logo": "teradata.png", - "homepage_url": "https://www.teradata.com/", + "description": "TDengine is a high-performance time-series database for IoT.", + "logo": "tdengine.png", + "homepage_url": "https://tdengine.com/", "categories": [ - "TRADITIONAL_RDBMS", - "PROPRIETARY" + "Time Series Databases", + "Open Source" ], "pypi_packages": [ - "teradatasqlalchemy" + "taospy", + "taos-ws-py" ], - "connection_string": "teradatasql://{user}:{password}@{host}", - "default_port": 1025, - "drivers": [ + "connection_string": "taosws://{user}:{password}@{host}:{port}", + "default_port": 6041, + "connection_examples": [ { - "name": "teradatasqlalchemy (Recommended)", - "pypi_package": "teradatasqlalchemy", - "connection_string": "teradatasql://{user}:{password}@{host}", - "is_recommended": true, - "notes": "No ODBC drivers required." - }, - { - "name": "sqlalchemy-teradata (ODBC)", - "pypi_package": "sqlalchemy-teradata", - "is_recommended": false, - "notes": "Requires ODBC driver installation.", - "docs_url": "https://downloads.teradata.com/download/connectivity/odbc-driver/linux" + "description": "Local connection", + "connection_string": "taosws://root:taosdata@127.0.0.1:6041" } - ] + ], + "docs_url": "https://www.tdengine.com", + "category": "Other Databases" }, + "engine": "taosws", + "engine_name": "TDengine", + "engine_aliases": [], + "default_driver": "taosws", + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "Teradata": { "time_grains": { "SECOND": false, "FIVE_SECONDS": false, @@ -5842,31 +8928,147 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 27, - "max_score": 201, + "module": "superset.db_engine_specs.teradata", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": 30, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 27, + "max_score": 201, + "documentation": { + "description": "Teradata is an enterprise data warehouse platform.", + "logo": "teradata.png", + "homepage_url": "https://www.teradata.com/", + "categories": [ + "Traditional RDBMS", + "Proprietary" + ], + "pypi_packages": [ + "teradatasqlalchemy" + ], + "connection_string": "teradatasql://{user}:{password}@{host}", + "default_port": 1025, + "drivers": [ + { + "name": "teradatasqlalchemy (Recommended)", + "pypi_package": "teradatasqlalchemy", + "connection_string": "teradatasql://{user}:{password}@{host}", + "is_recommended": true, + "notes": "No ODBC drivers required." + }, + { + "name": "sqlalchemy-teradata (ODBC)", + "pypi_package": "sqlalchemy-teradata", + "is_recommended": false, + "notes": "Requires ODBC driver installation.", + "docs_url": "https://downloads.teradata.com/download/connectivity/odbc-driver/linux" + } + ], + "category": "Other Databases" + }, + "engine": "teradatasql", + "engine_name": "Teradata", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "TimescaleDB": { - "engine": "timescaledb", - "engine_name": "TimescaleDB", - "module": "timescaledb", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.timescaledb", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 34, + "max_score": 201, "documentation": { "description": "TimescaleDB is an open-source relational database for time-series and analytics, built on PostgreSQL.", "logo": "timescale.png", "homepage_url": "https://www.timescale.com/", "categories": [ - "ANALYTICAL_DATABASES", - "OPEN_SOURCE" + "Analytical Databases", + "Open Source" ], "pypi_packages": [ "psycopg2" @@ -5880,34 +9082,84 @@ } ], "notes": "Uses the PostgreSQL driver. psycopg2 comes bundled with Superset.", - "docs_url": "https://docs.timescale.com/" + "docs_url": "https://docs.timescale.com/", + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "timescaledb", + "engine_name": "TimescaleDB", + "engine_aliases": [], + "default_driver": "psycopg2", + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "supports_dynamic_catalog": false }, "Trino": { - "engine": "trino", - "engine_name": "Trino", - "module": "trino", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": false, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.trino", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": true, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, + "user_impersonation": true, + "file_upload": true, + "get_extra_table_metadata": true, + "dbapi_exception_mapping": true, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": true, + "get_metrics": false, + "where_latest_partition": true, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": false, + "score": 149, + "max_score": 201, "documentation": { "description": "Trino is a distributed SQL query engine for big data analytics.", "logo": "trino.png", "homepage_url": "https://trino.io/", "categories": [ - "QUERY_ENGINES", - "OPEN_SOURCE" + "Query Engines", + "Open Source" ], "pypi_packages": [ "trino" @@ -5937,9 +9189,9 @@ "logo": "starburst.png", "homepage_url": "https://www.starburst.io/platform/starburst-galaxy/", "categories": [ - "QUERY_ENGINES", - "CLOUD_DATA_WAREHOUSES", - "HOSTED_OPEN_SOURCE" + "Query Engines", + "Cloud Data Warehouses", + "Hosted Open Source" ], "pypi_packages": [ "trino" @@ -5960,8 +9212,8 @@ "logo": "starburst.png", "homepage_url": "https://www.starburst.io/platform/starburst-enterprise/", "categories": [ - "QUERY_ENGINES", - "HOSTED_OPEN_SOURCE" + "Query Engines", + "Hosted Open Source" ], "pypi_packages": [ "trino" @@ -5969,72 +9221,19 @@ "connection_string": "trino://{username}:{password}@{hostname}:{port}/{catalog}", "docs_url": "https://docs.starburst.io/" } - ] + ], + "category": "Query Engines" }, - "time_grains": { - "SECOND": true, - "FIVE_SECONDS": true, - "THIRTY_SECONDS": true, - "MINUTE": true, - "FIVE_MINUTES": true, - "TEN_MINUTES": true, - "FIFTEEN_MINUTES": true, - "THIRTY_MINUTES": false, - "HALF_HOUR": true, - "HOUR": true, - "SIX_HOURS": true, - "DAY": true, - "WEEK": true, - "WEEK_STARTING_SUNDAY": true, - "WEEK_STARTING_MONDAY": true, - "WEEK_ENDING_SATURDAY": true, - "WEEK_ENDING_SUNDAY": true, - "MONTH": true, - "QUARTER": true, - "QUARTER_YEAR": false, - "YEAR": true - }, - "score": 149, - "max_score": 201, - "joins": true, - "subqueries": true, + "engine": "trino", + "engine_name": "Trino", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, "supports_dynamic_schema": true, "supports_catalog": true, - "supports_dynamic_catalog": false, - "ssh_tunneling": true, - "query_cancelation": true, - "supports_file_upload": true, - "user_impersonation": true, - "query_cost_estimation": true, - "sql_validation": false + "supports_dynamic_catalog": true }, "Vertica": { - "engine": "vertica", - "engine_name": "Vertica", - "module": "vertica", - "documentation": { - "description": "Vertica is a column-oriented analytics database.", - "logo": "vertica.png", - "homepage_url": "https://www.vertica.com/", - "categories": [ - "ANALYTICAL_DATABASES", - "PROPRIETARY" - ], - "pypi_packages": [ - "sqlalchemy-vertica-python" - ], - "connection_string": "vertica+vertica_python://{username}:{password}@{host}/{database}", - "default_port": 5433, - "parameters": { - "username": "Database username", - "password": "Database password", - "host": "localhost, IP address, or hostname (cloud or on-prem)", - "database": "Database name", - "port": "Default 5433" - }, - "notes": "Supports load balancer backup host configuration.", - "docs_url": "http://www.vertica.com/" - }, "time_grains": { "SECOND": true, "FIVE_SECONDS": true, @@ -6058,31 +9257,140 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 34, - "max_score": 201, + "module": "superset.db_engine_specs.vertica", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": true, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false + "sql_validation": false, + "score": 34, + "max_score": 201, + "documentation": { + "description": "Vertica is a column-oriented analytics database.", + "logo": "vertica.png", + "homepage_url": "https://www.vertica.com/", + "categories": [ + "Analytical Databases", + "Proprietary" + ], + "pypi_packages": [ + "sqlalchemy-vertica-python" + ], + "connection_string": "vertica+vertica_python://{username}:{password}@{host}/{database}", + "default_port": 5433, + "parameters": { + "username": "Database username", + "password": "Database password", + "host": "localhost, IP address, or hostname (cloud or on-prem)", + "database": "Database name", + "port": "Default 5433" + }, + "notes": "Supports load balancer backup host configuration.", + "docs_url": "http://www.vertica.com/", + "category": "Analytical Databases" + }, + "engine": "vertica", + "engine_name": "Vertica", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false }, "YDB": { - "engine": "ydb", - "engine_name": "YDB", - "module": "ydb", + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": false, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": true, + "HALF_HOUR": false, + "HOUR": true, + "SIX_HOURS": false, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": false, + "WEEK_STARTING_MONDAY": false, + "WEEK_ENDING_SATURDAY": false, + "WEEK_ENDING_SUNDAY": false, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.ydb", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": false, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, + "query_cost_estimation": false, + "sql_validation": false, + "score": 23, + "max_score": 201, "documentation": { "description": "YDB is a distributed SQL database by Yandex.", "logo": "ydb.svg", "homepage_url": "https://ydb.tech/", "categories": [ - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ "ydb-sqlalchemy" @@ -6131,11 +9439,25 @@ } } } - ] + ], + "category": "Other Databases" }, + "engine": "yql", + "engine_name": "YDB", + "engine_aliases": [ + "yql+ydb", + "ydb" + ], + "default_driver": "ydb", + "supports_file_upload": false, + "supports_dynamic_schema": false, + "supports_catalog": false, + "supports_dynamic_catalog": false + }, + "YugabyteDB": { "time_grains": { "SECOND": true, - "FIVE_SECONDS": false, + "FIVE_SECONDS": true, "THIRTY_SECONDS": true, "MINUTE": true, "FIVE_MINUTES": true, @@ -6156,32 +9478,49 @@ "QUARTER_YEAR": false, "YEAR": true }, - "score": 23, - "max_score": 201, + "module": "superset.db_engine_specs.yugabytedb", + "limit_method": 1, + "limit_clause": true, "joins": true, "subqueries": true, - "supports_dynamic_schema": false, - "supports_catalog": false, - "supports_dynamic_catalog": false, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": false, + "function_names": false, + "user_impersonation": false, + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": false, + "catalog": false, + "dynamic_catalog": false, "ssh_tunneling": true, "query_cancelation": false, - "supports_file_upload": false, - "user_impersonation": false, + "get_metrics": false, + "where_latest_partition": false, + "expand_data": false, "query_cost_estimation": false, - "sql_validation": false - }, - "YugabyteDB": { - "engine": "yugabytedb", - "engine_name": "YugabyteDB", - "module": "yugabytedb", + "sql_validation": false, + "score": 34, + "max_score": 201, "documentation": { "description": "YugabyteDB is a distributed SQL database built on top of PostgreSQL.", "logo": "yugabyte.png", "homepage_url": "https://www.yugabyte.com/", "categories": [ - "CLOUD_DATA_WAREHOUSES", - "TRADITIONAL_RDBMS", - "OPEN_SOURCE" + "Cloud Data Warehouses", + "Traditional RDBMS", + "Open Source" ], "pypi_packages": [ "psycopg2" @@ -6189,22 +9528,176 @@ "connection_string": "postgresql://{username}:{password}@{host}:{port}/{database}", "default_port": 5433, "notes": "Uses the PostgreSQL driver. psycopg2 comes bundled with Superset.", - "docs_url": "https://docs.yugabyte.com/" + "docs_url": "https://docs.yugabyte.com/", + "category": "Other Databases" }, - "time_grains": {}, - "score": 0, - "max_score": 0, - "joins": true, - "subqueries": true, + "engine": "yugabytedb", + "engine_name": "YugabyteDB", + "engine_aliases": [], + "default_driver": "psycopg2", + "supports_file_upload": true, "supports_dynamic_schema": false, "supports_catalog": false, - "supports_dynamic_catalog": false, - "ssh_tunneling": false, - "query_cancelation": false, - "supports_file_upload": false, + "supports_dynamic_catalog": false + }, + "base": { + "time_grains": { + "SECOND": true, + "FIVE_SECONDS": true, + "THIRTY_SECONDS": true, + "MINUTE": true, + "FIVE_MINUTES": true, + "TEN_MINUTES": true, + "FIFTEEN_MINUTES": true, + "THIRTY_MINUTES": false, + "HALF_HOUR": true, + "HOUR": true, + "SIX_HOURS": true, + "DAY": true, + "WEEK": true, + "WEEK_STARTING_SUNDAY": true, + "WEEK_STARTING_MONDAY": true, + "WEEK_ENDING_SATURDAY": true, + "WEEK_ENDING_SUNDAY": true, + "MONTH": true, + "QUARTER": true, + "QUARTER_YEAR": false, + "YEAR": true + }, + "module": "superset.db_engine_specs.presto", + "limit_method": 1, + "limit_clause": true, + "joins": true, + "subqueries": true, + "alias_in_select": true, + "alias_in_orderby": true, + "time_groupby_inline": false, + "alias_to_source_column": false, + "order_by_not_in_select": true, + "expressions_in_orderby": false, + "cte_in_subquery": true, + "max_column_name": null, + "sql_comments": true, + "escaped_colons": true, + "masked_encrypted_extra": false, + "column_type_mapping": true, + "function_names": true, "user_impersonation": false, - "query_cost_estimation": false, - "sql_validation": false + "file_upload": true, + "get_extra_table_metadata": false, + "dbapi_exception_mapping": false, + "custom_errors": false, + "dynamic_schema": true, + "catalog": true, + "dynamic_catalog": true, + "ssh_tunneling": true, + "query_cancelation": false, + "get_metrics": false, + "where_latest_partition": true, + "expand_data": false, + "query_cost_estimation": true, + "sql_validation": false, + "score": 109, + "max_score": 201, + "documentation": { + "pypi_packages": [], + "connection_string": "engine+driver://user:password@host:port/dbname[?key=value&key=value...]", + "category": "Other Databases", + "custom_errors": [ + { + "regex_name": "COLUMN_DOES_NOT_EXIST_REGEX", + "message_template": "We can't seem to resolve the column \"%(column_name)s\" at line %(location)s.", + "error_type": "COLUMN_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Column not found", + "issue_codes": [ + 1003, + 1004 + ] + }, + { + "regex_name": "TABLE_DOES_NOT_EXIST_REGEX", + "message_template": "The table \"%(table_name)s\" does not exist. A valid table must be used to run this query.", + "error_type": "TABLE_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Table not found", + "issue_codes": [ + 1003, + 1005 + ] + }, + { + "regex_name": "SCHEMA_DOES_NOT_EXIST_REGEX", + "message_template": "The schema \"%(schema_name)s\" does not exist. A valid schema must be used to run this query.", + "error_type": "SCHEMA_DOES_NOT_EXIST_ERROR", + "category": "Query", + "description": "Schema not found", + "issue_codes": [ + 1003, + 1016 + ] + }, + { + "regex_name": "CONNECTION_ACCESS_DENIED_REGEX", + "message_template": "Either the username \"%(username)s\" or the password is incorrect.", + "error_type": "CONNECTION_ACCESS_DENIED_ERROR", + "category": "Authentication", + "description": "Access denied", + "issue_codes": [ + 1014, + 1015 + ] + }, + { + "regex_name": "CONNECTION_INVALID_HOSTNAME_REGEX", + "message_template": "The hostname \"%(hostname)s\" cannot be resolved.", + "error_type": "CONNECTION_INVALID_HOSTNAME_ERROR", + "category": "Connection", + "description": "Invalid hostname", + "issue_codes": [ + 1007 + ] + }, + { + "regex_name": "CONNECTION_HOST_DOWN_REGEX", + "message_template": "The host \"%(hostname)s\" might be down, and can't be reached on port %(port)s.", + "error_type": "CONNECTION_HOST_DOWN_ERROR", + "category": "Connection", + "description": "Host unreachable", + "issue_codes": [ + 1009 + ] + }, + { + "regex_name": "CONNECTION_PORT_CLOSED_REGEX", + "message_template": "Port %(port)s on hostname \"%(hostname)s\" refused the connection.", + "error_type": "CONNECTION_PORT_CLOSED_ERROR", + "category": "Connection", + "description": "Port closed or refused", + "issue_codes": [ + 1008 + ] + }, + { + "regex_name": "CONNECTION_UNKNOWN_DATABASE_ERROR", + "message_template": "Unable to connect to catalog named \"%(catalog_name)s\".", + "error_type": "CONNECTION_UNKNOWN_DATABASE_ERROR", + "category": "Connection", + "description": "Unknown database", + "issue_codes": [ + 1015 + ] + } + ] + }, + "engine": "base", + "engine_name": "base", + "engine_aliases": [], + "default_driver": null, + "supports_file_upload": true, + "supports_dynamic_schema": true, + "supports_catalog": true, + "supports_dynamic_catalog": true } } } diff --git a/docs/src/theme/DocVersionBadge/index.js b/docs/src/theme/DocVersionBadge/index.js index a76ced7e254..23b87463cb5 100644 --- a/docs/src/theme/DocVersionBadge/index.js +++ b/docs/src/theme/DocVersionBadge/index.js @@ -30,19 +30,30 @@ import { DownOutlined } from '@ant-design/icons'; import styles from './styles.module.css'; +// Map each versioned plugin id to the URL prefix it actually serves +// content from. Three of the four routeBasePath values differ from +// their pluginId β€” the default preset-classic docs plugin lives at +// `/user-docs`, and admin_docs / developer_docs use hyphens in their +// URLs even though the plugin ids use underscores. Without this map +// the basePath derivation below would mis-split the pathname for +// those sections and the version dropdown would jump to the section +// root instead of preserving the current page. +// +// Keep in sync with the `routeBasePath` values in docusaurus.config.ts. +const PLUGIN_ID_TO_BASE_PATH = { + default: '/user-docs', + components: '/components', + admin_docs: '/admin-docs', + developer_docs: '/developer-docs', +}; + export default function DocVersionBadge() { const activePlugin = useActivePlugin(); const { pathname } = useLocation(); const pluginId = activePlugin?.pluginId; const [versionedPath, setVersionedPath] = React.useState(''); - // Show version selector for all versioned sections - const isVersioned = [ - 'default', // main docs - 'components', - 'tutorials', - 'developer_portal', - ].includes(pluginId); + const isVersioned = pluginId && pluginId in PLUGIN_ID_TO_BASE_PATH; const { preferredVersion } = useDocsPreferredVersion(pluginId); const versions = useVersions(pluginId); @@ -53,7 +64,8 @@ export default function DocVersionBadge() { if (!pathname || !version || !pluginId) return; let relativePath = ''; - const basePath = pluginId === 'default' ? '/docs' : `/${pluginId}`; + const basePath = PLUGIN_ID_TO_BASE_PATH[pluginId]; + if (!basePath) return; // Handle different version path patterns if (pathname.includes(basePath)) { diff --git a/docs/src/theme/DocVersionBanner/index.js b/docs/src/theme/DocVersionBanner/index.js deleted file mode 100644 index 3704128bedc..00000000000 --- a/docs/src/theme/DocVersionBanner/index.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React, { useState, useEffect } from 'react'; -import DocVersionBanner from '@theme-original/DocVersionBanner'; -import { - useActivePlugin, - useDocsVersion, - useVersions, -} from '@docusaurus/plugin-content-docs/client'; -import { useLocation } from '@docusaurus/router'; -import { useDocsPreferredVersion } from '@docusaurus/theme-common'; -import { Dropdown } from 'antd'; -import { DownOutlined } from '@ant-design/icons'; - -import styles from './styles.module.css'; - -export default function DocVersionBannerWrapper(props) { - const activePlugin = useActivePlugin(); - const { pathname } = useLocation(); - const pluginId = activePlugin?.pluginId; - const [versionedPath, setVersionedPath] = useState(''); - - // Only show version selector for tutorials - // Main docs, components, and developer_portal use the DocVersionBadge component instead - const isVersioned = pluginId && ['tutorials'].includes(pluginId); - - const { preferredVersion } = useDocsPreferredVersion(pluginId); - const versions = useVersions(pluginId); - const version = useDocsVersion(); - - // Early return if required data is not available - if (!isVersioned || !versions || !version) { - return ; - } - - // Extract the current page path relative to the version - useEffect(() => { - if (!pathname || !version || !pluginId) return; - - let relativePath = ''; - - // Handle different version path patterns - if (pathname.includes(`/${pluginId}/`)) { - // Extract the part after the version - // Example: /components/1.1.0/ui-components/button -> /ui-components/button - const parts = pathname.split(`/${pluginId}/`); - if (parts.length > 1) { - const afterPluginId = parts[1]; - // Find where the version part ends - const versionParts = afterPluginId.split('/'); - if (versionParts.length > 1) { - // Remove the version part and join the rest - relativePath = '/' + versionParts.slice(1).join('/'); - } - } - } - - setVersionedPath(relativePath); - }, [pathname, version, pluginId]); - - // Create dropdown items for version selection - const items = versions.map(v => { - // Construct the URL for this version, preserving the current page - // v.path is the version-specific path like "1.0.0" or "next" - let versionUrl = v.path; - - if (versionedPath) { - // Construct the full URL with the version and the current page path - versionUrl = v.path + versionedPath; - } - - return { - key: v.name, - label: ( - - {v.label} - {v.name === version.name && ' (current)'} - {v.name === preferredVersion?.name && ' (preferred)'} - - ), - }; - }); - - return ( - <> - - {isVersioned && ( - - )} - - ); -} diff --git a/docs/static/feature-flags.json b/docs/static/feature-flags.json index 516115ac0ae..8f7623e471d 100644 --- a/docs/static/feature-flags.json +++ b/docs/static/feature-flags.json @@ -81,6 +81,12 @@ "lifecycle": "development", "description": "Expand nested types in Presto into extra columns/arrays. Experimental, doesn't work with all nested types." }, + { + "name": "SEMANTIC_LAYERS", + "default": false, + "lifecycle": "development", + "description": "Enable semantic layers and show semantic views alongside datasets" + }, { "name": "TABLE_V2_TIME_COMPARISON_ENABLED", "default": false, @@ -168,7 +174,7 @@ "default": false, "lifecycle": "testing", "description": "Allows users to add a superset:// DB that can query across databases. Experimental with potential security/performance risks. See SUPERSET_META_DB_LIMIT.", - "docs": "https://superset.apache.org/docs/configuration/databases/#querying-across-databases" + "docs": "https://superset.apache.org/user-docs/databases/supported/superset-meta-database" }, { "name": "ESTIMATE_QUERY_COST", diff --git a/docs/static/img/screenshots/dashboard.jpg b/docs/static/img/screenshots/dashboard.jpg index 9062d7a479d..2bea533aa7a 100644 Binary files a/docs/static/img/screenshots/dashboard.jpg and b/docs/static/img/screenshots/dashboard.jpg differ diff --git a/docs/static/img/screenshots/explore.jpg b/docs/static/img/screenshots/explore.jpg index 8ac41b65796..916f119bcd4 100644 Binary files a/docs/static/img/screenshots/explore.jpg and b/docs/static/img/screenshots/explore.jpg differ diff --git a/docs/static/img/screenshots/gallery.jpg b/docs/static/img/screenshots/gallery.jpg index 2312bd37982..e20749639dd 100644 Binary files a/docs/static/img/screenshots/gallery.jpg and b/docs/static/img/screenshots/gallery.jpg differ diff --git a/docs/static/img/screenshots/sql_lab.jpg b/docs/static/img/screenshots/sql_lab.jpg index d8f5a964adb..a3134bd8c98 100644 Binary files a/docs/static/img/screenshots/sql_lab.jpg and b/docs/static/img/screenshots/sql_lab.jpg differ diff --git a/docs/static/img/tutorial/create_pivot.png b/docs/static/img/tutorial/create_pivot.png index 2a24ee25153..52abb7fc048 100644 Binary files a/docs/static/img/tutorial/create_pivot.png and b/docs/static/img/tutorial/create_pivot.png differ diff --git a/docs/static/img/tutorial/publish_button_dashboard.png b/docs/static/img/tutorial/publish_button_dashboard.png index c20a097dfdc..9c4f29e4055 100644 Binary files a/docs/static/img/tutorial/publish_button_dashboard.png and b/docs/static/img/tutorial/publish_button_dashboard.png differ diff --git a/docs/static/img/tutorial/tutorial_08_sources_tables.png b/docs/static/img/tutorial/tutorial_08_sources_tables.png index 67252a706e9..dee2e47caa1 100644 Binary files a/docs/static/img/tutorial/tutorial_08_sources_tables.png and b/docs/static/img/tutorial/tutorial_08_sources_tables.png differ diff --git a/docs/static/img/tutorial/tutorial_chart_resize.png b/docs/static/img/tutorial/tutorial_chart_resize.png index 50983127aec..c40b90da3c2 100644 Binary files a/docs/static/img/tutorial/tutorial_chart_resize.png and b/docs/static/img/tutorial/tutorial_chart_resize.png differ diff --git a/docs/static/img/tutorial/tutorial_edit_button.png b/docs/static/img/tutorial/tutorial_edit_button.png index 9028fa5743f..6ae85634f8f 100644 Binary files a/docs/static/img/tutorial/tutorial_edit_button.png and b/docs/static/img/tutorial/tutorial_edit_button.png differ diff --git a/docs/static/img/tutorial/tutorial_first_dashboard.png b/docs/static/img/tutorial/tutorial_first_dashboard.png index f0382290766..ce925328f24 100644 Binary files a/docs/static/img/tutorial/tutorial_first_dashboard.png and b/docs/static/img/tutorial/tutorial_first_dashboard.png differ diff --git a/docs/static/img/tutorial/tutorial_save_slice.png b/docs/static/img/tutorial/tutorial_save_slice.png index 89e26773838..91ba6f9685d 100644 Binary files a/docs/static/img/tutorial/tutorial_save_slice.png and b/docs/static/img/tutorial/tutorial_save_slice.png differ diff --git a/docs/tutorials_versions.json b/docs/tutorials_versions.json deleted file mode 100644 index 5e1abcd8a61..00000000000 --- a/docs/tutorials_versions.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "1.0.0" -] diff --git a/docs/yarn.lock b/docs/yarn.lock index 872278c85d1..9406d4efde7 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -212,10 +212,10 @@ resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz" integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== -"@ant-design/icons@^6.1.1", "@ant-design/icons@^6.2.2": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-6.2.2.tgz#ed33a140ff35d7bcb6e48f01a6970ea6939cef99" - integrity sha512-zlJtE7AMbG12TeYVPhtBXwNpFInNy8mjLzcIm+0BPw16/b8ODG87YJ1G37VIF5VFscdgfsf6EweAFPTobu/3iQ== +"@ant-design/icons@^6.1.1", "@ant-design/icons@^6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-6.2.3.tgz#66e1c7fdea009b9c3fab6964062bedc76f308ad8" + integrity sha512-Pl3aoAtxQeKryYnt6VvDJtOxMOtA8wrRSACe/pTjOAIG3fdHrWm6Ivb4ku9tsFjYroSXBKirvuxG4QkwBXD9gg== dependencies: "@ant-design/colors" "^8.0.1" "@ant-design/icons-svg" "^4.4.2" @@ -232,19 +232,14 @@ json2mq "^0.2.0" throttle-debounce "^5.0.0" -"@antfu/install-pkg@^1.0.0": +"@antfu/install-pkg@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz#78fa036be1a6081b5a77a5cf59f50c7752b6ba26" integrity sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ== dependencies: package-manager-detector "^1.3.0" tinyexec "^1.0.1" -"@antfu/utils@^8.1.0": - version "8.1.1" - resolved "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz" - integrity sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ== - "@apidevtools/json-schema-ref-parser@^15.3.3": version "15.3.5" resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.3.5.tgz#503726178d8d792eea7b195566272aaee6837e2f" @@ -261,6 +256,15 @@ js-tokens "^4.0.0" picocolors "^1.1.1" +"@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" @@ -303,6 +307,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": version "7.27.3" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz" @@ -404,6 +419,11 @@ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== +"@babel/helper-plugin-utils@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== + "@babel/helper-remap-async-to-generator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz" @@ -435,11 +455,6 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - "@babel/helper-validator-identifier@^7.28.5": version "7.28.5" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" @@ -474,6 +489,13 @@ dependencies: "@babel/types" "^7.28.6" +"@babel/parser@^7.29.0": + version "7.29.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" + integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== + dependencies: + "@babel/types" "^7.29.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz" @@ -758,14 +780,14 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-systemjs@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz" - integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== + version "7.29.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz#f621105da99919c15cf4bde6fcc7346ef95e7b20" + integrity sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.29.0" "@babel/plugin-transform-modules-umd@^7.27.1": version "7.27.1" @@ -1163,6 +1185,19 @@ "@babel/types" "^7.28.6" debug "^4.3.1" +"@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + "@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.6", "@babel/types@^7.4.4": version "7.28.6" resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz" @@ -1171,42 +1206,23 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" -"@braintree/sanitize-url@^7.0.4": - version "7.1.1" - resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz" - integrity sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw== - -"@chevrotain/cst-dts-gen@11.0.3": - version "11.0.3" - resolved "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz" - integrity sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ== +"@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: - "@chevrotain/gast" "11.0.3" - "@chevrotain/types" "11.0.3" - lodash-es "4.17.21" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" -"@chevrotain/gast@11.0.3": - version "11.0.3" - resolved "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz" - integrity sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q== - dependencies: - "@chevrotain/types" "11.0.3" - lodash-es "4.17.21" +"@braintree/sanitize-url@^7.1.1": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz#ca2035b0fefe956a8676ff0c69af73e605fcd81f" + integrity sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA== -"@chevrotain/regexp-to-ast@11.0.3": - version "11.0.3" - resolved "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz" - integrity sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA== - -"@chevrotain/types@11.0.3": - version "11.0.3" - resolved "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz" - integrity sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ== - -"@chevrotain/utils@11.0.3": - version "11.0.3" - resolved "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz" - integrity sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ== +"@chevrotain/types@~11.1.1": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-11.1.2.tgz#e83a1a2704f0c5e49e7592b214031a0f4a34d7e5" + integrity sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw== "@colors/colors@1.5.0": version "1.5.0" @@ -1570,10 +1586,10 @@ "@docsearch/core" "4.6.2" "@docsearch/css" "4.6.2" -"@docusaurus/babel@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.0.tgz#819819f107233dfcf50b59cd51158f23fb04878a" - integrity sha512-mqCJhCZNZUDg0zgDEaPTM4DnRsisa24HdqTy/qn/MQlbwhTb4WVaZg6ZyX6yIVKqTz8fS1hBMgM+98z+BeJJDg== +"@docusaurus/babel@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.1.tgz#2f714f682117658ba43d308e9b35b6a73a105227" + integrity sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg== dependencies: "@babel/core" "^7.25.9" "@babel/generator" "^7.25.9" @@ -1584,23 +1600,23 @@ "@babel/preset-typescript" "^7.25.9" "@babel/runtime" "^7.25.9" "@babel/traverse" "^7.25.9" - "@docusaurus/logger" "3.10.0" - "@docusaurus/utils" "3.10.0" + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" babel-plugin-dynamic-import-node "^2.3.3" fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/bundler@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.0.tgz#878c4c46bfa3434671ea37a43da184238a6aae26" - integrity sha512-iONUGZGgp+lAkw/cJZH6irONcF4p8+278IsdRlq8lYhxGjkoNUs0w7F4gVXBYSNChq5KG5/JleTSsdJySShxow== +"@docusaurus/bundler@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.1.tgz#82fa5079f3787a67502e25f82d37d05ec5de0cc3" + integrity sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw== dependencies: "@babel/core" "^7.25.9" - "@docusaurus/babel" "3.10.0" - "@docusaurus/cssnano-preset" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" + "@docusaurus/babel" "3.10.1" + "@docusaurus/cssnano-preset" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" babel-loader "^9.2.1" clean-css "^5.3.3" copy-webpack-plugin "^11.0.0" @@ -1618,20 +1634,20 @@ tslib "^2.6.0" url-loader "^4.1.1" webpack "^5.95.0" - webpackbar "^6.0.1" + webpackbar "^7.0.0" -"@docusaurus/core@3.10.0", "@docusaurus/core@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.0.tgz#642e71a0209d62c3f5ef275ed9d74a881f40df39" - integrity sha512-mgLdQsO8xppnQZc3LPi+Mf+PkPeyxJeIx11AXAq/14fsaMefInQiMEZUUmrc7J+956G/f7MwE7tn8KZgi3iRcA== +"@docusaurus/core@3.10.1", "@docusaurus/core@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.1.tgz#3f8bdb97451b4df14f2a3b39ab0186366fbf8fbe" + integrity sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w== dependencies: - "@docusaurus/babel" "3.10.0" - "@docusaurus/bundler" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/mdx-loader" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/babel" "3.10.1" + "@docusaurus/bundler" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" @@ -1668,22 +1684,22 @@ webpack-dev-server "^5.2.2" webpack-merge "^6.0.1" -"@docusaurus/cssnano-preset@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.0.tgz#be1b435c33df09d743473d3fadda67b4568dfae3" - integrity sha512-qzSshTO1DB3TYW+dPUal5KHM7XPc5YQfzF3Kdb2NDACJUyGbNcFtw3tGkCJlYwhNCRKbZcmwraKUS1i5dcHdGg== +"@docusaurus/cssnano-preset@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz#4b6bafeca8bb9423364d2fd6683c28e2f85a4665" + integrity sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ== dependencies: cssnano-preset-advanced "^6.1.2" postcss "^8.5.4" postcss-sort-media-queries "^5.2.0" tslib "^2.6.0" -"@docusaurus/faster@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.10.0.tgz#0758a93196f685537aa7700bde62faf926e6c817" - integrity sha512-GNPtVH14ISjHfSwnHu3KiFGf86ICmJSQDeSv/QaanpBgiZGOtgZaslnC5q8WiguxM1EVkwcGxPuD8BXF4eggKw== +"@docusaurus/faster@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.10.1.tgz#a63d89ae980c98e1eeab3ff15ee083f7c20ed353" + integrity sha512-XTZhE5C1gZ/DaYYMlSk02dwP5vhpQON5QHVz1s3892mSESAywgWanURpXEDAvt4GvGuq7s+XP8rTWHZvfaJmdQ== dependencies: - "@docusaurus/types" "3.10.0" + "@docusaurus/types" "3.10.1" "@rspack/core" "^1.7.10" "@swc/core" "^1.7.39" "@swc/html" "^1.13.5" @@ -1694,22 +1710,22 @@ tslib "^2.6.0" webpack "^5.95.0" -"@docusaurus/logger@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.0.tgz#2bacbd004dd78e3da926dbe8f6fa9a930856575d" - integrity sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg== +"@docusaurus/logger@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.1.tgz#34c964e32e18f120e30f80171a38cfefe72cfb4b" + integrity sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.0.tgz#1d4b050d751389ecf38dee48bcb61e53df8ffb82" - integrity sha512-mQQV97080AH4PYNs087l202NMDqRopZA4mg5W76ZZyTFrmWhJ3mHg+8A+drJVENxw5/Q+wHMHLgsx+9z1nEs0A== +"@docusaurus/mdx-loader@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz#050ae9bc614158a4ec07a628aa75fa9ae90d7e82" + integrity sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ== dependencies: - "@docusaurus/logger" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" @@ -1732,12 +1748,12 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@3.10.0", "@docusaurus/module-type-aliases@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.0.tgz#749928f104d563f11f046bf0c9ab6489a470c7c8" - integrity sha512-/1O0Zg8w3DFrYX/I6Fbss7OJrtZw1QoyjDhegiFNHVi9A9Y0gQ3jUAytVxF6ywpAWpLyLxch8nN8H/V3XfzdJQ== +"@docusaurus/module-type-aliases@3.10.1", "@docusaurus/module-type-aliases@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz#22d39177c296786eb6e0d940699cd590cc93ca77" + integrity sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w== dependencies: - "@docusaurus/types" "3.10.0" + "@docusaurus/types" "3.10.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1745,34 +1761,34 @@ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-client-redirects@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.0.tgz#4dd4619817fd69462d1e6d986580343aeb911111" - integrity sha512-P+VLoLoZTc74so8+IbsaPZ33/mkf2BWL1CYXQpPRkl0v1QVCN2CgfsZY/8QtbYjQnx2upXUnv45abDhNcSggNw== +"@docusaurus/plugin-client-redirects@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.1.tgz#e22ed20e5837b7c3a28258e3d1816c4239c82b36" + integrity sha512-LHgd+YDvkhfOHMAE6XtUng3DQNzVM765RqVRrMJgHtzAvfopQhY6ieprqjxDVBdv21cLma6I0jHr+YCZH8fL9A== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" eta "^2.2.0" fs-extra "^11.1.1" lodash "^4.17.21" tslib "^2.6.0" -"@docusaurus/plugin-content-blog@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.0.tgz#10095291b637440847854ecb2c8afcd8746debd7" - integrity sha512-RuTz68DhB7CL96QO5UsFbciD7GPYq6QV+YMfF9V0+N4ZgLhJIBgpVAr8GobrKF6NRe5cyWWETU5z5T834piG9g== +"@docusaurus/plugin-content-blog@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz#0bd8de700ccbd8e95d920df2613304ef59abe72b" + integrity sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/mdx-loader" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" cheerio "1.0.0-rc.12" combine-promises "^1.1.0" feed "^4.2.2" @@ -1785,20 +1801,20 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.0.tgz#9c4ea1d5a405340f28c281d2e4586c695a7c65a5" - integrity sha512-9BjHhf15ct8Z7TThTC0xRndKDVvMKmVsAGAN7W9FpNRzfMdScOGcXtLmcCWtJGvAezjOJIm6CxOYCy3Io5+RnQ== +"@docusaurus/plugin-content-docs@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz#261e0e982e4a937c05b462e3c5729374f433b752" + integrity sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/mdx-loader" "3.10.0" - "@docusaurus/module-type-aliases" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" @@ -1809,142 +1825,142 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.0.tgz#7670cbb3c849f434949f542bfdfded1580a13165" - integrity sha512-5amX8kEJI+nIGtuLVjYk59Y5utEJ3CHETFOPEE4cooIRLA4xM4iBsA6zFgu4ljcopeYwvBzFEWf5g2I6Yb9SkA== +"@docusaurus/plugin-content-pages@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz#8c6ffc2079ed0262548ecc4df1dea6add6aa9673" + integrity sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/mdx-loader" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-css-cascade-layers@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.0.tgz#71e318d842be95f92be6c3dca00ceea4971d0edb" - integrity sha512-6q1vtt5FJcg5osgkHeM1euErECNqEZ5Z1j69yiNx2luEBIso+nxCkS9nqj8w+MK5X7rvKEToGhFfOFWncs51pQ== +"@docusaurus/plugin-css-cascade-layers@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz#440578d95cbe1a6120936fa83df868d2626cd1d8" + integrity sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" tslib "^2.6.0" -"@docusaurus/plugin-debug@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.0.tgz#e77f924604e1e09d5d90fe0bdf23a3be8ea3307e" - integrity sha512-XcljKN+G+nmmK69uQA1d9BlYU3ZftG3T3zpK8/7Hf/wrOlV7TA4Ampdrdwkg0jElKdKAoSnPhCO0/U3bQGsVQQ== +"@docusaurus/plugin-debug@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz#b8b7b24d9a7d185fd8a56a030f90145d3bfd8239" + integrity sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" fs-extra "^11.1.1" react-json-view-lite "^2.3.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.0.tgz#22c7e976fe4d970c7cd1c73c9723d9a5786c6e37" - integrity sha512-hTEoodatpBZnUat5nFExbuTGA1lhWGy7vZGuTew5Q3QDtGKFpSJLYmZJhdTjvCFwv1+qQ67hgAVlKdJOB8TXow== +"@docusaurus/plugin-google-analytics@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz#ac15afc77386e0352edb8a1698d993aa5de36ffc" + integrity sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.0.tgz#c38a2ba638257851cc845b934506b80c08d47f96" - integrity sha512-iB/Zzjv/eelJRbdULZqzWCbgMgJ7ht4ONVjXtN3+BI/muil6S87gQ1OJyPwlXD+ELdKkitC7bWv5eJdYOZLhrQ== +"@docusaurus/plugin-google-gtag@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz#0482b83b9bc411aa99a432be2b39d2e53a00e2e0" + integrity sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" "@types/gtag.js" "^0.0.20" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.0.tgz#5469c923cc1ad4608399d0b17e5fcacd8e030d56" - integrity sha512-FEjZxqKgLHa+Wez/EgKxRwvArNCWIScfyEQD95rot7jkxp6nonjI5XIbGfO/iYhM5Qinwe8aIEQHP2KZtpqVuA== +"@docusaurus/plugin-google-tag-manager@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz#eaf5765d6f82b4fb661d92a793d1883f9d1ec106" + integrity sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.0.tgz#35d59d46803f279f22aa64fc1bd18c048f12662b" - integrity sha512-DVTSLjB97hIjmayGnGcBfognCeI7ZuUKgEnU7Oz81JYqXtVg94mVTthDjq3QHTylYNeCUbkaW8VF0FDLcc8pPw== +"@docusaurus/plugin-sitemap@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz#66a6974bb2fd1b9d8f5cb0f3c5ecd2201c118565" + integrity sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/plugin-svgr@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.0.tgz#8ada2e6dd8318d20206a9b044fc091a5794ba3f0" - integrity sha512-lNljBESaETZqVBMPqkrGchr+UPT1eZzEPLmJhz8I76BxbjqgsUnRvrq6lQJ9sYjgmgX52KB7kkgczqd2yzoswQ== +"@docusaurus/plugin-svgr@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz#c217c24d6d23fd2bc6f54d44c040635b49d6b36e" + integrity sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" "@svgr/core" "8.1.0" "@svgr/webpack" "^8.1.0" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/preset-classic@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.0.tgz#74b6facdaf568bcd41ec90cae9aebb7ca0ac8619" - integrity sha512-kw/Ye02Hc6xP1OdTswy8yxQEHg0fdPpyWAQRxr5b2x3h7LlG2Zgbb5BDFROnXDDMpUxB7YejlocJIE5HIEfpNA== +"@docusaurus/preset-classic@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz#faf330d96aedc9083a59bec09d966ae4dfc8b2fb" + integrity sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/plugin-content-blog" "3.10.0" - "@docusaurus/plugin-content-docs" "3.10.0" - "@docusaurus/plugin-content-pages" "3.10.0" - "@docusaurus/plugin-css-cascade-layers" "3.10.0" - "@docusaurus/plugin-debug" "3.10.0" - "@docusaurus/plugin-google-analytics" "3.10.0" - "@docusaurus/plugin-google-gtag" "3.10.0" - "@docusaurus/plugin-google-tag-manager" "3.10.0" - "@docusaurus/plugin-sitemap" "3.10.0" - "@docusaurus/plugin-svgr" "3.10.0" - "@docusaurus/theme-classic" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/theme-search-algolia" "3.10.0" - "@docusaurus/types" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/plugin-content-blog" "3.10.1" + "@docusaurus/plugin-content-docs" "3.10.1" + "@docusaurus/plugin-content-pages" "3.10.1" + "@docusaurus/plugin-css-cascade-layers" "3.10.1" + "@docusaurus/plugin-debug" "3.10.1" + "@docusaurus/plugin-google-analytics" "3.10.1" + "@docusaurus/plugin-google-gtag" "3.10.1" + "@docusaurus/plugin-google-tag-manager" "3.10.1" + "@docusaurus/plugin-sitemap" "3.10.1" + "@docusaurus/plugin-svgr" "3.10.1" + "@docusaurus/theme-classic" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-search-algolia" "3.10.1" + "@docusaurus/types" "3.10.1" -"@docusaurus/theme-classic@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.0.tgz#d937915c691189f27ced649c822994d839ea565b" - integrity sha512-9msCAsRdN+UG+RwPwCFb0uKy4tGoPh5YfBozXeGUtIeAgsMdn6f3G/oY861luZ3t8S2ET8S9Y/1GnpJAGWytww== +"@docusaurus/theme-classic@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz#deed8cf73cc0f56113e53775cbb3b168c3c61566" + integrity sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/mdx-loader" "3.10.0" - "@docusaurus/module-type-aliases" "3.10.0" - "@docusaurus/plugin-content-blog" "3.10.0" - "@docusaurus/plugin-content-docs" "3.10.0" - "@docusaurus/plugin-content-pages" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/theme-translations" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/plugin-content-blog" "3.10.1" + "@docusaurus/plugin-content-docs" "3.10.1" + "@docusaurus/plugin-content-pages" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-translations" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" @@ -1959,15 +1975,15 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.0.tgz#70b419ccfdf62f092299354a72d1692e81be597d" - integrity sha512-Dkp1YXKn16ByCJAdIjbDIOpVb4Z66MsVD694/ilX1vAAHaVEMrVsf/NPd9VgreyFx08rJ9GqV1MtzsbTcU73Kg== +"@docusaurus/theme-common@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.1.tgz#cbfec82b1b107be5c229811ed9caae14a501361c" + integrity sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA== dependencies: - "@docusaurus/mdx-loader" "3.10.0" - "@docusaurus/module-type-aliases" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1977,48 +1993,48 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-live-codeblock@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.10.0.tgz#05a38c6bfac479fd698f18f27ca06ebb126633d9" - integrity sha512-1Ycxu0dBAhEXzXPQ1dQW01aY1MNi7TCTUOBtIF0GcNrQBFj74XxhDqv/T6GxYBsaN+6QnIDs1T+D43iV2/r2hQ== +"@docusaurus/theme-live-codeblock@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.10.1.tgz#29e6ddee467d816205ad611fd7bf10f00db5bdef" + integrity sha512-MKG/0zreelS6YlupQAoKmS5nCw9RRKwDHihJg2FinsU1+rqbrOYNYVq//eQy+m649k9b8XCazEw9VUMTFhpCTg== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/theme-translations" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-translations" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" "@philpl/buble" "^0.19.7" clsx "^2.0.0" fs-extra "^11.1.1" react-live "^4.1.6" tslib "^2.6.0" -"@docusaurus/theme-mermaid@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.0.tgz#6581ccf16d27e4c02fe8c7cf15488862f27be9c8" - integrity sha512-Y2xrlwhIJ80oOZIO3PXL6A7J869splfcMI87E3NKpYsy3zJxOyV+BP1QMtGi59ajKgU868HPuyyn6J+6BZGOBg== +"@docusaurus/theme-mermaid@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.1.tgz#dada9c50c780524d246906234ace8a35446f26fc" + integrity sha512-2gxpmln8Pc4EN1oWzshQEx2HTs67jk14v7MmgqGs8ZU7Nm8oihg+fTouof2u4vN8DtB3Fln4cDJu4UprSX1S3Q== dependencies: - "@docusaurus/core" "3.10.0" - "@docusaurus/module-type-aliases" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" mermaid ">=11.6.0" tslib "^2.6.0" -"@docusaurus/theme-search-algolia@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.0.tgz#0ff57fe58db6abde8f5ad2877e459cd2fa6e7464" - integrity sha512-f5FPKI08e3JRG63vR/o4qeuUVHUHzFzM0nnF+AkB67soAZgNsKJRf2qmUZvlQkGwlV+QFkKe4D0ANMh1jToU3g== +"@docusaurus/theme-search-algolia@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz#6f422058711629ce8d7c2f17e1e54efa075c626e" + integrity sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug== dependencies: "@algolia/autocomplete-core" "^1.19.2" "@docsearch/react" "^3.9.0 || ^4.3.2" - "@docusaurus/core" "3.10.0" - "@docusaurus/logger" "3.10.0" - "@docusaurus/plugin-content-docs" "3.10.0" - "@docusaurus/theme-common" "3.10.0" - "@docusaurus/theme-translations" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-validation" "3.10.0" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/plugin-content-docs" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-translations" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" algoliasearch "^5.37.0" algoliasearch-helper "^3.26.0" clsx "^2.0.0" @@ -2028,10 +2044,10 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz#8fdc23d29bd7f907db49c36cf65e2123d96be300" - integrity sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA== +"@docusaurus/theme-translations@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz#c3119a015652290eea560ca45ac775963d6eb75b" + integrity sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" @@ -2041,10 +2057,10 @@ resolved "https://registry.yarnpkg.com/@docusaurus/tsconfig/-/tsconfig-3.10.1.tgz#1db31b4a4a5c914bdffa80070a35b6365d34f2e8" integrity sha512-rYvB7yqkdqWIpAbDzQljGfM4cDBkLTbhmagZBEcsyj6oPUsz47lmW2pYdN1j+7sGFgltbAmQH62xfbrij4Eh6Q== -"@docusaurus/types@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.0.tgz#a69232bba74b738fcf4671fd5f0f079366dd3d13" - integrity sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw== +"@docusaurus/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.1.tgz#d42837938ae43ca2be0ca47e63e00476b5eb94be" + integrity sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw== dependencies: "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" @@ -2057,36 +2073,36 @@ webpack "^5.95.0" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.0.tgz#2a6dc76b312664fca7234d33607c085318ff1ae3" - integrity sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw== +"@docusaurus/utils-common@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.1.tgz#6350b4898691e765de750f90eade0e0fa7902d99" + integrity sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA== dependencies: - "@docusaurus/types" "3.10.0" + "@docusaurus/types" "3.10.1" tslib "^2.6.0" -"@docusaurus/utils-validation@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz#a2418d7f31980d991fd3a1f39c8aad8820b36812" - integrity sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw== +"@docusaurus/utils-validation@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz#ddbcce997a5506424cdd16abf6845cc51692acae" + integrity sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg== dependencies: - "@docusaurus/logger" "3.10.0" - "@docusaurus/utils" "3.10.0" - "@docusaurus/utils-common" "3.10.0" + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" fs-extra "^11.2.0" joi "^17.9.2" js-yaml "^4.1.0" lodash "^4.17.21" tslib "^2.6.0" -"@docusaurus/utils@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.0.tgz#ea7d7b0d325b60f728decc00bb3908d00ef86faf" - integrity sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA== +"@docusaurus/utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.1.tgz#535968caa2c9bff69f997a081b98b95b3c5d3785" + integrity sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw== dependencies: - "@docusaurus/logger" "3.10.0" - "@docusaurus/types" "3.10.0" - "@docusaurus/utils-common" "3.10.0" + "@docusaurus/logger" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-common" "3.10.1" escape-string-regexp "^4.0.0" execa "^5.1.1" file-loader "^6.2.0" @@ -2530,19 +2546,14 @@ resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== -"@iconify/utils@^2.1.33": - version "2.3.0" - resolved "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz" - integrity sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA== +"@iconify/utils@^3.0.2": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-3.1.3.tgz#71efd68f9ed2ea3c91fd3a01c0032f70a87027b7" + integrity sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw== dependencies: - "@antfu/install-pkg" "^1.0.0" - "@antfu/utils" "^8.1.0" + "@antfu/install-pkg" "^1.1.0" "@iconify/types" "^2.0.0" - debug "^4.4.0" - globals "^15.14.0" - kolorist "^1.8.0" - local-pkg "^1.0.0" - mlly "^1.7.4" + import-meta-resolve "^4.2.0" "@jest/schemas@^29.6.3": version "29.6.3" @@ -2691,12 +2702,12 @@ dependencies: "@types/mdx" "^2.0.0" -"@mermaid-js/parser@^0.6.2": - version "0.6.2" - resolved "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz" - integrity sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ== +"@mermaid-js/parser@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mermaid-js/parser/-/parser-1.1.1.tgz#30f3ab68d816912e43f245a72a0d4081bf69d966" + integrity sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw== dependencies: - langium "3.3.1" + "@chevrotain/types" "~11.1.1" "@module-federation/error-codes@0.22.0": version "0.22.0" @@ -4239,86 +4250,86 @@ dependencies: apg-lite "^1.0.4" -"@swc/core-darwin-arm64@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.32.tgz#3592714588fdbb8b7a869f81ff96c7236fcf1c09" - integrity sha512-/YWMvJDPu+AAwuUsM2G+DNQ/7zhodURGzdQyewEqcvgklAdDHs3LwQmLLnyn6SJl8DT8UOxkbzK+D1PmPeelRg== +"@swc/core-darwin-arm64@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.33.tgz#d84134fb80417d41128739f0b9014542e3ed9dd3" + integrity sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA== -"@swc/core-darwin-x64@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.32.tgz#965044b632933146e319862ea7e4b717eb9f83dd" - integrity sha512-KOTXJXdAhWL+hZ77MYP3z+4pcMFaQhQ74yqyN1uz093q0YnbxpqMtYpPISbYvMHzVRNNx5kN+9RZAXEaadhWVA== +"@swc/core-darwin-x64@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.33.tgz#0badb9834071f1c6005986571d4a96359c1d7cd0" + integrity sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA== -"@swc/core-linux-arm-gnueabihf@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.32.tgz#70e70ad6ad961055f4a9be9e4947e455c18239e6" - integrity sha512-oOoxLweljlc0A4X8ybsgxV7cVaYTwBOg2iMDJcFR3Sr48C+lsv9VzSmqdK/IVIXF4W4GjLc3VqTAdSMXlfVLuQ== +"@swc/core-linux-arm-gnueabihf@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.33.tgz#b7577a825b59d98b6a9a5c991d842046efe1c34a" + integrity sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ== -"@swc/core-linux-arm64-gnu@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.32.tgz#7b82e2cc5995e8f919e29f6ce702285f5f1c3ad1" - integrity sha512-oDzEkdl6D6BAWdMtU5KGO7y3HR5fJcvByNLyEk9+ugj8nP5Ovb7P4kBcStBXc4MPExFGQryehiINMlmY8HlclA== +"@swc/core-linux-arm64-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.33.tgz#304c48321494a18c67b2913c273b08674ee70d8c" + integrity sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw== -"@swc/core-linux-arm64-musl@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.32.tgz#16c581b9f859b0175a8bab5cbf694bef7dbf95b8" - integrity sha512-omcqjoZP/b8D8PuczVoRwJieC6ibj7qIxTftNYokz4/aSmKFHvsd7nIFfPk5ZvtzncbH4AY7+Dkr/Lp2gWxYeA== +"@swc/core-linux-arm64-musl@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.33.tgz#d116cbc04ccb4f4ee810da6bca79d4423605dbcd" + integrity sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og== -"@swc/core-linux-ppc64-gnu@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.32.tgz#420f7744dae327c8e4917c87ced5c1b3e0a38f96" - integrity sha512-KGkTMyz/Tbn3PBNu0AVZ4GTDFKnICrYcTiNPZq8DrvK42pnFsf3GNDrIG9E5AtQlTmC0YigkWKmu0eMcfTrmgA== +"@swc/core-linux-ppc64-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.33.tgz#f5354dba36db9414305bab344c817d57b8b457c2" + integrity sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog== -"@swc/core-linux-s390x-gnu@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.32.tgz#9b563a3a73c544f29454e53894bfe533b9a27ffe" - integrity sha512-G3Aa4tVS/3OGZBkoNIwUF9F6RAy+Osb4GOlo62SinLmDiErz/ykmM7KH0wkz6l9kM8jJq1HyAM6atJTUEbBk7g== +"@swc/core-linux-s390x-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.33.tgz#016df9f4c9d7fd65b85ca9c558c5aec341f06da0" + integrity sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA== -"@swc/core-linux-x64-gnu@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.32.tgz#615c7bcc1890379dffcc74b6780e2277e65f4b61" - integrity sha512-ERsjfGcj6CBmj3vJnGDO8m8rTvw6RqMcWo1dogOtNx3/+/0+NNpJiXDobJrr1GwInI/BHAEkvSFIH6d2LqPcUQ== +"@swc/core-linux-x64-gnu@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.33.tgz#49f36558ede072e71999aa37f123367daed2a662" + integrity sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw== -"@swc/core-linux-x64-musl@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.32.tgz#038604d25bdebb1d1ad780d827a44654fa4b5bdd" - integrity sha512-N4Ggahe/8SUbTX50P6EdhbW9YWcgbZVb52R4cq6MK+zsoMjRq7rGvV5ztA05QnbaCYqMYx8rTY7KAIA3Crdo4Q== +"@swc/core-linux-x64-musl@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.33.tgz#b096665f5cfeee2612325f301da5c1590b10d8f3" + integrity sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ== -"@swc/core-win32-arm64-msvc@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.32.tgz#c82006e6ef92a998e96d2160b1657f5334af4d54" - integrity sha512-01yN0o9jvo8xBTP12aPK2wW8b41jmOlGbDDlAnoynotc4pO6xA0zby9f1z6j++qXDpGBttLySq1omgVrlQKYcw== +"@swc/core-win32-arm64-msvc@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.33.tgz#f3101263a0dbaa173ec47638c9719d0b89838bd2" + integrity sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g== -"@swc/core-win32-ia32-msvc@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.32.tgz#e2ae1c95bd6599322bc6e9a82685b7537a193f7b" - integrity sha512-fLagI9XZYNpTcmlqAcp3KBtmj7E19WCmYD80Jxj1Kn5tGNa7yxNLd3NNdWxuZGUPl5iC0/KqZru7g08gF6Fsrw== +"@swc/core-win32-ia32-msvc@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.33.tgz#eb981ef5613d42c9220559bdb0c8bc58cf6c3eb9" + integrity sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ== -"@swc/core-win32-x64-msvc@1.15.32": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.32.tgz#2535c791821054072a511dee0d13e5de9c5cd29b" - integrity sha512-gbc2bQ/T2CiR+w0OvcVKwLOFAcPZBvmWmolbwpg1E8UrpeC03DGtyMUApOHNXNYWA3SHFrYXCQtosrcMza1YFg== +"@swc/core-win32-x64-msvc@1.15.33": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.33.tgz#a2fed9956933027ceb368857bac4bb4ee203d47c" + integrity sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg== -"@swc/core@^1.15.32", "@swc/core@^1.7.39": - version "1.15.32" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.32.tgz#2333d66f4b8e7c4fded087ead13c135ff84ab9d6" - integrity sha512-/eWL0n43D64QWEUHLtTE+jDqjkJhyidjkDhv6f0uJohOUAhywxQ9wXYp845DNNds0JpCdI4Uo0a9bl+vbXf+ew== +"@swc/core@^1.15.33", "@swc/core@^1.7.39": + version "1.15.33" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.33.tgz#2a6571c8aca961925f14beae52b3f43c18370fc6" + integrity sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ== dependencies: "@swc/counter" "^0.1.3" "@swc/types" "^0.1.26" optionalDependencies: - "@swc/core-darwin-arm64" "1.15.32" - "@swc/core-darwin-x64" "1.15.32" - "@swc/core-linux-arm-gnueabihf" "1.15.32" - "@swc/core-linux-arm64-gnu" "1.15.32" - "@swc/core-linux-arm64-musl" "1.15.32" - "@swc/core-linux-ppc64-gnu" "1.15.32" - "@swc/core-linux-s390x-gnu" "1.15.32" - "@swc/core-linux-x64-gnu" "1.15.32" - "@swc/core-linux-x64-musl" "1.15.32" - "@swc/core-win32-arm64-msvc" "1.15.32" - "@swc/core-win32-ia32-msvc" "1.15.32" - "@swc/core-win32-x64-msvc" "1.15.32" + "@swc/core-darwin-arm64" "1.15.33" + "@swc/core-darwin-x64" "1.15.33" + "@swc/core-linux-arm-gnueabihf" "1.15.33" + "@swc/core-linux-arm64-gnu" "1.15.33" + "@swc/core-linux-arm64-musl" "1.15.33" + "@swc/core-linux-ppc64-gnu" "1.15.33" + "@swc/core-linux-s390x-gnu" "1.15.33" + "@swc/core-linux-x64-gnu" "1.15.33" + "@swc/core-linux-x64-musl" "1.15.33" + "@swc/core-win32-arm64-msvc" "1.15.33" + "@swc/core-win32-ia32-msvc" "1.15.33" + "@swc/core-win32-x64-msvc" "1.15.33" "@swc/counter@^0.1.3": version "0.1.3" @@ -5040,100 +5051,100 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.59.1", "@typescript-eslint/eslint-plugin@^8.52.0": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz#781bc6f9002982cfaf75a185240e24ad7276628a" - integrity sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag== +"@typescript-eslint/eslint-plugin@8.59.3", "@typescript-eslint/eslint-plugin@^8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz#5d6da7e7b236b46452fa00d3904bb6f59615bfde" + integrity sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw== dependencies: "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.59.1" - "@typescript-eslint/type-utils" "8.59.1" - "@typescript-eslint/utils" "8.59.1" - "@typescript-eslint/visitor-keys" "8.59.1" + "@typescript-eslint/scope-manager" "8.59.3" + "@typescript-eslint/type-utils" "8.59.3" + "@typescript-eslint/utils" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" ignore "^7.0.5" natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@8.59.1", "@typescript-eslint/parser@^8.59.0": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.59.1.tgz#835d20a62350659a082a1ae2a60b822c40488905" - integrity sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA== +"@typescript-eslint/parser@8.59.3", "@typescript-eslint/parser@^8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.59.3.tgz#f46cbc70ae0a25119ef94eac9ecd46714788e1a1" + integrity sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg== dependencies: - "@typescript-eslint/scope-manager" "8.59.1" - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/typescript-estree" "8.59.1" - "@typescript-eslint/visitor-keys" "8.59.1" + "@typescript-eslint/scope-manager" "8.59.3" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" debug "^4.4.3" -"@typescript-eslint/project-service@8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.1.tgz#49efe87c37ef84262f23df8bf62fdc56698ca6fe" - integrity sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg== +"@typescript-eslint/project-service@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.3.tgz#1be5ae152aad987a156c9a1a9b4256e75cfbbe0c" + integrity sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.59.1" - "@typescript-eslint/types" "^8.59.1" + "@typescript-eslint/tsconfig-utils" "^8.59.3" + "@typescript-eslint/types" "^8.59.3" debug "^4.4.3" -"@typescript-eslint/scope-manager@8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz#ed90d054fc3db2d0c81464db3a953a94fb85bb58" - integrity sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg== +"@typescript-eslint/scope-manager@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz#91a60f66803fe9dae0696fbab2451f5723f119d2" + integrity sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA== dependencies: - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/visitor-keys" "8.59.1" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" -"@typescript-eslint/tsconfig-utils@8.59.1", "@typescript-eslint/tsconfig-utils@^8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz#ba2a779a444f1d5cb92a606f9b209d239fd4cab1" - integrity sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA== +"@typescript-eslint/tsconfig-utils@8.59.3", "@typescript-eslint/tsconfig-utils@^8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz#88ca9036b42ccdd1e630cfdafd2e042c2ca6a835" + integrity sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw== -"@typescript-eslint/type-utils@8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz#9c83d3f2ed9187a815e8120f72c08317e513e409" - integrity sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w== +"@typescript-eslint/type-utils@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz#421fb2448bdfeb301d134a01cd02503f67fd8192" + integrity sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ== dependencies: - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/typescript-estree" "8.59.1" - "@typescript-eslint/utils" "8.59.1" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" + "@typescript-eslint/utils" "8.59.3" debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@8.59.1", "@typescript-eslint/types@^8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.1.tgz#c1d014d3f03a97e0113a8899fc9d4e45a7fb0ca9" - integrity sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A== +"@typescript-eslint/types@8.59.3", "@typescript-eslint/types@^8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.3.tgz#b7ca539c5e302fdde9a7cadb73caed107ef8f2cd" + integrity sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg== -"@typescript-eslint/typescript-estree@8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz#4391fadf98a22c869c5b6522dbf4e491e53e351a" - integrity sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g== +"@typescript-eslint/typescript-estree@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz#e6bb1408e00b47e431427a40268db4e86cb121ab" + integrity sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg== dependencies: - "@typescript-eslint/project-service" "8.59.1" - "@typescript-eslint/tsconfig-utils" "8.59.1" - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/visitor-keys" "8.59.1" + "@typescript-eslint/project-service" "8.59.3" + "@typescript-eslint/tsconfig-utils" "8.59.3" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/visitor-keys" "8.59.3" debug "^4.4.3" minimatch "^10.2.2" semver "^7.7.3" tinyglobby "^0.2.15" ts-api-utils "^2.5.0" -"@typescript-eslint/utils@8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.1.tgz#cf6204d69701bbbc5b150f98c18aeef0a42c10bd" - integrity sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA== +"@typescript-eslint/utils@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.3.tgz#f693f979deb4dc3994de03ff8b23976d625c36c5" + integrity sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.59.1" - "@typescript-eslint/types" "8.59.1" - "@typescript-eslint/typescript-estree" "8.59.1" + "@typescript-eslint/scope-manager" "8.59.3" + "@typescript-eslint/types" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" -"@typescript-eslint/visitor-keys@8.59.1": - version "8.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz#b5cba576287a3eeb0b400b62813189abcc3f976a" - integrity sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg== +"@typescript-eslint/visitor-keys@8.59.3": + version "8.59.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz#820843b1b5ca4290009cf189382abcf6fe00dfa6" + integrity sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg== dependencies: - "@typescript-eslint/types" "8.59.1" + "@typescript-eslint/types" "8.59.3" eslint-visitor-keys "^5.0.0" "@ungap/structured-clone@^1.0.0": @@ -5141,6 +5152,14 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== +"@upsetjs/venn.js@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@upsetjs/venn.js/-/venn.js-2.0.0.tgz#3be192038cdda927aa4f8b22ab51af82abf47f34" + integrity sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw== + optionalDependencies: + d3-selection "^3.0.0" + d3-transition "^3.0.1" + "@vx/responsive@^0.0.199": version "0.0.199" resolved "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.199.tgz" @@ -5794,10 +5813,10 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -baseline-browser-mapping@^2.10.24, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19: - version "2.10.24" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz#6dc320c7bf53859ec2bf55d54db6d2e5c078df16" - integrity sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA== +baseline-browser-mapping@^2.10.29, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19: + version "2.10.29" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz#47bdc13027af28d341f367a4f35a07ce872e27b4" + integrity sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ== batch@0.6.1: version "0.6.1" @@ -6035,10 +6054,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001791: - version "1.0.30001791" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz#dfb93d85c40ad380c57123e72e10f3c575786b51" - integrity sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001792: + version "1.0.30001792" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz#ca8bb9be244835a335e2018272ce7223691873c5" + integrity sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw== ccount@^2.0.0: version "2.0.1" @@ -6062,12 +6081,7 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.1, chalk@^5.2.0: - version "5.6.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz" - integrity sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ== - -chalk@^5.6.2: +chalk@^5.0.1, chalk@^5.2.0, chalk@^5.6.2: version "5.6.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== @@ -6127,25 +6141,6 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chevrotain-allstar@~0.3.0: - version "0.3.1" - resolved "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz" - integrity sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw== - dependencies: - lodash-es "^4.17.21" - -chevrotain@~11.0.3: - version "11.0.3" - resolved "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz" - integrity sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw== - dependencies: - "@chevrotain/cst-dts-gen" "11.0.3" - "@chevrotain/gast" "11.0.3" - "@chevrotain/regexp-to-ast" "11.0.3" - "@chevrotain/types" "11.0.3" - "@chevrotain/utils" "11.0.3" - lodash-es "4.17.21" - chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" @@ -6377,16 +6372,6 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -confbox@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz" - integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== - -confbox@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz" - integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== - config-chain@^1.1.11: version "1.1.13" resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" @@ -6758,10 +6743,10 @@ cytoscape-fcose@^2.2.0: dependencies: cose-base "^2.2.0" -cytoscape@^3.29.3: - version "3.33.1" - resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz" - integrity sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ== +cytoscape@^3.33.1: + version "3.33.3" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.33.3.tgz#6c885823cb088eb8c31087c35d978661dcde5eae" + integrity sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g== "d3-array@1 - 2", d3-array@2, d3-array@^2.3.0: version "2.12.1" @@ -6971,7 +6956,7 @@ d3-scale@^3.0.0: d3-time "^2.1.1" d3-time-format "2 - 3" -"d3-selection@2 - 3", d3-selection@3: +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== @@ -7023,7 +7008,7 @@ d3-shape@^1.2.0: resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== -"d3-transition@2 - 3", d3-transition@3: +"d3-transition@2 - 3", d3-transition@3, d3-transition@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== @@ -7081,10 +7066,10 @@ d3@^7.9.0: d3-transition "3" d3-zoom "3" -dagre-d3-es@7.0.11: - version "7.0.11" - resolved "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz" - integrity sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw== +dagre-d3-es@7.0.14: + version "7.0.14" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz#1272276e26457cf3b97dac569f8f0531ec33c377" + integrity sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg== dependencies: d3 "^7.9.0" lodash-es "^4.17.21" @@ -7116,11 +7101,16 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -dayjs@^1.11.11, dayjs@^1.11.13: +dayjs@^1.11.11: version "1.11.13" resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== +dayjs@^1.11.19: + version "1.11.20" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.20.tgz#88d919fd639dc991415da5f4cb6f1b6650811938" + integrity sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" @@ -7133,7 +7123,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -7305,10 +7295,10 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -docusaurus-plugin-openapi-docs@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-5.0.1.tgz#2fe62b58fc1af11e3d947edc2f0d60e04f1aa149" - integrity sha512-OVfoDovRdiS78DQYWmr2BjuOF2A6kVmJ43mgkQaAEZxASyHbUft4zUIhvfa7gqema6KNL9pVKejDievZdZ3wGQ== +docusaurus-plugin-openapi-docs@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-5.0.2.tgz#f00028621deb9179065fe7d6a541256692ef941b" + integrity sha512-WCC2m6PpylXZfNga+ScelTG0a7jUGtbB9+AmbR9lUj93FPryTs8VHTMJ3fKtO0senJTWgOU3MDvZw0v+mE3ztA== dependencies: "@apidevtools/json-schema-ref-parser" "^15.3.3" "@redocly/openapi-core" "^2.25.2" @@ -7326,10 +7316,10 @@ docusaurus-plugin-openapi-docs@^5.0.1: swagger2openapi "^7.0.8" xml-formatter "^3.6.6" -docusaurus-theme-openapi-docs@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-5.0.1.tgz#a2c2c91346b6238f6d7862752cdb02611fb5396f" - integrity sha512-bVeb7hOqog9LKVrJzYXdNJ7/0N22lk0VE22QK+naAn5GuAvYo41JmpXW9hqLIPkEp2UbexTHoPW9SYVdUsyvvw== +docusaurus-theme-openapi-docs@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-5.0.2.tgz#2ab6f6b04fc2e494e24971d31432a9187c84a2fe" + integrity sha512-BD6WhbunR6kXqtoUUDlhxO4HlCNM2nYENGr/TbiTEknkgXYKQz+FEIhY4Hyz5GSLpuhPih0CDuNl7Xkfpcz0Yw== dependencies: "@hookform/error-message" "^2.0.1" "@reduxjs/toolkit" "^2.8.2" @@ -7404,7 +7394,14 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@^3.2.5, dompurify@^3.4.0: +dompurify@^3.3.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.2.tgz#f0ff81be682c485505097ba8195a058d8f575218" + integrity sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + +dompurify@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.1.tgz#521d04483ac12631b2aedf434a5f5390933b8789" integrity sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw== @@ -7673,6 +7670,11 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" +es-toolkit@^1.45.1: + version "1.46.1" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.46.1.tgz#38ca27191a98a867fc544b81cf1477a68947fb06" + integrity sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ== + es6-promise@^3.2.1: version "3.3.1" resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" @@ -8064,11 +8066,6 @@ express@^4.21.2: utils-merge "1.0.1" vary "~1.1.2" -exsolve@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz" - integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw== - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" @@ -8123,9 +8120,9 @@ fast-safe-stringify@^2.0.7: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" + integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== fastq@^1.6.0: version "1.19.1" @@ -8469,15 +8466,10 @@ globals@^14.0.0: resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.14.0: - version "15.15.0" - resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz" - integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== - -globals@^17.5.0: - version "17.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.5.0.tgz#a82c641d898f8dfbe0e81f66fdff7d0de43f88c6" - integrity sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g== +globals@^17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc" + integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA== globalthis@^1.0.4: version "1.0.4" @@ -9040,6 +9032,11 @@ import-lazy@^4.0.0: resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== +import-meta-resolve@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#08cb85b5bd37ecc8eb1e0f670dc2767002d43734" + integrity sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" @@ -9749,10 +9746,10 @@ jsonfile@^6.0.1: object.assign "^4.1.4" object.values "^1.1.6" -katex@^0.16.22: - version "0.16.22" - resolved "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz" - integrity sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg== +katex@^0.16.25: + version "0.16.45" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.45.tgz#ba60d39c54746b6b8d39ce0e7f6eace07143149c" + integrity sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA== dependencies: commander "^8.3.0" @@ -9783,22 +9780,6 @@ kleur@^4.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -kolorist@^1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz" - integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== - -langium@3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz" - integrity sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w== - dependencies: - chevrotain "~11.0.3" - chevrotain-allstar "~0.3.0" - vscode-languageserver "~9.0.1" - vscode-languageserver-textdocument "~1.0.11" - vscode-uri "~3.0.8" - latest-version@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz" @@ -9949,15 +9930,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -local-pkg@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz" - integrity sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A== - dependencies: - mlly "^1.7.4" - pkg-types "^2.3.0" - quansync "^0.2.11" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -9972,7 +9944,7 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash-es@4.17.21, lodash-es@^4.17.21: +lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -10063,10 +10035,10 @@ markdown-table@^3.0.0: resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== -marked@^16.0.0: - version "16.2.0" - resolved "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz" - integrity sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg== +marked@^16.3.0: + version "16.4.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-16.4.2.tgz#4959a64be6c486f0db7467ead7ce288de54290a3" + integrity sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA== math-expression-evaluator@^1.3.8: version "1.4.0" @@ -10387,30 +10359,31 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mermaid@>=11.6.0: - version "11.10.0" - resolved "https://registry.npmjs.org/mermaid/-/mermaid-11.10.0.tgz" - integrity sha512-oQsFzPBy9xlpnGxUqLbVY8pvknLlsNIJ0NWwi8SUJjhbP1IT0E0o1lfhU4iYV3ubpy+xkzkaOyDUQMn06vQElQ== + version "11.15.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-11.15.0.tgz#b485c13ea5e1e74f3328c4bb00427bda87fa1c1e" + integrity sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw== dependencies: - "@braintree/sanitize-url" "^7.0.4" - "@iconify/utils" "^2.1.33" - "@mermaid-js/parser" "^0.6.2" + "@braintree/sanitize-url" "^7.1.1" + "@iconify/utils" "^3.0.2" + "@mermaid-js/parser" "^1.1.1" "@types/d3" "^7.4.3" - cytoscape "^3.29.3" + "@upsetjs/venn.js" "^2.0.0" + cytoscape "^3.33.1" cytoscape-cose-bilkent "^4.1.0" cytoscape-fcose "^2.2.0" d3 "^7.9.0" d3-sankey "^0.12.3" - dagre-d3-es "7.0.11" - dayjs "^1.11.13" - dompurify "^3.2.5" - katex "^0.16.22" + dagre-d3-es "7.0.14" + dayjs "^1.11.19" + dompurify "^3.3.1" + es-toolkit "^1.45.1" + katex "^0.16.25" khroma "^2.1.0" - lodash-es "^4.17.21" - marked "^16.0.0" + marked "^16.3.0" roughjs "^4.6.6" stylis "^4.3.6" ts-dedent "^2.2.0" - uuid "^11.1.0" + uuid "^11.1.0 || ^12 || ^13 || ^14.0.0" methods@~1.1.2: version "1.1.2" @@ -11116,16 +11089,6 @@ minimist@^1.2.0: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mlly@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz" - integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== - dependencies: - acorn "^8.14.0" - pathe "^2.0.1" - pkg-types "^1.3.0" - ufo "^1.5.4" - mri@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" @@ -11806,11 +11769,6 @@ path@0.12.7: process "^0.11.1" util "^0.10.3" -pathe@^2.0.1, pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" @@ -11838,24 +11796,6 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-types@^1.3.0: - version "1.3.1" - resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" - integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== - dependencies: - confbox "^0.1.8" - mlly "^1.7.4" - pathe "^2.0.1" - -pkg-types@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz" - integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== - dependencies: - confbox "^0.2.2" - exsolve "^1.0.7" - pathe "^2.0.3" - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" @@ -12601,11 +12541,6 @@ qs@^6.12.3, qs@~6.14.0: dependencies: side-channel "^1.1.0" -quansync@^0.2.11: - version "0.2.11" - resolved "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz" - integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -13328,7 +13263,7 @@ renderkid@^3.0.0: repeat-string@^1.5.2: version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: @@ -14720,26 +14655,21 @@ types-ramda@^0.30.1: dependencies: ts-toolbelt "^9.6.0" -typescript-eslint@^8.59.1: - version "8.59.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.59.1.tgz#244a9fcbf27057ebbc2281d408239f1861b55b78" - integrity sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ== +typescript-eslint@^8.59.3: + version "8.59.3" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.59.3.tgz#4a41d9007faa539a66292189e2795eeb0b9fca29" + integrity sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg== dependencies: - "@typescript-eslint/eslint-plugin" "8.59.1" - "@typescript-eslint/parser" "8.59.1" - "@typescript-eslint/typescript-estree" "8.59.1" - "@typescript-eslint/utils" "8.59.1" + "@typescript-eslint/eslint-plugin" "8.59.3" + "@typescript-eslint/parser" "8.59.3" + "@typescript-eslint/typescript-estree" "8.59.3" + "@typescript-eslint/utils" "8.59.3" typescript@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== -ufo@^1.5.4: - version "1.6.1" - resolved "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz" - integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== - un-eval@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/un-eval/-/un-eval-1.2.0.tgz" @@ -15072,10 +15002,10 @@ uuid@8.3.2, uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== +"uuid@^11.1.0 || ^12 || ^13 || ^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-14.0.0.tgz#0af883220163d264ffe0c084f6b8a89b9666966d" + integrity sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg== uvu@^0.5.0: version "0.5.6" @@ -15169,41 +15099,6 @@ vfile@^6.0.0, vfile@^6.0.1: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -vscode-jsonrpc@8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz" - integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== - -vscode-languageserver-protocol@3.17.5: - version "3.17.5" - resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz" - integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== - dependencies: - vscode-jsonrpc "8.2.0" - vscode-languageserver-types "3.17.5" - -vscode-languageserver-textdocument@~1.0.11: - version "1.0.12" - resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz" - integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== - -vscode-languageserver-types@3.17.5: - version "3.17.5" - resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz" - integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== - -vscode-languageserver@~9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz" - integrity sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g== - dependencies: - vscode-languageserver-protocol "3.17.5" - -vscode-uri@~3.0.8: - version "3.0.8" - resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz" - integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== - warning@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" @@ -15368,7 +15263,7 @@ webpack@^5.106.2, webpack@^5.88.1, webpack@^5.95.0: watchpack "^2.5.1" webpack-sources "^3.3.4" -webpackbar@^6.0.1, webpackbar@^7.0.0: +webpackbar@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-7.0.0.tgz#7228d32881af2392381b6514499ddea73cdf218a" integrity sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q== diff --git a/helm/superset/Chart.yaml b/helm/superset/Chart.yaml index 5ef4fb2e00f..8ed79ee8bb1 100644 --- a/helm/superset/Chart.yaml +++ b/helm/superset/Chart.yaml @@ -29,7 +29,7 @@ maintainers: - name: craig-rueda email: craig@craigrueda.com url: https://github.com/craig-rueda -version: 0.15.4 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details. +version: 0.15.5 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details. dependencies: - name: postgresql version: 16.7.27 diff --git a/helm/superset/README.md b/helm/superset/README.md index 29dbdeea8a6..53077bd338f 100644 --- a/helm/superset/README.md +++ b/helm/superset/README.md @@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs # superset -![Version: 0.15.4](https://img.shields.io/badge/Version-0.15.4-informational?style=flat-square) +![Version: 0.15.5](https://img.shields.io/badge/Version-0.15.5-informational?style=flat-square) Apache Superset is a modern, enterprise-ready business intelligence web application diff --git a/helm/superset/values.yaml b/helm/superset/values.yaml index fdcc7abccd8..fc5124004f7 100644 --- a/helm/superset/values.yaml +++ b/helm/superset/values.yaml @@ -844,6 +844,8 @@ postgresql: database: superset image: + registry: docker.io + repository: bitnamilegacy/postgresql tag: "14.17.0-debian-12-r3" ## PostgreSQL Primary parameters @@ -918,6 +920,11 @@ redis: accessModes: - ReadWriteOnce + image: + registry: docker.io + repository: bitnamilegacy/redis + tag: 7.0.10-debian-11-r4 + nodeSelector: {} tolerations: [] diff --git a/pyproject.toml b/pyproject.toml index c3b23e63922..6a388f9afbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,7 @@ dependencies = [ "marshmallow>=3.0, <4", "marshmallow-union>=0.1", "msgpack>=1.0.0, <1.2", - "nh3>=0.2.11, <0.3", + "nh3>=0.2.11, <0.4", "numpy>1.23.5, <2.3", "packaging", # -------------------------- @@ -95,7 +95,7 @@ dependencies = [ "redis>=5.0.0, <6.0", "rison>=2.0.0, <3.0", "selenium>=4.14.0, <5.0", - "shillelagh[gsheetsapi]>=1.4.3, <2.0", + "shillelagh[gsheetsapi]>=1.4.4, <2.0", "sshtunnel>=0.4.0, <0.5", "simplejson>=3.15.0", "slack_sdk>=3.19.0, <4", @@ -114,7 +114,7 @@ dependencies = [ [project.optional-dependencies] -athena = ["pyathena[pandas]>=2, <3"] +athena = ["pyathena[pandas]>=2, <4"] aurora-data-api = ["preset-sqlalchemy-aurora-data-api>=0.2.8,<0.3"] bigquery = [ "pandas-gbq>=0.19.1", @@ -131,25 +131,31 @@ d1 = [ ] databend = ["databend-sqlalchemy>=0.3.2, <1.0"] databricks = [ - "databricks-sql-connector==4.1.2", + "databricks-sql-connector==4.2.6", "databricks-sqlalchemy==1.0.5", ] -db2 = ["ibm-db-sa>0.3.8, <=0.4.0"] -denodo = ["denodo-sqlalchemy~=1.0.6"] +db2 = ["ibm-db-sa>0.3.8, <=0.4.4"] +denodo = ["denodo-sqlalchemy>=1.0.6,<2.1.0"] dremio = ["sqlalchemy-dremio>=1.2.1, <4"] drill = ["sqlalchemy-drill>=1.1.4, <2"] druid = ["pydruid>=0.6.5,<0.7"] duckdb = ["duckdb>=1.4.2,<2", "duckdb-engine>=0.17.0"] dynamodb = ["pydynamodb>=0.4.2"] solr = ["sqlalchemy-solr >= 0.2.0"] -elasticsearch = ["elasticsearch-dbapi>=0.2.12, <0.3.0"] +elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"] exasol = ["sqlalchemy-exasol >= 2.4.0, <3.0"] excel = ["xlrd>=1.2.0, <1.3"] -fastmcp = ["fastmcp>=3.2.4,<4.0"] -firebird = ["sqlalchemy-firebird>=0.7.0, <0.8"] +fastmcp = [ + "fastmcp>=3.2.4,<4.0", + # tiktoken backs the response-size-guard token estimator. Without + # it, the middleware falls back to a coarser character-based + # heuristic that under-counts JSON-heavy MCP responses. + "tiktoken>=0.7.0,<1.0", +] +firebird = ["sqlalchemy-firebird>=0.7.0, <2.2"] firebolt = ["firebolt-sqlalchemy>=1.0.0, <2"] gevent = ["gevent>=23.9.1"] -gsheets = ["shillelagh[gsheetsapi]>=1.4.3, <2"] +gsheets = ["shillelagh[gsheetsapi]>=1.4.4, <2"] hana = ["hdbcli==2.4.162", "sqlalchemy_hana==0.4.0"] hive = [ "pyhive[hive]>=0.6.5;python_version<'3.11'", @@ -158,7 +164,7 @@ hive = [ "thrift>=0.14.1, <1.0.0", "thrift_sasl>=0.4.3, < 1.0.0", ] -impala = ["impyla>0.16.2, <0.17"] +impala = ["impyla>0.16.2, <0.23"] kusto = ["sqlalchemy-kusto>=3.0.0, <4"] kylin = ["kylinpy>=2.8.1, <2.9"] mssql = ["pymssql>=2.2.8, <3"] @@ -171,9 +177,9 @@ ocient = [ "shapely", "geojson", ] -oracle = ["cx-Oracle>8.0.0, <8.1"] +oracle = ["cx-Oracle>8.0.0, <8.4"] parseable = ["sqlalchemy-parseable>=0.1.3,<0.2.0"] -pinot = ["pinotdb>=5.0.0, <6.0.0"] +pinot = ["pinotdb>=5.0.0, <10.0.0"] playwright = ["playwright>=1.37.0, <2"] postgres = ["psycopg2-binary==2.9.12"] presto = ["pyhive[presto]>=0.6.5"] @@ -181,7 +187,7 @@ trino = ["trino>=0.328.0"] prophet = ["prophet>=1.1.6, <2"] redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"] risingwave = ["sqlalchemy-risingwave"] -shillelagh = ["shillelagh[all]>=1.4.3, <2"] +shillelagh = ["shillelagh[all]>=1.4.4, <2"] singlestore = ["sqlalchemy-singlestoredb>=1.1.1, <2"] snowflake = ["snowflake-sqlalchemy>=1.2.4, <2"] sqlite = ["syntaqlite>=0.1.0"] @@ -197,7 +203,7 @@ tdengine = [ ] teradata = ["teradatasql>=16.20.0.23"] thumbnails = [] # deprecated, will be removed in 7.0 -vertica = ["sqlalchemy-vertica-python>=0.5.9, < 0.6"] +vertica = ["sqlalchemy-vertica-python>= 0.5.9, < 0.7"] netezza = ["nzalchemy>=11.0.2"] starrocks = ["starrocks>=1.0.0"] doris = ["pydoris>=1.0.0, <2.0.0"] @@ -218,7 +224,7 @@ development = [ "progress>=1.5,<2", "psutil", "pyfakefs", - "pyinstrument>=4.0.2,<5", + "pyinstrument>=4.0.2,<6", "pylint", "pytest<8.0.0", # hairy issue with pytest >=8 where current_app proxies are not set in time "pytest-asyncio", @@ -288,6 +294,7 @@ module = [ "superset.tags.filters", "superset.commands.security.update", "superset.commands.security.create", + "superset.semantic_layers.api", ] warn_unused_ignores = false @@ -376,6 +383,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.lint.per-file-ignores] "superset/mcp_service/app.py" = ["S608", "E501"] # LLM instruction text: SQL examples (S608) and long lines in multiline string (E501) +"superset/mcp_service/*/tool/list_*.py" = ["E501"] # LLM docstring examples show full request shapes which exceed line length "scripts/*" = ["TID251"] "setup.py" = ["TID251"] "superset/config.py" = ["TID251"] diff --git a/requirements/base.txt b/requirements/base.txt index 75236148b96..9c99184f920 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -183,7 +183,9 @@ idna==3.10 # trio # url-normalize isodate==0.7.2 - # via apache-superset (pyproject.toml) + # via + # apache-superset (pyproject.toml) + # apache-superset-core itsdangerous==2.2.0 # via # flask @@ -296,6 +298,7 @@ pyarrow==20.0.0 # via # -r requirements/base.in # apache-superset (pyproject.toml) + # apache-superset-core pyasn1==0.6.3 # via # pyasn1-modules @@ -381,7 +384,7 @@ selenium==4.32.0 # via apache-superset (pyproject.toml) setuptools==80.9.0 # via -r requirements/base.in -shillelagh==1.4.3 +shillelagh==1.4.4 # via apache-superset (pyproject.toml) simplejson==3.20.1 # via apache-superset (pyproject.toml) diff --git a/requirements/development.txt b/requirements/development.txt index fd18bdb3a82..b7664ddae6b 100644 --- a/requirements/development.txt +++ b/requirements/development.txt @@ -442,6 +442,7 @@ isodate==0.7.2 # via # -c requirements/base-constraint.txt # apache-superset + # apache-superset-core isort==6.0.1 # via pylint itsdangerous==2.2.0 @@ -715,6 +716,7 @@ pyarrow==20.0.0 # via # -c requirements/base-constraint.txt # apache-superset + # apache-superset-core # db-dtypes # pandas-gbq pyasn1==0.6.3 @@ -866,6 +868,8 @@ referencing==0.36.2 # jsonschema # jsonschema-path # jsonschema-specifications +regex==2026.4.4 + # via tiktoken requests==2.33.0 # via # -c requirements/base-constraint.txt @@ -878,6 +882,7 @@ requests==2.33.0 # requests-cache # requests-oauthlib # shillelagh + # tiktoken # trino requests-cache==1.2.1 # via @@ -931,7 +936,7 @@ setuptools==80.9.0 # pydata-google-auth # zope-event # zope-interface -shillelagh==1.4.3 +shillelagh==1.4.4 # via # -c requirements/base-constraint.txt # apache-superset @@ -1003,6 +1008,8 @@ tabulate==0.9.0 # via # -c requirements/base-constraint.txt # apache-superset +tiktoken==0.12.0 + # via apache-superset tomli-w==1.2.0 # via apache-superset-extensions-cli tomlkit==0.13.3 diff --git a/scripts/change_detector.py b/scripts/change_detector.py index 13f05b7b269..9a0e1fc8501 100755 --- a/scripts/change_detector.py +++ b/scripts/change_detector.py @@ -20,7 +20,7 @@ import json import os import re import subprocess -from typing import List +from typing import List, Optional from urllib.request import Request, urlopen # Define patterns for each group of files you're interested in @@ -111,7 +111,7 @@ def main(event_type: str, sha: str, repo: str) -> None: """Main function to check for file changes based on event context.""" print("SHA:", sha) print("EVENT_TYPE", event_type) - files = [] + files: Optional[List[str]] = [] if event_type == "pull_request": pr_number = os.getenv("GITHUB_REF", "").split("/")[-2] if is_int(pr_number): @@ -124,11 +124,15 @@ def main(event_type: str, sha: str, repo: str) -> None: print("Files touched since previous commit:") print_files(files) - elif event_type == "workflow_dispatch": - print("Workflow dispatched, assuming all changed") + elif event_type in ("workflow_dispatch", "schedule"): + # Manual or cron-triggered runs aren't tied to a specific diff, so + # treat every group as changed. `files = None` makes the loop below + # short-circuit to True for every group via `files is None or ...`. + print(f"{event_type} run, assuming all changed") + files = None else: - raise ValueError("Unsupported event type") + raise ValueError(f"Unsupported event type: {event_type}") changes_detected = {} for group, regex_patterns in PATTERNS.items(): @@ -144,7 +148,7 @@ def main(event_type: str, sha: str, repo: str) -> None: # NOTE: as noted above, we assume that if 100 files are touched, we should # trigger all checks. This is a workaround for the GitHub API limit of 100 # files. Using >= 99 because off-by-one errors are not uncommon - if changed or len(files) >= 99: + if changed or (files is not None and len(files) >= 99): print(f"{check}=true", file=f) print(f"Triggering group: {check}") diff --git a/superset-core/pyproject.toml b/superset-core/pyproject.toml index 3af044c90d5..31886f8a23a 100644 --- a/superset-core/pyproject.toml +++ b/superset-core/pyproject.toml @@ -18,7 +18,7 @@ [project] name = "apache-superset-core" -version = "0.1.0rc3" +version = "0.1.0" description = "Core Python package for building Apache Superset backend extensions and integrations" readme = "README.md" authors = [ @@ -43,6 +43,8 @@ classifiers = [ ] dependencies = [ "flask-appbuilder>=5.0.2,<6", + "isodate>=0.7.0", + "pyarrow>=16.0.0", "pydantic>=2.8.0", "sqlalchemy>=1.4.0,<2.0", "sqlalchemy-utils>=0.38.0, <0.43", # expanding lowerbound to work with pydoris diff --git a/superset-core/src/superset_core/semantic_layers/config.py b/superset-core/src/superset_core/semantic_layers/config.py new file mode 100644 index 00000000000..7c9aa520b11 --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/config.py @@ -0,0 +1,73 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +from typing import Any + +from pydantic import BaseModel + + +def build_configuration_schema( + config_class: type[BaseModel], + configuration: BaseModel | None = None, +) -> dict[str, Any]: + """ + Build a JSON schema from a Pydantic configuration class. + + Handles generic boilerplate that any semantic layer with dynamic fields needs: + + - Reorders properties to match model field order (Pydantic sorts alphabetically) + - When ``configuration`` is None, sets ``enum: []`` on all ``x-dynamic`` properties + so the frontend renders them as empty dropdowns + + Semantic layer implementations call this instead of + ``model_json_schema()`` directly, + then only need to add their own dynamic population logic. + """ + schema = config_class.model_json_schema() + + # Pydantic sorts properties alphabetically; restore model field order + field_order = [ + field.alias or name for name, field in config_class.model_fields.items() + ] + schema["properties"] = { + key: schema["properties"][key] + for key in field_order + if key in schema["properties"] + } + + if configuration is None: + for prop_schema in schema["properties"].values(): + if prop_schema.get("x-dynamic"): + prop_schema["enum"] = [] + + return schema + + +def check_dependencies( + prop_schema: dict[str, Any], + configuration: BaseModel, +) -> bool: + """ + Check whether a dynamic property's dependencies are satisfied. + + Reads the ``x-dependsOn`` list from the property schema and returns ``True`` + when every referenced attribute on ``configuration`` is truthy. + """ + dependencies = prop_schema.get("x-dependsOn", []) + return all(getattr(configuration, dep, None) for dep in dependencies) diff --git a/superset-core/src/superset_core/semantic_layers/daos.py b/superset-core/src/superset_core/semantic_layers/daos.py new file mode 100644 index 00000000000..4b55231d0b2 --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/daos.py @@ -0,0 +1,169 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" +Semantic layer DAO interfaces for superset-core. + +Provides abstract DAO classes for semantic layers and views that define the +interface contract. Host implementations replace these with concrete classes +backed by SQLAlchemy during initialization. + +Usage: + from superset_core.semantic_layers.daos import ( + AbstractSemanticLayerDAO, + AbstractSemanticViewDAO, + ) +""" + +from __future__ import annotations + +from abc import abstractmethod +from typing import Any, ClassVar + +from superset_core.common.daos import BaseDAO +from superset_core.semantic_layers.models import SemanticLayerModel, SemanticViewModel + + +class AbstractSemanticLayerDAO(BaseDAO[SemanticLayerModel]): + """ + Abstract DAO interface for SemanticLayer. + + Host implementations will replace this class during initialization + with a concrete DAO providing actual database access. + """ + + model_cls: ClassVar[type[Any] | None] = None + base_filter = None + id_column_name = "uuid" + uuid_column_name = "uuid" + + @classmethod + @abstractmethod + def validate_uniqueness(cls, name: str) -> bool: + """ + Validate that a semantic layer name is unique. + + :param name: Semantic layer name to validate + :return: True if the name is unique, False otherwise + """ + ... + + @classmethod + @abstractmethod + def validate_update_uniqueness(cls, layer_uuid: str, name: str) -> bool: + """ + Validate that a semantic layer name is unique for an update operation, + excluding the layer being updated. + + :param layer_uuid: UUID of the semantic layer being updated + :param name: New name to validate + :return: True if the name is unique, False otherwise + """ + ... + + @classmethod + @abstractmethod + def find_by_name(cls, name: str) -> SemanticLayerModel | None: + """ + Find a semantic layer by name. + + :param name: Semantic layer name + :return: SemanticLayerModel instance or None + """ + ... + + @classmethod + @abstractmethod + def get_semantic_views(cls, layer_uuid: str) -> list[SemanticViewModel]: + """ + Get all semantic views associated with a semantic layer. + + :param layer_uuid: UUID of the semantic layer + :return: List of SemanticViewModel instances + """ + ... + + +class AbstractSemanticViewDAO(BaseDAO[SemanticViewModel]): + """ + Abstract DAO interface for SemanticView. + + Host implementations will replace this class during initialization + with a concrete DAO providing actual database access. + """ + + model_cls: ClassVar[type[Any] | None] = None + base_filter = None + id_column_name = "id" + uuid_column_name = "uuid" + + @classmethod + @abstractmethod + def validate_uniqueness( + cls, + name: str, + layer_uuid: str, + configuration: dict[str, Any], + ) -> bool: + """ + Validate that a semantic view is unique within a semantic layer. + + Uniqueness is determined by the combination of name, layer UUID, and + configuration. + + :param name: View name + :param layer_uuid: UUID of the parent semantic layer + :param configuration: Configuration dict to compare + :return: True if unique, False otherwise + """ + ... + + @classmethod + @abstractmethod + def validate_update_uniqueness( + cls, + view_uuid: str, + name: str, + layer_uuid: str, + configuration: dict[str, Any], + ) -> bool: + """ + Validate that a semantic view is unique within a semantic layer for an + update operation, excluding the view being updated. + + :param view_uuid: UUID of the view being updated + :param name: New name to validate + :param layer_uuid: UUID of the parent semantic layer + :param configuration: Configuration dict to compare + :return: True if unique, False otherwise + """ + ... + + @classmethod + @abstractmethod + def find_by_name(cls, name: str, layer_uuid: str) -> SemanticViewModel | None: + """ + Find a semantic view by name within a semantic layer. + + :param name: View name + :param layer_uuid: UUID of the parent semantic layer + :return: SemanticViewModel instance or None + """ + ... + + +__all__ = ["AbstractSemanticLayerDAO", "AbstractSemanticViewDAO"] diff --git a/superset-core/src/superset_core/semantic_layers/decorators.py b/superset-core/src/superset_core/semantic_layers/decorators.py new file mode 100644 index 00000000000..50dd975702c --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/decorators.py @@ -0,0 +1,102 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" +Semantic layer registration decorator for Superset. + +This module provides a decorator interface to register semantic layer +implementations with the host application, enabling automatic discovery +by the extensions framework. + +Usage: + from superset_core.semantic_layers.decorators import semantic_layer + + @semantic_layer( + id="snowflake", + name="Snowflake Cortex", + description="Snowflake semantic layer via Cortex Analyst", + ) + class SnowflakeSemanticLayer(SemanticLayer[SnowflakeConfig, SnowflakeView]): + ... + + # Or with minimal arguments: + @semantic_layer(id="dbt", name="dbt Semantic Layer") + class DbtSemanticLayer(SemanticLayer[DbtConfig, DbtView]): + ... +""" + +from __future__ import annotations + +from typing import Callable, TypeVar + +# Type variable for decorated semantic layer classes +T = TypeVar("T") + + +def semantic_layer( + id: str, + name: str, + description: str | None = None, +) -> Callable[[T], T]: + """ + Decorator to register a semantic layer implementation. + + Automatically detects extension context and applies appropriate + namespacing to prevent ID conflicts between host and extension + semantic layers. + + Host implementations will replace this function during initialization + with a concrete implementation providing actual functionality. + + Args: + id: Unique semantic layer type identifier (e.g., "snowflake", + "dbt"). Used as the key in the semantic layers registry and + stored in the ``type`` column of the ``SemanticLayer`` model. + name: Human-readable display name (e.g., "Snowflake Cortex"). + Shown in the UI when listing available semantic layer types. + description: Optional description for documentation and UI + tooltips. + + Returns: + Decorated semantic layer class registered with the host + application. + + Raises: + NotImplementedError: If called before host implementation is + initialized. + + Example: + from superset_core.semantic_layers.decorators import semantic_layer + from superset_core.semantic_layers.layer import SemanticLayer + + @semantic_layer( + id="snowflake", + name="Snowflake Cortex", + description="Connect to Snowflake Cortex Analyst", + ) + class SnowflakeSemanticLayer( + SemanticLayer[SnowflakeConfig, SnowflakeView] + ): + ... + """ + raise NotImplementedError( + "Semantic layer decorator not initialized. " + "This decorator should be replaced during Superset startup." + ) + + +__all__ = ["semantic_layer"] diff --git a/superset-core/src/superset_core/semantic_layers/layer.py b/superset-core/src/superset_core/semantic_layers/layer.py new file mode 100644 index 00000000000..2dbffdec003 --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/layer.py @@ -0,0 +1,129 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import Any, Generic, TypeVar + +from pydantic import BaseModel +from superset_core.semantic_layers.view import SemanticView + +ConfigT = TypeVar("ConfigT", bound=BaseModel) +SemanticViewT = TypeVar("SemanticViewT", bound="SemanticView") + + +class SemanticLayer(ABC, Generic[ConfigT, SemanticViewT]): + """ + Abstract base class for semantic layers. + """ + + configuration_class: type[BaseModel] + + @classmethod + @abstractmethod + def from_configuration( + cls, + configuration: dict[str, Any], + ) -> SemanticLayer[ConfigT, SemanticViewT]: + """ + Create a semantic layer from its configuration. + """ + raise NotImplementedError( + "Semantic layers must implement the from_configuration method" + ) + + @classmethod + @abstractmethod + def get_configuration_schema( + cls, + configuration: ConfigT | None = None, + ) -> dict[str, Any]: + """ + Get the JSON schema for the configuration needed to add the semantic layer. + + A partial configuration `configuration` can be sent to improve the schema, + allowing for progressive validation and better UX. For example, a semantic + layer might require: + + - auth information + - a database + + If the user provides the auth information, a client can send the partial + configuration to this method, and the resulting JSON schema would include + the list of databases the user has access to, allowing a dropdown to be + populated. + + The Snowflake semantic layer has an example implementation of this method, where + database and schema names are populated based on the provided connection info. + """ + raise NotImplementedError( + "Semantic layers must implement the get_configuration_schema method" + ) + + @classmethod + @abstractmethod + def get_runtime_schema( + cls, + configuration: ConfigT, + runtime_data: dict[str, Any] | None = None, + ) -> dict[str, Any]: + """ + Get the JSON schema for the runtime parameters needed to load semantic views. + + This returns the schema needed to connect to a semantic view given the + configuration for the semantic layer. For example, a semantic layer might + be configured by: + + - auth information + - an optional database + + If the user does not provide a database when creating the semantic layer, the + runtime schema would require the database name to be provided before loading any + semantic views. This allows users to create semantic layers that connect to a + specific database (or project, account, etc.), or that allow users to select it + at query time. + + The Snowflake semantic layer has an example implementation of this method, where + database and schema names are required if they were not provided in the initial + configuration. + """ + raise NotImplementedError( + "Semantic layers must implement the get_runtime_schema method" + ) + + @abstractmethod + def get_semantic_views( + self, + runtime_configuration: dict[str, Any], + ) -> set[SemanticViewT]: + """ + Get the semantic views available in the semantic layer. + + The runtime configuration can provide information like a given project or + schema, used to restrict the semantic views returned. + """ + + @abstractmethod + def get_semantic_view( + self, + name: str, + additional_configuration: dict[str, Any], + ) -> SemanticViewT: + """ + Get a specific semantic view by its name and additional configuration. + """ diff --git a/superset-core/src/superset_core/semantic_layers/models.py b/superset-core/src/superset_core/semantic_layers/models.py new file mode 100644 index 00000000000..e132a108499 --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/models.py @@ -0,0 +1,85 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" +Semantic layer model interfaces for superset-core. + +Provides abstract model classes for semantic layers and views that will be +replaced by the host implementation's concrete SQLAlchemy models during +initialization. + +Usage: + from superset_core.semantic_layers.models import ( + SemanticLayerModel, + SemanticViewModel, + ) +""" + +from __future__ import annotations + +from datetime import datetime +from uuid import UUID + +from superset_core.common.models import CoreModel + + +class SemanticLayerModel(CoreModel): + """ + Abstract interface for the SemanticLayer database model. + + Host implementations will replace this class during initialization + with a concrete SQLAlchemy model providing actual persistence. + """ + + __abstract__ = True + + # Type hints for expected column attributes + uuid: UUID + name: str + description: str | None + type: str + configuration: str + configuration_version: int + cache_timeout: int | None + created_on: datetime | None + changed_on: datetime | None + + +class SemanticViewModel(CoreModel): + """ + Abstract interface for the SemanticView database model. + + Host implementations will replace this class during initialization + with a concrete SQLAlchemy model providing actual persistence. + """ + + __abstract__ = True + + # Type hints for expected column attributes + id: int + uuid: UUID + name: str + description: str | None + configuration: str + configuration_version: int + cache_timeout: int | None + semantic_layer_uuid: UUID + created_on: datetime | None + changed_on: datetime | None + + +__all__ = ["SemanticLayerModel", "SemanticViewModel"] diff --git a/superset-core/src/superset_core/semantic_layers/types.py b/superset-core/src/superset_core/semantic_layers/types.py new file mode 100644 index 00000000000..1239c1303be --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/types.py @@ -0,0 +1,209 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +import enum +from dataclasses import dataclass +from datetime import date, datetime, time, timedelta + +import isodate +import pyarrow as pa + + +@dataclass(frozen=True) +class Grain: + """ + Represents a time grain (e.g., day, month, year). + + Attributes: + name: Human-readable name of the grain (e.g., "Second") + representation: ISO 8601 duration (e.g., "PT1S", "P1D", "P1M") + """ + + name: str + representation: str + + def __post_init__(self) -> None: + isodate.parse_duration(self.representation) + + def __eq__(self, other: object) -> bool: + if isinstance(other, Grain): + return self.representation == other.representation + return NotImplemented + + def __hash__(self) -> int: + return hash(self.representation) + + +class Grains: + """Pre-defined common grains and factory for custom ones.""" + + SECOND = Grain("Second", "PT1S") + MINUTE = Grain("Minute", "PT1M") + HOUR = Grain("Hour", "PT1H") + DAY = Grain("Day", "P1D") + WEEK = Grain("Week", "P1W") + MONTH = Grain("Month", "P1M") + QUARTER = Grain("Quarter", "P3M") + YEAR = Grain("Year", "P1Y") + + _REGISTRY: dict[str, Grain] = { + "PT1S": SECOND, + "PT1M": MINUTE, + "PT1H": HOUR, + "P1D": DAY, + "P1W": WEEK, + "P1M": MONTH, + "P3M": QUARTER, + "P1Y": YEAR, + } + + @classmethod + def get(cls, representation: str, name: str | None = None) -> Grain: + """Return a pre-defined grain or create a custom one.""" + if grain := cls._REGISTRY.get(representation): + return grain + return Grain(name or representation, representation) + + +@dataclass(frozen=True) +class Dimension: + id: str + name: str + type: pa.DataType + + definition: str | None = None + description: str | None = None + grain: Grain | None = None + + +@dataclass(frozen=True) +class Metric: + id: str + name: str + type: pa.DataType + + definition: str + description: str | None = None + + +@dataclass(frozen=True) +class AdhocExpression: + id: str + definition: str + + +class Operator(str, enum.Enum): + EQUALS = "=" + NOT_EQUALS = "!=" + GREATER_THAN = ">" + LESS_THAN = "<" + GREATER_THAN_OR_EQUAL = ">=" + LESS_THAN_OR_EQUAL = "<=" + IN = "IN" + NOT_IN = "NOT IN" + LIKE = "LIKE" + NOT_LIKE = "NOT LIKE" + IS_NULL = "IS NULL" + IS_NOT_NULL = "IS NOT NULL" + ADHOC = "ADHOC" + + +FilterValues = str | int | float | bool | datetime | date | time | timedelta | None + + +class PredicateType(enum.Enum): + WHERE = "WHERE" + HAVING = "HAVING" + + +@dataclass(frozen=True, order=True) +class Filter: + type: PredicateType + column: Dimension | Metric | None + operator: Operator + value: FilterValues | frozenset[FilterValues] + + +class OrderDirection(enum.Enum): + ASC = "ASC" + DESC = "DESC" + + +OrderTuple = tuple[Metric | Dimension | AdhocExpression, OrderDirection] + + +@dataclass(frozen=True) +class GroupLimit: + """ + Limit query to top/bottom N combinations of specified dimensions. + + The `filters` parameter allows specifying separate filter constraints for the + group limit subquery. This is useful when you want to determine the top N groups + using different criteria (e.g., a different time range) than the main query. + + For example, you might want to find the top 10 products by sales over the last + 30 days, but then show daily sales for those products over the last 7 days. + """ + + dimensions: list[Dimension] + top: int + metric: Metric | None + direction: OrderDirection = OrderDirection.DESC + group_others: bool = False + filters: set[Filter] | None = None + + +@dataclass(frozen=True) +class SemanticRequest: + """ + Represents a request made to obtain semantic results. + + This could be a SQL query, an HTTP request, etc. + """ + + type: str + definition: str + + +@dataclass(frozen=True) +class SemanticResult: + """ + Represents the results of a semantic query. + + This includes any requests (SQL queries, HTTP requests) that were performed in order + to obtain the results, in order to help troubleshooting. + """ + + requests: list[SemanticRequest] + results: pa.Table + + +@dataclass(frozen=True) +class SemanticQuery: + """ + Represents a semantic query. + """ + + metrics: list[Metric] + dimensions: list[Dimension] + filters: set[Filter] | None = None + order: list[OrderTuple] | None = None + limit: int | None = None + offset: int | None = None + group_limit: GroupLimit | None = None diff --git a/superset-core/src/superset_core/semantic_layers/view.py b/superset-core/src/superset_core/semantic_layers/view.py new file mode 100644 index 00000000000..73ee35aee85 --- /dev/null +++ b/superset-core/src/superset_core/semantic_layers/view.py @@ -0,0 +1,113 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +import enum +from abc import ABC, abstractmethod + +from superset_core.semantic_layers.types import ( + Dimension, + Filter, + Metric, + SemanticQuery, + SemanticResult, +) + + +# TODO (betodealmeida): move to the extension JSON +class SemanticViewFeature(enum.Enum): + """ + Custom features supported by semantic layers. + """ + + ADHOC_EXPRESSIONS_IN_ORDERBY = "ADHOC_EXPRESSIONS_IN_ORDERBY" + GROUP_LIMIT = "GROUP_LIMIT" + GROUP_OTHERS = "GROUP_OTHERS" + + +class SemanticView(ABC): + """ + Abstract base class for semantic views. + """ + + features: frozenset[SemanticViewFeature] + + # Implementations must expose a display name for the view. + # Declared here as a type annotation (not abstract) so that existing + # implementations are not required to add a formal @abstractmethod. + name: str + + @abstractmethod + def uid(self) -> str: + """ + Returns a unique identifier for the semantic view. + """ + + @abstractmethod + def get_dimensions(self) -> set[Dimension]: + """ + Get the dimensions defined in the semantic view. + """ + + @abstractmethod + def get_metrics(self) -> set[Metric]: + """ + Get the metrics defined in the semantic view. + """ + + @abstractmethod + def get_values( + self, + dimension: Dimension, + filters: set[Filter] | None = None, + ) -> SemanticResult: + """ + Return distinct values for a dimension. + """ + + @abstractmethod + def get_table(self, query: SemanticQuery) -> SemanticResult: + """ + Execute a semantic query and return the results. + """ + + @abstractmethod + def get_row_count(self, query: SemanticQuery) -> SemanticResult: + """ + Execute a query and return the number of rows the result would have. + """ + + @abstractmethod + def get_compatible_metrics( + self, + selected_metrics: set[Metric], + selected_dimensions: set[Dimension], + ) -> set[Metric]: + """ + Return metrics compatible with the selected dimensions. + """ + + @abstractmethod + def get_compatible_dimensions( + self, + selected_metrics: set[Metric], + selected_dimensions: set[Dimension], + ) -> set[Dimension]: + """ + Return dimensions compatible with the selected metrics. + """ diff --git a/superset-embedded-sdk/package-lock.json b/superset-embedded-sdk/package-lock.json index 4b34612ff21..27badd2953f 100644 --- a/superset-embedded-sdk/package-lock.json +++ b/superset-embedded-sdk/package-lock.json @@ -71,14 +71,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -126,16 +126,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -242,6 +242,15 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", @@ -257,30 +266,27 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -303,11 +309,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -377,21 +382,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -435,30 +438,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1262,16 +1248,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1858,49 +1843,45 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2659,17 +2640,13 @@ } }, "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==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -2681,15 +2658,6 @@ "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==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", @@ -2701,15 +2669,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "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==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3199,19 +3167,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -3617,21 +3572,6 @@ } ] }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -3741,23 +3681,6 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, "node_modules/colorette": { "version": "2.0.16", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", @@ -4037,16 +3960,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4301,11 +4214,20 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/fastest-levenshtein": { "version": "1.0.12", @@ -4610,16 +4532,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6626,8 +6538,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-yaml": { "version": "3.14.2", @@ -6643,15 +6554,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -7495,19 +7406,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "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", @@ -7610,15 +7508,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8122,13 +8011,14 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -8161,15 +8051,16 @@ } }, "@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "requires": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -8243,6 +8134,12 @@ "resolve": "^1.14.2" } }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true + }, "@babel/helper-member-expression-to-functions": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", @@ -8254,25 +8151,24 @@ } }, "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" } }, "@babel/helper-optimise-call-expression": { @@ -8285,9 +8181,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -8333,15 +8229,15 @@ } }, "@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true }, "@babel/helper-validator-option": { @@ -8371,25 +8267,13 @@ "@babel/types": "^7.25.6" } }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, "@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "requires": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.29.0" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -8882,15 +8766,15 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" } }, "@babel/plugin-transform-modules-umd": { @@ -9273,40 +9157,39 @@ } }, "@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" } }, "@bcoe/v8-coverage": { @@ -9879,13 +9762,12 @@ } }, "@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==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, @@ -9895,12 +9777,6 @@ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, - "@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==", - "dev": true - }, "@jridgewell/source-map": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", @@ -9912,15 +9788,15 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "@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==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -10346,15 +10222,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -10640,17 +10507,6 @@ "integrity": "sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -10726,21 +10582,6 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "colorette": { "version": "2.0.16", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", @@ -10940,12 +10781,6 @@ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11133,9 +10968,9 @@ "dev": true }, "fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true }, "fastest-levenshtein": { @@ -11342,12 +11177,6 @@ "function-bind": "^1.1.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -12835,9 +12664,9 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true }, "json-parse-even-better-errors": { @@ -13458,15 +13287,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "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", @@ -13528,12 +13348,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/superset-embedded-sdk/src/index.ts b/superset-embedded-sdk/src/index.ts index e732a36c22f..2eb9f37181a 100644 --- a/superset-embedded-sdk/src/index.ts +++ b/superset-embedded-sdk/src/index.ts @@ -66,7 +66,7 @@ export type EmbedDashboardParams = { iframeTitle?: string; /** additional iframe sandbox attributes ex (allow-top-navigation, allow-popups-to-escape-sandbox) **/ iframeSandboxExtras?: string[]; - /** iframe allow attribute for Permissions Policy (e.g., ['clipboard-write', 'fullscreen']) **/ + /** Additional Permissions Policy features for the iframe's `allow` attribute (e.g., ['camera', 'microphone']). `fullscreen` and `clipboard-write` are granted by default. **/ iframeAllowExtras?: string[]; /** force a specific refererPolicy to be used in the iframe request **/ referrerPolicy?: ReferrerPolicy; @@ -233,9 +233,14 @@ export async function embedDashboard({ iframe.src = `${supersetDomain}/embedded/${id}${urlParamsString}`; iframe.title = iframeTitle; iframe.style.background = 'transparent'; - if (iframeAllowExtras.length > 0) { - iframe.setAttribute('allow', iframeAllowExtras.join('; ')); - } + // Permissions Policy features the embedded dashboard relies on. Modern + // browsers gate these APIs on the iframe's `allow` attribute regardless + // of sandbox flags, so we include them by default. Host apps can extend + // the list via `iframeAllowExtras`. + const allowFeatures = Array.from( + new Set(['fullscreen', 'clipboard-write', ...iframeAllowExtras]), + ); + iframe.setAttribute('allow', allowFeatures.join('; ')); //@ts-ignore mountPoint.replaceChildren(iframe); log('placed the iframe'); diff --git a/superset-extensions-cli/pyproject.toml b/superset-extensions-cli/pyproject.toml index 6c5cdf7288c..99f4ca0fd52 100644 --- a/superset-extensions-cli/pyproject.toml +++ b/superset-extensions-cli/pyproject.toml @@ -17,7 +17,7 @@ [project] name = "apache-superset-extensions-cli" -version = "0.1.0rc3" +version = "0.1.0" description = "Official command-line interface for building, bundling, and managing Apache Superset extensions" readme = "README.md" authors = [ diff --git a/superset-frontend/.eslintrc.js b/superset-frontend/.eslintrc.js index fcca8cbf5ae..002d3f39252 100644 --- a/superset-frontend/.eslintrc.js +++ b/superset-frontend/.eslintrc.js @@ -77,6 +77,10 @@ const restrictedImportsRules = { name: 'query-string', message: 'Please use the URLSearchParams API instead of query-string.', }, + 'no-jest-mock-console': { + name: 'jest-mock-console', + message: 'Please use native Jest spies, i.e. jest.spyOn(console, "warn")', + } }; module.exports = { diff --git a/superset-frontend/cypress-base/package-lock.json b/superset-frontend/cypress-base/package-lock.json index e6346c4d33f..a430bb0cc88 100644 --- a/superset-frontend/cypress-base/package-lock.json +++ b/superset-frontend/cypress-base/package-lock.json @@ -96,14 +96,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -224,6 +225,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "peer": true, "engines": { "node": ">=6.9.0" } @@ -244,6 +246,7 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "peer": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -252,13 +255,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "engines": { "node": ">=6.9.0" } @@ -276,32 +276,31 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -317,9 +316,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "peer": true, "engines": { "node": ">=6.9.0" @@ -364,6 +363,7 @@ "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "peer": true, "dependencies": { "@babel/types": "^7.20.2" }, @@ -387,6 +387,7 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "peer": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -395,19 +396,17 @@ } }, "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==", - "license": "MIT", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "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==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "engines": { "node": ">=6.9.0" } @@ -462,12 +461,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", - "license": "MIT", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1223,15 +1221,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "peer": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1595,73 +1593,68 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "license": "MIT", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/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==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", - "license": "MIT", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2080,16 +2073,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==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -2100,14 +2089,6 @@ "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/source-map": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", @@ -2119,14 +2100,14 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "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==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4550,9 +4531,9 @@ "peer": true }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", @@ -4932,6 +4913,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "peer": true, "engines": { "node": ">=4" } @@ -5641,14 +5623,14 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -8758,14 +8740,15 @@ } }, "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -8857,7 +8840,8 @@ "@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "peer": true }, "@babel/helper-explode-assignable-expression": { "version": "7.18.6", @@ -8872,18 +8856,16 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "peer": true, "requires": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" }, "@babel/helper-member-expression-to-functions": { "version": "7.21.0", @@ -8895,26 +8877,22 @@ } }, "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "requires": { - "@babel/types": "^7.21.4" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" } }, "@babel/helper-optimise-call-expression": { @@ -8927,9 +8905,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "peer": true }, "@babel/helper-remap-async-to-generator": { @@ -8962,6 +8940,7 @@ "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "peer": true, "requires": { "@babel/types": "^7.20.2" } @@ -8979,19 +8958,20 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "peer": true, "requires": { "@babel/types": "^7.22.5" } }, "@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==" + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@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==" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" }, "@babel/helper-validator-option": { "version": "7.21.0", @@ -9030,11 +9010,11 @@ } }, "@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "requires": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.29.0" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -9523,15 +9503,15 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "peer": true, "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" } }, "@babel/plugin-transform-modules-umd": { @@ -9786,62 +9766,60 @@ } }, "@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "dependencies": { "@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==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "requires": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" } } } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "dependencies": { "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } } } }, "@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" } }, "@colors/colors": { @@ -10180,12 +10158,11 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" }, "@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==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, @@ -10194,11 +10171,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, - "@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==" - }, "@jridgewell/source-map": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", @@ -10210,14 +10182,14 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@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==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -12164,9 +12136,9 @@ "peer": true }, "fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "peer": true }, "fastq": { @@ -12441,7 +12413,8 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "peer": true }, "globby": { "version": "11.0.4", @@ -12945,9 +12918,9 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" }, "json-parse-even-better-errors": { "version": "2.3.1", diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 6a33fc8d9b2..dfb2e5c5f51 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -28,8 +28,14 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", + "@fontsource/fira-code": "^5.2.7", "@fontsource/ibm-plex-mono": "^5.2.7", + "@fontsource/inter": "^5.2.8", "@googleapis/sheets": "^13.0.1", + "@great-expectations/jsonforms-antd-renderers": "^2.2.10", + "@jsonforms/core": "^3.7.0", + "@jsonforms/react": "^3.7.0", + "@jsonforms/vanilla-renderers": "^3.7.0", "@luma.gl/constants": "~9.2.5", "@luma.gl/core": "~9.2.5", "@luma.gl/engine": "~9.2.5", @@ -37,6 +43,7 @@ "@luma.gl/shadertools": "~9.2.5", "@luma.gl/webgl": "~9.2.5", "@reduxjs/toolkit": "^1.9.3", + "@rjsf/antd": "^5.24.13", "@rjsf/core": "^5.24.13", "@rjsf/utils": "^5.24.3", "@rjsf/validator-ajv8": "^5.24.13", @@ -76,7 +83,7 @@ "ag-grid-community": "35.2.1", "ag-grid-react": "35.2.1", "antd": "^5.26.0", - "chrono-node": "^2.9.0", + "chrono-node": "^2.9.1", "classnames": "^2.2.5", "content-disposition": "^1.1.0", "d3-color": "^3.1.0", @@ -89,37 +96,37 @@ "fs-extra": "^11.3.4", "fuse.js": "^7.3.0", "geolib": "^3.3.14", - "geostyler": "^18.5.0", + "geostyler": "^18.5.1", "geostyler-data": "^1.1.0", "geostyler-openlayers-parser": "^5.7.0", "geostyler-style": "11.0.2", "geostyler-wfs-parser": "^3.0.1", "google-auth-library": "^10.6.2", - "immer": "^11.1.4", + "immer": "^11.1.7", "interweave": "^13.1.1", "jquery": "^4.0.0", "js-levenshtein": "^1.1.6", "json-bigint": "^1.0.0", "json-stringify-pretty-compact": "^2.0.0", "lodash": "^4.18.1", - "mapbox-gl": "^3.23.0", - "markdown-to-jsx": "^9.7.16", + "mapbox-gl": "^3.23.1", + "markdown-to-jsx": "^9.8.0", "match-sorter": "^8.3.0", "memoize-one": "^5.2.1", "mousetrap": "^1.6.5", "mustache": "^4.2.0", - "nanoid": "^5.1.9", + "nanoid": "^5.1.11", "ol": "^10.9.0", "pretty-ms": "^9.3.0", "query-string": "9.3.1", "re-resizable": "^6.11.2", - "react": "^17.0.2", + "react": "^18.2.0", "react-arborist": "^3.5.0", "react-checkbox-tree": "^1.8.0", "react-diff-viewer-continued": "^4.2.2", "react-dnd": "^11.1.3", "react-dnd-html5-backend": "^11.1.3", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-google-recaptcha": "^3.1.0", "react-intersection-observer": "^10.0.3", "react-json-tree": "^0.20.0", @@ -130,7 +137,6 @@ "react-reverse-portal": "^2.3.0", "react-router-dom": "^5.3.4", "react-search-input": "^0.11.3", - "react-sortable-hoc": "^2.0.0", "react-split": "^2.0.9", "react-table": "^7.8.0", "react-transition-group": "^4.4.5", @@ -163,19 +169,18 @@ "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-runtime": "^7.29.0", - "@babel/preset-env": "^7.29.2", + "@babel/preset-env": "^7.29.5", "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", - "@babel/register": "^7.23.7", + "@babel/register": "^7.29.3", "@babel/runtime": "^7.29.2", "@babel/runtime-corejs3": "^7.29.2", "@babel/types": "^7.28.6", - "@cypress/react": "^8.0.2", "@emotion/babel-plugin": "^11.13.5", "@emotion/jest": "^11.14.2", "@istanbuljs/nyc-config-typescript": "^1.0.1", "@mihkeleidast/storybook-addon-source": "^1.0.1", - "@playwright/test": "^1.59.1", + "@playwright/test": "^1.60.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.6.2", "@storybook/addon-actions": "^8.6.18", "@storybook/addon-controls": "^8.6.18", @@ -189,13 +194,12 @@ "@storybook/test": "^8.6.18", "@storybook/test-runner": "^0.17.0", "@svgr/webpack": "^8.1.0", - "@swc/core": "^1.15.32", + "@swc/core": "^1.15.33", "@swc/plugin-emotion": "^14.9.0", "@swc/plugin-transform-imports": "^12.5.0", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.1", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^12.8.3", "@types/content-disposition": "^0.5.9", "@types/dom-to-image": "^2.6.7", @@ -205,8 +209,8 @@ "@types/json-bigint": "^1.0.4", "@types/mousetrap": "^1.6.15", "@types/node": "^25.6.0", - "@types/react": "^17.0.83", - "@types/react-dom": "^17.0.26", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@types/react-loadable": "^5.5.11", "@types/react-redux": "^7.1.10", "@types/react-resizable": "^3.0.8", @@ -218,14 +222,14 @@ "@types/rison": "0.1.0", "@types/tinycolor2": "^1.4.3", "@types/unzipper": "^0.10.11", - "@typescript-eslint/eslint-plugin": "^8.59.1", - "@typescript-eslint/parser": "^8.58.2", + "@typescript-eslint/eslint-plugin": "^8.59.3", + "@typescript-eslint/parser": "^8.59.3", "babel-jest": "^30.0.2", "babel-loader": "^10.1.1", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-jsx-remove-data-test-id": "^3.0.0", "babel-plugin-lodash": "^3.3.4", - "baseline-browser-mapping": "^2.10.21", + "baseline-browser-mapping": "^2.10.29", "cheerio": "1.2.0", "concurrently": "^9.2.1", "copy-webpack-plugin": "^14.0.0", @@ -245,7 +249,7 @@ "eslint-plugin-no-only-tests": "^3.4.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react-prefer-function-component": "^5.0.0", - "eslint-plugin-react-you-might-not-need-an-effect": "^0.9.3", + "eslint-plugin-react-you-might-not-need-an-effect": "^0.10.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^7.16.2", "eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors", @@ -260,12 +264,12 @@ "jest-html-reporter": "^4.4.0", "jest-websocket-mock": "^2.5.0", "js-yaml-loader": "^1.2.2", - "jsdom": "^29.1.0", + "jsdom": "^29.1.1", "lerna": "^9.0.4", "lightningcss": "^1.32.0", "mini-css-extract-plugin": "^2.10.2", "open-cli": "^9.0.0", - "oxlint": "^1.62.0", + "oxlint": "^1.63.0", "po2json": "^0.4.5", "prettier": "3.8.3", "prettier-plugin-packagejson": "^3.0.2", @@ -279,20 +283,20 @@ "storybook": "8.6.18", "style-loader": "^4.0.0", "swc-loader": "^0.2.7", - "terser-webpack-plugin": "^5.5.0", + "terser-webpack-plugin": "^5.6.0", "ts-jest": "^29.4.9", "tscw-config": "^1.1.2", "tsx": "^4.21.0", "typescript": "5.4.5", "unzipper": "^0.12.3", "vm-browserify": "^1.1.2", - "wait-on": "^9.0.5", + "wait-on": "^9.0.10", "webpack": "^5.106.2", "webpack-bundle-analyzer": "^5.3.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.3", "webpack-manifest-plugin": "^5.0.1", - "webpack-sources": "^3.4.0", + "webpack-sources": "^3.4.1", "webpack-visualizer-plugin2": "^2.0.0" }, "engines": { @@ -398,9 +402,9 @@ "license": "MIT" }, "node_modules/@ant-design/cssinjs/node_modules/stylis": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.5.tgz", - "integrity": "sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", "license": "MIT" }, "node_modules/@ant-design/fast-color": { @@ -578,9 +582,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -774,9 +778,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", - "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", "dependencies": { @@ -1062,6 +1066,23 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz", + "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", @@ -1817,9 +1838,9 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "license": "MIT", "dependencies": { @@ -2388,19 +2409,20 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", + "version": "7.29.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.5.tgz", + "integrity": "sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.29.0", + "@babel/compat-data": "^7.29.3", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", @@ -2432,7 +2454,7 @@ "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-systemjs": "^7.29.4", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-new-target": "^7.27.1", @@ -2473,13 +2495,13 @@ } }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", - "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "core-js-compat": "^3.48.0" }, "peerDependencies": { @@ -2553,9 +2575,9 @@ } }, "node_modules/@babel/register": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.28.6.tgz", - "integrity": "sha512-pgcbbEl/dWQYb6L6Yew6F94rdwygfuv+vJ/tXfwIOYAfPB6TNWpXUMEtEq3YuTeHRdvMIhvz13bkT9CNaS+wqA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.29.3.tgz", + "integrity": "sha512-F6C1KpIdoImKQfsD6HSxZ+mS4YY/2Q+JsqrmTC5ApVkTR2rG+nnbpjhWwzA5bDNu8mJjB3AryqDaWFLd4gCbJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2671,30 +2693,25 @@ } }, "node_modules/@bramus/specificity/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@bramus/specificity/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } + "license": "CC0-1.0" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -2833,97 +2850,14 @@ "node": ">=20.19.0" } }, - "node_modules/@cypress/react": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@cypress/react/-/react-8.0.2.tgz", - "integrity": "sha512-7TgXXEeJ/GnGiIQhO8mAfkyychyMv5hNyISV3ti/vceriTI0uGtbjwRqLQhuVgOSHLtboUZUIoRlR6BkgIdVVg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^16.9.16 || ^17.0.0", - "cypress": "*", - "react": "^=16.x || ^=17.x", - "react-dom": "^=16.x || ^=17.x" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@cypress/request": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", - "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.4", - "http-signature": "~1.4.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "~6.14.1", - "safe-buffer": "^5.1.2", - "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/@deck.gl/aggregation-layers": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.2.6.tgz", - "integrity": "sha512-T42ZwB63KI4+0pe2HBwMQS7qnqyv3LlqAQfRSHBlFZMzBq72SxIgk9BzhrT16uBHxFFjjMh6K5g28/UfDOXQEg==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.2.11.tgz", + "integrity": "sha512-MRFbBHtMcDkOthxXnMPm6nF08DjFDACaIQsJSyHkdWtLUTSLHsWnOTn/8QbB4ka86WyNyfJy3dibLu/m3ei2ow==", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.2.6", - "@luma.gl/shadertools": "^9.2.6", + "@luma.gl/constants": "~9.2.6", + "@luma.gl/shadertools": "~9.2.6", "@math.gl/core": "^4.1.0", "@math.gl/web-mercator": "^4.1.0", "d3-hexbin": "^0.2.1" @@ -2961,13 +2895,13 @@ } }, "node_modules/@deck.gl/extensions": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.2.6.tgz", - "integrity": "sha512-HNuzo76mD6Ykc/xMEyCMH+to6/Xi+7ehG3VYToSm+R3196Ki5p58pyRHzvq9CrBDvFd3SLMe9QqRm2GTg3wn/w==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.2.11.tgz", + "integrity": "sha512-zlpM4Bg1ifBziW1Juiii9NY5gyW2rEhyVTWnhagH/bpTCZ2E73OhnToYt1ouqmoxL6lMtIjhRXz6LPb7tJbHHQ==", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.2.6", - "@luma.gl/shadertools": "^9.2.6", + "@luma.gl/constants": "~9.2.6", + "@luma.gl/shadertools": "~9.2.6", "@math.gl/core": "^4.1.0" }, "peerDependencies": { @@ -3064,9 +2998,9 @@ } }, "node_modules/@deck.gl/widgets": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.6.tgz", - "integrity": "sha512-WkKP+HB90x1qwOxs5l6Dg0d1iAvf999jJGDdGUbDVsRF7+hJDv03GZY6XKpoiEW7VfcZ1y1iU2vRwV/GHuQ57g==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.11.tgz", + "integrity": "sha512-90HWlQPsiRyTPWR4aYfLwnYDrJdHG2mqCzRcyMUKewWBNQLu4upB//l4ewIkUeXXCzAprjjVeRnNb7wdYj2CXQ==", "license": "MIT", "peer": true, "dependencies": { @@ -3696,9 +3630,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", - "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "cpu": [ "arm64" ], @@ -3730,9 +3664,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", - "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "cpu": [ "arm64" ], @@ -3764,9 +3698,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", - "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "cpu": [ "arm64" ], @@ -3915,9 +3849,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -3938,22 +3872,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -3974,19 +3892,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -4015,6 +3920,15 @@ } } }, + "node_modules/@fontsource/fira-code": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/fira-code/-/fira-code-5.2.7.tgz", + "integrity": "sha512-tnB9NNund9TwIym8/7DMJe573nlPEQb+fKUV5GL8TBYXjIhDvL0D7mgmNVNQUPhXp+R7RylQeiBdkA4EbOHPGQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@fontsource/ibm-plex-mono": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@fontsource/ibm-plex-mono/-/ibm-plex-mono-5.2.7.tgz", @@ -4025,11 +3939,10 @@ } }, "node_modules/@fontsource/inter": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.6.tgz", - "integrity": "sha512-CZs9S1CrjD0jPwsNy9W6j0BhsmRSQrgwlTNkgQXTsAeDRM42LBRLo3eo9gCzfH4GvV7zpyf78Ozfl773826csw==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz", + "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==", "license": "OFL-1.1", - "peer": true, "funding": { "url": "https://github.com/sponsors/ayuhito" } @@ -4056,6 +3969,26 @@ "node": ">=12.0.0" } }, + "node_modules/@great-expectations/jsonforms-antd-renderers": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@great-expectations/jsonforms-antd-renderers/-/jsonforms-antd-renderers-2.3.5.tgz", + "integrity": "sha512-nWJQCX6zg2mQNk+QT5SFZUkaq2SNDRO5H7zoJmNvlndd0Byoq6AaB+UTdGt/SpO1knJFe80mmiWwh99fY/go3A==", + "license": "MIT", + "dependencies": { + "lodash.isempty": "^4.4.0", + "lodash.merge": "^4.6.2", + "lodash.range": "^3.2.0", + "lodash.startcase": "^4.4.0" + }, + "peerDependencies": { + "@ant-design/icons": "^5.3.0", + "@jsonforms/core": "^3.3.0", + "@jsonforms/react": "^3.3.0", + "antd": "^5.14.0", + "dayjs": "^1", + "react": "^17 || ^18" + } + }, "node_modules/@hapi/address": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", @@ -4243,16 +4176,6 @@ } } }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -4316,6 +4239,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, "license": "MIT", "dependencies": { "chardet": "^2.1.1", @@ -4334,9 +4258,10 @@ } }, "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4353,6 +4278,7 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -4564,9 +4490,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -4577,9 +4503,9 @@ } }, "node_modules/@isaacs/cliui/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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4608,13 +4534,13 @@ } }, "node_modules/@isaacs/cliui/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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -4821,9 +4747,9 @@ } }, "node_modules/@jest/console/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -5014,9 +4940,9 @@ } }, "node_modules/@jest/core/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -5173,9 +5099,9 @@ } }, "node_modules/@jest/create-cache-key-function/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -5197,9 +5123,9 @@ } }, "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", "dev": true, "license": "MIT", "engines": { @@ -5249,16 +5175,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/@jest/expect/node_modules/@jest/expect-utils": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", @@ -5305,9 +5221,9 @@ } }, "node_modules/@jest/expect/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -5594,16 +5510,16 @@ } }, "node_modules/@jest/globals/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/@jest/globals/node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5822,33 +5738,20 @@ } }, "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, - "node_modules/@jest/reporters/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/@jest/reporters/node_modules/chalk": { @@ -5977,13 +5880,13 @@ } }, "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", - "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6105,9 +6008,9 @@ } }, "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -6192,9 +6095,9 @@ } }, "node_modules/@jest/test-result/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -6300,9 +6203,9 @@ } }, "node_modules/@jest/transform/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -6447,15 +6350,54 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonforms/core": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@jsonforms/core/-/core-3.7.0.tgz", + "integrity": "sha512-CE9viWtwi9QWLqlWLeOul1/R1GRAyOA9y6OoUpsCc0FhyR+g5p29F3k0fUExHWxL0Sf4KHcXYkfhtqfRBPS8ww==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.3", + "ajv": "^8.6.1", + "ajv-formats": "^2.1.0", + "lodash": "^4.17.21" + } + }, + "node_modules/@jsonforms/react": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@jsonforms/react/-/react-3.7.0.tgz", + "integrity": "sha512-HkY7qAx8vW97wPEgZ7GxCB3iiXG1c95GuObxtcDHGPBJWMwnxWBnVYJmv5h7nthrInKsQKHZL5OusnC/sj/1GQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@jsonforms/core": "3.7.0", + "react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@jsonforms/vanilla-renderers": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@jsonforms/vanilla-renderers/-/vanilla-renderers-3.7.0.tgz", + "integrity": "sha512-RdXQGsheARUJVbaTe6SqGw9W4/yrm0BgUok6OKUj8krp1NF4fqXc5UbYGHFksMR/p7LCuoYHCtQzKLXEfxJbDw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@jsonforms/core": "3.7.0", + "@jsonforms/react": "3.7.0", + "react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", @@ -6473,17 +6415,369 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.2", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, "engines": { "node": ">=10.0" @@ -6497,9 +6791,30 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", - "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -7033,15 +7348,10 @@ } }, "node_modules/@maplibre/geojson-vt": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.0.4.tgz", - "integrity": "sha512-HYv3POhMRCdhP3UPPATM/hfcy6/WuVIf5FKboH8u/ZuFMTnAIcSVlq5nfOqroLokd925w2QtE7YwquFOIacwVQ==", - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "kdbush": "^4.0.2" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", + "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", + "license": "ISC" }, "node_modules/@maplibre/maplibre-gl-style-spec": { "version": "24.8.1", @@ -7122,12 +7432,6 @@ "pbf": "^4.0.1" } }, - "node_modules/@maplibre/vt-pbf/node_modules/@maplibre/geojson-vt": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", - "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", - "license": "ISC" - }, "node_modules/@maplibre/vt-pbf/node_modules/pbf": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", @@ -7393,9 +7697,9 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -7474,9 +7778,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -7484,13 +7788,13 @@ } }, "node_modules/@npmcli/arborist/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -7638,9 +7942,9 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -7758,9 +8062,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -7768,13 +8072,13 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -7941,9 +8245,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -7951,13 +8255,13 @@ } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -8175,19 +8479,6 @@ "node": "18 || 20 || >=22" } }, - "node_modules/@nx/devkit/node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/@nx/devkit/node_modules/minimatch": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", @@ -8352,9 +8643,9 @@ "license": "MIT" }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.62.0.tgz", - "integrity": "sha512-pKsthNECyvJh8lPTICz6VcwVy2jOqdhhsp1rlxCkhgZR47aKvXPmaRWQDv+zlXpRae4qm1MaaTnutkaOk5aofg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.63.0.tgz", + "integrity": "sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==", "cpu": [ "arm" ], @@ -8369,9 +8660,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.62.0.tgz", - "integrity": "sha512-b1AUNViByvgmR2xJDubvLIr+dSuu3uraG7bsAoKo+xrpspPvu6RIn6Fhr2JUhobfep3jwUTy18Huco6GkwdvGQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.63.0.tgz", + "integrity": "sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==", "cpu": [ "arm64" ], @@ -8386,9 +8677,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.62.0.tgz", - "integrity": "sha512-iG+Tvf70UJ6otfwFYIHk36Sjq9cpPP5YLxkoggANNRtzgi3Tj3g8q6Ybqi6AtkU3+yg9QwF7bDCkCS6bbL4PCg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.63.0.tgz", + "integrity": "sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==", "cpu": [ "arm64" ], @@ -8403,9 +8694,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.62.0.tgz", - "integrity": "sha512-oOWI6YPPr5AJUx+yIDlxmuUbQjS5gZX3OH3QisawYvsZgLiQVvZtR0rPBcJTxLWqt2ClrWg0DlSrlUiG5SQNHg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.63.0.tgz", + "integrity": "sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==", "cpu": [ "x64" ], @@ -8420,9 +8711,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.62.0.tgz", - "integrity": "sha512-dLP33T7VLCmLVv4cvjkVX+rmkcwNk2UfxmsZPNur/7BQHoQR60zJ7XLiRvNUawlzn0u8ngCa3itjEG73MAMa/w==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.63.0.tgz", + "integrity": "sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==", "cpu": [ "x64" ], @@ -8437,9 +8728,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.62.0.tgz", - "integrity": "sha512-fl//LWNks6qo9chNY60UDYyIwtp7a5cEx4Y/rHPjaarhuwqx6jtbzEpD5V5AqmdL4a6Y5D8zeXg5HF2Cr0QmSQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.63.0.tgz", + "integrity": "sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==", "cpu": [ "arm" ], @@ -8454,9 +8745,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.62.0.tgz", - "integrity": "sha512-i5vkAuxvueTODV3J2dL61/TXewDHhMFKvtD156cIsk7GsdfiAu7zW7kY0NJXhKeFHeiMZIh7eFNjkPYH6J47HQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.63.0.tgz", + "integrity": "sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==", "cpu": [ "arm" ], @@ -8471,9 +8762,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.62.0.tgz", - "integrity": "sha512-QwN19LLuIGuOjEflSeJkZmOTfBdBMlTmW8xbMf8TZhjd//cxVNYQPq75q7oKZBJc6hRx3gY7sX0Egc8cEIFZYg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.63.0.tgz", + "integrity": "sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==", "cpu": [ "arm64" ], @@ -8488,9 +8779,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.62.0.tgz", - "integrity": "sha512-8eCy3FCDuWUM5hWujAv6heMvfZPbcCOU3SdQUAkixZLu5bSzOkNfirJiLGoQFO943xceOKkiQRMQNzH++jM3WA==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.63.0.tgz", + "integrity": "sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==", "cpu": [ "arm64" ], @@ -8505,9 +8796,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.62.0.tgz", - "integrity": "sha512-NjQ7K7tpTPDe9J+yq8p/s/J0E7lRCkK2uDBDqvT4XIT6f4Z0tlnr59OBg/WcrmVHER1AbrcfyxhGTXgcG8ytWg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.63.0.tgz", + "integrity": "sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==", "cpu": [ "ppc64" ], @@ -8522,9 +8813,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.62.0.tgz", - "integrity": "sha512-oKZed9gmSwze29dEt3/Wnsv6l/Ygw/FUst+8Kfpv2SGeS/glEoTGZAMQw37SVyzFV76UTHJN2snGgxK2t2+8ow==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.63.0.tgz", + "integrity": "sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==", "cpu": [ "riscv64" ], @@ -8539,9 +8830,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.62.0.tgz", - "integrity": "sha512-gBjBxQ+9lGpAYq+ELqw0w8QXsBnkZclFc7GRX2r0LnEVn3ZTEqeIKpKcGjucmp76Q53bvJD0i4qBWBhcfhSfGA==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.63.0.tgz", + "integrity": "sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==", "cpu": [ "riscv64" ], @@ -8556,9 +8847,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.62.0.tgz", - "integrity": "sha512-Ew2Kxs9EQ9/mbAIJ2hvocMC0wsOu6YKzStI2eFBDt+Td5O8seVC/oxgRIHqCcl5sf5ratA1nozQBAuv7tphkHg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.63.0.tgz", + "integrity": "sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==", "cpu": [ "s390x" ], @@ -8573,9 +8864,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.62.0.tgz", - "integrity": "sha512-5z25jcAA0gfKyVwz71A0VXgaPlocPoTAxhlv/hgoK6tlCrfoNuw7haWbDHvGMfjXhdic4EqVXGRv5XsTqFnbRQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.63.0.tgz", + "integrity": "sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==", "cpu": [ "x64" ], @@ -8590,9 +8881,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.62.0.tgz", - "integrity": "sha512-IWpHmMB6ZDllPvqWDkG6AmXrN7JF5e/c4g/0PuURsmlK+vHoYZPB70rr4u1bn3I4LsKCSpqqfveyx6UCOC8wdg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.63.0.tgz", + "integrity": "sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==", "cpu": [ "x64" ], @@ -8607,9 +8898,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.62.0.tgz", - "integrity": "sha512-fjlSxxrD5pA594vkyikCS9MnPRjQawW6/BLgyTYkO+73wwPlYjkcZ7LSd974l0Q2zkHQmu4DPvJFLYA7o8xrxQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.63.0.tgz", + "integrity": "sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==", "cpu": [ "arm64" ], @@ -8624,9 +8915,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.62.0.tgz", - "integrity": "sha512-EiFXr8loNS0Ul3Gu80+9nr1T8jRmnKocqmHHg16tj5ZqTgUXyb97l2rrspVHdDluyFn9JfR4PoJFdNzw4paHww==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.63.0.tgz", + "integrity": "sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==", "cpu": [ "arm64" ], @@ -8641,9 +8932,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.62.0.tgz", - "integrity": "sha512-IgOFvL73li1bFgab+hThXYA0N2Xms2kV2MvZN95cebV+fmrZ9AVui1JSxfeeqRLo3CpPxKZlzhyq4G0cnaAvIw==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.63.0.tgz", + "integrity": "sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==", "cpu": [ "ia32" ], @@ -8658,9 +8949,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.62.0.tgz", - "integrity": "sha512-6hMpyDWQ2zGA1OXFKBrdYMUveUCO8UJhkO6JdwZPd78xIdHZNhjx+pib+4fC2Cljuhjyl0QwA2F3df/bs4Bp6A==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.63.0.tgz", + "integrity": "sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==", "cpu": [ "x64" ], @@ -8864,13 +9155,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.1" + "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" @@ -9277,6 +9568,89 @@ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", "license": "MIT" }, + "node_modules/@rjsf/antd": { + "version": "5.24.13", + "resolved": "https://registry.npmjs.org/@rjsf/antd/-/antd-5.24.13.tgz", + "integrity": "sha512-UiWE8xoBxxCoe/SEkdQEmL5E6z3I1pw0+y0dTyGt8SHfAxxFc4/OWn7tKOAiNsKCXgf83t0JKn6CHWLD01sAdQ==", + "license": "Apache-2.0", + "dependencies": { + "classnames": "^2.5.1", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "rc-picker": "2.7.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@ant-design/icons": "^4.0.0 || ^5.0.0", + "@rjsf/core": "^5.24.x", + "@rjsf/utils": "^5.24.x", + "antd": "^4.24.0 || ^5.8.5", + "dayjs": "^1.8.0", + "react": "^16.14.0 || >=17" + } + }, + "node_modules/@rjsf/antd/node_modules/rc-picker": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.6.tgz", + "integrity": "sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "2.x", + "dayjs": "1.x", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.37.0", + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rjsf/antd/node_modules/rc-picker/node_modules/rc-trigger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", + "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.19.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rjsf/antd/node_modules/rc-picker/node_modules/rc-trigger/node_modules/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rjsf/core": { "version": "5.24.13", "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-5.24.13.tgz", @@ -9613,9 +9987,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -9825,22 +10199,6 @@ "storybook": "8.6.18" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.18.tgz", - "integrity": "sha512-N4xULcAWZQTUv4jy1/d346Tyb4gufuC3UaLCuU/iVSZ1brYF4OW3ANr+096btbMxY8pR/65lmtoqr5CTGwnBvA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "8.6.18" - } - }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-highlight": { "version": "8.6.18", "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.18.tgz", @@ -9967,872 +10325,6 @@ "storybook": "8.6.18" } }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@storybook/addon-mdx-gfm/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/@storybook/components": { "version": "8.6.18", "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.18.tgz", @@ -10893,6 +10385,23 @@ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, + "node_modules/@storybook/core-webpack": { + "version": "8.6.18", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.18.tgz", + "integrity": "sha512-M+y/DFbiT3CJYQ90wJdXT4WxYImphof1f11StZSxJGo0u5PnCCdCze1qchXubApXRDO2T8HGxurXfhTEMqaGsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.18" + } + }, "node_modules/@storybook/csf": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.13.tgz", @@ -11067,6 +10576,22 @@ "semver": "bin/semver.js" } }, + "node_modules/@storybook/react-dom-shim": { + "version": "8.6.18", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.18.tgz", + "integrity": "sha512-N4xULcAWZQTUv4jy1/d346Tyb4gufuC3UaLCuU/iVSZ1brYF4OW3ANr+096btbMxY8pR/65lmtoqr5CTGwnBvA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.18" + } + }, "node_modules/@storybook/react-webpack5": { "version": "8.6.18", "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.6.18.tgz", @@ -11142,23 +10667,6 @@ } } }, - "node_modules/@storybook/react-webpack5/node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-webpack": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.18.tgz", - "integrity": "sha512-M+y/DFbiT3CJYQ90wJdXT4WxYImphof1f11StZSxJGo0u5PnCCdCze1qchXubApXRDO2T8HGxurXfhTEMqaGsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "8.6.18" - } - }, "node_modules/@storybook/react-webpack5/node_modules/@storybook/preset-react-webpack": { "version": "8.6.18", "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.6.18.tgz", @@ -11196,27 +10704,10 @@ } } }, - "node_modules/@storybook/react-webpack5/node_modules/@storybook/preset-react-webpack/node_modules/@storybook/core-webpack": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.18.tgz", - "integrity": "sha512-M+y/DFbiT3CJYQ90wJdXT4WxYImphof1f11StZSxJGo0u5PnCCdCze1qchXubApXRDO2T8HGxurXfhTEMqaGsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "8.6.18" - } - }, "node_modules/@storybook/react-webpack5/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -11407,22 +10898,6 @@ "node": ">= 6" } }, - "node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.18.tgz", - "integrity": "sha512-N4xULcAWZQTUv4jy1/d346Tyb4gufuC3UaLCuU/iVSZ1brYF4OW3ANr+096btbMxY8pR/65lmtoqr5CTGwnBvA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "8.6.18" - } - }, "node_modules/@storybook/test": { "version": "8.6.18", "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.18.tgz", @@ -11851,22 +11326,10 @@ "node": ">=8" } }, - "node_modules/@storybook/test-runner/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "node_modules/@storybook/test-runner/node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -11878,52 +11341,6 @@ } } }, - "node_modules/@storybook/test-runner/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/@storybook/test-runner/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/test-runner/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@storybook/test-runner/node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -12429,13 +11846,13 @@ } }, "node_modules/@storybook/test-runner/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -12464,185 +11881,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@storybook/test-runner/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/test-runner/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/test-runner/node_modules/make-dir/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/test-runner/node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/@storybook/test-runner/node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/test-runner/node_modules/nyc/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/test-runner/node_modules/nyc/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/test-runner/node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/test-runner/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/test-runner/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/test-runner/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@storybook/test-runner/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -12688,23 +11926,6 @@ ], "license": "MIT" }, - "node_modules/@storybook/test-runner/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@storybook/test-runner/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -12760,13 +11981,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@storybook/test-runner/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" - }, "node_modules/@storybook/test-runner/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -12786,83 +12000,6 @@ "node": ">=12" } }, - "node_modules/@storybook/test-runner/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/test-runner/node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/test-runner/node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/test-runner/node_modules/yargs/node_modules/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==", - "dev": true, - "license": "MIT", - "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/@storybook/test-runner/node_modules/yargs/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/test-runner/node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/@storybook/test/node_modules/@storybook/instrumenter": { "version": "8.6.18", "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.18.tgz", @@ -13348,9 +12485,9 @@ } }, "node_modules/@swc/core": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.32.tgz", - "integrity": "sha512-/eWL0n43D64QWEUHLtTE+jDqjkJhyidjkDhv6f0uJohOUAhywxQ9wXYp845DNNds0JpCdI4Uo0a9bl+vbXf+ew==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.33.tgz", + "integrity": "sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -13366,18 +12503,18 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.32", - "@swc/core-darwin-x64": "1.15.32", - "@swc/core-linux-arm-gnueabihf": "1.15.32", - "@swc/core-linux-arm64-gnu": "1.15.32", - "@swc/core-linux-arm64-musl": "1.15.32", - "@swc/core-linux-ppc64-gnu": "1.15.32", - "@swc/core-linux-s390x-gnu": "1.15.32", - "@swc/core-linux-x64-gnu": "1.15.32", - "@swc/core-linux-x64-musl": "1.15.32", - "@swc/core-win32-arm64-msvc": "1.15.32", - "@swc/core-win32-ia32-msvc": "1.15.32", - "@swc/core-win32-x64-msvc": "1.15.32" + "@swc/core-darwin-arm64": "1.15.33", + "@swc/core-darwin-x64": "1.15.33", + "@swc/core-linux-arm-gnueabihf": "1.15.33", + "@swc/core-linux-arm64-gnu": "1.15.33", + "@swc/core-linux-arm64-musl": "1.15.33", + "@swc/core-linux-ppc64-gnu": "1.15.33", + "@swc/core-linux-s390x-gnu": "1.15.33", + "@swc/core-linux-x64-gnu": "1.15.33", + "@swc/core-linux-x64-musl": "1.15.33", + "@swc/core-win32-arm64-msvc": "1.15.33", + "@swc/core-win32-ia32-msvc": "1.15.33", + "@swc/core-win32-x64-msvc": "1.15.33" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -13389,9 +12526,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.32.tgz", - "integrity": "sha512-/YWMvJDPu+AAwuUsM2G+DNQ/7zhodURGzdQyewEqcvgklAdDHs3LwQmLLnyn6SJl8DT8UOxkbzK+D1PmPeelRg==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.33.tgz", + "integrity": "sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA==", "cpu": [ "arm64" ], @@ -13405,9 +12542,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.32.tgz", - "integrity": "sha512-KOTXJXdAhWL+hZ77MYP3z+4pcMFaQhQ74yqyN1uz093q0YnbxpqMtYpPISbYvMHzVRNNx5kN+9RZAXEaadhWVA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.33.tgz", + "integrity": "sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA==", "cpu": [ "x64" ], @@ -13421,9 +12558,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.32.tgz", - "integrity": "sha512-oOoxLweljlc0A4X8ybsgxV7cVaYTwBOg2iMDJcFR3Sr48C+lsv9VzSmqdK/IVIXF4W4GjLc3VqTAdSMXlfVLuQ==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.33.tgz", + "integrity": "sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ==", "cpu": [ "arm" ], @@ -13437,9 +12574,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.32.tgz", - "integrity": "sha512-oDzEkdl6D6BAWdMtU5KGO7y3HR5fJcvByNLyEk9+ugj8nP5Ovb7P4kBcStBXc4MPExFGQryehiINMlmY8HlclA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.33.tgz", + "integrity": "sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw==", "cpu": [ "arm64" ], @@ -13453,9 +12590,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.32.tgz", - "integrity": "sha512-omcqjoZP/b8D8PuczVoRwJieC6ibj7qIxTftNYokz4/aSmKFHvsd7nIFfPk5ZvtzncbH4AY7+Dkr/Lp2gWxYeA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.33.tgz", + "integrity": "sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og==", "cpu": [ "arm64" ], @@ -13469,9 +12606,9 @@ } }, "node_modules/@swc/core-linux-ppc64-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.32.tgz", - "integrity": "sha512-KGkTMyz/Tbn3PBNu0AVZ4GTDFKnICrYcTiNPZq8DrvK42pnFsf3GNDrIG9E5AtQlTmC0YigkWKmu0eMcfTrmgA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.33.tgz", + "integrity": "sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog==", "cpu": [ "ppc64" ], @@ -13485,9 +12622,9 @@ } }, "node_modules/@swc/core-linux-s390x-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.32.tgz", - "integrity": "sha512-G3Aa4tVS/3OGZBkoNIwUF9F6RAy+Osb4GOlo62SinLmDiErz/ykmM7KH0wkz6l9kM8jJq1HyAM6atJTUEbBk7g==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.33.tgz", + "integrity": "sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA==", "cpu": [ "s390x" ], @@ -13501,9 +12638,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.32.tgz", - "integrity": "sha512-ERsjfGcj6CBmj3vJnGDO8m8rTvw6RqMcWo1dogOtNx3/+/0+NNpJiXDobJrr1GwInI/BHAEkvSFIH6d2LqPcUQ==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.33.tgz", + "integrity": "sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw==", "cpu": [ "x64" ], @@ -13517,9 +12654,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.32.tgz", - "integrity": "sha512-N4Ggahe/8SUbTX50P6EdhbW9YWcgbZVb52R4cq6MK+zsoMjRq7rGvV5ztA05QnbaCYqMYx8rTY7KAIA3Crdo4Q==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.33.tgz", + "integrity": "sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ==", "cpu": [ "x64" ], @@ -13533,9 +12670,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.32.tgz", - "integrity": "sha512-01yN0o9jvo8xBTP12aPK2wW8b41jmOlGbDDlAnoynotc4pO6xA0zby9f1z6j++qXDpGBttLySq1omgVrlQKYcw==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.33.tgz", + "integrity": "sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g==", "cpu": [ "arm64" ], @@ -13549,9 +12686,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.32.tgz", - "integrity": "sha512-fLagI9XZYNpTcmlqAcp3KBtmj7E19WCmYD80Jxj1Kn5tGNa7yxNLd3NNdWxuZGUPl5iC0/KqZru7g08gF6Fsrw==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.33.tgz", + "integrity": "sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ==", "cpu": [ "ia32" ], @@ -13565,9 +12702,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.32.tgz", - "integrity": "sha512-gbc2bQ/T2CiR+w0OvcVKwLOFAcPZBvmWmolbwpg1E8UrpeC03DGtyMUApOHNXNYWA3SHFrYXCQtosrcMza1YFg==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.33.tgz", + "integrity": "sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg==", "cpu": [ "x64" ], @@ -13636,9 +12773,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", @@ -13651,7 +12788,7 @@ "pretty-format": "^27.0.2" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/@testing-library/dom/node_modules/chalk": { @@ -13696,67 +12833,21 @@ "license": "MIT" }, "node_modules/@testing-library/react": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", - "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", + "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "<18.0.0" + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { - "react": "<18.0.0", - "react-dom": "<18.0.0" - } - }, - "node_modules/@testing-library/react-hooks": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", - "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "react-error-boundary": "^3.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0", - "react": "^16.9.0 || ^17.0.0", - "react-dom": "^16.9.0 || ^17.0.0", - "react-test-renderer": "^16.9.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-test-renderer": { - "optional": true - } - } - }, - "node_modules/@testing-library/react-hooks/node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/@testing-library/user-event": { @@ -13882,13 +12973,13 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -13907,21 +12998,6 @@ "@turf/invariant": "^5.1.5" } }, - "node_modules/@turf/boolean-clockwise/node_modules/@turf/helpers": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", - "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==", - "license": "MIT" - }, - "node_modules/@turf/boolean-clockwise/node_modules/@turf/invariant": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", - "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "^5.1.5" - } - }, "node_modules/@turf/clone": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", @@ -13931,12 +13007,21 @@ "@turf/helpers": "^5.1.5" } }, - "node_modules/@turf/clone/node_modules/@turf/helpers": { + "node_modules/@turf/helpers": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==", "license": "MIT" }, + "node_modules/@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, "node_modules/@turf/rewind": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz", @@ -13950,21 +13035,6 @@ "@turf/meta": "^5.1.5" } }, - "node_modules/@turf/rewind/node_modules/@turf/helpers": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", - "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==", - "license": "MIT" - }, - "node_modules/@turf/rewind/node_modules/@turf/invariant": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", - "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "^5.1.5" - } - }, "node_modules/@turf/rewind/node_modules/@turf/meta": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", @@ -14130,10 +13200,9 @@ "license": "MIT" }, "node_modules/@types/d3": { - "version": "3.5.53", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.53.tgz", - "integrity": "sha512-8yKQA9cAS6+wGsJpBysmnhlaaxlN42Qizqkw+h2nILSlS+MAG2z4JdO6p+PJrJ+ACvimkmLJL281h157e52psQ==", - "dev": true, + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.38.tgz", + "integrity": "sha512-O/gRkjWULp3xVX8K85V0H3tsSGole0WYt77KVpGZO2xTGLuVFuvE6JIsIli3fvFHCYBhGFn/8OHEEyMYF+QehA==", "license": "MIT" }, "node_modules/@types/d3-array": { @@ -14153,10 +13222,9 @@ } }, "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==", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", "license": "MIT" }, "node_modules/@types/d3-delaunay": { @@ -14298,9 +13366,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -14425,17 +13493,6 @@ "@types/node": "*" } }, - "node_modules/@types/inquirer": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -14475,9 +13532,9 @@ } }, "node_modules/@types/jest/node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", "dev": true, "license": "MIT", "dependencies": { @@ -14501,9 +13558,9 @@ } }, "node_modules/@types/jest/node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { @@ -14520,9 +13577,9 @@ } }, "node_modules/@types/jest/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -14544,69 +13601,69 @@ } }, "node_modules/@types/jest/node_modules/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.2.0", + "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@types/jest/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", + "@jest/diff-sequences": "30.3.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@types/jest/node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@types/jest/node_modules/jest-message-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -14615,33 +13672,33 @@ } }, "node_modules/@types/jest/node_modules/jest-mock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-util": "30.2.0" + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@types/jest/node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -14661,9 +13718,9 @@ } }, "node_modules/@types/jest/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14819,12 +13876,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.7.0.tgz", + "integrity": "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==", "license": "MIT", "dependencies": { - "undici-types": "~7.19.0" + "undici-types": "~7.21.0" } }, "node_modules/@types/normalize-package-data": { @@ -14870,9 +13927,9 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/qs": { @@ -14903,23 +13960,22 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "17.0.83", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.83.tgz", - "integrity": "sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw==", + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "^0.16", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "17.0.26", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", - "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "license": "MIT", "peerDependencies": { - "@types/react": "^17.0.0" + "@types/react": "^18.0.0" } }, "node_modules/@types/react-google-recaptcha": { @@ -15092,12 +14148,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "license": "MIT" - }, "node_modules/@types/seedrandom": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", @@ -15145,14 +14195,6 @@ "@types/send": "*" } }, - "node_modules/@types/sizzle": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", - "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", @@ -15191,16 +14233,6 @@ "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", "license": "MIT" }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", @@ -15325,30 +14357,18 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", - "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/type-utils": "8.59.1", - "@typescript-eslint/utils": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -15361,20 +14381,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.1", + "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" }, "engines": { @@ -15389,14 +14409,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", - "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15407,9 +14427,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", - "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "dev": true, "license": "MIT", "engines": { @@ -15424,9 +14444,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, "license": "MIT", "engines": { @@ -15438,16 +14458,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -15466,16 +14486,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", - "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1" + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15490,13 +14510,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -15518,9 +14538,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -15570,16 +14590,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", - "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3" }, "engines": { @@ -15595,14 +14615,14 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" }, "engines": { @@ -15617,14 +14637,14 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", - "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15635,9 +14655,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", - "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "dev": true, "license": "MIT", "engines": { @@ -15652,9 +14672,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, "license": "MIT", "engines": { @@ -15666,16 +14686,16 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -15694,13 +14714,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -15722,9 +14742,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -15764,14 +14784,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", - "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.0", - "@typescript-eslint/types": "^8.56.0", + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", "debug": "^4.4.3" }, "engines": { @@ -15782,13 +14802,13 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", - "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", "dev": true, "license": "MIT", "engines": { @@ -15818,88 +14838,6 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", - "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", - "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/utils": "8.59.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "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 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", - "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1" - }, - "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/node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", @@ -15916,10 +14854,92 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.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/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, "license": "MIT", "engines": { @@ -15931,16 +14951,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -15959,16 +14979,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", - "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1" + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15983,13 +15003,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -16011,9 +15031,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -16392,16 +15412,27 @@ } }, "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", - "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.9.0" + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { @@ -16788,12 +15819,6 @@ "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==", "license": "MIT" }, - "node_modules/@visx/vendor/node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", - "license": "MIT" - }, "node_modules/@visx/vendor/node_modules/@types/d3-format": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", @@ -16830,27 +15855,6 @@ "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==", "license": "MIT" }, - "node_modules/@visx/vendor/node_modules/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@visx/vendor/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==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/@visx/voronoi": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/@visx/voronoi/-/voronoi-3.12.0.tgz", @@ -17238,234 +16242,6 @@ "node": ">=18.12.0" } }, - "node_modules/@yeoman/adapter": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@yeoman/adapter/-/adapter-1.6.0.tgz", - "integrity": "sha512-oJw/i6zUDdfsT5VOPuANDDEWs5NhlMq5+rmyZIVdgBTXalbCw6nUfJQOblO2Fnq+Ov6CxlyzDBTWQvL5cEjA+g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/inquirer": "^9.0.3", - "chalk": "^5.2.0", - "inquirer": "^9.2.2", - "log-symbols": "^7.0.0", - "ora": "^8.1.0", - "p-queue": "^8.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@yeoman/adapter/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@yeoman/adapter/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@yeoman/adapter/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "license": "MIT", - "peer": true, - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "license": "MIT", - "peer": true - }, - "node_modules/@yeoman/adapter/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/ora": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz", - "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "license": "MIT", - "peer": true, - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/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==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@yeoman/adapter/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@yeoman/adapter/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@yeoman/namespace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@yeoman/namespace/-/namespace-1.0.1.tgz", @@ -17476,33 +16252,24 @@ } }, "node_modules/@yeoman/types": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.5.0.tgz", - "integrity": "sha512-uyeQdpKw3ftj3zN5gG28vOgMuqOGEfKiqWH1R04bm5RK8LRsnXO9SqPao1kC6dwowVQE0Wl/D9+6XmA6y/4qzQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.11.1.tgz", + "integrity": "sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==", "license": "MIT", "peer": true, - "dependencies": { - "@yeoman/adapter": "^1.6.0" - }, - "acceptDependencies": { - "@yeoman/adapter": "^2.0.0-beta.0", - "mem-fs": "^4.0.0-beta.1", - "mem-fs-editor": ">=10.0.2" - }, "engines": { "node": "^16.13.0 || >=18.12.0" }, "peerDependencies": { "@types/node": ">=16.18.26", - "@yeoman/adapter": "^1.6.0", - "mem-fs": "^3.0.0", - "mem-fs-editor": "^10.0.2" + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1" }, "peerDependenciesMeta": { - "mem-fs": { + "@yeoman/adapter": { "optional": true }, - "mem-fs-editor": { + "mem-fs": { "optional": true } } @@ -17579,9 +16346,9 @@ } }, "node_modules/ace-builds": { - "version": "1.43.6", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.43.6.tgz", - "integrity": "sha512-L1ddibQ7F3vyXR2k2fg+I8TQTPWVA6CKeDQr/h2+8CeyTp3W6EQL8xNFZRTztuP8xNOAqL3IYPqdzs31GCjDvg==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.44.0.tgz", + "integrity": "sha512-PFNMSYqFdEUkul2Ntud0HvA09AgY+F1ag0UYdpMH60wNI/qOA8cB8tlTgoALMEwIdUPJK2CjrIQ7OnbiSS/ugQ==", "license": "BSD-3-Clause" }, "node_modules/acorn": { @@ -17694,9 +16461,9 @@ } }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -17760,6 +16527,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -17775,6 +16543,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -17884,21 +16653,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/antd/node_modules/rc-input": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", - "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -17932,28 +16686,6 @@ "dev": true, "license": "ISC" }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -18182,17 +16914,6 @@ "node": ">=0.10.0" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/asn1js": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", @@ -18208,17 +16929,6 @@ "node": ">=12.0.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -18251,17 +16961,6 @@ "node": ">=4" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -18284,17 +16983,6 @@ "dev": true, "license": "MIT" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">= 4.0.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", @@ -18310,33 +16998,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } @@ -18689,9 +17358,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -18728,17 +17397,6 @@ "dev": true, "license": "MIT" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/better-opn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", @@ -18877,6 +17535,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -18884,14 +17543,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -19016,9 +17667,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -19138,6 +17789,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -19158,17 +17810,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/buffer-equal": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", @@ -19332,9 +17973,9 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -19342,13 +17983,13 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -19400,17 +18041,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -19645,14 +18275,6 @@ "node": ">=4" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -19734,6 +18356,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, "license": "MIT" }, "node_modules/charenc": { @@ -19761,17 +18384,6 @@ "node": ">= 16" } }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/cheerio": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", @@ -19915,9 +18527,9 @@ } }, "node_modules/chrono-node": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/chrono-node/-/chrono-node-2.9.0.tgz", - "integrity": "sha512-glI4YY2Jy6JII5l3d5FN6rcrIbKSQqKPhWsIRYPK2IK8Mm4Q1ZZFdYIaDqglUNf7gNwG+kWIzTn0omzzE0VkvQ==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/chrono-node/-/chrono-node-2.9.1.tgz", + "integrity": "sha512-nqP8Zp11efCYQIESXPxeDM8ikzN5BDb3Zzou+a66fZq+X2hzKFdsNLQE2/uBAh//BZEMbaMo1eTnagK7hOenAg==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -19940,9 +18552,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, @@ -19989,6 +18601,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -20001,6 +18614,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -20009,45 +18623,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, "license": "ISC", "engines": { "node": ">= 12" @@ -20264,17 +18844,6 @@ "dev": true, "license": "ISC" }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -20829,9 +19398,9 @@ } }, "node_modules/core-js": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", - "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -21178,9 +19747,9 @@ } }, "node_modules/create-jest/node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -21506,9 +20075,9 @@ } }, "node_modules/create-jest/node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -21856,9 +20425,9 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { @@ -21875,9 +20444,9 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/@sinclair/typebox": { - "version": "0.34.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", - "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -21912,33 +20481,33 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -21976,9 +20545,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -22006,13 +20575,6 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/css-tree/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -22172,6 +20734,13 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -22198,225 +20767,6 @@ "node": ">=0.8" } }, - "node_modules/cypress": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.0.0.tgz", - "integrity": "sha512-kEGqQr23so5IpKeg/dp6GVi7RlHx1NmW66o2a2Q4wk9gRaAblLZQSiZJuDI8UMC4LlG5OJ7Q6joAiqTrfRNbTw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@cypress/request": "^3.0.6", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.7.1", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "ci-info": "^4.0.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.5.3", - "supports-color": "^8.1.1", - "tmp": "~0.2.3", - "tree-kill": "1.2.2", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - } - }, - "node_modules/cypress/node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/cypress/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, - "license": "MIT", - "peer": 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/cypress/node_modules/chalk/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, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/cypress/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cypress/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cypress/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/cypress/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cypress/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cypress/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/d3": { "version": "3.5.17", "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", @@ -22424,20 +20774,17 @@ "license": "BSD-3-Clause" }, "node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==", + "license": "ISC", "dependencies": { - "internmap": "^1.0.0" + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" } }, - "node_modules/d3-array/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", @@ -22472,10 +20819,13 @@ "license": "BSD-3-Clause" }, "node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", - "license": "BSD-3-Clause" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, "node_modules/d3-geo": { "version": "3.1.0", @@ -22633,20 +20983,6 @@ "node": ">=8" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -22733,11 +21069,21 @@ "topojson": "^1.6.19" } }, - "node_modules/datamaps/node_modules/@types/d3": { - "version": "3.5.38", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.38.tgz", - "integrity": "sha512-O/gRkjWULp3xVX8K85V0H3tsSGole0WYt77KVpGZO2xTGLuVFuvE6JIsIli3fvFHCYBhGFn/8OHEEyMYF+QehA==", - "license": "MIT" + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } }, "node_modules/dateformat": { "version": "3.0.2", @@ -22990,6 +21336,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -23002,6 +21349,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -23344,6 +21692,12 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "license": "MIT" }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==", + "license": "MIT" + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -23429,11 +21783,10 @@ } }, "node_modules/dompurify": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.0.tgz", - "integrity": "sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", + "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", "license": "(MPL-2.0 OR Apache-2.0)", - "optional": true, "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -23637,26 +21990,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -23827,15 +22160,13 @@ } }, "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "ansi-colors": "^4.1.1" }, "engines": { "node": ">=8.6" @@ -24457,35 +22788,6 @@ "eslint": ">=7" } }, - "node_modules/eslint-plugin-cypress/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-cypress/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-i18n-strings": { "resolved": "eslint-rules/eslint-plugin-i18n-strings", "link": true @@ -24687,9 +22989,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-react-you-might-not-need-an-effect": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-you-might-not-need-an-effect/-/eslint-plugin-react-you-might-not-need-an-effect-0.9.3.tgz", - "integrity": "sha512-44cce7LndBnpDRWBTQ8p7ircIdl2rJBP5+V9Ik64E935UB47uA9ZMU1Uv160lAMhtvoPYqXBjQ+tojr5JF3mFQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-you-might-not-need-an-effect/-/eslint-plugin-react-you-might-not-need-an-effect-0.10.0.tgz", + "integrity": "sha512-a4pugbQc2zLiE2NZGuXdTjtMNvlP2984QFPDv71eskUYDzigLFYfBL4QjK+RnRtcboHoXRKOcQqEZKxiK6KegA==", "dev": true, "license": "MIT", "dependencies": { @@ -24703,9 +23005,9 @@ } }, "node_modules/eslint-plugin-react-you-might-not-need-an-effect/node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -24762,14 +23064,14 @@ } }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", - "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24780,9 +23082,9 @@ } }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", - "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", "dev": true, "license": "MIT", "engines": { @@ -24794,21 +23096,21 @@ } }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", - "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.0", - "@typescript-eslint/tsconfig-utils": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24818,20 +23120,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", - "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0" + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24842,17 +23144,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", - "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -24887,9 +23189,9 @@ } }, "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -24900,16 +23202,16 @@ } }, "node_modules/eslint-plugin-testing-library/node_modules/minimatch": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", - "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -24954,9 +23256,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -25037,22 +23339,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -25073,19 +23359,6 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -25105,9 +23378,9 @@ } }, "node_modules/espree/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -25188,13 +23461,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/estree-walker/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -25214,20 +23480,12 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT", - "peer": true + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", @@ -25263,20 +23521,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -25436,56 +23680,6 @@ "node": ">=0.10.0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "peer": true - }, "node_modules/falafel": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", @@ -25615,9 +23809,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.5.tgz", - "integrity": "sha512-cK9c5I/DwIOI7/Q7AlGN3DuTdwN61gwSfL8rvuVPK+0mcCNHHGxRrpiFtaZZRfRMJL3Gl8B2AFlBG6qXf03w9A==", + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz", + "integrity": "sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==", "funding": [ { "type": "github", @@ -25687,17 +23881,6 @@ "bser": "2.1.1" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -25823,18 +24006,18 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", - "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -26139,23 +24322,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", @@ -26229,17 +24395,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", @@ -26269,9 +24424,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -26489,9 +24644,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -26722,9 +24877,9 @@ "license": "MIT" }, "node_modules/geostyler": { - "version": "18.5.0", - "resolved": "https://registry.npmjs.org/geostyler/-/geostyler-18.5.0.tgz", - "integrity": "sha512-azjLMEhrTQot+pU3phfSrUZI7CdetyAl7JNAnxrGaPA/E/5mmyoPQugZso3CfIuIBwOtFLmfB36SLE/FeGFakA==", + "version": "18.5.1", + "resolved": "https://registry.npmjs.org/geostyler/-/geostyler-18.5.1.tgz", + "integrity": "sha512-5+vLuDo1oR4QQTnrfkccIQSe3qEn0ytV9dLiFFhnxhPdziv/Wp3vKNhJZ37MUF5yIj2ISWZ+q/VmSNH6ifvWpg==", "license": "BSD-2-Clause", "dependencies": { "@ant-design/icons": "^5.5.1", @@ -26972,9 +25127,9 @@ } }, "node_modules/geostyler-sld-parser/node_modules/fast-xml-parser": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.1.tgz", - "integrity": "sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", "funding": [ { "type": "github", @@ -27274,9 +25429,9 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true, "license": "MIT", "engines": { @@ -27325,28 +25480,6 @@ "node": ">=0.10.0" } }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/gettext-parser": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.1.0.tgz", @@ -27495,6 +25628,23 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -27502,34 +25652,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/global-modules": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", @@ -27600,6 +25722,35 @@ "which": "bin/which" } }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "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", @@ -27977,9 +26128,9 @@ } }, "node_modules/hast-util-from-parse5/node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -28053,9 +26204,9 @@ "license": "MIT" }, "node_modules/hast-util-raw/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -28082,9 +26233,9 @@ } }, "node_modules/hast-util-raw/node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -28638,13 +26789,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", @@ -28723,22 +26867,6 @@ "node": ">=12" } }, - "node_modules/http-signature": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", - "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.18.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -28866,13 +26994,13 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -28900,9 +27028,9 @@ "license": "MIT" }, "node_modules/immer": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", - "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "version": "11.1.7", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.7.tgz", + "integrity": "sha512-LFVFtAROHcDy1er5UI6nodRFnZ2SgdCXhfNSI+DpObO8N7Pur/muBGsjzH5wpnFHCYhYVQxZskCkV4koQ//3/Q==", "license": "MIT", "funding": { "type": "opencollective", @@ -29058,101 +27186,6 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", "license": "MIT" }, - "node_modules/inquirer": { - "version": "9.3.8", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", - "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/external-editor": "^1.0.2", - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": 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/inquirer/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -29202,15 +27235,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/iobuffer": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", @@ -29657,28 +27681,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -30061,14 +28068,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -30140,23 +28139,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/istanbul-lib-processinfo/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -30368,9 +28350,9 @@ } }, "node_modules/jest-changed-files/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -30454,16 +28436,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-circus/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/jest-circus/node_modules/@jest/environment": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", @@ -30531,16 +28503,16 @@ } }, "node_modules/jest-circus/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/jest-circus/node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -30782,9 +28754,9 @@ } }, "node_modules/jest-cli/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -30939,16 +28911,16 @@ } }, "node_modules/jest-config/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/jest-config/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -31203,9 +29175,9 @@ } }, "node_modules/jest-each/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -31314,9 +29286,9 @@ } }, "node_modules/jest-environment-jsdom/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -31337,13 +29309,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/jest-environment-jsdom/node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-environment-jsdom/node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", @@ -31647,16 +29612,16 @@ } }, "node_modules/jest-environment-node/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/jest-environment-node/node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -31853,9 +29818,9 @@ } }, "node_modules/jest-haste-map/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -31963,9 +29928,9 @@ } }, "node_modules/jest-html-reporter/node_modules/@jest/schemas": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", - "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { @@ -31976,14 +29941,14 @@ } }, "node_modules/jest-html-reporter/node_modules/@jest/types": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.1.tgz", - "integrity": "sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.1", + "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -31995,9 +29960,9 @@ } }, "node_modules/jest-html-reporter/node_modules/@sinclair/typebox": { - "version": "0.34.37", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.37.tgz", - "integrity": "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -32072,9 +30037,9 @@ } }, "node_modules/jest-leak-detector/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -32258,16 +30223,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-mock-console": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-mock-console/-/jest-mock-console-2.0.0.tgz", - "integrity": "sha512-7zrKtXVut+6doalosFxw/2O9spLepQJ9VukODtyLIub2fFkWKe1TyQrxr/GyQogTQcdkHfhvFJdx1OEzLqf/mw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "jest": ">= 22.4.2" - } - }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -32451,9 +30406,9 @@ } }, "node_modules/jest-resolve/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -32616,16 +30571,16 @@ } }, "node_modules/jest-runner/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/jest-runner/node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -32909,16 +30864,16 @@ } }, "node_modules/jest-runtime/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/jest-runtime/node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", - "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -32926,9 +30881,9 @@ } }, "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { @@ -33145,16 +31100,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/jest-snapshot/node_modules/@jest/expect-utils": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", @@ -33201,9 +31146,9 @@ } }, "node_modules/jest-snapshot/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -33481,9 +31426,9 @@ } }, "node_modules/jest-validate/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -33585,9 +31530,9 @@ } }, "node_modules/jest-watcher/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -33715,9 +31660,9 @@ } }, "node_modules/jest/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -33739,9 +31684,9 @@ } }, "node_modules/joi": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.1.2.tgz", - "integrity": "sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.2.1.tgz", + "integrity": "sha512-2/OKlogiESf2Nh3TFCrRjrr9z1DRHeW0I+KReF67+4J0Ns+8hBtHRmoWAZ2OFU6I5+TWLEe6sVlSdXPjHm5UbQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -33843,9 +31788,9 @@ } }, "node_modules/jsdom": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.0.tgz", - "integrity": "sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -33927,9 +31872,9 @@ } }, "node_modules/jsdom/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", "dev": true, "license": "MIT", "optional": true, @@ -33998,39 +31943,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/jsdom/node_modules/tldts": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", - "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.0.27" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/jsdom/node_modules/tldts-core": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", - "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/jsdom/node_modules/webidl-conversions": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", @@ -34096,14 +32008,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)", - "peer": true - }, "node_modules/json-schema-compare": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", @@ -34257,23 +32161,6 @@ "html2canvas": "^1.0.0-rc.5" } }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "peer": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -34425,17 +32312,6 @@ "shell-quote": "^1.8.1" } }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "> 0.8" - } - }, "node_modules/lerc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", @@ -34523,16 +32399,6 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/lerna/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/lerna/node_modules/@jest/schemas": { "version": "30.0.5", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", @@ -34714,9 +32580,9 @@ } }, "node_modules/lerna/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -34793,13 +32659,6 @@ } } }, - "node_modules/lerna/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, "node_modules/lerna/node_modules/execa": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", @@ -34842,19 +32701,6 @@ } } }, - "node_modules/lerna/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lerna/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -34968,16 +32814,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/lerna/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/lerna/node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -35476,54 +33312,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/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==", - "dev": true, - "license": "MIT", - "peer": true, - "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/load-json-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", @@ -35612,6 +33400,12 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "license": "MIT" }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", + "license": "MIT" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -35643,16 +33437,19 @@ "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, "license": "MIT" }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/lodash.range": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.2.0.tgz", + "integrity": "sha512-Fgkb7SinmuzqgIhNhAElo0BL/R1rHCnhwSZf78omqSwvWqD0kD2ssOAutQonDKH/ldS8BxA72ORYI09qAY9CYg==", + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -35661,62 +33458,6 @@ "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.0.tgz", - "integrity": "sha512-zrc91EDk2M+2AXo/9BTvK91pqb7qrPg2nX/Hy+u8a5qQlbaOflCKO+6SqgZ+M+xUFxGdKTgwnGiL96b1W3ikRA==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", @@ -35939,9 +33680,9 @@ "license": "MIT" }, "node_modules/mapbox-gl": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.23.0.tgz", - "integrity": "sha512-zzjNAaMNvXnAVEUrYpOWmRVEBCIWgDAMLRPvSOoKY3smKvrINFVrRK/1jEpUDbEa7Ppf5Q/nwC6E07tz/i7IKw==", + "version": "3.23.1", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.23.1.tgz", + "integrity": "sha512-J5M32GunL5KcxvV3ZyLJdr7xtcQ3afAO3VjitLW0v2UVfHjXhq9NO4tkTpn4Dknqwq/pXZG7j1WBfmddLCA26w==", "license": "SEE LICENSE IN LICENSE.txt", "workspaces": [ "src/style-spec", @@ -35994,9 +33735,9 @@ } }, "node_modules/mapbox-gl/node_modules/earcut": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz", - "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", "license": "ISC" }, "node_modules/mapbox-gl/node_modules/pbf": { @@ -36012,20 +33753,18 @@ } }, "node_modules/maplibre-gl": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.22.0.tgz", - "integrity": "sha512-nc8YA+YSEioMZg5W0cb6Cf3wQ8aJge66dsttyBgpOArOnlmFJO1Kc5G32kYVPeUYhLpBja83T99uanmJvYAIyQ==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.24.0.tgz", + "integrity": "sha512-ALyFxgtd5R+65UqZ/++lOqwWcC0SNho9c27fYSyLmG7AfnAul2o46F05aDJGPbFU57wos9dgcIySHs0Xe6ia3A==", "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^1.1.0", - "@mapbox/tiny-sdf": "^2.0.7", + "@mapbox/tiny-sdf": "^2.1.0", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/geojson-vt": "^6.0.4", + "@maplibre/geojson-vt": "^6.1.0", "@maplibre/maplibre-gl-style-spec": "^24.8.1", "@maplibre/mlt": "^1.1.8", "@maplibre/vt-pbf": "^4.3.0", @@ -36051,38 +33790,39 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", - "license": "ISC", - "optional": true, - "peer": true + "license": "ISC" }, "node_modules/maplibre-gl/node_modules/@mapbox/vector-tile": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==", "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "@mapbox/point-geometry": "~1.1.0", "@types/geojson": "^7946.0.16", "pbf": "^4.0.1" } }, + "node_modules/maplibre-gl/node_modules/@maplibre/geojson-vt": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.1.0.tgz", + "integrity": "sha512-2eIY4gZxeKIVOZVNkAMb+5NgXhgsMQpOveTQAvnp53LYqHGJZDidk7Ew0Tged9PThidpbS+NFTh0g4zivhPDzQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.0.2" + } + }, "node_modules/maplibre-gl/node_modules/earcut": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC", - "optional": true, - "peer": true + "license": "ISC" }, "node_modules/maplibre-gl/node_modules/pbf": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, @@ -36101,9 +33841,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "9.7.16", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-9.7.16.tgz", - "integrity": "sha512-+LEgOlYfUEB9i2Oaxasec9H2HytB1+SQcgwFmQiNTKwe8cQ2E9bDNgePGq6ChIycMxtpcEY0g44aQ3uJoMw8eg==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-9.8.0.tgz", + "integrity": "sha512-NWL0vDt6BeQgCxc2kK6g2SEPJpQuacu+NJk5j4QT4wlNmbsHdudoAbTGLCIyoPhfMiEqD1OZVBsYK0hvCky/HQ==", "license": "MIT", "engines": { "node": ">= 18" @@ -36211,6 +33951,375 @@ "@types/unist": "^2" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-from-markdown/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", @@ -36248,9 +34357,9 @@ "license": "MIT" }, "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -36277,9 +34386,9 @@ } }, "node_modules/mdast-util-to-hast/node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -36290,10 +34399,61 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true, "license": "CC0-1.0" }, @@ -36308,116 +34468,21 @@ } }, "node_modules/mem-fs": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.2.tgz", - "integrity": "sha512-CMwusHK+Kz0tu1qjgbd0rwcJxzgg76jlkPpqK+pDTv8Hth8JyM7JlgxNWaAFRKe969HATPTz/sp8T63QflyI+w==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.4.tgz", + "integrity": "sha512-NlRHmUiEcxDHI7FeDlrrTZP5YFvnoS74wEf5OrQ7NAg83B2Rv3oF+FWr961I0rVdxkKbZMjq2BcV7VFWGFPkog==", "license": "MIT", "peer": true, "dependencies": { "@types/node": ">=18", - "@types/vinyl": "^2.0.8", - "vinyl": "^3.0.0", + "@types/vinyl": "^2.0.12", + "vinyl": "^3.0.1", "vinyl-file": "^5.0.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/mem-fs-editor": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-12.0.4.tgz", - "integrity": "sha512-gc8b4VlisaGp5W+ot2f4Xc8jUgKnMn5UR2mKsdm8UdbESYCdSiQKqioktPu8gJ0Uxd8gV/m/M16Pp5n1Ge8pjA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/ejs": "^3.1.5", - "@types/picomatch": "^4.0.2", - "binaryextensions": "^6.11.0", - "commondir": "^1.0.1", - "debug": "^4.4.3", - "deep-extend": "^0.6.0", - "ejs": "^5.0.1", - "isbinaryfile": "5.0.7", - "minimatch": "^10.2.4", - "multimatch": "^8.0.0", - "normalize-path": "^3.0.0", - "textextensions": "^6.11.0", - "tinyglobby": "^0.2.15", - "vinyl": "^3.0.1" - }, - "acceptDependencies": { - "isbinaryfile": "^6.0.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@types/node": ">=20", - "mem-fs": "^4.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/mem-fs-editor/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/mem-fs-editor/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/mem-fs-editor/node_modules/ejs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.2.tgz", - "integrity": "sha512-IpbUaI/CAW86l3f+T8zN0iggSc0LmMZLcIW5eRVStLVNCoTXkE0YlncbbH50fp8Cl6zHIky0sW2uUbhBqGw0Jw==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.12.18" - } - }, - "node_modules/mem-fs-editor/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "optional": true, - "peer": true, - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -36488,17 +34553,11 @@ } }, "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, "node_modules/meow/node_modules/locate-path": { "version": "5.0.0", @@ -36542,6 +34601,32 @@ "node": ">=10" } }, + "node_modules/meow/node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/meow/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -36615,13 +34700,6 @@ "node": ">=8" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -36635,16 +34713,6 @@ "validate-npm-package-license": "^3.0.1" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -36655,6 +34723,16 @@ "node": ">=8" } }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", @@ -36745,6 +34823,961 @@ "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==", "license": "MIT" }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "license": "MIT", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", @@ -36765,6 +35798,259 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-util-encode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", @@ -36781,6 +36067,92 @@ ], "license": "MIT" }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", @@ -36802,6 +36174,60 @@ "micromark-util-symbol": "^2.0.0" } }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", @@ -36819,9 +36245,98 @@ "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -36887,24 +36402,12 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -37161,7 +36664,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -37298,19 +36800,19 @@ } }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, "license": "ISC", - "peer": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nanoid": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.9.tgz", - "integrity": "sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.11.tgz", + "integrity": "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==", "funding": [ { "type": "github", @@ -37894,16 +37396,6 @@ } } }, - "node_modules/nx/node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/nx/node_modules/@jest/schemas": { "version": "30.0.5", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", @@ -37918,9 +37410,9 @@ } }, "node_modules/nx/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, @@ -37964,19 +37456,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/nx/node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/nx/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -38067,12 +37546,11 @@ } }, "node_modules/nyc": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", - "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -38081,12 +37559,12 @@ "decamelize": "^1.2.0", "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", - "foreground-child": "^3.3.0", + "foreground-child": "^2.0.0", "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", @@ -38106,7 +37584,7 @@ "nyc": "bin/nyc.js" }, "engines": { - "node": ">=18" + "node": ">=8.9" } }, "node_modules/nyc/node_modules/camelcase": { @@ -38115,7 +37593,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -38126,7 +37603,6 @@ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -38138,8 +37614,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nyc/node_modules/find-cache-dir": { "version": "3.3.2", @@ -38147,7 +37622,6 @@ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -38166,7 +37640,6 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -38175,13 +37648,42 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/nyc/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -38195,7 +37697,6 @@ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "semver": "^6.0.0" }, @@ -38206,24 +37707,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/make-dir/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, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -38240,7 +37729,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -38254,7 +37742,6 @@ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -38262,22 +37749,14 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/nyc/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, "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "semver": "bin/semver.js" } }, "node_modules/nyc/node_modules/y18n": { @@ -38285,8 +37764,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", @@ -38294,7 +37772,6 @@ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -38318,7 +37795,6 @@ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -38554,6 +38030,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -38778,14 +38255,6 @@ "node": ">=0.10.0" } }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -38804,9 +38273,9 @@ } }, "node_modules/oxlint": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.62.0.tgz", - "integrity": "sha512-1uFkg6HakjsGIpW9wNdeW4/2LOHW9MEkoWjZUTUfQtIHyLIZPYt00w3Sg+H3lH+206FgBPHBbW5dVE5l2ExECQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.63.0.tgz", + "integrity": "sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==", "dev": true, "license": "MIT", "bin": { @@ -38819,28 +38288,28 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.62.0", - "@oxlint/binding-android-arm64": "1.62.0", - "@oxlint/binding-darwin-arm64": "1.62.0", - "@oxlint/binding-darwin-x64": "1.62.0", - "@oxlint/binding-freebsd-x64": "1.62.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.62.0", - "@oxlint/binding-linux-arm-musleabihf": "1.62.0", - "@oxlint/binding-linux-arm64-gnu": "1.62.0", - "@oxlint/binding-linux-arm64-musl": "1.62.0", - "@oxlint/binding-linux-ppc64-gnu": "1.62.0", - "@oxlint/binding-linux-riscv64-gnu": "1.62.0", - "@oxlint/binding-linux-riscv64-musl": "1.62.0", - "@oxlint/binding-linux-s390x-gnu": "1.62.0", - "@oxlint/binding-linux-x64-gnu": "1.62.0", - "@oxlint/binding-linux-x64-musl": "1.62.0", - "@oxlint/binding-openharmony-arm64": "1.62.0", - "@oxlint/binding-win32-arm64-msvc": "1.62.0", - "@oxlint/binding-win32-ia32-msvc": "1.62.0", - "@oxlint/binding-win32-x64-msvc": "1.62.0" + "@oxlint/binding-android-arm-eabi": "1.63.0", + "@oxlint/binding-android-arm64": "1.63.0", + "@oxlint/binding-darwin-arm64": "1.63.0", + "@oxlint/binding-darwin-x64": "1.63.0", + "@oxlint/binding-freebsd-x64": "1.63.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.63.0", + "@oxlint/binding-linux-arm-musleabihf": "1.63.0", + "@oxlint/binding-linux-arm64-gnu": "1.63.0", + "@oxlint/binding-linux-arm64-musl": "1.63.0", + "@oxlint/binding-linux-ppc64-gnu": "1.63.0", + "@oxlint/binding-linux-riscv64-gnu": "1.63.0", + "@oxlint/binding-linux-riscv64-musl": "1.63.0", + "@oxlint/binding-linux-s390x-gnu": "1.63.0", + "@oxlint/binding-linux-x64-gnu": "1.63.0", + "@oxlint/binding-linux-x64-musl": "1.63.0", + "@oxlint/binding-openharmony-arm64": "1.63.0", + "@oxlint/binding-win32-arm64-msvc": "1.63.0", + "@oxlint/binding-win32-ia32-msvc": "1.63.0", + "@oxlint/binding-win32-x64-msvc": "1.63.0" }, "peerDependencies": { - "oxlint-tsgolint": ">=0.18.0" + "oxlint-tsgolint": ">=0.22.1" }, "peerDependenciesMeta": { "oxlint-tsgolint": { @@ -38929,23 +38398,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", - "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", - "license": "MIT", - "peer": true, - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", @@ -38956,19 +38408,6 @@ "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -39551,20 +38990,12 @@ "through2": "^2.0.3" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "devOptional": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/picocolors": { "version": "1.1.1", @@ -39692,13 +39123,13 @@ } }, "node_modules/playwright": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.59.1" + "playwright-core": "1.60.0" }, "bin": { "playwright": "cli.js" @@ -39711,9 +39142,9 @@ } }, "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -39836,9 +39267,9 @@ } }, "node_modules/postcss-calc/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -40077,9 +39508,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -40107,9 +39538,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -40383,9 +39814,9 @@ "license": "MIT" }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -40421,9 +39852,9 @@ } }, "node_modules/preact": { - "version": "10.28.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.3.tgz", - "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==", + "version": "10.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", "license": "MIT", "peer": true, "funding": { @@ -40488,20 +39919,6 @@ } } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -40773,14 +40190,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -40804,18 +40213,6 @@ "node": ">=6" } }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -41192,6 +40589,21 @@ "react-dom": ">=16.9.0" } }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, "node_modules/rc-input-number": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", @@ -41209,21 +40621,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-input-number/node_modules/rc-input": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", - "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/rc-mentions": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", @@ -41243,21 +40640,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-mentions/node_modules/rc-input": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", - "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/rc-menu": { "version": "9.16.1", "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", @@ -41574,21 +40956,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc-textarea/node_modules/rc-input": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", - "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/rc-tooltip": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", @@ -41716,13 +41083,12 @@ } }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "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==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -41998,17 +41364,16 @@ } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.3.1" } }, "node_modules/react-draggable": { @@ -42401,22 +41766,6 @@ "node": ">=6" } }, - "node_modules/react-sortable-hoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz", - "integrity": "sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.2.0", - "invariant": "^2.2.4", - "prop-types": "^15.5.7" - }, - "peerDependencies": { - "prop-types": "^15.5.7", - "react": "^16.3.0 || ^17.0.0", - "react-dom": "^16.3.0 || ^17.0.0" - } - }, "node_modules/react-split": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", @@ -42819,16 +42168,6 @@ "node": ">=4" } }, - "node_modules/read/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -43222,9 +42561,9 @@ } }, "node_modules/rehype-raw/node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -43281,6 +42620,31 @@ "node": ">=4" } }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/remark-parse": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", @@ -43305,498 +42669,6 @@ "@types/unist": "^2" } }, - "node_modules/remark-parse/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/remark-parse/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/remark-parse/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/remark-parse/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/remark-parse/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-rehype": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", @@ -44052,17 +42924,6 @@ "node": ">= 10" } }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -44220,6 +43081,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -44249,14 +43111,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/rgbcolor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", @@ -44267,6 +43121,23 @@ "node": ">= 0.8.15" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rison": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/rison/-/rison-0.1.1.tgz", @@ -44274,9 +43145,9 @@ "license": "Apache-2.0" }, "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", "license": "Unlicense" }, "node_modules/run-applescript": { @@ -44292,16 +43163,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -44334,6 +43195,7 @@ "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -44436,6 +43298,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, "node_modules/sax": { @@ -44461,13 +43324,12 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { @@ -44815,6 +43677,12 @@ "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", "license": "MIT" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/shapefile": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/shapefile/-/shapefile-0.3.1.tgz", @@ -44956,6 +43824,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/sigstore": { @@ -45003,9 +43872,9 @@ } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "license": "MIT" }, "node_modules/simple-zstd": { @@ -45061,22 +43930,6 @@ "node": ">=6" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -45389,23 +44242,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/spawn-wrap/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -45626,41 +44462,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/ssri": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", @@ -45947,19 +44748,6 @@ "node": ">= 0.8" } }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -46625,9 +45413,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", "dev": true, "license": "MIT", "dependencies": { @@ -46647,12 +45435,39 @@ "webpack": "^5.1.0" }, "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, "@swc/core": { "optional": true }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, "esbuild": { "optional": true }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, "uglify-js": { "optional": true } @@ -46690,9 +45505,9 @@ } }, "node_modules/terser/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -46788,14 +45603,18 @@ } }, "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", "dev": true, - "license": "Unlicense", + "license": "MIT", "engines": { "node": ">=10.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, "peerDependencies": { "tslib": "^2" } @@ -46809,17 +45628,6 @@ "node": ">=12.22" } }, - "node_modules/throttleit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", - "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -46905,13 +45713,13 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -46976,26 +45784,24 @@ } }, "node_modules/tldts": { - "version": "6.1.74", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.74.tgz", - "integrity": "sha512-O5vTZ1UmmEmrLl/59U9igitnSMlprALLaLgbv//dEvjobPT9vyURhHXKMCDLEhn3qxZFIkb9PwAfNYV0Ol7RPQ==", + "version": "7.0.29", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.29.tgz", + "integrity": "sha512-JIXCerhudr/N6OWLwLF1HVsTTUo7ry6qHa5eWZEkiMuxsIiAACL55tGLfqfHfoH7QaMQUW8fngD7u7TxWexYQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tldts-core": "^6.1.74" + "tldts-core": "^7.0.29" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.74", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.74.tgz", - "integrity": "sha512-gTwtY6L2GfuxiL4CWpLknv9JDYYqBvKCk/BT5uAaAvCA0s6pzX7lr2IrkQZSUlnSjRHIjTl8ZwKCVXJ7XNRWYw==", + "version": "7.0.29", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.29.tgz", + "integrity": "sha512-W99NuU7b1DcG3uJ3v9k9VztCH3WialNbBkBft5wCs8V8mexu0XQqaZEYb9l9RNNzK8+3EJ9PKWB0/RUtTQ/o+Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tmp": { "version": "0.2.5", @@ -47100,14 +45906,13 @@ } }, "node_modules/tough-cookie": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", - "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { - "tldts": "^6.1.32" + "tldts": "^7.0.5" }, "engines": { "node": ">=16" @@ -47154,9 +45959,9 @@ } }, "node_modules/tree-dump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", - "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -47353,9 +46158,9 @@ } }, "node_modules/ts-node/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -47415,9 +46220,9 @@ } }, "node_modules/tscw-config/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", "dev": true, "license": "MIT", "engines": { @@ -47477,9 +46282,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", - "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "cpu": [ "ppc64" ], @@ -47494,9 +46299,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", - "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "cpu": [ "arm" ], @@ -47511,9 +46316,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", - "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "cpu": [ "arm64" ], @@ -47528,9 +46333,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", - "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" ], @@ -47545,9 +46350,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", - "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "cpu": [ "arm64" ], @@ -47562,9 +46367,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", - "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "cpu": [ "x64" ], @@ -47579,9 +46384,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", - "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "cpu": [ "arm64" ], @@ -47596,9 +46401,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", - "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "cpu": [ "x64" ], @@ -47613,9 +46418,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", - "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "cpu": [ "arm" ], @@ -47630,9 +46435,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", - "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "cpu": [ "arm64" ], @@ -47647,9 +46452,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", - "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "cpu": [ "ia32" ], @@ -47664,9 +46469,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", - "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "cpu": [ "loong64" ], @@ -47681,9 +46486,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", - "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "cpu": [ "mips64el" ], @@ -47698,9 +46503,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", - "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "cpu": [ "ppc64" ], @@ -47715,9 +46520,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", - "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "cpu": [ "riscv64" ], @@ -47732,9 +46537,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", - "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "cpu": [ "s390x" ], @@ -47749,9 +46554,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", - "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "cpu": [ "x64" ], @@ -47766,9 +46571,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", - "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "cpu": [ "x64" ], @@ -47783,9 +46588,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", - "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "cpu": [ "x64" ], @@ -47800,9 +46605,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", - "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ "x64" ], @@ -47817,9 +46622,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", - "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ "arm64" ], @@ -47834,9 +46639,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", - "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ "ia32" ], @@ -47851,9 +46656,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", - "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], @@ -47868,9 +46673,9 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", - "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -47881,32 +46686,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.1", - "@esbuild/android-arm": "0.27.1", - "@esbuild/android-arm64": "0.27.1", - "@esbuild/android-x64": "0.27.1", - "@esbuild/darwin-arm64": "0.27.1", - "@esbuild/darwin-x64": "0.27.1", - "@esbuild/freebsd-arm64": "0.27.1", - "@esbuild/freebsd-x64": "0.27.1", - "@esbuild/linux-arm": "0.27.1", - "@esbuild/linux-arm64": "0.27.1", - "@esbuild/linux-ia32": "0.27.1", - "@esbuild/linux-loong64": "0.27.1", - "@esbuild/linux-mips64el": "0.27.1", - "@esbuild/linux-ppc64": "0.27.1", - "@esbuild/linux-riscv64": "0.27.1", - "@esbuild/linux-s390x": "0.27.1", - "@esbuild/linux-x64": "0.27.1", - "@esbuild/netbsd-arm64": "0.27.1", - "@esbuild/netbsd-x64": "0.27.1", - "@esbuild/openbsd-arm64": "0.27.1", - "@esbuild/openbsd-x64": "0.27.1", - "@esbuild/openharmony-arm64": "0.27.1", - "@esbuild/sunos-x64": "0.27.1", - "@esbuild/win32-arm64": "0.27.1", - "@esbuild/win32-ia32": "0.27.1", - "@esbuild/win32-x64": "0.27.1" + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/tsyringe": { @@ -47944,28 +46749,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense", - "peer": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -48296,9 +47079,9 @@ } }, "node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.21.0.tgz", + "integrity": "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -48442,9 +47225,9 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -48641,17 +47424,6 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/unzipit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unzipit/-/unzipit-2.0.0.tgz", @@ -49015,22 +47787,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/version-range": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.14.0.tgz", @@ -49094,9 +47850,9 @@ } }, "node_modules/vfile-location/node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -49195,9 +47951,9 @@ "license": "MIT" }, "node_modules/vm2": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.10.5.tgz", - "integrity": "sha512-3P/2QDccVFBcujfCOeP8vVNuGfuBJHEuvGR8eMmI10p/iwLL2UwF5PDaNaoOS2pRGQEDmJRyeEcc8kmm2Z59RA==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.11.3.tgz", + "integrity": "sha512-DO1TTKuOc+veL11VNOvJwRab80mghFKE40Av3bl6pdXs11bdiDMuR73owy+dS2EsTZEvRUeBkkBuDVRjV/RgEw==", "license": "MIT", "dependencies": { "acorn": "^8.15.0", @@ -49236,14 +47992,14 @@ } }, "node_modules/wait-on": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.5.tgz", - "integrity": "sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.10.tgz", + "integrity": "sha512-rCoJEhvMr0X6alHmwc9abbrA5ZrLZFKpFQVKPNFwl2h7DapXOGdmimIHDtLOWhT4PjhZhxFEtZoQgEXbkDWdZw==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.15.0", - "joi": "^18.1.2", + "axios": "^1.16.0", + "joi": "^18.2.1", "lodash": "^4.18.1", "minimist": "^1.2.8", "rxjs": "^7.8.2" @@ -49406,6 +48162,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -49520,9 +48277,9 @@ } }, "node_modules/webpack-bundle-analyzer/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -49562,28 +48319,6 @@ "dev": true, "license": "MIT" }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-cli": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", @@ -49638,9 +48373,9 @@ } }, "node_modules/webpack-cli/node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -49768,9 +48503,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "dev": true, "license": "MIT", "engines": { @@ -49778,9 +48513,9 @@ } }, "node_modules/webpack-dev-server/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -49794,36 +48529,73 @@ } }, "node_modules/webpack-dev-server/node_modules/memfs": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", - "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/webpack-dev-server/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "wsl-utils": "^0.1.0" }, "engines": { "node": ">=18" @@ -49851,15 +48623,15 @@ } }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -49880,26 +48652,20 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "node_modules/webpack-dev-server/node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "dev": true, "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, "engines": { - "node": ">=10.0.0" + "node": ">=18" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-hot-middleware": { @@ -49971,9 +48737,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.0.tgz", - "integrity": "sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { @@ -50017,50 +48783,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/webpack-visualizer-plugin2/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-visualizer-plugin2/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/webpack-visualizer-plugin2/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, "node_modules/webpack/node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -50088,9 +48810,9 @@ } }, "node_modules/webpack/node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, @@ -50174,9 +48896,9 @@ } }, "node_modules/whatwg-url/node_modules/@exodus/bytes": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.11.0.tgz", - "integrity": "sha512-wO3vd8nsEHdumsXrjGO/v4p6irbg7hy9kvIeR6i2AwylZSk4HJdWgL0FNaVquW1+AweJcdvU1IEpuIWk/WaPnA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", "dev": true, "license": "MIT", "engines": { @@ -50192,15 +48914,15 @@ } }, "node_modules/whatwg-url/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", "dev": true, "license": "MIT", "optional": true, "peer": true, "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -50365,6 +49087,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -50428,9 +49151,9 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "dev": true, "license": "MIT", "engines": { @@ -50747,18 +49470,6 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -50797,6 +49508,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -50829,9 +49541,9 @@ } }, "node_modules/yosay/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -50841,9 +49553,9 @@ } }, "node_modules/yosay/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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -50853,9 +49565,9 @@ } }, "node_modules/yosay/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -50877,9 +49589,9 @@ } }, "node_modules/yosay/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, "node_modules/yosay/node_modules/meow": { @@ -50912,12 +49624,12 @@ } }, "node_modules/yosay/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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -51026,9 +49738,9 @@ }, "devDependencies": { "cross-env": "^10.1.0", - "fs-extra": "^11.3.4", + "fs-extra": "^11.3.5", "jest": "^30.3.0", - "yeoman-test": "^11.3.1" + "yeoman-test": "^11.5.2" }, "engines": { "node": ">= 18.0.0", @@ -51226,12 +49938,12 @@ } }, "packages/generator-superset/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -51293,9 +50005,9 @@ } }, "packages/generator-superset/node_modules/type-fest": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", - "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -51395,19 +50107,18 @@ }, "packages/superset-core": { "name": "@apache-superset/core", - "version": "0.1.0-rc3", + "version": "0.1.0", "license": "Apache-2.0", "devDependencies": { "@babel/cli": "^7.28.6", "@babel/core": "^7.29.0", - "@babel/preset-env": "^7.29.2", + "@babel/preset-env": "^7.29.5", "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", "@emotion/styled": "^11.14.1", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "@types/lodash": "^4.17.24", "@types/react": "*", @@ -51426,8 +50137,8 @@ "jed": "^1.1.1", "lodash": "^4.18.1", "nanoid": "^5.0.9", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-loadable": "^5.5.0", "tinycolor2": "*" } @@ -51446,17 +50157,16 @@ "@ant-design/icons": "^5.6.1", "@emotion/react": "^11.4.1", "@superset-ui/core": "*", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "ace-builds": "^1.4.14", "brace": "^0.11.1", "memoize-one": "^5.1.1", - "react": "^17.0.2", + "react": "^18.2.0", "react-ace": "^10.1.0", - "react-dom": "^17.0.2" + "react-dom": "^18.2.0" } }, "packages/superset-ui-core": { @@ -51469,7 +50179,7 @@ "@babel/runtime": "^7.29.2", "@types/json-bigint": "^1.0.4", "@visx/responsive": "^3.12.0", - "ace-builds": "^1.43.6", + "ace-builds": "^1.44.0", "ag-grid-community": "35.2.1", "ag-grid-react": "35.2.1", "brace": "^0.11.1", @@ -51496,7 +50206,7 @@ "react-js-cron": "^5.2.0", "react-markdown": "^8.0.7", "react-resize-detector": "^7.1.2", - "react-syntax-highlighter": "^16.1.0", + "react-syntax-highlighter": "^16.1.1", "react-ultimate-pagination": "^1.3.2", "regenerator-runtime": "^0.14.1", "rehype-raw": "^7.0.0", @@ -51516,14 +50226,13 @@ "@types/d3-time-format": "^4.0.3", "@types/jquery": "^4.0.0", "@types/lodash": "^4.17.24", - "@types/node": "^25.6.0", + "@types/node": "^25.7.0", "@types/prop-types": "^15.7.15", "@types/react-syntax-highlighter": "^15.5.13", "@types/react-table": "^7.7.20", "@types/rison": "0.1.0", "@types/seedrandom": "^3.0.8", "fetch-mock": "^12.6.0", - "jest-mock-console": "^2.0.0", "resize-observer-polyfill": "1.5.1", "timezone-mock": "^1.4.2" }, @@ -51531,10 +50240,9 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.4.1", "@emotion/styled": "^11.14.1", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "@types/react": "*", "@types/react-loadable": "*", @@ -51542,8 +50250,8 @@ "@types/tinycolor2": "*", "antd": "^5.26.0", "nanoid": "^5.0.9", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-loadable": "^5.5.0", "tinycolor2": "*" } @@ -51599,33 +50307,6 @@ "react-dom": ">=18.0.0" } }, - "packages/superset-ui-core/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "packages/superset-ui-core/node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, - "packages/superset-ui-core/node_modules/core-js": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "packages/superset-ui-core/node_modules/d3-format": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", @@ -51635,771 +50316,6 @@ "node": ">=12" } }, - "packages/superset-ui-core/node_modules/dompurify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", - "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "packages/superset-ui-core/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "license": "MIT", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/superset-ui-core/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/superset-ui-core/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "packages/superset-ui-core/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/superset-ui-core/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "packages/superset-ui-core/node_modules/react-ace": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-14.0.1.tgz", @@ -52473,22 +50389,6 @@ "react": ">= 0.14.0" } }, - "packages/superset-ui-core/node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "packages/superset-ui-core/node_modules/timezone-mock": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timezone-mock/-/timezone-mock-1.4.2.tgz", @@ -52496,46 +50396,6 @@ "dev": true, "license": "MIT" }, - "packages/superset-ui-core/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/superset-ui-core/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "packages/superset-ui-switchboard": { "name": "@superset-ui/switchboard", "version": "0.20.3", @@ -52556,7 +50416,7 @@ "@emotion/react": "^11.4.1", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-calendar/node_modules/d3-array": { @@ -52587,7 +50447,7 @@ "dependencies": { "d3": "^3.5.17", "prop-types": "^15.8.1", - "react": "^19.2.5" + "react": "^19.2.6" }, "peerDependencies": { "@apache-superset/core": "*", @@ -52596,9 +50456,9 @@ } }, "plugins/legacy-plugin-chart-chord/node_modules/react": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -52617,7 +50477,7 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-country-map/node_modules/d3-array": { @@ -52645,7 +50505,7 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-horizon/node_modules/d3-array": { @@ -52666,25 +50526,6 @@ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, - "plugins/legacy-plugin-chart-map-box": { - "name": "@superset-ui/legacy-plugin-chart-map-box", - "version": "0.20.3", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "@math.gl/web-mercator": "^4.1.0", - "prop-types": "^15.8.1", - "react-map-gl": "^6.1.19", - "supercluster": "^8.0.1" - }, - "peerDependencies": { - "@apache-superset/core": "*", - "@superset-ui/chart-controls": "*", - "@superset-ui/core": "*", - "mapbox-gl": "*", - "react": "^17.0.2" - } - }, "plugins/legacy-plugin-chart-paired-t-test": { "name": "@superset-ui/legacy-plugin-chart-paired-t-test", "version": "0.20.3", @@ -52698,7 +50539,7 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-parallel-coordinates": { @@ -52713,7 +50554,7 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-partition": { @@ -52730,9 +50571,9 @@ "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "@testing-library/react": "^14.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "plugins/legacy-plugin-chart-rose": { @@ -52749,7 +50590,7 @@ "@emotion/react": "^11.4.1", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-world-map": { @@ -52767,7 +50608,7 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/legacy-plugin-chart-world-map/node_modules/d3-array": { @@ -52854,16 +50695,7 @@ "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", "dayjs": "^1.11.19", - "react": "^17.0.2" - } - }, - "plugins/legacy-preset-chart-nvd3/node_modules/dompurify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", - "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" + "react": "^18.2.0" } }, "plugins/plugin-chart-ag-grid-table": { @@ -52876,7 +50708,7 @@ "classnames": "^2.5.1", "d3-array": "^3.2.4", "lodash": "^4.18.1", - "memoize-one": "^5.2.1", + "memoize-one": "^6.0.0", "react-table": "^7.8.0", "regenerator-runtime": "^0.14.1", "xss": "^1.0.15" @@ -52886,14 +50718,13 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "@types/react": "*", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "plugins/plugin-chart-ag-grid-table/node_modules/d3-array": { @@ -52908,6 +50739,12 @@ "node": ">=12" } }, + "plugins/plugin-chart-ag-grid-table/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "plugins/plugin-chart-cartodiagram": { "name": "@superset-ui/plugin-chart-cartodiagram", "version": "0.0.1", @@ -52931,8 +50768,8 @@ "geostyler-wfs-parser": "^3.0.1", "ol": "^10.8.0", "polished": "*", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "plugins/plugin-chart-echarts": { @@ -52945,7 +50782,7 @@ "acorn": "^8.16.0", "d3-array": "^3.2.4", "lodash": "^4.18.1", - "zod": "^4.4.1" + "zod": "^4.4.3" }, "peerDependencies": { "@apache-superset/core": "*", @@ -52954,7 +50791,7 @@ "dayjs": "^1.11.19", "echarts": "*", "memoize-one": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/plugin-chart-echarts/node_modules/acorn": { @@ -53012,9 +50849,9 @@ "dayjs": "^1.11.19", "handlebars": "^4.7.8", "lodash": "^4.18.1", - "react": "^17.0.2", + "react": "^18.2.0", "react-ace": "^10.1.0", - "react-dom": "^17.0.2" + "react-dom": "^18.2.0" } }, "plugins/plugin-chart-handlebars/node_modules/just-handlebars-helpers": { @@ -53029,13 +50866,6 @@ "sprintf-js": ">= 1.1.1 < 2" } }, - "plugins/plugin-chart-handlebars/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause", - "peer": true - }, "plugins/plugin-chart-pivot-table": { "name": "@superset-ui/plugin-chart-pivot-table", "version": "0.20.3", @@ -53052,8 +50882,8 @@ "@superset-ui/core": "*", "lodash": "^4.18.1", "prop-types": "*", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "plugins/plugin-chart-point-cluster-map": { @@ -53062,7 +50892,7 @@ "license": "Apache-2.0", "dependencies": { "@math.gl/web-mercator": "^4.1.0", - "mapbox-gl": "^3.23.0", + "mapbox-gl": "^3.23.1", "maplibre-gl": "^5.24.0", "react-map-gl": "^8.1.0", "supercluster": "^8.0.1" @@ -53071,86 +50901,8 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "react": "^17.0.2 || ^19.0.0", - "react-dom": "^17.0.2 || ^19.0.0" - } - }, - "plugins/plugin-chart-point-cluster-map/node_modules/@mapbox/point-geometry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", - "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", - "license": "ISC" - }, - "plugins/plugin-chart-point-cluster-map/node_modules/@mapbox/vector-tile": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", - "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/point-geometry": "~1.1.0", - "@types/geojson": "^7946.0.16", - "pbf": "^4.0.1" - } - }, - "plugins/plugin-chart-point-cluster-map/node_modules/@maplibre/geojson-vt": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.1.0.tgz", - "integrity": "sha512-2eIY4gZxeKIVOZVNkAMb+5NgXhgsMQpOveTQAvnp53LYqHGJZDidk7Ew0Tged9PThidpbS+NFTh0g4zivhPDzQ==", - "license": "ISC", - "dependencies": { - "kdbush": "^4.0.2" - } - }, - "plugins/plugin-chart-point-cluster-map/node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, - "plugins/plugin-chart-point-cluster-map/node_modules/maplibre-gl": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.24.0.tgz", - "integrity": "sha512-ALyFxgtd5R+65UqZ/++lOqwWcC0SNho9c27fYSyLmG7AfnAul2o46F05aDJGPbFU57wos9dgcIySHs0Xe6ia3A==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/point-geometry": "^1.1.0", - "@mapbox/tiny-sdf": "^2.1.0", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^2.0.4", - "@mapbox/whoots-js": "^3.1.0", - "@maplibre/geojson-vt": "^6.1.0", - "@maplibre/maplibre-gl-style-spec": "^24.8.1", - "@maplibre/mlt": "^1.1.8", - "@maplibre/vt-pbf": "^4.3.0", - "@types/geojson": "^7946.0.16", - "earcut": "^3.0.2", - "gl-matrix": "^3.4.4", - "kdbush": "^4.0.2", - "murmurhash-js": "^1.0.0", - "pbf": "^4.0.1", - "potpack": "^2.1.0", - "quickselect": "^3.0.0", - "tinyqueue": "^3.0.0" - }, - "engines": { - "node": ">=16.14.0", - "npm": ">=8.1.0" - }, - "funding": { - "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" - } - }, - "plugins/plugin-chart-point-cluster-map/node_modules/pbf": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", - "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", - "license": "BSD-3-Clause", - "dependencies": { - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "plugins/plugin-chart-point-cluster-map/node_modules/react-map-gl": { @@ -53197,15 +50949,14 @@ "@apache-superset/core": "*", "@superset-ui/chart-controls": "*", "@superset-ui/core": "*", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "@types/react": "*", "match-sorter": "^8.2.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, "plugins/plugin-chart-table/node_modules/d3-array": { @@ -53244,7 +50995,7 @@ "@superset-ui/core": "*", "@types/lodash": "*", "@types/react": "*", - "react": "^17.0.2" + "react": "^18.2.0" } }, "plugins/plugin-chart-word-cloud/node_modules/@types/d3-scale": { @@ -53275,7 +51026,7 @@ "@deck.gl/extensions": "~9.2.9", "@deck.gl/geo-layers": "~9.2.5", "@deck.gl/layers": "~9.2.5", - "@deck.gl/mapbox": "~9.3.1", + "@deck.gl/mapbox": "~9.3.2", "@deck.gl/mesh-layers": "~9.2.5", "@luma.gl/constants": "~9.2.5", "@luma.gl/core": "~9.2.5", @@ -53313,8 +51064,8 @@ "@superset-ui/core": "*", "dayjs": "^1.11.19", "mapbox-gl": ">=1.0.0", - "react": "^17.0.2 || ^19.0.0", - "react-dom": "^17.0.2 || ^19.0.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "peerDependenciesMeta": { "mapbox-gl": { @@ -53322,81 +51073,20 @@ } } }, - "plugins/preset-chart-deckgl/node_modules/@deck.gl/aggregation-layers": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.2.11.tgz", - "integrity": "sha512-MRFbBHtMcDkOthxXnMPm6nF08DjFDACaIQsJSyHkdWtLUTSLHsWnOTn/8QbB4ka86WyNyfJy3dibLu/m3ei2ow==", - "license": "MIT", - "dependencies": { - "@luma.gl/constants": "~9.2.6", - "@luma.gl/shadertools": "~9.2.6", - "@math.gl/core": "^4.1.0", - "@math.gl/web-mercator": "^4.1.0", - "d3-hexbin": "^0.2.1" - }, - "peerDependencies": { - "@deck.gl/core": "~9.2.0", - "@deck.gl/layers": "~9.2.0", - "@luma.gl/core": "~9.2.6", - "@luma.gl/engine": "~9.2.6" - } - }, - "plugins/preset-chart-deckgl/node_modules/@deck.gl/extensions": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.2.11.tgz", - "integrity": "sha512-zlpM4Bg1ifBziW1Juiii9NY5gyW2rEhyVTWnhagH/bpTCZ2E73OhnToYt1ouqmoxL6lMtIjhRXz6LPb7tJbHHQ==", - "license": "MIT", - "dependencies": { - "@luma.gl/constants": "~9.2.6", - "@luma.gl/shadertools": "~9.2.6", - "@math.gl/core": "^4.1.0" - }, - "peerDependencies": { - "@deck.gl/core": "~9.2.0", - "@luma.gl/core": "~9.2.6", - "@luma.gl/engine": "~9.2.6" - } - }, "plugins/preset-chart-deckgl/node_modules/@deck.gl/mapbox": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.3.1.tgz", - "integrity": "sha512-4SgpWMeZiqiZEiz9yPdr89cVRL8HFcvXLxXUA0ExhMreUdNuK/j2OIQHPhw6vp1xCFbJEEqRelQ0pJYkhGDkYw==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.3.2.tgz", + "integrity": "sha512-+T9pJwsOXwjUxyGN6oiBMfIs28VtDIG1V1Rqz4qqn4TjjNEFFw+xO0olJIg8FO5IAqw2OtePdsrMj0tX8tHdGQ==", "license": "MIT", "dependencies": { "@math.gl/web-mercator": "^4.1.0" }, "peerDependencies": { "@deck.gl/core": "~9.3.0", - "@luma.gl/core": "~9.3.2", + "@luma.gl/core": "~9.3.3", "@math.gl/web-mercator": "^4.1.0" } }, - "plugins/preset-chart-deckgl/node_modules/@mapbox/point-geometry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", - "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", - "license": "ISC" - }, - "plugins/preset-chart-deckgl/node_modules/@mapbox/vector-tile": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", - "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/point-geometry": "~1.1.0", - "@types/geojson": "^7946.0.16", - "pbf": "^4.0.1" - } - }, - "plugins/preset-chart-deckgl/node_modules/@maplibre/geojson-vt": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.1.0.tgz", - "integrity": "sha512-2eIY4gZxeKIVOZVNkAMb+5NgXhgsMQpOveTQAvnp53LYqHGJZDidk7Ew0Tged9PThidpbS+NFTh0g4zivhPDzQ==", - "license": "ISC", - "dependencies": { - "kdbush": "^4.0.2" - } - }, "plugins/preset-chart-deckgl/node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -53409,58 +51099,6 @@ "node": ">=12" } }, - "plugins/preset-chart-deckgl/node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, - "plugins/preset-chart-deckgl/node_modules/maplibre-gl": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.24.0.tgz", - "integrity": "sha512-ALyFxgtd5R+65UqZ/++lOqwWcC0SNho9c27fYSyLmG7AfnAul2o46F05aDJGPbFU57wos9dgcIySHs0Xe6ia3A==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/point-geometry": "^1.1.0", - "@mapbox/tiny-sdf": "^2.1.0", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^2.0.4", - "@mapbox/whoots-js": "^3.1.0", - "@maplibre/geojson-vt": "^6.1.0", - "@maplibre/maplibre-gl-style-spec": "^24.8.1", - "@maplibre/mlt": "^1.1.8", - "@maplibre/vt-pbf": "^4.3.0", - "@types/geojson": "^7946.0.16", - "earcut": "^3.0.2", - "gl-matrix": "^3.4.4", - "kdbush": "^4.0.2", - "murmurhash-js": "^1.0.0", - "pbf": "^4.0.1", - "potpack": "^2.1.0", - "quickselect": "^3.0.0", - "tinyqueue": "^3.0.0" - }, - "engines": { - "node": ">=16.14.0", - "npm": ">=8.1.0" - }, - "funding": { - "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" - } - }, - "plugins/preset-chart-deckgl/node_modules/pbf": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", - "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", - "license": "BSD-3-Clause", - "dependencies": { - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, "tools/eslint-i18n-strings": { "version": "1.0.0", "extraneous": true, diff --git a/superset-frontend/package.json b/superset-frontend/package.json index c112beecfd4..a4655ded486 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -117,7 +117,14 @@ "@luma.gl/gltf": "~9.2.5", "@luma.gl/shadertools": "~9.2.5", "@luma.gl/webgl": "~9.2.5", + "@fontsource/fira-code": "^5.2.7", + "@fontsource/inter": "^5.2.8", + "@great-expectations/jsonforms-antd-renderers": "^2.2.10", + "@jsonforms/core": "^3.7.0", + "@jsonforms/react": "^3.7.0", + "@jsonforms/vanilla-renderers": "^3.7.0", "@reduxjs/toolkit": "^1.9.3", + "@rjsf/antd": "^5.24.13", "@rjsf/core": "^5.24.13", "@rjsf/utils": "^5.24.3", "@rjsf/validator-ajv8": "^5.24.13", @@ -157,7 +164,7 @@ "ag-grid-community": "35.2.1", "ag-grid-react": "35.2.1", "antd": "^5.26.0", - "chrono-node": "^2.9.0", + "chrono-node": "^2.9.1", "classnames": "^2.2.5", "content-disposition": "^1.1.0", "d3-color": "^3.1.0", @@ -170,37 +177,37 @@ "fs-extra": "^11.3.4", "fuse.js": "^7.3.0", "geolib": "^3.3.14", - "geostyler": "^18.5.0", + "geostyler": "^18.5.1", "geostyler-data": "^1.1.0", "geostyler-openlayers-parser": "^5.7.0", "geostyler-style": "11.0.2", "geostyler-wfs-parser": "^3.0.1", "google-auth-library": "^10.6.2", - "immer": "^11.1.4", + "immer": "^11.1.7", "interweave": "^13.1.1", "jquery": "^4.0.0", "js-levenshtein": "^1.1.6", "json-bigint": "^1.0.0", "json-stringify-pretty-compact": "^2.0.0", "lodash": "^4.18.1", - "mapbox-gl": "^3.23.0", - "markdown-to-jsx": "^9.7.16", + "mapbox-gl": "^3.23.1", + "markdown-to-jsx": "^9.8.0", "match-sorter": "^8.3.0", "memoize-one": "^5.2.1", "mousetrap": "^1.6.5", "mustache": "^4.2.0", - "nanoid": "^5.1.9", + "nanoid": "^5.1.11", "ol": "^10.9.0", "pretty-ms": "^9.3.0", "query-string": "9.3.1", "re-resizable": "^6.11.2", - "react": "^17.0.2", + "react": "^18.2.0", "react-arborist": "^3.5.0", "react-checkbox-tree": "^1.8.0", "react-diff-viewer-continued": "^4.2.2", "react-dnd": "^11.1.3", "react-dnd-html5-backend": "^11.1.3", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-google-recaptcha": "^3.1.0", "react-intersection-observer": "^10.0.3", "react-json-tree": "^0.20.0", @@ -211,7 +218,6 @@ "react-reverse-portal": "^2.3.0", "react-router-dom": "^5.3.4", "react-search-input": "^0.11.3", - "react-sortable-hoc": "^2.0.0", "react-split": "^2.0.9", "react-table": "^7.8.0", "react-transition-group": "^4.4.5", @@ -244,19 +250,18 @@ "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-runtime": "^7.29.0", - "@babel/preset-env": "^7.29.2", + "@babel/preset-env": "^7.29.5", "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", - "@babel/register": "^7.23.7", + "@babel/register": "^7.29.3", "@babel/runtime": "^7.29.2", "@babel/runtime-corejs3": "^7.29.2", "@babel/types": "^7.28.6", - "@cypress/react": "^8.0.2", "@emotion/babel-plugin": "^11.13.5", "@emotion/jest": "^11.14.2", "@istanbuljs/nyc-config-typescript": "^1.0.1", "@mihkeleidast/storybook-addon-source": "^1.0.1", - "@playwright/test": "^1.59.1", + "@playwright/test": "^1.60.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.6.2", "@storybook/addon-actions": "^8.6.18", "@storybook/addon-controls": "^8.6.18", @@ -270,13 +275,12 @@ "@storybook/test": "^8.6.18", "@storybook/test-runner": "^0.17.0", "@svgr/webpack": "^8.1.0", - "@swc/core": "^1.15.32", + "@swc/core": "^1.15.33", "@swc/plugin-emotion": "^14.9.0", "@swc/plugin-transform-imports": "^12.5.0", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.1", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^12.8.3", "@types/content-disposition": "^0.5.9", "@types/dom-to-image": "^2.6.7", @@ -286,8 +290,8 @@ "@types/json-bigint": "^1.0.4", "@types/mousetrap": "^1.6.15", "@types/node": "^25.6.0", - "@types/react": "^17.0.83", - "@types/react-dom": "^17.0.26", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@types/react-loadable": "^5.5.11", "@types/react-redux": "^7.1.10", "@types/react-resizable": "^3.0.8", @@ -299,14 +303,14 @@ "@types/rison": "0.1.0", "@types/tinycolor2": "^1.4.3", "@types/unzipper": "^0.10.11", - "@typescript-eslint/eslint-plugin": "^8.59.1", - "@typescript-eslint/parser": "^8.58.2", + "@typescript-eslint/eslint-plugin": "^8.59.3", + "@typescript-eslint/parser": "^8.59.3", "babel-jest": "^30.0.2", "babel-loader": "^10.1.1", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-jsx-remove-data-test-id": "^3.0.0", "babel-plugin-lodash": "^3.3.4", - "baseline-browser-mapping": "^2.10.21", + "baseline-browser-mapping": "^2.10.29", "cheerio": "1.2.0", "concurrently": "^9.2.1", "copy-webpack-plugin": "^14.0.0", @@ -326,7 +330,7 @@ "eslint-plugin-no-only-tests": "^3.4.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react-prefer-function-component": "^5.0.0", - "eslint-plugin-react-you-might-not-need-an-effect": "^0.9.3", + "eslint-plugin-react-you-might-not-need-an-effect": "^0.10.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^7.16.2", "eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors", @@ -341,12 +345,12 @@ "jest-html-reporter": "^4.4.0", "jest-websocket-mock": "^2.5.0", "js-yaml-loader": "^1.2.2", - "jsdom": "^29.1.0", + "jsdom": "^29.1.1", "lerna": "^9.0.4", "lightningcss": "^1.32.0", "mini-css-extract-plugin": "^2.10.2", "open-cli": "^9.0.0", - "oxlint": "^1.62.0", + "oxlint": "^1.63.0", "po2json": "^0.4.5", "prettier": "3.8.3", "prettier-plugin-packagejson": "^3.0.2", @@ -360,20 +364,20 @@ "storybook": "8.6.18", "style-loader": "^4.0.0", "swc-loader": "^0.2.7", - "terser-webpack-plugin": "^5.5.0", + "terser-webpack-plugin": "^5.6.0", "ts-jest": "^29.4.9", "tscw-config": "^1.1.2", "tsx": "^4.21.0", "typescript": "5.4.5", "unzipper": "^0.12.3", "vm-browserify": "^1.1.2", - "wait-on": "^9.0.5", + "wait-on": "^9.0.10", "webpack": "^5.106.2", "webpack-bundle-analyzer": "^5.3.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.3", "webpack-manifest-plugin": "^5.0.1", - "webpack-sources": "^3.4.0", + "webpack-sources": "^3.4.1", "webpack-visualizer-plugin2": "^2.0.0" }, "peerDependencies": { diff --git a/superset-frontend/packages/generator-superset/package.json b/superset-frontend/packages/generator-superset/package.json index af7211d3bb3..75f39dafe71 100644 --- a/superset-frontend/packages/generator-superset/package.json +++ b/superset-frontend/packages/generator-superset/package.json @@ -35,9 +35,9 @@ }, "devDependencies": { "cross-env": "^10.1.0", - "fs-extra": "^11.3.4", + "fs-extra": "^11.3.5", "jest": "^30.3.0", - "yeoman-test": "^11.3.1" + "yeoman-test": "^11.5.2" }, "engines": { "npm": ">= 4.0.0", diff --git a/superset-frontend/packages/superset-core/package.json b/superset-frontend/packages/superset-core/package.json index 30d587c1a2e..cf9d4a02665 100644 --- a/superset-frontend/packages/superset-core/package.json +++ b/superset-frontend/packages/superset-core/package.json @@ -1,6 +1,6 @@ { "name": "@apache-superset/core", - "version": "0.1.0-rc3", + "version": "0.1.0", "description": "This package contains UI elements, APIs, and utility functions used by Superset.", "sideEffects": false, "main": "lib/index.js", @@ -75,16 +75,15 @@ "devDependencies": { "@babel/cli": "^7.28.6", "@babel/core": "^7.29.0", - "@babel/preset-env": "^7.29.2", + "@babel/preset-env": "^7.29.5", "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", "typescript": "^5.0.0", "@emotion/styled": "^11.14.1", "@types/lodash": "^4.17.24", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "@types/react": "*", "@types/react-loadable": "*", @@ -98,8 +97,8 @@ "@fontsource/ibm-plex-mono": "^5.2.7", "@fontsource/inter": "^5.2.6", "nanoid": "^5.0.9", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-loadable": "^5.5.0", "tinycolor2": "*", "lodash": "^4.18.1", diff --git a/superset-frontend/packages/superset-core/src/testing.tsx b/superset-frontend/packages/superset-core/src/testing.tsx index e68186343c9..fba2f353967 100644 --- a/superset-frontend/packages/superset-core/src/testing.tsx +++ b/superset-frontend/packages/superset-core/src/testing.tsx @@ -18,7 +18,7 @@ */ import userEvent from '@testing-library/user-event'; import { ReactElement } from 'react'; -import { render, RenderOptions } from '@testing-library/react'; +import { render, RenderOptions, RenderResult } from '@testing-library/react'; import '@testing-library/jest-dom'; import { themeObject } from './theme'; @@ -33,7 +33,7 @@ const Providers = ({ children }: { children: React.ReactNode }) => ( const customRender = ( ui: ReactElement, options?: Omit, -) => render(ui, { wrapper: Providers, ...options }); +): RenderResult => render(ui, { wrapper: Providers, ...options }); export { createEvent, diff --git a/superset-frontend/packages/superset-core/src/theme/Theme.tsx b/superset-frontend/packages/superset-core/src/theme/Theme.tsx index 138a0ace9b6..d6ba80d1394 100644 --- a/superset-frontend/packages/superset-core/src/theme/Theme.tsx +++ b/superset-frontend/packages/superset-core/src/theme/Theme.tsx @@ -38,9 +38,17 @@ import { import { normalizeThemeConfig, serializeThemeConfig } from './utils'; export class Theme { - theme: SupersetTheme; + // Forward-compat: TS 6.0 enforces strictPropertyInitialization here; + // both fields are assigned via setConfig() during construction, so we + // use a definite-assignment assertion rather than hoisting the logic + // out of setConfig(). + // + // Assigned via setConfig() in the constructor; TypeScript 6.0's + // strictPropertyInitialization can't trace that call chain, so we use + // a definite-assignment assertion. + theme!: SupersetTheme; - private antdConfig: AntdThemeConfig; + private antdConfig!: AntdThemeConfig; private constructor({ config }: { config?: AnyThemeConfig }) { this.SupersetThemeProvider = this.SupersetThemeProvider.bind(this); diff --git a/superset-frontend/packages/superset-core/src/theme/utils/themeUtils.test.ts b/superset-frontend/packages/superset-core/src/theme/utils/themeUtils.test.ts index 33b2df7ef4a..e74f6cfe8af 100644 --- a/superset-frontend/packages/superset-core/src/theme/utils/themeUtils.test.ts +++ b/superset-frontend/packages/superset-core/src/theme/utils/themeUtils.test.ts @@ -17,7 +17,7 @@ * under the License. */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { ThemeProvider } from '@emotion/react'; import { theme as antdTheme } from 'antd'; import { diff --git a/superset-frontend/packages/superset-core/types/external.d.ts b/superset-frontend/packages/superset-core/types/external.d.ts index dcce5fa8823..da31a12abc8 100644 --- a/superset-frontend/packages/superset-core/types/external.d.ts +++ b/superset-frontend/packages/superset-core/types/external.d.ts @@ -20,3 +20,10 @@ * Stub for the untyped jed module. */ declare module 'jed'; + +/** + * CSS side-effect imports from @fontsource packages. These are bundler-only + * artifacts and carry no type information at runtime; declaring them here + * silences TS2882 under TypeScript 6.0's stricter module-resolution rules. + */ +declare module '@fontsource/*'; diff --git a/superset-frontend/packages/superset-ui-chart-controls/package.json b/superset-frontend/packages/superset-ui-chart-controls/package.json index 6fe28fc9dbb..69375691373 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/package.json +++ b/superset-frontend/packages/superset-ui-chart-controls/package.json @@ -33,17 +33,16 @@ "@ant-design/icons": "^5.6.1", "@emotion/react": "^11.4.1", "@superset-ui/core": "*", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "ace-builds": "^1.4.14", "brace": "^0.11.1", "memoize-one": "^5.1.1", - "react": "^17.0.2", + "react": "^18.2.0", "react-ace": "^10.1.0", - "react-dom": "^17.0.2" + "react-dom": "^18.2.0" }, "publishConfig": { "access": "public" diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.test.ts b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.test.ts index 2b007fda917..4efadc18f91 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.test.ts @@ -18,6 +18,7 @@ */ import { isMatrixifyVisible } from './matrixifyControls'; +import type { ControlStateMapping } from '../types'; /** * Helper to build a controls object matching the shape used by @@ -25,7 +26,7 @@ import { isMatrixifyVisible } from './matrixifyControls'; */ function makeControls( overrides: Record = {}, -): Record { +): ControlStateMapping { const defaults: Record = { matrixify_enable: false, matrixify_mode_rows: 'disabled', @@ -36,7 +37,7 @@ function makeControls( const merged = { ...defaults, ...overrides }; return Object.fromEntries( Object.entries(merged).map(([k, v]) => [k, { value: v }]), - ); + ) as ControlStateMapping; } // ── matrixify_enable guard ────────────────────────────────────────── diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.tsx index 3e1b331d167..1ec8a340297 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/matrixifyControls.tsx @@ -20,7 +20,7 @@ import { t } from '@apache-superset/core/translation'; import { validateNonEmpty } from '@superset-ui/core'; -import { SharedControlConfig } from '../types'; +import { ControlStateMapping, SharedControlConfig } from '../types'; import { dndAdhocMetricControl } from './dndControls'; import { defineSavedMetrics } from '../utils'; @@ -29,9 +29,12 @@ import { defineSavedMetrics } from '../utils'; * Controls for transforming charts into matrix/grid layouts */ -// Utility function to check if matrixify controls should be visible +// Utility function to check if matrixify controls should be visible. +// Controls both visibility callbacks and validator injection via mapStateToProps. +// The matrixify_enable guard prevents hidden validators from firing on +// pre-revamp charts with stale matrixify_mode defaults (fix for #38519). const isMatrixifyVisible = ( - controls: any, + controls: ControlStateMapping | undefined, axis: 'rows' | 'columns', mode?: 'metrics' | 'dimensions', selectionMode?: 'members' | 'topn' | 'all', diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/shared-controls/matrixifyControls.test.tsx b/superset-frontend/packages/superset-ui-chart-controls/test/shared-controls/matrixifyControls.test.tsx new file mode 100644 index 00000000000..f78e6162f47 --- /dev/null +++ b/superset-frontend/packages/superset-ui-chart-controls/test/shared-controls/matrixifyControls.test.tsx @@ -0,0 +1,238 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Tests for the matrixify_enable guard in isMatrixifyVisible() and + * validator injection via mapStateToProps on real matrixify control definitions. + * + * These are TDD tests for the fix to apache/superset#38519 regression: + * isMatrixifyVisible() must check matrixify_enable before evaluating mode, + * otherwise pre-revamp charts with stale matrixify_mode defaults trigger + * hidden validators that block save. + */ + +import { + matrixifyControls, + isMatrixifyVisible, +} from '../../src/shared-controls/matrixifyControls'; +import type { ControlPanelState, ControlStateMapping } from '../../src/types'; + +// Helper: build a minimal controls object for ControlPanelState +const buildControls = ( + overrides: Record = {}, +): ControlStateMapping => { + const controls: Record = {}; + Object.entries(overrides).forEach(([key, value]) => { + controls[key] = { value }; + }); + return controls as ControlStateMapping; +}; + +// Helper: build a minimal ControlPanelState for mapStateToProps. +// Only provides fields that isMatrixifyVisible and mapStateToProps actually read. +const buildState = ( + controlValues: Record = {}, + formData: Record = {}, +) => + ({ + controls: buildControls(controlValues), + datasource: { columns: [], type: 'table' }, + form_data: formData, + common: {}, + metadata: {}, + slice: { slice_id: 0 }, + }) as unknown as ControlPanelState; + +// ============================================================ +// Validator injection tests via real mapStateToProps (rows) +// ============================================================ + +// --- matrixify_dimension_rows --- + +test('matrixify_dimension_rows: validators empty when matrixify_enable is falsy', () => { + const control = matrixifyControls.matrixify_dimension_rows; + const state = buildState( + { + matrixify_enable: undefined, + matrixify_mode_rows: 'dimensions', + matrixify_dimension_selection_mode_rows: 'members', + }, + { matrixify_mode_rows: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators).toEqual([]); +}); + +test('matrixify_dimension_rows: validators present when matrixify_enable is true', () => { + const control = matrixifyControls.matrixify_dimension_rows; + const state = buildState( + { + matrixify_enable: true, + matrixify_mode_rows: 'dimensions', + matrixify_dimension_selection_mode_rows: 'members', + }, + { matrixify_mode_rows: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators.length).toBeGreaterThan(0); +}); + +// --- matrixify_topn_value_rows --- + +test('matrixify_topn_value_rows: validators empty when matrixify_enable is falsy', () => { + const control = matrixifyControls.matrixify_topn_value_rows; + const state = buildState( + { + matrixify_enable: undefined, + matrixify_mode_rows: 'dimensions', + matrixify_dimension_selection_mode_rows: 'topn', + }, + { matrixify_mode_rows: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators).toEqual([]); +}); + +test('matrixify_topn_value_rows: validators present when matrixify_enable is true', () => { + const control = matrixifyControls.matrixify_topn_value_rows; + const state = buildState( + { + matrixify_enable: true, + matrixify_mode_rows: 'dimensions', + matrixify_dimension_selection_mode_rows: 'topn', + }, + { matrixify_mode_rows: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators.length).toBeGreaterThan(0); +}); + +// --- matrixify_topn_metric_rows --- + +test('matrixify_topn_metric_rows: validators empty when matrixify_enable is falsy', () => { + const control = matrixifyControls.matrixify_topn_metric_rows; + const state = buildState( + { + matrixify_enable: undefined, + matrixify_mode_rows: 'dimensions', + matrixify_dimension_selection_mode_rows: 'topn', + }, + { matrixify_mode_rows: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators).toEqual([]); +}); + +test('matrixify_topn_metric_rows: validators present when matrixify_enable is true', () => { + const control = matrixifyControls.matrixify_topn_metric_rows; + const state = buildState( + { + matrixify_enable: true, + matrixify_mode_rows: 'dimensions', + matrixify_dimension_selection_mode_rows: 'topn', + }, + { matrixify_mode_rows: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators.length).toBeGreaterThan(0); +}); + +// ============================================================ +// Validator injection tests via real mapStateToProps (columns) +// ============================================================ + +test('matrixify_dimension_columns: validators empty when matrixify_enable is falsy', () => { + const control = matrixifyControls.matrixify_dimension_columns; + const state = buildState( + { + matrixify_enable: undefined, + matrixify_mode_columns: 'dimensions', + matrixify_dimension_selection_mode_columns: 'members', + }, + { matrixify_mode_columns: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators).toEqual([]); +}); + +test('matrixify_dimension_columns: validators present when matrixify_enable is true', () => { + const control = matrixifyControls.matrixify_dimension_columns; + const state = buildState( + { + matrixify_enable: true, + matrixify_mode_columns: 'dimensions', + matrixify_dimension_selection_mode_columns: 'members', + }, + { matrixify_mode_columns: 'dimensions' }, + ); + + const result = control.mapStateToProps!(state, {} as any); + expect(result.validators.length).toBeGreaterThan(0); +}); + +// ============================================================ +// Direct isMatrixifyVisible guard tests +// ============================================================ + +test.each([ + ['undefined', undefined], + ['null', null], + ['false', false], + ['0', 0], +])( + 'isMatrixifyVisible returns false when matrixify_enable is %s', + (_, value) => { + const controls = buildControls({ + matrixify_enable: value, + matrixify_mode_rows: 'dimensions', + }); + expect(isMatrixifyVisible(controls, 'rows')).toBe(false); + }, +); + +test('isMatrixifyVisible returns true when matrixify_enable is true and mode matches', () => { + const controls = buildControls({ + matrixify_enable: true, + matrixify_mode_rows: 'dimensions', + }); + expect(isMatrixifyVisible(controls, 'rows', 'dimensions')).toBe(true); +}); + +test('isMatrixifyVisible returns false when matrixify_enable is true but mode is disabled', () => { + const controls = buildControls({ + matrixify_enable: true, + matrixify_mode_rows: 'disabled', + }); + expect(isMatrixifyVisible(controls, 'rows')).toBe(false); +}); + +test('isMatrixifyVisible returns true when matrixify_enable is true and any non-disabled mode (no mode filter)', () => { + const controls = buildControls({ + matrixify_enable: true, + matrixify_mode_columns: 'metrics', + }); + expect(isMatrixifyVisible(controls, 'columns')).toBe(true); +}); diff --git a/superset-frontend/packages/superset-ui-core/package.json b/superset-frontend/packages/superset-ui-core/package.json index a3113239632..5c32eac565a 100644 --- a/superset-frontend/packages/superset-ui-core/package.json +++ b/superset-frontend/packages/superset-ui-core/package.json @@ -29,7 +29,7 @@ "@babel/runtime": "^7.29.2", "@types/json-bigint": "^1.0.4", "@visx/responsive": "^3.12.0", - "ace-builds": "^1.43.6", + "ace-builds": "^1.44.0", "ag-grid-community": "35.2.1", "ag-grid-react": "35.2.1", "brace": "^0.11.1", @@ -56,7 +56,7 @@ "react-js-cron": "^5.2.0", "react-markdown": "^8.0.7", "react-resize-detector": "^7.1.2", - "react-syntax-highlighter": "^16.1.0", + "react-syntax-highlighter": "^16.1.1", "react-ultimate-pagination": "^1.3.2", "regenerator-runtime": "^0.14.1", "rehype-raw": "^7.0.0", @@ -76,14 +76,13 @@ "@types/d3-time-format": "^4.0.3", "@types/jquery": "^4.0.0", "@types/lodash": "^4.17.24", - "@types/node": "^25.6.0", + "@types/node": "^25.7.0", "@types/prop-types": "^15.7.15", "@types/react-syntax-highlighter": "^15.5.13", "@types/react-table": "^7.7.20", "@types/rison": "0.1.0", "@types/seedrandom": "^3.0.8", "fetch-mock": "^12.6.0", - "jest-mock-console": "^2.0.0", "resize-observer-polyfill": "1.5.1", "timezone-mock": "^1.4.2" }, @@ -91,10 +90,9 @@ "@emotion/cache": "^11.4.0", "@emotion/react": "^11.4.1", "@emotion/styled": "^11.14.1", - "@testing-library/dom": "^8.20.1", + "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "*", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "*", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "*", "@types/react": "*", "@types/react-loadable": "*", @@ -102,8 +100,8 @@ "@types/tinycolor2": "*", "antd": "^5.26.0", "nanoid": "^5.0.9", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-loadable": "^5.5.0", "tinycolor2": "*" }, diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/ChartDataProvider.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/ChartDataProvider.tsx index 457bdd9fefb..541bf19b9e4 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/ChartDataProvider.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/ChartDataProvider.tsx @@ -17,8 +17,7 @@ * under the License. */ -/* eslint react/sort-comp: 'off' */ -import { PureComponent, ReactNode } from 'react'; +import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'; import { SupersetClientInterface, RequestConfig, @@ -67,103 +66,112 @@ export type ChartDataProviderState = { error?: ProvidedProps['error']; }; -class ChartDataProvider extends PureComponent< - ChartDataProviderProps, - ChartDataProviderState -> { - readonly chartClient: ChartClient; +function ChartDataProvider({ + children, + client, + formData, + sliceId, + loadDatasource, + onError, + onLoaded, + formDataRequestOptions, + datasourceRequestOptions, + queryRequestOptions, +}: ChartDataProviderProps): JSX.Element | null { + const [state, setState] = useState({ + status: 'uninitialized', + }); - constructor(props: ChartDataProviderProps) { - super(props); - this.state = { status: 'uninitialized' }; - this.chartClient = new ChartClient({ client: props.client }); - } + const chartClient = useMemo(() => new ChartClient({ client }), [client]); - componentDidMount() { - this.handleFetchData(); - } + const extractSliceIdAndFormData = useCallback( + (): SliceIdAndOrFormData => + formData ? { formData } : { sliceId: sliceId as number }, + [formData, sliceId], + ); - componentDidUpdate(prevProps: ChartDataProviderProps) { - const { formData, sliceId } = this.props; - if (formData !== prevProps.formData || sliceId !== prevProps.sliceId) { - this.handleFetchData(); + const handleReceiveData = useCallback( + (payload?: Payload) => { + if (onLoaded) onLoaded(payload); + setState({ payload, status: 'loaded' }); + }, + [onLoaded], + ); + + const handleError = useCallback( + (error: ProvidedProps['error']) => { + if (onError) onError(error); + setState({ error, status: 'error' }); + }, + [onError], + ); + + const handleFetchData = useCallback(() => { + setState({ status: 'loading' }); + try { + chartClient + .loadFormData(extractSliceIdAndFormData(), formDataRequestOptions) + .then(loadedFormData => + Promise.all([ + loadDatasource + ? chartClient.loadDatasource( + loadedFormData.datasource, + datasourceRequestOptions, + ) + : Promise.resolve(undefined), + chartClient.loadQueryData(loadedFormData, queryRequestOptions), + ]).then( + ([datasource, queriesData]) => + ({ + datasource, + formData: loadedFormData, + queriesData, + }) as Payload, + ), + ) + .then(handleReceiveData) + .catch(handleError); + } catch (error) { + handleError(error as Error); } - } + }, [ + chartClient, + extractSliceIdAndFormData, + formDataRequestOptions, + loadDatasource, + datasourceRequestOptions, + queryRequestOptions, + handleReceiveData, + handleError, + ]); - private extractSliceIdAndFormData() { - const { formData, sliceId } = this.props; - return formData ? { formData } : { sliceId: sliceId as number }; - } + // Fetch on mount and only refetch when formData or sliceId changes. + // This preserves the original class component's componentDidUpdate + // semantics (which compared only formData and sliceId). Other + // fetch-related inputs referenced by handleFetchData (callbacks and + // request option props) are intentionally excluded from the dependency + // array, so the exhaustive-deps rule is suppressed here. + useEffect(() => { + handleFetchData(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [formData, sliceId]); - private handleFetchData = () => { - const { - loadDatasource, - formDataRequestOptions, - datasourceRequestOptions, - queryRequestOptions, - } = this.props; + const { status, payload, error } = state; - this.setState({ status: 'loading' }, () => { - try { - this.chartClient - .loadFormData( - this.extractSliceIdAndFormData(), - formDataRequestOptions, - ) - .then(formData => - Promise.all([ - loadDatasource - ? this.chartClient.loadDatasource( - formData.datasource, - datasourceRequestOptions, - ) - : Promise.resolve(undefined), - this.chartClient.loadQueryData(formData, queryRequestOptions), - ]).then( - ([datasource, queriesData]) => - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - ({ - datasource, - formData, - queriesData, - }) as Payload, - ), - ) - .then(this.handleReceiveData) - .catch(this.handleError); - } catch (error) { - this.handleError(error as Error); - } - }); - }; - - private handleReceiveData = (payload?: Payload) => { - const { onLoaded } = this.props; - if (onLoaded) onLoaded(payload); - this.setState({ payload, status: 'loaded' }); - }; - - private handleError = (error: ProvidedProps['error']) => { - const { onError } = this.props; - if (onError) onError(error); - this.setState({ error, status: 'error' }); - }; - - render() { - const { children } = this.props; - const { status, payload, error } = this.state; - - switch (status) { - case 'loading': - return children({ loading: true }); - case 'loaded': - return children({ payload }); - case 'error': - return children({ error }); - case 'uninitialized': - default: - return null; - } + // Wrap the children result in a Fragment so the component's return type + // stays `JSX.Element | null` (which TypeScript requires for JSX components) + // while still letting consumers return any ReactNode (strings, fragments, + // arrays, null, etc.) from the render prop. + switch (status) { + case 'loading': + return <>{children({ loading: true })}; + case 'loaded': + return <>{children({ payload })}; + case 'error': + return <>{children({ error })}; + case 'uninitialized': + default: + return null; } } diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx index 553a98f568a..52a0ed6e1b7 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx @@ -21,8 +21,11 @@ import { ReactNode, RefObject, ComponentType, - PureComponent, Fragment, + memo, + useCallback, + useMemo, + useRef, } from 'react'; import { @@ -32,23 +35,19 @@ import { } from 'react-error-boundary'; import { ParentSize } from '@visx/responsive'; import { createSelector } from 'reselect'; -import { withTheme } from '@emotion/react'; +import { useTheme } from '@emotion/react'; import { parseLength, Dimension } from '../../dimension'; import getChartMetadataRegistry from '../registries/ChartMetadataRegistrySingleton'; -import SuperChartCore, { Props as SuperChartCoreProps } from './SuperChartCore'; +import SuperChartCore, { + Props as SuperChartCoreProps, + SuperChartCoreRef, +} from './SuperChartCore'; import DefaultFallbackComponent from './FallbackComponent'; import ChartProps, { ChartPropsConfig } from '../models/ChartProps'; import NoResultsComponent from './NoResultsComponent'; import { isMatrixifyEnabled } from '../types/matrixify'; import MatrixifyGridRenderer from './Matrixify/MatrixifyGridRenderer'; - -const defaultProps = { - FallbackComponent: DefaultFallbackComponent, - height: 400 as string | number, - width: '100%' as string | number, - enableNoResults: true, -}; - +import { supersetTheme, SupersetTheme } from '@apache-superset/core/theme'; export type FallbackPropsWithDimension = FallbackProps & Partial; export type WrapperProps = Dimension & { @@ -56,7 +55,9 @@ export type WrapperProps = Dimension & { }; export type Props = Omit & - Omit & { + Omit & { + /** Theme object (optional, falls back to ThemeProvider context) */ + theme?: SupersetTheme; /** * Set this to true to disable error boundary built-in in SuperChart * and let the error propagate to upper level @@ -102,215 +103,269 @@ export type Props = Omit & inContextMenu?: boolean; }; -type PropsWithDefault = Props & Readonly; - -class SuperChart extends PureComponent { +function SuperChart({ + id, + className, + chartType, + preTransformProps, + overrideTransformProps, + postTransformProps, + onRenderSuccess, + onRenderFailure, + disableErrorBoundary, + FallbackComponent = DefaultFallbackComponent, + onErrorBoundary, + Wrapper, + queriesData, + enableNoResults = true, + noResults, + theme: themeProp, + debounceTime, + height = 400, + width = '100%', + ...rest +}: Props): JSX.Element { /** - * SuperChart's core + * SuperChart's core ref */ - core?: SuperChartCore | null; + const coreRef = useRef(null); - private createChartProps = ChartProps.createSelector(); + // Use theme from prop if provided, otherwise from context. + // When no ThemeProvider is present, useTheme() returns an empty object, + // so we fall back to the default supersetTheme to avoid passing an invalid theme downstream. + const themeFromContext = useTheme() as Partial; + const theme = + themeProp ?? + (Object.keys(themeFromContext).length > 0 + ? (themeFromContext as SupersetTheme) + : supersetTheme); - private parseDimension = createSelector( - [ - ({ width }: { width: string | number; height: string | number }) => width, - ({ height }) => height, - ], - (width, height) => { - // Parse them in case they are % or 'auto' - const widthInfo = parseLength(width); - const heightInfo = parseLength(height); - const boxHeight = heightInfo.isDynamic - ? `${heightInfo.multiplier * 100}%` - : heightInfo.value; - const boxWidth = widthInfo.isDynamic - ? `${widthInfo.multiplier * 100}%` - : widthInfo.value; - const style = { - height: boxHeight, - width: boxWidth, - }; + const createChartProps = useMemo(() => ChartProps.createSelector(), []); - // bounding box will ensure that when one dimension is not dynamic - // e.g. height = 300 - // the auto size will be bound to that value instead of being 100% by default - // e.g. height: 300 instead of height: '100%' - const BoundingBox = - widthInfo.isDynamic && - heightInfo.isDynamic && - widthInfo.multiplier === 1 && - heightInfo.multiplier === 1 - ? Fragment - : ({ children }: { children: ReactNode }) => ( -
{children}
- ); + const parseDimension = useMemo( + () => + createSelector( + [ + ({ width: w }: { width: string | number; height: string | number }) => + w, + ({ + height: h, + }: { + width: string | number; + height: string | number; + }) => h, + ], + (w, h) => { + // Parse them in case they are % or 'auto' + const widthInfo = parseLength(w); + const heightInfo = parseLength(h); + const boxHeight = heightInfo.isDynamic + ? `${heightInfo.multiplier * 100}%` + : heightInfo.value; + const boxWidth = widthInfo.isDynamic + ? `${widthInfo.multiplier * 100}%` + : widthInfo.value; + const style = { + height: boxHeight, + width: boxWidth, + }; - return { BoundingBox, heightInfo, widthInfo }; - }, + // bounding box will ensure that when one dimension is not dynamic + // e.g. height = 300 + // the auto size will be bound to that value instead of being 100% by default + // e.g. height: 300 instead of height: '100%' + const BoundingBox = + widthInfo.isDynamic && + heightInfo.isDynamic && + widthInfo.multiplier === 1 && + heightInfo.multiplier === 1 + ? Fragment + : ({ children }: { children: ReactNode }) => ( +
{children}
+ ); + + return { BoundingBox, heightInfo, widthInfo }; + }, + ), + [], ); - static defaultProps = defaultProps; + const setRef = useCallback((core: SuperChartCoreRef | null) => { + coreRef.current = core; + }, []); - private setRef = (core: SuperChartCore | null) => { - this.core = core; - }; + const getQueryCount = useCallback( + () => getChartMetadataRegistry().get(chartType)?.queryObjectCount ?? 1, + [chartType], + ); - private getQueryCount = () => - getChartMetadataRegistry().get(this.props.chartType)?.queryObjectCount ?? 1; + const renderChart = useCallback( + (chartWidth: number, chartHeight: number) => { + const chartProps = createChartProps({ + ...rest, + queriesData, + height: chartHeight, + width: chartWidth, + theme, + }); - renderChart(width: number, height: number) { - const { + // Check if Matrixify is enabled - use rawFormData (snake_case) + const matrixifyEnabled = isMatrixifyEnabled(chartProps.rawFormData); + + if (matrixifyEnabled) { + // When matrixify is enabled, queriesData is expected to be empty + // since each cell fetches its own data via StatefulChart + const matrixifyChart = ( + + ); + + // Apply wrapper if provided + const wrappedChart = Wrapper ? ( + + {matrixifyChart} + + ) : ( + matrixifyChart + ); + + // Include error boundary unless disabled + return disableErrorBoundary === true ? ( + wrappedChart + ) : ( + ( + + )} + onError={onErrorBoundary} + > + {wrappedChart} + + ); + } + + // Check for no results only for non-matrixified charts + const noResultQueries = + enableNoResults && + (!queriesData || + queriesData + .slice(0, getQueryCount()) + .every( + ({ data }) => !data || (Array.isArray(data) && data.length === 0), + )); + + let chart: JSX.Element; + if (noResultQueries) { + chart = noResults ? ( + <>{noResults} + ) : ( + + ); + } else { + const chartWithoutWrapper = ( + + ); + chart = Wrapper ? ( + + {chartWithoutWrapper} + + ) : ( + chartWithoutWrapper + ); + } + // Include the error boundary by default unless it is specifically disabled. + return disableErrorBoundary === true ? ( + chart + ) : ( + ( + + )} + onError={onErrorBoundary} + > + {chart} + + ); + }, + [ + createChartProps, + rest, + queriesData, + theme, + Wrapper, + disableErrorBoundary, + FallbackComponent, + onErrorBoundary, + enableNoResults, + getQueryCount, + noResults, id, className, + setRef, chartType, preTransformProps, overrideTransformProps, postTransformProps, onRenderSuccess, onRenderFailure, - disableErrorBoundary, - FallbackComponent, - onErrorBoundary, - Wrapper, - queriesData, - enableNoResults, - noResults, - theme, - ...rest - } = this.props as PropsWithDefault; + ], + ); - const chartProps = this.createChartProps({ - ...rest, - queriesData, - height, - width, - theme, - }); + const { heightInfo, widthInfo, BoundingBox } = parseDimension({ + width, + height, + }); - // Check if Matrixify is enabled - use rawFormData (snake_case) - const matrixifyEnabled = isMatrixifyEnabled(chartProps.rawFormData); - - if (matrixifyEnabled) { - // When matrixify is enabled, queriesData is expected to be empty - // since each cell fetches its own data via StatefulChart - const matrixifyChart = ( - - ); - - // Apply wrapper if provided - const wrappedChart = Wrapper ? ( - - {matrixifyChart} - - ) : ( - matrixifyChart - ); - - // Include error boundary unless disabled - return disableErrorBoundary === true ? ( - wrappedChart - ) : ( - ( - - )} - onError={onErrorBoundary} - > - {wrappedChart} - - ); - } - - // Check for no results only for non-matrixified charts - const noResultQueries = - enableNoResults && - (!queriesData || - queriesData - .slice(0, this.getQueryCount()) - .every( - ({ data }) => !data || (Array.isArray(data) && data.length === 0), - )); - - let chart; - if (noResultQueries) { - chart = noResults || ( - - ); - } else { - const chartWithoutWrapper = ( - - ); - chart = Wrapper ? ( - - {chartWithoutWrapper} - - ) : ( - chartWithoutWrapper - ); - } - // Include the error boundary by default unless it is specifically disabled. - return disableErrorBoundary === true ? ( - chart - ) : ( - ( - - )} - onError={onErrorBoundary} - > - {chart} - + // If any of the dimension is dynamic, get parent's dimension + if (widthInfo.isDynamic || heightInfo.isDynamic) { + return ( + + + {({ width: parentWidth, height: parentHeight }) => + renderChart( + widthInfo.isDynamic ? Math.floor(parentWidth) : widthInfo.value, + heightInfo.isDynamic + ? Math.floor(parentHeight) + : heightInfo.value, + ) + } + + ); } - render() { - const { heightInfo, widthInfo, BoundingBox } = this.parseDimension( - this.props as PropsWithDefault, - ); - - // If any of the dimension is dynamic, get parent's dimension - if (widthInfo.isDynamic || heightInfo.isDynamic) { - const { debounceTime } = this.props; - - return ( - - - {({ width, height }) => - this.renderChart( - widthInfo.isDynamic ? Math.floor(width) : widthInfo.value, - heightInfo.isDynamic ? Math.floor(height) : heightInfo.value, - ) - } - - - ); - } - - return this.renderChart(widthInfo.value, heightInfo.value); - } + return renderChart(widthInfo.value, heightInfo.value); } -export default withTheme(SuperChart); +// Wrap in memo to preserve the shallow-prop-comparison behavior +// of the original PureComponent implementation. +export default memo(SuperChart); diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx index 844dbae7c6a..30ba894a37f 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChartCore.tsx @@ -17,8 +17,13 @@ * under the License. */ -/* eslint-disable react/jsx-sort-default-props */ -import { PureComponent } from 'react'; +import { + forwardRef, + useCallback, + useImperativeHandle, + useMemo, + useRef, +} from 'react'; import { t } from '@apache-superset/core/translation'; import { createSelector } from 'reselect'; import getChartComponentRegistry from '../registries/ChartComponentRegistrySingleton'; @@ -39,16 +44,6 @@ function IDENTITY(x: T) { const EMPTY = () => null; -const defaultProps = { - id: '', - className: '', - preTransformProps: IDENTITY, - overrideTransformProps: undefined, - postTransformProps: IDENTITY, - onRenderSuccess() {}, - onRenderFailure() {}, -}; - interface LoadingProps { error: { toString(): string }; } @@ -78,174 +73,231 @@ export type Props = { onRenderFailure?: HandlerFunction; }; -export default class SuperChartCore extends PureComponent { - /** - * The HTML element that wraps all chart content - */ - container?: HTMLElement | null; +export interface SuperChartCoreRef { + container: HTMLElement | null; +} - /** - * memoized function so it will not recompute and return previous value - * unless one of - * - preTransformProps - * - chartProps - * is changed. - */ - preSelector = createSelector( - [ - (input: { +const SuperChartCore = forwardRef( + function SuperChartCore( + { + id = '', + className = '', + chartProps = BLANK_CHART_PROPS, + chartType, + preTransformProps = IDENTITY, + overrideTransformProps, + postTransformProps = IDENTITY, + onRenderSuccess = () => {}, + onRenderFailure = () => {}, + }, + ref, + ) { + const containerRef = useRef(null); + + // Expose container via ref + useImperativeHandle( + ref, + () => ({ + get container() { + return containerRef.current; + }, + }), + [], + ); + + /** + * memoized function so it will not recompute and return previous value + * unless one of + * - preTransformProps + * - chartProps + * is changed. + */ + const preSelector = useMemo( + () => + createSelector( + [ + (input: { + chartProps: ChartProps; + preTransformProps?: PreTransformProps; + }) => input.chartProps, + input => input.preTransformProps, + ], + (inputChartProps, pre = IDENTITY) => pre(inputChartProps), + ), + [], + ); + + /** + * memoized function so it will not recompute and return previous value + * unless one of the input arguments have changed. + */ + const transformSelector = useMemo( + () => + createSelector( + [ + (input: { + chartProps: ChartProps; + transformProps?: TransformProps; + }) => input.chartProps, + input => input.transformProps, + ], + (preprocessedChartProps, transform = IDENTITY) => + transform(preprocessedChartProps), + ), + [], + ); + + /** + * memoized function so it will not recompute and return previous value + * unless one of the input arguments have changed. + */ + const postSelector = useMemo( + () => + createSelector( + [ + (input: { + chartProps: ChartProps; + postTransformProps?: PostTransformProps; + }) => input.chartProps, + input => input.postTransformProps, + ], + (transformedChartProps, post = IDENTITY) => + post(transformedChartProps), + ), + [], + ); + + /** + * Using each memoized function to retrieve the computed chartProps + */ + const processChartProps = useCallback( + ({ + chartProps: inputChartProps, + preTransformProps: pre, + transformProps, + postTransformProps: post, + }: { chartProps: ChartProps; preTransformProps?: PreTransformProps; - }) => input.chartProps, - input => input.preTransformProps, - ], - (chartProps, pre = IDENTITY) => pre(chartProps), - ); - - /** - * memoized function so it will not recompute and return previous value - * unless one of the input arguments have changed. - */ - transformSelector = createSelector( - [ - (input: { chartProps: ChartProps; transformProps?: TransformProps }) => - input.chartProps, - input => input.transformProps, - ], - (preprocessedChartProps, transform = IDENTITY) => - transform(preprocessedChartProps), - ); - - /** - * memoized function so it will not recompute and return previous value - * unless one of the input arguments have changed. - */ - postSelector = createSelector( - [ - (input: { - chartProps: ChartProps; + transformProps?: TransformProps; postTransformProps?: PostTransformProps; - }) => input.chartProps, - input => input.postTransformProps, - ], - (transformedChartProps, post = IDENTITY) => post(transformedChartProps), - ); - - /** - * Using each memoized function to retrieve the computed chartProps - */ - processChartProps = ({ - chartProps, - preTransformProps, - transformProps, - postTransformProps, - }: { - chartProps: ChartProps; - preTransformProps?: PreTransformProps; - transformProps?: TransformProps; - postTransformProps?: PostTransformProps; - }) => - this.postSelector({ - chartProps: this.transformSelector({ - chartProps: this.preSelector({ chartProps, preTransformProps }), - transformProps, - }), - postTransformProps, - }); - - /** - * memoized function so it will not recompute - * and return previous value - * unless one of - * - chartType - * - overrideTransformProps - * is changed. - */ - private createLoadableRenderer = createSelector( - [ - (input: { chartType: string; overrideTransformProps?: TransformProps }) => - input.chartType, - input => input.overrideTransformProps, - ], - (chartType, overrideTransformProps) => { - if (chartType) { - const Renderer = createLoadableRenderer({ - loader: { - Chart: () => getChartComponentRegistry().getAsPromise(chartType), - transformProps: overrideTransformProps - ? () => Promise.resolve(overrideTransformProps) - : () => getChartTransformPropsRegistry().getAsPromise(chartType), - }, - loading: (loadingProps: LoadingProps) => - this.renderLoading(loadingProps, chartType), - render: this.renderChart, - }); - - // Trigger preloading. - Renderer.preload(); - - return Renderer; - } - - return EMPTY; - }, - ); - - static defaultProps = defaultProps; - - private renderChart = (loaded: LoadedModules, props: RenderProps) => { - const { Chart, transformProps } = loaded; - const { chartProps, preTransformProps, postTransformProps } = props; - - return ( - + }) => + postSelector({ + chartProps: transformSelector({ + chartProps: preSelector({ + chartProps: inputChartProps, + preTransformProps: pre, + }), + transformProps, + }), + postTransformProps: post, + }), + [preSelector, transformSelector, postSelector], ); - }; - private renderLoading = (loadingProps: LoadingProps, chartType: string) => { - const { error } = loadingProps; + const renderLoading = useCallback( + (loadingProps: LoadingProps, loadingChartType: string) => { + const { error } = loadingProps; - if (error) { - return ( -
- {t('ERROR')}  - chartType="{chartType}" — - {error.toString()} -
- ); - } + if (error) { + return ( +
+ {t('ERROR')}  + chartType="{loadingChartType}" — + {error.toString()} +
+ ); + } - return null; - }; + return null; + }, + [], + ); - private setRef = (container: HTMLElement | null) => { - this.container = container; - }; + const renderChart = useCallback( + (loaded: LoadedModules, props: RenderProps) => { + const { Chart, transformProps } = loaded; + const { + chartProps: renderChartProps, + preTransformProps: pre, + postTransformProps: post, + } = props; - render() { - const { - id, - className, - preTransformProps, - postTransformProps, - chartProps = BLANK_CHART_PROPS, - onRenderSuccess, - onRenderFailure, - } = this.props; + return ( + + ); + }, + [processChartProps], + ); + + /** + * memoized function so it will not recompute + * and return previous value + * unless one of + * - chartType + * - overrideTransformProps + * is changed. + */ + const createLoadableRendererSelector = useMemo( + () => + createSelector( + [ + (input: { + chartType: string; + overrideTransformProps?: TransformProps; + }) => input.chartType, + input => input.overrideTransformProps, + ], + (selectorChartType, selectorOverrideTransformProps) => { + if (selectorChartType) { + const Renderer = createLoadableRenderer({ + loader: { + Chart: () => + getChartComponentRegistry().getAsPromise(selectorChartType), + transformProps: selectorOverrideTransformProps + ? () => Promise.resolve(selectorOverrideTransformProps) + : () => + getChartTransformPropsRegistry().getAsPromise( + selectorChartType, + ), + }, + loading: (loadingProps: LoadingProps) => + renderLoading(loadingProps, selectorChartType), + render: renderChart, + }); + + // Trigger preloading. + Renderer.preload(); + + return Renderer; + } + + return EMPTY; + }, + ), + [renderLoading, renderChart], + ); + + const setRef = useCallback((container: HTMLElement | null) => { + containerRef.current = container; + }, []); // Create LoadableRenderer and start preloading // the lazy-loaded Chart components - const Renderer = this.createLoadableRenderer(this.props); + const Renderer = createLoadableRendererSelector({ + chartType, + overrideTransformProps, + }); // Do not render if chartProps is set to null. - // but the pre-loading has been started in this.createLoadableRenderer + // but the pre-loading has been started in createLoadableRendererSelector // to prepare for rendering once chartProps becomes available. if (chartProps === null) { return null; @@ -263,7 +315,7 @@ export default class SuperChartCore extends PureComponent { } return ( -
+
{ />
); - } -} + }, +); + +export default SuperChartCore; diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/createLoadableRenderer.ts b/superset-frontend/packages/superset-ui-core/src/chart/components/createLoadableRenderer.ts index 535d0129748..c96349eb709 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/createLoadableRenderer.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/createLoadableRenderer.ts @@ -17,59 +17,109 @@ * under the License. */ -import Loadable from 'react-loadable'; -import { ComponentClass } from 'react'; +import { ReactElement, useEffect, useRef, useState } from 'react'; export type LoadableRendererProps = { - onRenderFailure?: Function; - onRenderSuccess?: Function; + onRenderFailure?: (error: Error) => void; + onRenderSuccess?: () => void; }; -const defaultProps = { - onRenderFailure() {}, - onRenderSuccess() {}, +type LoaderMap = { + [K in keyof Exports]: () => Promise | Exports[K]; }; -export interface LoadableRenderer - extends - ComponentClass, - Loadable.LoadableComponent {} - -export default function createLoadableRenderer< - Props, - Exports extends { [key: string]: any }, ->(options: Loadable.OptionsWithMap): LoadableRenderer { - const LoadableRenderer = Loadable.Map( - options, - ) as LoadableRenderer; - - // Extends the behavior of LoadableComponent to provide post-render listeners - class CustomLoadableRenderer extends LoadableRenderer { - static defaultProps: object; - - componentDidMount() { - this.afterRender(); - } - - componentDidUpdate() { - this.afterRender(); - } - - afterRender() { - const { loaded, loading, error } = this.state; - const { onRenderFailure, onRenderSuccess } = this.props; - if (!loading) { - if (error) { - (onRenderFailure as Function)(error); - } else if (loaded && Object.keys(loaded).length > 0) { - (onRenderSuccess as Function)(); - } - } - } - } - - CustomLoadableRenderer.defaultProps = defaultProps; - CustomLoadableRenderer.preload = LoadableRenderer.preload; - - return CustomLoadableRenderer; +export interface LoadingProps { + error?: { toString(): string }; +} + +export interface LoadableOptions { + loader: LoaderMap; + loading: (loadingProps: LoadingProps) => ReactElement | null; + render: (loaded: Exports, props: Props) => ReactElement; +} + +export interface LoadableRenderer { + (props: Props & LoadableRendererProps): ReactElement | null; + preload: () => Promise; + displayName?: string; +} + +export default function createLoadableRenderer( + options: LoadableOptions, +): LoadableRenderer { + let promise: Promise | null = null; + let cachedResult: Exports | null = null; + let cachedError: Error | null = null; + + const load = (): Promise => { + if (promise) return promise; + const keys = Object.keys(options.loader) as (keyof Exports)[]; + promise = Promise.all( + keys.map(key => Promise.resolve(options.loader[key]())), + ).then( + values => { + const loaded = {} as Exports; + keys.forEach((key, i) => { + loaded[key] = values[i] as Exports[typeof key]; + }); + cachedResult = loaded; + return loaded; + }, + err => { + cachedError = err instanceof Error ? err : new Error(String(err)); + throw cachedError; + }, + ); + return promise; + }; + + const Renderer: LoadableRenderer = props => { + const [state, setState] = useState<{ + loaded: Exports | null; + error: Error | null; + }>(() => ({ loaded: cachedResult, error: cachedError })); + + useEffect(() => { + if (state.loaded || state.error) return undefined; + let cancelled = false; + load().then( + loaded => { + if (!cancelled) setState({ loaded, error: null }); + }, + err => { + if (!cancelled) setState({ loaded: null, error: err }); + }, + ); + return () => { + cancelled = true; + }; + }, [state.loaded, state.error]); + + // Keep callback refs current without retriggering the post-load effect on + // every prop update. + const onRenderSuccessRef = useRef(props.onRenderSuccess); + const onRenderFailureRef = useRef(props.onRenderFailure); + onRenderSuccessRef.current = props.onRenderSuccess; + onRenderFailureRef.current = props.onRenderFailure; + + useEffect(() => { + if (state.error) { + onRenderFailureRef.current?.(state.error); + } else if (state.loaded && Object.keys(state.loaded).length > 0) { + onRenderSuccessRef.current?.(); + } + }, [state.loaded, state.error]); + + if (state.error) { + return options.loading({ error: state.error }); + } + if (!state.loaded) { + return options.loading({}); + } + return options.render(state.loaded, props as Props); + }; + + Renderer.preload = load; + + return Renderer; } diff --git a/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts b/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts index d5128f03986..b3f28f54d41 100644 --- a/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts +++ b/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorScale.ts @@ -94,11 +94,20 @@ class CategoricalColorScale extends ExtensibleFunction { /** * Increment the color range with analogous colors + * + * @param forceMinimumExpansion When true, expand at least once even if the + * ordinal domain is still shorter than the palette. Shared dashboard labels + * can resolve from the global map without entering the scale domain, so + * domain-based sizing alone would skip expansion while collision resolution + * still needs analogous colors. */ - incrementColorRange() { - const multiple = Math.floor( + incrementColorRange(forceMinimumExpansion = false) { + const domainBasedMultiple = Math.floor( this.domain().length / this.originColors.length, ); + const multiple = forceMinimumExpansion + ? Math.max(domainBasedMultiple, 1) + : domainBasedMultiple; // the domain has grown larger than the original range // increments the range with analogous colors if (multiple > this.multiple) { @@ -144,6 +153,7 @@ class CategoricalColorScale extends ExtensibleFunction { if (isFeatureEnabled(FeatureFlag.UseAnalogousColors)) { this.incrementColorRange(); } + if ( // feature flag to be deprecated (will become standard behaviour) isFeatureEnabled(FeatureFlag.AvoidColorsCollision) && @@ -154,6 +164,39 @@ class CategoricalColorScale extends ExtensibleFunction { } } + if ( + isFeatureEnabled(FeatureFlag.AvoidColorsCollision) && + source === LabelsColorMapSource.Dashboard && + (forcedColor || isExistingLabel) + ) { + const colliding = [...this.chartLabelsColorMap.entries()].filter( + ([labelKey, c]) => c === color && labelKey !== cleanedValue, + ); + if ( + colliding.length > 0 && + isFeatureEnabled(FeatureFlag.UseAnalogousColors) + ) { + this.incrementColorRange(true); + } + for (const [otherLabel] of colliding) { + if ( + Object.prototype.hasOwnProperty.call(this.forcedColors, otherLabel) + ) { + continue; + } + const newColor = this.getNextAvailableColor(otherLabel, color); + this.chartLabelsColorMap.set(otherLabel, newColor); + if (sliceId) { + this.labelsColorMapInstance.addSlice( + otherLabel, + newColor, + sliceId, + appliedColorScheme, + ); + } + } + } + // keep track of values in this slice this.chartLabelsColorMap.set(cleanedValue, color); diff --git a/superset-frontend/packages/superset-ui-core/src/components/ActionButton/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/ActionButton/index.tsx index ccc2cbd2b71..d0473812915 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/ActionButton/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/ActionButton/index.tsx @@ -17,19 +17,15 @@ * under the License. */ -import type { ReactElement } from 'react'; -import { - Tooltip, - type TooltipPlacement, - type IconType, -} from '@superset-ui/core/components'; +import type { ReactElement, ReactNode } from 'react'; +import { Tooltip, type TooltipPlacement } from '@superset-ui/core/components'; import { css, useTheme } from '@apache-superset/core/theme'; export interface ActionProps { label: string; tooltip?: string | ReactElement; placement?: TooltipPlacement; - icon: IconType; + icon: ReactNode; onClick: () => void; } diff --git a/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/useJsonValidation.test.ts b/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/useJsonValidation.test.ts index b36484c6b03..99712600fa4 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/useJsonValidation.test.ts +++ b/superset-frontend/packages/superset-ui-core/src/components/AsyncAceEditor/useJsonValidation.test.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useJsonValidation } from './useJsonValidation'; describe('useJsonValidation', () => { diff --git a/superset-frontend/packages/superset-ui-core/src/components/AsyncEsmComponent/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/AsyncEsmComponent/index.tsx index aeb8f8b7220..20e06b32028 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/AsyncEsmComponent/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/AsyncEsmComponent/index.tsx @@ -16,16 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { - useEffect, - useState, - RefObject, - forwardRef, - ComponentType, - ForwardRefExoticComponent, - PropsWithoutRef, - RefAttributes, -} from 'react'; +import React, { useEffect, useState, forwardRef, ComponentType } from 'react'; import { Loading } from '../Loading'; import type { PlaceholderProps } from './types'; @@ -93,15 +84,16 @@ export function AsyncEsmComponent< return promise; } - type AsyncComponent = ForwardRefExoticComponent< - PropsWithoutRef & RefAttributes> + type AsyncComponent = React.ForwardRefExoticComponent< + React.PropsWithoutRef & React.RefAttributes > & { preload?: typeof waitForPromise; }; + // @ts-expect-error -- generic forwardRef has PropsWithoutRef incompatibility with FullProps const AsyncComponent: AsyncComponent = forwardRef(function AsyncComponent( props: FullProps, - ref: RefObject>, + ref, ) { const [loaded, setLoaded] = useState(component !== undefined); useEffect(() => { diff --git a/superset-frontend/packages/superset-ui-core/src/components/Button/types.ts b/superset-frontend/packages/superset-ui-core/src/components/Button/types.ts index 92e29eaeed3..d53e90e64e0 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Button/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/components/Button/types.ts @@ -24,7 +24,6 @@ import type { ButtonVariantType, ButtonColorType, } from 'antd/es/button'; -import { IconType } from '@superset-ui/core/components/Icons/types'; import type { TooltipPlacement } from '../Tooltip/types'; export type { AntdButtonProps, ButtonType, ButtonVariantType, ButtonColorType }; @@ -49,5 +48,5 @@ export type ButtonProps = Omit & { buttonStyle?: ButtonStyle; cta?: boolean; showMarginRight?: boolean; - icon?: IconType; + icon?: ReactNode; }; diff --git a/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx b/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx index 8790a2a6f53..f70cbc094a6 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx @@ -73,7 +73,7 @@ export const Component = (props: DropdownContainerProps) => { const [overflowingState, setOverflowingState] = useState(); const containerRef = useRef(null); const onOverflowingStateChange = useCallback( - value => { + (value: OverflowingState) => { if (!isEqual(overflowingState, value)) { setItems(generateItems(value)); setOverflowingState(value); diff --git a/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/types.ts b/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/types.ts index a7150ffabf9..5cfe20ced72 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/types.ts @@ -17,7 +17,6 @@ * under the License. */ import type { CSSProperties, ReactElement, RefObject, ReactNode } from 'react'; -import { IconType } from '../Icons'; /** * Container item. @@ -70,7 +69,7 @@ export interface DropdownContainerProps { /** * Icon of the dropdown trigger. */ - dropdownTriggerIcon?: IconType; + dropdownTriggerIcon?: ReactNode; /** * Text of the dropdown trigger. */ diff --git a/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/DynamicEditableTitle.regression.test.tsx b/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/DynamicEditableTitle.regression.test.tsx new file mode 100644 index 00000000000..3cea4bdcfd4 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/DynamicEditableTitle.regression.test.tsx @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { fireEvent, render, screen, userEvent } from '@superset-ui/core/spec'; +import { useState } from 'react'; +import { DynamicEditableTitle } from '.'; + +const Harness = ({ initialTitle = 'Original' }: { initialTitle?: string }) => { + const [title, setTitle] = useState(initialTitle); + return ( + + ); +}; + +test('rapid typing then backspacing keeps every keystroke', async () => { + render(); + const input = screen.getByRole('textbox') as HTMLInputElement; + userEvent.click(input); + await userEvent.type(input, 'abc', { delay: 1 }); + expect(input.value).toBe('Originalabc'); + await userEvent.type(input, '{backspace}{backspace}{backspace}', { + delay: 1, + }); + expect(input.value).toBe('Original'); +}); + +test('a change event that arrives before isEditing flips is not dropped', () => { + // Reproduces the regression: the input is focused but `isEditing` is still + // false because no click has been registered yet (e.g. focus arrived via + // tab, autofocus, or programmatic focus). The pre-fix `handleChange` + // bailed out with `!isEditing`, dropping the keystroke. Because the + // input is controlled, antd's internal `useMergedState` then resyncs the + // DOM value back to the (stale) `props.value`, so the user sees their + // typed character disappear. This test fires a raw change event so it + // doesn't go through userEvent's implicit click. + const onSave = jest.fn(); + render( + , + ); + const input = screen.getByRole('textbox') as HTMLInputElement; + fireEvent.change(input, { target: { value: 'FooX' } }); + expect(input.value).toBe('FooX'); +}); + +test('prop changes mid-edit do not clobber unsaved typing', async () => { + const { rerender } = render(); + const input = screen.getByRole('textbox') as HTMLInputElement; + userEvent.click(input); + await userEvent.type(input, 'X', { delay: 1 }); + expect(input.value).toBe('FooX'); + rerender(); + expect(input.value).toBe('FooX'); +}); diff --git a/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/index.tsx index 0604b976de0..ec9cf88d85e 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/DynamicEditableTitle/index.tsx @@ -23,6 +23,7 @@ import { useCallback, useEffect, useLayoutEffect, + useRef, useState, } from 'react'; import { t } from '@apache-superset/core/translation'; @@ -30,6 +31,7 @@ import { css, SupersetTheme, useTheme } from '@apache-superset/core/theme'; import { useResizeDetector } from 'react-resize-detector'; import { Tooltip } from '../Tooltip'; import { Input } from '../Input'; +import type { InputRef } from '../Input'; import type { DynamicEditableTitleProps } from './types'; const titleStyles = (theme: SupersetTheme) => css` @@ -75,8 +77,10 @@ export const DynamicEditableTitle = memo( const [isEditing, setIsEditing] = useState(false); const [showTooltip, setShowTooltip] = useState(false); const [currentTitle, setCurrentTitle] = useState(title || ''); + const [inputWidth, setInputWidth] = useState(0); - const { width: inputWidth, ref: sizerRef } = useResizeDetector(); + const sizerRef = useRef(null); + const inputRef = useRef(null); const { width: containerWidth, ref: containerRef } = useResizeDetector({ refreshMode: 'debounce', }); @@ -85,27 +89,33 @@ export const DynamicEditableTitle = memo( setCurrentTitle(title); }, [title]); useEffect(() => { - if (isEditing && sizerRef?.current) { + if (isEditing) { // move cursor and scroll to the end - if (sizerRef.current.setSelectionRange) { - const { length } = sizerRef.current.value; - sizerRef.current.setSelectionRange(length, length); - sizerRef.current.scrollLeft = sizerRef.current.scrollWidth; + const inputElement = inputRef.current?.input; + if (inputElement) { + const { length } = inputElement.value; + inputElement.setSelectionRange(length, length); + inputElement.scrollLeft = inputElement.scrollWidth; } } }, [isEditing]); // a trick to make the input grow when user types text - // we make additional span component, place it somewhere out of view and copy input - // then we can measure the width of that span to resize the input element + // we make an additional span component, place it somewhere out of view and + // mirror the input value, then measure the span synchronously (pre-paint) + // to resize the input element. Reading offsetWidth in a useLayoutEffect + // forces a sync layout, so the input width updates in the same commit as + // the value change β€” preventing a flicker frame where the input is shown + // with new value but stale width. useLayoutEffect(() => { - if (sizerRef?.current) { + if (sizerRef.current) { sizerRef.current.textContent = currentTitle || placeholder; + setInputWidth(sizerRef.current.offsetWidth); } - }, [currentTitle, placeholder, sizerRef]); + }, [currentTitle, placeholder]); useEffect(() => { - const inputElement = sizerRef.current?.input; + const inputElement = inputRef.current?.input; if (inputElement) { if (inputElement.scrollWidth > inputElement.clientWidth) { @@ -137,9 +147,17 @@ export const DynamicEditableTitle = memo( const handleChange = useCallback( (ev: ChangeEvent) => { - if (!canEdit || !isEditing) { + if (!canEdit) { return; } + // Any change implies the user is editing. Ensure isEditing is true + // even if the change event arrives before the click handler has + // committed (e.g. focus via tab, autofocus, or batched click+type + // events). Otherwise the keystroke would be dropped and the + // controlled input would revert to the previous value. + if (!isEditing) { + setIsEditing(true); + } setCurrentTitle(ev.target.value); }, [canEdit, isEditing], @@ -168,6 +186,7 @@ export const DynamicEditableTitle = memo( } > void; /** Controls image size. Defaults to 'medium'. */ size?: EmptyStateSize; diff --git a/superset-frontend/packages/superset-ui-core/src/components/Form/Form.tsx b/superset-frontend/packages/superset-ui-core/src/components/Form/Form.tsx index 2c2be866fe0..a15a1ab6895 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Form/Form.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Form/Form.tsx @@ -20,7 +20,7 @@ import { Form as AntdForm } from 'antd'; import { FormProps } from './types'; function CustomForm(props: FormProps) { - return ; + return ; } export const Form = Object.assign(CustomForm, { diff --git a/superset-frontend/packages/superset-ui-core/src/components/Label/Label.test.tsx b/superset-frontend/packages/superset-ui-core/src/components/Label/Label.test.tsx index 216db7daa57..d57d1cffaaa 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Label/Label.test.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Label/Label.test.tsx @@ -41,7 +41,6 @@ test('renders with monospace prop', () => { // test stories from the storybook! test('renders all the storybook gallery variants', () => { - // @ts-expect-error: Suppress TypeScript error for LabelGallery usage const { container } = render(); const nonInteractiveLabelCount = 4; const renderedLabelCount = options.length * 2 + nonInteractiveLabelCount; diff --git a/superset-frontend/packages/superset-ui-core/src/components/Label/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/Label/index.tsx index 4d1de1fe125..5e974758af3 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Label/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Label/index.tsx @@ -38,7 +38,7 @@ export function Label(props: LabelProps) { } = props; const baseColor = getColorVariants(theme, type); - const color = baseColor.active; + const color = baseColor.text; const borderColor = baseColor.border; const backgroundColor = baseColor.bg; diff --git a/superset-frontend/packages/superset-ui-core/src/components/Label/reusable/DatasetTypeLabel.tsx b/superset-frontend/packages/superset-ui-core/src/components/Label/reusable/DatasetTypeLabel.tsx index cab54c35e8a..3eb02f57139 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Label/reusable/DatasetTypeLabel.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Label/reusable/DatasetTypeLabel.tsx @@ -23,7 +23,7 @@ import { Label } from '..'; // Define the prop types for DatasetTypeLabel interface DatasetTypeLabelProps { - datasetType: 'physical' | 'virtual'; // Accepts only 'physical' or 'virtual' + datasetType: 'physical' | 'virtual' | 'semantic_view'; } const SIZE = 's'; // Define the size as a constant @@ -32,6 +32,22 @@ export const DatasetTypeLabel: React.FC = ({ datasetType, }) => { const theme = useTheme(); + if (datasetType === 'semantic_view') { + return ( + + ); + } const isPhysical = datasetType === 'physical'; const label: string = isPhysical ? t('Physical') : t('Virtual'); const labelType = isPhysical ? 'primary' : 'default'; diff --git a/superset-frontend/packages/superset-ui-core/src/components/ListViewCard/types.ts b/superset-frontend/packages/superset-ui-core/src/components/ListViewCard/types.ts index db0c2f6faf0..175a74d6126 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/ListViewCard/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/components/ListViewCard/types.ts @@ -21,6 +21,7 @@ import type { BackgroundPosition } from './ImageLoader'; export interface LinkProps { to: string; + children?: ReactNode; } export interface ListViewCardProps { diff --git a/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx b/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx index 32e71f6b1aa..50b2f3cac00 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx @@ -194,7 +194,7 @@ const MetadataBar = ({ items, tooltipPlacement = 'top' }: MetadataBarProps) => { } const onResize = useCallback( - width => { + (width: number | undefined) => { // Calculates the breakpoint width to collapse the bar. // The last item does not have a space, so we subtract SPACE_BETWEEN_ITEMS from the total. const breakpoint = diff --git a/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx b/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx index a7fe66fd898..8fa56ae7458 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Modal/FormModal.tsx @@ -54,7 +54,7 @@ export function FormModal({ }, [onSave, resetForm]); const handleFormSubmit = useCallback( - async values => { + async (values: object) => { try { setIsSaving(true); await formSubmitHandler(values); diff --git a/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx b/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx index 196b666a7e5..5c3cca7122a 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx @@ -104,6 +104,9 @@ export const StyledModal = styled(BaseModal)` right: 0; display: flex; justify-content: center; + // Keep the close button clickable when modal body content uses + // position: sticky with elevated z-index (e.g. DatabaseModal header). + z-index: ${theme.zIndexPopupBase + 1}; } .ant-modal-close:hover { diff --git a/superset-frontend/packages/superset-ui-core/src/components/Modal/types.ts b/superset-frontend/packages/superset-ui-core/src/components/Modal/types.ts index 4966bc7ac1e..4159a8c949f 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Modal/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/components/Modal/types.ts @@ -17,7 +17,7 @@ * under the License. */ import type { CSSProperties, ReactNode } from 'react'; -import type { ModalFuncProps } from 'antd'; +import type { FormInstance, ModalFuncProps } from 'antd'; import type { ResizableProps } from 're-resizable'; import type { DraggableProps } from 'react-draggable'; import { ButtonStyle } from '../Button/types'; @@ -68,7 +68,8 @@ export interface StyledModalProps { export type { ModalFuncProps }; -export interface FormModalProps extends ModalProps { +export interface FormModalProps extends Omit { + children: ReactNode | ((form: FormInstance) => ReactNode); initialValues?: object; formSubmitHandler: (values: object) => Promise; onSave: () => void; diff --git a/superset-frontend/packages/superset-ui-core/src/components/PageHeaderWithActions/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/PageHeaderWithActions/index.tsx index e15f1813cd1..a8dd727064d 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/PageHeaderWithActions/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/PageHeaderWithActions/index.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { ReactNode, ReactElement } from 'react'; +import { ReactNode, ReactElement, memo } from 'react'; import { t } from '@apache-superset/core/translation'; import { css, SupersetTheme, useTheme } from '@apache-superset/core/theme'; import { Icons } from '@superset-ui/core/components/Icons'; @@ -118,62 +118,64 @@ export type PageHeaderWithActionsProps = { }; }; -export const PageHeaderWithActions = ({ - editableTitleProps, - showTitlePanelItems, - certificatiedBadgeProps, - showFaveStar, - faveStarProps, - titlePanelAdditionalItems, - rightPanelAdditionalItems, - additionalActionsMenu, - menuDropdownProps, - showMenuDropdown = true, - tooltipProps, -}: PageHeaderWithActionsProps) => { - const theme = useTheme(); - return ( -
-
- - {showTitlePanelItems && ( -
- {certificatiedBadgeProps?.certifiedBy && ( - - )} - {showFaveStar && } - {titlePanelAdditionalItems} -
- )} -
-
- {rightPanelAdditionalItems} -
- {showMenuDropdown && ( - additionalActionsMenu} - {...menuDropdownProps} - > - - - - +export const PageHeaderWithActions = memo( + ({ + editableTitleProps, + showTitlePanelItems, + certificatiedBadgeProps, + showFaveStar, + faveStarProps, + titlePanelAdditionalItems, + rightPanelAdditionalItems, + additionalActionsMenu, + menuDropdownProps, + showMenuDropdown = true, + tooltipProps, + }: PageHeaderWithActionsProps) => { + const theme = useTheme(); + return ( +
+
+ + {showTitlePanelItems && ( +
+ {certificatiedBadgeProps?.certifiedBy && ( + + )} + {showFaveStar && } + {titlePanelAdditionalItems} +
)}
+
+ {rightPanelAdditionalItems} +
+ {showMenuDropdown && ( + additionalActionsMenu} + {...menuDropdownProps} + > + + + + + )} +
+
-
- ); -}; + ); + }, +); diff --git a/superset-frontend/packages/superset-ui-core/src/components/Select/Select.test.tsx b/superset-frontend/packages/superset-ui-core/src/components/Select/Select.test.tsx index 2f8cb6860a2..2b558b072cb 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/Select/Select.test.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/Select/Select.test.tsx @@ -1160,7 +1160,7 @@ test('does not fire onChange if the same value is selected in single mode', asyn // Reference for the bug this tests: https://github.com/apache/superset/pull/33043#issuecomment-2809419640 test('typing and deleting the last character for a new option displays correctly', async () => { - jest.useFakeTimers(); + jest.useFakeTimers({ advanceTimers: true }); render( ({ @@ -565,7 +564,7 @@ const AdhocFilterEditPopoverSimpleTabContent: FC = props => { > = props => { >
void; closePopover?: () => void; requireSave?: boolean; + children?: ReactNode; } interface AdhocFilterPopoverTriggerState { diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts index 27dffc2daff..41372f267be 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocfilter.test.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { renderHook, cleanup } from '@testing-library/react-hooks'; +import { renderHook, cleanup } from '@testing-library/react'; import { TestDataset } from '@superset-ui/chart-controls'; import { useDatePickerInAdhocFilter } from './useDatePickerInAdhocFilter'; diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts index 6aab9287b66..d3f6899bfad 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useGetTimeRangeLabel.test.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { NO_TIME_RANGE, fetchTimeRange } from '@superset-ui/core'; import { Operators } from 'src/explore/constants'; import { useGetTimeRangeLabel } from './useGetTimeRangeLabel'; @@ -80,10 +80,12 @@ test('should get actualTimeRange and title', async () => { clause: Clauses.Where, }); - const { result } = await renderHook(() => useGetTimeRangeLabel(adhocFilter)); - expect(result.current).toEqual({ - actualTimeRange: 'MOCK TIME', - title: 'Last week', + const { result } = renderHook(() => useGetTimeRangeLabel(adhocFilter)); + await waitFor(() => { + expect(result.current).toEqual({ + actualTimeRange: 'MOCK TIME', + title: 'Last week', + }); }); }); @@ -98,9 +100,11 @@ test('should get actualTimeRange and title when gets an error', async () => { clause: Clauses.Where, }); - const { result } = await renderHook(() => useGetTimeRangeLabel(adhocFilter)); - expect(result.current).toEqual({ - actualTimeRange: 'temporal column (Last week)', - title: 'MOCK ERROR', + const { result } = renderHook(() => useGetTimeRangeLabel(adhocFilter)); + await waitFor(() => { + expect(result.current).toEqual({ + actualTimeRange: 'temporal column (Last week)', + title: 'MOCK ERROR', + }); }); }); diff --git a/superset-frontend/src/explore/components/controls/JSEditorControl.test.tsx b/superset-frontend/src/explore/components/controls/JSEditorControl.test.tsx index 5a083702b94..34d121f291e 100644 --- a/superset-frontend/src/explore/components/controls/JSEditorControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/JSEditorControl.test.tsx @@ -45,10 +45,6 @@ jest.mock('src/core/editors', () => ({ ), })); -jest.mock('src/hooks/useDebounceValue', () => ({ - useDebounceValue: (value: string) => value, -})); - const defaultProps = { name: 'echartOptions', label: 'EChart Options', diff --git a/superset-frontend/src/explore/components/controls/JSEditorControl.tsx b/superset-frontend/src/explore/components/controls/JSEditorControl.tsx index 7cf4c252ac5..d0130b1ad96 100644 --- a/superset-frontend/src/explore/components/controls/JSEditorControl.tsx +++ b/superset-frontend/src/explore/components/controls/JSEditorControl.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { useMemo } from 'react'; +import { useDeferredValue, useMemo } from 'react'; import AutoSizer from 'react-virtualized-auto-sizer'; import ControlHeader, { ControlHeaderProps, @@ -28,7 +28,6 @@ import { EChartOptionsParseError, } from '@superset-ui/plugin-chart-echarts'; import { EditorHost } from 'src/core/editors'; -import { useDebounceValue } from 'src/hooks/useDebounceValue'; const Container = styled.div` border: 1px solid ${({ theme }) => theme.colorBorder}; @@ -50,10 +49,10 @@ export default function JSEditorControl({ onChange, value, }: ControlHeaderProps & ControlComponentProps) { - const debouncedValue = useDebounceValue(value); + const deferredValue = useDeferredValue(value); const error = useMemo(() => { try { - safeParseEChartOptions(debouncedValue ?? ''); + safeParseEChartOptions(deferredValue ?? ''); return null; } catch (err) { if (err instanceof EChartOptionsParseError) { @@ -61,7 +60,7 @@ export default function JSEditorControl({ } throw err; } - }, [debouncedValue]); + }, [deferredValue]); const headerProps = { name, label: label ?? name, diff --git a/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx b/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx index 1a8c761e925..f59c00704c7 100644 --- a/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx +++ b/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx @@ -64,7 +64,6 @@ export const StyledCloseButton = styled(Button)` color: ${theme.colorPrimaryText}; font-size: ${theme.fontSizeSM}px; font-weight: ${theme.fontWeightStrong}; - text-transform: uppercase; min-width: ${theme.sizeUnit * 36}; min-height: ${theme.sizeUnit * 8}; box-shadow: none; @@ -113,7 +112,6 @@ export const StyledSaveButton = styled(Button)` color: ${theme.colorTextLightSolid}; font-size: ${theme.fontSizeSM}px; font-weight: ${theme.fontWeightStrong}; - text-transform: uppercase; min-width: ${theme.sizeUnit * 36}; min-height: ${theme.sizeUnit * 8}; box-shadow: none; diff --git a/superset-frontend/src/explore/components/controls/MapViewControl/MapViewControl.tsx b/superset-frontend/src/explore/components/controls/MapViewControl/MapViewControl.tsx index a3dda38a065..13c079bc70f 100644 --- a/superset-frontend/src/explore/components/controls/MapViewControl/MapViewControl.tsx +++ b/superset-frontend/src/explore/components/controls/MapViewControl/MapViewControl.tsx @@ -36,7 +36,6 @@ export const StyledExtentButton = styled(Button)` color: ${theme.colorPrimaryText}; font-size: ${theme.fontSizeSM}px; font-weight: ${theme.fontWeightStrong}; - text-transform: uppercase; min-width: ${theme.sizeUnit * 36}; min-height: ${theme.sizeUnit * 8}; box-shadow: none; diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx index a18346ffa0f..cf28e55e619 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/AdhocMetricEditPopover.test.tsx @@ -67,13 +67,19 @@ const createProps = () => ({ test('Should render', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByTestId('metrics-edit-popover')).toBeVisible(); }); test('Should render correct elements', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByRole('tablist')).toBeVisible(); expect(screen.getByRole('button', { name: 'Resize' })).toBeVisible(); expect(screen.getByRole('button', { name: 'Save' })).toBeVisible(); @@ -82,7 +88,10 @@ test('Should render correct elements', () => { test('Should render correct elements for SQL', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByRole('tab', { name: 'Custom SQL' })).toBeVisible(); expect(screen.getByRole('tab', { name: 'Simple' })).toBeVisible(); expect(screen.getByRole('tab', { name: 'Saved' })).toBeVisible(); @@ -94,7 +103,10 @@ test('Should render correct elements for allow ad-hoc metrics', () => { ...createProps(), datasource: { extra: '{"disallow_adhoc_metrics": false}' }, }; - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByRole('tab', { name: 'Custom SQL' })).toBeEnabled(); expect(screen.getByRole('tab', { name: 'Simple' })).toBeEnabled(); expect(screen.getByRole('tab', { name: 'Saved' })).toBeEnabled(); @@ -106,7 +118,10 @@ test('Should render correct elements for disallow ad-hoc metrics', () => { ...createProps(), datasource: { extra: '{"disallow_adhoc_metrics": true}' }, }; - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByRole('tab', { name: 'Custom SQL' })).toHaveAttribute( 'aria-disabled', 'true', @@ -121,7 +136,10 @@ test('Should render correct elements for disallow ad-hoc metrics', () => { test('Clicking on "Close" should call onClose', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(props.onClose).toHaveBeenCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'Close' })); expect(props.onClose).toHaveBeenCalledTimes(1); @@ -129,7 +147,10 @@ test('Clicking on "Close" should call onClose', () => { test('Clicking on "Save" should call onChange and onClose', async () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(props.onChange).toHaveBeenCalledTimes(0); expect(props.onClose).toHaveBeenCalledTimes(0); userEvent.click( @@ -145,7 +166,10 @@ test('Clicking on "Save" should call onChange and onClose', async () => { test('Clicking on "Save" should not call onChange and onClose', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(props.onChange).toHaveBeenCalledTimes(0); expect(props.onClose).toHaveBeenCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'Save' })); @@ -155,7 +179,10 @@ test('Clicking on "Save" should not call onChange and onClose', () => { test('Clicking on "Save" should call onChange and onClose for new metric', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(props.onChange).toHaveBeenCalledTimes(0); expect(props.onClose).toHaveBeenCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'Save' })); @@ -165,7 +192,10 @@ test('Clicking on "Save" should call onChange and onClose for new metric', () => test('Clicking on "Save" should call onChange and onClose for new title', () => { const props = createProps(); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(props.onChange).toHaveBeenCalledTimes(0); expect(props.onClose).toHaveBeenCalledTimes(0); userEvent.click(screen.getByRole('button', { name: 'Save' })); @@ -178,7 +208,10 @@ test('Should switch to tab:Simple', () => { props.getCurrentTab.mockImplementation(tab => { props.adhocMetric.expressionType = tab; }); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByRole('tabpanel', { name: 'Saved' })).toBeVisible(); expect( @@ -202,7 +235,10 @@ test('Should render "Simple" tab correctly', () => { props.getCurrentTab.mockImplementation(tab => { props.adhocMetric.expressionType = tab; }); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); const tab = screen.getByRole('tab', { name: 'Simple' }).parentElement!; userEvent.click(tab); @@ -216,7 +252,10 @@ test('Should switch to tab:Custom SQL', () => { props.getCurrentTab.mockImplementation(tab => { props.adhocMetric.expressionType = tab; }); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); expect(screen.getByRole('tabpanel', { name: 'Saved' })).toBeVisible(); expect( @@ -242,7 +281,10 @@ test('Should render "Custom SQL" tab correctly', async () => { props.getCurrentTab.mockImplementation(tab => { props.adhocMetric.expressionType = tab; }); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); const tab = screen.getByRole('tab', { name: 'Custom SQL' }).parentElement!; userEvent.click(tab); @@ -286,7 +328,10 @@ test('Should filter saved metrics by metric_name and verbose_name', async () => }, ], }; - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); const combobox = screen.getByRole('combobox', { name: 'Select saved metrics', @@ -362,7 +407,10 @@ test('Should filter columns by column_name and verbose_name in Simple tab', asyn props.getCurrentTab.mockImplementation(tab => { props.adhocMetric.expressionType = tab; }); - render(); + render(, { + useRedux: true, + initialState: { explore: {} }, + }); const tab = screen.getByRole('tab', { name: 'Simple' }).parentElement!; userEvent.click(tab); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx index 031248df0a0..22fdeaa93ee 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx @@ -18,6 +18,7 @@ */ /* eslint-disable camelcase */ import { PureComponent, createRef } from 'react'; +import { useSelector } from 'react-redux'; import { isDefined, ensureIsArray, DatasourceType } from '@superset-ui/core'; import { t } from '@apache-superset/core/translation'; import type { editors } from '@apache-superset/core'; @@ -94,6 +95,8 @@ interface AdhocMetricEditPopoverProps { datasource?: DatasourceInfo; isNewMetric?: boolean; isLabelModified?: boolean; + /** Names of metrics the user may select; null means no filtering. */ + compatibleMetrics?: string[] | null; } interface AdhocMetricEditPopoverState { @@ -123,7 +126,7 @@ const StyledSelect = styled(Select)` export const SAVED_TAB_KEY = 'SAVED'; -export default class AdhocMetricEditPopover extends PureComponent< +class AdhocMetricEditPopover extends PureComponent< AdhocMetricEditPopoverProps, AdhocMetricEditPopoverState > { @@ -438,15 +441,24 @@ export default class AdhocMetricEditPopover extends PureComponent< ensureIsArray(savedMetricsOptions).length > 0 ? ( ({ + options={[...ensureIsArray(savedMetricsOptions)] + .sort((a, b) => + (a.metric_name ?? '').localeCompare( + b.metric_name ?? '', + ), + ) + .map(savedMetric => ({ value: savedMetric.metric_name, label: this.renderMetricOption(savedMetric), key: savedMetric.id, metric_name: savedMetric.metric_name, verbose_name: savedMetric.verbose_name ?? '', - }), - )} + disabled: + this.props.compatibleMetrics != null && + !this.props.compatibleMetrics.includes( + savedMetric.metric_name, + ), + }))} optionFilterProps={['metric_name', 'verbose_name']} {...savedSelectProps} /> @@ -596,3 +608,20 @@ export default class AdhocMetricEditPopover extends PureComponent< } // @ts-expect-error - defaultProps for backward compatibility AdhocMetricEditPopover.defaultProps = defaultProps; + +// --------------------------------------------------------------------------- +// Thin functional wrapper that injects compatibility data from Redux. +// AdhocMetricEditPopover is a class component and cannot use hooks directly. +// --------------------------------------------------------------------------- +function AdhocMetricEditPopoverWithRedux(props: AdhocMetricEditPopoverProps) { + const compatibleMetrics = useSelector( + (state: any) => + state.explore?.compatibleMetrics as string[] | null | undefined, + ); + return ( + + ); +} + +export { AdhocMetricEditPopover }; +export default AdhocMetricEditPopoverWithRedux; diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx index 72a7c975b93..e947bee3953 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx @@ -61,7 +61,11 @@ function setup(overrides: Record = {}) { ...overrides, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any - return render(, { useDnd: true }); + return render(, { + useDnd: true, + useRedux: true, + initialState: { explore: {} }, + }); } test('renders an overlay trigger wrapper for the label', () => { diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.tsx index 234b5068c3c..78db85a6cb4 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.test.tsx @@ -62,7 +62,10 @@ function setup(overrides: Record = {}) { ...defaultProps, ...overrides, }; - const result = render(, { useDnd: true }); + const result = render(, { + useDnd: true, + useRedux: true, + }); return { onChange, ...result }; } @@ -107,7 +110,7 @@ test('accepts an edited metric from an AdhocMetricEditPopover', async () => { userEvent.click(metricLabel); await screen.findByText('aggregate'); - selectOption('AVG', 'Select aggregate options'); + await selectOption('AVG', 'Select aggregate options'); await screen.findByText('AVG(value)'); @@ -166,7 +169,7 @@ test('does not remove custom SQL metric if savedMetrics changes', async () => { ]} datasource={undefined} />, - { useDnd: true }, + { useDnd: true, useRedux: true }, ); expect(screen.getByText('old label')).toBeInTheDocument(); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx index a3cd9bad883..656d01bb310 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricsControl.tsx @@ -108,7 +108,7 @@ const getMetricsMatchingCurrentDataset = ( ); }); -interface MetricsControlProps { +export interface MetricsControlProps { name: string; onChange: (value: unknown) => void; multi?: boolean; diff --git a/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx b/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx index e35619772c2..a0cad6f63a6 100644 --- a/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/VizTypeControl/VizTypeControl.test.tsx @@ -45,7 +45,7 @@ import VizTypeControl, { VIZ_TYPE_CONTROL_TEST_ID } from './index'; // Mock scrollIntoView to avoid errors in test environment jest.mock('scroll-into-view-if-needed', () => jest.fn()); -jest.useFakeTimers(); +jest.useFakeTimers({ advanceTimers: true }); class MainPreset extends Preset { constructor() { diff --git a/superset-frontend/src/explore/components/controls/ZoomConfigControl/ZoomConfigControl.tsx b/superset-frontend/src/explore/components/controls/ZoomConfigControl/ZoomConfigControl.tsx index 86af5b8d7c8..d4ef41acaf2 100644 --- a/superset-frontend/src/explore/components/controls/ZoomConfigControl/ZoomConfigControl.tsx +++ b/superset-frontend/src/explore/components/controls/ZoomConfigControl/ZoomConfigControl.tsx @@ -66,7 +66,6 @@ export const ZoomConfigControl: FC = ({ }; const onBaseWidthChange = (width: number) => { - console.log('now in onbasewidthcahnge'); setBaseWidth(width); if (!value) { return; diff --git a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.tsx b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.tsx index f4dc6b57af8..6b9e7b048de 100644 --- a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.tsx +++ b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.tsx @@ -19,13 +19,13 @@ import React, { ReactElement, useCallback, + useDeferredValue, useMemo, useState, Dispatch, SetStateAction, } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { useDebounceValue } from 'src/hooks/useDebounceValue'; import { isFeatureEnabled, FeatureFlag, @@ -213,10 +213,7 @@ export const useExploreAdditionalActionsMenu = ( const dispatch = useDispatch(); const [isDropdownVisible, setIsDropdownVisible] = useState(false); const [dashboardSearchTerm, setDashboardSearchTerm] = useState(''); - const debouncedDashboardSearchTerm = useDebounceValue( - dashboardSearchTerm, - 300, - ); + const deferredDashboardSearchTerm = useDeferredValue(dashboardSearchTerm); const chart = useSelector(state => state.explore ? state.charts?.[getChartKey(state.explore)] : undefined, ); @@ -304,7 +301,7 @@ export const useExploreAdditionalActionsMenu = ( const dashboardMenuItems = useDashboardsMenuItems({ chartId: slice?.slice_id, dashboards, - searchTerm: debouncedDashboardSearchTerm, + searchTerm: deferredDashboardSearchTerm, }); const showDashboardSearch = (dashboards?.length ?? 0) > SEARCH_THRESHOLD; @@ -1054,7 +1051,7 @@ export const useExploreAdditionalActionsMenu = ( dashboards, dashboardMenuItems, dashboardSearchTerm, - debouncedDashboardSearchTerm, + deferredDashboardSearchTerm, datasource, dispatch, exportCSV, diff --git a/superset-frontend/src/explore/controls.tsx b/superset-frontend/src/explore/controls.tsx index 91e91de6867..74caebe52f1 100644 --- a/superset-frontend/src/explore/controls.tsx +++ b/superset-frontend/src/explore/controls.tsx @@ -64,6 +64,7 @@ import { validateNonEmpty, } from '@superset-ui/core'; import { t } from '@apache-superset/core/translation'; +import { datasetLabel } from 'src/features/semanticLayers/label'; import { formatSelectOptions } from 'src/explore/exploreUtils'; import { TIME_FILTER_LABELS } from './constants'; import { StyledColumnOption } from './components/optionRenderers'; @@ -214,7 +215,7 @@ export const controls = { datasource: { type: 'DatasourceControl', - label: t('Dataset'), + label: datasetLabel(), default: null, description: null, mapStateToProps: ({ datasource }: ControlState) => ({ diff --git a/superset-frontend/src/explore/exploreUtils/exportChart.test.ts b/superset-frontend/src/explore/exploreUtils/exportChart.test.ts index 74c905f347a..96428babe99 100644 --- a/superset-frontend/src/explore/exploreUtils/exportChart.test.ts +++ b/superset-frontend/src/explore/exploreUtils/exportChart.test.ts @@ -58,7 +58,9 @@ beforeEach(() => { }); }); -// Tests for exportChart URL prefix handling in streaming export +// Tests for exportChart URL prefix handling in streaming export. +// Streaming uses native fetch (not SupersetClient), so exportChart must apply +// ensureAppRoot before passing the URL to onStartStreamingExport. test('exportChart v1 API passes prefixed URL to onStartStreamingExport when app root is configured', async () => { const appRoot = '/superset'; ensureAppRoot.mockImplementation((path: string) => `${appRoot}${path}`); @@ -111,6 +113,24 @@ test('exportChart v1 API passes nested prefix for deeply nested deployments', as expect(callArgs.exportType).toBe('xlsx'); }); +// Regression test for the double-prefix bug: SupersetClient.postForm adds appRoot +// internally via getUrl(), so the URL passed must NOT already be prefixed. +test('exportChart v1 API calls postForm with unprefixed URL when app root is configured', async () => { + const { SupersetClient } = jest.requireMock('@superset-ui/core'); + const appRoot = '/analytics'; + ensureAppRoot.mockImplementation((path: string) => `${appRoot}${path}`); + + await exportChart({ + formData: baseFormData, + resultFormat: 'csv', + }); + + expect(SupersetClient.postForm).toHaveBeenCalledTimes(1); + const [url] = SupersetClient.postForm.mock.calls[0]; + expect(url).toBe('/api/v1/chart/data'); + expect(url).not.toContain(appRoot); +}); + test('exportChart passes csv exportType for CSV exports', async () => { const onStartStreamingExport = jest.fn(); @@ -143,7 +163,7 @@ test('exportChart passes xlsx exportType for Excel exports', async () => { ); }); -test('exportChart legacy API (useLegacyApi=true) passes prefixed URL with app root configured', async () => { +test('exportChart legacy API (useLegacyApi=true) passes prefixed URL to onStartStreamingExport when app root is configured', async () => { const appRoot = '/superset'; ensureAppRoot.mockImplementation((path: string) => `${appRoot}${path}`); @@ -165,6 +185,8 @@ test('exportChart legacy API (useLegacyApi=true) passes prefixed URL with app ro expect(onStartStreamingExport).toHaveBeenCalledTimes(1); const callArgs = onStartStreamingExport.mock.calls[0][0]; + // The legacy blueprint path is /superset/explore_json/; with appRoot=/superset the + // full streaming URL is /superset/superset/explore_json/ (appRoot + blueprint prefix). expect(callArgs.url).toBe('/superset/superset/explore_json/?csv=true'); expect(callArgs.exportType).toBe('csv'); }); diff --git a/superset-frontend/src/explore/exploreUtils/index.ts b/superset-frontend/src/explore/exploreUtils/index.ts index e0207f22dd7..23771a9ba97 100644 --- a/superset-frontend/src/explore/exploreUtils/index.ts +++ b/superset-frontend/src/explore/exploreUtils/index.ts @@ -76,6 +76,7 @@ interface GetExploreUrlParams { allowDomainSharding?: boolean; method?: 'GET' | 'POST'; relative?: boolean; + includeAppRoot?: boolean; } interface BuildV1ChartDataPayloadParams { @@ -223,6 +224,7 @@ export function getExploreUrl({ allowDomainSharding = false, method = 'POST', relative = false, + includeAppRoot = true, }: GetExploreUrlParams): string | null { if (!formData.datasource) { return null; @@ -242,7 +244,7 @@ export function getExploreUrl({ uri = URI(URI(curUrl).search()); } - const directory = getURIDirectory(endpointType); + const directory = getURIDirectory(endpointType, includeAppRoot); // Building the querystring (search) part of the URI const search = uri.search(true) as Record; @@ -370,10 +372,11 @@ export const exportChart = async ({ force, allowDomainSharding: false, relative: true, + includeAppRoot: false, }); payload = formData; } else { - url = ensureAppRoot('/api/v1/chart/data'); + url = '/api/v1/chart/data'; payload = await buildV1ChartDataPayload({ formData, force, @@ -385,14 +388,16 @@ export const exportChart = async ({ // Check if streaming export handler is provided (from dashboard Chart.jsx) if (onStartStreamingExport) { - // Streaming is handled by the caller - pass URL, payload, and export type + // Streaming uses native fetch β€” apply appRoot prefix here since useStreamingExport + // does not go through SupersetClient (which would add it automatically). onStartStreamingExport({ - url, + url: url ? ensureAppRoot(url) : url, payload, exportType: resultFormat, }); } else { - // Fallback to original behavior for non-streaming exports + // SupersetClient.postForm calls getUrl({ endpoint }) internally, which prepends + // appRoot β€” so the URL must NOT be pre-prefixed here. SupersetClient.postForm(url as string, { form_data: safeStringify(payload), }); diff --git a/superset-frontend/src/explore/reducers/exploreReducer.ts b/superset-frontend/src/explore/reducers/exploreReducer.ts index faffbfac5fa..c7eaf4d699d 100644 --- a/superset-frontend/src/explore/reducers/exploreReducer.ts +++ b/superset-frontend/src/explore/reducers/exploreReducer.ts @@ -70,6 +70,9 @@ export interface ExploreState { metadata?: { owners?: string[] | null; }; + compatibleMetrics?: string[] | null; + compatibleDimensions?: string[] | null; + compatibilityLoading?: boolean; saveAction?: SaveActionType | null; chartStates?: Record; } @@ -178,6 +181,13 @@ interface UpdateExploreChartStateAction { lastModified: number; } +interface SetCompatibilityAction { + type: typeof actions.SET_COMPATIBILITY; + compatibleMetrics: string[] | null; + compatibleDimensions: string[] | null; + compatibilityLoading: boolean; +} + type ExploreAction = | DynamicPluginControlsReadyAction | ToggleFaveStarAction @@ -197,6 +207,7 @@ type ExploreAction = | SliceUpdatedAction | SetForceQueryAction | UpdateExploreChartStateAction + | SetCompatibilityAction | HydrateExplore; // Extended control state for dynamic form controls - uses Record for flexibility @@ -635,6 +646,15 @@ export default function exploreReducer( force: typedAction.force, }; }, + [actions.SET_COMPATIBILITY]() { + const typedAction = action as SetCompatibilityAction; + return { + ...state, + compatibleMetrics: typedAction.compatibleMetrics, + compatibleDimensions: typedAction.compatibleDimensions, + compatibilityLoading: typedAction.compatibilityLoading, + }; + }, [actions.UPDATE_EXPLORE_CHART_STATE]() { const typedAction = action as UpdateExploreChartStateAction; return { diff --git a/superset-frontend/src/explore/store.test.tsx b/superset-frontend/src/explore/store.test.tsx index 602390a4d4f..d74b5bf0c18 100644 --- a/superset-frontend/src/explore/store.test.tsx +++ b/superset-frontend/src/explore/store.test.tsx @@ -17,55 +17,359 @@ * under the License. */ import { getChartControlPanelRegistry } from '@superset-ui/core'; -import { applyDefaultFormData } from 'src/explore/store'; +import { + applyDefaultFormData, + getControlsState, + handleDeprecatedControls, +} from 'src/explore/store'; -// eslint-disable-next-line no-restricted-globals -- TODO: Migrate from describe blocks -describe('store', () => { - beforeAll(() => { - getChartControlPanelRegistry().registerValue('test-chart', { - controlPanelSections: [ - { - label: 'Test section', - expanded: true, - controlSetRows: [['row_limit']], - }, - ], - }); - }); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).featureFlags = {}; - afterAll(() => { - getChartControlPanelRegistry().remove('test-chart'); - }); - - // eslint-disable-next-line no-restricted-globals -- TODO: Migrate from describe blocks - describe('applyDefaultFormData', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (window as any).featureFlags = {}; - - test('applies default to formData if the key is missing', () => { - const inputFormData = { - datasource: '11_table', - viz_type: 'test-chart', - }; - let outputFormData = applyDefaultFormData(inputFormData); - expect(outputFormData.row_limit).toEqual(10000); - - const inputWithRowLimit = { - ...inputFormData, - row_limit: 888, - }; - outputFormData = applyDefaultFormData(inputWithRowLimit); - expect(outputFormData.row_limit).toEqual(888); - }); - - test('keeps null if key is defined with null', () => { - const inputFormData = { - datasource: '11_table', - viz_type: 'test-chart', - row_limit: null, - }; - const outputFormData = applyDefaultFormData(inputFormData); - expect(outputFormData.row_limit).toBe(null); - }); +beforeAll(() => { + getChartControlPanelRegistry().registerValue('test-chart', { + controlPanelSections: [ + { + label: 'Test section', + expanded: true, + controlSetRows: [['row_limit']], + }, + ], }); }); + +afterAll(() => { + getChartControlPanelRegistry().remove('test-chart'); +}); + +// Helper: build ExploreState for getControlsState +const buildExploreState = (controlOverrides: Record = {}) => ({ + datasource: { type: 'table' }, + controls: Object.fromEntries( + Object.entries(controlOverrides).map(([k, v]) => [k, { value: v }]), + ), +}); + +// ============================================================ +// Existing applyDefaultFormData tests +// ============================================================ + +test('applyDefaultFormData applies default to formData if the key is missing', () => { + const inputFormData = { + datasource: '11_table', + viz_type: 'test-chart', + }; + let outputFormData = applyDefaultFormData(inputFormData); + expect(outputFormData.row_limit).toEqual(10000); + + const inputWithRowLimit = { + ...inputFormData, + row_limit: 888, + }; + outputFormData = applyDefaultFormData(inputWithRowLimit); + expect(outputFormData.row_limit).toEqual(888); +}); + +test('applyDefaultFormData keeps null if key is defined with null', () => { + const inputFormData = { + datasource: '11_table', + viz_type: 'test-chart', + row_limit: null, + }; + const outputFormData = applyDefaultFormData(inputFormData); + expect(outputFormData.row_limit).toBe(null); +}); + +// ============================================================ +// Migration tests: handleDeprecatedControls normalizes stale matrixify modes +// (fix for apache/superset#38519 regression β€” guards validators AND +// downstream UI consumers that infer matrixify state from mode values) +// ============================================================ + +test('getControlsState resets stale matrixify_mode_rows to disabled when matrixify_enable key absent', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_mode_rows: 'dimensions', // stale pre-revamp default + }; + + const result = getControlsState(state as any, formData as any); + const modeControl = result.matrixify_mode_rows as any; + expect(modeControl?.value).toBe('disabled'); +}); + +test('getControlsState resets stale matrixify_mode_columns to disabled when matrixify_enable key absent', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_mode_columns: 'metrics', // stale pre-revamp default + }; + + const result = getControlsState(state as any, formData as any); + const modeControl = result.matrixify_mode_columns as any; + expect(modeControl?.value).toBe('disabled'); +}); + +test('getControlsState preserves matrixify mode values when matrixify_enable is true', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable: true, + matrixify_mode_rows: 'dimensions', + }; + + const result = getControlsState(state as any, formData as any); + const modeControl = result.matrixify_mode_rows as any; + expect(modeControl?.value).toBe('dimensions'); +}); + +test('getControlsState preserves matrixify mode values when matrixify_enable is explicitly false', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable: false, + matrixify_mode_rows: 'dimensions', + }; + + const result = getControlsState(state as any, formData as any); + const modeControl = result.matrixify_mode_rows as any; + // matrixify_enable key IS present (just false) β€” migration does NOT fire + expect(modeControl?.value).toBe('dimensions'); +}); + +test('getControlsState is idempotent when matrixify modes already disabled', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_mode_rows: 'disabled', + matrixify_mode_columns: 'disabled', + }; + + const result = getControlsState(state as any, formData as any); + expect((result.matrixify_mode_rows as any)?.value).toBe('disabled'); + expect((result.matrixify_mode_columns as any)?.value).toBe('disabled'); +}); + +test('getControlsState handles form_data with no matrixify keys', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + }; + + const result = getControlsState(state as any, formData as any); + // Controls should get their defaults β€” matrixify_mode defaults to 'disabled' + expect((result.matrixify_mode_rows as any)?.value).toBe('disabled'); + expect((result.matrixify_mode_columns as any)?.value).toBe('disabled'); +}); + +test('getControlsState round-trip: pre-revamp form_data produces no matrixify validation errors', () => { + // Simulate a chart saved before #38519 with stale matrixify defaults + // Empty controls: on real first-load hydration, no pre-existing controls exist + const state = buildExploreState(); + const preRevampFormData = { + datasource: '1__table', + viz_type: 'test-chart', + // Stale old defaults β€” no matrixify_enable key (legacy chart) + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const result = getControlsState(state as any, preRevampFormData as any); + + // Every matrixify control should have zero validation errors + const matrixifyControlEntries = Object.entries(result).filter(([name]) => + name.startsWith('matrixify_'), + ); + const controlsWithErrors = matrixifyControlEntries.filter( + ([, control]) => (control as any)?.validationErrors?.length > 0, + ); + + expect(controlsWithErrors).toEqual([]); +}); + +// ============================================================ +// Dashboard hydration: applyDefaultFormData with stale form_data +// ============================================================ + +test('applyDefaultFormData normalizes stale matrixify modes for legacy charts', () => { + // Dashboard hydration now runs handleDeprecatedControls too, so stale + // matrixify modes from pre-revamp charts are normalized to 'disabled'. + // This protects downstream consumers (ChartContextMenu, DrillBySubmenu, + // ChartRenderer) that infer "matrixify is active" from mode values alone. + const preRevampFormData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + // No matrixify_enable key β€” legacy chart that never used matrixify + }; + + const outputFormData = applyDefaultFormData(preRevampFormData as any); + + // Stale values are now normalized to 'disabled' + expect(outputFormData.matrixify_mode_rows).toBe('disabled'); + expect(outputFormData.matrixify_mode_columns).toBe('disabled'); + expect(outputFormData.matrixify_enable).toBe(false); +}); + +// ============================================================ +// P1: Pre-revamp charts that actually used matrixify via old per-axis flags +// (matrixify_enable_vertical_layout / matrixify_enable_horizontal_layout) +// ============================================================ + +test('getControlsState preserves modes and sets matrixify_enable when old vertical flag is true', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable_vertical_layout: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const result = getControlsState(state as any, formData as any); + // Vertical layout was enabled β€” rows mode preserved, matrixify_enable migrated + expect((result.matrixify_mode_rows as any)?.value).toBe('dimensions'); + expect((result.matrixify_enable as any)?.value).toBe(true); + // Horizontal layout was NOT enabled β€” columns mode reset + expect((result.matrixify_mode_columns as any)?.value).toBe('disabled'); +}); + +test('getControlsState preserves modes and sets matrixify_enable when old horizontal flag is true', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable_horizontal_layout: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const result = getControlsState(state as any, formData as any); + // Horizontal layout was enabled β€” columns mode preserved, matrixify_enable migrated + expect((result.matrixify_mode_columns as any)?.value).toBe('metrics'); + expect((result.matrixify_enable as any)?.value).toBe(true); + // Vertical layout was NOT enabled β€” rows mode reset + expect((result.matrixify_mode_rows as any)?.value).toBe('disabled'); +}); + +test('getControlsState preserves both modes when both old per-axis flags are true', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable_vertical_layout: true, + matrixify_enable_horizontal_layout: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const result = getControlsState(state as any, formData as any); + expect((result.matrixify_mode_rows as any)?.value).toBe('dimensions'); + expect((result.matrixify_mode_columns as any)?.value).toBe('metrics'); + expect((result.matrixify_enable as any)?.value).toBe(true); +}); + +test('getControlsState resets modes when old per-axis flags are explicitly false', () => { + const state = buildExploreState(); + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable_vertical_layout: false, + matrixify_enable_horizontal_layout: false, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const result = getControlsState(state as any, formData as any); + // Old flags present but false β€” chart never used matrixify, reset stale modes + expect((result.matrixify_mode_rows as any)?.value).toBe('disabled'); + expect((result.matrixify_mode_columns as any)?.value).toBe('disabled'); +}); + +// ============================================================ +// P2: Dashboard hydration (applyDefaultFormData) with old per-axis flags +// ============================================================ + +test('applyDefaultFormData preserves modes when old vertical flag is true', () => { + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable_vertical_layout: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const outputFormData = applyDefaultFormData(formData as any); + expect(outputFormData.matrixify_mode_rows).toBe('dimensions'); + expect(outputFormData.matrixify_enable).toBe(true); + // Horizontal not enabled β€” columns reset + expect(outputFormData.matrixify_mode_columns).toBe('disabled'); +}); + +test('applyDefaultFormData preserves modes when both old flags are true', () => { + const formData = { + datasource: '1__table', + viz_type: 'test-chart', + matrixify_enable_vertical_layout: true, + matrixify_enable_horizontal_layout: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + + const outputFormData = applyDefaultFormData(formData as any); + expect(outputFormData.matrixify_mode_rows).toBe('dimensions'); + expect(outputFormData.matrixify_mode_columns).toBe('metrics'); + expect(outputFormData.matrixify_enable).toBe(true); +}); + +// ============================================================ +// Direct handleDeprecatedControls tests: verify form_data mutation +// so callers (hydrateExplore) can propagate migrated fields into state +// ============================================================ + +test('handleDeprecatedControls sets matrixify_enable on form_data when old vertical flag is true', () => { + const formData: any = { + matrixify_enable_vertical_layout: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + handleDeprecatedControls(formData); + + expect(formData.matrixify_enable).toBe(true); + expect(formData.matrixify_mode_rows).toBe('dimensions'); + // Horizontal not enabled β€” columns reset + expect(formData.matrixify_mode_columns).toBe('disabled'); +}); + +test('handleDeprecatedControls resets modes when no matrixify_enable and no old flags', () => { + const formData: any = { + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + handleDeprecatedControls(formData); + + expect(formData.matrixify_enable).toBeUndefined(); + expect(formData.matrixify_mode_rows).toBe('disabled'); + expect(formData.matrixify_mode_columns).toBe('disabled'); +}); + +test('handleDeprecatedControls is idempotent β€” no-op when matrixify_enable already present', () => { + const formData: any = { + matrixify_enable: true, + matrixify_mode_rows: 'dimensions', + matrixify_mode_columns: 'metrics', + }; + handleDeprecatedControls(formData); + + // No mutation β€” matrixify_enable key is present + expect(formData.matrixify_enable).toBe(true); + expect(formData.matrixify_mode_rows).toBe('dimensions'); + expect(formData.matrixify_mode_columns).toBe('metrics'); +}); diff --git a/superset-frontend/src/explore/store.ts b/superset-frontend/src/explore/store.ts index b1189efff44..79b5826df03 100644 --- a/superset-frontend/src/explore/store.ts +++ b/superset-frontend/src/explore/store.ts @@ -41,9 +41,16 @@ type FormData = QueryFormData & { y_axis_zero?: boolean; y_axis_bounds?: [number | null, number | null]; datasource?: string; + matrixify_enable?: boolean; + matrixify_mode_rows?: string; + matrixify_mode_columns?: string; + // Pre-revamp per-axis enable flags (removed in #38519, may still exist in + // persisted form_data for charts that actually used matrixify) + matrixify_enable_vertical_layout?: boolean; + matrixify_enable_horizontal_layout?: boolean; }; -function handleDeprecatedControls(formData: FormData): void { +export function handleDeprecatedControls(formData: FormData): void { // Reaffectation / handling of deprecated controls /* eslint-disable no-param-reassign */ @@ -51,6 +58,37 @@ function handleDeprecatedControls(formData: FormData): void { if (formData.y_axis_zero) { formData.y_axis_bounds = [0, null]; } + + // #38519: migrate pre-revamp matrixify controls to the new single-toggle + // system. Before the revamp, per-axis enable flags + // (matrixify_enable_vertical_layout / matrixify_enable_horizontal_layout) + // gated visibility, and matrixify_mode_rows/columns defaulted to + // non-disabled values ('dimensions'/'metrics'). The revamp replaced those + // with a single matrixify_enable toggle and mode default 'disabled'. + // + // Charts that actually used matrixify pre-revamp have the old per-axis + // flags set to true β€” we must preserve their modes and set + // matrixify_enable: true. Charts that never used matrixify (or predate it) + // need stale mode defaults reset to 'disabled' because 4 downstream UI + // consumers (ExploreChartPanel, ChartContextMenu, DrillBySubmenu, + // ChartRenderer) infer "matrixify is active" from mode values alone. + if (!('matrixify_enable' in formData)) { + const hadVerticalLayout = + formData.matrixify_enable_vertical_layout === true; + const hadHorizontalLayout = + formData.matrixify_enable_horizontal_layout === true; + + if (hadVerticalLayout || hadHorizontalLayout) { + // Pre-revamp chart that genuinely used matrixify β€” migrate to new flag + formData.matrixify_enable = true; + if (!hadVerticalLayout) formData.matrixify_mode_rows = 'disabled'; + if (!hadHorizontalLayout) formData.matrixify_mode_columns = 'disabled'; + } else { + // Never used matrixify β€” reset stale defaults + formData.matrixify_mode_rows = 'disabled'; + formData.matrixify_mode_columns = 'disabled'; + } + } } export function getControlsState( @@ -89,25 +127,31 @@ export function getControlsState( export function applyDefaultFormData( inputFormData: FormData, ): Record { - const datasourceType = inputFormData.datasource?.split('__')[1] ?? ''; - const vizType = inputFormData.viz_type; + // Normalize deprecated controls before building control state β€” ensures + // stale matrixify modes are cleaned on the dashboard hydration path too, + // not just the explore path (getControlsState). + const cleanedFormData = { ...inputFormData }; + handleDeprecatedControls(cleanedFormData); + + const datasourceType = cleanedFormData.datasource?.split('__')[1] ?? ''; + const vizType = cleanedFormData.viz_type; const controlsState = getAllControlsState( vizType, datasourceType as DatasourceType, null, - inputFormData, + cleanedFormData, ); // eslint-disable-next-line @typescript-eslint/no-explicit-any const controlFormData = getFormDataFromControls(controlsState as any); const formData: Record = {}; Object.keys(controlsState) - .concat(Object.keys(inputFormData)) + .concat(Object.keys(cleanedFormData)) .forEach(controlName => { - if (inputFormData[controlName as keyof FormData] === undefined) { + if (cleanedFormData[controlName as keyof FormData] === undefined) { formData[controlName] = controlFormData[controlName]; } else { - formData[controlName] = inputFormData[controlName as keyof FormData]; + formData[controlName] = cleanedFormData[controlName as keyof FormData]; } }); diff --git a/superset-frontend/src/explore/types.ts b/superset-frontend/src/explore/types.ts index d1420fbb3fd..72b5e239809 100644 --- a/superset-frontend/src/explore/types.ts +++ b/superset-frontend/src/explore/types.ts @@ -71,6 +71,8 @@ export type OptionSortType = Partial< export type Datasource = Dataset & { database?: DatabaseObject; + /** The parent resource that owns this datasource (database or semantic layer). */ + parent?: { name: string }; datasource?: string; catalog?: string | null; schema?: string; @@ -131,6 +133,9 @@ export interface ExplorePageState { standalone: boolean; force: boolean; common: JsonObject; + compatibleMetrics?: string[] | null; + compatibleDimensions?: string[] | null; + compatibilityLoading?: boolean; }; sliceEntities?: JsonObject; // propagated from Dashboard view } diff --git a/superset-frontend/src/features/alerts/AlertReportModal.test.tsx b/superset-frontend/src/features/alerts/AlertReportModal.test.tsx index 76a6527d1ad..0eb7f964df3 100644 --- a/superset-frontend/src/features/alerts/AlertReportModal.test.tsx +++ b/superset-frontend/src/features/alerts/AlertReportModal.test.tsx @@ -701,6 +701,30 @@ test('does not show screenshot width when csv is selected', async () => { expect(screen.queryByRole('spinbutton')).not.toBeInTheDocument(); }); +test('clearing the chart selection resets the combobox value', async () => { + render(, { + useRedux: true, + }); + userEvent.click(screen.getByTestId('contents-panel')); + await screen.findByText(/test chart/i); + const chartCombobox = screen.getByRole('combobox', { + name: /Chart: Test Chart/i, + }); + const chartSelectRoot = chartCombobox.closest('.ant-select'); + expect(chartSelectRoot).toBeInTheDocument(); + await userEvent.click( + within(chartSelectRoot as HTMLElement).getByLabelText('close-circle'), + ); + await waitFor(() => { + expect( + within(chartSelectRoot as HTMLElement).queryByText(/test chart/i), + ).not.toBeInTheDocument(); + expect( + within(chartSelectRoot as HTMLElement).getByText(/select chart to use/i), + ).toBeInTheDocument(); + }); +}); + test('shows screenshot width when PDF is selected', async () => { render(, { useRedux: true, diff --git a/superset-frontend/src/features/alerts/AlertReportModal.tsx b/superset-frontend/src/features/alerts/AlertReportModal.tsx index ee300a5380b..64f1fa4024c 100644 --- a/superset-frontend/src/features/alerts/AlertReportModal.tsx +++ b/superset-frontend/src/features/alerts/AlertReportModal.tsx @@ -1270,10 +1270,14 @@ const AlertReportModal: FunctionComponent = ({ [], ); - const getChartVisualizationType = (chart: SelectValue) => - SupersetClient.get({ + const getChartVisualizationType = (chart: SelectValue) => { + if (!chart || typeof chart !== 'object' || chart.value === undefined) { + return; + } + return SupersetClient.get({ endpoint: `/api/v1/chart/${chart.value}`, }).then(response => setChartVizType(response.json.result.viz_type)); + }; const updateEmailSubject = () => { const chartLabel = currentAlert?.chart?.label; @@ -2341,6 +2345,7 @@ const AlertReportModal: FunctionComponent = ({ { + fetchMock.clearHistory().removeRoutes(); + fetchMock.get('glob:*/api/v1/css_template/1', { result: mockTemplate }); +}); + +afterEach(() => { + fetchMock.removeRoutes(); +}); + +// The Ace editor renders with the DOM id supplied via the editor's `id` prop +// (forwarded to react-ace as `name`). The CSS template modal uses +// id="css-template-editor". +const aceEditorSelector = '#css-template-editor.ace_editor'; + +test('renders the CSS editor field in Edit mode (guard for #38563)', async () => { + render( + {}} cssTemplate={mockTemplate} />, + { useRedux: true, useTheme: true }, + ); + + expect(screen.getByText('css')).toBeInTheDocument(); + await waitFor(() => { + expect(document.querySelector(aceEditorSelector)).toBeInTheDocument(); + }); +}); + +test('renders the CSS editor field in Add mode', async () => { + render( {}} />, { + useRedux: true, + useTheme: true, + }); + + expect(await screen.findByText('Add CSS template')).toBeInTheDocument(); + expect(screen.getByText('css')).toBeInTheDocument(); + await waitFor(() => { + expect(document.querySelector(aceEditorSelector)).toBeInTheDocument(); + }); +}); + +test('renders the editor after closed (Add) -> open (Edit) transition', async () => { + // Mirrors src/pages/CssTemplateList/index.tsx, where the modal is mounted + // up-front with show=false and cssTemplate=null, then both flip together + // when the user clicks the Edit row action. + function Harness() { + const [show, setShow] = useState(false); + const [tpl, setTpl] = useState(null); + return ( + <> + + setShow(false)} + /> + + ); + } + + render(, { useRedux: true, useTheme: true }); + await userEvent.click(screen.getByText('open')); + await waitFor(() => { + expect(document.querySelector(aceEditorSelector)).toBeInTheDocument(); + }); +}); diff --git a/superset-frontend/src/features/databases/DatabaseModal/index.test.tsx b/superset-frontend/src/features/databases/DatabaseModal/index.test.tsx index 2cc9fbe1a87..455c4740a26 100644 --- a/superset-frontend/src/features/databases/DatabaseModal/index.test.tsx +++ b/superset-frontend/src/features/databases/DatabaseModal/index.test.tsx @@ -643,15 +643,15 @@ describe('DatabaseModal', () => { name: /sqlite/i, }), ); + expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); // Click the "Advanced" tab - userEvent.click(await screen.findByRole('tab', { name: /advanced/i })); + userEvent.click(screen.getByRole('tab', { name: /advanced/i })); // Click the "SQL Lab" tab userEvent.click(screen.getByTestId('sql-lab-label-test')); - expect(await screen.findByText(/step 2 of 2/i)).toBeInTheDocument(); // ----- BEGIN STEP 2 (ADVANCED - SQL LAB) // - AntD header - const closeButton = await screen.findByRole('button', { name: /close/i }); + const closeButton = screen.getByRole('button', { name: /close/i }); const advancedHeader = screen.getByRole('heading', { name: /connect a database/i, }); @@ -666,10 +666,8 @@ describe('DatabaseModal', () => { }); // - Basic/Advanced tabs const basicTab = screen.getByRole('tab', { name: /basic/i }); - const advancedTab = await screen.findByRole('tab', { name: /advanced/i }); - const advancedTabPanel = await screen.findByRole('tabpanel', { - name: /advanced/i, - }); + const advancedTab = screen.getByRole('tab', { name: /advanced/i }); + const advancedTabPanel = screen.getAllByRole('tabpanel')[0]; // - Advanced tabs const sqlLabTab = screen.getByTestId('sql-lab-label-test'); // These are the checkbox SVGs that cover the actual checkboxes diff --git a/superset-frontend/src/features/databases/DatabaseModal/index.tsx b/superset-frontend/src/features/databases/DatabaseModal/index.tsx index 0919941938a..1fa38c5e152 100644 --- a/superset-frontend/src/features/databases/DatabaseModal/index.tsx +++ b/superset-frontend/src/features/databases/DatabaseModal/index.tsx @@ -35,7 +35,6 @@ import { CheckboxChangeEvent } from '@superset-ui/core/components/Checkbox/types import { useHistory } from 'react-router-dom'; import { setItem, LocalStorageKeys } from 'src/utils/localStorageHelpers'; -import { makeUrl } from 'src/utils/pathUtils'; import Tabs from '@superset-ui/core/components/Tabs'; import { Button, @@ -1824,7 +1823,9 @@ const DatabaseModal: FunctionComponent = ({ onClick={() => { setLoading(true); fetchAndSetDB(); - redirectURL(makeUrl(`/sqllab?db=true`)); + // redirectURL() delegates to history.push; React Router's basename + // already prefixes the application root, so pass a relative path. + redirectURL('/sqllab?db=true'); }} > {t('Query data in SQL Lab')} diff --git a/superset-frontend/src/features/databases/DatabaseModal/styles.ts b/superset-frontend/src/features/databases/DatabaseModal/styles.ts index c8e37d93412..8aa9aa16ec2 100644 --- a/superset-frontend/src/features/databases/DatabaseModal/styles.ts +++ b/superset-frontend/src/features/databases/DatabaseModal/styles.ts @@ -293,10 +293,17 @@ export const StyledInputContainer = styled.div` `} `; +// Named-reference type annotation: TypeScript 6.0 declaration emit (TS2883) +// won't let us leak react-ace's IAceOptions/ICommand/IEditorProps/IMarker +// through the inferred type because they live in @superset-ui/core's nested +// node_modules and aren't portable. Aliasing to `typeof JsonEditor` emits a +// named reference in the .d.ts instead of the expanded structural type. +// The styled-components and ForwardRefExoticComponent shapes don't overlap +// structurally, so we bounce through `unknown` to widen the cast. export const StyledJsonEditor = styled(JsonEditor)` flex: 1 1 auto; /* Border is already applied by AceEditor itself */ -`; +` as unknown as typeof JsonEditor; export const StyledExpandableForm = styled.div` padding-top: ${({ theme }) => theme.sizeUnit}px; diff --git a/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/DatasetPanelWrapper.test.tsx b/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/DatasetPanelWrapper.test.tsx new file mode 100644 index 00000000000..66d02d22874 --- /dev/null +++ b/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/DatasetPanelWrapper.test.tsx @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { render, waitFor } from 'spec/helpers/testing-library'; +import { SupersetClient } from '@superset-ui/core'; +import DatasetPanelWrapper from 'src/features/datasets/AddDataset/DatasetPanel'; + +jest.mock( + '@superset-ui/core/components/Icons/AsyncIcon', + () => + ({ fileName }: { fileName: string }) => ( + + ), +); + +afterEach(() => { + jest.restoreAllMocks(); +}); + +test('fetches table metadata for schema-less database without schema', async () => { + const getSpy = jest.spyOn(SupersetClient, 'get').mockResolvedValue({ + json: { + name: 'my_table', + columns: [{ name: 'id', type: 'INTEGER', longType: 'INTEGER' }], + }, + } as any); + + render( + , + { useRouter: true }, + ); + + await waitFor(() => { + expect(getSpy).toHaveBeenCalledWith( + expect.objectContaining({ + endpoint: expect.stringContaining('/api/v1/database/1/table_metadata/'), + }), + ); + }); +}); diff --git a/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/index.tsx b/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/index.tsx index 661650b720c..f41ee9020fc 100644 --- a/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/index.tsx +++ b/superset-frontend/src/features/datasets/AddDataset/DatasetPanel/index.tsx @@ -22,6 +22,7 @@ import { SupersetClient } from '@superset-ui/core'; import { logging } from '@apache-superset/core/utils'; import { DatasetObject } from 'src/features/datasets/AddDataset/types'; import { addDangerToast } from 'src/components/MessageToasts/actions'; +import { type DatabaseObject } from 'src/components'; import { toQueryString } from 'src/utils/urlUtils'; import DatasetPanel from './DatasetPanel'; import { ITableColumn, IDatabaseTable, isIDatabaseTable } from './types'; @@ -39,9 +40,9 @@ interface IColumnProps { */ tableName: string; /** - * Name of the schema + * Name of the schema (optional for databases that don't support schemas) */ - schema: string; + schema?: string | null; } export interface IDatasetPanelWrapperProps { @@ -58,6 +59,10 @@ export interface IDatasetPanelWrapperProps { */ catalog?: string | null; schema?: string | null; + /** + * The selected database object (used to check engine capabilities) + */ + database?: Partial | null; setHasColumns?: Function; datasets?: DatasetObject[] | undefined; } @@ -67,6 +72,7 @@ const DatasetPanelWrapper = ({ dbId, catalog, schema, + database, setHasColumns, datasets, }: IDatasetPanelWrapperProps) => { @@ -128,12 +134,13 @@ const DatasetPanelWrapper = ({ useEffect(() => { tableNameRef.current = tableName; - if (tableName && schema && dbId) { - getTableMetadata({ tableName, dbId, schema }); + const schemaRequired = database?.supports_schemas !== false; + if (tableName && dbId && (schema || !schemaRequired)) { + getTableMetadata({ tableName, dbId, schema: schema || undefined }); } // getTableMetadata is a const and should not be in dependency array // eslint-disable-next-line react-hooks/exhaustive-deps - }, [tableName, dbId, schema]); + }, [tableName, dbId, schema, database]); return ( { expect(result.current.datasetNames).toEqual([]); }); +test('useDatasetsList fetches datasets for schema-less databases without schema filter', async () => { + const schemalessDb = { + id: 2, + database_name: 'ydb', + owners: [1] as [number], + supports_schemas: false, + }; + + const getSpy = jest.spyOn(SupersetClient, 'get').mockResolvedValue({ + json: { + count: 1, + result: [{ id: 10, table_name: 'my_table', schema: null }], + }, + } as unknown as JsonResponse); + + const { result } = renderHook(() => useDatasetsList(schemalessDb, null)); + + await waitFor(() => { + expect(result.current.datasets).toHaveLength(1); + }); + + expect(result.current.datasetNames).toEqual(['my_table']); + expect(getSpy).toHaveBeenCalledTimes(1); + + // Verify the API was called without a schema filter + const callArg = getSpy.mock.calls[0]?.[0]?.endpoint; + expect(callArg).toBeDefined(); + + const risonParam = new URL(callArg!, 'http://localhost').searchParams.get( + 'q', + ); + expect(risonParam).toBeTruthy(); + const decoded = rison.decode(risonParam!) as { + filters: Array<{ col: string; opr: string; value: unknown }>; + }; + + // Only database filter and sql filter β€” no schema filter + const schemaFilter = decoded.filters.find(f => f.col === 'schema'); + expect(schemaFilter).toBeUndefined(); + + const dbFilter = decoded.filters.find(f => f.col === 'database'); + expect(dbFilter).toEqual({ col: 'database', opr: 'rel_o_m', value: 2 }); +}); + +test('useDatasetsList skips fetching when schema-less database id is undefined', () => { + const getSpy = jest.spyOn(SupersetClient, 'get'); + + const schemalessDb = { + database_name: 'ydb', + owners: [1] as [number], + supports_schemas: false, + } as typeof mockDb & { supports_schemas: boolean }; + + const { result } = renderHook(() => useDatasetsList(schemalessDb, null)); + + // No db.id β€” should NOT call API even for schema-less DB + expect(getSpy).not.toHaveBeenCalled(); + expect(result.current.datasets).toEqual([]); +}); + test('useDatasetsList encodes schemas with spaces and special characters in endpoint URL', async () => { const getSpy = jest.spyOn(SupersetClient, 'get').mockResolvedValue({ json: { count: 0, result: [] }, diff --git a/superset-frontend/src/features/datasets/hooks/useDatasetLists.ts b/superset-frontend/src/features/datasets/hooks/useDatasetLists.ts index 96241fe5b61..b2f925b1759 100644 --- a/superset-frontend/src/features/datasets/hooks/useDatasetLists.ts +++ b/superset-frontend/src/features/datasets/hooks/useDatasetLists.ts @@ -37,7 +37,8 @@ const useDatasetsList = ( schema: string | null | undefined, ) => { const [datasets, setDatasets] = useState([]); - const encodedSchema = schema ? encodeURIComponent(schema) : undefined; + const supportsSchemas = db?.supports_schemas !== false; + const encodedSchema = schema ? encodeURIComponent(schema) : null; const getDatasetsList = useCallback(async (filters: object[]) => { let results: DatasetObject[] = []; @@ -77,14 +78,16 @@ const useDatasetsList = ( useEffect(() => { const filters = [ { col: 'database', opr: 'rel_o_m', value: db?.id }, - { col: 'schema', opr: 'eq', value: encodedSchema }, + ...(supportsSchemas + ? [{ col: 'schema', opr: 'eq', value: encodedSchema }] + : []), { col: 'sql', opr: 'dataset_is_null_or_empty', value: true }, ]; - if (schema && db?.id !== undefined) { + if (db?.id !== undefined && (schema || !supportsSchemas)) { getDatasetsList(filters); } - }, [db?.id, schema, encodedSchema, getDatasetsList]); + }, [db?.id, schema, encodedSchema, supportsSchemas, getDatasetsList]); const datasetNames = useMemo( () => datasets?.map(dataset => dataset.table_name), diff --git a/superset-frontend/src/features/datasets/metadataBar/useDatasetMetadataBar.test.tsx b/superset-frontend/src/features/datasets/metadataBar/useDatasetMetadataBar.test.tsx index 6be5603cea2..a5999c545b8 100644 --- a/superset-frontend/src/features/datasets/metadataBar/useDatasetMetadataBar.test.tsx +++ b/superset-frontend/src/features/datasets/metadataBar/useDatasetMetadataBar.test.tsx @@ -18,7 +18,7 @@ */ import fetchMock from 'fetch-mock'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { createWrapper, render } from 'spec/helpers/testing-library'; import { supersetGetCache } from 'src/utils/cachedSupersetGet'; import { useDatasetMetadataBar } from './useDatasetMetadataBar'; diff --git a/superset-frontend/src/features/home/EmptyState.tsx b/superset-frontend/src/features/home/EmptyState.tsx index 119fd6596ce..436f8181f5b 100644 --- a/superset-frontend/src/features/home/EmptyState.tsx +++ b/superset-frontend/src/features/home/EmptyState.tsx @@ -24,7 +24,6 @@ import { TableTab } from 'src/views/CRUD/types'; import { t } from '@apache-superset/core/translation'; import { styled } from '@apache-superset/core/theme'; import { navigateTo } from 'src/utils/navigationUtils'; -import { makeUrl } from 'src/utils/pathUtils'; import { WelcomeTable } from './types'; const EmptyContainer = styled.div` @@ -59,7 +58,9 @@ const REDIRECTS = { create: { [WelcomeTable.Charts]: '/chart/add', [WelcomeTable.Dashboards]: '/dashboard/new', - [WelcomeTable.SavedQueries]: makeUrl('/sqllab?new=true'), + // navigateTo() applies the application root internally; keep this + // relative so the prefix isn't added twice. + [WelcomeTable.SavedQueries]: '/sqllab?new=true', }, viewAll: { [WelcomeTable.Charts]: '/chart/list', diff --git a/superset-frontend/src/features/home/LanguagePicker.tsx b/superset-frontend/src/features/home/LanguagePicker.tsx index 82bf482a0f4..ed214c52ceb 100644 --- a/superset-frontend/src/features/home/LanguagePicker.tsx +++ b/superset-frontend/src/features/home/LanguagePicker.tsx @@ -25,9 +25,9 @@ import { Typography } from '@superset-ui/core/components/Typography'; export interface Languages { [key: string]: { - flag: string; - url: string; - name: string; + flag?: string; + url?: string; + name?: string; }; } @@ -61,9 +61,9 @@ export const useLanguageMenuItems = ({ key: langKey, label: ( - - - {languages[langKey].name} + + + {languages[langKey]?.name} ), @@ -75,7 +75,7 @@ export const useLanguageMenuItems = ({ type: 'submenu' as const, label: ( - + ), icon: , diff --git a/superset-frontend/src/features/home/Menu.tsx b/superset-frontend/src/features/home/Menu.tsx index 1f9e99f0e94..06d606cc6a4 100644 --- a/superset-frontend/src/features/home/Menu.tsx +++ b/superset-frontend/src/features/home/Menu.tsx @@ -35,6 +35,7 @@ import { MenuObjectProps, MenuData, } from 'src/types/bootstrapTypes'; +import { datasetsLabel } from 'src/features/semanticLayers/label'; import RightMenu from './RightMenu'; import { NAVBAR_MENU_POPUP_OFFSET } from './commonMenuData'; @@ -223,7 +224,7 @@ export function Menu({ setActiveTabs(['Charts']); break; case path.startsWith(Paths.Datasets): - setActiveTabs(['Datasets']); + setActiveTabs([datasetsLabel()]); break; case path.startsWith(Paths.SqlLab) || path.startsWith(Paths.SavedQueries): setActiveTabs(['SQL']); @@ -408,6 +409,12 @@ export default function MenuWrapper({ data, ...rest }: MenuProps) { Manage: true, }; + // Remap labels that depend on feature flags so they stay in sync with + // the active-tab key used in the Menu component above. + const labelOverrides: Record string> = { + Datasets: datasetsLabel, + }; + // Cycle through menu.menu to build out cleanedMenu and settings const cleanedMenu: MenuObjectProps[] = []; const settings: MenuObjectProps[] = []; @@ -419,6 +426,10 @@ export default function MenuWrapper({ data, ...rest }: MenuProps) { const children: (MenuObjectProps | string)[] = []; const newItem = { ...item, + // Apply any label override for this item (keyed by FAB internal name). + ...(item.name && labelOverrides[item.name] + ? { label: labelOverrides[item.name]() } + : {}), }; // Filter childs diff --git a/superset-frontend/src/features/home/RightMenu.test.tsx b/superset-frontend/src/features/home/RightMenu.test.tsx index 4c15c585ad6..b62ce4439d7 100644 --- a/superset-frontend/src/features/home/RightMenu.test.tsx +++ b/superset-frontend/src/features/home/RightMenu.test.tsx @@ -377,11 +377,12 @@ test('If there is NOT a DB with allow_file_upload set as True the option should await userEvent.hover(dropdown); const dataMenu = await screen.findByText(dropdownItems[0].label); await userEvent.hover(dataMenu); - const csvMenu = await screen.findByRole('menuitem', { - name: 'Upload CSV to database', - }); + const csvMenu = await screen.findByText('Upload CSV to database'); expect(csvMenu).toBeInTheDocument(); - expect(csvMenu).toHaveAttribute('aria-disabled', 'true'); + expect(csvMenu.closest('li[role="menuitem"]')).toHaveAttribute( + 'aria-disabled', + 'true', + ); }); test('Logs out and clears local storage item redux', async () => { diff --git a/superset-frontend/src/features/home/RightMenu.tsx b/superset-frontend/src/features/home/RightMenu.tsx index 28c25498642..6462c1c588b 100644 --- a/superset-frontend/src/features/home/RightMenu.tsx +++ b/superset-frontend/src/features/home/RightMenu.tsx @@ -44,7 +44,7 @@ import { TelemetryPixel, } from '@superset-ui/core/components'; import type { ItemType, MenuItem } from '@superset-ui/core/components/Menu'; -import { ensureAppRoot, makeUrl } from 'src/utils/pathUtils'; +import { ensureAppRoot } from 'src/utils/pathUtils'; import { isEmbedded } from 'src/dashboard/util/isEmbedded'; import { findPermission } from 'src/utils/findPermission'; import { isUserAdmin } from 'src/dashboard/util/permissionUtils'; @@ -213,7 +213,10 @@ const RightMenu = ({ }, { label: t('SQL query'), - url: makeUrl('/sqllab?new=true'), + // Keep the URL relative so isFrontendRoute() matches and Link navigates + // via React Router; the fallback applies ensureAppRoot + // exactly once for non-frontend routes. + url: '/sqllab?new=true', icon: , perm: 'can_sqllab', view: 'Superset', diff --git a/superset-frontend/src/features/home/SubMenu.tsx b/superset-frontend/src/features/home/SubMenu.tsx index a7ef5ba7d27..9c2e2c451eb 100644 --- a/superset-frontend/src/features/home/SubMenu.tsx +++ b/superset-frontend/src/features/home/SubMenu.tsx @@ -36,7 +36,6 @@ import { type OnClickHandler, } from '@superset-ui/core/components'; import { Icons } from '@superset-ui/core/components/Icons'; -import { IconType } from '@superset-ui/core/components/Icons/types'; import { MenuObjectProps } from 'src/types/bootstrapTypes'; import { Typography } from '@superset-ui/core/components/Typography'; @@ -149,7 +148,8 @@ export interface ButtonProps { 'data-test'?: string; buttonStyle: 'primary' | 'secondary' | 'dashed' | 'link' | 'tertiary'; loading?: boolean; - icon?: IconType; + icon?: ReactNode; + component?: ReactNode; } export interface SubMenuProps { @@ -164,6 +164,7 @@ export interface SubMenuProps { color?: string; dropDownLinks?: Array; backgroundColor?: string; + children?: ReactNode; } const SubMenuComponent: FunctionComponent = props => { @@ -312,18 +313,22 @@ const SubMenuComponent: FunctionComponent = props => { ), }))} /> - {props.buttons?.map((btn, i) => ( - - ))} + {props.buttons?.map((btn, i) => + btn.component ? ( + {btn.component} + ) : ( + + ), + )}
{props.children} diff --git a/superset-frontend/src/features/home/types.ts b/superset-frontend/src/features/home/types.ts index a59e9fcd858..633f0bffcfa 100644 --- a/superset-frontend/src/features/home/types.ts +++ b/superset-frontend/src/features/home/types.ts @@ -17,6 +17,7 @@ * under the License. */ +import { ReactNode } from 'react'; import { Filter } from 'src/views/CRUD/types'; import { NavBarProps, MenuObjectProps } from 'src/types/bootstrapTypes'; @@ -45,6 +46,7 @@ export interface RightMenuProps { text: string; color: string; }; + children?: ReactNode; } export enum GlobalMenuDataOptions { diff --git a/superset-frontend/src/features/reports/ReportModal/index.tsx b/superset-frontend/src/features/reports/ReportModal/index.tsx index 425867ced55..061615cf2ff 100644 --- a/superset-frontend/src/features/reports/ReportModal/index.tsx +++ b/superset-frontend/src/features/reports/ReportModal/index.tsx @@ -366,7 +366,7 @@ function ReportModal({ }} onError={setCronError} /> - {cronError} + {cronError?.description}
TimezoneHeaderStyle(theme)} diff --git a/superset-frontend/src/features/reports/ReportModal/styles.tsx b/superset-frontend/src/features/reports/ReportModal/styles.tsx index 14acc3e0012..0b487bd6803 100644 --- a/superset-frontend/src/features/reports/ReportModal/styles.tsx +++ b/superset-frontend/src/features/reports/ReportModal/styles.tsx @@ -67,10 +67,13 @@ export const StyledScheduleTitle = styled.div` } `; +// Named-reference type annotation: TypeScript 6.0 declaration emit (TS2883) +// can't name CronProps from react-js-cron via its nested node_modules path. +// Aliasing to `typeof CronPicker` emits a named reference in the .d.ts. export const StyledCronPicker = styled(CronPicker)` margin-bottom: ${({ theme }) => theme.sizeUnit * 3}px; width: ${({ theme }) => theme.sizeUnit * 120}px; -`; +` as typeof CronPicker; export const StyledCronError = styled.p` color: ${({ theme }) => theme.colorError}; diff --git a/superset-frontend/src/features/roles/RoleListEditModal.test.tsx b/superset-frontend/src/features/roles/RoleListEditModal.test.tsx index 5129b6318ef..b05f946d808 100644 --- a/superset-frontend/src/features/roles/RoleListEditModal.test.tsx +++ b/superset-frontend/src/features/roles/RoleListEditModal.test.tsx @@ -145,6 +145,11 @@ describe('RoleListEditModal', () => { render(); + // Wait for user hydration to complete so setFieldsValue has populated + // the form with the fetched users before submitting. + await screen.findByText('johndoe'); + await screen.findByText('janesmith'); + fireEvent.change(screen.getByTestId('role-name-input'), { target: { value: 'Updated Role' }, }); diff --git a/superset-frontend/src/features/roles/RoleListEditModal.tsx b/superset-frontend/src/features/roles/RoleListEditModal.tsx index 42581ecfe2b..d14f8b9755a 100644 --- a/superset-frontend/src/features/roles/RoleListEditModal.tsx +++ b/superset-frontend/src/features/roles/RoleListEditModal.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { useEffect, useMemo, useRef, useState } from 'react'; +import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'; import { t } from '@apache-superset/core/translation'; import Tabs from '@superset-ui/core/components/Tabs'; import { RoleObject } from 'src/pages/RolesList'; @@ -330,45 +330,47 @@ function RoleListEditModal({ initialValues={initialValues} requiredFields={['roleName']} > - {(form: FormInstance) => { - formRef.current = form; + { + ((form: FormInstance) => { + formRef.current = form; - return ( - setActiveTabKey(activeKey)} - > - setActiveTabKey(activeKey)} > - <> - - + <> + + + + + + + + - - - - - - - - - ); - }} + + + ); + }) as unknown as ReactNode + } ); } diff --git a/superset-frontend/src/features/semanticLayers/SemanticLayerModal.test.tsx b/superset-frontend/src/features/semanticLayers/SemanticLayerModal.test.tsx new file mode 100644 index 00000000000..a3aed93fde7 --- /dev/null +++ b/superset-frontend/src/features/semanticLayers/SemanticLayerModal.test.tsx @@ -0,0 +1,130 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { SupersetClient } from '@superset-ui/core'; +import { render, waitFor } from 'spec/helpers/testing-library'; + +import SemanticLayerModal from './SemanticLayerModal'; + +let mockJsonFormsChangeTriggered = false; + +jest.mock('@jsonforms/react', () => ({ + ...jest.requireActual('@jsonforms/react'), + JsonForms: ({ onChange }: { onChange: (value: unknown) => void }) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + if (!mockJsonFormsChangeTriggered) { + mockJsonFormsChangeTriggered = true; + onChange({ + data: { warehouse: 'wh1' }, + errors: [], + }); + } + return null; + }, +})); + +jest.mock('@superset-ui/core', () => ({ + ...jest.requireActual('@superset-ui/core'), + SupersetClient: { + ...jest.requireActual('@superset-ui/core').SupersetClient, + get: jest.fn(), + post: jest.fn(), + put: jest.fn(), + }, + getClientErrorObject: jest.fn(() => Promise.resolve({ error: '' })), +})); + +const mockedGet = SupersetClient.get as jest.Mock; +const mockedPost = SupersetClient.post as jest.Mock; + +const props = { + show: true, + onHide: jest.fn(), + addDangerToast: jest.fn(), + addSuccessToast: jest.fn(), + semanticLayerUuid: '11111111-1111-1111-1111-111111111111', +}; + +beforeEach(() => { + mockJsonFormsChangeTriggered = false; + jest.useFakeTimers({ advanceTimers: true }); + mockedGet.mockReset(); + mockedPost.mockReset(); + + mockedGet + .mockResolvedValueOnce({ + json: { + result: [{ id: 'snowflake', name: 'Snowflake', description: '' }], + }, + }) + .mockResolvedValueOnce({ + json: { + result: { + name: 'Layer 1', + type: 'snowflake', + configuration: { warehouse: 'wh0' }, + }, + }, + }); + + mockedPost.mockResolvedValue({ + json: { + result: { + type: 'object', + properties: { + warehouse: { + type: 'string', + 'x-dynamic': true, + 'x-dependsOn': ['warehouse'], + }, + }, + }, + }, + }); +}); + +afterEach(() => { + jest.runOnlyPendingTimers(); + jest.useRealTimers(); +}); + +test('posts configuration schema refresh after debounce', async () => { + render(); + + await waitFor(() => { + expect(mockedPost).toHaveBeenNthCalledWith(1, { + endpoint: '/api/v1/semantic_layer/schema/configuration', + jsonPayload: { + type: 'snowflake', + configuration: { warehouse: 'wh0' }, + }, + }); + }); + + jest.advanceTimersByTime(501); + + await waitFor(() => { + expect(mockedPost).toHaveBeenNthCalledWith(2, { + endpoint: '/api/v1/semantic_layer/schema/configuration', + jsonPayload: { + type: 'snowflake', + configuration: { warehouse: 'wh1' }, + }, + }); + }); +}); diff --git a/superset-frontend/src/features/semanticLayers/SemanticLayerModal.tsx b/superset-frontend/src/features/semanticLayers/SemanticLayerModal.tsx new file mode 100644 index 00000000000..0193f296488 --- /dev/null +++ b/superset-frontend/src/features/semanticLayers/SemanticLayerModal.tsx @@ -0,0 +1,408 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useState, useEffect, useCallback, useRef } from 'react'; +import { t } from '@apache-superset/core/translation'; +import { SupersetClient, getClientErrorObject } from '@superset-ui/core'; +import { Input, Select, Button } from '@superset-ui/core/components'; +import { Icons } from '@superset-ui/core/components/Icons'; +import { JsonForms } from '@jsonforms/react'; +import type { JsonSchema, UISchemaElement } from '@jsonforms/core'; +import { cellRegistryEntries } from '@great-expectations/jsonforms-antd-renderers'; +import type { ErrorObject } from 'ajv'; +import { + StandardModal, + ModalFormField, + MODAL_STANDARD_WIDTH, + MODAL_MEDIUM_WIDTH, +} from 'src/components/Modal'; +import { styled } from '@apache-superset/core/theme'; +import { + renderers, + sanitizeSchema, + buildUiSchema, + getDynamicDependencies, + areDependenciesSatisfied, + serializeDependencyValues, + SCHEMA_REFRESH_DEBOUNCE_MS, +} from './jsonFormsHelpers'; + +const ModalContent = styled.div` + padding: ${({ theme }) => theme.sizeUnit * 4}px; +`; + +type Step = 'type' | 'config'; +type ValidationMode = 'ValidateAndHide' | 'ValidateAndShow'; + +interface SemanticLayerType { + id: string; + name: string; + description: string; +} + +interface SemanticLayerModalProps { + show: boolean; + onHide: () => void; + addDangerToast: (msg: string) => void; + addSuccessToast: (msg: string) => void; + semanticLayerUuid?: string; +} + +export default function SemanticLayerModal({ + show, + onHide, + addDangerToast, + addSuccessToast, + semanticLayerUuid, +}: SemanticLayerModalProps) { + const isEditMode = !!semanticLayerUuid; + const [step, setStep] = useState('type'); + const [name, setName] = useState(''); + const [selectedType, setSelectedType] = useState(null); + const [types, setTypes] = useState([]); + const [loading, setLoading] = useState(false); + const [configSchema, setConfigSchema] = useState(null); + const [uiSchema, setUiSchema] = useState( + undefined, + ); + const [formData, setFormData] = useState>({}); + const [saving, setSaving] = useState(false); + const [hasErrors, setHasErrors] = useState(true); + const [refreshingSchema, setRefreshingSchema] = useState(false); + const [validationMode, setValidationMode] = + useState('ValidateAndHide'); + const errorsRef = useRef([]); + const debounceTimerRef = useRef | null>(null); + const lastDepSnapshotRef = useRef(''); + const dynamicDepsRef = useRef>({}); + + const fetchTypes = useCallback(async () => { + setLoading(true); + try { + const { json } = await SupersetClient.get({ + endpoint: '/api/v1/semantic_layer/types', + }); + setTypes(json.result ?? []); + } catch (error) { + const clientError = await getClientErrorObject(error); + addDangerToast( + clientError.error || + t('An error occurred while fetching semantic layer types'), + ); + } finally { + setLoading(false); + } + }, [addDangerToast]); + + const applySchema = useCallback((rawSchema: JsonSchema) => { + const schema = sanitizeSchema(rawSchema); + setConfigSchema(schema); + setUiSchema(buildUiSchema(schema)); + dynamicDepsRef.current = getDynamicDependencies(rawSchema); + }, []); + + const fetchConfigSchema = useCallback( + async (type: string, configuration?: Record) => { + const isInitialFetch = !configuration; + if (isInitialFetch) setLoading(true); + else setRefreshingSchema(true); + try { + const { json } = await SupersetClient.post({ + endpoint: '/api/v1/semantic_layer/schema/configuration', + jsonPayload: { type, configuration }, + }); + applySchema(json.result); + if (json.warning) { + addDangerToast(String(json.warning)); + } + if (isInitialFetch) setStep('config'); + } catch (error) { + const clientError = await getClientErrorObject(error); + if (isInitialFetch) { + addDangerToast( + clientError.error || + t('An error occurred while fetching the configuration schema'), + ); + } else { + addDangerToast( + clientError.error || + t('An error occurred while refreshing the configuration schema'), + ); + } + } finally { + if (isInitialFetch) setLoading(false); + else setRefreshingSchema(false); + } + }, + [addDangerToast, applySchema], + ); + + const fetchExistingLayer = useCallback( + async (uuid: string) => { + setLoading(true); + try { + const { json } = await SupersetClient.get({ + endpoint: `/api/v1/semantic_layer/${uuid}`, + }); + const layer = json.result; + setName(layer.name ?? ''); + setSelectedType(layer.type); + setFormData(layer.configuration ?? {}); + setHasErrors(false); + // In edit mode, fetch the enriched schema using the full saved + // configuration so that dynamic dropdowns (account, project, + // environment) show their human-readable labels immediately rather + // than flashing raw IDs while the background refresh completes. + const { json: schemaJson } = await SupersetClient.post({ + endpoint: '/api/v1/semantic_layer/schema/configuration', + jsonPayload: { type: layer.type, configuration: layer.configuration }, + }); + applySchema(schemaJson.result); + setStep('config'); + } catch (error) { + const clientError = await getClientErrorObject(error); + addDangerToast( + clientError.error || + t('An error occurred while fetching the semantic layer'), + ); + } finally { + setLoading(false); + } + }, + [addDangerToast, applySchema], + ); + + useEffect(() => { + if (show) { + if (isEditMode && semanticLayerUuid) { + fetchTypes(); + fetchExistingLayer(semanticLayerUuid); + } else { + fetchTypes(); + } + } else { + setStep('type'); + setName(''); + setSelectedType(null); + setTypes([]); + setConfigSchema(null); + setUiSchema(undefined); + setFormData({}); + setHasErrors(true); + setRefreshingSchema(false); + setValidationMode('ValidateAndHide'); + errorsRef.current = []; + lastDepSnapshotRef.current = ''; + dynamicDepsRef.current = {}; + if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current); + } + }, [show, fetchTypes, isEditMode, semanticLayerUuid, fetchExistingLayer]); + + const handleStepAdvance = () => { + if (selectedType) { + fetchConfigSchema(selectedType); + } + }; + + const handleBack = () => { + setStep('type'); + setConfigSchema(null); + setUiSchema(undefined); + setFormData({}); + setValidationMode('ValidateAndHide'); + errorsRef.current = []; + lastDepSnapshotRef.current = ''; + dynamicDepsRef.current = {}; + if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current); + }; + + const handleCreate = async () => { + setSaving(true); + try { + if (isEditMode && semanticLayerUuid) { + await SupersetClient.put({ + endpoint: `/api/v1/semantic_layer/${semanticLayerUuid}`, + jsonPayload: { name, configuration: formData }, + }); + addSuccessToast(t('Semantic layer updated')); + } else { + await SupersetClient.post({ + endpoint: '/api/v1/semantic_layer/', + jsonPayload: { name, type: selectedType, configuration: formData }, + }); + addSuccessToast(t('Semantic layer created')); + } + onHide(); + } catch (error) { + const clientError = await getClientErrorObject(error); + addDangerToast( + clientError.error || + (isEditMode + ? t('An error occurred while updating the semantic layer') + : t('An error occurred while creating the semantic layer')), + ); + } finally { + setSaving(false); + } + }; + + const handleSave = () => { + if (step === 'type') { + handleStepAdvance(); + } else { + // Trigger validation UI and submit only from explicit save action. + setValidationMode('ValidateAndShow'); + if (errorsRef.current.length === 0) { + handleCreate(); + } + } + }; + + const maybeRefreshSchema = useCallback( + (data: Record) => { + if (!selectedType) return; + + const dynamicDeps = dynamicDepsRef.current; + if (Object.keys(dynamicDeps).length === 0) return; + + // Check if any dynamic field has all dependencies satisfied + const hasSatisfiedDeps = Object.values(dynamicDeps).some(deps => + areDependenciesSatisfied(deps, data, configSchema ?? undefined), + ); + if (!hasSatisfiedDeps) return; + + // Only re-fetch if dependency values actually changed + const snapshot = serializeDependencyValues(dynamicDeps, data); + if (snapshot === lastDepSnapshotRef.current) return; + lastDepSnapshotRef.current = snapshot; + + if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current); + debounceTimerRef.current = setTimeout(() => { + fetchConfigSchema(selectedType, data); + }, SCHEMA_REFRESH_DEBOUNCE_MS); + }, + [selectedType, fetchConfigSchema, configSchema], + ); + + const handleFormChange = useCallback( + ({ + data, + errors, + }: { + data: Record; + errors?: ErrorObject[]; + }) => { + setFormData(data); + errorsRef.current = errors ?? []; + setHasErrors(errorsRef.current.length > 0); + maybeRefreshSchema(data); + }, + [maybeRefreshSchema], + ); + + const selectedTypeName = + types.find(type => type.id === selectedType)?.name ?? ''; + + const title = isEditMode + ? t('Edit %s', selectedTypeName || t('Semantic Layer')) + : step === 'type' + ? t('New Semantic Layer') + : t('Configure %s', selectedTypeName); + + return ( + : } + width={step === 'type' ? MODAL_STANDARD_WIDTH : MODAL_MEDIUM_WIDTH} + saveDisabled={ + step === 'type' ? !selectedType : saving || !name.trim() || hasErrors + } + saveText={ + step === 'type' ? undefined : isEditMode ? t('Save') : t('Create') + } + saveLoading={saving} + contentLoading={loading} + > + + {step === 'type' ? ( + + setName(e.target.value)} + placeholder={t('Name of the semantic layer')} + /> + + {configSchema && ( + // Wrap in a form with autocomplete="off" so browsers do not + // autofill credential fields (service token, account, etc.). + // eslint-disable-next-line jsx-a11y/no-redundant-roles +
e.preventDefault()} + > + + + )} + + )} +
+
+ ); +} diff --git a/superset-frontend/src/features/semanticLayers/jsonFormsHelpers.test.ts b/superset-frontend/src/features/semanticLayers/jsonFormsHelpers.test.ts new file mode 100644 index 00000000000..9f81bea4772 --- /dev/null +++ b/superset-frontend/src/features/semanticLayers/jsonFormsHelpers.test.ts @@ -0,0 +1,150 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import type { JsonSchema } from '@jsonforms/core'; + +import { + areDependenciesSatisfied, + sanitizeSchema, + buildUiSchema, + getDynamicDependencies, + serializeDependencyValues, +} from './jsonFormsHelpers'; + +test('areDependenciesSatisfied returns true for present dependency values', () => { + expect( + areDependenciesSatisfied(['database', 'schema'], { + database: 'examples', + schema: 'public', + }), + ).toBe(true); +}); + +test('areDependenciesSatisfied treats empty object dependencies as unsatisfied', () => { + expect( + areDependenciesSatisfied(['auth'], { + auth: {}, + }), + ).toBe(false); +}); + +test('areDependenciesSatisfied uses schema defaults for untouched fields', () => { + const schema: JsonSchema = { + type: 'object', + properties: { + database: { + type: 'string', + default: 'analytics', + }, + }, + }; + + expect(areDependenciesSatisfied(['database'], {}, schema)).toBe(true); +}); + +test('sanitizeSchema removes empty enums and preserves other properties', () => { + const schema: JsonSchema = { + type: 'object', + properties: { + environment: { + type: 'string', + enum: [], + }, + warehouse: { + type: 'string', + enum: ['xsmall', 'small'], + }, + }, + }; + + const sanitized = sanitizeSchema(schema); + const sanitizedProperties = + (sanitized.properties as Record) ?? {}; + + expect(sanitizedProperties.environment?.enum).toBeUndefined(); + expect(sanitizedProperties.warehouse?.enum).toEqual(['xsmall', 'small']); +}); + +test('buildUiSchema respects x-propertyOrder and includes placeholders/tooltips', () => { + const schema = { + type: 'object', + properties: { + database: { + type: 'string', + description: 'Target database', + examples: ['examples'], + }, + schema: { + type: 'string', + }, + }, + 'x-propertyOrder': ['schema', 'database'], + } as JsonSchema; + + const uiSchema = buildUiSchema(schema) as { + type: string; + elements: Array>; + }; + + expect(uiSchema.type).toBe('VerticalLayout'); + expect(uiSchema.elements[0].scope).toBe('#/properties/schema'); + expect(uiSchema.elements[1].scope).toBe('#/properties/database'); + expect(uiSchema.elements[1].options).toEqual({ + placeholderText: 'examples', + tooltip: 'Target database', + }); +}); + +test('getDynamicDependencies extracts x-dynamic dependency mapping', () => { + const schema = { + type: 'object', + properties: { + schema: { + type: 'string', + 'x-dynamic': true, + 'x-dependsOn': ['database'], + }, + database: { + type: 'string', + }, + warehouse: { + type: 'string', + 'x-dynamic': true, + }, + }, + } as JsonSchema; + + expect(getDynamicDependencies(schema)).toEqual({ schema: ['database'] }); +}); + +test('serializeDependencyValues is stable and sorted by key', () => { + const dynamicDeps = { + schema: ['database'], + role: ['warehouse', 'database'], + }; + + const data = { + warehouse: 'compute_wh', + database: 'analytics', + ignored: 'x', + }; + + expect(serializeDependencyValues(dynamicDeps, data)).toBe( + JSON.stringify({ database: 'analytics', warehouse: 'compute_wh' }), + ); +}); diff --git a/superset-frontend/src/features/semanticLayers/jsonFormsHelpers.tsx b/superset-frontend/src/features/semanticLayers/jsonFormsHelpers.tsx new file mode 100644 index 00000000000..85c7b891dbc --- /dev/null +++ b/superset-frontend/src/features/semanticLayers/jsonFormsHelpers.tsx @@ -0,0 +1,386 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { useEffect } from 'react'; +import { t } from '@apache-superset/core/translation'; +import { Spin, Select, Form } from 'antd'; +import { withJsonFormsControlProps } from '@jsonforms/react'; +import type { + JsonSchema, + UISchemaElement, + ControlProps, +} from '@jsonforms/core'; +import { + rankWith, + and, + isStringControl, + formatIs, + schemaMatches, +} from '@jsonforms/core'; +import { + rendererRegistryEntries, + TextControl, +} from '@great-expectations/jsonforms-antd-renderers'; + +export const SCHEMA_REFRESH_DEBOUNCE_MS = 500; + +/** + * Custom renderer that renders `Input.Password` for fields with + * `format: "password"` in the JSON Schema (e.g. Pydantic `SecretStr`). + */ +function PasswordControl(props: ControlProps) { + const uischema = { + ...props.uischema, + options: { + ...props.uischema.options, + type: 'password', + inputProps: { + ...((props.uischema.options?.inputProps as Record) ?? + {}), + // Prevent browsers from autofilling stored login passwords into + // service-token fields. 'new-password' is respected even when + // 'off' is ignored (Chrome β‰₯ 34). + autoComplete: 'new-password', + }, + }, + }; + return TextControl({ ...props, uischema }); +} +const PasswordRenderer = withJsonFormsControlProps(PasswordControl); +const passwordEntry = { + tester: rankWith(3, and(isStringControl, formatIs('password'))), + renderer: PasswordRenderer, +}; + +/** + * Renderer for `const` properties (e.g. Pydantic discriminator fields). + * Renders nothing visually but ensures the const value is set in form data, + * so discriminated unions resolve correctly on the backend. + */ +function ConstControl({ data, handleChange, path, schema }: ControlProps) { + const constValue = (schema as Record).const; + useEffect(() => { + if (constValue !== undefined && data !== constValue) { + handleChange(path, constValue); + } + }, [constValue, data, handleChange, path]); + return null; +} +const ConstRenderer = withJsonFormsControlProps(ConstControl); +const constEntry = { + tester: rankWith( + 10, + schemaMatches( + s => + s !== undefined && + 'const' in s && + !(s as Record).readOnly, + ), + ), + renderer: ConstRenderer, +}; + +/** + * Renderer for read-only fields (e.g. a fixed database that the admin locked). + * Renders a disabled input showing the current value. Also ensures the default + * value is injected into form data (like ConstControl does for hidden fields). + */ +function ReadOnlyControl({ + data, + handleChange, + path, + schema, + ...rest +}: ControlProps) { + const defaultValue = + (schema as Record).const ?? + (schema as Record).default; + useEffect(() => { + if (defaultValue !== undefined && data !== defaultValue) { + handleChange(path, defaultValue); + } + }, [defaultValue, data, handleChange, path]); + + return TextControl({ + ...rest, + data, + handleChange, + path, + schema, + enabled: false, + }); +} +const ReadOnlyRenderer = withJsonFormsControlProps(ReadOnlyControl); +const readOnlyEntry = { + tester: rankWith( + 11, + schemaMatches( + s => s !== undefined && (s as Record).readOnly === true, + ), + ), + renderer: ReadOnlyRenderer, +}; + +/** + * Checks whether all dependency values are filled (non-empty). + * Handles nested objects (like auth) by checking they have at least one key. + * + * Fields that have a `default` in the schema are considered satisfied even + * when the user has not explicitly touched them yet β€” JsonForms does not + * write default values into `data` until a field is interacted with, so + * without this fallback a field like `admin_host` (which ships with a + * sensible default) would permanently block the refresh. + */ +export function areDependenciesSatisfied( + dependencies: string[], + data: Record, + schema?: JsonSchema, +): boolean { + return dependencies.every(dep => { + const value = data[dep]; + if (value !== null && value !== undefined && value !== '') { + if (typeof value === 'object' && Object.keys(value).length === 0) + return false; + return true; + } + // Fall back to the schema default when the field hasn't been touched yet. + const defaultValue = schema?.properties?.[dep]?.default; + return ( + defaultValue !== null && defaultValue !== undefined && defaultValue !== '' + ); + }); +} + +/** + * Renderer for fields marked `x-dynamic` in the JSON Schema. + * Shows a loading spinner inside the input while the schema is being + * refreshed with dynamic values from the backend. + */ +function DynamicFieldControl(props: ControlProps) { + const { refreshingSchema, formData: cfgData } = props.config ?? {}; + const deps = (props.schema as Record)?.['x-dependsOn']; + const refreshing = + refreshingSchema && + Array.isArray(deps) && + areDependenciesSatisfied( + deps as string[], + (cfgData as Record) ?? {}, + props.rootSchema, + ); + + if (!refreshing) { + return TextControl(props); + } + + const uischema = { + ...props.uischema, + options: { + ...props.uischema.options, + placeholderText: t('Loading...'), + inputProps: { suffix: }, + }, + }; + return TextControl({ ...props, uischema, enabled: false }); +} +const DynamicFieldRenderer = withJsonFormsControlProps(DynamicFieldControl); +const dynamicFieldEntry = { + tester: rankWith( + 3, + and( + isStringControl, + schemaMatches( + s => (s as Record)?.['x-dynamic'] === true, + ), + ), + ), + renderer: DynamicFieldRenderer, +}; + +/** + * Renderer for fields that carry an ``x-enumNames`` array alongside their + * ``enum`` values. Renders as an Antd Select showing human-readable labels + * (from ``x-enumNames``) while storing the underlying enum values in form + * data. Used for MetricFlow's integer-ID fields (account, project, + * environment) where the backend provides both IDs and display names. + */ +function EnumNamesControl(props: ControlProps) { + const { refreshingSchema } = props.config ?? {}; + const schema = props.schema as Record; + const enumValues = (schema.enum as unknown[]) ?? []; + const enumNames = + (schema['x-enumNames'] as string[]) ?? enumValues.map(String); + + const options = enumValues.map((value, index) => ({ + value, + label: enumNames[index] ?? String(value), + })); + + const tooltip = (props.uischema?.options as Record) + ?.tooltip as string | undefined; + + return ( + + handleLayerChange(value as string)} + options={layers.map(l => ({ + value: l.uuid, + label: l.name, + }))} + getPopupContainer={() => document.body} + /> + + + {/* Loading runtime schema */} + {loadingRuntime && ( + + + + )} + + {/* Source location (runtime config fields) */} + {hasRuntimeFields && !loadingRuntime && ( + <> + {t('Source location')} + + + + + )} + + {/* Semantic Views β€” always visible once a layer is selected */} + {selectedLayerUuid && !loadingRuntime && ( + + ( + <> + - - - + + + - - - + + + - - - { - form.setFieldsValue({ isActive: checked }); - }} - /> - - - - - - + + + + + + + + ({ - value: role.id, - label: role.name, - }))} - getPopupContainer={trigger => - trigger.closest('.ant-modal-content') - } - /> - - - ({ + value: role.id, + label: role.name, + }))} + getPopupContainer={trigger => + trigger.closest('.ant-modal-content') + } + /> + + ({ - value: group.id, - label: group.name, - }))} - getPopupContainer={trigger => - trigger.closest('.ant-modal-content') - } - /> - - {!isEditMode && ( - <> - - +