mirror of
https://github.com/apache/superset.git
synced 2026-06-28 10:55:36 +00:00
Compare commits
168 Commits
adopt/line
...
chore/ci/s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c32284d56a | ||
|
|
6bc77fecc2 | ||
|
|
420a74b01e | ||
|
|
7ba59c2d79 | ||
|
|
b77c525d4b | ||
|
|
41ce9ca7d3 | ||
|
|
c2fb94cedf | ||
|
|
1d0866556f | ||
|
|
b4dfeef2fd | ||
|
|
0ec6cae45d | ||
|
|
d6ede99861 | ||
|
|
9b6d3ce775 | ||
|
|
c1f4062af6 | ||
|
|
3bc3f47d67 | ||
|
|
acb996a324 | ||
|
|
c1d08bf27c | ||
|
|
d3d5297025 | ||
|
|
b1470bd5a5 | ||
|
|
18fea37e84 | ||
|
|
1b71c105b7 | ||
|
|
b061b5d317 | ||
|
|
386893f9f2 | ||
|
|
c1787a67aa | ||
|
|
dee5859599 | ||
|
|
1d3daf2ac8 | ||
|
|
9d56b1721d | ||
|
|
67182e255c | ||
|
|
e2c6dc3e1a | ||
|
|
c539ae98ba | ||
|
|
ca3c420412 | ||
|
|
5e8a0c0244 | ||
|
|
90fa31f305 | ||
|
|
5731d0874a | ||
|
|
66f5ab2d2f | ||
|
|
36b0ed023b | ||
|
|
3ff90bd532 | ||
|
|
5d06438a07 | ||
|
|
eb0d4dd601 | ||
|
|
92109f0f99 | ||
|
|
9431381c3e | ||
|
|
b94f90e39e | ||
|
|
714c5cd075 | ||
|
|
c65c0951cf | ||
|
|
ae5c08b993 | ||
|
|
b9c61a079d | ||
|
|
2599bea0c2 | ||
|
|
6c70f3d275 | ||
|
|
da893462b8 | ||
|
|
18853c6ecf | ||
|
|
8768e5be0f | ||
|
|
133473d0f4 | ||
|
|
5916ec4876 | ||
|
|
36781fbf47 | ||
|
|
215b207ae4 | ||
|
|
3b46a5f121 | ||
|
|
416fa266d9 | ||
|
|
f70a2eac89 | ||
|
|
c49391ab08 | ||
|
|
0fbace5b5d | ||
|
|
c55c85f824 | ||
|
|
e34b7c2daf | ||
|
|
eac5bd23bd | ||
|
|
27a65257ee | ||
|
|
932bb2f154 | ||
|
|
4b87e03e7c | ||
|
|
2a7fadbd08 | ||
|
|
403e11e2ef | ||
|
|
d76b896c9c | ||
|
|
36632c20eb | ||
|
|
cb1694575c | ||
|
|
449bd69802 | ||
|
|
7340d06a05 | ||
|
|
b8aeecfc44 | ||
|
|
7128760d32 | ||
|
|
6118a01bc1 | ||
|
|
b7451cd16d | ||
|
|
4312d67775 | ||
|
|
55190b1da0 | ||
|
|
dc8f0d7b24 | ||
|
|
8b430caef4 | ||
|
|
f5dd28714d | ||
|
|
6d15876b13 | ||
|
|
3dd570cd9b | ||
|
|
e6fffe95c2 | ||
|
|
27d9bcb7bc | ||
|
|
f33c209f7a | ||
|
|
ba339fd9c1 | ||
|
|
defacc3237 | ||
|
|
b612f573d7 | ||
|
|
99ffaf3694 | ||
|
|
14d4432843 | ||
|
|
686beb9117 | ||
|
|
3aa1218f9b | ||
|
|
0d92d0dbb7 | ||
|
|
2d5df6625b | ||
|
|
d0a34d9372 | ||
|
|
b2e5f80db2 | ||
|
|
f1504611fd | ||
|
|
382a094795 | ||
|
|
334b13c3d9 | ||
|
|
9e130e5927 | ||
|
|
fe017d0b20 | ||
|
|
97659678f9 | ||
|
|
141f045104 | ||
|
|
919bd35028 | ||
|
|
be225e5c20 | ||
|
|
81b7f31096 | ||
|
|
045674ab3c | ||
|
|
061f61977f | ||
|
|
ffa98d03df | ||
|
|
bdf494d8b5 | ||
|
|
d32170b020 | ||
|
|
1467006427 | ||
|
|
e18cd1f50c | ||
|
|
9d3efb0aab | ||
|
|
cc9c20fcb6 | ||
|
|
f545d70647 | ||
|
|
e1be76e5fa | ||
|
|
55eb5699d5 | ||
|
|
4d5c171e9e | ||
|
|
a85796418a | ||
|
|
655395cb4e | ||
|
|
28f9b3786c | ||
|
|
25ad827ff3 | ||
|
|
afbbe44de2 | ||
|
|
79cfe4d9bc | ||
|
|
3eae8cd614 | ||
|
|
0c9ece65bb | ||
|
|
7040388ad1 | ||
|
|
a5ece52207 | ||
|
|
a7c0f4b83d | ||
|
|
0f05239260 | ||
|
|
60a7804193 | ||
|
|
4053f53c29 | ||
|
|
7837054dbc | ||
|
|
69c8f37c67 | ||
|
|
76e2418f1e | ||
|
|
b4e3452bfd | ||
|
|
188c84f1cd | ||
|
|
74ae5a45f9 | ||
|
|
fc61918364 | ||
|
|
3e811087de | ||
|
|
c218dc418b | ||
|
|
c98ed92303 | ||
|
|
84c32ec132 | ||
|
|
8636875b39 | ||
|
|
dde6974ac2 | ||
|
|
e36eb6f47c | ||
|
|
f6e12278dc | ||
|
|
43d5b6319b | ||
|
|
ae0b1f0308 | ||
|
|
4acb777a40 | ||
|
|
7e98410743 | ||
|
|
883b7a286d | ||
|
|
d9d8b2bcc0 | ||
|
|
9da54eff84 | ||
|
|
fb2b9fa8ff | ||
|
|
31797005db | ||
|
|
ca2d340db3 | ||
|
|
ef82da8458 | ||
|
|
fee1cf9f08 | ||
|
|
2d2a8f3ab0 | ||
|
|
a19093e65a | ||
|
|
b72a0a53c0 | ||
|
|
512b6f43c1 | ||
|
|
b18fab7fc1 | ||
|
|
b06c6b7464 | ||
|
|
bede4b2121 |
2
.github/actions/setup-backend/action.yml
vendored
2
.github/actions/setup-backend/action.yml
vendored
@@ -42,7 +42,7 @@ runs:
|
|||||||
fi
|
fi
|
||||||
echo "python-version=$RESOLVED_VERSION" >> "$GITHUB_OUTPUT"
|
echo "python-version=$RESOLVED_VERSION" >> "$GITHUB_OUTPUT"
|
||||||
- name: Set up Python ${{ steps.set-python-version.outputs.python-version }}
|
- name: Set up Python ${{ steps.set-python-version.outputs.python-version }}
|
||||||
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
||||||
with:
|
with:
|
||||||
python-version: ${{ steps.set-python-version.outputs.python-version }}
|
python-version: ${{ steps.set-python-version.outputs.python-version }}
|
||||||
cache: ${{ inputs.cache }}
|
cache: ${{ inputs.cache }}
|
||||||
|
|||||||
4
.github/workflows/bashlib.sh
vendored
4
.github/workflows/bashlib.sh
vendored
@@ -114,7 +114,7 @@ testdata() {
|
|||||||
say "::group::Load test data"
|
say "::group::Load test data"
|
||||||
# must specify PYTHONPATH to make `tests.superset_test_config` importable
|
# must specify PYTHONPATH to make `tests.superset_test_config` importable
|
||||||
export PYTHONPATH="$GITHUB_WORKSPACE"
|
export PYTHONPATH="$GITHUB_WORKSPACE"
|
||||||
pip install -e .
|
uv pip install --system -e .
|
||||||
superset db upgrade
|
superset db upgrade
|
||||||
superset load_test_users
|
superset load_test_users
|
||||||
superset load_examples --load-test-data
|
superset load_examples --load-test-data
|
||||||
@@ -127,7 +127,7 @@ playwright_testdata() {
|
|||||||
say "::group::Load all examples for Playwright tests"
|
say "::group::Load all examples for Playwright tests"
|
||||||
# must specify PYTHONPATH to make `tests.superset_test_config` importable
|
# must specify PYTHONPATH to make `tests.superset_test_config` importable
|
||||||
export PYTHONPATH="$GITHUB_WORKSPACE"
|
export PYTHONPATH="$GITHUB_WORKSPACE"
|
||||||
pip install -e .
|
uv pip install --system -e .
|
||||||
superset db upgrade
|
superset db upgrade
|
||||||
superset load_test_users
|
superset load_test_users
|
||||||
superset load_examples
|
superset load_examples
|
||||||
|
|||||||
4
.github/workflows/bump-python-package.yml
vendored
4
.github/workflows/bump-python-package.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
|||||||
checks: write
|
checks: write
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: true
|
persist-credentials: true
|
||||||
ref: master
|
ref: master
|
||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
uses: ./.github/actions/setup-supersetbot/
|
uses: ./.github/actions/setup-supersetbot/
|
||||||
|
|
||||||
- name: Set up Python ${{ inputs.python-version }}
|
- name: Set up Python ${{ inputs.python-version }}
|
||||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||||
with:
|
with:
|
||||||
python-version: "3.10"
|
python-version: "3.10"
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/check-python-deps.yml
vendored
2
.github/workflows/check-python-deps.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check and notify
|
- name: Check and notify
|
||||||
|
|||||||
5
.github/workflows/codeql-analysis.yml
vendored
5
.github/workflows/codeql-analysis.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
frontend: ${{ steps.check.outputs.frontend }}
|
frontend: ${{ steps.check.outputs.frontend }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -47,6 +47,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
actions: read
|
actions: read
|
||||||
contents: read
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
security-events: write
|
security-events: write
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
@@ -57,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/dependency-review.yml
vendored
6
.github/workflows/dependency-review.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout Repository"
|
- name: "Checkout Repository"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: "Dependency Review"
|
- name: "Dependency Review"
|
||||||
@@ -43,7 +43,7 @@ jobs:
|
|||||||
# the latest version. It's MIT: https://github.com/nbubna/store/blob/master/LICENSE-MIT
|
# the latest version. It's MIT: https://github.com/nbubna/store/blob/master/LICENSE-MIT
|
||||||
# pkg:npm/node-forge@1.3.1
|
# pkg:npm/node-forge@1.3.1
|
||||||
# selecting BSD-3-Clause licensing terms for node-forge to ensure compatibility with Apache
|
# selecting BSD-3-Clause licensing terms for node-forge to ensure compatibility with Apache
|
||||||
allow-dependencies-licenses: pkg:npm/store2@2.14.2, pkg:npm/node-forge@1.3.1, pkg:npm/rgbcolor, pkg:npm/jszip@3.10.1
|
allow-dependencies-licenses: pkg:npm/rgbcolor, pkg:npm/jszip@3.10.1
|
||||||
|
|
||||||
python-dependency-liccheck:
|
python-dependency-liccheck:
|
||||||
# NOTE: Configuration for liccheck lives in our pyproject.yml.
|
# NOTE: Configuration for liccheck lives in our pyproject.yml.
|
||||||
@@ -51,7 +51,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout Repository"
|
- name: "Checkout Repository"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
67
.github/workflows/docker.yml
vendored
67
.github/workflows/docker.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
|||||||
docker: ${{ steps.check.outputs.docker }}
|
docker: ${{ steps.check.outputs.docker }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -71,10 +71,28 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Free up disk space
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# Reclaim large preinstalled toolchains we don't use. The image
|
||||||
|
# build, and especially the docker-compose sanity check (which
|
||||||
|
# rebuilds from scratch whenever the registry cache image
|
||||||
|
# apache/superset-cache is unavailable), can otherwise exhaust the
|
||||||
|
# runner's root disk and fail with "no space left on device".
|
||||||
|
echo "Disk before cleanup:"; df -h /
|
||||||
|
sudo rm -rf \
|
||||||
|
/usr/share/dotnet \
|
||||||
|
/usr/local/lib/android \
|
||||||
|
/opt/ghc \
|
||||||
|
/usr/local/.ghcup \
|
||||||
|
/opt/hostedtoolcache/CodeQL \
|
||||||
|
/usr/local/share/boost || true
|
||||||
|
echo "Disk after cleanup:"; df -h /
|
||||||
|
|
||||||
- name: Setup Docker Environment
|
- name: Setup Docker Environment
|
||||||
uses: ./.github/actions/setup-docker
|
uses: ./.github/actions/setup-docker
|
||||||
with:
|
with:
|
||||||
@@ -101,13 +119,27 @@ jobs:
|
|||||||
PUSH_OR_LOAD="--load"
|
PUSH_OR_LOAD="--load"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
supersetbot docker \
|
# Retry to absorb transient Docker Hub registry errors (base-image
|
||||||
$PUSH_OR_LOAD \
|
# pull timeouts, 504/401 on push, ECONNRESET) that otherwise fail
|
||||||
--preset "$BUILD_PRESET" \
|
# the whole job. buildx reuses the buildkit layer cache from the
|
||||||
--context "$EVENT" \
|
# failed attempt, so a retry mostly re-does just the failed push.
|
||||||
--context-ref "$RELEASE" $FORCE_LATEST \
|
for attempt in 1 2 3; do
|
||||||
--extra-flags "--build-arg INCLUDE_CHROMIUM=false --tag $IMAGE_TAG" \
|
if supersetbot docker \
|
||||||
$PLATFORM_ARG
|
$PUSH_OR_LOAD \
|
||||||
|
--preset "$BUILD_PRESET" \
|
||||||
|
--context "$EVENT" \
|
||||||
|
--context-ref "$RELEASE" $FORCE_LATEST \
|
||||||
|
--extra-flags "--build-arg INCLUDE_CHROMIUM=false --tag $IMAGE_TAG" \
|
||||||
|
$PLATFORM_ARG; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -eq 3 ]; then
|
||||||
|
echo "::error::supersetbot docker build failed after 3 attempts"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "::warning::Build attempt ${attempt} failed; retrying in 30s..."
|
||||||
|
sleep 30
|
||||||
|
done
|
||||||
|
|
||||||
# in the context of push (using multi-platform build), we need to pull the image locally
|
# in the context of push (using multi-platform build), we need to pull the image locally
|
||||||
- name: Docker pull
|
- name: Docker pull
|
||||||
@@ -145,9 +177,24 @@ jobs:
|
|||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
- name: Free up disk space
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# The sanity check rebuilds the image from scratch whenever the
|
||||||
|
# registry cache image apache/superset-cache is unavailable, which
|
||||||
|
# can exhaust the runner's root disk ("no space left on device").
|
||||||
|
echo "Disk before cleanup:"; df -h /
|
||||||
|
sudo rm -rf \
|
||||||
|
/usr/share/dotnet \
|
||||||
|
/usr/local/lib/android \
|
||||||
|
/opt/ghc \
|
||||||
|
/usr/local/.ghcup \
|
||||||
|
/opt/hostedtoolcache/CodeQL \
|
||||||
|
/usr/local/share/boost || true
|
||||||
|
echo "Disk after cleanup:"; df -h /
|
||||||
- name: Setup Docker Environment
|
- name: Setup Docker Environment
|
||||||
uses: ./.github/actions/setup-docker
|
uses: ./.github/actions/setup-docker
|
||||||
with:
|
with:
|
||||||
|
|||||||
34
.github/workflows/embedded-sdk-release.yml
vendored
34
.github/workflows/embedded-sdk-release.yml
vendored
@@ -10,37 +10,29 @@ permissions:
|
|||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
config:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
outputs:
|
|
||||||
has-secrets: ${{ steps.check.outputs.has-secrets }}
|
|
||||||
steps:
|
|
||||||
- name: "Check for secrets"
|
|
||||||
id: check
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [ -n "${NPM_TOKEN}" ]; then
|
|
||||||
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
env:
|
|
||||||
NPM_TOKEN: ${{ (secrets.NPM_TOKEN != '') || '' }}
|
|
||||||
build:
|
build:
|
||||||
needs: config
|
# Publishing uses npm trusted publishing (OIDC), so there is no NPM_TOKEN to
|
||||||
if: needs.config.outputs.has-secrets
|
# gate on. Restrict to the canonical repo: forks cannot mint a valid OIDC
|
||||||
|
# token for this package and must not publish.
|
||||||
|
if: github.repository == 'apache/superset'
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write # required for npm trusted publishing (OIDC)
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: superset-embedded-sdk
|
working-directory: superset-embedded-sdk
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
# Note: registry-url is intentionally omitted. When set, actions/setup-node
|
||||||
|
# writes an .npmrc with `_authToken=${NODE_AUTH_TOKEN}` and a placeholder
|
||||||
|
# token, which makes npm attempt token auth and skip the OIDC
|
||||||
|
# trusted-publishing exchange. With no .npmrc auth line, npm authenticates
|
||||||
|
# via OIDC against the default registry (registry.npmjs.org).
|
||||||
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||||
with:
|
with:
|
||||||
node-version-file: "./superset-embedded-sdk/.nvmrc"
|
node-version-file: "./superset-embedded-sdk/.nvmrc"
|
||||||
registry-url: "https://registry.npmjs.org"
|
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: npm run ci:release
|
- run: npm run ci:release
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|||||||
2
.github/workflows/embedded-sdk-test.yml
vendored
2
.github/workflows/embedded-sdk-test.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: superset-embedded-sdk
|
working-directory: superset-embedded-sdk
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
|
||||||
|
|||||||
4
.github/workflows/generate-FOSSA-report.yml
vendored
4
.github/workflows/generate-FOSSA-report.yml
vendored
@@ -32,12 +32,12 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
|
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
|
||||||
with:
|
with:
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
java-version: "11"
|
java-version: "11"
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ jobs:
|
|||||||
security-events: write
|
security-events: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/issue_creation.yml
vendored
2
.github/workflows/issue_creation.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
issues: write
|
issues: write
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/latest-release-tag.yml
vendored
2
.github/workflows/latest-release-tag.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
4
.github/workflows/license-check.yml
vendored
4
.github/workflows/license-check.yml
vendored
@@ -18,12 +18,12 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
|
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
|
||||||
with:
|
with:
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
java-version: "11"
|
java-version: "11"
|
||||||
|
|||||||
2
.github/workflows/pr-lint.yml
vendored
2
.github/workflows/pr-lint.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
2
.github/workflows/pre-commit.yml
vendored
2
.github/workflows/pre-commit.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "previous", "next"]') }}
|
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "previous", "next"]') }}
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
# pulls all commits (needed for lerna / semantic release to correctly version)
|
# pulls all commits (needed for lerna / semantic release to correctly version)
|
||||||
|
|||||||
2
.github/workflows/showtime-trigger.yml
vendored
2
.github/workflows/showtime-trigger.yml
vendored
@@ -152,7 +152,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Checkout PR code (only if build needed)
|
- name: Checkout PR code (only if build needed)
|
||||||
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
|
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ steps.check.outputs.target_sha }}
|
ref: ${{ steps.check.outputs.target_sha }}
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|||||||
4
.github/workflows/superset-app-cli.yml
vendored
4
.github/workflows/superset-app-cli.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
|||||||
- 16379:6379
|
- 16379:6379
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -61,7 +61,7 @@ jobs:
|
|||||||
- name: superset init
|
- name: superset init
|
||||||
if: steps.check.outputs.python
|
if: steps.check.outputs.python
|
||||||
run: |
|
run: |
|
||||||
pip install -e .
|
uv pip install --system -e .
|
||||||
superset db upgrade
|
superset db upgrade
|
||||||
superset load_test_users
|
superset load_test_users
|
||||||
- name: superset load_examples
|
- name: superset load_examples
|
||||||
|
|||||||
4
.github/workflows/superset-docs-deploy.yml
vendored
4
.github/workflows/superset-docs-deploy.yml
vendored
@@ -60,7 +60,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.event.workflow_run.head_sha || github.sha }}"
|
- name: "Checkout ${{ github.event.workflow_run.head_sha || github.sha }}"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
|
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -71,7 +71,7 @@ jobs:
|
|||||||
node-version-file: "./docs/.nvmrc"
|
node-version-file: "./docs/.nvmrc"
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: ./.github/actions/setup-backend/
|
uses: ./.github/actions/setup-backend/
|
||||||
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
|
- uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
|
||||||
with:
|
with:
|
||||||
distribution: "zulu"
|
distribution: "zulu"
|
||||||
java-version: "21"
|
java-version: "21"
|
||||||
|
|||||||
6
.github/workflows/superset-docs-verify.yml
vendored
6
.github/workflows/superset-docs-verify.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
name: Link Checking
|
name: Link Checking
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
# Do not bump this linkinator-action version without opening
|
# Do not bump this linkinator-action version without opening
|
||||||
@@ -73,7 +73,7 @@ jobs:
|
|||||||
working-directory: docs
|
working-directory: docs
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -112,7 +112,7 @@ jobs:
|
|||||||
working-directory: docs
|
working-directory: docs
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout PR head: ${{ github.event.workflow_run.head_sha }}"
|
- name: "Checkout PR head: ${{ github.event.workflow_run.head_sha }}"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.workflow_run.head_sha }}
|
ref: ${{ github.event.workflow_run.head_sha }}
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|||||||
16
.github/workflows/superset-e2e.yml
vendored
16
.github/workflows/superset-e2e.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
|||||||
frontend: ${{ steps.check.outputs.frontend }}
|
frontend: ${{ steps.check.outputs.frontend }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -49,7 +49,7 @@ jobs:
|
|||||||
|
|
||||||
cypress-matrix:
|
cypress-matrix:
|
||||||
needs: changes
|
needs: changes
|
||||||
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true'
|
if: (needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true') && github.event.pull_request.draft == false
|
||||||
# Somehow one test flakes on 24.04 for unknown reasons, this is the only GHA left on 22.04
|
# Somehow one test flakes on 24.04 for unknown reasons, this is the only GHA left on 22.04
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
@@ -97,21 +97,21 @@ jobs:
|
|||||||
# Conditional checkout based on context
|
# Conditional checkout based on context
|
||||||
- name: Checkout for push or pull_request event
|
- name: Checkout for push or pull_request event
|
||||||
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||||
- name: Checkout using ref (workflow_dispatch)
|
- name: Checkout using ref (workflow_dispatch)
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
ref: ${{ github.event.inputs.ref }}
|
ref: ${{ github.event.inputs.ref }}
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Checkout using PR ID (workflow_dispatch)
|
- name: Checkout using PR ID (workflow_dispatch)
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
||||||
@@ -207,21 +207,21 @@ jobs:
|
|||||||
# Conditional checkout based on context (same as Cypress workflow)
|
# Conditional checkout based on context (same as Cypress workflow)
|
||||||
- name: Checkout for push or pull_request event
|
- name: Checkout for push or pull_request event
|
||||||
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||||
- name: Checkout using ref (workflow_dispatch)
|
- name: Checkout using ref (workflow_dispatch)
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
ref: ${{ github.event.inputs.ref }}
|
ref: ${{ github.event.inputs.ref }}
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Checkout using PR ID (workflow_dispatch)
|
- name: Checkout using PR ID (workflow_dispatch)
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ jobs:
|
|||||||
working-directory: superset-extensions-cli
|
working-directory: superset-extensions-cli
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
4
.github/workflows/superset-frontend.yml
vendored
4
.github/workflows/superset-frontend.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
|||||||
should-run: ${{ steps.check.outputs.frontend }}
|
should-run: ${{ steps.check.outputs.frontend }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -110,7 +110,7 @@ jobs:
|
|||||||
id-token: write
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|||||||
2
.github/workflows/superset-helm-lint.yml
vendored
2
.github/workflows/superset-helm-lint.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
2
.github/workflows/superset-helm-release.yml
vendored
2
.github/workflows/superset-helm-release.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.ref || github.ref_name }}
|
ref: ${{ inputs.ref || github.ref_name }}
|
||||||
persist-credentials: true
|
persist-credentials: true
|
||||||
|
|||||||
8
.github/workflows/superset-playwright.yml
vendored
8
.github/workflows/superset-playwright.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
|||||||
frontend: ${{ steps.check.outputs.frontend }}
|
frontend: ${{ steps.check.outputs.frontend }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -83,21 +83,21 @@ jobs:
|
|||||||
# Conditional checkout based on context (same as Cypress workflow)
|
# Conditional checkout based on context (same as Cypress workflow)
|
||||||
- name: Checkout for push or pull_request event
|
- name: Checkout for push or pull_request event
|
||||||
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||||
- name: Checkout using ref (workflow_dispatch)
|
- name: Checkout using ref (workflow_dispatch)
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
ref: ${{ github.event.inputs.ref }}
|
ref: ${{ github.event.inputs.ref }}
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Checkout using PR ID (workflow_dispatch)
|
- name: Checkout using PR ID (workflow_dispatch)
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
# Python integration tests
|
# Python integration tests
|
||||||
name: Python-Integration
|
name: Python-Integration
|
||||||
|
|
||||||
|
# Least-privilege default for GITHUB_TOKEN. Jobs that need more (e.g. OIDC for
|
||||||
|
# codecov uploads) opt in via their own job-level `permissions:` block.
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@@ -24,7 +29,7 @@ jobs:
|
|||||||
python: ${{ steps.check.outputs.python }}
|
python: ${{ steps.check.outputs.python }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -67,7 +72,7 @@ jobs:
|
|||||||
- 16379:6379
|
- 16379:6379
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -152,7 +157,7 @@ jobs:
|
|||||||
- 16379:6379
|
- 16379:6379
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -202,7 +207,7 @@ jobs:
|
|||||||
- 16379:6379
|
- 16379:6379
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
python: ${{ steps.check.outputs.python }}
|
python: ${{ steps.check.outputs.python }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -72,7 +72,7 @@ jobs:
|
|||||||
- 16379:6379
|
- 16379:6379
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -127,7 +127,7 @@ jobs:
|
|||||||
- 16379:6379
|
- 16379:6379
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -149,7 +149,7 @@ jobs:
|
|||||||
run: celery-worker
|
run: celery-worker
|
||||||
- name: Python unit tests (PostgreSQL)
|
- name: Python unit tests (PostgreSQL)
|
||||||
run: |
|
run: |
|
||||||
pip install -e .[hive]
|
uv pip install --system -e .[hive]
|
||||||
./scripts/python_tests.sh -m 'chart_data_flow or sql_json_flow'
|
./scripts/python_tests.sh -m 'chart_data_flow or sql_json_flow'
|
||||||
- name: Upload code coverage
|
- name: Upload code coverage
|
||||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
# Python unit tests
|
# Python unit tests
|
||||||
name: Python-Unit
|
name: Python-Unit
|
||||||
|
|
||||||
|
# Least-privilege default for GITHUB_TOKEN. Jobs that need more (e.g. OIDC for
|
||||||
|
# codecov uploads) opt in via their own job-level `permissions:` block.
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@@ -25,7 +30,7 @@ jobs:
|
|||||||
python: ${{ steps.check.outputs.python }}
|
python: ${{ steps.check.outputs.python }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
@@ -50,7 +55,7 @@ jobs:
|
|||||||
PYTHONPATH: ${{ github.workspace }}
|
PYTHONPATH: ${{ github.workspace }}
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
4
.github/workflows/superset-translations.yml
vendored
4
.github/workflows/superset-translations.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -61,7 +61,7 @@ jobs:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
2
.github/workflows/superset-websocket.yml
vendored
2
.github/workflows/superset-websocket.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
|||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
2
.github/workflows/supersetbot.yml
vendored
2
.github/workflows/supersetbot.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
|||||||
});
|
});
|
||||||
|
|
||||||
- name: "Checkout ( ${{ github.sha }} )"
|
- name: "Checkout ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
60
.github/workflows/sync-requirements-for-python-dep-upgrade-pr.yml
vendored
Normal file
60
.github/workflows/sync-requirements-for-python-dep-upgrade-pr.yml
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
name: Sync requirements for Python dependency PRs
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync-python-dep-requirements:
|
||||||
|
# This action is limited for (1) PRs authored by Dependabot and (2) upstream repo due to write back to remote
|
||||||
|
if: github.repository == 'apache/superset' && github.event.pull_request.user.login == 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false
|
||||||
|
runs-on: ubuntu-26.04
|
||||||
|
steps:
|
||||||
|
- name: Fetch Dependabot metadata
|
||||||
|
id: dependabot-metadata
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
BRANCH_NAME: ${{ github.head_ref }}
|
||||||
|
run: |
|
||||||
|
# Get current branch name, extract the package ecosystem and return as GHA step output
|
||||||
|
packageEcosystem=$(echo "$BRANCH_NAME" | cut -d'/' -f2)
|
||||||
|
echo "package-ecosystem=$packageEcosystem" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# zizmor: ignore[artipacked] - required persisted credentials to push synced requirement changes back to remote
|
||||||
|
- name: Checkout source code
|
||||||
|
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
|
||||||
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
persist-credentials: true
|
||||||
|
|
||||||
|
# Authenticate the Docker daemon so the python:slim pull in
|
||||||
|
# uv-pip-compile.sh uses our (much higher) authenticated rate limit
|
||||||
|
# instead of the shared-runner anonymous one.
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
|
||||||
|
continue-on-error: true
|
||||||
|
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Sync requirements in containerized environment
|
||||||
|
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
|
||||||
|
run: ./scripts/uv-pip-compile.sh
|
||||||
|
|
||||||
|
- name: Push changes to remote PRs
|
||||||
|
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
|
||||||
|
run: |
|
||||||
|
git config user.name 'github-actions[bot]'
|
||||||
|
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
|
||||||
|
git add requirements
|
||||||
|
git diff --cached --quiet && exit 0
|
||||||
|
git commit --signoff --message "build(deps): sync pinned requirements for Dependabot pip PRs"
|
||||||
|
git push origin "HEAD:refs/heads/${GITHUB_EVENT_PULL_REQUEST_HEAD_REF}"
|
||||||
|
env:
|
||||||
|
GITHUB_EVENT_PULL_REQUEST_HEAD_REF: ${{ github.event.pull_request.head.ref }}
|
||||||
4
.github/workflows/tag-release.yml
vendored
4
.github/workflows/tag-release.yml
vendored
@@ -54,7 +54,7 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -120,7 +120,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|||||||
2
.github/workflows/tech-debt.yml
vendored
2
.github/workflows/tech-debt.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
|||||||
name: Generate Reports
|
name: Generate Reports
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
@@ -50,3 +50,4 @@ under the License.
|
|||||||
- [4.1.4](./CHANGELOG/4.1.4.md)
|
- [4.1.4](./CHANGELOG/4.1.4.md)
|
||||||
- [5.0.0](./CHANGELOG/5.0.0.md)
|
- [5.0.0](./CHANGELOG/5.0.0.md)
|
||||||
- [6.0.0](./CHANGELOG/6.0.0.md)
|
- [6.0.0](./CHANGELOG/6.0.0.md)
|
||||||
|
- [6.1.0](./CHANGELOG/6.1.0.md)
|
||||||
|
|||||||
1563
CHANGELOG/6.1.0.md
Normal file
1563
CHANGELOG/6.1.0.md
Normal file
File diff suppressed because it is too large
Load Diff
17
Makefile
17
Makefile
@@ -23,11 +23,14 @@ PYTHON=`command -v python3.11 || command -v python3.10`
|
|||||||
install: superset pre-commit
|
install: superset pre-commit
|
||||||
|
|
||||||
superset:
|
superset:
|
||||||
|
# Bootstrap uv (the project's installer) into the active environment
|
||||||
|
pip install uv
|
||||||
|
|
||||||
# Install external dependencies
|
# Install external dependencies
|
||||||
pip install -r requirements/development.txt
|
uv pip install -r requirements/development.txt
|
||||||
|
|
||||||
# Install Superset in editable (development) mode
|
# Install Superset in editable (development) mode
|
||||||
pip install -e .
|
uv pip install -e .
|
||||||
|
|
||||||
# Create an admin user in your metadata database
|
# Create an admin user in your metadata database
|
||||||
superset fab create-admin \
|
superset fab create-admin \
|
||||||
@@ -52,11 +55,14 @@ superset:
|
|||||||
update: update-py update-js
|
update: update-py update-js
|
||||||
|
|
||||||
update-py:
|
update-py:
|
||||||
|
# Bootstrap uv (the project's installer) into the active environment
|
||||||
|
pip install uv
|
||||||
|
|
||||||
# Install external dependencies
|
# Install external dependencies
|
||||||
pip install -r requirements/development.txt
|
uv pip install -r requirements/development.txt
|
||||||
|
|
||||||
# Install Superset in editable (development) mode
|
# Install Superset in editable (development) mode
|
||||||
pip install -e .
|
uv pip install -e .
|
||||||
|
|
||||||
# Initialize the database
|
# Initialize the database
|
||||||
superset db upgrade
|
superset db upgrade
|
||||||
@@ -79,7 +85,8 @@ activate:
|
|||||||
|
|
||||||
pre-commit:
|
pre-commit:
|
||||||
# setup pre commit dependencies
|
# setup pre commit dependencies
|
||||||
pip3 install -r requirements/development.txt
|
pip install uv
|
||||||
|
uv pip install -r requirements/development.txt
|
||||||
pre-commit install
|
pre-commit install
|
||||||
|
|
||||||
format: py-format js-format
|
format: py-format js-format
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ categories:
|
|||||||
- name: Clark.de
|
- name: Clark.de
|
||||||
url: https://clark.de/
|
url: https://clark.de/
|
||||||
|
|
||||||
|
- name: Cover Genius
|
||||||
|
url: https://covergenius.com/
|
||||||
|
|
||||||
- name: EnquiryLabs
|
- name: EnquiryLabs
|
||||||
url: https://www.enquirylabs.co.uk
|
url: https://www.enquirylabs.co.uk
|
||||||
|
|
||||||
@@ -92,6 +95,10 @@ categories:
|
|||||||
- name: KarrotPay
|
- name: KarrotPay
|
||||||
url: https://www.daangnpay.com/
|
url: https://www.daangnpay.com/
|
||||||
|
|
||||||
|
- name: NICE Actimize
|
||||||
|
url: https://www.niceactimize.com/
|
||||||
|
contributors: ["@stevensuting"]
|
||||||
|
|
||||||
- name: Remita
|
- name: Remita
|
||||||
url: https://remita.net
|
url: https://remita.net
|
||||||
contributors: ["@mujibishola"]
|
contributors: ["@mujibishola"]
|
||||||
@@ -112,9 +119,6 @@ categories:
|
|||||||
url: https://xendit.co/
|
url: https://xendit.co/
|
||||||
contributors: ["@LieAlbertTriAdrian"]
|
contributors: ["@LieAlbertTriAdrian"]
|
||||||
|
|
||||||
- name: Cover Genius
|
|
||||||
url: https://covergenius.com/
|
|
||||||
|
|
||||||
Gaming:
|
Gaming:
|
||||||
- name: Popoko VM Games Studio
|
- name: Popoko VM Games Studio
|
||||||
url: https://popoko.live
|
url: https://popoko.live
|
||||||
@@ -296,7 +300,6 @@ categories:
|
|||||||
logo: hifadih.png
|
logo: hifadih.png
|
||||||
contributors: ["@saintLaurent00"]
|
contributors: ["@saintLaurent00"]
|
||||||
|
|
||||||
# Logo approved by @anmol-hpe on behalf of HPE
|
|
||||||
- name: HPE
|
- name: HPE
|
||||||
url: https://www.hpe.com/in/en/home.html
|
url: https://www.hpe.com/in/en/home.html
|
||||||
logo: hpe.png
|
logo: hpe.png
|
||||||
@@ -396,6 +399,10 @@ categories:
|
|||||||
url: https://www.techaudit.info
|
url: https://www.techaudit.info
|
||||||
contributors: ["@ETselikov"]
|
contributors: ["@ETselikov"]
|
||||||
|
|
||||||
|
- name: Tech Solution
|
||||||
|
url: https://www.tech-solution.com.ar/
|
||||||
|
contributors: ["@danteGiuliano", "@LeandroVallejos", "@McJaben", "@xJeree", "@zeo-return-null"]
|
||||||
|
|
||||||
- name: Tenable
|
- name: Tenable
|
||||||
url: https://www.tenable.com
|
url: https://www.tenable.com
|
||||||
contributors: ["@dflionis"]
|
contributors: ["@dflionis"]
|
||||||
@@ -425,6 +432,10 @@ categories:
|
|||||||
logo: userguiding.svg
|
logo: userguiding.svg
|
||||||
contributors: ["@tzercin"]
|
contributors: ["@tzercin"]
|
||||||
|
|
||||||
|
- name: Value Ad
|
||||||
|
url: https://bestpair.info/
|
||||||
|
contributors: ["@stevensuting"]
|
||||||
|
|
||||||
- name: Virtuoso QA
|
- name: Virtuoso QA
|
||||||
url: https://www.virtuosoqa.com
|
url: https://www.virtuosoqa.com
|
||||||
|
|
||||||
@@ -509,10 +520,6 @@ categories:
|
|||||||
url: https://www.sunbird.org/
|
url: https://www.sunbird.org/
|
||||||
contributors: ["@eksteporg"]
|
contributors: ["@eksteporg"]
|
||||||
|
|
||||||
- name: The GRAPH Network
|
|
||||||
url: https://thegraphnetwork.org/
|
|
||||||
contributors: ["@fccoelho"]
|
|
||||||
|
|
||||||
- name: Udemy
|
- name: Udemy
|
||||||
url: https://www.udemy.com/
|
url: https://www.udemy.com/
|
||||||
contributors: ["@sungjuly"]
|
contributors: ["@sungjuly"]
|
||||||
@@ -521,7 +528,24 @@ categories:
|
|||||||
url: https://www.vipkid.com.cn/
|
url: https://www.vipkid.com.cn/
|
||||||
contributors: ["@illpanda"]
|
contributors: ["@illpanda"]
|
||||||
|
|
||||||
- name: WikiMedia Foundation
|
Social Organization:
|
||||||
|
- name: Living Goods
|
||||||
|
url: https://www.livinggoods.org
|
||||||
|
contributors: ["@chelule"]
|
||||||
|
|
||||||
|
- name: One Acre Fund
|
||||||
|
url: https://oneacrefund.org/
|
||||||
|
contributors: ["@stevensuting"]
|
||||||
|
|
||||||
|
- name: Quest Alliance
|
||||||
|
url: https://www.questalliance.net/
|
||||||
|
contributors: ["@stevensuting"]
|
||||||
|
|
||||||
|
- name: The GRAPH Network
|
||||||
|
url: https://thegraphnetwork.org/
|
||||||
|
contributors: ["@fccoelho"]
|
||||||
|
|
||||||
|
- name: Wikimedia Foundation
|
||||||
url: https://wikimediafoundation.org
|
url: https://wikimediafoundation.org
|
||||||
contributors: ["@vg"]
|
contributors: ["@vg"]
|
||||||
|
|
||||||
@@ -534,6 +558,10 @@ categories:
|
|||||||
url: https://www.douroeci.com/
|
url: https://www.douroeci.com/
|
||||||
contributors: ["@nunohelibeires"]
|
contributors: ["@nunohelibeires"]
|
||||||
|
|
||||||
|
- name: Rogow
|
||||||
|
url: https://rogow.com.br/
|
||||||
|
contributors: ["@nilmonto"]
|
||||||
|
|
||||||
- name: Safaricom
|
- name: Safaricom
|
||||||
url: https://www.safaricom.co.ke/
|
url: https://www.safaricom.co.ke/
|
||||||
contributors: ["@mmutiso"]
|
contributors: ["@mmutiso"]
|
||||||
@@ -546,11 +574,10 @@ categories:
|
|||||||
url: https://wattbewerb.de/
|
url: https://wattbewerb.de/
|
||||||
contributors: ["@wattbewerb"]
|
contributors: ["@wattbewerb"]
|
||||||
|
|
||||||
- name: Rogow
|
|
||||||
url: https://rogow.com.br/
|
|
||||||
contributors: ["@nilmonto"]
|
|
||||||
|
|
||||||
Healthcare:
|
Healthcare:
|
||||||
|
- name: 2070Health
|
||||||
|
url: https://2070health.com/
|
||||||
|
|
||||||
- name: Amino
|
- name: Amino
|
||||||
url: https://amino.com
|
url: https://amino.com
|
||||||
contributors: ["@shkr"]
|
contributors: ["@shkr"]
|
||||||
@@ -563,10 +590,6 @@ categories:
|
|||||||
url: https://www.getcare.io/
|
url: https://www.getcare.io/
|
||||||
contributors: ["@alandao2021"]
|
contributors: ["@alandao2021"]
|
||||||
|
|
||||||
- name: Living Goods
|
|
||||||
url: https://www.livinggoods.org
|
|
||||||
contributors: ["@chelule"]
|
|
||||||
|
|
||||||
- name: Maieutical Labs
|
- name: Maieutical Labs
|
||||||
url: https://maieuticallabs.it
|
url: https://maieuticallabs.it
|
||||||
contributors: ["@xrmx"]
|
contributors: ["@xrmx"]
|
||||||
@@ -585,10 +608,10 @@ categories:
|
|||||||
- name: WeSure
|
- name: WeSure
|
||||||
url: https://www.wesure.cn/
|
url: https://www.wesure.cn/
|
||||||
|
|
||||||
- name: 2070Health
|
|
||||||
url: https://2070health.com/
|
|
||||||
|
|
||||||
HR / Staffing:
|
HR / Staffing:
|
||||||
|
- name: bluquist
|
||||||
|
url: https://bluquist.com/
|
||||||
|
|
||||||
- name: Swile
|
- name: Swile
|
||||||
url: https://www.swile.co/
|
url: https://www.swile.co/
|
||||||
contributors: ["@PaoloTerzi"]
|
contributors: ["@PaoloTerzi"]
|
||||||
@@ -596,21 +619,18 @@ categories:
|
|||||||
- name: Symmetrics
|
- name: Symmetrics
|
||||||
url: https://www.symmetrics.fyi
|
url: https://www.symmetrics.fyi
|
||||||
|
|
||||||
- name: bluquist
|
|
||||||
url: https://bluquist.com/
|
|
||||||
|
|
||||||
Government:
|
Government:
|
||||||
- name: City of Ann Arbor, MI
|
- name: City of Ann Arbor, MI
|
||||||
url: https://www.a2gov.org/
|
url: https://www.a2gov.org/
|
||||||
contributors: ["@sfirke"]
|
contributors: ["@sfirke"]
|
||||||
|
|
||||||
|
- name: NRLM - Sarathi, India
|
||||||
|
url: https://pib.gov.in/PressReleasePage.aspx?PRID=1999586
|
||||||
|
|
||||||
- name: RIS3 Strategy of CZ, MIT CR
|
- name: RIS3 Strategy of CZ, MIT CR
|
||||||
url: https://www.ris3.cz/
|
url: https://www.ris3.cz/
|
||||||
contributors: ["@RIS3CZ"]
|
contributors: ["@RIS3CZ"]
|
||||||
|
|
||||||
- name: NRLM - Sarathi, India
|
|
||||||
url: https://pib.gov.in/PressReleasePage.aspx?PRID=1999586
|
|
||||||
|
|
||||||
Mobile Software:
|
Mobile Software:
|
||||||
- name: VLMedia
|
- name: VLMedia
|
||||||
url: https://www.vlmedia.com.tr
|
url: https://www.vlmedia.com.tr
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ assists people when migrating to a new version.
|
|||||||
|
|
||||||
## Next
|
## Next
|
||||||
|
|
||||||
|
### Pivot table First/Last aggregations follow data order
|
||||||
|
|
||||||
|
The pivot table chart's `First` and `Last` aggregations now return the first and last value in data (query result) order, instead of effectively returning the minimum and maximum. Existing pivot tables that use these aggregations for totals/subtotals may show different values after upgrading. For deterministic results, ensure the underlying query has a stable sort order.
|
||||||
|
|
||||||
### `thumbnail_url` removed from dashboard list API response
|
### `thumbnail_url` removed from dashboard list API response
|
||||||
|
|
||||||
The `thumbnail_url` field has been removed from `GET /api/v1/dashboard/` list responses. External consumers relying on this field must now construct the thumbnail URL client-side using `id` and `changed_on_utc`:
|
The `thumbnail_url` field has been removed from `GET /api/v1/dashboard/` list responses. External consumers relying on this field must now construct the thumbnail URL client-side using `id` and `changed_on_utc`:
|
||||||
@@ -223,6 +227,9 @@ Added a new combined datasource list endpoint at `GET /api/v1/datasource/` to se
|
|||||||
- The endpoint is available to users with at least one of `can_read` on `Dataset` or `SemanticView`.
|
- 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.
|
- 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.
|
- The endpoint enforces strict `order_column` validation and returns `400` for invalid sort columns.
|
||||||
|
|
||||||
|
## 6.1.0
|
||||||
|
|
||||||
### ClickHouse minimum driver version bump
|
### 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.
|
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.
|
||||||
|
|||||||
@@ -72,20 +72,23 @@ services:
|
|||||||
- -c
|
- -c
|
||||||
- |
|
- |
|
||||||
url="http://host.docker.internal:9000/static/assets/manifest.json"
|
url="http://host.docker.internal:9000/static/assets/manifest.json"
|
||||||
max_attempts=150 # ~5 minutes at 2s intervals
|
max_attempts=300 # ~10 minutes at 2s intervals; first build can be slow
|
||||||
echo "Waiting for webpack dev server at $url..."
|
echo "Waiting for webpack dev server at $$url..."
|
||||||
attempt=0
|
attempt=0
|
||||||
until curl -sf --max-time 5 -o /dev/null "$url"; do
|
until curl -sf --max-time 5 -H "Host: localhost" -o /dev/null "$$url"; do
|
||||||
attempt=$((attempt + 1))
|
attempt=$$((attempt + 1))
|
||||||
if [ "$attempt" -ge "$max_attempts" ]; then
|
if [ "$$attempt" -ge "$$max_attempts" ]; then
|
||||||
echo "ERROR: webpack dev server did not serve $url after $max_attempts attempts (~5 minutes)." >&2
|
echo "ERROR: webpack dev server did not serve $$url after $$max_attempts attempts." >&2
|
||||||
echo "Is the dev server running? With BUILD_SUPERSET_FRONTEND_IN_DOCKER=false you must start it on the host (e.g. 'npm run dev' in superset-frontend)." >&2
|
echo "Is the dev server running? With BUILD_SUPERSET_FRONTEND_IN_DOCKER=false you must start it on the host (e.g. 'npm run dev' in superset-frontend)." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [ $$((attempt % 15)) -eq 0 ]; then
|
||||||
|
echo "Still waiting for webpack dev server... ($$attempt/$$max_attempts)"
|
||||||
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
echo "Webpack dev server is ready; starting nginx."
|
echo "Webpack dev server is ready; starting nginx."
|
||||||
exec nginx -g 'daemon off;'
|
exec /docker-entrypoint.sh nginx -g 'daemon off;'
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:7
|
image: redis:7
|
||||||
|
|||||||
@@ -81,17 +81,19 @@ case "${1}" in
|
|||||||
app)
|
app)
|
||||||
echo "Starting web app (using development server)..."
|
echo "Starting web app (using development server)..."
|
||||||
|
|
||||||
# Environment-based debugger control for security
|
# Default to Flask debug mode in this dev compose entrypoint so the Talisman
|
||||||
# Only enable Werkzeug interactive debugger when explicitly requested
|
# dev CSP (which permits 'unsafe-eval' required by React Refresh / HMR) is
|
||||||
# Modern Werkzeug (3.0+) includes PIN protection, but defense-in-depth approach
|
# served. Operators can still set FLASK_DEBUG=false in docker/.env-local
|
||||||
# Override FLASK_DEBUG so the effective state matches SUPERSET_DEBUG_ENABLED even
|
# to exercise the production-like CSP and error handling.
|
||||||
# when FLASK_DEBUG=true is inherited from docker/.env or .flaskenv
|
: "${FLASK_DEBUG:=1}"
|
||||||
|
export FLASK_DEBUG
|
||||||
|
|
||||||
|
# Werkzeug's interactive debugger (/console) is a separate, security-sensitive
|
||||||
|
# feature and must be opted into explicitly via SUPERSET_DEBUG_ENABLED=true.
|
||||||
if [[ "${SUPERSET_DEBUG_ENABLED:-}" == "true" ]]; then
|
if [[ "${SUPERSET_DEBUG_ENABLED:-}" == "true" ]]; then
|
||||||
export FLASK_DEBUG=1
|
|
||||||
DEBUGGER_FLAG="--debugger"
|
DEBUGGER_FLAG="--debugger"
|
||||||
echo " ⚠️ Werkzeug debugger enabled (requires PIN for /console access)"
|
echo " ⚠️ Werkzeug debugger enabled (requires PIN for /console access)"
|
||||||
else
|
else
|
||||||
export FLASK_DEBUG=0
|
|
||||||
DEBUGGER_FLAG="--no-debugger"
|
DEBUGGER_FLAG="--no-debugger"
|
||||||
echo " 🔒 Werkzeug debugger disabled (set SUPERSET_DEBUG_ENABLED=true to enable)"
|
echo " 🔒 Werkzeug debugger disabled (set SUPERSET_DEBUG_ENABLED=true to enable)"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
HYPHEN_SYMBOL='-'
|
HYPHEN_SYMBOL='-'
|
||||||
|
|
||||||
gunicorn \
|
exec gunicorn \
|
||||||
--bind "${SUPERSET_BIND_ADDRESS:-0.0.0.0}:${SUPERSET_PORT:-8088}" \
|
--bind "${SUPERSET_BIND_ADDRESS:-0.0.0.0}:${SUPERSET_PORT:-8088}" \
|
||||||
--access-logfile "${ACCESS_LOG_FILE:-$HYPHEN_SYMBOL}" \
|
--access-logfile "${ACCESS_LOG_FILE:-$HYPHEN_SYMBOL}" \
|
||||||
--error-logfile "${ERROR_LOG_FILE:-$HYPHEN_SYMBOL}" \
|
--error-logfile "${ERROR_LOG_FILE:-$HYPHEN_SYMBOL}" \
|
||||||
|
|||||||
@@ -455,6 +455,51 @@ def FLASK_APP_MUTATOR(app: Flask) -> None:
|
|||||||
app.before_request_funcs.setdefault(None, []).append(make_session_permanent)
|
app.before_request_funcs.setdefault(None, []).append(make_session_permanent)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Customizing the landing page (index view)
|
||||||
|
|
||||||
|
The page served at `/` is rendered by an index view. By default Superset registers
|
||||||
|
`SupersetIndexView`, which redirects to `/superset/welcome/` and also adds the
|
||||||
|
`/lang/<locale>` locale handler. You can replace it with your own view, for example
|
||||||
|
to send users straight to a specific dashboard or to a chart list.
|
||||||
|
|
||||||
|
Set `FAB_INDEX_VIEW` to the **importable dotted path** of your view class. Flask-AppBuilder
|
||||||
|
resolves this during app initialization and uses it in place of the default:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# my_overrides.py — must be importable on the PYTHONPATH
|
||||||
|
from flask import redirect
|
||||||
|
from superset.initialization import SupersetIndexView
|
||||||
|
from superset.superset_typing import FlaskResponse
|
||||||
|
from flask_appbuilder import expose
|
||||||
|
|
||||||
|
|
||||||
|
class MyIndexView(SupersetIndexView):
|
||||||
|
@expose("/")
|
||||||
|
def index(self) -> FlaskResponse:
|
||||||
|
return redirect("/chart/list/")
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# superset_config.py
|
||||||
|
FAB_INDEX_VIEW = "my_overrides.MyIndexView"
|
||||||
|
```
|
||||||
|
|
||||||
|
A few things that commonly trip people up:
|
||||||
|
|
||||||
|
- **Subclass `SupersetIndexView`, not Flask-AppBuilder's bare `IndexView`.** Subclassing
|
||||||
|
keeps Superset's `/lang/<locale>` locale handling; replacing it with a bare `IndexView`
|
||||||
|
silently drops that behavior.
|
||||||
|
- **The class must be importable as a real module.** `FAB_INDEX_VIEW` is resolved by
|
||||||
|
importing the dotted path, which is independent of how `superset_config.py` itself is
|
||||||
|
loaded. Superset only copies **uppercase** names out of `superset_config.py` into its
|
||||||
|
runtime config, so a `FAB_INDEX_VIEW = "superset_config.MyIndexView"` reference only works
|
||||||
|
if `superset_config` is itself importable by that name on the `PYTHONPATH`. If you load
|
||||||
|
config via `SUPERSET_CONFIG_PATH` (an arbitrary file path), put the view in a separate
|
||||||
|
importable module instead and reference that module.
|
||||||
|
- **Don't set `appbuilder.indexview` from `FLASK_APP_MUTATOR`.** The mutator runs after
|
||||||
|
routes are already registered, so the assignment has no effect on the `/` route. Use
|
||||||
|
`FAB_INDEX_VIEW` instead.
|
||||||
|
|
||||||
## Feature Flags
|
## Feature Flags
|
||||||
|
|
||||||
To support a diverse set of users, Superset has some features that are not enabled by default. For
|
To support a diverse set of users, Superset has some features that are not enabled by default. For
|
||||||
|
|||||||
@@ -22,31 +22,24 @@ level dependencies.
|
|||||||
|
|
||||||
**Debian and Ubuntu**
|
**Debian and Ubuntu**
|
||||||
|
|
||||||
Ubuntu **24.04** uses python 3.12 per default, which currently is not supported by Superset. You need to add a second python installation of 3.11 and install the required additional dependencies.
|
The following command will ensure that the required dependencies are installed (tested on Ubuntu 20.04, 22.04, and 24.04):
|
||||||
```bash
|
|
||||||
sudo add-apt-repository ppa:deadsnakes/ppa
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install python3.11 python3.11-dev python3.11-venv build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev default-libmysqlclient-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
In Ubuntu **20.04 and 22.04** the following command will ensure that the required dependencies are installed:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev python3-pip libsasl2-dev libldap2-dev default-libmysqlclient-dev
|
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev python3-pip python3-venv libsasl2-dev libldap2-dev libpq-dev default-libmysqlclient-dev pkg-config
|
||||||
```
|
```
|
||||||
|
|
||||||
In Ubuntu **before 20.04** the following command will ensure that the required dependencies are installed:
|
Refer to the
|
||||||
|
[pyproject.toml](https://github.com/apache/superset/blob/master/pyproject.toml) file for the list of
|
||||||
```bash
|
Python versions officially supported by Superset, and install a matching `python3` interpreter for
|
||||||
sudo apt-get install build-essential libssl-dev libffi-dev python-dev python-pip libsasl2-dev libldap2-dev default-libmysqlclient-dev
|
your distribution. The `libpq-dev` package is only needed if you intend to connect to (or use) a
|
||||||
```
|
PostgreSQL database; you can omit it otherwise.
|
||||||
|
|
||||||
**Fedora and RHEL-derivative Linux distributions**
|
**Fedora and RHEL-derivative Linux distributions**
|
||||||
|
|
||||||
Install the following packages using the `yum` package manager:
|
Install the following packages using the `yum` package manager:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo yum install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel cyrus-sasl-devel openldap-devel
|
sudo yum install gcc gcc-c++ libffi-devel python3-devel python3-pip python3-wheel openssl-devel cyrus-sasl-devel openldap-devel
|
||||||
```
|
```
|
||||||
|
|
||||||
In more recent versions of CentOS and Fedora, you may need to install a slightly different set of packages using `dnf`:
|
In more recent versions of CentOS and Fedora, you may need to install a slightly different set of packages using `dnf`:
|
||||||
|
|||||||
@@ -28,14 +28,19 @@
|
|||||||
# Skip builds when no docs changes (exit 0 = skip, non-zero = build).
|
# Skip builds when no docs changes (exit 0 = skip, non-zero = build).
|
||||||
# Checks for changes in docs/ and README.md (which gets pulled into docs).
|
# Checks for changes in docs/ and README.md (which gets pulled into docs).
|
||||||
#
|
#
|
||||||
# $CACHED_COMMIT_REF is the last *deployed* commit. On a PR's first build it
|
# $CACHED_COMMIT_REF is the last *deployed* commit; it is set on incremental
|
||||||
# is empty, so the original `git diff` errored and Netlify fell back to
|
# builds (notably the master production deploy) and empty on a context's
|
||||||
# building -- which is why every PR built a docs preview once even with no
|
# first build (every deploy preview). The production path diffs against it
|
||||||
# docs changes. When it is empty we instead diff the whole branch against its
|
# and skips correctly.
|
||||||
# merge-base with master, so non-docs PRs are skipped from the very first
|
#
|
||||||
# build. Subsequent builds (and the master production build) keep the cheaper
|
# Deploy previews need different handling: Netlify checks out a *merge*
|
||||||
# incremental $CACHED_COMMIT_REF diff. Any failure exits non-zero -> build.
|
# commit, so $COMMIT_REF (the PR head SHA) is frequently not resolvable in
|
||||||
ignore = 'if [ -n "$CACHED_COMMIT_REF" ]; then git diff --quiet "$CACHED_COMMIT_REF" "$COMMIT_REF" -- . ../README.md; else git fetch origin master --depth=100 >/dev/null 2>&1; git diff --quiet "$(git merge-base origin/master "$COMMIT_REF" 2>/dev/null || echo origin/master)" "$COMMIT_REF" -- . ../README.md; fi'
|
# the clone, and on a shallow clone `git merge-base` can fail too -- so the
|
||||||
|
# previous logic fell through to a build on every PR, even non-docs ones.
|
||||||
|
# Instead, always diff the checked-out HEAD against its merge-base with
|
||||||
|
# master, deepening the shallow clone until that merge-base resolves. If it
|
||||||
|
# genuinely can't be determined, exit non-zero to build (fail safe).
|
||||||
|
ignore = 'if [ -n "$CACHED_COMMIT_REF" ]; then git diff --quiet "$CACHED_COMMIT_REF" HEAD -- . ../README.md; else git fetch --no-tags origin master >/dev/null 2>&1 || true; i=0; while [ "$i" -lt 10 ] && ! git merge-base origin/master HEAD >/dev/null 2>&1; do git fetch --deepen=200 origin master >/dev/null 2>&1 || break; i=$((i+1)); done; BASE="$(git merge-base origin/master HEAD 2>/dev/null || true)"; if [ -z "$BASE" ]; then exit 1; fi; git diff --quiet "$BASE" HEAD -- . ../README.md; fi'
|
||||||
|
|
||||||
[build.environment]
|
[build.environment]
|
||||||
# Node version matching docs/.nvmrc
|
# Node version matching docs/.nvmrc
|
||||||
|
|||||||
@@ -71,9 +71,9 @@
|
|||||||
"@storybook/theming": "^8.6.15",
|
"@storybook/theming": "^8.6.15",
|
||||||
"@superset-ui/core": "^0.20.4",
|
"@superset-ui/core": "^0.20.4",
|
||||||
"@swc/core": "^1.15.41",
|
"@swc/core": "^1.15.41",
|
||||||
"antd": "^6.4.3",
|
"antd": "^6.4.4",
|
||||||
"baseline-browser-mapping": "^2.10.35",
|
"baseline-browser-mapping": "^2.10.37",
|
||||||
"caniuse-lite": "^1.0.30001797",
|
"caniuse-lite": "^1.0.30001799",
|
||||||
"docusaurus-plugin-openapi-docs": "^5.0.2",
|
"docusaurus-plugin-openapi-docs": "^5.0.2",
|
||||||
"docusaurus-theme-openapi-docs": "^5.0.2",
|
"docusaurus-theme-openapi-docs": "^5.0.2",
|
||||||
"js-yaml": "^4.2.0",
|
"js-yaml": "^4.2.0",
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
"globals": "^17.6.0",
|
"globals": "^17.6.0",
|
||||||
"prettier": "^3.8.4",
|
"prettier": "^3.8.4",
|
||||||
"typescript": "~6.0.3",
|
"typescript": "~6.0.3",
|
||||||
"typescript-eslint": "^8.61.0",
|
"typescript-eslint": "^8.61.1",
|
||||||
"webpack": "^5.107.2"
|
"webpack": "^5.107.2"
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
|
|||||||
@@ -1808,6 +1808,10 @@ If you enable DML in the meta database users will be able to run DML queries on
|
|||||||
|
|
||||||
Second, you might want to change the value of `SUPERSET_META_DB_LIMIT`. The default value is 1000, and defines how many are read from each database before any aggregations and joins are executed. You can also set this value `None` if you only have small tables.
|
Second, you might want to change the value of `SUPERSET_META_DB_LIMIT`. The default value is 1000, and defines how many are read from each database before any aggregations and joins are executed. You can also set this value `None` if you only have small tables.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
`SUPERSET_META_DB_LIMIT` is applied to **each** underlying table *before* the in-memory join runs, not to the final result. If any table involved in a join has more rows than the limit, the meta database will read only the first `SUPERSET_META_DB_LIMIT` rows of that table, which means matching rows can be silently dropped and the join can return **incomplete or even empty** results with no error. If you join tables larger than the limit, raise `SUPERSET_META_DB_LIMIT` to comfortably exceed your largest joined table, or set it to `None` when working only with small tables, to get correct results.
|
||||||
|
:::
|
||||||
|
|
||||||
Additionally, you might want to restrict the databases to with the meta database has access to. This can be done in the database configuration, under "Advanced" -> "Other" -> "ENGINE PARAMETERS" and adding:
|
Additionally, you might want to restrict the databases to with the meta database has access to. This can be done in the database configuration, under "Advanced" -> "Other" -> "ENGINE PARAMETERS" and adding:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
|
|||||||
407
docs/yarn.lock
407
docs/yarn.lock
@@ -212,7 +212,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz"
|
resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz"
|
||||||
integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==
|
integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==
|
||||||
|
|
||||||
"@ant-design/icons@^6.2.3", "@ant-design/icons@^6.2.5":
|
"@ant-design/icons@^6.2.5":
|
||||||
version "6.2.5"
|
version "6.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-6.2.5.tgz#31c142aa6ce5eaf99598aaead222f4c459693512"
|
resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-6.2.5.tgz#31c142aa6ce5eaf99598aaead222f4c459693512"
|
||||||
integrity sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==
|
integrity sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==
|
||||||
@@ -3162,21 +3162,21 @@
|
|||||||
resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz"
|
resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz"
|
||||||
integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==
|
integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==
|
||||||
|
|
||||||
"@rc-component/async-validator@^5.1.0":
|
"@rc-component/async-validator@^6.0.0":
|
||||||
version "5.1.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz"
|
resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-6.0.0.tgz#1c20b8864f69bac63b7876b1321697c2ea71c68d"
|
||||||
integrity sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==
|
integrity sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.24.4"
|
"@babel/runtime" "^7.24.4"
|
||||||
|
|
||||||
"@rc-component/cascader@~1.15.0":
|
"@rc-component/cascader@~1.16.1":
|
||||||
version "1.15.0"
|
version "1.16.1"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/cascader/-/cascader-1.15.0.tgz#554cba8e01e94a1288547cec96422b2cfc73ff40"
|
resolved "https://registry.yarnpkg.com/@rc-component/cascader/-/cascader-1.16.1.tgz#94193ee55009219999a46e005a0f8589c8c021a2"
|
||||||
integrity sha512-ZzpMtwFCRo3fbXHuDnncARJMZQjdqA2w7aDuPofNQt+aDx39st1hgfIpEwTBLhe2Hqsvs/zOr8RTtgxTkCPySw==
|
integrity sha512-wxLopwM+EBed0zNNGdnGE4coYoqcO+XD42fHgn+pDvO+XzhNFbdgSlSNXdKocIYqccvqgWvoxDPNb0OVRdi59A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/select" "~1.6.0"
|
"@rc-component/select" "~1.7.1"
|
||||||
"@rc-component/tree" "~1.3.0"
|
"@rc-component/tree" "~1.3.2"
|
||||||
"@rc-component/util" "^1.4.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/checkbox@~2.0.0":
|
"@rc-component/checkbox@~2.0.0":
|
||||||
@@ -3242,13 +3242,13 @@
|
|||||||
"@rc-component/util" "^1.2.1"
|
"@rc-component/util" "^1.2.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/form@~1.8.1":
|
"@rc-component/form@~1.8.3":
|
||||||
version "1.8.1"
|
version "1.8.5"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.8.1.tgz#d811fb52df41bf72297938ebfe5cf4a4774588d4"
|
resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.8.5.tgz#20571cfd401dc38c74c38cdf4722ddc6c23a9806"
|
||||||
integrity sha512-8O7TB55Fi2mWIGvSnwZjk8jFqVNYyKDAswglwGShcbndxqzKz4cHwNtNaLjZlAeRge9wcB0LL8IWsC/Bl18raQ==
|
integrity sha512-d24EYtvUOBhxEtSd/EqIu9DaMuqrWF2IRIvAFCTM6NQ/GJIYNr8DvEpUSUlv2uPxEJ0ZPwYQ+wwlGIAaiHvdrw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/async-validator" "^5.1.0"
|
"@rc-component/async-validator" "^6.0.0"
|
||||||
"@rc-component/util" "^1.6.2"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/image@~1.9.0":
|
"@rc-component/image@~1.9.0":
|
||||||
@@ -3270,13 +3270,13 @@
|
|||||||
"@rc-component/util" "^1.4.0"
|
"@rc-component/util" "^1.4.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/input@~1.3.0":
|
"@rc-component/input@~1.3.0", "@rc-component/input@~1.3.1":
|
||||||
version "1.3.0"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/input/-/input-1.3.0.tgz#a8c113000bbc39089cf75337bec68120115b9e05"
|
resolved "https://registry.yarnpkg.com/@rc-component/input/-/input-1.3.1.tgz#230b8b59cdde8521d50f0eede63ddacb61cc0cd3"
|
||||||
integrity sha512-IUUNOdAuWuEvDEFFgfmwQl818tiDbvXwLgon4HL1q2hJeYkqrRrYwYhJN0zfPHGTDxs3gvyVC/C02D4hWFoIcA==
|
integrity sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/resize-observer" "^1.1.1"
|
"@rc-component/resize-observer" "^1.1.1"
|
||||||
"@rc-component/util" "^1.4.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/mentions@~1.9.0":
|
"@rc-component/mentions@~1.9.0":
|
||||||
@@ -3290,15 +3290,15 @@
|
|||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.3.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/menu@~1.3.0":
|
"@rc-component/menu@~1.3.0", "@rc-component/menu@~1.3.1":
|
||||||
version "1.3.0"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/menu/-/menu-1.3.0.tgz#fc70d81ca76ae6013b0d7955f20a2393adef04b3"
|
resolved "https://registry.yarnpkg.com/@rc-component/menu/-/menu-1.3.1.tgz#16cae71a01080914e8bac08359fccdda7bfce540"
|
||||||
integrity sha512-u3NfiwpiEgT177qa5Yxm5QsI8i/93EBGpWj8HYZQDnh2pCZ2xtQCe/+w3pSR2NlwKOZDTCKzEhEyD09mGphssA==
|
integrity sha512-pSZl9nBPgKgxN0aaW7NilIBEwWsc+43S+ulGdWAg9afak96dNOGWsGx0DLLBB1VQsAJvo6bQMTDzXoPlEHsBEw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/motion" "^1.1.4"
|
"@rc-component/motion" "^1.1.4"
|
||||||
"@rc-component/overflow" "^1.0.0"
|
"@rc-component/overflow" "^1.0.0"
|
||||||
"@rc-component/trigger" "^3.0.0"
|
"@rc-component/trigger" "^3.0.0"
|
||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/mini-decimal@^1.0.1":
|
"@rc-component/mini-decimal@^1.0.1":
|
||||||
@@ -3308,12 +3308,12 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.18.0"
|
"@babel/runtime" "^7.18.0"
|
||||||
|
|
||||||
"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3", "@rc-component/motion@^1.1.4", "@rc-component/motion@^1.3.2":
|
"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3", "@rc-component/motion@^1.1.4", "@rc-component/motion@^1.3.3":
|
||||||
version "1.3.2"
|
version "1.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/motion/-/motion-1.3.2.tgz#bd96e0fd16ee9d98c1d9be14198f003e367d8feb"
|
resolved "https://registry.yarnpkg.com/@rc-component/motion/-/motion-1.3.3.tgz#6a7bbe0a9f070bd11642168f741d40e78bb28565"
|
||||||
integrity sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ==
|
integrity sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/util" "^1.2.0"
|
"@rc-component/util" "^1.11.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/mutate-observer@^2.0.1":
|
"@rc-component/mutate-observer@^2.0.1":
|
||||||
@@ -3342,12 +3342,12 @@
|
|||||||
"@rc-component/util" "^1.4.0"
|
"@rc-component/util" "^1.4.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/pagination@~1.2.0":
|
"@rc-component/pagination@~1.3.0":
|
||||||
version "1.2.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz"
|
resolved "https://registry.yarnpkg.com/@rc-component/pagination/-/pagination-1.3.0.tgz#ee66301e37a03974826fb3028a91a1aeacdcd0ac"
|
||||||
integrity sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==
|
integrity sha512-12ahTY+HPITg1L2bjWKXUqBJe/oOnpA2QsChdCjthqLVf/e19StiCsv8OLKpWoHbc+8PFEkNjRqRqrLoRBHjFw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/picker@~1.10.0":
|
"@rc-component/picker@~1.10.0":
|
||||||
@@ -3377,10 +3377,10 @@
|
|||||||
"@rc-component/util" "^1.2.1"
|
"@rc-component/util" "^1.2.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/qrcode@~1.1.1":
|
"@rc-component/qrcode@~2.0.0":
|
||||||
version "1.1.1"
|
version "2.0.0"
|
||||||
resolved "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz"
|
resolved "https://registry.yarnpkg.com/@rc-component/qrcode/-/qrcode-2.0.0.tgz#ef4134c213002e7a43edbe609b24248914de4974"
|
||||||
integrity sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==
|
integrity sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.24.7"
|
"@babel/runtime" "^7.24.7"
|
||||||
|
|
||||||
@@ -3409,15 +3409,15 @@
|
|||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.3.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/select@~1.6.0", "@rc-component/select@~1.6.15":
|
"@rc-component/select@~1.7.0", "@rc-component/select@~1.7.1":
|
||||||
version "1.6.15"
|
version "1.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/select/-/select-1.6.15.tgz#de2a3c8b020834cabd600b52de573a328c061eef"
|
resolved "https://registry.yarnpkg.com/@rc-component/select/-/select-1.7.1.tgz#cdda0ac185f00ebed1c85e7809ae1f7855a9f7ab"
|
||||||
integrity sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g==
|
integrity sha512-GZ1cMJk2xQh0VHyOQjjG8drYL4iu24NcbkXioUcReQOCUr+ub/3fmRonZe6cRPEZhWMbJdeHsqnEltogDaZ5Tg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/overflow" "^1.0.0"
|
"@rc-component/overflow" "^1.0.0"
|
||||||
"@rc-component/trigger" "^3.0.0"
|
"@rc-component/trigger" "^3.0.0"
|
||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
"@rc-component/virtual-list" "^1.0.1"
|
"@rc-component/virtual-list" "^1.2.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/slider@~1.0.1":
|
"@rc-component/slider@~1.0.1":
|
||||||
@@ -3444,27 +3444,27 @@
|
|||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.3.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/table@~1.10.0":
|
"@rc-component/table@~1.10.2":
|
||||||
version "1.10.0"
|
version "1.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/table/-/table-1.10.0.tgz#7a98d68176f23f50a762df464f4c9142e7db3942"
|
resolved "https://registry.yarnpkg.com/@rc-component/table/-/table-1.10.2.tgz#7b052fd5eb2ccf6996a93eebeb7af7036a262c8b"
|
||||||
integrity sha512-SjtpcCf+rL7dDc62GKT3rXTdERjVuJvRiqjpU7g0Jc/ewCifXynHc7Nm3Em1XsD+WhGrgQtxNDScI/0+Lpfr0w==
|
integrity sha512-b3PjqB9Gp25p5t/zq+9QrbXbodkptT8/zvLmwgd2FNPUUtaYyDnQqfxeD5a7ao8E8lpinLHsi2u2vdfPhyNvAw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/context" "^2.0.1"
|
"@rc-component/context" "^2.0.1"
|
||||||
"@rc-component/resize-observer" "^1.0.0"
|
"@rc-component/resize-observer" "^1.0.0"
|
||||||
"@rc-component/util" "^1.1.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
"@rc-component/virtual-list" "^1.0.1"
|
"@rc-component/virtual-list" "^1.0.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/tabs@~1.9.0":
|
"@rc-component/tabs@~1.9.1":
|
||||||
version "1.9.0"
|
version "1.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/tabs/-/tabs-1.9.0.tgz#8f3e3755450e5a90d240d1ed3dc140d520b1fbef"
|
resolved "https://registry.yarnpkg.com/@rc-component/tabs/-/tabs-1.9.1.tgz#52b9cb0392c718fba43e7d558f46f6c910d19acb"
|
||||||
integrity sha512-tn1slmbbaTyt8mgwyWJcT8jo/qNiYUs6u1H7OgGQt9faYO06BJIkU5cTmMqORzIrNmSEeeUY6pD5i+JlqSHYhg==
|
integrity sha512-6mY08Fce6aNOHuGsxbzT+f2ekgL9mg1cGGHkittMlVGymjGg+kGupu5v90sRxcUd/paRU9jclLLXtF/PkK1FUA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/dropdown" "~1.0.0"
|
"@rc-component/dropdown" "~1.0.0"
|
||||||
"@rc-component/menu" "~1.3.0"
|
"@rc-component/menu" "~1.3.0"
|
||||||
"@rc-component/motion" "^1.1.3"
|
"@rc-component/motion" "^1.1.3"
|
||||||
"@rc-component/resize-observer" "^1.0.0"
|
"@rc-component/resize-observer" "^1.0.0"
|
||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/tooltip@~1.4.0":
|
"@rc-component/tooltip@~1.4.0":
|
||||||
@@ -3486,30 +3486,30 @@
|
|||||||
"@rc-component/util" "^1.7.0"
|
"@rc-component/util" "^1.7.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/tree-select@~1.9.0":
|
"@rc-component/tree-select@~1.10.0":
|
||||||
version "1.9.0"
|
version "1.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/tree-select/-/tree-select-1.9.0.tgz#13ea516478b6cb558e04181abb0a01ae6fbdd31f"
|
resolved "https://registry.yarnpkg.com/@rc-component/tree-select/-/tree-select-1.10.0.tgz#72e337fd58591f677404189cb3e9d3f718cd3332"
|
||||||
integrity sha512-GXcFe15a+trUl1/J3OHWQhsVWFpwFpGFK2cqYWZ1sK22Zs3KZTvMwDpzr75PIo1s6QVioVxpE/pRwRopkeDQ6w==
|
integrity sha512-E1U4pn2LAbXEhLJdzIzid7WYbIuFbkTIctuFoeC6weppf8UbPR3+YYB6/ay0c0ksand4gXMRQpa1Z60Auo7VJA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/select" "~1.6.0"
|
"@rc-component/select" "~1.7.0"
|
||||||
"@rc-component/tree" "~1.3.0"
|
"@rc-component/tree" "~1.3.0"
|
||||||
"@rc-component/util" "^1.4.0"
|
"@rc-component/util" "^1.4.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/tree@~1.3.0", "@rc-component/tree@~1.3.1":
|
"@rc-component/tree@~1.3.0", "@rc-component/tree@~1.3.2":
|
||||||
version "1.3.1"
|
version "1.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/tree/-/tree-1.3.1.tgz#6983ca6bd9d5f6d04dd7258d00cb0fe71cdfe661"
|
resolved "https://registry.yarnpkg.com/@rc-component/tree/-/tree-1.3.2.tgz#4b0c13564314eff61ca948c18ef923b87c9d7e44"
|
||||||
integrity sha512-zlL0PW0bTFlveTtLcA01VD/yMWKK73EywItFMgIZUY5sb6tMOAw7zV6qGzqldufqrV93ZWQB4H3NBNoTMCueJA==
|
integrity sha512-bJFj46wEkpBPnWyTm18XmgAgNQ/4YvprxMOPPY2a6rmhGJYxLuNKEFiL5Qej4Qctu9wHJm8WW+v2SYskafE0kA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/motion" "^1.0.0"
|
"@rc-component/motion" "^1.0.0"
|
||||||
"@rc-component/util" "^1.8.1"
|
"@rc-component/util" "^1.11.1"
|
||||||
"@rc-component/virtual-list" "^1.0.1"
|
"@rc-component/virtual-list" "^1.2.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/trigger@^3.0.0", "@rc-component/trigger@^3.6.15", "@rc-component/trigger@^3.7.1", "@rc-component/trigger@^3.9.0":
|
"@rc-component/trigger@^3.0.0", "@rc-component/trigger@^3.6.15", "@rc-component/trigger@^3.7.1", "@rc-component/trigger@^3.9.1":
|
||||||
version "3.9.0"
|
version "3.9.1"
|
||||||
resolved "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz"
|
resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-3.9.1.tgz#3f730315c558bc392921a563ac9109a1d094ef23"
|
||||||
integrity sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==
|
integrity sha512-LNsYvz60mrLJ/kRvKcHE7boUvcQfVMCfRqZ71x3Fo9AOiZ1KKIEqkzMA8DNvz2V3Bcvir/vwQNn7JF1NPODQ7Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/motion" "^1.1.4"
|
"@rc-component/motion" "^1.1.4"
|
||||||
"@rc-component/portal" "^2.2.0"
|
"@rc-component/portal" "^2.2.0"
|
||||||
@@ -3517,18 +3517,18 @@
|
|||||||
"@rc-component/util" "^1.2.1"
|
"@rc-component/util" "^1.2.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/upload@~1.1.0":
|
"@rc-component/upload@~1.1.1":
|
||||||
version "1.1.0"
|
version "1.1.1"
|
||||||
resolved "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz"
|
resolved "https://registry.yarnpkg.com/@rc-component/upload/-/upload-1.1.1.tgz#90d16edcdaeb104ffa9111fd0b428061de7c21ac"
|
||||||
integrity sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==
|
integrity sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@rc-component/util" "^1.3.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@rc-component/util@^1.1.0", "@rc-component/util@^1.10.1", "@rc-component/util@^1.11.0", "@rc-component/util@^1.2.0", "@rc-component/util@^1.2.1", "@rc-component/util@^1.3.0", "@rc-component/util@^1.4.0", "@rc-component/util@^1.6.2", "@rc-component/util@^1.7.0", "@rc-component/util@^1.8.1", "@rc-component/util@^1.9.0":
|
"@rc-component/util@^1.10.1", "@rc-component/util@^1.11.0", "@rc-component/util@^1.11.1", "@rc-component/util@^1.2.0", "@rc-component/util@^1.2.1", "@rc-component/util@^1.3.0", "@rc-component/util@^1.4.0", "@rc-component/util@^1.7.0", "@rc-component/util@^1.9.0":
|
||||||
version "1.11.0"
|
version "1.11.1"
|
||||||
resolved "https://registry.yarnpkg.com/@rc-component/util/-/util-1.11.0.tgz#965c8b44a3f57fc96dc14e5072afbe32e422fd4d"
|
resolved "https://registry.yarnpkg.com/@rc-component/util/-/util-1.11.1.tgz#07d698908339c55648e4f974afa739345e65b483"
|
||||||
integrity sha512-jHG3/BYgUWiP5c7RZHiaUNToyw1L3nlPSKG2RPu+YoiD9b3ajiJwBWhsjO+ZELmCsKFAjNR5DelbKdlF0e2BDA==
|
integrity sha512-awVlI3ub2vqfqkYxOBc/uQ0efm3jw0wcrhtO/YWLyZfxiKXczKwNbVuhlnyxytDt7H9pbbVQiqr+O6MLATtRYg==
|
||||||
dependencies:
|
dependencies:
|
||||||
is-mobile "^5.0.0"
|
is-mobile "^5.0.0"
|
||||||
react-is "^18.2.0"
|
react-is "^18.2.0"
|
||||||
@@ -3543,6 +3543,16 @@
|
|||||||
"@rc-component/util" "^1.4.0"
|
"@rc-component/util" "^1.4.0"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
|
|
||||||
|
"@rc-component/virtual-list@^1.2.0":
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rc-component/virtual-list/-/virtual-list-1.2.0.tgz#3c9ee8cd7d10da334a2a06ad86ca234e2792a381"
|
||||||
|
integrity sha512-iavRm1Jo4GDbASQwdGa7jFyk93RvSOo9xHyBT4QL1pgFJj/Fdf1G+3RErH7/7BmAMvx2AkF62mjGYxDbXsK9TQ==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.20.0"
|
||||||
|
"@rc-component/resize-observer" "^1.0.1"
|
||||||
|
"@rc-component/util" "^1.4.0"
|
||||||
|
clsx "^2.1.1"
|
||||||
|
|
||||||
"@redocly/ajv@^8.18.0":
|
"@redocly/ajv@^8.18.0":
|
||||||
version "8.18.3"
|
version "8.18.3"
|
||||||
resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.18.3.tgz#a925753d9a33375219f1b2ba91aef320f9929577"
|
resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.18.3.tgz#a925753d9a33375219f1b2ba91aef320f9929577"
|
||||||
@@ -4922,110 +4932,110 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/yargs-parser" "*"
|
"@types/yargs-parser" "*"
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin@8.61.0", "@typescript-eslint/eslint-plugin@^8.59.3":
|
"@typescript-eslint/eslint-plugin@8.61.1", "@typescript-eslint/eslint-plugin@^8.59.3":
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz#db20271974b94a3a54d3b9544e5f5b3481448400"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz#6e4b7fee21f1983308e9e9b634ecbaf702c86006"
|
||||||
integrity sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==
|
integrity sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/regexpp" "^4.12.2"
|
"@eslint-community/regexpp" "^4.12.2"
|
||||||
"@typescript-eslint/scope-manager" "8.61.0"
|
"@typescript-eslint/scope-manager" "8.61.1"
|
||||||
"@typescript-eslint/type-utils" "8.61.0"
|
"@typescript-eslint/type-utils" "8.61.1"
|
||||||
"@typescript-eslint/utils" "8.61.0"
|
"@typescript-eslint/utils" "8.61.1"
|
||||||
"@typescript-eslint/visitor-keys" "8.61.0"
|
"@typescript-eslint/visitor-keys" "8.61.1"
|
||||||
ignore "^7.0.5"
|
ignore "^7.0.5"
|
||||||
natural-compare "^1.4.0"
|
natural-compare "^1.4.0"
|
||||||
ts-api-utils "^2.5.0"
|
ts-api-utils "^2.5.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@8.61.0", "@typescript-eslint/parser@^8.61.0":
|
"@typescript-eslint/parser@8.61.1", "@typescript-eslint/parser@^8.61.0":
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.61.0.tgz#1afe73c9ccce16b7a26d6b95f9400b0ccc34af87"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.61.1.tgz#881fba60b50636249cdeea2e547bf75715254c72"
|
||||||
integrity sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==
|
integrity sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/scope-manager" "8.61.0"
|
"@typescript-eslint/scope-manager" "8.61.1"
|
||||||
"@typescript-eslint/types" "8.61.0"
|
"@typescript-eslint/types" "8.61.1"
|
||||||
"@typescript-eslint/typescript-estree" "8.61.0"
|
"@typescript-eslint/typescript-estree" "8.61.1"
|
||||||
"@typescript-eslint/visitor-keys" "8.61.0"
|
"@typescript-eslint/visitor-keys" "8.61.1"
|
||||||
debug "^4.4.3"
|
debug "^4.4.3"
|
||||||
|
|
||||||
"@typescript-eslint/project-service@8.61.0":
|
"@typescript-eslint/project-service@8.61.1":
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.61.0.tgz#417a2feac32e8ebd336d63f068c3b42b736ea1ac"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.61.1.tgz#fcd9739964a40867eed55f1ac318d3909f24b4af"
|
||||||
integrity sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==
|
integrity sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/tsconfig-utils" "^8.61.0"
|
"@typescript-eslint/tsconfig-utils" "^8.61.1"
|
||||||
"@typescript-eslint/types" "^8.61.0"
|
"@typescript-eslint/types" "^8.61.1"
|
||||||
debug "^4.4.3"
|
debug "^4.4.3"
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager@8.61.0":
|
"@typescript-eslint/scope-manager@8.61.1":
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz#93c2520d05653fe65eb9ee98efc74fd0134a7852"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz#2479921a40fdb0afa18f5838fae6167264b417b2"
|
||||||
integrity sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==
|
integrity sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "8.61.0"
|
"@typescript-eslint/types" "8.61.1"
|
||||||
"@typescript-eslint/visitor-keys" "8.61.0"
|
"@typescript-eslint/visitor-keys" "8.61.1"
|
||||||
|
|
||||||
"@typescript-eslint/tsconfig-utils@8.61.0":
|
"@typescript-eslint/tsconfig-utils@8.61.1":
|
||||||
version "8.61.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz#05d6e3ff20001674ebcd22d03dac29ee448043ba"
|
|
||||||
integrity sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==
|
|
||||||
|
|
||||||
"@typescript-eslint/tsconfig-utils@^8.61.0":
|
|
||||||
version "8.61.1"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz#ca88080e0cf191d49516d7f300b67aa090d2254f"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz#ca88080e0cf191d49516d7f300b67aa090d2254f"
|
||||||
integrity sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==
|
integrity sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==
|
||||||
|
|
||||||
"@typescript-eslint/type-utils@8.61.0":
|
"@typescript-eslint/tsconfig-utils@^8.61.1":
|
||||||
version "8.61.0"
|
version "8.62.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz#50219b57e6b89cecfb1a15f093b15ec9ee019974"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz#9440a673581c6d9de308c4d5803dd52ed5d71729"
|
||||||
integrity sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==
|
integrity sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==
|
||||||
|
|
||||||
|
"@typescript-eslint/type-utils@8.61.1":
|
||||||
|
version "8.61.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz#8fa18f453ee140893b47d339d1a6b64cac9b08a1"
|
||||||
|
integrity sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "8.61.0"
|
"@typescript-eslint/types" "8.61.1"
|
||||||
"@typescript-eslint/typescript-estree" "8.61.0"
|
"@typescript-eslint/typescript-estree" "8.61.1"
|
||||||
"@typescript-eslint/utils" "8.61.0"
|
"@typescript-eslint/utils" "8.61.1"
|
||||||
debug "^4.4.3"
|
debug "^4.4.3"
|
||||||
ts-api-utils "^2.5.0"
|
ts-api-utils "^2.5.0"
|
||||||
|
|
||||||
"@typescript-eslint/types@8.61.0":
|
"@typescript-eslint/types@8.61.1":
|
||||||
version "8.61.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.0.tgz#0ddb46e012a4288292950bdd253db42f278ce64d"
|
|
||||||
integrity sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==
|
|
||||||
|
|
||||||
"@typescript-eslint/types@^8.61.0":
|
|
||||||
version "8.61.1"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.1.tgz#0c51f518e4e6848371a1c988e859d59eb7522d5a"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.1.tgz#0c51f518e4e6848371a1c988e859d59eb7522d5a"
|
||||||
integrity sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==
|
integrity sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree@8.61.0":
|
"@typescript-eslint/types@^8.61.1":
|
||||||
version "8.61.0"
|
version "8.62.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz#98ca47260bbf627fc28f018b3a0abf00e3090690"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.62.0.tgz#601427c10203d9f0f34f0b3e474df735eb12b593"
|
||||||
integrity sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==
|
integrity sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==
|
||||||
|
|
||||||
|
"@typescript-eslint/typescript-estree@8.61.1":
|
||||||
|
version "8.61.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz#febbe70365ac0bf7611262b61b338fc8797965c7"
|
||||||
|
integrity sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/project-service" "8.61.0"
|
"@typescript-eslint/project-service" "8.61.1"
|
||||||
"@typescript-eslint/tsconfig-utils" "8.61.0"
|
"@typescript-eslint/tsconfig-utils" "8.61.1"
|
||||||
"@typescript-eslint/types" "8.61.0"
|
"@typescript-eslint/types" "8.61.1"
|
||||||
"@typescript-eslint/visitor-keys" "8.61.0"
|
"@typescript-eslint/visitor-keys" "8.61.1"
|
||||||
debug "^4.4.3"
|
debug "^4.4.3"
|
||||||
minimatch "^10.2.2"
|
minimatch "^10.2.2"
|
||||||
semver "^7.7.3"
|
semver "^7.7.3"
|
||||||
tinyglobby "^0.2.15"
|
tinyglobby "^0.2.15"
|
||||||
ts-api-utils "^2.5.0"
|
ts-api-utils "^2.5.0"
|
||||||
|
|
||||||
"@typescript-eslint/utils@8.61.0":
|
"@typescript-eslint/utils@8.61.1":
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.61.0.tgz#ed3546a052787e84ea6c5064d0919fc5eea8522f"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.61.1.tgz#ffd1054de7dd33b7873cd6c6713ec6b0366316d3"
|
||||||
integrity sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==
|
integrity sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/eslint-utils" "^4.9.1"
|
"@eslint-community/eslint-utils" "^4.9.1"
|
||||||
"@typescript-eslint/scope-manager" "8.61.0"
|
"@typescript-eslint/scope-manager" "8.61.1"
|
||||||
"@typescript-eslint/types" "8.61.0"
|
"@typescript-eslint/types" "8.61.1"
|
||||||
"@typescript-eslint/typescript-estree" "8.61.0"
|
"@typescript-eslint/typescript-estree" "8.61.1"
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys@8.61.0":
|
"@typescript-eslint/visitor-keys@8.61.1":
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz#39b4e1ab8936d23bea973d39fd092f9aa21f275e"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz#546cf102b4efdb72a9a08e63a1b0d7d745eb66eb"
|
||||||
integrity sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==
|
integrity sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "8.61.0"
|
"@typescript-eslint/types" "8.61.1"
|
||||||
eslint-visitor-keys "^5.0.0"
|
eslint-visitor-keys "^5.0.0"
|
||||||
|
|
||||||
"@ungap/structured-clone@^1.0.0":
|
"@ungap/structured-clone@^1.0.0":
|
||||||
@@ -5382,54 +5392,54 @@ ansis@^3.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7"
|
resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7"
|
||||||
integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==
|
integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==
|
||||||
|
|
||||||
antd@^6.4.3:
|
antd@^6.4.4:
|
||||||
version "6.4.3"
|
version "6.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.3.tgz#80a7aab9c13c35daa0e0e7eea80585ba57cb7203"
|
resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.4.tgz#a422610959b37ac4d4b766dbaac67ea2d8fd0785"
|
||||||
integrity sha512-6H2avkxCGfxcF67r3J2mwm9Ck50el1pks/73vfM1wDsPL/tPtj5vHuauMgJFnrqmq7CH3g8aoZ0VBQbt+jpAsw==
|
integrity sha512-lgPz4KhfhiYddV/qPYo0ieqWimCVgV2OQF72mbeGNixE753JWNnmEc7UNGy08wBS/zZ7hxrmX0pc5aX7EUaIIg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@ant-design/colors" "^8.0.1"
|
"@ant-design/colors" "^8.0.1"
|
||||||
"@ant-design/cssinjs" "^2.1.2"
|
"@ant-design/cssinjs" "^2.1.2"
|
||||||
"@ant-design/cssinjs-utils" "^2.1.2"
|
"@ant-design/cssinjs-utils" "^2.1.2"
|
||||||
"@ant-design/fast-color" "^3.0.1"
|
"@ant-design/fast-color" "^3.0.1"
|
||||||
"@ant-design/icons" "^6.2.3"
|
"@ant-design/icons" "^6.2.5"
|
||||||
"@ant-design/react-slick" "~2.0.0"
|
"@ant-design/react-slick" "~2.0.0"
|
||||||
"@babel/runtime" "^7.29.2"
|
"@babel/runtime" "^7.29.2"
|
||||||
"@rc-component/cascader" "~1.15.0"
|
"@rc-component/cascader" "~1.16.1"
|
||||||
"@rc-component/checkbox" "~2.0.0"
|
"@rc-component/checkbox" "~2.0.0"
|
||||||
"@rc-component/collapse" "~1.2.0"
|
"@rc-component/collapse" "~1.2.0"
|
||||||
"@rc-component/color-picker" "~3.1.1"
|
"@rc-component/color-picker" "~3.1.1"
|
||||||
"@rc-component/dialog" "~1.9.0"
|
"@rc-component/dialog" "~1.9.0"
|
||||||
"@rc-component/drawer" "~1.4.2"
|
"@rc-component/drawer" "~1.4.2"
|
||||||
"@rc-component/dropdown" "~1.0.2"
|
"@rc-component/dropdown" "~1.0.2"
|
||||||
"@rc-component/form" "~1.8.1"
|
"@rc-component/form" "~1.8.3"
|
||||||
"@rc-component/image" "~1.9.0"
|
"@rc-component/image" "~1.9.0"
|
||||||
"@rc-component/input" "~1.3.0"
|
"@rc-component/input" "~1.3.1"
|
||||||
"@rc-component/input-number" "~1.6.2"
|
"@rc-component/input-number" "~1.6.2"
|
||||||
"@rc-component/mentions" "~1.9.0"
|
"@rc-component/mentions" "~1.9.0"
|
||||||
"@rc-component/menu" "~1.3.0"
|
"@rc-component/menu" "~1.3.1"
|
||||||
"@rc-component/motion" "^1.3.2"
|
"@rc-component/motion" "^1.3.3"
|
||||||
"@rc-component/mutate-observer" "^2.0.1"
|
"@rc-component/mutate-observer" "^2.0.1"
|
||||||
"@rc-component/notification" "~2.0.7"
|
"@rc-component/notification" "~2.0.7"
|
||||||
"@rc-component/pagination" "~1.2.0"
|
"@rc-component/pagination" "~1.3.0"
|
||||||
"@rc-component/picker" "~1.10.0"
|
"@rc-component/picker" "~1.10.0"
|
||||||
"@rc-component/progress" "~1.0.2"
|
"@rc-component/progress" "~1.0.2"
|
||||||
"@rc-component/qrcode" "~1.1.1"
|
"@rc-component/qrcode" "~2.0.0"
|
||||||
"@rc-component/rate" "~1.0.1"
|
"@rc-component/rate" "~1.0.1"
|
||||||
"@rc-component/resize-observer" "^1.1.2"
|
"@rc-component/resize-observer" "^1.1.2"
|
||||||
"@rc-component/segmented" "~1.3.0"
|
"@rc-component/segmented" "~1.3.0"
|
||||||
"@rc-component/select" "~1.6.15"
|
"@rc-component/select" "~1.7.1"
|
||||||
"@rc-component/slider" "~1.0.1"
|
"@rc-component/slider" "~1.0.1"
|
||||||
"@rc-component/steps" "~1.2.2"
|
"@rc-component/steps" "~1.2.2"
|
||||||
"@rc-component/switch" "~1.0.3"
|
"@rc-component/switch" "~1.0.3"
|
||||||
"@rc-component/table" "~1.10.0"
|
"@rc-component/table" "~1.10.2"
|
||||||
"@rc-component/tabs" "~1.9.0"
|
"@rc-component/tabs" "~1.9.1"
|
||||||
"@rc-component/tooltip" "~1.4.0"
|
"@rc-component/tooltip" "~1.4.0"
|
||||||
"@rc-component/tour" "~2.4.0"
|
"@rc-component/tour" "~2.4.0"
|
||||||
"@rc-component/tree" "~1.3.1"
|
"@rc-component/tree" "~1.3.2"
|
||||||
"@rc-component/tree-select" "~1.9.0"
|
"@rc-component/tree-select" "~1.10.0"
|
||||||
"@rc-component/trigger" "^3.9.0"
|
"@rc-component/trigger" "^3.9.1"
|
||||||
"@rc-component/upload" "~1.1.0"
|
"@rc-component/upload" "~1.1.1"
|
||||||
"@rc-component/util" "^1.11.0"
|
"@rc-component/util" "^1.11.1"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
dayjs "^1.11.11"
|
dayjs "^1.11.11"
|
||||||
scroll-into-view-if-needed "^3.1.0"
|
scroll-into-view-if-needed "^3.1.0"
|
||||||
@@ -5688,10 +5698,10 @@ base64-js@^1.3.1, base64-js@^1.5.1:
|
|||||||
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
|
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
|
||||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||||
|
|
||||||
baseline-browser-mapping@^2.10.35, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19:
|
baseline-browser-mapping@^2.10.37, baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.19:
|
||||||
version "2.10.35"
|
version "2.10.37"
|
||||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.35.tgz#f0f2232e0de2d2f82cc491bcf830b05ed05937c6"
|
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz#3e636475b6b293244e2b23e2c71a2ab9d9e6ba7d"
|
||||||
integrity sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==
|
integrity sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==
|
||||||
|
|
||||||
batch@0.6.1:
|
batch@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
@@ -5934,10 +5944,10 @@ caniuse-api@^3.0.0:
|
|||||||
lodash.memoize "^4.1.2"
|
lodash.memoize "^4.1.2"
|
||||||
lodash.uniq "^4.5.0"
|
lodash.uniq "^4.5.0"
|
||||||
|
|
||||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001797:
|
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001799:
|
||||||
version "1.0.30001797"
|
version "1.0.30001799"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz#1332709e1439f01ff92085dd17001e0a45897ec0"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz#5c909138c27f1a61219d3e092071c1cc7d32dc55"
|
||||||
integrity sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==
|
integrity sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==
|
||||||
|
|
||||||
ccount@^2.0.0:
|
ccount@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@@ -7252,17 +7262,10 @@ domhandler@^5.0.2, domhandler@^5.0.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
domelementtype "^2.3.0"
|
domelementtype "^2.3.0"
|
||||||
|
|
||||||
dompurify@^3.3.1:
|
dompurify@^3.3.1, dompurify@^3.4.0:
|
||||||
version "3.4.2"
|
version "3.4.11"
|
||||||
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.2.tgz#f0ff81be682c485505097ba8195a058d8f575218"
|
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680"
|
||||||
integrity sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==
|
integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==
|
||||||
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==
|
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@types/trusted-types" "^2.0.7"
|
"@types/trusted-types" "^2.0.7"
|
||||||
|
|
||||||
@@ -8765,9 +8768,9 @@ http-parser-js@>=0.5.1:
|
|||||||
integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
|
integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
|
||||||
|
|
||||||
http-proxy-middleware@^2.0.9:
|
http-proxy-middleware@^2.0.9:
|
||||||
version "2.0.9"
|
version "2.0.10"
|
||||||
resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz"
|
resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94"
|
||||||
integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==
|
integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/http-proxy" "^1.17.8"
|
"@types/http-proxy" "^1.17.8"
|
||||||
http-proxy "^1.18.1"
|
http-proxy "^1.18.1"
|
||||||
@@ -14499,15 +14502,15 @@ types-ramda@^0.30.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ts-toolbelt "^9.6.0"
|
ts-toolbelt "^9.6.0"
|
||||||
|
|
||||||
typescript-eslint@^8.61.0:
|
typescript-eslint@^8.61.1:
|
||||||
version "8.61.0"
|
version "8.61.1"
|
||||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.61.0.tgz#6927fb94f5f29623e370d33fd9fa61f15d6d996b"
|
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.61.1.tgz#7c224a9a643b7f42d295c67a75c1e30fee8c3eaa"
|
||||||
integrity sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==
|
integrity sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/eslint-plugin" "8.61.0"
|
"@typescript-eslint/eslint-plugin" "8.61.1"
|
||||||
"@typescript-eslint/parser" "8.61.0"
|
"@typescript-eslint/parser" "8.61.1"
|
||||||
"@typescript-eslint/typescript-estree" "8.61.0"
|
"@typescript-eslint/typescript-estree" "8.61.1"
|
||||||
"@typescript-eslint/utils" "8.61.0"
|
"@typescript-eslint/utils" "8.61.1"
|
||||||
|
|
||||||
typescript@~6.0.3:
|
typescript@~6.0.3:
|
||||||
version "6.0.3"
|
version "6.0.3"
|
||||||
@@ -15006,9 +15009,9 @@ webpack-dev-middleware@^7.4.2:
|
|||||||
schema-utils "^4.0.0"
|
schema-utils "^4.0.0"
|
||||||
|
|
||||||
webpack-dev-server@^5.2.2:
|
webpack-dev-server@^5.2.2:
|
||||||
version "5.2.4"
|
version "5.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz#6e6306ce59848ed322c235e48b326632b1eed6d6"
|
resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.5.tgz#648fceaac6a5736b0935e5c1e55d6aa1d0626119"
|
||||||
integrity sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==
|
integrity sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/bonjour" "^3.5.13"
|
"@types/bonjour" "^3.5.13"
|
||||||
"@types/connect-history-api-fallback" "^1.5.4"
|
"@types/connect-history-api-fallback" "^1.5.4"
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ maintainers:
|
|||||||
- name: craig-rueda
|
- name: craig-rueda
|
||||||
email: craig@craigrueda.com
|
email: craig@craigrueda.com
|
||||||
url: https://github.com/craig-rueda
|
url: https://github.com/craig-rueda
|
||||||
version: 0.16.2 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
|
version: 0.17.2 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
version: 16.7.27
|
version: 16.7.27
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs
|
|||||||
|
|
||||||
# superset
|
# superset
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Apache Superset is a modern, enterprise-ready business intelligence web application
|
Apache Superset is a modern, enterprise-ready business intelligence web application
|
||||||
|
|
||||||
@@ -111,9 +111,6 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
|
|||||||
| init.resources | object | `{}` | |
|
| init.resources | object | `{}` | |
|
||||||
| init.tolerations | list | `[]` | |
|
| init.tolerations | list | `[]` | |
|
||||||
| init.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to init job |
|
| init.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to init job |
|
||||||
| initImage.pullPolicy | string | `"IfNotPresent"` | |
|
|
||||||
| initImage.repository | string | `"apache/superset"` | |
|
|
||||||
| initImage.tag | string | `"dockerize"` | |
|
|
||||||
| nameOverride | string | `nil` | Provide a name to override the name of the chart |
|
| nameOverride | string | `nil` | Provide a name to override the name of the chart |
|
||||||
| nodeSelector | object | `{}` | |
|
| nodeSelector | object | `{}` | |
|
||||||
| postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/bitnami/charts/tree/main/bitnami/postgresql |
|
| postgresql | object | see `values.yaml` | Configuration values for the postgresql dependency. ref: https://github.com/bitnami/charts/tree/main/bitnami/postgresql |
|
||||||
@@ -219,6 +216,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
|
|||||||
| supersetNode.extraContainers | list | `[]` | Launch additional containers into supersetNode pod |
|
| supersetNode.extraContainers | list | `[]` | Launch additional containers into supersetNode pod |
|
||||||
| supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
|
| supersetNode.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
|
||||||
| supersetNode.initContainers | list | a container waiting for postgres | Init containers |
|
| supersetNode.initContainers | list | a container waiting for postgres | Init containers |
|
||||||
|
| supersetNode.lifecycle | object | `{}` | Container lifecycle hooks, e.g. a preStop sleep so the Service/Ingress stops routing to the pod before gunicorn receives SIGTERM |
|
||||||
| supersetNode.livenessProbe.failureThreshold | int | `3` | |
|
| supersetNode.livenessProbe.failureThreshold | int | `3` | |
|
||||||
| supersetNode.livenessProbe.httpGet.path | string | `"/health"` | |
|
| supersetNode.livenessProbe.httpGet.path | string | `"/health"` | |
|
||||||
| supersetNode.livenessProbe.httpGet.port | string | `"http"` | |
|
| supersetNode.livenessProbe.httpGet.port | string | `"http"` | |
|
||||||
@@ -251,6 +249,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
|
|||||||
| supersetNode.startupProbe.successThreshold | int | `1` | |
|
| supersetNode.startupProbe.successThreshold | int | `1` | |
|
||||||
| supersetNode.startupProbe.timeoutSeconds | int | `1` | |
|
| supersetNode.startupProbe.timeoutSeconds | int | `1` | |
|
||||||
| supersetNode.strategy | object | `{}` | |
|
| supersetNode.strategy | object | `{}` | |
|
||||||
|
| supersetNode.terminationGracePeriodSeconds | string | `nil` | Pod termination grace period (seconds). Set greater than GUNICORN_TIMEOUT so in-flight requests can drain before SIGKILL |
|
||||||
| supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments |
|
| supersetNode.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetNode deployments |
|
||||||
| supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment |
|
| supersetWebsockets.affinity | object | `{}` | Affinity to be added to supersetWebsockets deployment |
|
||||||
| supersetWebsockets.command | list | `[]` | |
|
| supersetWebsockets.command | list | `[]` | |
|
||||||
@@ -314,6 +313,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
|
|||||||
| supersetWorker.extraContainers | list | `[]` | Launch additional containers into supersetWorker pod |
|
| supersetWorker.extraContainers | list | `[]` | Launch additional containers into supersetWorker pod |
|
||||||
| supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
|
| supersetWorker.forceReload | bool | `false` | If true, forces deployment to reload on each upgrade |
|
||||||
| supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container |
|
| supersetWorker.initContainers | list | a container waiting for postgres and redis | Init container |
|
||||||
|
| supersetWorker.lifecycle | object | `{}` | Container lifecycle hooks for the worker pod |
|
||||||
| supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command |
|
| supersetWorker.livenessProbe.exec.command | list | a `celery inspect ping` command | Liveness probe command |
|
||||||
| supersetWorker.livenessProbe.failureThreshold | int | `3` | |
|
| supersetWorker.livenessProbe.failureThreshold | int | `3` | |
|
||||||
| supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | |
|
| supersetWorker.livenessProbe.initialDelaySeconds | int | `120` | |
|
||||||
@@ -334,6 +334,7 @@ On helm this can be set on `extraSecretEnv.SUPERSET_SECRET_KEY` or `configOverri
|
|||||||
| supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. |
|
| supersetWorker.resources | object | `{}` | Resource settings for the supersetWorker pods - these settings overwrite might existing values from the global resources object defined above. |
|
||||||
| supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
|
| supersetWorker.startupProbe | object | `{}` | No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic) |
|
||||||
| supersetWorker.strategy | object | `{}` | |
|
| supersetWorker.strategy | object | `{}` | |
|
||||||
|
| supersetWorker.terminationGracePeriodSeconds | string | `nil` | Pod termination grace period (seconds) for the worker pod so in-flight tasks can drain before SIGKILL |
|
||||||
| supersetWorker.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWorker deployments |
|
| supersetWorker.topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to supersetWorker deployments |
|
||||||
| tolerations | list | `[]` | |
|
| tolerations | list | `[]` | |
|
||||||
| topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments |
|
| topologySpreadConstraints | list | `[]` | TopologySpreadConstrains to be added to all deployments |
|
||||||
|
|||||||
@@ -134,6 +134,9 @@ spec:
|
|||||||
{{- if .Values.supersetWorker.livenessProbe }}
|
{{- if .Values.supersetWorker.livenessProbe }}
|
||||||
livenessProbe: {{- .Values.supersetWorker.livenessProbe | toYaml | nindent 12 }}
|
livenessProbe: {{- .Values.supersetWorker.livenessProbe | toYaml | nindent 12 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- if .Values.supersetWorker.lifecycle }}
|
||||||
|
lifecycle: {{- .Values.supersetWorker.lifecycle | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
resources:
|
resources:
|
||||||
{{- if .Values.supersetWorker.resources }}
|
{{- if .Values.supersetWorker.resources }}
|
||||||
{{- toYaml .Values.supersetWorker.resources | nindent 12 }}
|
{{- toYaml .Values.supersetWorker.resources | nindent 12 }}
|
||||||
@@ -170,6 +173,9 @@ spec:
|
|||||||
{{- with .Values.tolerations }}
|
{{- with .Values.tolerations }}
|
||||||
tolerations: {{- toYaml . | nindent 8 }}
|
tolerations: {{- toYaml . | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- if .Values.supersetWorker.terminationGracePeriodSeconds }}
|
||||||
|
terminationGracePeriodSeconds: {{ .Values.supersetWorker.terminationGracePeriodSeconds }}
|
||||||
|
{{- end }}
|
||||||
{{- if .Values.imagePullSecrets }}
|
{{- if .Values.imagePullSecrets }}
|
||||||
imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }}
|
imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|||||||
@@ -144,6 +144,9 @@ spec:
|
|||||||
{{- if .Values.supersetNode.livenessProbe }}
|
{{- if .Values.supersetNode.livenessProbe }}
|
||||||
livenessProbe: {{- .Values.supersetNode.livenessProbe | toYaml | nindent 12 }}
|
livenessProbe: {{- .Values.supersetNode.livenessProbe | toYaml | nindent 12 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- if .Values.supersetNode.lifecycle }}
|
||||||
|
lifecycle: {{- .Values.supersetNode.lifecycle | toYaml | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
resources:
|
resources:
|
||||||
{{- if .Values.supersetNode.resources }}
|
{{- if .Values.supersetNode.resources }}
|
||||||
{{- toYaml .Values.supersetNode.resources | nindent 12 }}
|
{{- toYaml .Values.supersetNode.resources | nindent 12 }}
|
||||||
@@ -180,6 +183,9 @@ spec:
|
|||||||
{{- with .Values.tolerations }}
|
{{- with .Values.tolerations }}
|
||||||
tolerations: {{- toYaml . | nindent 8 }}
|
tolerations: {{- toYaml . | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- if .Values.supersetNode.terminationGracePeriodSeconds }}
|
||||||
|
terminationGracePeriodSeconds: {{ .Values.supersetNode.terminationGracePeriodSeconds }}
|
||||||
|
{{- end }}
|
||||||
{{- if .Values.imagePullSecrets }}
|
{{- if .Values.imagePullSecrets }}
|
||||||
imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }}
|
imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|||||||
@@ -194,11 +194,6 @@ image:
|
|||||||
|
|
||||||
imagePullSecrets: []
|
imagePullSecrets: []
|
||||||
|
|
||||||
initImage:
|
|
||||||
repository: apache/superset
|
|
||||||
tag: dockerize
|
|
||||||
pullPolicy: IfNotPresent
|
|
||||||
|
|
||||||
service:
|
service:
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
port: 8088
|
port: 8088
|
||||||
@@ -274,7 +269,7 @@ supersetNode:
|
|||||||
command:
|
command:
|
||||||
- "/bin/sh"
|
- "/bin/sh"
|
||||||
- "-c"
|
- "-c"
|
||||||
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; /usr/bin/run-server.sh"
|
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; exec /usr/bin/run-server.sh"
|
||||||
connections:
|
connections:
|
||||||
# -- Change in case of bringing your own redis and then also set redis.enabled:false
|
# -- Change in case of bringing your own redis and then also set redis.enabled:false
|
||||||
redis_host: "{{ .Release.Name }}-redis-headless"
|
redis_host: "{{ .Release.Name }}-redis-headless"
|
||||||
@@ -303,15 +298,29 @@ supersetNode:
|
|||||||
# @default -- a container waiting for postgres
|
# @default -- a container waiting for postgres
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: wait-for-postgres
|
- name: wait-for-postgres
|
||||||
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: "{{ tpl .Values.envFromSecret . }}"
|
name: "{{ tpl .Values.envFromSecret . }}"
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/bash
|
||||||
- -c
|
- -c
|
||||||
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s
|
- |
|
||||||
|
# opening a /dev/tcp fd performs a TCP connect without sending any
|
||||||
|
# payload (avoids postgres "incomplete startup packet" log noise);
|
||||||
|
# no external `dockerize`, `nc`, or busybox needed. SECONDS-based
|
||||||
|
# deadline mirrors the prior `dockerize -timeout 120s` behaviour.
|
||||||
|
SECONDS=0
|
||||||
|
until (exec 3<>/dev/tcp/"$DB_HOST"/"$DB_PORT") 2>/dev/null; do
|
||||||
|
if [ "$SECONDS" -ge 120 ]; then
|
||||||
|
echo "timeout waiting for postgres at $DB_HOST:$DB_PORT after 120s" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "waiting for postgres at $DB_HOST:$DB_PORT (elapsed ${SECONDS}s)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo "postgres at $DB_HOST:$DB_PORT is up"
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "256Mi"
|
memory: "256Mi"
|
||||||
@@ -360,6 +369,12 @@ supersetNode:
|
|||||||
failureThreshold: 3
|
failureThreshold: 3
|
||||||
periodSeconds: 15
|
periodSeconds: 15
|
||||||
successThreshold: 1
|
successThreshold: 1
|
||||||
|
# -- Container lifecycle hooks, e.g. a preStop sleep so the Service/Ingress
|
||||||
|
# stops routing to the pod before gunicorn receives SIGTERM
|
||||||
|
lifecycle: {}
|
||||||
|
# -- Pod termination grace period (seconds). Set greater than GUNICORN_TIMEOUT so
|
||||||
|
# in-flight requests can drain before SIGKILL
|
||||||
|
terminationGracePeriodSeconds: ~
|
||||||
# -- Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above.
|
# -- Resource settings for the supersetNode pods - these settings overwrite might existing values from the global resources object defined above.
|
||||||
resources: {}
|
resources: {}
|
||||||
# limits:
|
# limits:
|
||||||
@@ -400,22 +415,38 @@ supersetWorker:
|
|||||||
command:
|
command:
|
||||||
- "/bin/sh"
|
- "/bin/sh"
|
||||||
- "-c"
|
- "-c"
|
||||||
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker"
|
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; exec celery --app=superset.tasks.celery_app:app worker"
|
||||||
# -- If true, forces deployment to reload on each upgrade
|
# -- If true, forces deployment to reload on each upgrade
|
||||||
forceReload: false
|
forceReload: false
|
||||||
# -- Init container
|
# -- Init container
|
||||||
# @default -- a container waiting for postgres and redis
|
# @default -- a container waiting for postgres and redis
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: wait-for-postgres-redis
|
- name: wait-for-postgres-redis
|
||||||
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: "{{ tpl .Values.envFromSecret . }}"
|
name: "{{ tpl .Values.envFromSecret . }}"
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/bash
|
||||||
- -c
|
- -c
|
||||||
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s
|
- |
|
||||||
|
# See supersetNode.initContainers for the rationale.
|
||||||
|
SECONDS=0
|
||||||
|
wait_for() {
|
||||||
|
local host=$1 port=$2 name=$3
|
||||||
|
until (exec 3<>/dev/tcp/"$host"/"$port") 2>/dev/null; do
|
||||||
|
if [ "$SECONDS" -ge 120 ]; then
|
||||||
|
echo "timeout waiting for $name at $host:$port after 120s" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "waiting for $name at $host:$port (elapsed ${SECONDS}s)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo "$name at $host:$port is up"
|
||||||
|
}
|
||||||
|
wait_for "$DB_HOST" "$DB_PORT" postgres
|
||||||
|
wait_for "$REDIS_HOST" "$REDIS_PORT" redis
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "256Mi"
|
memory: "256Mi"
|
||||||
@@ -464,6 +495,10 @@ supersetWorker:
|
|||||||
failureThreshold: 3
|
failureThreshold: 3
|
||||||
periodSeconds: 60
|
periodSeconds: 60
|
||||||
successThreshold: 1
|
successThreshold: 1
|
||||||
|
# -- Container lifecycle hooks for the worker pod
|
||||||
|
lifecycle: {}
|
||||||
|
# -- Pod termination grace period (seconds) for the worker pod so in-flight tasks can drain before SIGKILL
|
||||||
|
terminationGracePeriodSeconds: ~
|
||||||
# -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic)
|
# -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic)
|
||||||
startupProbe: {}
|
startupProbe: {}
|
||||||
# -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic)
|
# -- No startup/readiness probes by default since we don't really care about its startup time (it doesn't serve traffic)
|
||||||
@@ -488,22 +523,38 @@ supersetCeleryBeat:
|
|||||||
command:
|
command:
|
||||||
- "/bin/sh"
|
- "/bin/sh"
|
||||||
- "-c"
|
- "-c"
|
||||||
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule"
|
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; exec celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule"
|
||||||
# -- If true, forces deployment to reload on each upgrade
|
# -- If true, forces deployment to reload on each upgrade
|
||||||
forceReload: false
|
forceReload: false
|
||||||
# -- List of init containers
|
# -- List of init containers
|
||||||
# @default -- a container waiting for postgres
|
# @default -- a container waiting for postgres
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: wait-for-postgres-redis
|
- name: wait-for-postgres-redis
|
||||||
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: "{{ tpl .Values.envFromSecret . }}"
|
name: "{{ tpl .Values.envFromSecret . }}"
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/bash
|
||||||
- -c
|
- -c
|
||||||
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s
|
- |
|
||||||
|
# See supersetNode.initContainers for the rationale.
|
||||||
|
SECONDS=0
|
||||||
|
wait_for() {
|
||||||
|
local host=$1 port=$2 name=$3
|
||||||
|
until (exec 3<>/dev/tcp/"$host"/"$port") 2>/dev/null; do
|
||||||
|
if [ "$SECONDS" -ge 120 ]; then
|
||||||
|
echo "timeout waiting for $name at $host:$port after 120s" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "waiting for $name at $host:$port (elapsed ${SECONDS}s)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo "$name at $host:$port is up"
|
||||||
|
}
|
||||||
|
wait_for "$DB_HOST" "$DB_PORT" postgres
|
||||||
|
wait_for "$REDIS_HOST" "$REDIS_PORT" redis
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "256Mi"
|
memory: "256Mi"
|
||||||
@@ -594,15 +645,31 @@ supersetCeleryFlower:
|
|||||||
# @default -- a container waiting for postgres and redis
|
# @default -- a container waiting for postgres and redis
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: wait-for-postgres-redis
|
- name: wait-for-postgres-redis
|
||||||
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: "{{ tpl .Values.envFromSecret . }}"
|
name: "{{ tpl .Values.envFromSecret . }}"
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/bash
|
||||||
- -c
|
- -c
|
||||||
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s
|
- |
|
||||||
|
# See supersetNode.initContainers for the rationale.
|
||||||
|
SECONDS=0
|
||||||
|
wait_for() {
|
||||||
|
local host=$1 port=$2 name=$3
|
||||||
|
until (exec 3<>/dev/tcp/"$host"/"$port") 2>/dev/null; do
|
||||||
|
if [ "$SECONDS" -ge 120 ]; then
|
||||||
|
echo "timeout waiting for $name at $host:$port after 120s" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "waiting for $name at $host:$port (elapsed ${SECONDS}s)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo "$name at $host:$port is up"
|
||||||
|
}
|
||||||
|
wait_for "$DB_HOST" "$DB_PORT" postgres
|
||||||
|
wait_for "$REDIS_HOST" "$REDIS_PORT" redis
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "256Mi"
|
memory: "256Mi"
|
||||||
@@ -764,15 +831,26 @@ init:
|
|||||||
# @default -- a container waiting for postgres
|
# @default -- a container waiting for postgres
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: wait-for-postgres
|
- name: wait-for-postgres
|
||||||
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
|
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: "{{ tpl .Values.envFromSecret . }}"
|
name: "{{ tpl .Values.envFromSecret . }}"
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/bash
|
||||||
- -c
|
- -c
|
||||||
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s
|
- |
|
||||||
|
# See supersetNode.initContainers for the rationale.
|
||||||
|
SECONDS=0
|
||||||
|
until (exec 3<>/dev/tcp/"$DB_HOST"/"$DB_PORT") 2>/dev/null; do
|
||||||
|
if [ "$SECONDS" -ge 120 ]; then
|
||||||
|
echo "timeout waiting for postgres at $DB_HOST:$DB_PORT after 120s" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "waiting for postgres at $DB_HOST:$DB_PORT (elapsed ${SECONDS}s)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo "postgres at $DB_HOST:$DB_PORT is up"
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "256Mi"
|
memory: "256Mi"
|
||||||
|
|||||||
@@ -38,14 +38,20 @@ dependencies = [
|
|||||||
# no bounds for apache-superset-core until we have a stable version
|
# no bounds for apache-superset-core until we have a stable version
|
||||||
"apache-superset-core",
|
"apache-superset-core",
|
||||||
"backoff>=1.8.0",
|
"backoff>=1.8.0",
|
||||||
|
# cachetools is used directly by ``superset.db_engine_specs.aws_iam`` (TTLCache).
|
||||||
|
# It used to be installed transitively via ``google-auth`` (<2.53), but
|
||||||
|
# ``google-auth`` 2.53+ dropped it, so Superset must declare it
|
||||||
|
# explicitly to keep fresh ``pip install apache-superset`` working
|
||||||
|
# without the ``base.txt`` lock file (#40962).
|
||||||
|
"cachetools>=6.2.1, <7",
|
||||||
"celery>=5.3.6, <6.0.0",
|
"celery>=5.3.6, <6.0.0",
|
||||||
"click>=8.4.0",
|
"click>=8.4.0",
|
||||||
"click-option-group",
|
"click-option-group",
|
||||||
"colorama",
|
"colorama",
|
||||||
"flask-cors>=6.0.0, <7.0",
|
"flask-cors>=6.0.5, <7.0",
|
||||||
"croniter>=6.2.2",
|
"croniter>=6.2.2",
|
||||||
"cron-descriptor",
|
"cron-descriptor",
|
||||||
"cryptography>=42.0.4, <47.0.0",
|
"cryptography>=48.0.0, <49.0.0",
|
||||||
"deprecation>=2.1.0, <2.2.0",
|
"deprecation>=2.1.0, <2.2.0",
|
||||||
"flask>=2.2.5, <4.0.0",
|
"flask>=2.2.5, <4.0.0",
|
||||||
"flask-appbuilder>=5.2.1, <6.0.0",
|
"flask-appbuilder>=5.2.1, <6.0.0",
|
||||||
@@ -57,7 +63,7 @@ dependencies = [
|
|||||||
"flask-session>=0.4.0, <1.0",
|
"flask-session>=0.4.0, <1.0",
|
||||||
"flask-wtf>=1.3.0, <2.0",
|
"flask-wtf>=1.3.0, <2.0",
|
||||||
"geopy",
|
"geopy",
|
||||||
"greenlet>=3.0.3, <=3.5.0",
|
"greenlet<=3.5.1, >=3.5.1",
|
||||||
"gunicorn>=25.3.0, <26; sys_platform != 'win32'",
|
"gunicorn>=25.3.0, <26; sys_platform != 'win32'",
|
||||||
"hashids>=1.3.1, <2",
|
"hashids>=1.3.1, <2",
|
||||||
# holidays>=0.45 required for security fix
|
# holidays>=0.45 required for security fix
|
||||||
@@ -67,10 +73,12 @@ dependencies = [
|
|||||||
"jsonpath-ng>=1.8.0, <2",
|
"jsonpath-ng>=1.8.0, <2",
|
||||||
"Mako>=1.2.2",
|
"Mako>=1.2.2",
|
||||||
"markdown>=3.10.2",
|
"markdown>=3.10.2",
|
||||||
# marshmallow>=4 has issues: https://github.com/apache/superset/issues/33162
|
# marshmallow 4 compatibility: see superset/marshmallow_compatibility.py for a
|
||||||
"marshmallow>=3.0, <4",
|
# Flask-AppBuilder workaround. Tracking issue:
|
||||||
|
# https://github.com/apache/superset/issues/33162
|
||||||
|
"marshmallow>=3.0, <5",
|
||||||
"marshmallow-union>=0.1",
|
"marshmallow-union>=0.1",
|
||||||
"msgpack>=1.0.0, <1.2",
|
"msgpack>=1.2.0, <1.3",
|
||||||
"nh3>=0.3.5, <0.4",
|
"nh3>=0.3.5, <0.4",
|
||||||
"numpy>1.23.5, <2.3",
|
"numpy>1.23.5, <2.3",
|
||||||
"packaging",
|
"packaging",
|
||||||
@@ -90,7 +98,7 @@ dependencies = [
|
|||||||
"python-dotenv", # optional dependencies for Flask but required for Superset, see https://flask.palletsprojects.com/en/stable/installation/#optional-dependencies
|
"python-dotenv", # optional dependencies for Flask but required for Superset, see https://flask.palletsprojects.com/en/stable/installation/#optional-dependencies
|
||||||
"pygeohash",
|
"pygeohash",
|
||||||
"pyarrow>=24.0.0, <25", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693
|
"pyarrow>=24.0.0, <25", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693
|
||||||
"pyyaml>=6.0.0, <7.0.0",
|
"pyyaml>=6.0.3, <7.0.0",
|
||||||
"PyJWT>=2.4.0, <3.0",
|
"PyJWT>=2.4.0, <3.0",
|
||||||
"redis>=5.0.0, <6.0",
|
"redis>=5.0.0, <6.0",
|
||||||
"rison>=2.0.0, <3.0",
|
"rison>=2.0.0, <3.0",
|
||||||
@@ -141,7 +149,7 @@ drill = ["sqlalchemy-drill>=1.1.10, <2"]
|
|||||||
druid = ["pydruid>=0.6.5,<0.7"]
|
druid = ["pydruid>=0.6.5,<0.7"]
|
||||||
duckdb = ["duckdb>=1.5.2,<2", "duckdb-engine>=0.17.0"]
|
duckdb = ["duckdb>=1.5.2,<2", "duckdb-engine>=0.17.0"]
|
||||||
dynamodb = ["pydynamodb>=0.4.2"]
|
dynamodb = ["pydynamodb>=0.4.2"]
|
||||||
solr = ["sqlalchemy-solr >= 0.2.0"]
|
solr = ["sqlalchemy-solr >= 0.2.4.3"]
|
||||||
elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"]
|
elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"]
|
||||||
exasol = ["sqlalchemy-exasol>=2.4.0, <8.0"]
|
exasol = ["sqlalchemy-exasol>=2.4.0, <8.0"]
|
||||||
excel = ["xlrd>=2.0.2, <2.1"]
|
excel = ["xlrd>=2.0.2, <2.1"]
|
||||||
@@ -183,7 +191,7 @@ pinot = ["pinotdb>=5.0.0, <10.0.0"]
|
|||||||
playwright = ["playwright>=1.60.0, <2"]
|
playwright = ["playwright>=1.60.0, <2"]
|
||||||
postgres = ["psycopg2-binary==2.9.12"]
|
postgres = ["psycopg2-binary==2.9.12"]
|
||||||
presto = ["pyhive[presto]>=0.6.5"]
|
presto = ["pyhive[presto]>=0.6.5"]
|
||||||
trino = ["trino>=0.328.0"]
|
trino = ["trino>=0.337.0"]
|
||||||
prophet = ["prophet>=1.1.6, <2"]
|
prophet = ["prophet>=1.1.6, <2"]
|
||||||
redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"]
|
redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"]
|
||||||
risingwave = ["sqlalchemy-risingwave"]
|
risingwave = ["sqlalchemy-risingwave"]
|
||||||
@@ -208,7 +216,7 @@ netezza = ["nzalchemy>=11.0.2"]
|
|||||||
starrocks = ["starrocks>=1.3.3, <2"]
|
starrocks = ["starrocks>=1.3.3, <2"]
|
||||||
doris = ["pydoris>=1.0.0, <2.0.0"]
|
doris = ["pydoris>=1.0.0, <2.0.0"]
|
||||||
oceanbase = ["oceanbase_py>=0.0.1.2"]
|
oceanbase = ["oceanbase_py>=0.0.1.2"]
|
||||||
ydb = ["ydb-sqlalchemy>=0.1.2", "ydb-sqlglot-plugin>=0.2.5"]
|
ydb = ["ydb-sqlalchemy>=0.1.22", "ydb-sqlglot-plugin>=0.2.5"]
|
||||||
development = [
|
development = [
|
||||||
# no bounds for apache-superset-extensions-cli until a stable version
|
# no bounds for apache-superset-extensions-cli until a stable version
|
||||||
"apache-superset-extensions-cli",
|
"apache-superset-extensions-cli",
|
||||||
@@ -216,7 +224,7 @@ development = [
|
|||||||
"docker",
|
"docker",
|
||||||
"flask-testing",
|
"flask-testing",
|
||||||
"freezegun",
|
"freezegun",
|
||||||
"grpcio>=1.55.3",
|
"grpcio>=1.81.1",
|
||||||
"openapi-spec-validator",
|
"openapi-spec-validator",
|
||||||
"parameterized",
|
"parameterized",
|
||||||
"pip",
|
"pip",
|
||||||
@@ -367,7 +375,6 @@ select = [
|
|||||||
|
|
||||||
ignore = [
|
ignore = [
|
||||||
"S101",
|
"S101",
|
||||||
"PT004", # Fixtures that don't return values - underscore prefix conflicts with pytest usage
|
|
||||||
"PT006",
|
"PT006",
|
||||||
"T201",
|
"T201",
|
||||||
"N999",
|
"N999",
|
||||||
|
|||||||
27
pytest.ini
27
pytest.ini
@@ -18,5 +18,30 @@
|
|||||||
testpaths =
|
testpaths =
|
||||||
tests
|
tests
|
||||||
python_files = *_test.py test_*.py *_tests.py *viz/utils.py
|
python_files = *_test.py test_*.py *_tests.py *viz/utils.py
|
||||||
addopts = -p no:warnings
|
# `-p no:warnings` temporarily disabled in favor of more finely tuned `filterwarnings`.
|
||||||
|
#addopts = -p no:warnings
|
||||||
asyncio_mode = auto
|
asyncio_mode = auto
|
||||||
|
|
||||||
|
# `ignore` is effectively equivalent to `-p no:warnings`.
|
||||||
|
# Always print RemovedIn20Warning when SQLALCHEMY_WARN_20=1.
|
||||||
|
# Additionally, raise errors for refactored RemovedIn20Warning cases to prevent regression.
|
||||||
|
filterwarnings =
|
||||||
|
ignore
|
||||||
|
always::sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
error:Passing a string to Connection.execute\(\) is deprecated:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"Query" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"SavedQuery" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"SqlaTable" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"SqlMetric" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"TableColumn" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"TaggedObject" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The ``as_declarative\(\)`` function is now available:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The autoload parameter is deprecated:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The connection.execute\(\) method:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The current statement is being autocommitted using implicit autocommit:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The `database` package is deprecated:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The ``declarative_base\(\)`` function is now available:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The Engine.execute\(\) method is considered legacy:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
error:The legacy calling style of select\(\) is deprecated:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:The "whens" argument to case:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
# error:"User" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ filelock>=3.20.3,<4.0.0
|
|||||||
brotli>=1.2.0,<2.0.0
|
brotli>=1.2.0,<2.0.0
|
||||||
numexpr>=2.9.0
|
numexpr>=2.9.0
|
||||||
# Security: CVE-2026-34073 (MEDIUM) - Improper Certificate Validation
|
# Security: CVE-2026-34073 (MEDIUM) - Improper Certificate Validation
|
||||||
cryptography>=46.0.7,<47.0.0
|
cryptography>=48.0.0,<49.0.0
|
||||||
# Security: Snyk - XSS vulnerability in Mako templates
|
# Security: Snyk - XSS vulnerability in Mako templates
|
||||||
mako>=1.3.11,<2.0.0
|
mako>=1.3.11,<2.0.0
|
||||||
# Security: CVE-2024-52338 (CRITICAL) - Deserialization of untrusted data in IPC/Parquet readers
|
# Security: CVE-2024-52338 (CRITICAL) - Deserialization of untrusted data in IPC/Parquet readers
|
||||||
@@ -44,11 +44,10 @@ async_timeout>=4.0.0,<5.0.0
|
|||||||
# a bit of attention to bump.
|
# a bit of attention to bump.
|
||||||
apispec>=6.0.0,<6.7.0
|
apispec>=6.0.0,<6.7.0
|
||||||
|
|
||||||
# 1.4.1 appears to use much more memory, where the python test suite runs out of memory
|
# 1.4.1 introduced a memory regression that exhausts memory in the test suite
|
||||||
# causing CI to fail. 1.4.0 is the last version that works.
|
# (https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/665). 1.4.2
|
||||||
# https://marshmallow-sqlalchemy.readthedocs.io/en/latest/changelog.html#id3
|
# claimed a fix but did not address the root cause; only 1.5.0 actually fixes it.
|
||||||
# Opened this issue https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/665
|
marshmallow-sqlalchemy>=1.5.0
|
||||||
marshmallow-sqlalchemy>=1.3.0,<1.4.1
|
|
||||||
|
|
||||||
# needed for python 3.12 support
|
# needed for python 3.12 support
|
||||||
openapi-schema-validator>=0.6.3
|
openapi-schema-validator>=0.6.3
|
||||||
@@ -58,3 +57,9 @@ openapi-schema-validator>=0.6.3
|
|||||||
# Known affected packages: Preset's 'clients' package
|
# Known affected packages: Preset's 'clients' package
|
||||||
# See docs/docs/contributing/pkg-resources-migration.md for details
|
# See docs/docs/contributing/pkg-resources-migration.md for details
|
||||||
setuptools<81
|
setuptools<81
|
||||||
|
|
||||||
|
# google-auth 2.53+ dropped its transitive dependency on cachetools, which is
|
||||||
|
# imported directly by superset.db_engine_specs.aws_iam. We declare cachetools
|
||||||
|
# explicitly in pyproject.toml and pin google-auth to the post-drop range so
|
||||||
|
# the install path is internally consistent (#40962).
|
||||||
|
google-auth>=2.53.0,<3.0.0
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ cachelib==0.13.0
|
|||||||
# flask-caching
|
# flask-caching
|
||||||
# flask-session
|
# flask-session
|
||||||
cachetools==6.2.1
|
cachetools==6.2.1
|
||||||
# via google-auth
|
# via apache-superset (pyproject.toml)
|
||||||
cattrs==25.1.1
|
cattrs==25.1.1
|
||||||
# via requests-cache
|
# via requests-cache
|
||||||
celery==5.5.2
|
celery==5.5.2
|
||||||
@@ -86,10 +86,11 @@ cron-descriptor==1.4.5
|
|||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
croniter==6.2.2
|
croniter==6.2.2
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
cryptography==46.0.7
|
cryptography==48.0.1
|
||||||
# via
|
# via
|
||||||
# -r requirements/base.in
|
# -r requirements/base.in
|
||||||
# apache-superset (pyproject.toml)
|
# apache-superset (pyproject.toml)
|
||||||
|
# google-auth
|
||||||
# paramiko
|
# paramiko
|
||||||
# pyopenssl
|
# pyopenssl
|
||||||
defusedxml==0.7.1
|
defusedxml==0.7.1
|
||||||
@@ -131,7 +132,7 @@ flask-caching==2.3.1
|
|||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
flask-compress==1.17
|
flask-compress==1.17
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
flask-cors==6.0.2
|
flask-cors==6.0.5
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
flask-jwt-extended==4.7.1
|
flask-jwt-extended==4.7.1
|
||||||
# via flask-appbuilder
|
# via flask-appbuilder
|
||||||
@@ -159,9 +160,11 @@ geographiclib==2.0
|
|||||||
# via geopy
|
# via geopy
|
||||||
geopy==2.4.1
|
geopy==2.4.1
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
google-auth==2.43.0
|
google-auth==2.53.0
|
||||||
# via shillelagh
|
# via
|
||||||
greenlet==3.5.0
|
# -r requirements/base.in
|
||||||
|
# shillelagh
|
||||||
|
greenlet==3.5.1
|
||||||
# via
|
# via
|
||||||
# apache-superset (pyproject.toml)
|
# apache-superset (pyproject.toml)
|
||||||
# shillelagh
|
# shillelagh
|
||||||
@@ -223,13 +226,13 @@ markupsafe==3.0.2
|
|||||||
# mako
|
# mako
|
||||||
# werkzeug
|
# werkzeug
|
||||||
# wtforms
|
# wtforms
|
||||||
marshmallow==3.26.2
|
marshmallow==4.3.0
|
||||||
# via
|
# via
|
||||||
# apache-superset (pyproject.toml)
|
# apache-superset (pyproject.toml)
|
||||||
# flask-appbuilder
|
# flask-appbuilder
|
||||||
# marshmallow-sqlalchemy
|
# marshmallow-sqlalchemy
|
||||||
# marshmallow-union
|
# marshmallow-union
|
||||||
marshmallow-sqlalchemy==1.4.0
|
marshmallow-sqlalchemy==1.5.0
|
||||||
# via
|
# via
|
||||||
# -r requirements/base.in
|
# -r requirements/base.in
|
||||||
# flask-appbuilder
|
# flask-appbuilder
|
||||||
@@ -237,7 +240,7 @@ marshmallow-union==0.1.15
|
|||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
mdurl==0.1.2
|
mdurl==0.1.2
|
||||||
# via markdown-it-py
|
# via markdown-it-py
|
||||||
msgpack==1.0.8
|
msgpack==1.2.1
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
msgspec==0.19.0
|
msgspec==0.19.0
|
||||||
# via flask-session
|
# via flask-session
|
||||||
@@ -270,7 +273,6 @@ packaging==25.0
|
|||||||
# deprecation
|
# deprecation
|
||||||
# gunicorn
|
# gunicorn
|
||||||
# limits
|
# limits
|
||||||
# marshmallow
|
|
||||||
# shillelagh
|
# shillelagh
|
||||||
pandas==2.1.4
|
pandas==2.1.4
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
@@ -298,9 +300,7 @@ pyarrow==24.0.0
|
|||||||
# apache-superset (pyproject.toml)
|
# apache-superset (pyproject.toml)
|
||||||
# apache-superset-core
|
# apache-superset-core
|
||||||
pyasn1==0.6.3
|
pyasn1==0.6.3
|
||||||
# via
|
# via pyasn1-modules
|
||||||
# pyasn1-modules
|
|
||||||
# rsa
|
|
||||||
pyasn1-modules==0.4.2
|
pyasn1-modules==0.4.2
|
||||||
# via google-auth
|
# via google-auth
|
||||||
pycparser==2.22
|
pycparser==2.22
|
||||||
@@ -323,7 +323,7 @@ pyjwt==2.12.0
|
|||||||
# redis
|
# redis
|
||||||
pynacl==1.6.2
|
pynacl==1.6.2
|
||||||
# via paramiko
|
# via paramiko
|
||||||
pyopenssl==26.0.0
|
pyopenssl==26.2.0
|
||||||
# via
|
# via
|
||||||
# -r requirements/base.in
|
# -r requirements/base.in
|
||||||
# shillelagh
|
# shillelagh
|
||||||
@@ -344,12 +344,11 @@ python-dotenv==1.2.2
|
|||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
pytz==2025.2
|
pytz==2025.2
|
||||||
# via
|
# via
|
||||||
# croniter
|
|
||||||
# flask-babel
|
# flask-babel
|
||||||
# pandas
|
# pandas
|
||||||
pyxlsb==1.0.10
|
pyxlsb==1.0.10
|
||||||
# via pandas
|
# via pandas
|
||||||
pyyaml==6.0.2
|
pyyaml==6.0.3
|
||||||
# via
|
# via
|
||||||
# apache-superset (pyproject.toml)
|
# apache-superset (pyproject.toml)
|
||||||
# apispec
|
# apispec
|
||||||
@@ -376,8 +375,6 @@ rpds-py==0.25.0
|
|||||||
# via
|
# via
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# referencing
|
# referencing
|
||||||
rsa==4.9.1
|
|
||||||
# via google-auth
|
|
||||||
selenium==4.44.0
|
selenium==4.44.0
|
||||||
# via apache-superset (pyproject.toml)
|
# via apache-superset (pyproject.toml)
|
||||||
setuptools==80.9.0
|
setuptools==80.9.0
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ cachelib==0.13.0
|
|||||||
cachetools==6.2.1
|
cachetools==6.2.1
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# google-auth
|
# apache-superset
|
||||||
# py-key-value-aio
|
# py-key-value-aio
|
||||||
caio==0.9.25
|
caio==0.9.25
|
||||||
# via aiofile
|
# via aiofile
|
||||||
@@ -178,11 +178,12 @@ croniter==6.2.2
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
cryptography==46.0.7
|
cryptography==48.0.1
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
# authlib
|
# authlib
|
||||||
|
# google-auth
|
||||||
# paramiko
|
# paramiko
|
||||||
# pyjwt
|
# pyjwt
|
||||||
# pyopenssl
|
# pyopenssl
|
||||||
@@ -276,7 +277,7 @@ flask-compress==1.17
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
flask-cors==6.0.2
|
flask-cors==6.0.5
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
@@ -340,7 +341,7 @@ google-api-core==2.23.0
|
|||||||
# google-cloud-core
|
# google-cloud-core
|
||||||
# pandas-gbq
|
# pandas-gbq
|
||||||
# sqlalchemy-bigquery
|
# sqlalchemy-bigquery
|
||||||
google-auth==2.43.0
|
google-auth==2.53.0
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# google-api-core
|
# google-api-core
|
||||||
@@ -373,7 +374,7 @@ googleapis-common-protos==1.66.0
|
|||||||
# via
|
# via
|
||||||
# google-api-core
|
# google-api-core
|
||||||
# grpcio-status
|
# grpcio-status
|
||||||
greenlet==3.5.0
|
greenlet==3.5.1
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
@@ -382,7 +383,7 @@ greenlet==3.5.0
|
|||||||
# sqlalchemy
|
# sqlalchemy
|
||||||
griffelib==2.0.2
|
griffelib==2.0.2
|
||||||
# via fastmcp
|
# via fastmcp
|
||||||
grpcio==1.71.0
|
grpcio==1.81.1
|
||||||
# via
|
# via
|
||||||
# apache-superset
|
# apache-superset
|
||||||
# google-api-core
|
# google-api-core
|
||||||
@@ -507,6 +508,8 @@ limits==5.1.0
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# flask-limiter
|
# flask-limiter
|
||||||
|
lz4==4.4.5
|
||||||
|
# via trino
|
||||||
mako==1.3.12
|
mako==1.3.12
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
@@ -527,14 +530,14 @@ markupsafe==3.0.2
|
|||||||
# mako
|
# mako
|
||||||
# werkzeug
|
# werkzeug
|
||||||
# wtforms
|
# wtforms
|
||||||
marshmallow==3.26.2
|
marshmallow==4.3.0
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
# flask-appbuilder
|
# flask-appbuilder
|
||||||
# marshmallow-sqlalchemy
|
# marshmallow-sqlalchemy
|
||||||
# marshmallow-union
|
# marshmallow-union
|
||||||
marshmallow-sqlalchemy==1.4.0
|
marshmallow-sqlalchemy==1.5.0
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# flask-appbuilder
|
# flask-appbuilder
|
||||||
@@ -556,7 +559,7 @@ more-itertools==10.8.0
|
|||||||
# via
|
# via
|
||||||
# jaraco-classes
|
# jaraco-classes
|
||||||
# jaraco-functools
|
# jaraco-functools
|
||||||
msgpack==1.0.8
|
msgpack==1.2.1
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
@@ -608,6 +611,8 @@ ordered-set==4.1.0
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# flask-limiter
|
# flask-limiter
|
||||||
|
orjson==3.11.9
|
||||||
|
# via trino
|
||||||
outcome==1.3.0.post0
|
outcome==1.3.0.post0
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
@@ -626,7 +631,6 @@ packaging==25.0
|
|||||||
# google-cloud-bigquery
|
# google-cloud-bigquery
|
||||||
# gunicorn
|
# gunicorn
|
||||||
# limits
|
# limits
|
||||||
# marshmallow
|
|
||||||
# matplotlib
|
# matplotlib
|
||||||
# pytest
|
# pytest
|
||||||
# shillelagh
|
# shillelagh
|
||||||
@@ -723,7 +727,6 @@ pyasn1==0.6.3
|
|||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# pyasn1-modules
|
# pyasn1-modules
|
||||||
# python-ldap
|
# python-ldap
|
||||||
# rsa
|
|
||||||
pyasn1-modules==0.4.2
|
pyasn1-modules==0.4.2
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
@@ -780,7 +783,7 @@ pynacl==1.6.2
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# paramiko
|
# paramiko
|
||||||
pyopenssl==26.0.0
|
pyopenssl==26.2.0
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# shillelagh
|
# shillelagh
|
||||||
@@ -841,7 +844,6 @@ python-multipart==0.0.29
|
|||||||
pytz==2025.2
|
pytz==2025.2
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# croniter
|
|
||||||
# flask-babel
|
# flask-babel
|
||||||
# pandas
|
# pandas
|
||||||
# trino
|
# trino
|
||||||
@@ -849,7 +851,7 @@ pyxlsb==1.0.10
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# pandas
|
# pandas
|
||||||
pyyaml==6.0.2
|
pyyaml==6.0.3
|
||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# apache-superset
|
# apache-superset
|
||||||
@@ -911,10 +913,6 @@ rpds-py==0.25.0
|
|||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# referencing
|
# referencing
|
||||||
rsa==4.9.1
|
|
||||||
# via
|
|
||||||
# -c requirements/base-constraint.txt
|
|
||||||
# google-auth
|
|
||||||
ruff==0.9.7
|
ruff==0.9.7
|
||||||
# via apache-superset
|
# via apache-superset
|
||||||
s3transfer==0.16.0
|
s3transfer==0.16.0
|
||||||
@@ -1017,7 +1015,7 @@ tqdm==4.67.1
|
|||||||
# via
|
# via
|
||||||
# cmdstanpy
|
# cmdstanpy
|
||||||
# prophet
|
# prophet
|
||||||
trino==0.330.0
|
trino==0.337.0
|
||||||
# via apache-superset
|
# via apache-superset
|
||||||
trio==0.33.0
|
trio==0.33.0
|
||||||
# via
|
# via
|
||||||
@@ -1037,6 +1035,7 @@ typing-extensions==4.15.0
|
|||||||
# apache-superset-core
|
# apache-superset-core
|
||||||
# cattrs
|
# cattrs
|
||||||
# exceptiongroup
|
# exceptiongroup
|
||||||
|
# grpcio
|
||||||
# limits
|
# limits
|
||||||
# mcp
|
# mcp
|
||||||
# opentelemetry-api
|
# opentelemetry-api
|
||||||
@@ -1151,3 +1150,4 @@ zstandard==0.23.0
|
|||||||
# via
|
# via
|
||||||
# -c requirements/base-constraint.txt
|
# -c requirements/base-constraint.txt
|
||||||
# flask-compress
|
# flask-compress
|
||||||
|
# trino
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ from flask import current_app
|
|||||||
from flask_appbuilder import Model
|
from flask_appbuilder import Model
|
||||||
from flask_migrate import downgrade, upgrade
|
from flask_migrate import downgrade, upgrade
|
||||||
from progress.bar import ChargingBar
|
from progress.bar import ChargingBar
|
||||||
from sqlalchemy import create_engine, inspect
|
from sqlalchemy import create_engine, inspect, text
|
||||||
from sqlalchemy.ext.automap import automap_base
|
from sqlalchemy.ext.automap import automap_base
|
||||||
|
|
||||||
from superset import db
|
from superset import db
|
||||||
@@ -154,7 +154,7 @@ def main( # noqa: C901
|
|||||||
|
|
||||||
print(f"Migration goes from {down_revision} to {revision}")
|
print(f"Migration goes from {down_revision} to {revision}")
|
||||||
current_revision = db.engine.execute(
|
current_revision = db.engine.execute(
|
||||||
"SELECT version_num FROM alembic_version"
|
text("SELECT version_num FROM alembic_version")
|
||||||
).scalar()
|
).scalar()
|
||||||
print(f"Current version of the DB is {current_revision}")
|
print(f"Current version of the DB is {current_revision}")
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ LANGUAGE_NAMES: dict[str, str] = {
|
|||||||
"ru": "Russian",
|
"ru": "Russian",
|
||||||
"sk": "Slovak",
|
"sk": "Slovak",
|
||||||
"sl": "Slovenian",
|
"sl": "Slovenian",
|
||||||
|
"sr": "Serbian",
|
||||||
"tr": "Turkish",
|
"tr": "Turkish",
|
||||||
"uk": "Ukrainian",
|
"uk": "Ukrainian",
|
||||||
"zh": "Chinese (Simplified)",
|
"zh": "Chinese (Simplified)",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@superset-ui/embedded-sdk",
|
"name": "@superset-ui/embedded-sdk",
|
||||||
"version": "0.3.0",
|
"version": "0.4.0",
|
||||||
"description": "SDK for embedding resources from Superset into your own application",
|
"description": "SDK for embedding resources from Superset into your own application",
|
||||||
"access": "public",
|
"access": "public",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
|||||||
@@ -47,7 +47,11 @@ function logError(...args) {
|
|||||||
execSync('npm publish --access public', { stdio: 'pipe' });
|
execSync('npm publish --access public', { stdio: 'pipe' });
|
||||||
log(`published ${version} to npm`);
|
log(`published ${version} to npm`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(String(err.stdout));
|
// npm writes failure details to stderr (auth/permission/registry
|
||||||
|
// errors in particular), so surface both streams to avoid masking
|
||||||
|
// the real cause in CI logs.
|
||||||
|
if (err.stdout) console.error(String(err.stdout));
|
||||||
|
if (err.stderr) console.error(String(err.stderr));
|
||||||
logError('Encountered an error, details should be above');
|
logError('Encountered an error, details should be above');
|
||||||
process.exitCode = 1;
|
process.exitCode = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
coverageReporters: ['lcov', 'json-summary', 'html', 'text'],
|
coverageReporters: ['lcov', 'json-summary', 'html', 'text'],
|
||||||
transformIgnorePatterns: [
|
transformIgnorePatterns: [
|
||||||
'node_modules/(?!@formatjs/.*|d3-(array|interpolate|color|time|scale|time-format|format)|internmap|@mapbox/tiny-sdf|remark-gfm|(?!@ngrx|(?!deck.gl)|d3-scale)|markdown-table|micromark-*.|decode-named-character-reference|character-entities|mdast-util-*.|unist-util-*.|ccount|escape-string-regexp|nanoid|uuid|@rjsf/*.|echarts|zrender|fetch-mock|pretty-ms|parse-ms|ol|@babel/runtime|@emotion|cheerio|cheerio/lib|parse5|dom-serializer|entities|htmlparser2|rehype-sanitize|hast-util-sanitize|unified|unist-.*|hast-.*|rehype-.*|remark-.*|mdast-.*|micromark-.*|parse-entities|property-information|space-separated-tokens|comma-separated-tokens|bail|devlop|zwitch|longest-streak|geostyler|geostyler-.*|(?!geostyler)lodash|react-error-boundary|react-json-tree|react-base16-styling|lodash-es|rbush|quickselect|react-diff-viewer-continued|storybook/*.)',
|
'node_modules/(?!@formatjs/.*|d3-(array|interpolate|color|time|scale|time-format|format)|internmap|@mapbox/tiny-sdf|remark-gfm|(?!@ngrx|(?!deck.gl)|d3-scale)|markdown-table|micromark-*.|decode-named-character-reference|character-entities|mdast-util-*.|unist-util-*.|ccount|escape-string-regexp|nanoid|uuid|@rjsf/*.|echarts|zrender|fetch-mock|pretty-ms|parse-ms|ol|@babel/runtime|@emotion|cheerio|cheerio/lib|parse5|dom-serializer|entities|htmlparser2|rehype-sanitize|hast-util-sanitize|unified|unist-.*|hast-.*|rehype-.*|remark-.*|mdast-.*|micromark-.*|parse-entities|property-information|space-separated-tokens|comma-separated-tokens|bail|devlop|zwitch|longest-streak|geostyler|geostyler-.*|(?!geostyler)lodash|react-error-boundary|react-json-tree|react-base16-styling|lodash-es|rbush|quickselect|react-diff-viewer-continued|storybook/*.|json-stringify-pretty-compact)',
|
||||||
],
|
],
|
||||||
preset: 'ts-jest',
|
preset: 'ts-jest',
|
||||||
transform: {
|
transform: {
|
||||||
|
|||||||
2253
superset-frontend/package-lock.json
generated
2253
superset-frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -119,7 +119,7 @@
|
|||||||
"@great-expectations/jsonforms-antd-renderers": "^2.2.10",
|
"@great-expectations/jsonforms-antd-renderers": "^2.2.10",
|
||||||
"@jsonforms/core": "^3.7.0",
|
"@jsonforms/core": "^3.7.0",
|
||||||
"@jsonforms/react": "^3.7.0",
|
"@jsonforms/react": "^3.7.0",
|
||||||
"@jsonforms/vanilla-renderers": "^3.7.0",
|
"@jsonforms/vanilla-renderers": "^3.8.0",
|
||||||
"@luma.gl/constants": "~9.2.5",
|
"@luma.gl/constants": "~9.2.5",
|
||||||
"@luma.gl/core": "~9.2.5",
|
"@luma.gl/core": "~9.2.5",
|
||||||
"@luma.gl/engine": "~9.2.5",
|
"@luma.gl/engine": "~9.2.5",
|
||||||
@@ -158,22 +158,21 @@
|
|||||||
"@types/d3-selection": "^3.0.11",
|
"@types/d3-selection": "^3.0.11",
|
||||||
"@types/d3-time-format": "^4.0.3",
|
"@types/d3-time-format": "^4.0.3",
|
||||||
"@types/react-google-recaptcha": "^2.1.9",
|
"@types/react-google-recaptcha": "^2.1.9",
|
||||||
"@visx/axis": "^3.8.0",
|
"@visx/axis": "^4.0.0",
|
||||||
"@visx/grid": "^3.5.0",
|
"@visx/grid": "^4.0.0",
|
||||||
"@visx/responsive": "^3.0.0",
|
"@visx/responsive": "^4.0.0",
|
||||||
"@visx/scale": "^3.5.0",
|
"@visx/scale": "^4.0.0",
|
||||||
"@visx/tooltip": "^3.0.0",
|
"@visx/tooltip": "^4.0.0",
|
||||||
"@visx/xychart": "^3.5.1",
|
"@visx/xychart": "^4.0.0",
|
||||||
"ag-grid-community": "35.3.1",
|
"ag-grid-community": "35.3.1",
|
||||||
"ag-grid-react": "35.3.1",
|
"ag-grid-react": "35.3.1",
|
||||||
"antd": "^5.26.0",
|
"antd": "^5.26.0",
|
||||||
"chrono-node": "^2.9.1",
|
"chrono-node": "^2.9.1",
|
||||||
"classnames": "^2.2.5",
|
"classnames": "^2.2.5",
|
||||||
"content-disposition": "^2.0.1",
|
"content-disposition": "^2.0.1",
|
||||||
"d3-color": "^3.1.0",
|
|
||||||
"d3-scale": "^4.0.2",
|
"d3-scale": "^4.0.2",
|
||||||
"dayjs": "^1.11.21",
|
"dayjs": "^1.11.21",
|
||||||
"dom-to-image-more": "^3.7.2",
|
"dom-to-image-more": "^3.10.0",
|
||||||
"dom-to-pdf": "^0.3.2",
|
"dom-to-pdf": "^0.3.2",
|
||||||
"echarts": "^5.6.0",
|
"echarts": "^5.6.0",
|
||||||
"fast-glob": "^3.3.2",
|
"fast-glob": "^3.3.2",
|
||||||
@@ -191,12 +190,12 @@
|
|||||||
"jquery": "^4.0.0",
|
"jquery": "^4.0.0",
|
||||||
"js-levenshtein": "^1.1.6",
|
"js-levenshtein": "^1.1.6",
|
||||||
"json-bigint": "^1.0.0",
|
"json-bigint": "^1.0.0",
|
||||||
"json-stringify-pretty-compact": "^2.0.0",
|
"json-stringify-pretty-compact": "^4.0.0",
|
||||||
"lodash": "^4.18.1",
|
"lodash": "^4.18.1",
|
||||||
"mapbox-gl": "^3.24.0",
|
"mapbox-gl": "^3.24.1",
|
||||||
"markdown-to-jsx": "^9.8.1",
|
"markdown-to-jsx": "^9.8.2",
|
||||||
"match-sorter": "^8.3.0",
|
"match-sorter": "^8.3.0",
|
||||||
"memoize-one": "^5.2.1",
|
"memoize-one": "^6.0.0",
|
||||||
"mousetrap": "^1.6.5",
|
"mousetrap": "^1.6.5",
|
||||||
"mustache": "^4.2.0",
|
"mustache": "^4.2.0",
|
||||||
"nanoid": "^5.1.11",
|
"nanoid": "^5.1.11",
|
||||||
@@ -204,7 +203,7 @@
|
|||||||
"query-string": "9.4.0",
|
"query-string": "9.4.0",
|
||||||
"re-resizable": "^6.11.2",
|
"re-resizable": "^6.11.2",
|
||||||
"react": "^18.3.0",
|
"react": "^18.3.0",
|
||||||
"react-arborist": "^3.10.1",
|
"react-arborist": "^3.10.5",
|
||||||
"react-checkbox-tree": "^1.8.0",
|
"react-checkbox-tree": "^1.8.0",
|
||||||
"react-diff-viewer-continued": "^4.2.2",
|
"react-diff-viewer-continued": "^4.2.2",
|
||||||
"react-dnd": "^11.1.3",
|
"react-dnd": "^11.1.3",
|
||||||
@@ -231,9 +230,9 @@
|
|||||||
"redux-undo": "^1.0.0-beta9-9-7",
|
"redux-undo": "^1.0.0-beta9-9-7",
|
||||||
"rison": "^0.1.1",
|
"rison": "^0.1.1",
|
||||||
"scroll-into-view-if-needed": "^3.1.0",
|
"scroll-into-view-if-needed": "^3.1.0",
|
||||||
"simple-zstd": "^1.4.2",
|
"simple-zstd": "^2.1.0",
|
||||||
"stream-browserify": "^3.0.0",
|
"stream-browserify": "^3.0.0",
|
||||||
"tinycolor2": "^1.4.2",
|
"tinycolor2": "^1.6.0",
|
||||||
"urijs": "^1.19.8",
|
"urijs": "^1.19.8",
|
||||||
"use-event-callback": "^0.1.0",
|
"use-event-callback": "^0.1.0",
|
||||||
"use-immer": "^0.11.0",
|
"use-immer": "^0.11.0",
|
||||||
@@ -261,17 +260,17 @@
|
|||||||
"@babel/types": "^7.29.7",
|
"@babel/types": "^7.29.7",
|
||||||
"@emotion/babel-plugin": "^11.13.5",
|
"@emotion/babel-plugin": "^11.13.5",
|
||||||
"@emotion/jest": "^11.14.2",
|
"@emotion/jest": "^11.14.2",
|
||||||
"@formatjs/intl-durationformat": "^0.10.14",
|
"@formatjs/intl-durationformat": "^0.10.15",
|
||||||
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
||||||
"@playwright/test": "^1.60.0",
|
"@playwright/test": "^1.61.0",
|
||||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.2",
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.2",
|
||||||
"@storybook/addon-docs": "10.4.3",
|
"@storybook/addon-docs": "10.4.5",
|
||||||
"@storybook/addon-links": "10.4.3",
|
"@storybook/addon-links": "10.4.4",
|
||||||
"@storybook/react-webpack5": "10.4.3",
|
"@storybook/react-webpack5": "10.4.4",
|
||||||
"@storybook/test-runner": "0.24.4",
|
"@storybook/test-runner": "0.24.4",
|
||||||
"@svgr/webpack": "^8.1.0",
|
"@svgr/webpack": "^8.1.0",
|
||||||
"@swc/core": "^1.15.41",
|
"@swc/core": "^1.15.41",
|
||||||
"@swc/plugin-emotion": "^14.12.0",
|
"@swc/plugin-emotion": "^14.13.0",
|
||||||
"@swc/plugin-transform-imports": "^12.5.0",
|
"@swc/plugin-transform-imports": "^12.5.0",
|
||||||
"@testing-library/dom": "^9.3.4",
|
"@testing-library/dom": "^9.3.4",
|
||||||
"@testing-library/jest-dom": "^6.9.1",
|
"@testing-library/jest-dom": "^6.9.1",
|
||||||
@@ -284,7 +283,7 @@
|
|||||||
"@types/js-levenshtein": "^1.1.3",
|
"@types/js-levenshtein": "^1.1.3",
|
||||||
"@types/json-bigint": "^1.0.4",
|
"@types/json-bigint": "^1.0.4",
|
||||||
"@types/mousetrap": "^1.6.15",
|
"@types/mousetrap": "^1.6.15",
|
||||||
"@types/node": "^25.9.2",
|
"@types/node": "^25.9.3",
|
||||||
"@types/react": "^18.3.0",
|
"@types/react": "^18.3.0",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@types/react-loadable": "^5.5.11",
|
"@types/react-loadable": "^5.5.11",
|
||||||
@@ -297,21 +296,21 @@
|
|||||||
"@types/rison": "0.1.0",
|
"@types/rison": "0.1.0",
|
||||||
"@types/tinycolor2": "^1.4.3",
|
"@types/tinycolor2": "^1.4.3",
|
||||||
"@types/unzipper": "^0.10.11",
|
"@types/unzipper": "^0.10.11",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.61.0",
|
"@typescript-eslint/eslint-plugin": "^8.61.1",
|
||||||
"@typescript-eslint/parser": "^8.61.0",
|
"@typescript-eslint/parser": "^8.61.0",
|
||||||
"babel-jest": "^30.4.1",
|
"babel-jest": "^30.4.1",
|
||||||
"babel-loader": "^10.1.1",
|
"babel-loader": "^10.1.1",
|
||||||
"babel-plugin-dynamic-import-node": "^2.3.3",
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
||||||
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
|
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
|
||||||
"babel-plugin-lodash": "^3.3.4",
|
"babel-plugin-lodash": "^3.3.4",
|
||||||
"baseline-browser-mapping": "^2.10.34",
|
"baseline-browser-mapping": "^2.10.37",
|
||||||
"cheerio": "1.2.0",
|
"cheerio": "1.2.0",
|
||||||
"concurrently": "^10.0.3",
|
"concurrently": "^10.0.3",
|
||||||
"copy-webpack-plugin": "^14.0.0",
|
"copy-webpack-plugin": "^14.0.0",
|
||||||
"cross-env": "^10.1.0",
|
"cross-env": "^10.1.0",
|
||||||
"css-loader": "^7.1.4",
|
"css-loader": "^7.1.4",
|
||||||
"css-minimizer-webpack-plugin": "^8.0.0",
|
"css-minimizer-webpack-plugin": "^8.0.0",
|
||||||
"eslint": "^10.4.1",
|
"eslint": "^10.5.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-import-resolver-alias": "^1.1.2",
|
"eslint-import-resolver-alias": "^1.1.2",
|
||||||
"eslint-import-resolver-typescript": "^4.4.5",
|
"eslint-import-resolver-typescript": "^4.4.5",
|
||||||
@@ -324,8 +323,8 @@
|
|||||||
"eslint-plugin-no-only-tests": "^3.4.0",
|
"eslint-plugin-no-only-tests": "^3.4.0",
|
||||||
"eslint-plugin-prettier": "^5.5.6",
|
"eslint-plugin-prettier": "^5.5.6",
|
||||||
"eslint-plugin-react-prefer-function-component": "^5.0.0",
|
"eslint-plugin-react-prefer-function-component": "^5.0.0",
|
||||||
"eslint-plugin-react-you-might-not-need-an-effect": "^1.0.0",
|
"eslint-plugin-react-you-might-not-need-an-effect": "^1.0.1",
|
||||||
"eslint-plugin-storybook": "10.4.2",
|
"eslint-plugin-storybook": "10.4.5",
|
||||||
"eslint-plugin-testing-library": "^7.16.2",
|
"eslint-plugin-testing-library": "^7.16.2",
|
||||||
"eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
|
"eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
|
||||||
"fetch-mock": "^12.6.0",
|
"fetch-mock": "^12.6.0",
|
||||||
@@ -344,19 +343,19 @@
|
|||||||
"lightningcss": "^1.32.0",
|
"lightningcss": "^1.32.0",
|
||||||
"mini-css-extract-plugin": "^2.10.2",
|
"mini-css-extract-plugin": "^2.10.2",
|
||||||
"open-cli": "^9.0.0",
|
"open-cli": "^9.0.0",
|
||||||
"oxlint": "^1.69.0",
|
"oxlint": "^1.70.0",
|
||||||
"po2json": "^0.4.5",
|
"po2json": "^0.4.5",
|
||||||
"prettier": "3.8.4",
|
"prettier": "3.8.4",
|
||||||
"prettier-plugin-packagejson": "^3.0.2",
|
"prettier-plugin-packagejson": "^3.0.2",
|
||||||
"process": "^0.11.10",
|
"process": "^0.11.10",
|
||||||
"react-dnd-test-backend": "^11.1.3",
|
"react-dnd-test-backend": "^16.0.1",
|
||||||
"react-refresh": "^0.18.0",
|
"react-refresh": "^0.18.0",
|
||||||
"react-resizable": "^4.0.1",
|
"react-resizable": "^4.0.1",
|
||||||
"redux-mock-store": "^1.5.4",
|
"redux-mock-store": "^1.5.4",
|
||||||
"source-map": "^0.7.6",
|
"source-map": "^0.7.6",
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"speed-measure-webpack-plugin": "^1.6.0",
|
"speed-measure-webpack-plugin": "^1.6.0",
|
||||||
"storybook": "10.4.3",
|
"storybook": "10.4.6",
|
||||||
"style-loader": "^4.0.0",
|
"style-loader": "^4.0.0",
|
||||||
"swc-loader": "^0.2.7",
|
"swc-loader": "^0.2.7",
|
||||||
"terser-webpack-plugin": "^5.6.1",
|
"terser-webpack-plugin": "^5.6.1",
|
||||||
@@ -370,7 +369,7 @@
|
|||||||
"webpack": "^5.107.2",
|
"webpack": "^5.107.2",
|
||||||
"webpack-bundle-analyzer": "^5.3.0",
|
"webpack-bundle-analyzer": "^5.3.0",
|
||||||
"webpack-cli": "^7.0.3",
|
"webpack-cli": "^7.0.3",
|
||||||
"webpack-dev-server": "^5.2.4",
|
"webpack-dev-server": "^5.2.5",
|
||||||
"webpack-manifest-plugin": "^6.0.1",
|
"webpack-manifest-plugin": "^6.0.1",
|
||||||
"webpack-sources": "^3.5.0",
|
"webpack-sources": "^3.5.0",
|
||||||
"webpack-visualizer-plugin2": "^2.0.0"
|
"webpack-visualizer-plugin2": "^2.0.0"
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
"cross-env": "^10.1.0",
|
"cross-env": "^10.1.0",
|
||||||
"fs-extra": "^11.3.5",
|
"fs-extra": "^11.3.5",
|
||||||
"jest": "^30.4.2",
|
"jest": "^30.4.2",
|
||||||
"yeoman-test": "^11.5.3"
|
"yeoman-test": "^11.6.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"npm": ">= 4.0.0",
|
"npm": ">= 4.0.0",
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
"@testing-library/user-event": "*",
|
"@testing-library/user-event": "*",
|
||||||
"ace-builds": "^1.4.14",
|
"ace-builds": "^1.4.14",
|
||||||
"brace": "^0.11.1",
|
"brace": "^0.11.1",
|
||||||
"memoize-one": "^5.1.1",
|
"memoize-one": "^6.0.0",
|
||||||
"react": "^18.3.0",
|
"react": "^18.3.0",
|
||||||
"react-ace": "^10.1.0",
|
"react-ace": "^10.1.0",
|
||||||
"react-dom": "^18.3.0"
|
"react-dom": "^18.3.0"
|
||||||
|
|||||||
@@ -677,7 +677,9 @@ export interface ServerPaginationData {
|
|||||||
|
|
||||||
export type TableColumnConfig = {
|
export type TableColumnConfig = {
|
||||||
d3NumberFormat?: string;
|
d3NumberFormat?: string;
|
||||||
d3SmallNumberFormat?: string;
|
// Allow null to match JSON round-trips, where an unset value deserializes
|
||||||
|
// from the metadata DB as `null` rather than `undefined`.
|
||||||
|
d3SmallNumberFormat?: string | null;
|
||||||
d3TimeFormat?: string;
|
d3TimeFormat?: string;
|
||||||
columnWidth?: number;
|
columnWidth?: number;
|
||||||
horizontalAlign?: 'left' | 'right' | 'center';
|
horizontalAlign?: 'left' | 'right' | 'center';
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
"@babel/runtime": "^7.29.7",
|
"@babel/runtime": "^7.29.7",
|
||||||
"@braintree/sanitize-url": "^7.1.2",
|
"@braintree/sanitize-url": "^7.1.2",
|
||||||
"@types/json-bigint": "^1.0.4",
|
"@types/json-bigint": "^1.0.4",
|
||||||
"@visx/responsive": "^3.12.0",
|
"@visx/responsive": "^4.0.0",
|
||||||
"ace-builds": "^1.44.0",
|
"ace-builds": "^1.44.0",
|
||||||
"ag-grid-community": "35.3.1",
|
"ag-grid-community": "35.3.1",
|
||||||
"ag-grid-react": "35.3.1",
|
"ag-grid-react": "35.3.1",
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
"d3-time": "^3.1.0",
|
"d3-time": "^3.1.0",
|
||||||
"d3-time-format": "^4.1.0",
|
"d3-time-format": "^4.1.0",
|
||||||
"dayjs": "^1.11.21",
|
"dayjs": "^1.11.21",
|
||||||
"dompurify": "^3.4.9",
|
"dompurify": "^3.4.11",
|
||||||
"fetch-retry": "^6.0.0",
|
"fetch-retry": "^6.0.0",
|
||||||
"handlebars": "^4.7.9",
|
"handlebars": "^4.7.9",
|
||||||
"jed": "^1.1.1",
|
"jed": "^1.1.1",
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
"@types/d3-time-format": "^4.0.3",
|
"@types/d3-time-format": "^4.0.3",
|
||||||
"@types/jquery": "^4.0.1",
|
"@types/jquery": "^4.0.1",
|
||||||
"@types/lodash": "^4.17.24",
|
"@types/lodash": "^4.17.24",
|
||||||
"@types/node": "^25.9.2",
|
"@types/node": "^25.9.3",
|
||||||
"@types/prop-types": "^15.7.15",
|
"@types/prop-types": "^15.7.15",
|
||||||
"@types/react-syntax-highlighter": "^15.5.13",
|
"@types/react-syntax-highlighter": "^15.5.13",
|
||||||
"@types/react-table": "^7.7.20",
|
"@types/react-table": "^7.7.20",
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ import {
|
|||||||
FundProjectionScreenOutlined,
|
FundProjectionScreenOutlined,
|
||||||
FunctionOutlined,
|
FunctionOutlined,
|
||||||
HighlightOutlined,
|
HighlightOutlined,
|
||||||
|
HomeOutlined,
|
||||||
InfoCircleOutlined,
|
InfoCircleOutlined,
|
||||||
InfoCircleFilled,
|
InfoCircleFilled,
|
||||||
InsertRowAboveOutlined,
|
InsertRowAboveOutlined,
|
||||||
@@ -243,6 +244,7 @@ const AntdIcons = {
|
|||||||
GoogleOutlined,
|
GoogleOutlined,
|
||||||
GroupOutlined,
|
GroupOutlined,
|
||||||
HighlightOutlined,
|
HighlightOutlined,
|
||||||
|
HomeOutlined,
|
||||||
InfoCircleOutlined,
|
InfoCircleOutlined,
|
||||||
InfoCircleFilled,
|
InfoCircleFilled,
|
||||||
InsertRowAboveOutlined,
|
InsertRowAboveOutlined,
|
||||||
|
|||||||
@@ -74,7 +74,10 @@ export function transformLinkUri(uri: string): string {
|
|||||||
// "java\tscript:" or "java\x01script:") are ignored by browsers, so strip
|
// "java\tscript:" or "java\x01script:") are ignored by browsers, so strip
|
||||||
// them before comparing against the blocklist.
|
// them before comparing against the blocklist.
|
||||||
// eslint-disable-next-line no-control-regex
|
// eslint-disable-next-line no-control-regex
|
||||||
const scheme = url.slice(0, colon).replace(/[\u0000-\u0020]/g, '').toLowerCase();
|
const scheme = url
|
||||||
|
.slice(0, colon)
|
||||||
|
.replace(/[\u0000-\u0020]/g, '')
|
||||||
|
.toLowerCase();
|
||||||
return DANGEROUS_LINK_PROTOCOLS.includes(scheme) ? '' : url;
|
return DANGEROUS_LINK_PROTOCOLS.includes(scheme) ? '' : url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -519,7 +519,8 @@ const Select = forwardRef(
|
|||||||
handleSelectAll();
|
handleSelectAll();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{t('Select all')} {`(${formatNumber('SMART_NUMBER', bulkSelectCounts.selectable)})`}
|
{t('Select all')}{' '}
|
||||||
|
{`(${formatNumber('SMART_NUMBER', bulkSelectCounts.selectable)})`}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
type="link"
|
type="link"
|
||||||
@@ -536,7 +537,8 @@ const Select = forwardRef(
|
|||||||
handleDeselectAll();
|
handleDeselectAll();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{t('Clear')} {`(${formatNumber('SMART_NUMBER', bulkSelectCounts.deselectable)})`}
|
{t('Clear')}{' '}
|
||||||
|
{`(${formatNumber('SMART_NUMBER', bulkSelectCounts.deselectable)})`}
|
||||||
</Button>
|
</Button>
|
||||||
</StyledBulkActionsContainer>
|
</StyledBulkActionsContainer>
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -52,6 +52,13 @@ const SupersetClient: SupersetClientInterface = {
|
|||||||
request: request => getInstance().request(request),
|
request: request => getInstance().request(request),
|
||||||
getCSRFToken: () => getInstance().getCSRFToken(),
|
getCSRFToken: () => getInstance().getCSRFToken(),
|
||||||
getUrl: (...args) => getInstance().getUrl(...args),
|
getUrl: (...args) => getInstance().getUrl(...args),
|
||||||
|
get guestTokenHeaderName() {
|
||||||
|
try {
|
||||||
|
return getInstance().guestTokenHeaderName;
|
||||||
|
} catch {
|
||||||
|
return 'X-GuestToken';
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default SupersetClient;
|
export default SupersetClient;
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ export interface SupersetClientInterface extends Pick<
|
|||||||
configure: (config?: ClientConfig) => SupersetClientInterface;
|
configure: (config?: ClientConfig) => SupersetClientInterface;
|
||||||
reset: () => void;
|
reset: () => void;
|
||||||
getCSRFToken: () => CsrfPromise;
|
getCSRFToken: () => CsrfPromise;
|
||||||
|
guestTokenHeaderName?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SupersetClientResponse = Response | JsonResponse | TextResponse;
|
export type SupersetClientResponse = Response | JsonResponse | TextResponse;
|
||||||
|
|||||||
@@ -18,7 +18,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { ExtensibleFunction } from '../models';
|
import { ExtensibleFunction } from '../models';
|
||||||
import { getNumberFormatter, NumberFormats } from '../number-format';
|
// Import from the concrete modules rather than the `number-format` barrel to
|
||||||
|
// avoid a circular dependency (the barrel pulls in getSmallNumberFormatter,
|
||||||
|
// which imports CurrencyFormatter).
|
||||||
|
import { getNumberFormatter } from '../number-format/NumberFormatterRegistrySingleton';
|
||||||
|
import NumberFormats from '../number-format/NumberFormats';
|
||||||
import { Currency } from '../query';
|
import { Currency } from '../query';
|
||||||
import { RowData, RowDataValue } from './types';
|
import { RowData, RowDataValue } from './types';
|
||||||
import { AUTO_CURRENCY_SYMBOL, ISO_4217_REGEX } from './CurrencyFormats';
|
import { AUTO_CURRENCY_SYMBOL, ISO_4217_REGEX } from './CurrencyFormats';
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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 { CurrencyFormatter } from '../currency-format';
|
||||||
|
import { Currency } from '../query';
|
||||||
|
import NumberFormatter from './NumberFormatter';
|
||||||
|
import { getNumberFormatter } from './NumberFormatterRegistrySingleton';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the appropriate formatter for small numbers (|value| < 1).
|
||||||
|
*
|
||||||
|
* When `d3SmallNumberFormat` is nullish or blank the caller's default
|
||||||
|
* formatter is returned unchanged, which preserves percentage formats
|
||||||
|
* that would otherwise be lost.
|
||||||
|
*
|
||||||
|
* Handles the cases where `d3SmallNumberFormat` is `null` (from JSON
|
||||||
|
* serialization of `undefined`) or `""` (from a cleared Select control).
|
||||||
|
*
|
||||||
|
* The generic parameter `F` allows callers to pass any formatter type
|
||||||
|
* (e.g. TimeFormatter, CustomFormatter) without a circular dependency
|
||||||
|
* on @superset-ui/chart-controls.
|
||||||
|
*/
|
||||||
|
export default function getSmallNumberFormatter<F>(
|
||||||
|
defaultFormatter: F,
|
||||||
|
d3SmallNumberFormat: string | null | undefined,
|
||||||
|
currencyFormat?: Currency,
|
||||||
|
): F | NumberFormatter | CurrencyFormatter {
|
||||||
|
if (d3SmallNumberFormat == null || d3SmallNumberFormat.trim() === '') {
|
||||||
|
return defaultFormatter;
|
||||||
|
}
|
||||||
|
if (currencyFormat) {
|
||||||
|
return new CurrencyFormatter({
|
||||||
|
d3Format: d3SmallNumberFormat,
|
||||||
|
currency: currencyFormat,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return getNumberFormatter(d3SmallNumberFormat);
|
||||||
|
}
|
||||||
@@ -34,3 +34,4 @@ export { default as createDurationFormatter } from './factories/createDurationFo
|
|||||||
export { default as createMemoryFormatter } from './factories/createMemoryFormatter';
|
export { default as createMemoryFormatter } from './factories/createMemoryFormatter';
|
||||||
export { default as createSiAtMostNDigitFormatter } from './factories/createSiAtMostNDigitFormatter';
|
export { default as createSiAtMostNDigitFormatter } from './factories/createSiAtMostNDigitFormatter';
|
||||||
export { default as createSmartNumberFormatter } from './factories/createSmartNumberFormatter';
|
export { default as createSmartNumberFormatter } from './factories/createSmartNumberFormatter';
|
||||||
|
export { default as getSmallNumberFormatter } from './getSmallNumberFormatter';
|
||||||
|
|||||||
@@ -172,4 +172,15 @@ describe('SupersetClient', () => {
|
|||||||
const token = await SupersetClient.getCSRFToken();
|
const token = await SupersetClient.getCSRFToken();
|
||||||
expect(token).toBe('my_token');
|
expect(token).toBe('my_token');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('guestTokenHeaderName returns the configured header name when instance exists', () => {
|
||||||
|
SupersetClient.configure({ guestTokenHeaderName: 'X-Custom-Guest' });
|
||||||
|
expect(SupersetClient.guestTokenHeaderName).toBe('X-Custom-Guest');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('guestTokenHeaderName returns default X-GuestToken when instance is not configured', () => {
|
||||||
|
// Ensure instance is reset (afterEach calls SupersetClient.reset())
|
||||||
|
// Access the property without calling configure() first
|
||||||
|
expect(SupersetClient.guestTokenHeaderName).toBe('X-GuestToken');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* 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 {
|
||||||
|
CurrencyFormatter,
|
||||||
|
getNumberFormatter,
|
||||||
|
getSmallNumberFormatter,
|
||||||
|
NumberFormatter,
|
||||||
|
} from '@superset-ui/core';
|
||||||
|
|
||||||
|
const defaultFormatter = getNumberFormatter('.8%');
|
||||||
|
|
||||||
|
describe('getSmallNumberFormatter', () => {
|
||||||
|
test('returns defaultFormatter when d3SmallNumberFormat is undefined', () => {
|
||||||
|
expect(getSmallNumberFormatter(defaultFormatter, undefined)).toBe(
|
||||||
|
defaultFormatter,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns defaultFormatter when d3SmallNumberFormat is null (JSON round-trip)', () => {
|
||||||
|
expect(getSmallNumberFormatter(defaultFormatter, null)).toBe(
|
||||||
|
defaultFormatter,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns defaultFormatter when d3SmallNumberFormat is empty string (cleared Select)', () => {
|
||||||
|
expect(getSmallNumberFormatter(defaultFormatter, '')).toBe(
|
||||||
|
defaultFormatter,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns defaultFormatter when d3SmallNumberFormat is whitespace', () => {
|
||||||
|
expect(getSmallNumberFormatter(defaultFormatter, ' ')).toBe(
|
||||||
|
defaultFormatter,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns a NumberFormatter when d3SmallNumberFormat is a valid format', () => {
|
||||||
|
const result = getSmallNumberFormatter(defaultFormatter, ',.4f');
|
||||||
|
expect(result).toBeInstanceOf(NumberFormatter);
|
||||||
|
expect(result).not.toBe(defaultFormatter);
|
||||||
|
expect(result!(0.12345)).toBe('0.1235');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns a CurrencyFormatter when currencyFormat is provided', () => {
|
||||||
|
const result = getSmallNumberFormatter(defaultFormatter, ',.4f', {
|
||||||
|
symbol: 'USD',
|
||||||
|
symbolPosition: 'prefix',
|
||||||
|
});
|
||||||
|
expect(result).toBeInstanceOf(CurrencyFormatter);
|
||||||
|
expect(result!(0.12345)).toContain('0.1235');
|
||||||
|
expect(result!(0.12345)).toContain('$');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('preserves percentage formatter output for small numbers when d3SmallNumberFormat is null', () => {
|
||||||
|
const pctFormatter = getNumberFormatter('.8%');
|
||||||
|
const result = getSmallNumberFormatter(pctFormatter, null);
|
||||||
|
expect(result!(-0.00001229)).toBe('-0.00122900%');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns undefined when defaultFormatter is undefined and d3SmallNumberFormat is nullish', () => {
|
||||||
|
expect(getSmallNumberFormatter(undefined, null)).toBeUndefined();
|
||||||
|
expect(getSmallNumberFormatter(undefined, undefined)).toBeUndefined();
|
||||||
|
expect(getSmallNumberFormatter(undefined, '')).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -97,8 +97,11 @@ testWithAssets(
|
|||||||
});
|
});
|
||||||
|
|
||||||
// At least one list item should contain a DD.MM.YYYY formatted date.
|
// At least one list item should contain a DD.MM.YYYY formatted date.
|
||||||
await expect(panel.locator('li').first()).toHaveText(/\d{2}\.\d{2}\.\d{4}/, {
|
await expect(panel.locator('li').first()).toHaveText(
|
||||||
timeout: TIMEOUT.API_RESPONSE,
|
/\d{2}\.\d{2}\.\d{4}/,
|
||||||
});
|
{
|
||||||
|
timeout: TIMEOUT.API_RESPONSE,
|
||||||
|
},
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -182,10 +182,7 @@ testWithAssets(
|
|||||||
// Now track POST /api/v1/chart/data requests around Clear All
|
// Now track POST /api/v1/chart/data requests around Clear All
|
||||||
const postsAfterClearAll: string[] = [];
|
const postsAfterClearAll: string[] = [];
|
||||||
const handler = (req: any) => {
|
const handler = (req: any) => {
|
||||||
if (
|
if (req.url().includes('/api/v1/chart/data') && req.method() === 'POST') {
|
||||||
req.url().includes('/api/v1/chart/data') &&
|
|
||||||
req.method() === 'POST'
|
|
||||||
) {
|
|
||||||
postsAfterClearAll.push(req.url());
|
postsAfterClearAll.push(req.url());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -109,7 +109,12 @@ testWithAssets(
|
|||||||
id: chartLayoutKey,
|
id: chartLayoutKey,
|
||||||
children: [],
|
children: [],
|
||||||
parents: ['ROOT_ID', 'GRID_ID', 'ROW-1'],
|
parents: ['ROOT_ID', 'GRID_ID', 'ROW-1'],
|
||||||
meta: { chartId, width: 8, height: 60, sliceName: 'mixed_filter_repro' },
|
meta: {
|
||||||
|
chartId,
|
||||||
|
width: 8,
|
||||||
|
height: 60,
|
||||||
|
sliceName: 'mixed_filter_repro',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
const jsonMetadata = {
|
const jsonMetadata = {
|
||||||
@@ -130,9 +135,7 @@ testWithAssets(
|
|||||||
defaultDataMask: {
|
defaultDataMask: {
|
||||||
filterState: { value: [FILTER_VALUE] },
|
filterState: { value: [FILTER_VALUE] },
|
||||||
extraFormData: {
|
extraFormData: {
|
||||||
filters: [
|
filters: [{ col: FILTER_COLUMN, op: 'IN', val: [FILTER_VALUE] }],
|
||||||
{ col: FILTER_COLUMN, op: 'IN', val: [FILTER_VALUE] },
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cascadeParentIds: [],
|
cascadeParentIds: [],
|
||||||
@@ -158,15 +161,14 @@ testWithAssets(
|
|||||||
const dashboardId: number = dashBody.result?.id ?? dashBody.id;
|
const dashboardId: number = dashBody.result?.id ?? dashBody.id;
|
||||||
testAssets.trackDashboard(dashboardId);
|
testAssets.trackDashboard(dashboardId);
|
||||||
|
|
||||||
await apiPut(page, `api/v1/chart/${chartId}`, { dashboards: [dashboardId] });
|
await apiPut(page, `api/v1/chart/${chartId}`, {
|
||||||
|
dashboards: [dashboardId],
|
||||||
|
});
|
||||||
|
|
||||||
// Capture the Mixed chart's data request (the one with two queries).
|
// Capture the Mixed chart's data request (the one with two queries).
|
||||||
const twoQueryPayloads: any[] = [];
|
const twoQueryPayloads: any[] = [];
|
||||||
page.on('request', req => {
|
page.on('request', req => {
|
||||||
if (
|
if (req.url().includes('/api/v1/chart/data') && req.method() === 'POST') {
|
||||||
req.url().includes('/api/v1/chart/data') &&
|
|
||||||
req.method() === 'POST'
|
|
||||||
) {
|
|
||||||
try {
|
try {
|
||||||
const body = req.postDataJSON();
|
const body = req.postDataJSON();
|
||||||
if (body?.queries?.length === 2) {
|
if (body?.queries?.length === 2) {
|
||||||
|
|||||||
@@ -50,7 +50,10 @@ import {
|
|||||||
getGuestToken,
|
getGuestToken,
|
||||||
} from '../../helpers/api/embedded';
|
} from '../../helpers/api/embedded';
|
||||||
import { apiPost, apiPut } from '../../helpers/api/requests';
|
import { apiPost, apiPut } from '../../helpers/api/requests';
|
||||||
import { apiPostDashboard, apiDeleteDashboard } from '../../helpers/api/dashboard';
|
import {
|
||||||
|
apiPostDashboard,
|
||||||
|
apiDeleteDashboard,
|
||||||
|
} from '../../helpers/api/dashboard';
|
||||||
import { apiDeleteChart } from '../../helpers/api/chart';
|
import { apiDeleteChart } from '../../helpers/api/chart';
|
||||||
import { EmbeddedPage } from '../../pages/EmbeddedPage';
|
import { EmbeddedPage } from '../../pages/EmbeddedPage';
|
||||||
import { EMBEDDED } from '../../utils/constants';
|
import { EMBEDDED } from '../../utils/constants';
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import {
|
|||||||
ControlPanelConfig,
|
ControlPanelConfig,
|
||||||
D3_FORMAT_DOCS,
|
D3_FORMAT_DOCS,
|
||||||
D3_TIME_FORMAT_OPTIONS,
|
D3_TIME_FORMAT_OPTIONS,
|
||||||
|
DEFAULT_TIME_FORMAT,
|
||||||
getStandardizedControls,
|
getStandardizedControls,
|
||||||
} from '@superset-ui/chart-controls';
|
} from '@superset-ui/chart-controls';
|
||||||
|
|
||||||
@@ -145,7 +146,7 @@ const config: ControlPanelConfig = {
|
|||||||
freeForm: true,
|
freeForm: true,
|
||||||
label: t('Time Format'),
|
label: t('Time Format'),
|
||||||
renderTrigger: true,
|
renderTrigger: true,
|
||||||
default: 'smart_date',
|
default: DEFAULT_TIME_FORMAT,
|
||||||
choices: D3_TIME_FORMAT_OPTIONS,
|
choices: D3_TIME_FORMAT_OPTIONS,
|
||||||
description: D3_FORMAT_DOCS,
|
description: D3_FORMAT_DOCS,
|
||||||
},
|
},
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -21,10 +21,12 @@
|
|||||||
import d3 from 'd3';
|
import d3 from 'd3';
|
||||||
import { extent as d3Extent } from 'd3-array';
|
import { extent as d3Extent } from 'd3-array';
|
||||||
import {
|
import {
|
||||||
ValueFormatter,
|
BinaryQueryObjectFilterClause,
|
||||||
getNumberFormatter,
|
|
||||||
getSequentialSchemeRegistry,
|
|
||||||
CategoricalColorNamespace,
|
CategoricalColorNamespace,
|
||||||
|
ContextMenuFilters,
|
||||||
|
DataMask,
|
||||||
|
ValueFormatter,
|
||||||
|
getSequentialSchemeRegistry,
|
||||||
} from '@superset-ui/core';
|
} from '@superset-ui/core';
|
||||||
import countries, { countryOptions } from './countries';
|
import countries, { countryOptions } from './countries';
|
||||||
|
|
||||||
@@ -65,9 +67,28 @@ interface CountryMapProps {
|
|||||||
formatter: ValueFormatter;
|
formatter: ValueFormatter;
|
||||||
colorScheme: string;
|
colorScheme: string;
|
||||||
sliceId: number;
|
sliceId: number;
|
||||||
|
onContextMenu?: (
|
||||||
|
clientX: number,
|
||||||
|
clientY: number,
|
||||||
|
data: ContextMenuFilters,
|
||||||
|
) => void;
|
||||||
|
emitCrossFilters?: boolean;
|
||||||
|
setDataMask?: (dataMask: DataMask) => void;
|
||||||
|
filterState?: {
|
||||||
|
selectedValues?: string[];
|
||||||
|
extraFormData?: {
|
||||||
|
filters?: BinaryQueryObjectFilterClause[];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
entity?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const maps: Record<string, GeoData> = {};
|
const maps: Record<string, GeoData> = {};
|
||||||
|
// Store zoom state per chart instance using element as key to enable garbage collection
|
||||||
|
const zoomStates = new WeakMap<
|
||||||
|
HTMLElement,
|
||||||
|
{ scale: number; translate: [number, number] }
|
||||||
|
>();
|
||||||
|
|
||||||
function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
||||||
const {
|
const {
|
||||||
@@ -75,10 +96,15 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
country,
|
country,
|
||||||
|
entity,
|
||||||
linearColorScheme,
|
linearColorScheme,
|
||||||
formatter,
|
formatter,
|
||||||
colorScheme,
|
colorScheme,
|
||||||
sliceId,
|
sliceId,
|
||||||
|
filterState,
|
||||||
|
emitCrossFilters,
|
||||||
|
onContextMenu,
|
||||||
|
setDataMask,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
const container = element;
|
const container = element;
|
||||||
@@ -99,7 +125,15 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
? colorScale(d.country_id, sliceId)
|
? colorScale(d.country_id, sliceId)
|
||||||
: (linearColorScale(d.metric) ?? '');
|
: (linearColorScale(d.metric) ?? '');
|
||||||
});
|
});
|
||||||
const colorFn = (d: GeoFeature) => colorMap[d.properties.ISO] || 'none';
|
|
||||||
|
const colorFn = (feature: GeoFeature): string => {
|
||||||
|
if (!feature?.properties) return '#d9d9d9';
|
||||||
|
const iso = feature.properties.ISO;
|
||||||
|
return colorMap[iso] || '#d9d9d9';
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check if dashboard is in edit mode
|
||||||
|
const isEditMode = container.closest('.dashboard--editing') !== null;
|
||||||
|
|
||||||
const path = d3.geo.path();
|
const path = d3.geo.path();
|
||||||
const div = d3.select(container);
|
const div = d3.select(container);
|
||||||
@@ -112,6 +146,11 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
.attr('width', width)
|
.attr('width', width)
|
||||||
.attr('height', height)
|
.attr('height', height)
|
||||||
.attr('preserveAspectRatio', 'xMidYMid meet');
|
.attr('preserveAspectRatio', 'xMidYMid meet');
|
||||||
|
|
||||||
|
// Only set grab cursor if not in edit mode
|
||||||
|
if (!isEditMode) {
|
||||||
|
svg.style('cursor', 'grab');
|
||||||
|
}
|
||||||
const backgroundRect = svg
|
const backgroundRect = svg
|
||||||
.append('rect')
|
.append('rect')
|
||||||
.attr('class', 'background')
|
.attr('class', 'background')
|
||||||
@@ -119,39 +158,64 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
.attr('height', height);
|
.attr('height', height);
|
||||||
const g = svg.append('g');
|
const g = svg.append('g');
|
||||||
const mapLayer = g.append('g').classed('map-layer', true);
|
const mapLayer = g.append('g').classed('map-layer', true);
|
||||||
|
// Add hover popup for tooltip
|
||||||
const hoverPopup = div.append('div').attr('class', 'hover-popup');
|
const hoverPopup = div.append('div').attr('class', 'hover-popup');
|
||||||
|
|
||||||
let centered: GeoFeature | null;
|
// Track mouse position to distinguish clicks from drags
|
||||||
|
let mousedownPos: { x: number; y: number } | null = null;
|
||||||
|
|
||||||
const clicked = function clicked(d: GeoFeature) {
|
// Cross-filter support
|
||||||
const hasCenter = d && centered !== d;
|
const getCrossFilterDataMask = (
|
||||||
let x: number;
|
source: GeoFeature,
|
||||||
let y: number;
|
): { dataMask: DataMask; isCurrentValueSelected: boolean } | undefined => {
|
||||||
let k: number;
|
if (!entity) return undefined;
|
||||||
const halfWidth = width / 2;
|
|
||||||
const halfHeight = height / 2;
|
|
||||||
|
|
||||||
if (hasCenter) {
|
const selected = filterState?.selectedValues || [];
|
||||||
const centroid = path.centroid(d);
|
const iso = source?.properties?.ISO;
|
||||||
[x, y] = centroid;
|
if (!iso) return undefined;
|
||||||
k = 4;
|
|
||||||
centered = d;
|
|
||||||
} else {
|
|
||||||
x = halfWidth;
|
|
||||||
y = halfHeight;
|
|
||||||
k = 1;
|
|
||||||
centered = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
g.transition()
|
const isSelected = selected.includes(iso);
|
||||||
.duration(750)
|
const values = isSelected ? [] : [iso];
|
||||||
.attr(
|
|
||||||
'transform',
|
return {
|
||||||
`translate(${halfWidth},${halfHeight})scale(${k})translate(${-x},${-y})`,
|
dataMask: {
|
||||||
);
|
extraFormData: {
|
||||||
|
filters: values.length
|
||||||
|
? [{ col: entity, op: 'IN', val: values }]
|
||||||
|
: [],
|
||||||
|
},
|
||||||
|
filterState: {
|
||||||
|
value: values.length ? values : null,
|
||||||
|
selectedValues: values.length ? values : null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
isCurrentValueSelected: isSelected,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
backgroundRect.on('click', clicked);
|
// Handle right-click context menu
|
||||||
|
const handleContextMenu = (feature: GeoFeature): void => {
|
||||||
|
const pointerEvent = d3.event;
|
||||||
|
|
||||||
|
if (typeof onContextMenu === 'function') {
|
||||||
|
pointerEvent?.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
const iso = feature?.properties?.ISO;
|
||||||
|
if (!iso || typeof onContextMenu !== 'function' || !entity) return;
|
||||||
|
|
||||||
|
const drillVal = iso;
|
||||||
|
const drillToDetailFilters = [
|
||||||
|
{ col: entity, op: '==', val: drillVal, formattedVal: drillVal },
|
||||||
|
];
|
||||||
|
const drillByFilters = [{ col: entity, op: '==', val: drillVal }];
|
||||||
|
|
||||||
|
onContextMenu(pointerEvent.clientX, pointerEvent.clientY, {
|
||||||
|
drillToDetail: drillToDetailFilters,
|
||||||
|
crossFilter: getCrossFilterDataMask(feature),
|
||||||
|
drillBy: { filters: drillByFilters, groupbyFieldName: 'entity' },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const getNameOfRegion = function getNameOfRegion(
|
const getNameOfRegion = function getNameOfRegion(
|
||||||
feature: GeoFeature,
|
feature: GeoFeature,
|
||||||
@@ -165,7 +229,7 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
return '';
|
return '';
|
||||||
};
|
};
|
||||||
|
|
||||||
const updatePopupPosition = () => {
|
const updatePopupPosition = (): void => {
|
||||||
const svgHeight = svg.node().getBoundingClientRect().height;
|
const svgHeight = svg.node().getBoundingClientRect().height;
|
||||||
const [x, y] = d3.mouse(svg.node());
|
const [x, y] = d3.mouse(svg.node());
|
||||||
hoverPopup
|
hoverPopup
|
||||||
@@ -175,34 +239,135 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
.classed('popup-at-bottom', y > (svgHeight * 2) / 3);
|
.classed('popup-at-bottom', y > (svgHeight * 2) / 3);
|
||||||
};
|
};
|
||||||
|
|
||||||
const mouseenter = function mouseenter(this: SVGPathElement, d: GeoFeature) {
|
const mouseenter = function mouseenter(
|
||||||
|
this: SVGPathElement,
|
||||||
|
d: GeoFeature,
|
||||||
|
): void {
|
||||||
// Darken color
|
// Darken color
|
||||||
let c: string = colorFn(d);
|
let c: string = colorFn(d);
|
||||||
if (c !== 'none') {
|
if (c) {
|
||||||
c = d3.rgb(c).darker().toString();
|
c = d3.rgb(c).darker().toString();
|
||||||
}
|
}
|
||||||
d3.select(this).style('fill', c);
|
d3.select(this).style('fill', c);
|
||||||
|
|
||||||
// Display information popup
|
// Display information popup
|
||||||
const result = data.filter(
|
const result = data.filter(r => r.country_id === d?.properties?.ISO);
|
||||||
region => region.country_id === d.properties.ISO,
|
const regionName = escapeHtml(getNameOfRegion(d));
|
||||||
);
|
const metricValue =
|
||||||
|
result.length > 0 ? escapeHtml(String(formatter(result[0].metric))) : '';
|
||||||
hoverPopup.style('display', 'block').html(
|
hoverPopup
|
||||||
`<div><strong>${getNameOfRegion(d)}</strong><br>${result.length > 0 ? formatter(result[0].metric) : ''}</div>`,
|
.style('display', 'block')
|
||||||
);
|
.html(`<div><strong>${regionName}</strong><br>${metricValue}</div>`);
|
||||||
updatePopupPosition();
|
updatePopupPosition();
|
||||||
};
|
};
|
||||||
|
|
||||||
const mousemove = function mousemove() {
|
// Mouse move handler to update tooltip position
|
||||||
|
const mousemove = function mousemove(): void {
|
||||||
updatePopupPosition();
|
updatePopupPosition();
|
||||||
};
|
};
|
||||||
|
|
||||||
const mouseout = function mouseout(this: SVGPathElement) {
|
const mouseout = function mouseout(this: SVGPathElement): void {
|
||||||
d3.select(this).style('fill', colorFn);
|
d3.select(this).style('fill', (d: GeoFeature) => colorFn(d));
|
||||||
hoverPopup.style('display', 'none');
|
hoverPopup.style('display', 'none');
|
||||||
};
|
};
|
||||||
|
|
||||||
function drawMap(mapData: GeoData) {
|
// Only enable zoom if not in edit mode
|
||||||
|
if (!isEditMode) {
|
||||||
|
// Zoom with panning bounds
|
||||||
|
const zoom = d3.behavior
|
||||||
|
.zoom()
|
||||||
|
.scaleExtent([1, 4])
|
||||||
|
.on('zoomstart', () => {
|
||||||
|
svg.style('cursor', 'grabbing');
|
||||||
|
})
|
||||||
|
.on('zoom', () => {
|
||||||
|
const { translate, scale } = d3.event;
|
||||||
|
let [tx, ty] = translate;
|
||||||
|
|
||||||
|
const scaledW = width * scale;
|
||||||
|
const scaledH = height * scale;
|
||||||
|
const minX = Math.min(0, width - scaledW);
|
||||||
|
const maxX = 0;
|
||||||
|
const minY = Math.min(0, height - scaledH);
|
||||||
|
const maxY = 0;
|
||||||
|
|
||||||
|
tx = Math.max(Math.min(tx, maxX), minX);
|
||||||
|
ty = Math.max(Math.min(ty, maxY), minY);
|
||||||
|
|
||||||
|
// Sync D3's internal translate state with the clamped values so the
|
||||||
|
// next wheel/zoom event starts from the constrained position rather
|
||||||
|
// than the unclamped one (otherwise the view jumps).
|
||||||
|
zoom.translate([tx, ty]);
|
||||||
|
|
||||||
|
g.attr('transform', `translate(${tx}, ${ty}) scale(${scale})`);
|
||||||
|
const prev = zoomStates.get(element);
|
||||||
|
const changed =
|
||||||
|
!prev ||
|
||||||
|
prev.scale !== scale ||
|
||||||
|
prev.translate[0] !== tx ||
|
||||||
|
prev.translate[1] !== ty;
|
||||||
|
if (changed) {
|
||||||
|
zoomStates.set(element, { scale, translate: [tx, ty] });
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('zoomend', () => {
|
||||||
|
svg.style('cursor', 'grab');
|
||||||
|
});
|
||||||
|
|
||||||
|
d3.select(svg.node()).call(zoom);
|
||||||
|
|
||||||
|
// Restore previous zoom state if it exists
|
||||||
|
const savedZoom = zoomStates.get(element);
|
||||||
|
if (savedZoom) {
|
||||||
|
const { scale, translate } = savedZoom;
|
||||||
|
zoom.scale(scale).translate(translate);
|
||||||
|
g.attr(
|
||||||
|
'transform',
|
||||||
|
`translate(${translate[0]}, ${translate[1]}) scale(${scale})`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Visual highlighting for selected regions
|
||||||
|
function highlightSelectedRegion(
|
||||||
|
selectedValues: string[] | null = null,
|
||||||
|
): void {
|
||||||
|
const selected = selectedValues || filterState?.selectedValues || [];
|
||||||
|
|
||||||
|
mapLayer
|
||||||
|
.selectAll('path.region')
|
||||||
|
.style('fill-opacity', (d: GeoFeature) => {
|
||||||
|
const iso = d?.properties?.ISO;
|
||||||
|
return selected.length === 0 || selected.includes(iso) ? 1 : 0.3;
|
||||||
|
})
|
||||||
|
.style('stroke', (d: GeoFeature) => {
|
||||||
|
const iso = d?.properties?.ISO;
|
||||||
|
return selected.includes(iso) ? '#222' : null;
|
||||||
|
})
|
||||||
|
.style('stroke-width', (d: GeoFeature) => {
|
||||||
|
const iso = d?.properties?.ISO;
|
||||||
|
return selected.includes(iso) ? '1.5px' : '0.5px';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Click handler for cross-filters
|
||||||
|
const handleClick = (feature: GeoFeature): void => {
|
||||||
|
if (!entity || !emitCrossFilters || typeof setDataMask !== 'function') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = getCrossFilterDataMask(feature);
|
||||||
|
if (!result) return;
|
||||||
|
|
||||||
|
const { dataMask, isCurrentValueSelected } = result;
|
||||||
|
setDataMask(dataMask);
|
||||||
|
|
||||||
|
const iso = feature?.properties?.ISO;
|
||||||
|
const newSelection = isCurrentValueSelected || !iso ? [] : [iso];
|
||||||
|
highlightSelectedRegion(newSelection);
|
||||||
|
};
|
||||||
|
|
||||||
|
function drawMap(mapData: GeoData): void {
|
||||||
const { features } = mapData;
|
const { features } = mapData;
|
||||||
const center = d3.geo.centroid(mapData);
|
const center = d3.geo.centroid(mapData);
|
||||||
const scale = 100;
|
const scale = 100;
|
||||||
@@ -213,13 +378,11 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
.translate([width / 2, height / 2]);
|
.translate([width / 2, height / 2]);
|
||||||
path.projection(projection);
|
path.projection(projection);
|
||||||
|
|
||||||
// Compute scale that fits container.
|
|
||||||
const bounds = path.bounds(mapData);
|
const bounds = path.bounds(mapData);
|
||||||
const hscale = (scale * width) / (bounds[1][0] - bounds[0][0]);
|
const hscale = (scale * width) / (bounds[1][0] - bounds[0][0]);
|
||||||
const vscale = (scale * height) / (bounds[1][1] - bounds[0][1]);
|
const vscale = (scale * height) / (bounds[1][1] - bounds[0][1]);
|
||||||
const newScale = hscale < vscale ? hscale : vscale;
|
const newScale = Math.min(hscale, vscale);
|
||||||
|
|
||||||
// Compute bounds and offset using the updated scale.
|
|
||||||
projection.scale(newScale);
|
projection.scale(newScale);
|
||||||
const newBounds = path.bounds(mapData);
|
const newBounds = path.bounds(mapData);
|
||||||
projection.translate([
|
projection.translate([
|
||||||
@@ -227,20 +390,45 @@ function CountryMap(element: HTMLElement, props: CountryMapProps) {
|
|||||||
height - (newBounds[0][1] + newBounds[1][1]) / 2,
|
height - (newBounds[0][1] + newBounds[1][1]) / 2,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Draw each province as a path
|
const sel = mapLayer.selectAll('path.region').data(features);
|
||||||
mapLayer
|
|
||||||
.selectAll('path')
|
sel
|
||||||
.data(features)
|
|
||||||
.enter()
|
.enter()
|
||||||
.append('path')
|
.append('path')
|
||||||
.attr('d', path)
|
|
||||||
.attr('class', 'region')
|
.attr('class', 'region')
|
||||||
.attr('vector-effect', 'non-scaling-stroke')
|
.attr('vector-effect', 'non-scaling-stroke');
|
||||||
|
|
||||||
|
// Apply attributes and event handlers to all elements (enter + update)
|
||||||
|
mapLayer
|
||||||
|
.selectAll('path.region')
|
||||||
|
.attr('d', path)
|
||||||
.style('fill', colorFn)
|
.style('fill', colorFn)
|
||||||
.on('mouseenter', mouseenter)
|
.on('mouseenter', mouseenter)
|
||||||
.on('mousemove', mousemove)
|
.on('mousemove', mousemove)
|
||||||
.on('mouseout', mouseout)
|
.on('mouseout', mouseout)
|
||||||
.on('click', clicked);
|
.on('contextmenu', handleContextMenu)
|
||||||
|
.on('mousedown', function mousedown() {
|
||||||
|
const pos = d3.mouse(svg.node());
|
||||||
|
mousedownPos = { x: pos[0], y: pos[1] };
|
||||||
|
})
|
||||||
|
.on('click', function click(feature: GeoFeature) {
|
||||||
|
if (mousedownPos) {
|
||||||
|
const pos = d3.mouse(svg.node());
|
||||||
|
const dx = Math.abs(pos[0] - mousedownPos.x);
|
||||||
|
const dy = Math.abs(pos[1] - mousedownPos.y);
|
||||||
|
const dragThreshold = 5;
|
||||||
|
|
||||||
|
if (dx < dragThreshold && dy < dragThreshold) {
|
||||||
|
handleClick(feature);
|
||||||
|
}
|
||||||
|
|
||||||
|
mousedownPos = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sel.exit().remove();
|
||||||
|
|
||||||
|
highlightSelectedRegion();
|
||||||
}
|
}
|
||||||
|
|
||||||
const map = maps[country];
|
const map = maps[country];
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -17,7 +17,7 @@
|
|||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
import { t } from '@apache-superset/core/translation';
|
import { t } from '@apache-superset/core/translation';
|
||||||
import { ChartMetadata, ChartPlugin } from '@superset-ui/core';
|
import { ChartMetadata, ChartPlugin, Behavior } from '@superset-ui/core';
|
||||||
import transformProps from './transformProps';
|
import transformProps from './transformProps';
|
||||||
import exampleUsa from './images/exampleUsa.jpg';
|
import exampleUsa from './images/exampleUsa.jpg';
|
||||||
import exampleUsaDark from './images/exampleUsa-dark.jpg';
|
import exampleUsaDark from './images/exampleUsa-dark.jpg';
|
||||||
@@ -49,6 +49,11 @@ const metadata = new ChartMetadata({
|
|||||||
thumbnail,
|
thumbnail,
|
||||||
thumbnailDark,
|
thumbnailDark,
|
||||||
useLegacyApi: true,
|
useLegacyApi: true,
|
||||||
|
behaviors: [
|
||||||
|
Behavior.InteractiveChart,
|
||||||
|
Behavior.DrillToDetail,
|
||||||
|
Behavior.DrillBy,
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
export default class CountryMapChartPlugin extends ChartPlugin {
|
export default class CountryMapChartPlugin extends ChartPlugin {
|
||||||
|
|||||||
@@ -19,8 +19,18 @@
|
|||||||
import { ChartProps, getValueFormatter } from '@superset-ui/core';
|
import { ChartProps, getValueFormatter } from '@superset-ui/core';
|
||||||
|
|
||||||
export default function transformProps(chartProps: ChartProps) {
|
export default function transformProps(chartProps: ChartProps) {
|
||||||
const { width, height, formData, queriesData, datasource } = chartProps;
|
|
||||||
const {
|
const {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
formData,
|
||||||
|
queriesData,
|
||||||
|
datasource,
|
||||||
|
hooks = {},
|
||||||
|
filterState,
|
||||||
|
emitCrossFilters,
|
||||||
|
} = chartProps;
|
||||||
|
const {
|
||||||
|
entity,
|
||||||
linearColorScheme,
|
linearColorScheme,
|
||||||
numberFormat,
|
numberFormat,
|
||||||
currencyFormat,
|
currencyFormat,
|
||||||
@@ -49,6 +59,8 @@ export default function transformProps(chartProps: ChartProps) {
|
|||||||
detectedCurrency,
|
detectedCurrency,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { onContextMenu, setDataMask } = hooks;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
@@ -59,5 +71,10 @@ export default function transformProps(chartProps: ChartProps) {
|
|||||||
colorScheme,
|
colorScheme,
|
||||||
sliceId,
|
sliceId,
|
||||||
formatter,
|
formatter,
|
||||||
|
entity,
|
||||||
|
onContextMenu,
|
||||||
|
setDataMask,
|
||||||
|
emitCrossFilters,
|
||||||
|
filterState,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,10 +133,11 @@ describe('CountryMap (legacy d3)', () => {
|
|||||||
expect(popup!).toHaveStyle({ display: 'none' });
|
expect(popup!).toHaveStyle({ display: 'none' });
|
||||||
});
|
});
|
||||||
|
|
||||||
test('shows tooltip on mouseenter/mousemove/mouseout', async () => {
|
test('emits a cross-filter data mask when a region is clicked', () => {
|
||||||
d3Any.json.mockImplementation((_url: string, cb: D3JsonCallback) =>
|
d3Any.json.mockImplementation((_url: string, cb: D3JsonCallback) =>
|
||||||
cb(null, mockMapData),
|
cb(null, mockMapData),
|
||||||
);
|
);
|
||||||
|
const setDataMask = jest.fn();
|
||||||
|
|
||||||
render(
|
render(
|
||||||
<ReactCountryMap
|
<ReactCountryMap
|
||||||
@@ -147,19 +148,101 @@ describe('CountryMap (legacy d3)', () => {
|
|||||||
linearColorScheme="bnbColors"
|
linearColorScheme="bnbColors"
|
||||||
colorScheme=""
|
colorScheme=""
|
||||||
formatter={jest.fn().mockReturnValue('100')}
|
formatter={jest.fn().mockReturnValue('100')}
|
||||||
|
entity="country_code"
|
||||||
|
emitCrossFilters
|
||||||
|
setDataMask={setDataMask}
|
||||||
|
filterState={{ selectedValues: [] }}
|
||||||
/>,
|
/>,
|
||||||
);
|
);
|
||||||
|
|
||||||
const region = document.querySelector('path.region');
|
const region = document.querySelector('path.region');
|
||||||
expect(region).not.toBeNull();
|
expect(region).not.toBeNull();
|
||||||
|
|
||||||
const popup = document.querySelector('.hover-popup');
|
// A click is only treated as a selection when it follows a mousedown
|
||||||
expect(popup).not.toBeNull();
|
// without dragging beyond the threshold (d3.mouse is mocked to a fixed
|
||||||
|
// position, so the down/up positions match).
|
||||||
|
fireEvent.mouseDown(region!);
|
||||||
|
fireEvent.click(region!);
|
||||||
|
|
||||||
fireEvent.mouseEnter(region!);
|
expect(setDataMask).toHaveBeenCalledTimes(1);
|
||||||
expect(popup!).toHaveStyle({ display: 'block' });
|
expect(setDataMask).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
extraFormData: {
|
||||||
|
filters: [{ col: 'country_code', op: 'IN', val: ['CAN'] }],
|
||||||
|
},
|
||||||
|
filterState: expect.objectContaining({ value: ['CAN'] }),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
fireEvent.mouseOut(region!);
|
test('does not emit a cross-filter when emitCrossFilters is disabled', () => {
|
||||||
expect(popup!).toHaveStyle({ display: 'none' });
|
d3Any.json.mockImplementation((_url: string, cb: D3JsonCallback) =>
|
||||||
|
cb(null, mockMapData),
|
||||||
|
);
|
||||||
|
const setDataMask = jest.fn();
|
||||||
|
|
||||||
|
render(
|
||||||
|
<ReactCountryMap
|
||||||
|
width={500}
|
||||||
|
height={300}
|
||||||
|
data={[{ country_id: 'CAN', metric: 100 }]}
|
||||||
|
country="canada"
|
||||||
|
linearColorScheme="bnbColors"
|
||||||
|
colorScheme=""
|
||||||
|
formatter={jest.fn().mockReturnValue('100')}
|
||||||
|
entity="country_code"
|
||||||
|
emitCrossFilters={false}
|
||||||
|
setDataMask={setDataMask}
|
||||||
|
filterState={{ selectedValues: [] }}
|
||||||
|
/>,
|
||||||
|
);
|
||||||
|
|
||||||
|
const region = document.querySelector('path.region');
|
||||||
|
fireEvent.mouseDown(region!);
|
||||||
|
fireEvent.click(region!);
|
||||||
|
|
||||||
|
expect(setDataMask).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('opens the context menu with drill-by keyed on the entity control', () => {
|
||||||
|
d3Any.json.mockImplementation((_url: string, cb: D3JsonCallback) =>
|
||||||
|
cb(null, mockMapData),
|
||||||
|
);
|
||||||
|
const onContextMenu = jest.fn();
|
||||||
|
|
||||||
|
render(
|
||||||
|
<ReactCountryMap
|
||||||
|
width={500}
|
||||||
|
height={300}
|
||||||
|
data={[{ country_id: 'CAN', metric: 100 }]}
|
||||||
|
country="canada"
|
||||||
|
linearColorScheme="bnbColors"
|
||||||
|
colorScheme=""
|
||||||
|
formatter={jest.fn().mockReturnValue('100')}
|
||||||
|
entity="country_code"
|
||||||
|
onContextMenu={onContextMenu}
|
||||||
|
filterState={{ selectedValues: [] }}
|
||||||
|
/>,
|
||||||
|
);
|
||||||
|
|
||||||
|
const region = document.querySelector('path.region');
|
||||||
|
expect(region).not.toBeNull();
|
||||||
|
|
||||||
|
fireEvent.contextMenu(region!, { clientX: 123, clientY: 45 });
|
||||||
|
|
||||||
|
expect(onContextMenu).toHaveBeenCalledTimes(1);
|
||||||
|
const [[clientX, clientY, payload]] = onContextMenu.mock.calls;
|
||||||
|
expect(clientX).toBe(123);
|
||||||
|
expect(clientY).toBe(45);
|
||||||
|
expect(payload.drillToDetail).toEqual([
|
||||||
|
{ col: 'country_code', op: '==', val: 'CAN', formattedVal: 'CAN' },
|
||||||
|
]);
|
||||||
|
// groupbyFieldName must be the form-data control key ('entity'), not the
|
||||||
|
// selected column value ('country_code'), so DrillByModal can map the
|
||||||
|
// selection back to the chart control.
|
||||||
|
expect(payload.drillBy).toEqual({
|
||||||
|
filters: [{ col: 'country_code', op: '==', val: 'CAN' }],
|
||||||
|
groupbyFieldName: 'entity',
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* 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 { ChartProps } from '@superset-ui/core';
|
||||||
|
import transformProps from '../src/transformProps';
|
||||||
|
|
||||||
|
const onContextMenu = jest.fn();
|
||||||
|
const setDataMask = jest.fn();
|
||||||
|
|
||||||
|
const createProps = (formDataOverrides = {}, chartPropsOverrides = {}) =>
|
||||||
|
({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
formData: {
|
||||||
|
entity: 'country_code',
|
||||||
|
linearColorScheme: 'bnbColors',
|
||||||
|
numberFormat: '.2f',
|
||||||
|
selectCountry: 'France',
|
||||||
|
colorScheme: '',
|
||||||
|
sliceId: 1,
|
||||||
|
metric: 'count',
|
||||||
|
...formDataOverrides,
|
||||||
|
},
|
||||||
|
queriesData: [{ data: [{ country_id: 'FRA', metric: 10 }] }],
|
||||||
|
datasource: { currencyFormats: {}, columnFormats: {} },
|
||||||
|
hooks: { onContextMenu, setDataMask },
|
||||||
|
filterState: { selectedValues: ['FRA'] },
|
||||||
|
emitCrossFilters: true,
|
||||||
|
...chartPropsOverrides,
|
||||||
|
}) as unknown as ChartProps;
|
||||||
|
|
||||||
|
test('forwards cross-filter hooks and state to the chart', () => {
|
||||||
|
const transformed = transformProps(createProps());
|
||||||
|
|
||||||
|
expect(transformed).toMatchObject({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
entity: 'country_code',
|
||||||
|
onContextMenu,
|
||||||
|
setDataMask,
|
||||||
|
emitCrossFilters: true,
|
||||||
|
filterState: { selectedValues: ['FRA'] },
|
||||||
|
data: [{ country_id: 'FRA', metric: 10 }],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('lowercases the selected country for map lookup', () => {
|
||||||
|
const transformed = transformProps(createProps());
|
||||||
|
expect(transformed.country).toBe('france');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('passes a null country when none is selected', () => {
|
||||||
|
const transformed = transformProps(createProps({ selectCountry: undefined }));
|
||||||
|
expect(transformed.country).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('defaults hooks to an empty object when none are provided', () => {
|
||||||
|
const transformed = transformProps(createProps({}, { hooks: undefined }));
|
||||||
|
expect(transformed.onContextMenu).toBeUndefined();
|
||||||
|
expect(transformed.setDataMask).toBeUndefined();
|
||||||
|
});
|
||||||
@@ -25,6 +25,7 @@ import {
|
|||||||
D3_FORMAT_DOCS,
|
D3_FORMAT_DOCS,
|
||||||
D3_FORMAT_OPTIONS,
|
D3_FORMAT_OPTIONS,
|
||||||
D3_TIME_FORMAT_OPTIONS,
|
D3_TIME_FORMAT_OPTIONS,
|
||||||
|
DEFAULT_TIME_FORMAT,
|
||||||
getStandardizedControls,
|
getStandardizedControls,
|
||||||
} from '@superset-ui/chart-controls';
|
} from '@superset-ui/chart-controls';
|
||||||
import OptionDescription from './OptionDescription';
|
import OptionDescription from './OptionDescription';
|
||||||
@@ -154,7 +155,7 @@ const config: ControlPanelConfig = {
|
|||||||
freeForm: true,
|
freeForm: true,
|
||||||
label: t('Date Time Format'),
|
label: t('Date Time Format'),
|
||||||
renderTrigger: true,
|
renderTrigger: true,
|
||||||
default: 'smart_date',
|
default: DEFAULT_TIME_FORMAT,
|
||||||
choices: D3_TIME_FORMAT_OPTIONS,
|
choices: D3_TIME_FORMAT_OPTIONS,
|
||||||
description: D3_FORMAT_DOCS,
|
description: D3_FORMAT_DOCS,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import {
|
|||||||
D3_TIME_FORMAT_OPTIONS,
|
D3_TIME_FORMAT_OPTIONS,
|
||||||
sections,
|
sections,
|
||||||
getStandardizedControls,
|
getStandardizedControls,
|
||||||
|
DEFAULT_TIME_FORMAT,
|
||||||
} from '@superset-ui/chart-controls';
|
} from '@superset-ui/chart-controls';
|
||||||
|
|
||||||
const config: ControlPanelConfig = {
|
const config: ControlPanelConfig = {
|
||||||
@@ -78,7 +79,7 @@ const config: ControlPanelConfig = {
|
|||||||
freeForm: true,
|
freeForm: true,
|
||||||
label: t('Date Time Format'),
|
label: t('Date Time Format'),
|
||||||
renderTrigger: true,
|
renderTrigger: true,
|
||||||
default: 'smart_date',
|
default: DEFAULT_TIME_FORMAT,
|
||||||
choices: D3_TIME_FORMAT_OPTIONS,
|
choices: D3_TIME_FORMAT_OPTIONS,
|
||||||
description: D3_FORMAT_DOCS,
|
description: D3_FORMAT_DOCS,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"d3": "^3.5.17",
|
"d3": "^3.5.17",
|
||||||
"d3-array": "^3.2.4",
|
"d3-array": "^3.2.4",
|
||||||
"d3-color": "^3.1.0",
|
"tinycolor2": "^1.6.0",
|
||||||
"datamaps": "^0.5.10",
|
"datamaps": "^0.5.10",
|
||||||
"prop-types": "^15.8.1"
|
"prop-types": "^15.8.1"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -164,7 +164,8 @@ function WorldMap(element: HTMLElement, props: WorldMapProps): void {
|
|||||||
processedData = filteredData.map(d => ({
|
processedData = filteredData.map(d => ({
|
||||||
...d,
|
...d,
|
||||||
radius: radiusScale(Math.sqrt(d.m2)),
|
radius: radiusScale(Math.sqrt(d.m2)),
|
||||||
fillColor: d.m1 != null ? colorFn(d.m1) ?? theme.colorBorder : theme.colorBorder,
|
fillColor:
|
||||||
|
d.m1 != null ? (colorFn(d.m1) ?? theme.colorBorder) : theme.colorBorder,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
import { rgb } from 'd3-color';
|
import tinycolor from 'tinycolor2';
|
||||||
import { ChartProps, getValueFormatter } from '@superset-ui/core';
|
import { ChartProps, getValueFormatter } from '@superset-ui/core';
|
||||||
|
|
||||||
export default function transformProps(chartProps: ChartProps) {
|
export default function transformProps(chartProps: ChartProps) {
|
||||||
@@ -75,7 +75,7 @@ export default function transformProps(chartProps: ChartProps) {
|
|||||||
maxBubbleSize: parseInt(maxBubbleSize, 10),
|
maxBubbleSize: parseInt(maxBubbleSize, 10),
|
||||||
showBubbles,
|
showBubbles,
|
||||||
linearColorScheme,
|
linearColorScheme,
|
||||||
color: rgb(r, g, b).hex(),
|
color: tinycolor({ r, g, b }).toHexString(),
|
||||||
colorBy,
|
colorBy,
|
||||||
colorScheme,
|
colorScheme,
|
||||||
sliceId,
|
sliceId,
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
"fast-safe-stringify": "^2.1.1",
|
"fast-safe-stringify": "^2.1.1",
|
||||||
"lodash": "^4.18.1",
|
"lodash": "^4.18.1",
|
||||||
"nvd3-fork": "^2.0.5",
|
"nvd3-fork": "^2.0.5",
|
||||||
"dompurify": "^3.4.9",
|
"dompurify": "^3.4.11",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"urijs": "^1.19.11"
|
"urijs": "^1.19.11"
|
||||||
},
|
},
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user