Compare commits

...

82 Commits

Author SHA1 Message Date
Joe Li
6b201cbe5f Merge branch 'master' into sl-time-range 2026-07-01 10:20:59 -07:00
Amin Ghadersohi
7f4cac63c9 fix(mcp): escape LIKE wildcards in find_users to prevent user enumeration (#41593) 2026-07-01 13:01:46 -04:00
Amin Ghadersohi
da4cae1657 chore(deps): bump fastmcp from >=3.2.4 to >=3.4.2 (#41592) 2026-07-01 12:42:25 -04:00
Mehmet Salih Yavuz
438d4d569f test(sqllab): repair broken TablePreview and SavedQueryList jest tests (#41628) 2026-07-01 19:34:48 +03:00
Ale
6d2b94ceb8 fix(currency): derive default symbol position from locale when unset (#40931)
Co-authored-by: kleostouraiti <212892934+kleostouraiti@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 09:12:18 -07:00
Shaitan
2da2db6c7c feat(sql): schema-qualified table denylist + information_schema/lo_* defaults (#41120)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 16:57:45 +01:00
Shaitan
3651020014 fix(sql): cap parser input length via SQL_MAX_PARSE_LENGTH config (#40499)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: sha174n <pedro.sousa@preset.io>
Co-authored-by: Evan Rusackas <evan@preset.io>
2026-07-01 16:32:12 +01:00
Mike Bridge
b9e3f0aa1e feat(soft-delete): gate soft delete behind a temporary SOFT_DELETE release toggle (#41166)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 08:09:52 -07:00
dependabot[bot]
16e1f41cef chore(deps): bump swagger-ui-react from 5.32.7 to 5.32.8 in /docs (#41614)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-01 21:27:37 +07:00
Raphael Prudencio
7cc7e9f6e3 fix(async-query): prevent JWT InvalidSubjectError for guest users (#37862)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
2026-06-30 23:42:41 -07:00
Imamatdin
3e88b487b3 fix(point-cluster-map): guard invalid point radii (#40393)
Co-authored-by: Imamatdin <201577118+Imamatdin@users.noreply.github.com>
2026-06-30 22:48:43 -07:00
Evan Rusackas
ce9b9b0513 feat(i18n): add Japanese (ja) translations (AI-generated, needs review) (#41466)
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: aikawa-ohno <aikawa-ohno@users.noreply.github.com>
2026-06-30 17:33:27 -07:00
Evan Rusackas
35194fe4d5 fix(i18n): key translation-regression check on per-msgid transitions (#41596)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 16:54:39 -07:00
Evan Rusackas
2a1f632daa fix(dashboard): surface size, limit, and config key in oversized dashboard error (#41532)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 16:10:01 -07:00
Amin Ghadersohi
fd9c84be43 feat(mcp): add get_dashboard_datasets tool (#40961) 2026-06-30 18:27:09 -04:00
Amin Ghadersohi
2bd9ab4c59 feat(mcp): add remove_chart_from_dashboard tool (#40958)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:16:08 -04:00
Amin Ghadersohi
bf88c62814 feat(mcp): add manage_native_filters tool (#40960)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 17:07:49 -04:00
dependabot[bot]
1e130feb80 chore(deps): bump marshmallow-union from 0.1.15 to 0.1.15.post1 (#41539)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Joe Li <joe@preset.io>
2026-06-30 13:54:45 -07:00
dependabot[bot]
fd86eec889 chore(deps): bump echarts from 5.6.0 to 6.1.0 in /superset-frontend (#40264)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 13:54:11 -07:00
Evan Rusackas
a8f43890b1 chore(superset-ui-core): forward-compat fixes for TypeScript 6.0 (Phase B) (#39535)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-30 13:52:14 -07:00
Evan Rusackas
4bf203ee70 chore(config): default SMTP_SSL_SERVER_AUTH to True (#40647)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-30 13:50:38 -07:00
Beto Dealmeida
f9149eba75 fix(semantic layers): start/end ranges 2026-06-30 16:15:54 -04:00
Jean Massucatto
805c12ef74 fix(dashboard): prevent double-click on create dashboard from creating duplicates (#40833) 2026-06-30 11:47:40 -07:00
Elizabeth Thompson
e15dc5735f fix(reports): pre-commit tab permalinks before state machine transaction (#41096)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 11:02:08 -07:00
Evan Rusackas
42a5f64256 chore(ci): silence zizmor adhoc-packages note for supersetbot install (#41546) 2026-07-01 00:43:32 +07:00
Amin Ghadersohi
c60d8bb656 feat(mcp): add tags + typed metadata fields to update_dashboard (#40957) 2026-06-30 10:36:31 -07:00
Amin Ghadersohi
c11fa206ce feat(mcp): add duplicate_dashboard tool (#40959)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 10:36:19 -07:00
dependabot[bot]
2b6806c090 chore(deps): bump js-yaml from 5.0.0 to 5.1.0 in /docs (#41566)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 10:35:46 -07:00
Đỗ Trọng Hải
95d688fb05 build(embedded-sdk): remove test files and related files from build artifact to be published (#41584) 2026-07-01 00:33:49 +07:00
Evan Rusackas
7de77a35bc chore(ci): pin @action-validator versions in GHA validator workflow (#41545)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 10:31:36 -07:00
Evan Rusackas
7245a092eb chore(ci): scope zizmor adhoc-packages on setup-supersetbot action (#41547)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 10:31:21 -07:00
dependabot[bot]
bbab644d12 chore(deps-dev): bump typescript-eslint from 8.61.1 to 8.62.0 in /docs (#41575)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 10:29:34 -07:00
Mallikarjuna Reddy Nimmakayala
a2b5fda661 fix(Table Chart): Show correct cache time moment for Query2 (#37482)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 10:21:31 -07:00
Evan Rusackas
ef4c6123b9 fix(sqllab): preserve whitespace in grid result cells (#41135)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-30 10:18:25 -07:00
Evan Rusackas
25f7b90761 fix(dashboard): remove stray focus outline on Filter Badge popover (closes #38789) (#41398)
Co-authored-by: Devin AI <devin-ai-integration[bot]@users.noreply.github.com>
2026-06-30 10:18:10 -07:00
Evan Rusackas
7827d43ea6 fix(embedded): show already-added allowed domains in embed modal (closes #35328) (#41399)
Co-authored-by: Devin AI <devin-ai-integration[bot]@users.noreply.github.com>
2026-06-30 10:17:53 -07:00
dependabot[bot]
92f48b0725 chore(deps): bump actions/setup-python from 6.2.0 to 6.3.0 (#41573)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 22:44:30 +07:00
dependabot[bot]
e0e1831d50 chore(deps): bump actions/setup-java from 5.3.0 to 5.4.0 (#41576)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 22:41:21 +07:00
dependabot[bot]
c4c531a855 chore(deps): bump actions/cache from 5.0.5 to 6.1.0 (#41572)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 22:40:51 +07:00
dependabot[bot]
2c47648588 chore(deps-dev): bump globals from 17.6.0 to 17.7.0 in /docs (#41571)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 22:40:19 +07:00
dependabot[bot]
56bd8ed0be chore(deps): bump azure/setup-helm from 5.0.0 to 5.0.1 (#41570)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 22:39:57 +07:00
yousoph
b8b23d6219 fix(bigquery): quote dotted STRUCT columns per-segment in drill to detail (#41462)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:45:31 -07:00
yousoph
105b896038 fix(explore): enable free-text entry for temporal D3 format selector in Table chart (#41194)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 22:38:50 -07:00
dependabot[bot]
a009fcec51 chore(deps-dev): bump @swc/core from 1.15.41 to 1.15.43 in /superset-frontend (#41543)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 22:00:40 -07:00
dependabot[bot]
59196fcac0 chore(deps): bump @swc/core from 1.15.41 to 1.15.43 in /docs (#41542)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 22:00:25 -07:00
dependabot[bot]
765927d681 chore(deps): bump js-yaml from 4.2.0 to 5.0.0 in /docs (#41520)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 21:59:08 -07:00
Evan Rusackas
3b82d2a170 fix(security): clean up stale can_import permission on ImportExportRestApi (#41309)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 17:38:18 -07:00
Mafi
4a32e0b8d1 fix(table): exclude metricSqlExpressions from ownState→extra_form_data spread (#41555)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 01:30:03 +02:00
Ville Brofeldt
ece8d8ffca fix(datasource): allow Gamma to load combined datasource list (#41553) 2026-06-29 15:08:29 -07:00
Elizabeth Thompson
ba9bd430cb fix(a11y): add aria-label to ActionButton span role=button (#41503) 2026-06-29 15:05:10 -07:00
Evan Rusackas
5c272f1315 chore(docs): tighten CSP and remove external widgets (#36685)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-06-29 14:57:06 -07:00
dependabot[bot]
9380d83dd1 chore(deps-dev): update nzalchemy requirement from >=11.0.2 to >=11.0.2,<11.2 (#41477)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Joe Li <joe@preset.io>
2026-06-29 12:07:10 -07:00
dependabot[bot]
82b6a86ca0 chore(deps-dev): update snowflake-sqlalchemy requirement from <2,>=1.2.4 to >=1.10.2,<2 (#41540)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 12:06:40 -07:00
dependabot[bot]
1e42aeb53c chore(deps): bump swagger-ui-react from 5.32.6 to 5.32.7 in /docs (#41541)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 12:06:36 -07:00
dependabot[bot]
20da836c21 chore(deps-dev): bump oxlint from 1.70.0 to 1.71.0 in /superset-frontend (#41544)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 12:06:33 -07:00
dependabot[bot]
b32c96733b chore(deps-dev): bump fast-uri from 3.0.1 to 3.1.2 in /superset-embedded-sdk (#41508)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 12:06:29 -07:00
dependabot[bot]
fbe500349d chore(deps): bump selenium from 4.44.0 to 4.45.0 (#41475)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Joe Li <joe@preset.io>
2026-06-29 12:05:24 -07:00
dependabot[bot]
b89b613149 chore(deps): bump slack-sdk from 3.35.0 to 3.42.0 (#41537)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-29 12:05:21 -07:00
Elizabeth Thompson
134919ea36 fix(screenshots): catch empty-bytes tiled result and set ERROR on falsy image (#41097)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 11:52:40 -07:00
Evan Rusackas
adc03ce525 refactor: make import/expression layer SQLAlchemy 2.0-compatible (#41179)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-29 11:38:59 -07:00
Evan Rusackas
11a4a17dff fix(frontend): finish sentence-case conversion for time range buttons (#41488)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:19:54 -07:00
Evan Rusackas
16a3405e3c fix(i18n): skip unparseable catalogs when building translation index (#41465)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-29 10:11:20 -07:00
Evan Rusackas
07abda50c5 chore(ci): prune orphaned showtime labels in daily cleanup (#41464)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:10:42 -07:00
Evan Rusackas
725265502f perf(frontend): migrate lodash imports to lodash-es for tree-shaking (#41511) 2026-06-30 00:09:39 +07:00
yousoph
d42076d541 fix(tags): make favorite star toggle in Tags list view (#41460)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:08:36 -07:00
dependabot[bot]
7dcb98e4d2 chore(deps-dev): bump vite from 8.0.14 to 8.1.0 in /superset-embedded-sdk (#41507)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:56 -07:00
dependabot[bot]
28f6e1e023 chore(deps-dev): bump @types/node from 25.9.4 to 26.0.0 in /superset-websocket (#41514)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:43 -07:00
dependabot[bot]
a8045d7f65 chore(deps-dev): bump @swc/plugin-emotion from 14.13.0 to 14.14.0 in /superset-frontend (#41515)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:30 -07:00
Shaitan
f95ebed8ba fix: apply object access checks in tag bulk_create and update commands (#41457)
Signed-off-by: sha174n <shaitan@zx48.net>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 10:07:26 -07:00
dependabot[bot]
4338375267 chore(deps): bump nanoid from 5.1.14 to 5.1.15 in /superset-frontend (#41517)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:07:11 -07:00
dependabot[bot]
e236d831fd chore(deps): bump antd from 6.4.4 to 6.4.5 in /docs (#41518)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:06:57 -07:00
dependabot[bot]
e807e66a3e chore(deps-dev): bump timezone-mock from 1.4.2 to 1.4.3 in /superset-frontend (#41521)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:06:44 -07:00
dependabot[bot]
0370ac8607 chore(deps-dev): bump unzipper from 0.12.3 to 0.12.5 in /superset-frontend (#41523)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:06:29 -07:00
Evan Rusackas
5b17c5b2df chore(deps): stop Dependabot from opening Babel 8 major bumps (#41534) 2026-06-30 00:06:05 +07:00
dependabot[bot]
d2daf84fd9 chore(deps): bump uuid from 14.0.0 to 14.0.1 in /superset-frontend (#41524)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 10:05:52 -07:00
dependabot[bot]
7edae0817c chore(deps): bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 (#41519) 2026-06-29 23:54:21 +07:00
ʈᵃᵢ
a4d5b15955 fix(slack): support org-scoped tokens on Enterprise Grid via SLACK_TE… (#41473) 2026-06-29 09:46:25 -07:00
Kaushik Harsha
9dba4d090f fix(explore): hide inactive result tables in mixed chart view as table (#37777)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 09:33:37 -07:00
Evan Rusackas
1b7b9ce948 fix(tags): remove unsatisfiable foreign keys from tagged_object.object_id (#41126)
Co-authored-by: Claude Code <noreply@anthropic.com>
2026-06-29 09:30:04 -07:00
Joe Li
7926c3a93a fix(sqllab): preserve query history after tab migration (#41403) 2026-06-29 09:15:19 -07:00
Joe Li
797e497f4b fix(dashboard): suppress favorite status error toast on 404 (#41402)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-29 09:15:00 -07:00
Joe Li
825b582815 fix(mixed-chart): preserve order_desc and series_limit_metric in buildQuery (#41401)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 09:14:35 -07:00
358 changed files with 12255 additions and 2373 deletions

View File

@@ -17,6 +17,7 @@ runs:
- name: Install supersetbot from npm
if: ${{ inputs.from-npm == 'true' }}
shell: bash
# zizmor: ignore[adhoc-packages] - supersetbot is a first-party Apache CLI (apache-superset/supersetbot) installed globally as a tool; a global CLI install has no application manifest/lockfile context
run: npm install -g supersetbot
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
@@ -31,6 +32,7 @@ runs:
if: ${{ inputs.from-npm == 'false' }}
shell: bash
working-directory: supersetbot
# zizmor: ignore[adhoc-packages] - installs the locally packed supersetbot tarball built from the trusted apache-superset/supersetbot checkout; no lockfile applies to a global CLI install
run: |
# simple trick to install globally with dependencies
npm pack

View File

@@ -32,6 +32,13 @@ updates:
# and confirm the issue https://github.com/apache/superset/issues/39600 is fixed
- dependency-name: "react-checkbox-tree"
update-types: ["version-update:semver-major"]
# Babel 8 (7.x -> 8.x) is blocked on the surrounding ecosystem: @emotion/babel-plugin
# (NodePath#hoist), babel-plugin-jsx-remove-data-test-id (t.jSXOpeningElement), and
# ts-jest all rely on Babel APIs removed in v8 and have not shipped Babel 8 support.
# Ignore the coordinated major bump until the ecosystem catches up; it must be done
# as a single manual upgrade anyway. TODO: remove when Babel 8 support is viable.
- dependency-name: "@babel/*"
update-types: ["version-update:semver-major"]
directory: "/superset-frontend/"
schedule:
interval: "daily"

View File

@@ -40,7 +40,7 @@ jobs:
uses: ./.github/actions/setup-supersetbot/
- name: Set up Python ${{ inputs.python-version }}
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: "3.10"

View File

@@ -37,7 +37,7 @@ jobs:
persist-credentials: false
submodules: recursive
- name: Setup Java
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5.4.0
with:
distribution: "temurin"
java-version: "11"

View File

@@ -37,10 +37,12 @@ jobs:
node-version: "20"
- name: Install Dependencies
run: npm install -g @action-validator/core @action-validator/cli --save-dev
# Versions are pinned to avoid ad-hoc, unpinned package installs
# (zizmor adhoc-packages). Bump deliberately when upgrading.
run: npm install -g @action-validator/core@0.6.0 @action-validator/cli@0.6.0
- name: Run Script
run: bash .github/workflows/github-action-validator.sh
- name: Check for security issues on GHA workflows
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7

View File

@@ -23,7 +23,7 @@ jobs:
persist-credentials: false
submodules: recursive
- name: Setup Java
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5.4.0
with:
distribution: "temurin"
java-version: "11"

View File

@@ -63,7 +63,7 @@ jobs:
yarn install --immutable
- name: Cache pre-commit environments
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.cache/pre-commit
key: pre-commit-v2-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('.pre-commit-config.yaml') }}

View File

@@ -56,7 +56,7 @@ jobs:
- name: Cache npm
if: env.HAS_TAGS
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -70,7 +70,7 @@ jobs:
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Cache npm
if: env.HAS_TAGS
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.npm-cache-dir-path.outputs.dir }}

View File

@@ -24,13 +24,14 @@ jobs:
permissions:
contents: read
issues: write # delete orphaned showtime label definitions (label CRUD is the issues API)
pull-requests: write
steps:
- name: Install Superset Showtime
run: pip install superset-showtime
- name: Cleanup expired environments
- name: Cleanup expired environments and orphaned labels
run: |
echo "Cleaning up environments respecting TTL labels"
python -m showtime cleanup --respect-ttl
echo "Cleaning up environments respecting TTL labels, and pruning orphaned 🎪 labels"
python -m showtime cleanup --respect-ttl --force

View File

@@ -71,7 +71,7 @@ jobs:
node-version-file: "./docs/.nvmrc"
- name: Setup Python
uses: ./.github/actions/setup-backend/
- uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
- uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5.4.0
with:
distribution: "zulu"
java-version: "21"

View File

@@ -26,7 +26,7 @@ jobs:
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5.0.0
uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
with:
version: v3.16.4

View File

@@ -42,7 +42,7 @@ jobs:
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Install Helm
uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # v5.0.0
uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
with:
version: v3.5.4

View File

@@ -247,16 +247,13 @@ Understanding the Superset Points of View
- [Superset API](https://superset.apache.org/docs/rest-api)
## Repo Activity
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=39464018" target="_blank" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=dark" width="655" height="auto" />
<img alt="Performance Stats of apache/superset - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=light" width="655" height="auto" />
</picture>
</a>
<!-- Made with [OSS Insight](https://ossinsight.io/) -->
<!--
The OSS Insight "Repo Activity" widget (https://next.ossinsight.io/) was
intentionally removed. This README is rendered on the ASF-hosted website
(superset.apache.org), so its contents are subject to ASF's third-party
content and CSP rules. OSS Insight has no Data Processing Agreement (DPA)
with the ASF, so we cannot embed its images/widgets here. Do not re-add it.
-->
<!-- telemetry/analytics pixel: -->
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=bc1c90cd-bc04-4e11-8c7b-289fb2839492" />

View File

@@ -24,6 +24,27 @@ assists people when migrating to a new version.
## Next
### SQL Lab denies large-object and information_schema access by default
`DISALLOWED_SQL_FUNCTIONS` and `DISALLOWED_SQL_TABLES` now ship with additional default entries, so SQL Lab and chart-data queries that reference them are rejected where they were previously allowed:
- PostgreSQL large-object routines (`lo_from_bytea`, `lo_export`, `lo_import`, `lo_put`, `lo_create`, `lo_creat`, `lowrite`, `lo_get`, `loread`, `lo_unlink`), which read and write bytes on the database server's filesystem.
- The SQL-standard `information_schema` views (`tables`, `columns`, `routines`, `views`, the privilege/grant views, etc.), which expose table, column, privilege, and view-definition metadata across the whole database.
Deployments that legitimately query these (for example tooling that introspects `information_schema`) can restore the previous behavior by overriding `DISALLOWED_SQL_FUNCTIONS` / `DISALLOWED_SQL_TABLES` in `superset_config.py` to drop the entries they need.
Because the denylist now resolves the effective schema through the query-aware path, PostgreSQL queries that change the `search_path` (e.g. `SET search_path = ...`) are rejected on the SQL Lab execution and cost-estimate paths whenever any `DISALLOWED_SQL_TABLES` entry is configured (the default for PostgreSQL), matching the behavior previously applied only when `RLS_IN_SQLLAB` was enabled.
### SQL parser input length cap (SQL_MAX_PARSE_LENGTH)
The SQL parser now rejects scripts whose UTF-8 byte length exceeds the new
`SQL_MAX_PARSE_LENGTH` config option (default `1_000_000` bytes) before they are
handed to sqlglot, which bounds parser memory and CPU usage. A single query
larger than the cap (for example a very large `IN (...)` list or a big
virtual-dataset SQL) raises a parse error in SQL Lab and dashboard-generated
queries. Deployments that legitimately run queries above this size should raise
the value, and `SQL_MAX_PARSE_LENGTH = None` disables the check entirely.
### Guest-token RLS rules reject unknown fields
The `rls` rules passed to `POST /api/v1/security/guest_token/` are now validated strictly: a rule may only contain `dataset` and `clause`. Previously unknown fields were silently dropped, so a mistyped or legacy scope key (most commonly `datasource` instead of `dataset`) produced a rule with no `dataset`, which is treated as a *global* rule applied to every dataset the embedded resource can reach. Such a request now returns HTTP 400 identifying the offending field instead of issuing a token with an unintended global rule. Integrators that were sending extra fields in RLS rules must remove them; valid dataset-scoped (`{"dataset": 41, "clause": "..."}`) and global (`{"clause": "..."}`) rules are unaffected.
@@ -44,6 +65,10 @@ The git SHA and build number surfaced in the "About" section, the bootstrap payl
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.
### `FetchRetryOptions` callback parameters widened to allow `null`
The `error` and `response` parameters of the `retryDelay` and `retryOn` callbacks in `FetchRetryOptions` (exported from `@superset-ui/core`) are now typed `Error | null` and `Response | null` to match the actual call-site signature provided by `fetch-retry`. Because these parameter types are contravariant, consumers who typed their callbacks with the non-nullable `(attempt: number, error: Error, response: Response) => number` will get a TypeScript compile error. Widen your callback signatures to accept `Error | null` / `Response | null`.
### `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`:
@@ -54,6 +79,20 @@ The `thumbnail_url` field has been removed from `GET /api/v1/dashboard/` list re
The thumbnail endpoint redirects to the current digest URL regardless of whether the supplied digest is exact. If the image is not yet cached, that digest URL may return `202` and trigger async generation. Using `changed_on_utc` as the digest is sufficient for cache-busting purposes.
### Tagging fix for `create_all`-bootstrapped schemas
Only affects deployments whose metadata schema was created with SQLAlchemy's `create_all` (rather than `superset db upgrade`) on a foreign-key-enforcing backend — PostgreSQL, or MySQL with `FOREIGN_KEY_CHECKS=1`. Such schemas carry three invalid foreign keys on `tagged_object.object_id` that break tagging (`TAGGING_SYSTEM = True`) with a `ForeignKeyViolation`. Schemas built via `superset db upgrade` are unaffected.
This release stops the ORM from emitting these constraints, but it cannot drop ones already present in your schema. If affected, drop them manually (names vary by backend, so look them up first):
```sql
-- PostgreSQL: names are typically tagged_object_object_id_fkey, _fkey1, _fkey2
ALTER TABLE tagged_object DROP CONSTRAINT <constraint_name>;
-- MySQL: find names via `SHOW CREATE TABLE tagged_object;`
ALTER TABLE tagged_object DROP FOREIGN KEY <constraint_name>;
```
### Webhook alerts/reports block private/internal hosts by default
Webhook alert/report dispatch (`WebhookNotification.send`) now validates the target URL's host against the same private/internal-IP block applied to dataset import URLs. If the resolved host is in a loopback, link-local, private (RFC-1918), shared-CGNAT, or multicast range, the webhook is rejected with `NotificationParamException`.
@@ -63,6 +102,7 @@ Deployments that intentionally point webhooks at internal targets (chatops bridg
### Impala cancel_query blocks private/internal hosts by default
The Impala engine spec's `cancel_query` issues an HTTP request from the Superset backend to the host configured on the Impala database connection. That host is now validated before the request: if it resolves to a private/internal IP range, the cancel call is refused and a warning is logged. Operators whose Impala cluster runs on an internal network can opt out by setting `IMPALA_CANCEL_QUERY_ALLOW_INTERNAL_HOSTS = True` in `superset_config.py`. This mirrors the dataset-import and webhook opt-out flags.
### Map chart renderer and OpenStreetMap migration behavior
The MapLibre migration for deck.gl charts preserves saved non-Mapbox styles on
@@ -100,6 +140,11 @@ Operators can tune or disable the policy via config:
### Data uploads bounded by UPLOAD_MAX_FILE_SIZE_BYTES
Single data-file uploads (CSV, Excel, columnar) are now bounded by the `UPLOAD_MAX_FILE_SIZE_BYTES` config option, which defaults to `100 * 1024 * 1024` (100 MB). Files larger than this are rejected with a `413` before their contents are buffered into memory. Set `UPLOAD_MAX_FILE_SIZE_BYTES = None` to disable the check and restore unbounded uploads.
### Currency symbol position follows the locale when unset
When a chart's currency control leaves the **Prefix or suffix** field empty, the currency symbol position is now derived from the deployment locale's own convention via `Intl.NumberFormat` instead of always defaulting to a suffix. For example, under the default `en-US` locale `USD`, `GBP`, and `EUR` render as a prefix (`$ 1,000`), while eurozone locales such as `fr-FR` render `EUR` as a suffix (`1 000 €`). An explicit Prefix/Suffix selection is always honored and is unaffected.
Charts that relied on the previous always-suffix default for an unset position will render the symbol on the locale-appropriate side instead; set the position explicitly on the metric's currency control to pin it.
### Duration formatter precision
@@ -165,6 +210,18 @@ Runbook to adopt:
2. Set that value on the tunnel's `server_host_key` (via the database/SSH tunnel API or UI payload).
3. Optionally set `SSH_TUNNEL_STRICT_HOST_KEY_CHECKING = True` in `superset_config.py` to require host-key verification on all tunnels.
### SMTP server certificate validation enabled by default
`SMTP_SSL_SERVER_AUTH` now defaults to `True` (previously `False`). With this default, STARTTLS/SSL connections to the configured SMTP server validate the server's TLS certificate against the system trusted CA store. This makes outbound email (alerts and reports) verify the mail server's identity out of the box.
If your SMTP server presents a self-signed certificate, or a certificate that is not trusted by the system CA store, email delivery may now fail with a certificate verification error. To restore the previous behavior of skipping certificate validation, set the following in `superset_config.py`:
```python
SMTP_SSL_SERVER_AUTH = False
```
The recommended fix is to add the SMTP server's certificate (or its issuing CA) to the system trust store rather than disabling validation.
### Dataset import validates catalog against the target connection
Importing a dataset now validates the `catalog` field against the target database connection. When the connection has multi-catalog disabled (`allow_multi_catalog` off) and the dataset's catalog is not the connection's default catalog, the import fails instead of silently persisting the non-default catalog. This matches the validation already enforced on the dataset update path and prevents imported datasets from querying an unintended database.

View File

@@ -81,6 +81,21 @@ SLACK_CACHE_TIMEOUT = int(timedelta(days=2).total_seconds())
SLACK_API_RATE_LIMIT_RETRY_COUNT = 5
```
#### Slack Enterprise Grid (org-scoped tokens)
On a Slack Enterprise Grid org, an org-scoped token spans multiple workspaces, so
workspace-scoped methods such as `conversations.list` require a `team_id` to
indicate which workspace to target. Set `SLACK_TEAM_ID` to your workspace (team)
ID so Superset can list channels and deliver reports:
```python
# The workspace (team) ID to target, e.g. "T01234567"
SLACK_TEAM_ID = "T01234567"
```
This defaults to `None` and only needs to be set when using an org-scoped token;
it is accepted but ignored for standard workspace-level tokens.
### Webhook integration
Superset can send alert and report notifications to any HTTP endpoint — useful for chat platforms, incident management tools, or custom automation.

View File

@@ -549,6 +549,24 @@ CELERY_BEAT_SCHEDULE = {
Adjust `retention_period_days` to control how long query rows are kept. Companion opt-in tasks (`prune_logs`, `prune_tasks`) exist for pruning the logs and tasks tables; see the commented-out examples in `superset/config.py`. Without enabling these tasks, the metadata database will grow unbounded over time.
## Dashboard Layout Size Limit
Each dashboard stores its layout (the position, size, and nesting of every chart, row, and tab) as a JSON blob in the metadata database. Superset caps the length of this serialized blob with `SUPERSET_DASHBOARD_POSITION_DATA_LIMIT`, which defaults to `65535`:
```python
SUPERSET_DASHBOARD_POSITION_DATA_LIMIT = 65535
```
This is a Python-level cap (65535 is 2¹⁶ 1), independent of the database column capacity — the `position_json` column is a `MEDIUMTEXT`, which holds far more. When the serialized layout reaches this limit, the editor blocks the save and reports the current length, the limit, and this setting's name. A warning is shown once the layout passes 90% of the limit.
Large dashboards — for example, many charts spread across nested tabs — can exceed the default. Because the underlying column comfortably stores larger values, you can safely raise the limit:
```python
SUPERSET_DASHBOARD_POSITION_DATA_LIMIT = 131072 # double the default
```
Alternatively, split a very large dashboard into several smaller ones. Note that this check is enforced when saving layout edits in the UI; a dashboard imported from a ZIP with an oversized layout will load and render, but cannot be edited and re-saved until the limit is raised.
:::resources
- [Blog: Feature Flags in Apache Superset](https://preset.io/blog/feature-flags-in-apache-superset-and-preset/)
:::

View File

@@ -254,16 +254,13 @@ Understanding the Superset Points of View
- [Superset API](/developer-docs/api)
## Repo Activity
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=39464018" target="_blank" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=dark" width="655" height="auto" />
<img alt="Performance Stats of apache/superset - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=light" width="655" height="auto" />
</picture>
</a>
<!-- Made with [OSS Insight](https://ossinsight.io/) -->
<!--
The OSS Insight "Repo Activity" widget (https://next.ossinsight.io/) was
intentionally removed. This page is rendered on the ASF-hosted website
(superset.apache.org), so its contents are subject to ASF's third-party
content and CSP rules. OSS Insight has no Data Processing Agreement (DPA)
with the ASF, so we cannot embed its images/widgets here. Do not re-add it.
-->
<!-- telemetry/analytics pixel: -->
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=bc1c90cd-bc04-4e11-8c7b-289fb2839492" />

View File

@@ -70,13 +70,13 @@
"@storybook/preview-api": "^8.6.18",
"@storybook/theming": "^8.6.15",
"@superset-ui/core": "^0.20.4",
"@swc/core": "^1.15.41",
"antd": "^6.4.4",
"@swc/core": "^1.15.43",
"antd": "^6.4.5",
"baseline-browser-mapping": "^2.10.38",
"caniuse-lite": "^1.0.30001799",
"docusaurus-plugin-openapi-docs": "^5.0.2",
"docusaurus-theme-openapi-docs": "^5.0.2",
"js-yaml": "^4.2.0",
"js-yaml": "^5.1.0",
"js-yaml-loader": "^1.2.2",
"json-bigint": "^1.0.0",
"prism-react-renderer": "^2.4.1",
@@ -89,7 +89,7 @@
"remark-import-partial": "^0.0.2",
"reselect": "^5.2.0",
"storybook": "^8.6.18",
"swagger-ui-react": "^5.32.6",
"swagger-ui-react": "^5.32.8",
"swc-loader": "^0.2.7",
"tinycolor2": "^1.4.2",
"unist-util-visit": "^5.1.0"
@@ -106,10 +106,10 @@
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-react": "^7.37.5",
"globals": "^17.6.0",
"globals": "^17.7.0",
"prettier": "^3.8.4",
"typescript": "~6.0.3",
"typescript-eslint": "^8.61.1",
"typescript-eslint": "^8.62.0",
"webpack": "^5.107.2"
},
"browserslist": {

View File

@@ -22,7 +22,14 @@ RewriteRule ^(.*)$ https://superset.apache.org/$1 [R,L]
RewriteCond %{HTTP_HOST} ^superset.incubator.apache.org$ [NC]
RewriteRule ^(.*)$ https://superset.apache.org/$1 [R=301,L]
Header set Content-Security-Policy "default-src data: blob: 'self' *.apache.org widget.kapa.ai *.githubusercontent.com *.scarf.sh *.googleapis.com *.google.com *.run.app *.gstatic.com *.github.com *.algolia.net *.algolianet.com 'unsafe-inline' 'unsafe-eval'; frame-src *; frame-ancestors 'self' *.google.com https://sidebar.bugherd.com; form-action 'self'; worker-src blob:; img-src 'self' blob: data: https:; font-src 'self'; object-src 'none'"
# CSP permissions for superset.apache.org
# Additional domains required for docs site functionality:
# - widget.kapa.ai: AI chatbot widget (uses Google reCAPTCHA). Approval here: https://privacy.apache.org/faq/committers.html
# - *.googleapis.com, *.google.com, *.gstatic.com: Google Calendar embed, kapa.ai reCAPTCHA - all of these loaded with user consent, following policy laid out in https://privacy.apache.org/faq/committers.html
# - github.com, *.github.com, *.githubusercontent.com: GitHub user-attachment images in docs (apex github.com serves user-attachments/* assets). Discussed/resolved in this thread: https://issues.apache.org/jira/browse/INFRA-25701?filter=-2 (DPA in place with GitHub)
# - *.algolia.net, *.algolianet.com: Algolia DocSearch. Approved here: https://privacy.apache.org/faq/committers.html
# See: https://infra.apache.org/tools/csp.html
SetEnv CSP_PROJECT_DOMAINS "widget.kapa.ai https://*.googleapis.com/ https://*.google.com/ https://*.gstatic.com/ https://github.com/ https://*.github.com/ https://*.githubusercontent.com/ https://*.algolia.net/ https://*.algolianet.com/"
# REDIRECTS

View File

@@ -87,6 +87,12 @@
"lifecycle": "development",
"description": "Enable semantic layers and show semantic views alongside datasets"
},
{
"name": "SOFT_DELETE",
"default": false,
"lifecycle": "development",
"description": "Temporary rollout / kill-switch gate for soft delete (default off = legacy hard delete). An emergency stop, not a clean rollback: flipping ON->OFF resurrects already-soft-deleted rows. Removed (along with its two gate points \u2014 BaseDAO.delete routing and the do_orm_execute visibility listener) once soft delete is stable."
},
{
"name": "TABLE_V2_TIME_COMPARISON_ENABLED",
"default": false,

View File

@@ -212,16 +212,13 @@ Understanding the Superset Points of View
- [Superset API](https://superset.apache.org/docs/rest-api)
## Repo Activity
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=39464018" target="_blank" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=dark" width="655" height="auto" />
<img alt="Performance Stats of apache/superset - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=light" width="655" height="auto" />
</picture>
</a>
<!-- Made with [OSS Insight](https://ossinsight.io/) -->
<!--
The OSS Insight "Repo Activity" widget (https://next.ossinsight.io/) was
intentionally removed. This page is rendered on the ASF-hosted website
(superset.apache.org), so its contents are subject to ASF's third-party
content and CSP rules. OSS Insight has no Data Processing Agreement (DPA)
with the ASF, so we cannot embed its images/widgets here. Do not re-add it.
-->
<!-- telemetry/analytics pixel: -->
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=bc1c90cd-bc04-4e11-8c7b-289fb2839492" />

View File

@@ -254,16 +254,13 @@ Understanding the Superset Points of View
- [Superset API](/developer-docs/api)
## Repo Activity
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=39464018" target="_blank" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=dark" width="655" height="auto" />
<img alt="Performance Stats of apache/superset - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=light" width="655" height="auto" />
</picture>
</a>
<!-- Made with [OSS Insight](https://ossinsight.io/) -->
<!--
The OSS Insight "Repo Activity" widget (https://next.ossinsight.io/) was
intentionally removed. This page is rendered on the ASF-hosted website
(superset.apache.org), so its contents are subject to ASF's third-party
content and CSP rules. OSS Insight has no Data Processing Agreement (DPA)
with the ASF, so we cannot embed its images/widgets here. Do not re-add it.
-->
<!-- telemetry/analytics pixel: -->
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=bc1c90cd-bc04-4e11-8c7b-289fb2839492" />

View File

@@ -246,16 +246,13 @@ Understanding the Superset Points of View
- [Superset API](https://superset.apache.org/docs/rest-api)
## Repo Activity
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=39464018" target="_blank" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=dark" width="655" height="auto" />
<img alt="Performance Stats of apache/superset - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=light" width="655" height="auto" />
</picture>
</a>
<!-- Made with [OSS Insight](https://ossinsight.io/) -->
<!--
The OSS Insight "Repo Activity" widget (https://next.ossinsight.io/) was
intentionally removed. This page is rendered on the ASF-hosted website
(superset.apache.org), so its contents are subject to ASF's third-party
content and CSP rules. OSS Insight has no Data Processing Agreement (DPA)
with the ASF, so we cannot embed its images/widgets here. Do not re-add it.
-->
<!-- telemetry/analytics pixel: -->
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=bc1c90cd-bc04-4e11-8c7b-289fb2839492" />

View File

@@ -3242,7 +3242,7 @@
"@rc-component/util" "^1.2.1"
clsx "^2.1.1"
"@rc-component/form@~1.8.3":
"@rc-component/form@~1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.8.5.tgz#20571cfd401dc38c74c38cdf4722ddc6c23a9806"
integrity sha512-d24EYtvUOBhxEtSd/EqIu9DaMuqrWF2IRIvAFCTM6NQ/GJIYNr8DvEpUSUlv2uPxEJ0ZPwYQ+wwlGIAaiHvdrw==
@@ -4153,86 +4153,86 @@
dependencies:
apg-lite "^1.0.4"
"@swc/core-darwin-arm64@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.41.tgz#4fcbc9cbb9dfc9027d66e2b23b8d1d0315d164bd"
integrity sha512-kREh6J5paQFvP3i7f/4FbqRNOJREutVFVOkder4GVyCBQ39YmER55cW/y1NNjwrchzFqgYswFn0mMDCqbqKzrw==
"@swc/core-darwin-arm64@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.43.tgz#386294f8427dde2df1a70dd0a5826d67af70e996"
integrity sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA==
"@swc/core-darwin-x64@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.41.tgz#726c60a893e2f1a07bee28f79b519b8e6489415b"
integrity sha512-N8B56ESFazZAWZyIkecADSPCwlLEinW7QLMEeotCpv4J7VXwfH+OLkmRL8o96UZ+1355fwHxDTS6/wK7yucvkA==
"@swc/core-darwin-x64@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.43.tgz#c4823529c424e2ae25b7eb786438474741521fcb"
integrity sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ==
"@swc/core-linux-arm-gnueabihf@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.41.tgz#08930e8015ca2fadc729546d5bd4b758a3999dda"
integrity sha512-6XrId2fyle0mS5xxON8rU84mPd2Cq1kDJRj+4BnQKTd7u+2kSA6Ww+JkOP0iTNqOqt9OXhPOEAjBHAuonWcdCg==
"@swc/core-linux-arm-gnueabihf@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.43.tgz#c0a0ed17cffc5d4af192935667f12f05feeb39f9"
integrity sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA==
"@swc/core-linux-arm64-gnu@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.41.tgz#6c27490a4013647a09ff64cea1d6b1169394602f"
integrity sha512-ynLIarxlkVnqHn1D0fKOVht6mNU5ks6lrH+MY3kkS+XFaGGgDxFZVjWKJlkYTKm3RCvBTfA8Ng5fLufXheMRKQ==
"@swc/core-linux-arm64-gnu@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.43.tgz#1eb2d9c5eeee5bb9d00599b475ddc31dc2870d22"
integrity sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw==
"@swc/core-linux-arm64-musl@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.41.tgz#4cce52fbbbe78b1f99c2a4e3f9ad2629f6eae494"
integrity sha512-dXu/5vd4gh8symyhRF+4G7gOPkjmb4pONhh7sl+6GSiW0LOKZlfu5kXmyFbTz9smOT7jgr002qY9b1nujjXt2A==
"@swc/core-linux-arm64-musl@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.43.tgz#ea6b5c38088f3921a57922d3931b2d74fd23a9fd"
integrity sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ==
"@swc/core-linux-ppc64-gnu@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.41.tgz#3d1fadd8d320e7250a6b2a2d9c0b0d4dac162f97"
integrity sha512-XGO6zVPXoPE0gf/XnI4jBbafNT13AYgoh6ns0JCSdOetI/kqVf0vhpz7NuNgAzZrMVCsmieqjPoTwViDgh4mOQ==
"@swc/core-linux-ppc64-gnu@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.43.tgz#538fac30bbd5f1e678bb7bac9ccc62246a6f6d7a"
integrity sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg==
"@swc/core-linux-s390x-gnu@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.41.tgz#6e4c54168d4a8d7852ef797437bd25e6fb5d7a50"
integrity sha512-0WUglRwyZtW+iMi7J3iFdrCxreZZIKf4egTwEQfIYRsqFax69A0OrFj+NIoFSE03xBT/IFRrg+S8K6f9Ky+4hA==
"@swc/core-linux-s390x-gnu@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.43.tgz#ee564b45f3f578b1fc82136c4dab163189316641"
integrity sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA==
"@swc/core-linux-x64-gnu@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.41.tgz#5f947698786e15e2f696e0c6b3afd25138bae86b"
integrity sha512-VxkuQK59c0tHm6uJZCUrS3cyA2JhGGfdU6e41SZz0x/JS+4Sm7C1mIc97In14vkZJopEt7yXA2TouCqZDSygEA==
"@swc/core-linux-x64-gnu@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.43.tgz#e6e3bfea76921c7f5e16d50a126615f2e04ce1c8"
integrity sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg==
"@swc/core-linux-x64-musl@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.41.tgz#f4a0910cb273e39bcc09d572a08f62a355a93628"
integrity sha512-/0qXIu1ZxggLuovLb22vFfKHq2AA4n6Whw5UwmVCHk4pkw7KWnPIQpMCEqUMPsNkFJig7PPp/TSYFu8ZEb2rtQ==
"@swc/core-linux-x64-musl@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.43.tgz#539f6f2721c0cc32e5db5cf0d453c82045f6662d"
integrity sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ==
"@swc/core-win32-arm64-msvc@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.41.tgz#a55334b1b7c23a962d4219f332b6422f3c3374e4"
integrity sha512-Y481sMNZM6rECh9VO4+y26N1lWEDAyxnBZskUf37fl90uHE946VHfmiVQWT0uMFOhyJJFovGTRuF4W82dwewUg==
"@swc/core-win32-arm64-msvc@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.43.tgz#b7bb6b611d484ac19d0ee21469e7012d646c28b5"
integrity sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw==
"@swc/core-win32-ia32-msvc@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.41.tgz#e1135f8d6857f6c48e4bfb6105568b37b3f88dc5"
integrity sha512-BAchBD5qeUzy3hiPSLJtaaoSm4blCLyYffOF1bGE4ETcV+OisqjUAwDQMJj++4bTpvMCDzwC+Bj3PmQyBCtscw==
"@swc/core-win32-ia32-msvc@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.43.tgz#e5b25722a7d27bb0c9a9bdee7863f29c8674364e"
integrity sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g==
"@swc/core-win32-x64-msvc@1.15.41":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.41.tgz#52d241e2bf4c6154675c0ad447b29cbdb0ccb547"
integrity sha512-WOkA+fJ/ViVBQDsSV9JC52NACTe5PhlurA6viASDZGb7HR3KS01ZG7RZ+Bg6SVQFIoq3gSbTsskQVe6EbHFAYw==
"@swc/core-win32-x64-msvc@1.15.43":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.43.tgz#d28842621201c345383d468d40c09648b6cd6e68"
integrity sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg==
"@swc/core@^1.15.41", "@swc/core@^1.7.39":
version "1.15.41"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.41.tgz#a212c5040abd1ffd2ad6caf140f0d586ffcfaa6e"
integrity sha512-03nQq/082QRJJiOvp3FGbgxTGyyxMxohPTjhk/W9bD2J0tk4ukITI7goOhOO2WbaHn/lsPmo/zf8+DIXhwpgYQ==
"@swc/core@^1.15.43", "@swc/core@^1.7.39":
version "1.15.43"
resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.43.tgz#653e6573968fd5c74163b9885ea0a933012c9f22"
integrity sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw==
dependencies:
"@swc/counter" "^0.1.3"
"@swc/types" "^0.1.26"
"@swc/types" "^0.1.27"
optionalDependencies:
"@swc/core-darwin-arm64" "1.15.41"
"@swc/core-darwin-x64" "1.15.41"
"@swc/core-linux-arm-gnueabihf" "1.15.41"
"@swc/core-linux-arm64-gnu" "1.15.41"
"@swc/core-linux-arm64-musl" "1.15.41"
"@swc/core-linux-ppc64-gnu" "1.15.41"
"@swc/core-linux-s390x-gnu" "1.15.41"
"@swc/core-linux-x64-gnu" "1.15.41"
"@swc/core-linux-x64-musl" "1.15.41"
"@swc/core-win32-arm64-msvc" "1.15.41"
"@swc/core-win32-ia32-msvc" "1.15.41"
"@swc/core-win32-x64-msvc" "1.15.41"
"@swc/core-darwin-arm64" "1.15.43"
"@swc/core-darwin-x64" "1.15.43"
"@swc/core-linux-arm-gnueabihf" "1.15.43"
"@swc/core-linux-arm64-gnu" "1.15.43"
"@swc/core-linux-arm64-musl" "1.15.43"
"@swc/core-linux-ppc64-gnu" "1.15.43"
"@swc/core-linux-s390x-gnu" "1.15.43"
"@swc/core-linux-x64-gnu" "1.15.43"
"@swc/core-linux-x64-musl" "1.15.43"
"@swc/core-win32-arm64-msvc" "1.15.43"
"@swc/core-win32-ia32-msvc" "1.15.43"
"@swc/core-win32-x64-msvc" "1.15.43"
"@swc/counter@^0.1.3":
version "0.1.3"
@@ -4307,10 +4307,10 @@
"@swc/html-win32-ia32-msvc" "1.15.13"
"@swc/html-win32-x64-msvc" "1.15.13"
"@swc/types@^0.1.26":
version "0.1.26"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.26.tgz#2a976a1870caef1992316dda1464150ee36968b5"
integrity sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==
"@swc/types@^0.1.27":
version "0.1.27"
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.27.tgz#12080b0c426dea450634f202d9a3c82ac396e793"
integrity sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==
dependencies:
"@swc/counter" "^0.1.3"
@@ -4932,110 +4932,110 @@
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@8.61.1", "@typescript-eslint/eslint-plugin@^8.59.3":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz#6e4b7fee21f1983308e9e9b634ecbaf702c86006"
integrity sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==
"@typescript-eslint/eslint-plugin@8.62.0", "@typescript-eslint/eslint-plugin@^8.59.3":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz#ef482aab65b9b2c0abf92d36d670a0d270bcef4c"
integrity sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==
dependencies:
"@eslint-community/regexpp" "^4.12.2"
"@typescript-eslint/scope-manager" "8.61.1"
"@typescript-eslint/type-utils" "8.61.1"
"@typescript-eslint/utils" "8.61.1"
"@typescript-eslint/visitor-keys" "8.61.1"
"@typescript-eslint/scope-manager" "8.62.0"
"@typescript-eslint/type-utils" "8.62.0"
"@typescript-eslint/utils" "8.62.0"
"@typescript-eslint/visitor-keys" "8.62.0"
ignore "^7.0.5"
natural-compare "^1.4.0"
ts-api-utils "^2.5.0"
"@typescript-eslint/parser@8.61.1", "@typescript-eslint/parser@^8.61.0":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.61.1.tgz#881fba60b50636249cdeea2e547bf75715254c72"
integrity sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==
"@typescript-eslint/parser@8.62.0", "@typescript-eslint/parser@^8.61.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.62.0.tgz#8533094fb44427f50b82813c6d3876782f20dc3e"
integrity sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==
dependencies:
"@typescript-eslint/scope-manager" "8.61.1"
"@typescript-eslint/types" "8.61.1"
"@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/visitor-keys" "8.61.1"
"@typescript-eslint/scope-manager" "8.62.0"
"@typescript-eslint/types" "8.62.0"
"@typescript-eslint/typescript-estree" "8.62.0"
"@typescript-eslint/visitor-keys" "8.62.0"
debug "^4.4.3"
"@typescript-eslint/project-service@8.61.1":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.61.1.tgz#fcd9739964a40867eed55f1ac318d3909f24b4af"
integrity sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==
"@typescript-eslint/project-service@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.62.0.tgz#ab74c1abb4959fb4c3ba7d7edc6554ee245db990"
integrity sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==
dependencies:
"@typescript-eslint/tsconfig-utils" "^8.61.1"
"@typescript-eslint/types" "^8.61.1"
"@typescript-eslint/tsconfig-utils" "^8.62.0"
"@typescript-eslint/types" "^8.62.0"
debug "^4.4.3"
"@typescript-eslint/scope-manager@8.61.1":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz#2479921a40fdb0afa18f5838fae6167264b417b2"
integrity sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==
"@typescript-eslint/scope-manager@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz#a7a7b428d32444bc9a4fe16f24a78fc124283fd4"
integrity sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==
dependencies:
"@typescript-eslint/types" "8.61.1"
"@typescript-eslint/visitor-keys" "8.61.1"
"@typescript-eslint/types" "8.62.0"
"@typescript-eslint/visitor-keys" "8.62.0"
"@typescript-eslint/tsconfig-utils@8.61.1":
version "8.61.1"
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==
"@typescript-eslint/tsconfig-utils@^8.61.1":
"@typescript-eslint/tsconfig-utils@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz#9440a673581c6d9de308c4d5803dd52ed5d71729"
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==
"@typescript-eslint/tsconfig-utils@^8.62.0":
version "8.62.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz#e2b5f24fe721044189cb7e81117c96d75979d627"
integrity sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==
"@typescript-eslint/type-utils@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.62.0.tgz#6f64d813ed9f340d796baed40cdab86b8e9a491a"
integrity sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==
dependencies:
"@typescript-eslint/types" "8.61.1"
"@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/utils" "8.61.1"
"@typescript-eslint/types" "8.62.0"
"@typescript-eslint/typescript-estree" "8.62.0"
"@typescript-eslint/utils" "8.62.0"
debug "^4.4.3"
ts-api-utils "^2.5.0"
"@typescript-eslint/types@8.61.1":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.61.1.tgz#0c51f518e4e6848371a1c988e859d59eb7522d5a"
integrity sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==
"@typescript-eslint/types@^8.61.1":
"@typescript-eslint/types@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.62.0.tgz#601427c10203d9f0f34f0b3e474df735eb12b593"
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==
"@typescript-eslint/types@^8.62.0":
version "8.62.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.62.1.tgz#c58be954e483b2fc98275374d5bcb40b99842dc1"
integrity sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==
"@typescript-eslint/typescript-estree@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz#b96b55d02e26aa09434421c3fa678e525ca09a4c"
integrity sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==
dependencies:
"@typescript-eslint/project-service" "8.61.1"
"@typescript-eslint/tsconfig-utils" "8.61.1"
"@typescript-eslint/types" "8.61.1"
"@typescript-eslint/visitor-keys" "8.61.1"
"@typescript-eslint/project-service" "8.62.0"
"@typescript-eslint/tsconfig-utils" "8.62.0"
"@typescript-eslint/types" "8.62.0"
"@typescript-eslint/visitor-keys" "8.62.0"
debug "^4.4.3"
minimatch "^10.2.2"
semver "^7.7.3"
tinyglobby "^0.2.15"
ts-api-utils "^2.5.0"
"@typescript-eslint/utils@8.61.1":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.61.1.tgz#ffd1054de7dd33b7873cd6c6713ec6b0366316d3"
integrity sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==
"@typescript-eslint/utils@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.62.0.tgz#b5228524ca1ee51af40e156c82d425dec3e01cfe"
integrity sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==
dependencies:
"@eslint-community/eslint-utils" "^4.9.1"
"@typescript-eslint/scope-manager" "8.61.1"
"@typescript-eslint/types" "8.61.1"
"@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/scope-manager" "8.62.0"
"@typescript-eslint/types" "8.62.0"
"@typescript-eslint/typescript-estree" "8.62.0"
"@typescript-eslint/visitor-keys@8.61.1":
version "8.61.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz#546cf102b4efdb72a9a08e63a1b0d7d745eb66eb"
integrity sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==
"@typescript-eslint/visitor-keys@8.62.0":
version "8.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz#b6daab190bf8f18612f5b86323469a12288c6b31"
integrity sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==
dependencies:
"@typescript-eslint/types" "8.61.1"
"@typescript-eslint/types" "8.62.0"
eslint-visitor-keys "^5.0.0"
"@ungap/structured-clone@^1.0.0":
@@ -5392,10 +5392,10 @@ ansis@^3.2.0:
resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7"
integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==
antd@^6.4.4:
version "6.4.4"
resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.4.tgz#a422610959b37ac4d4b766dbaac67ea2d8fd0785"
integrity sha512-lgPz4KhfhiYddV/qPYo0ieqWimCVgV2OQF72mbeGNixE753JWNnmEc7UNGy08wBS/zZ7hxrmX0pc5aX7EUaIIg==
antd@^6.4.5:
version "6.4.5"
resolved "https://registry.yarnpkg.com/antd/-/antd-6.4.5.tgz#98372c96af3e562aeff126289ead5e7e5c5f4212"
integrity sha512-xyAgX/sqF/CRS1G95oM4ql0+3TBG+tE58aRJqdUPVv4yMZcQrnnkA4cU7Uc5Rny2yK2TrusDVargHzzXUrlJ1g==
dependencies:
"@ant-design/colors" "^8.0.1"
"@ant-design/cssinjs" "^2.1.2"
@@ -5411,7 +5411,7 @@ antd@^6.4.4:
"@rc-component/dialog" "~1.9.0"
"@rc-component/drawer" "~1.4.2"
"@rc-component/dropdown" "~1.0.2"
"@rc-component/form" "~1.8.3"
"@rc-component/form" "~1.8.5"
"@rc-component/image" "~1.9.0"
"@rc-component/input" "~1.3.1"
"@rc-component/input-number" "~1.6.2"
@@ -7262,7 +7262,7 @@ domhandler@^5.0.2, domhandler@^5.0.3:
dependencies:
domelementtype "^2.3.0"
dompurify@^3.3.1, dompurify@^3.4.0:
dompurify@^3.3.1, dompurify@^3.4.11:
version "3.4.11"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680"
integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==
@@ -8316,10 +8316,10 @@ globals@^14.0.0:
resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globals@^17.6.0:
version "17.6.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-17.6.0.tgz#0f0be018d5cca8690e6375ead1f65c4bb96191fc"
integrity sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==
globals@^17.7.0:
version "17.7.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-17.7.0.tgz#553d55090b4dde8209ec2da42580d6e7e7d8b10d"
integrity sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==
globalthis@^1.0.4:
version "1.0.4"
@@ -9454,10 +9454,10 @@ js-yaml@4.1.0:
dependencies:
argparse "^2.0.1"
js-yaml@=4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b"
integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
js-yaml@=4.2.0, js-yaml@^4.1.0, js-yaml@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.2.0.tgz#2bd9e85682dd91bd469afb809d816043b3d49524"
integrity sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==
dependencies:
argparse "^2.0.1"
@@ -9469,10 +9469,10 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@^4.1.0, js-yaml@^4.1.1, js-yaml@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.2.0.tgz#2bd9e85682dd91bd469afb809d816043b3d49524"
integrity sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==
js-yaml@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-5.1.0.tgz#c084ac880197833810a69e9c7e51eae12ff35448"
integrity sha512-s8VA5jkR8f22S3NAXmhKPFqGUduqZGlsufabVOgN14iTdw/RXcym7bKkbwjxLK9Yw2lEvvmJjFp119+KPeo8Kg==
dependencies:
argparse "^2.0.1"
@@ -14152,10 +14152,10 @@ swagger-client@3.37.3, swagger-client@^3.37.4:
ramda "^0.30.1"
ramda-adjunct "^5.1.0"
swagger-ui-react@^5.32.6:
version "5.32.6"
resolved "https://registry.yarnpkg.com/swagger-ui-react/-/swagger-ui-react-5.32.6.tgz#00c3f99a5b1f6c0debb2ee0589018dfc79ba1d4a"
integrity sha512-2q2kXd6eDR+syyWV5HE2CkWANyr2MHPkNezG4M7fC0FPlBUZEsNgyA/2dcb9dIwgE5xd995dO42h89fNMF5/ng==
swagger-ui-react@^5.32.8:
version "5.32.8"
resolved "https://registry.yarnpkg.com/swagger-ui-react/-/swagger-ui-react-5.32.8.tgz#0608b45cf552f33fcc9b3fc5e07740c9a854861f"
integrity sha512-Cstx4Tq8fT5l2TBxHxts8pG+ks0qKSkuO1pwUwgrQQiZ241Mqs+KUODLVIonsYXL/gqX143rkcipUa4d0Rid7w==
dependencies:
"@babel/runtime-corejs3" "^7.27.1"
"@scarf/scarf" "=1.4.0"
@@ -14164,11 +14164,11 @@ swagger-ui-react@^5.32.6:
classnames "^2.5.1"
css.escape "1.5.1"
deep-extend "0.6.0"
dompurify "^3.4.0"
dompurify "^3.4.11"
ieee754 "^1.2.1"
immutable "^3.x.x"
js-file-download "^0.4.12"
js-yaml "=4.1.1"
js-yaml "=4.2.0"
lodash "^4.18.1"
prop-types "^15.8.1"
randexp "^0.5.3"
@@ -14502,15 +14502,15 @@ types-ramda@^0.30.1:
dependencies:
ts-toolbelt "^9.6.0"
typescript-eslint@^8.61.1:
version "8.61.1"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.61.1.tgz#7c224a9a643b7f42d295c67a75c1e30fee8c3eaa"
integrity sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==
typescript-eslint@^8.62.0:
version "8.62.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.62.0.tgz#7252c3c931637cda28794c0518f321ee89621d67"
integrity sha512-8QxXi+ZACKX0kaqO4gY8kn0RSD9gFfaHDWwjqtEN48aWCBkX4MJaufWN+c3BzlrXLOxfywDL8CaoqUwcRq4j4Q==
dependencies:
"@typescript-eslint/eslint-plugin" "8.61.1"
"@typescript-eslint/parser" "8.61.1"
"@typescript-eslint/typescript-estree" "8.61.1"
"@typescript-eslint/utils" "8.61.1"
"@typescript-eslint/eslint-plugin" "8.62.0"
"@typescript-eslint/parser" "8.62.0"
"@typescript-eslint/typescript-estree" "8.62.0"
"@typescript-eslint/utils" "8.62.0"
typescript@~6.0.3:
version "6.0.3"

View File

@@ -77,7 +77,7 @@ dependencies = [
# Flask-AppBuilder workaround. Tracking issue:
# https://github.com/apache/superset/issues/33162
"marshmallow>=3.0, <5",
"marshmallow-union>=0.1",
"marshmallow-union>=0.1.15.post1",
"msgpack>=1.2.0, <1.3",
"nh3>=0.3.5, <0.4",
"numpy>1.23.5, <2.3",
@@ -102,11 +102,11 @@ dependencies = [
"PyJWT>=2.4.0, <3.0",
"redis>=5.0.0, <6.0",
"rison>=2.0.0, <3.0",
"selenium>=4.44.0, <5.0",
"selenium>=4.45.0, <5.0",
"shillelagh[gsheetsapi]>=1.4.4, <2.0",
"sshtunnel>=0.4.0, <0.5",
"simplejson>=4.1.1",
"slack_sdk>=3.19.0, <4",
"slack_sdk>=3.42.0, <4",
"sqlalchemy>=1.4, <2",
"sqlalchemy-utils>=0.42.1, <0.43", # expanding lowerbound to work with pydoris
"sqlglot>=30.8.0, <31",
@@ -154,7 +154,7 @@ elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"]
exasol = ["sqlalchemy-exasol>=2.4.0, <8.0"]
excel = ["xlrd>=2.0.2, <2.1"]
fastmcp = [
"fastmcp>=3.2.4,<4.0",
"fastmcp>=3.4.2,<4.0",
# tiktoken backs the response-size-guard token estimator. Without
# it, the middleware falls back to a coarser character-based
# heuristic that under-counts JSON-heavy MCP responses.
@@ -197,7 +197,7 @@ redshift = ["sqlalchemy-redshift>=0.8.1, <0.9"]
risingwave = ["sqlalchemy-risingwave"]
shillelagh = ["shillelagh[all]>=1.4.4, <2"]
singlestore = ["sqlalchemy-singlestoredb>=1.1.1, <2"]
snowflake = ["snowflake-sqlalchemy>=1.2.4, <2"]
snowflake = ["snowflake-sqlalchemy>=1.10.2, <2"]
sqlite = ["syntaqlite>=0.1.0,<0.5.0"]
spark = [
"pyhive[hive]>=0.6.5;python_version<'3.11'",
@@ -212,7 +212,7 @@ tdengine = [
teradata = ["teradatasql>=16.20.0.23"]
thumbnails = [] # deprecated, will be removed in 7.0
vertica = ["sqlalchemy-vertica-python>= 0.6.3, < 0.7"]
netezza = ["nzalchemy>=11.0.2"]
netezza = ["nzalchemy>=11.0.2, < 11.2"]
starrocks = ["starrocks>=1.3.3, <2"]
doris = ["pydoris>=1.0.0, <2.0.0"]
oceanbase = ["oceanbase_py>=0.0.1.2"]
@@ -375,6 +375,7 @@ select = [
ignore = [
"S101",
"PT001", # pytest-fixture-incorrect-parentheses-style: different ruff versions disagree
"PT006",
"T201",
"N999",

View File

@@ -236,7 +236,7 @@ marshmallow-sqlalchemy==1.5.0
# via
# -r requirements/base.in
# flask-appbuilder
marshmallow-union==0.1.15
marshmallow-union==0.1.15.post1
# via apache-superset (pyproject.toml)
mdurl==0.1.2
# via markdown-it-py
@@ -375,7 +375,7 @@ rpds-py==0.25.0
# via
# jsonschema
# referencing
selenium==4.44.0
selenium==4.45.0
# via apache-superset (pyproject.toml)
setuptools==80.9.0
# via -r requirements/base.in
@@ -389,7 +389,7 @@ six==1.17.0
# python-dateutil
# rfc3339-validator
# wtforms-json
slack-sdk==3.35.0
slack-sdk==3.42.0
# via apache-superset (pyproject.toml)
sniffio==1.3.1
# via trio

View File

@@ -53,7 +53,7 @@ attrs==25.3.0
# requests-cache
# trio
authlib==1.6.12
# via fastmcp
# via fastmcp-slim
babel==2.17.0
# via
# -c requirements/base-constraint.txt
@@ -184,6 +184,7 @@ cryptography==48.0.1
# apache-superset
# authlib
# google-auth
# joserfc
# paramiko
# pyjwt
# pyopenssl
@@ -191,7 +192,7 @@ cryptography==48.0.1
cycler==0.12.1
# via matplotlib
cyclopts==4.2.4
# via fastmcp
# via fastmcp-slim
db-dtypes==1.3.1
# via pandas-gbq
defusedxml==0.7.1
@@ -236,9 +237,11 @@ et-xmlfile==2.0.0
# -c requirements/base-constraint.txt
# openpyxl
exceptiongroup==1.3.0
# via fastmcp
fastmcp==3.2.4
# via fastmcp-slim
fastmcp==3.4.2
# via apache-superset
fastmcp-slim==3.4.2
# via fastmcp
filelock==3.20.3
# via
# -c requirements/base-constraint.txt
@@ -382,7 +385,7 @@ greenlet==3.5.1
# shillelagh
# sqlalchemy
griffelib==2.0.2
# via fastmcp
# via fastmcp-slim
grpcio==1.81.1
# via
# apache-superset
@@ -413,7 +416,7 @@ httpcore==1.0.9
# via httpx
httpx==0.28.1
# via
# fastmcp
# fastmcp-slim
# mcp
httpx-sse==0.4.1
# via mcp
@@ -472,12 +475,14 @@ jmespath==1.1.0
# via
# boto3
# botocore
joserfc==1.7.2
# via fastmcp-slim
jsonpath-ng==1.8.0
# via
# -c requirements/base-constraint.txt
# apache-superset
jsonref==1.1.0
# via fastmcp
# via fastmcp-slim
jsonschema==4.23.0
# via
# -c requirements/base-constraint.txt
@@ -487,7 +492,7 @@ jsonschema==4.23.0
# openapi-spec-validator
jsonschema-path==0.3.4
# via
# fastmcp
# fastmcp-slim
# openapi-spec-validator
jsonschema-specifications==2025.4.1
# via
@@ -541,7 +546,7 @@ marshmallow-sqlalchemy==1.5.0
# via
# -c requirements/base-constraint.txt
# flask-appbuilder
marshmallow-union==0.1.15
marshmallow-union==0.1.15.post1
# via
# -c requirements/base-constraint.txt
# apache-superset
@@ -550,7 +555,7 @@ matplotlib==3.9.0
mccabe==0.7.0
# via pylint
mcp==1.24.0
# via fastmcp
# via fastmcp-slim
mdurl==0.1.2
# via
# -c requirements/base-constraint.txt
@@ -594,7 +599,7 @@ odfpy==1.4.1
# -c requirements/base-constraint.txt
# pandas
openapi-pydantic==0.5.1
# via fastmcp
# via fastmcp-slim
openapi-schema-validator==0.6.3
# via
# -c requirements/base-constraint.txt
@@ -606,7 +611,7 @@ openpyxl==3.1.5
# -c requirements/base-constraint.txt
# pandas
opentelemetry-api==1.39.1
# via fastmcp
# via fastmcp-slim
ordered-set==4.1.0
# via
# -c requirements/base-constraint.txt
@@ -627,7 +632,7 @@ packaging==25.0
# deprecation
# docker
# duckdb-engine
# fastmcp
# fastmcp-slim
# google-cloud-bigquery
# gunicorn
# limits
@@ -672,7 +677,7 @@ pip==25.1.1
platformdirs==4.3.8
# via
# -c requirements/base-constraint.txt
# fastmcp
# fastmcp-slim
# pylint
# requests-cache
# virtualenv
@@ -714,7 +719,7 @@ psutil==6.1.0
psycopg2-binary==2.9.12
# via apache-superset
py-key-value-aio==0.4.4
# via fastmcp
# via fastmcp-slim
pyarrow==24.0.0
# via
# -c requirements/base-constraint.txt
@@ -741,7 +746,7 @@ pydantic==2.11.7
# -c requirements/base-constraint.txt
# apache-superset
# apache-superset-core
# fastmcp
# fastmcp-slim
# mcp
# openapi-pydantic
# pydantic-settings
@@ -750,7 +755,9 @@ pydantic-core==2.33.2
# -c requirements/base-constraint.txt
# pydantic
pydantic-settings==2.10.1
# via mcp
# via
# fastmcp-slim
# mcp
pydata-google-auth==1.9.0
# via pandas-gbq
pydruid==0.6.9
@@ -793,7 +800,7 @@ pyparsing==3.2.3
# apache-superset
# matplotlib
pyperclip==1.10.0
# via fastmcp
# via fastmcp-slim
pysocks==1.7.1
# via
# -c requirements/base-constraint.txt
@@ -835,12 +842,14 @@ python-dotenv==1.2.2
# via
# -c requirements/base-constraint.txt
# apache-superset
# fastmcp
# fastmcp-slim
# pydantic-settings
python-ldap==3.4.7
# via apache-superset
python-multipart==0.0.29
# via mcp
# via
# fastmcp-slim
# mcp
pytz==2025.2
# via
# -c requirements/base-constraint.txt
@@ -856,7 +865,7 @@ pyyaml==6.0.3
# -c requirements/base-constraint.txt
# apache-superset
# apispec
# fastmcp
# fastmcp-slim
# jsonschema-path
# pre-commit
redis==5.3.1
@@ -899,7 +908,7 @@ rich==13.9.4
# via
# -c requirements/base-constraint.txt
# cyclopts
# fastmcp
# fastmcp-slim
# flask-limiter
# rich-rst
rich-rst==1.3.1
@@ -919,7 +928,7 @@ s3transfer==0.16.0
# via boto3
secretstorage==3.5.0
# via keyring
selenium==4.44.0
selenium==4.45.0
# via
# -c requirements/base-constraint.txt
# apache-superset
@@ -948,7 +957,7 @@ six==1.17.0
# python-dateutil
# rfc3339-validator
# wtforms-json
slack-sdk==3.35.0
slack-sdk==3.42.0
# via
# -c requirements/base-constraint.txt
# apache-superset
@@ -995,8 +1004,10 @@ sshtunnel==0.4.0
# via
# -c requirements/base-constraint.txt
# apache-superset
starlette==0.49.1
# via mcp
starlette==1.3.1
# via
# fastmcp-slim
# mcp
statsd==4.0.1
# via apache-superset
syntaqlite==0.4.2
@@ -1035,6 +1046,7 @@ typing-extensions==4.15.0
# apache-superset-core
# cattrs
# exceptiongroup
# fastmcp-slim
# grpcio
# limits
# mcp
@@ -1062,7 +1074,7 @@ tzdata==2025.2
tzlocal==5.2
# via trino
uncalled-for==0.2.0
# via fastmcp
# via fastmcp-slim
url-normalize==2.2.1
# via
# -c requirements/base-constraint.txt
@@ -1077,7 +1089,7 @@ urllib3==2.7.0
# selenium
uvicorn==0.37.0
# via
# fastmcp
# fastmcp-slim
# mcp
vine==5.1.0
# via
@@ -1093,7 +1105,7 @@ watchdog==6.0.0
# apache-superset
# apache-superset-extensions-cli
watchfiles==1.1.1
# via fastmcp
# via fastmcp-slim
wcwidth==0.2.13
# via
# -c requirements/base-constraint.txt
@@ -1103,7 +1115,7 @@ websocket-client==1.8.0
# -c requirements/base-constraint.txt
# selenium
websockets==15.0.1
# via fastmcp
# via fastmcp-slim
werkzeug==3.1.6
# via
# -c requirements/base-constraint.txt

View File

@@ -86,7 +86,19 @@ def build_index(translations_dir: Path) -> dict[str, Any]:
for lang in langs:
po_path = translations_dir / lang / "LC_MESSAGES" / "messages.po"
cat = polib.pofile(str(po_path))
try:
cat = polib.pofile(str(po_path))
except (OSError, UnicodeDecodeError) as exc:
# A single malformed catalog shouldn't block backfilling every
# other language. polib raises OSError on syntax errors (e.g. an
# unescaped quote) and UnicodeDecodeError on bad encoding; skip
# either with a loud warning so the corrupt file gets fixed
# separately.
print(
f"WARNING: skipping {lang} — could not parse {po_path}: {exc}",
file=sys.stderr,
)
continue
for entry in cat:
if not entry.msgid:
continue # skip header entry

View File

@@ -20,21 +20,31 @@ Check that source-code changes don't cause translation regressions.
What counts as a regression
---------------------------
A regression is an *existing translation that a source change invalidated*.
The check keys on the **increase in fuzzy entries** rather than a drop in the
translated count, because a count drop happens identically for a benign
*deletion* and a real *rename*, so it cannot distinguish the two — whereas a
``#, fuzzy`` marker unambiguously flags a stranded translation.
A regression is an *existing translation that a source change invalidated*:
a message that was a **confirmed, non-fuzzy translation** in the baseline and
is **fuzzy** after the PR. The check keys on this per-``msgid`` transition
rather than on the aggregate count of fuzzy entries, because a bare count
cannot tell apart two changes that move the fuzzy total by the same amount:
* ``translated -> fuzzy`` — a reworded source string stranded a real
translation. **This is the regression.**
* ``untranslated -> fuzzy`` — an empty ``msgstr`` was filled with a fuzzy
(unconfirmed) guess, e.g. an AI backfill committed as ``#, fuzzy``. No
existing translation was lost, so this is **not** a regression and must
pass.
Keying on the per-entry transition lets a backfill PR commit fuzzy guesses for
previously-untranslated strings (the ja/fi catalog backfills) without tripping
the check, while still catching a genuine invalidation even when the same PR
also adds new strings (which a count-delta heuristic would let mask it).
Note ``babel_update.sh`` runs ``pybabel update`` with ``--no-fuzzy-matching``,
so *adding* (or renaming) a source string does **not** auto-generate a fuzzy
guess against an unrelated existing translation — new strings land as cleanly
untranslated (empty ``msgstr``). This deliberately avoids the prior behaviour
where *every* PR that merely added a translatable string tripped this check on
spurious fuzzies. As a result the check now guards against ``#, fuzzy`` entries
that arrive another way — e.g. a committed ``.po`` edit — rather than ones the
update step synthesises. *Deleting* a string is still not a regression: with
``--ignore-obsolete`` it is simply dropped and no fuzzy is created.
untranslated (empty ``msgstr``). The fuzzies this check sees therefore arrive
another way — typically a committed ``.po`` edit. *Deleting* a string is still
not a regression: with ``--ignore-obsolete`` it is simply dropped and no fuzzy
is created.
Usage
-----
@@ -127,28 +137,72 @@ def count_stats(po_file: Path) -> dict[str, int]:
}
def entry_keys(po_file: Path) -> dict[str, list[str]]:
"""Return per-``msgid`` key sets for a .po file.
``translated_keys`` lists the non-fuzzy, non-obsolete entries with a
populated ``msgstr`` — confirmed translations a source reword could strand.
``fuzzy_keys`` lists the non-obsolete entries carrying the ``fuzzy`` flag
(however they arrived — a committed backfill guess or a real invalidation).
A key combines ``msgctxt`` and ``msgid`` (gettext's own identity rule) so
context-disambiguated entries stay distinct. The header entry (empty
``msgid``) is ignored. The regression check compares the baseline's
``translated_keys`` against the PR's ``fuzzy_keys``: their intersection is
exactly the set of confirmed translations the PR turned fuzzy.
Raises:
OSError: if ``polib`` cannot read or parse the file. As with a msgfmt
failure, a catalog we cannot parse is surfaced rather than silently
counted as empty.
"""
import polib # type: ignore[import-untyped] # noqa: PLC0415
translated_keys: list[str] = []
fuzzy_keys: list[str] = []
for entry in polib.pofile(str(po_file)):
if entry.obsolete or not entry.msgid:
continue
key = f"{entry.msgctxt}\x04{entry.msgid}" if entry.msgctxt else entry.msgid
if "fuzzy" in entry.flags:
fuzzy_keys.append(key)
elif (
all(entry.msgstr_plural.values())
if entry.msgid_plural
else bool(entry.msgstr)
):
translated_keys.append(key)
return {"translated_keys": translated_keys, "fuzzy_keys": fuzzy_keys}
def get_counts(
translations_dir: Path,
failures: Optional[set[str]] = None,
) -> dict[str, dict[str, int]]:
) -> dict[str, dict[str, object]]:
"""Count translated/fuzzy entries for every ``.po`` file in a directory.
Each language maps to ``{"translated", "fuzzy", "translated_keys",
"fuzzy_keys"}`` — aggregate counts (for the human-readable summary) plus the
per-``msgid`` key sets the regression check actually keys on.
If ``failures`` is provided, the name of each language whose ``.po`` file
is present on disk but could not be counted (msgfmt non-zero exit, or
unparseable output) is added to it. Such a language is deliberately absent
from the returned mapping — but, unlike a language whose catalog was simply
deleted, it must not be mistaken for an intentional removal: a caller that
cares about the distinction (see :func:`cmd_compare`) can inspect
``failures`` and treat it as a hard error.
is present on disk but could not be counted (msgfmt non-zero exit,
unparseable output, or a polib parse error) is added to it. Such a language
is deliberately absent from the returned mapping — but, unlike a language
whose catalog was simply deleted, it must not be mistaken for an intentional
removal: a caller that cares about the distinction (see :func:`cmd_compare`)
can inspect ``failures`` and treat it as a hard error.
"""
counts: dict[str, dict[str, int]] = {}
counts: dict[str, dict[str, object]] = {}
for po_file in sorted(translations_dir.glob("*/LC_MESSAGES/messages.po")):
lang = po_file.parent.parent.name
if lang in SKIP_LANGS:
continue
try:
counts[lang] = count_stats(po_file)
except (subprocess.CalledProcessError, RuntimeError) as exc:
stats: dict[str, object] = dict(count_stats(po_file))
stats.update(entry_keys(po_file))
counts[lang] = stats
except (subprocess.CalledProcessError, RuntimeError, OSError) as exc:
# A malformed .po file (msgfmt non-zero exit, or stderr we
# can't parse) is a real problem worth seeing, but it shouldn't
# take the whole regression check down with it — that would
@@ -164,42 +218,73 @@ def get_counts(
return counts
def _normalize(entry: object) -> dict[str, int]:
"""Coerce a baseline entry into ``{"translated", "fuzzy"}``.
def _normalize(entry: object) -> dict[str, object]:
"""Coerce a baseline entry into ``{"translated", "fuzzy", *_keys}``.
Tolerates the legacy baseline format where each language mapped directly to
an integer translated count (no fuzzy data); such entries contribute a
fuzzy baseline of 0.
``translated_keys``/``fuzzy_keys`` are the per-``msgid`` sets the check
keys on. They are ``None`` (not ``[]``) when the baseline predates the
per-entry format — an absent set means "unknown", which routes
:func:`cmd_compare` to the coarse aggregate fallback, whereas an empty list
is a known-empty set. Legacy formats — a ``{"translated", "fuzzy"}`` dict
with no key sets, or a bare integer translated count — are both tolerated.
"""
if isinstance(entry, dict):
return {
"translated": int(entry.get("translated", 0)),
"fuzzy": int(entry.get("fuzzy", 0)),
"translated_keys": (
list(entry["translated_keys"]) if "translated_keys" in entry else None
),
"fuzzy_keys": (
list(entry["fuzzy_keys"]) if "fuzzy_keys" in entry else None
),
}
if isinstance(entry, int):
return {"translated": entry, "fuzzy": 0}
return {
"translated": entry,
"fuzzy": 0,
"translated_keys": None,
"fuzzy_keys": None,
}
raise TypeError(f"Unsupported baseline entry: {entry!r}")
def build_regression_report(regressions: list[tuple[str, int, int]]) -> str:
def _key_list(stats: dict[str, object], field: str) -> Optional[list[str]]:
"""Return ``stats[field]`` as a list of keys, or ``None`` if unavailable.
A missing or non-list value reads as "unknown" so the caller can fall back
to the aggregate comparison instead of treating it as an empty key set.
"""
value = stats.get(field)
return list(value) if isinstance(value, list) else None
def _count(stats: dict[str, object], field: str) -> int:
"""Return ``stats[field]`` as an int count, defaulting to 0."""
value = stats.get(field, 0)
return value if isinstance(value, int) else 0
def build_regression_report(regressions: list[tuple[str, int, int, int]]) -> str:
"""Build a markdown report for posting as a PR comment.
Each regression tuple is ``(lang, before_fuzzy, after_fuzzy)``.
Each regression tuple is ``(lang, before_fuzzy, after_fuzzy, invalidated)``
where ``invalidated`` is the number of confirmed translations the PR turned
fuzzy.
"""
rows = "\n".join(
f"| `{lang}` | {b} | {a} | +{a - b} |" for lang, b, a in regressions
)
affected = ", ".join(f"`{lang}`" for lang, _, _ in regressions)
rows = "\n".join(f"| `{lang}` | {n} |" for lang, _b, _a, n in regressions)
affected = ", ".join(f"`{lang}`" for lang, *_ in regressions)
return (
"## ⚠️ Translation Regression Detected\n\n"
f"A source change in this PR renamed or reworded strings, invalidating "
f"existing translations (they are now `#, fuzzy`) in {affected}. Please "
f"resolve the affected `.po` files before merging.\n\n"
"_Note: intentionally **deleting** a translatable string is not a "
"regression and is not flagged here — only translations invalidated by "
"a renamed/reworded source string are._\n\n"
"| Language | Fuzzy before | Fuzzy after | New |\n"
"|----------|-------------:|------------:|----:|\n"
"_Note: neither intentionally **deleting** a translatable string nor "
"filling a previously-**untranslated** entry with a fuzzy guess (e.g. an "
"AI backfill) is a regression — only a confirmed translation that a "
"renamed/reworded source string turned fuzzy is flagged here._\n\n"
"| Language | Invalidated translations |\n"
"|----------|-------------------------:|\n"
f"{rows}\n\n"
"### How to fix\n\n"
"**1. Install dependencies** (if not already set up):\n\n"
@@ -231,6 +316,41 @@ def cmd_count(translations_dir: Path) -> None:
print(json.dumps(counts, indent=2))
def _detect_regressions(
before: dict[str, dict[str, object]],
after: dict[str, dict[str, object]],
) -> list[tuple[str, int, int, int]]:
"""Return ``(lang, before_fuzzy, after_fuzzy, invalidated)`` per regressed lang.
A regression is a key in the baseline's ``translated_keys`` that is fuzzy
after the PR — a confirmed translation a source reword stranded. Filling a
previously-untranslated entry with a fuzzy guess (backfill) is therefore not
flagged (its key was absent from the baseline's translated set), and neither
is deleting a string (with ``--ignore-obsolete`` it drops, creating no
fuzzy). When per-entry key data is unavailable (a legacy baseline, or a
catalog whose key set could not be read), fall back to the coarse rule: any
net increase in the aggregate fuzzy count.
"""
regressions: list[tuple[str, int, int, int]] = []
for lang, before_stats in sorted(before.items()):
after_stats = after.get(lang)
if after_stats is None:
# Catalog absent from `after`: an intentional deletion (a
# present-but-uncountable catalog was already caught by the caller).
continue
b_fuzzy = _count(before_stats, "fuzzy")
a_fuzzy = _count(after_stats, "fuzzy")
before_translated = before_stats.get("translated_keys")
after_fuzzy = _key_list(after_stats, "fuzzy_keys")
if isinstance(before_translated, list) and after_fuzzy is not None:
invalidated = set(after_fuzzy) & set(before_translated)
if invalidated:
regressions.append((lang, b_fuzzy, a_fuzzy, len(invalidated)))
elif a_fuzzy > b_fuzzy:
regressions.append((lang, b_fuzzy, a_fuzzy, a_fuzzy - b_fuzzy))
return regressions
def cmd_compare(
before_path: str,
translations_dir: Path,
@@ -259,23 +379,12 @@ def cmd_compare(
)
sys.exit(1)
# A regression is an *increase* in fuzzy entries: the PR's source diff
# renamed/reworded strings, leaving their committed translations stranded.
# A plain drop in the translated count is NOT used — deleting a string
# lowers it identically to a rename but is a legitimate change, and with
# `pybabel update --ignore-obsolete` a deletion creates no fuzzy entry.
regressions: list[tuple[str, int, int]] = []
for lang, before_stats in sorted(before.items()):
after_stats = after.get(lang, {"translated": 0, "fuzzy": 0})
if after_stats["fuzzy"] > before_stats["fuzzy"]:
regressions.append((lang, before_stats["fuzzy"], after_stats["fuzzy"]))
if regressions:
if regressions := _detect_regressions(before, after):
print("Translation regression detected!\n")
for lang, b, a in regressions:
for lang, _b, _a, n in regressions:
print(
f" {lang}: {a - b} translation(s) invalidated "
f"(fuzzy {b} -> {a}) by a renamed/reworded source string"
f" {lang}: {n} confirmed translation(s) invalidated "
f"(now fuzzy) by a renamed/reworded source string"
)
print(
"\nResolve the newly-fuzzy entries in the affected .po files "
@@ -290,14 +399,16 @@ def cmd_compare(
# All good — print a summary so it's easy to read in CI logs.
print("No translation regressions.\n")
for lang in sorted(after):
before_stats = before.get(lang, {"translated": 0, "fuzzy": 0})
before_stats: dict[str, object] = before.get(lang, {})
after_stats = after[lang]
t_delta = after_stats["translated"] - before_stats["translated"]
f_delta = after_stats["fuzzy"] - before_stats["fuzzy"]
b_translated = _count(before_stats, "translated")
a_translated = _count(after_stats, "translated")
b_fuzzy = _count(before_stats, "fuzzy")
a_fuzzy = _count(after_stats, "fuzzy")
print(
f" {lang}: translated {before_stats['translated']} -> "
f"{after_stats['translated']} ({t_delta:+d}), fuzzy "
f"{before_stats['fuzzy']} -> {after_stats['fuzzy']} ({f_delta:+d})"
f" {lang}: translated {b_translated} -> {a_translated} "
f"({a_translated - b_translated:+d}), fuzzy "
f"{b_fuzzy} -> {a_fuzzy} ({a_fuzzy - b_fuzzy:+d})"
)

View File

@@ -20,4 +20,5 @@
module.exports = {
presets: ["@babel/preset-typescript", "@babel/preset-env"],
sourceMaps: true,
ignore: ["**/*.test.ts"],
};

View File

@@ -1879,21 +1879,21 @@
}
},
"node_modules/@emnapi/core": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
"integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/wasi-threads": "1.2.1",
"@emnapi/wasi-threads": "1.2.2",
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/runtime": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
"integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1902,9 +1902,9 @@
}
},
"node_modules/@emnapi/wasi-threads": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
"integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1971,14 +1971,14 @@
}
},
"node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
"integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
"integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@tybys/wasm-util": "^0.10.1"
"@tybys/wasm-util": "^0.10.3"
},
"funding": {
"type": "github",
@@ -1997,9 +1997,9 @@
"optional": true
},
"node_modules/@oxc-project/types": {
"version": "0.132.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz",
"integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==",
"version": "0.137.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz",
"integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2007,9 +2007,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz",
"integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz",
"integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==",
"cpu": [
"arm64"
],
@@ -2024,9 +2024,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz",
"integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz",
"integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==",
"cpu": [
"arm64"
],
@@ -2041,9 +2041,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz",
"integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz",
"integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==",
"cpu": [
"x64"
],
@@ -2058,9 +2058,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz",
"integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz",
"integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==",
"cpu": [
"x64"
],
@@ -2075,9 +2075,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz",
"integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz",
"integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==",
"cpu": [
"arm"
],
@@ -2092,13 +2092,16 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz",
"integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz",
"integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2109,13 +2112,16 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz",
"integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz",
"integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2126,13 +2132,16 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz",
"integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz",
"integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2143,13 +2152,16 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz",
"integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz",
"integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==",
"cpu": [
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2160,13 +2172,16 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz",
"integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz",
"integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2177,13 +2192,16 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz",
"integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz",
"integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2194,9 +2212,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz",
"integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz",
"integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==",
"cpu": [
"arm64"
],
@@ -2211,9 +2229,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz",
"integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz",
"integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==",
"cpu": [
"wasm32"
],
@@ -2221,18 +2239,18 @@
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "1.10.0",
"@emnapi/runtime": "1.10.0",
"@napi-rs/wasm-runtime": "^1.1.4"
"@emnapi/core": "1.11.1",
"@emnapi/runtime": "1.11.1",
"@napi-rs/wasm-runtime": "^1.1.6"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz",
"integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz",
"integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==",
"cpu": [
"arm64"
],
@@ -2247,9 +2265,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz",
"integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz",
"integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==",
"cpu": [
"x64"
],
@@ -2284,9 +2302,9 @@
"license": "Apache-2.0"
},
"node_modules/@tybys/wasm-util": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
"integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
"integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -3224,11 +3242,21 @@
"dev": true
},
"node_modules/fast-uri": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
"integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
"dev": true,
"license": "MIT"
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fastify"
}
],
"license": "BSD-3-Clause"
},
"node_modules/fastest-levenshtein": {
"version": "1.0.12",
@@ -4469,13 +4497,13 @@
}
},
"node_modules/rolldown": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz",
"integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz",
"integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.132.0",
"@oxc-project/types": "=0.137.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -4485,21 +4513,21 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.2",
"@rolldown/binding-darwin-arm64": "1.0.2",
"@rolldown/binding-darwin-x64": "1.0.2",
"@rolldown/binding-freebsd-x64": "1.0.2",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.2",
"@rolldown/binding-linux-arm64-gnu": "1.0.2",
"@rolldown/binding-linux-arm64-musl": "1.0.2",
"@rolldown/binding-linux-ppc64-gnu": "1.0.2",
"@rolldown/binding-linux-s390x-gnu": "1.0.2",
"@rolldown/binding-linux-x64-gnu": "1.0.2",
"@rolldown/binding-linux-x64-musl": "1.0.2",
"@rolldown/binding-openharmony-arm64": "1.0.2",
"@rolldown/binding-wasm32-wasi": "1.0.2",
"@rolldown/binding-win32-arm64-msvc": "1.0.2",
"@rolldown/binding-win32-x64-msvc": "1.0.2"
"@rolldown/binding-android-arm64": "1.1.3",
"@rolldown/binding-darwin-arm64": "1.1.3",
"@rolldown/binding-darwin-x64": "1.1.3",
"@rolldown/binding-freebsd-x64": "1.1.3",
"@rolldown/binding-linux-arm-gnueabihf": "1.1.3",
"@rolldown/binding-linux-arm64-gnu": "1.1.3",
"@rolldown/binding-linux-arm64-musl": "1.1.3",
"@rolldown/binding-linux-ppc64-gnu": "1.1.3",
"@rolldown/binding-linux-s390x-gnu": "1.1.3",
"@rolldown/binding-linux-x64-gnu": "1.1.3",
"@rolldown/binding-linux-x64-musl": "1.1.3",
"@rolldown/binding-openharmony-arm64": "1.1.3",
"@rolldown/binding-wasm32-wasi": "1.1.3",
"@rolldown/binding-win32-arm64-msvc": "1.1.3",
"@rolldown/binding-win32-x64-msvc": "1.1.3"
}
},
"node_modules/schema-utils": {
@@ -4723,9 +4751,9 @@
}
},
"node_modules/tinyglobby": {
"version": "0.2.16",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4926,17 +4954,17 @@
}
},
"node_modules/vite": {
"version": "8.0.14",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz",
"integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz",
"integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.4",
"postcss": "^8.5.15",
"rolldown": "1.0.2",
"tinyglobby": "^0.2.16"
"rolldown": "~1.1.2",
"tinyglobby": "^0.2.17"
},
"bin": {
"vite": "bin/vite.js"
@@ -4952,7 +4980,7 @@
},
"peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0",
"@vitejs/devtools": "^0.1.18",
"@vitejs/devtools": "^0.3.0",
"esbuild": "^0.27.0 || ^0.28.0",
"jiti": ">=1.21.0",
"less": "^4.0.0",

View File

@@ -22,7 +22,7 @@
"module": "lib/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc && babel src --out-dir lib --extensions '.ts,.tsx' && webpack --mode production",
"build": "tsc && babel src --out-dir lib --extensions '.ts' && webpack --mode production",
"ci:release": "node ./release-if-necessary.js",
"test": "vitest --run --dir src"
},

View File

@@ -23,6 +23,7 @@
],
"exclude": [
"src/**/*.test.ts",
"dist",
"lib",
"node_modules"

View File

@@ -44,7 +44,6 @@ module.exports = {
'@babel/preset-typescript',
],
plugins: [
'lodash',
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-transform-export-namespace-from',
['@babel/plugin-transform-class-properties', { loose: true }],

View File

@@ -25,6 +25,9 @@ module.exports = {
'\\.(css|less|geojson)$': '<rootDir>/spec/__mocks__/mockExportObject.js',
'\\.(gif|ttf|eot|png|jpg)$': '<rootDir>/spec/__mocks__/mockExportString.js',
'\\.svg$': '<rootDir>/spec/__mocks__/svgrMock.tsx',
// lodash-es is ESM (type: module) which jest.mock cannot intercept; alias to
// the CJS lodash build (identical API) so module mocks work in tests.
'^lodash-es$': '<rootDir>/node_modules/lodash',
'^src/(.*)$': '<rootDir>/src/$1',
'^spec/(.*)$': '<rootDir>/spec/$1',
// mapping plugins of superset-ui to source code

View File

@@ -91,7 +91,7 @@
"dayjs": "^1.11.21",
"dom-to-image-more": "^3.10.0",
"dom-to-pdf": "^0.3.2",
"echarts": "^5.6.0",
"echarts": "^6.1.0",
"fast-glob": "^3.3.2",
"fs-extra": "^11.3.5",
"fuse.js": "^7.4.2",
@@ -109,13 +109,14 @@
"json-bigint": "^1.0.0",
"json-stringify-pretty-compact": "^4.0.0",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"mapbox-gl": "^3.25.0",
"markdown-to-jsx": "^9.8.2",
"match-sorter": "^8.3.0",
"memoize-one": "^6.0.0",
"mousetrap": "^1.6.5",
"mustache": "^4.2.0",
"nanoid": "^5.1.14",
"nanoid": "^5.1.15",
"ol": "^10.9.0",
"query-string": "9.4.0",
"re-resizable": "^6.11.2",
@@ -154,7 +155,7 @@
"use-event-callback": "^0.1.0",
"use-immer": "^0.11.0",
"use-query-params": "^2.2.2",
"uuid": "^14.0.0",
"uuid": "^14.0.1",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
"yargs": "^18.0.0"
},
@@ -186,8 +187,8 @@
"@storybook/react-webpack5": "10.4.4",
"@storybook/test-runner": "0.24.4",
"@svgr/webpack": "^8.1.0",
"@swc/core": "^1.15.41",
"@swc/plugin-emotion": "^14.13.0",
"@swc/core": "^1.15.43",
"@swc/plugin-emotion": "^14.14.0",
"@swc/plugin-transform-imports": "^12.5.0",
"@testing-library/dom": "^9.3.4",
"@testing-library/jest-dom": "^6.9.1",
@@ -199,6 +200,7 @@
"@types/jquery": "^4.0.1",
"@types/js-levenshtein": "^1.1.3",
"@types/json-bigint": "^1.0.4",
"@types/lodash-es": "^4.17.12",
"@types/mousetrap": "^1.6.15",
"@types/node": "^26.0.0",
"@types/react": "^18.3.0",
@@ -219,7 +221,6 @@
"babel-loader": "^10.1.1",
"babel-plugin-dynamic-import-node": "^2.3.3",
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
"babel-plugin-lodash": "^3.3.4",
"baseline-browser-mapping": "^2.10.38",
"cheerio": "1.2.0",
"concurrently": "^10.0.3",
@@ -260,7 +261,7 @@
"lightningcss": "^1.32.0",
"mini-css-extract-plugin": "^2.10.2",
"open-cli": "^9.0.0",
"oxlint": "^1.70.0",
"oxlint": "^1.71.0",
"po2json": "^0.4.5",
"prettier": "3.8.4",
"prettier-plugin-packagejson": "^3.0.2",
@@ -280,7 +281,7 @@
"tscw-config": "^1.1.2",
"tsx": "^4.22.4",
"typescript": "5.4.5",
"unzipper": "^0.12.3",
"unzipper": "^0.12.5",
"vm-browserify": "^1.1.2",
"wait-on": "^9.0.10",
"webpack": "^5.107.2",
@@ -8312,9 +8313,9 @@
]
},
"node_modules/@oxlint/binding-android-arm-eabi": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.70.0.tgz",
"integrity": "sha512-zFh0P4cswmRvw6nkyb89dr18rRanuaCPAsEXsFDoQY8WdaquI8Pt4NWFjaMJg6L23cy5NeN8J9cBnREbWzZhaw==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.71.0.tgz",
"integrity": "sha512-ImGmd1njEg4FEJH03jhRnveEegtO3czCtfptvaHivKAZQIYATbVFBrrzbaYMYv0oJioTnxZAZVSyV+oL7W8S2g==",
"cpu": [
"arm"
],
@@ -8329,9 +8330,9 @@
}
},
"node_modules/@oxlint/binding-android-arm64": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.70.0.tgz",
"integrity": "sha512-qI8o4HZjeGiBrWv+pJv4lH0Yi2Gl/JSp/EumBUApezJprIKa5PS4nU0lQsQngtky8k+SplQIOjv6hwu0SSxeyg==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.71.0.tgz",
"integrity": "sha512-4A5BEexBrwY1YFF8Kiq/lp/wQPRG79G3BWIE1FuWaM5MvmpYSd+7ZySVcKkHdwo0UDzdQGddp6pD9mpctMqLnw==",
"cpu": [
"arm64"
],
@@ -8346,9 +8347,9 @@
}
},
"node_modules/@oxlint/binding-darwin-arm64": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.70.0.tgz",
"integrity": "sha512-8KjgVVHI5F9nVwHCRwwA78Ty7zNKP4Wd9OeN5PSv3iu/F/u1RVXoOCgLhWqust6HmwQG6xc8c+RCyaWENy24+w==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.71.0.tgz",
"integrity": "sha512-9wJA9GJulLwS2usU3CEisI/ESDO1n1z9eyTCvApMDrAkbJ1ve0mORgTMjcWWsKxkzkeZ2N/Gpra5IQE7x8tYgQ==",
"cpu": [
"arm64"
],
@@ -8363,9 +8364,9 @@
}
},
"node_modules/@oxlint/binding-darwin-x64": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.70.0.tgz",
"integrity": "sha512-WVydssv5PSUBXFJTdNBWlmGkbNmvPGaFt/2SUT/EZRB6bq6bEOHmMlbnupZD5jmlEvi9+mZJHi8TCw15lyfSfQ==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.71.0.tgz",
"integrity": "sha512-PlLCjS06V0PeJMAJwzjrExw1sYNW9Gch3JtNlcwwZDXGlTYDuwHNN89zYH8LTXFfgkVtsYvs2nv0FqrzyuFDzg==",
"cpu": [
"x64"
],
@@ -8380,9 +8381,9 @@
}
},
"node_modules/@oxlint/binding-freebsd-x64": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.70.0.tgz",
"integrity": "sha512-hJucmUf8OlinHNb1R7fI4Fw6WsAstOz7i8nmkWQfiHoZXtbufNm+MxiDTIMk1ggh2Ro4vLzgQ+bKvRY54MZoRA==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.71.0.tgz",
"integrity": "sha512-Lhil7bWre0ncxbUoDoxfS0JzpTz17BRQKW7iwoAUY8GJ66+WwJEfYPCFJ1P0WgVZR5/O/b3Q2pENlHOjeXLOGQ==",
"cpu": [
"x64"
],
@@ -8397,9 +8398,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm-gnueabihf": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.70.0.tgz",
"integrity": "sha512-1BnS7wbCYDSXwWzJJ+mc3NURoha6m6m6RT5c6vgAY3oz7C3OVXP+S0awo2mRq97arrJkVvO3qRQfyAHL+76xtQ==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.71.0.tgz",
"integrity": "sha512-Oo9/L58PYD3RC0x05d2upAPLllHytTjHQGsnC06P6Ynn7jKkp5mdImQxXdJ3+FnBaKspNpGogzgVsi6g872LiA==",
"cpu": [
"arm"
],
@@ -8414,9 +8415,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm-musleabihf": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.70.0.tgz",
"integrity": "sha512-yKy/UdbR55+M2yEcuiV5DCNC/gdQAjr/GioUy50QwBzSrKm8ueWADqyRLS9Xk+qjNeCYGg6A8FvUBds56ttfqg==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.71.0.tgz",
"integrity": "sha512-mSHfyfgJrEbyIR29ejaeS50BdPk+GoNPlC1dckpDiUZbJAIel68sjSMdOt4WY0/gva+ECC7FNITQkxMJU+vSBw==",
"cpu": [
"arm"
],
@@ -8431,9 +8432,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm64-gnu": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.70.0.tgz",
"integrity": "sha512-0A5XJ4alvmqFUFP/4oYSyaO+qLto/HrKEWTSaegiVl+HOufFngK2BjYw9x4RbwBt/du5QG6l5q1zeWiJYYG5yg==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.71.0.tgz",
"integrity": "sha512-n9yY4M2tiy3aij4AqtlnspzpfdpeT5JQfK2/w2d8oyp5W0FRwOb1dIeX99nORNcxGr08iD9bH8N5XFz3I2iy8w==",
"cpu": [
"arm64"
],
@@ -8451,9 +8452,9 @@
}
},
"node_modules/@oxlint/binding-linux-arm64-musl": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.70.0.tgz",
"integrity": "sha512-JiylyurlB0CLSedNtx1gzv3FvfWPF1h/2Y3BJszPLNt5XQFlBsH5ke0Jle3iJb3uqu5m2e7A/DwzpuCAHdiU+A==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.71.0.tgz",
"integrity": "sha512-fJZrs5sDZtTaPIOiemRQQmo82Ezy+vOGXemPc4Ok7iVVsYsFa7SlW6Z5XN819VfsqBHRm3NJ3rTdnR8+bJYJdQ==",
"cpu": [
"arm64"
],
@@ -8471,9 +8472,9 @@
}
},
"node_modules/@oxlint/binding-linux-ppc64-gnu": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.70.0.tgz",
"integrity": "sha512-J8VPG7I3/HmgaU4u8pNU2kFx2+0U+vPLS1dXFxXOaR/2TQ0f8AC7DRz0SRGRI1bfphnX2hVYTTtLuhL4nYKL+Q==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.71.0.tgz",
"integrity": "sha512-cwl7VKGERIy9p+G+AvZdfy/06q0aHXaTt/mMRReC751iuNYJgqKjB7NydXSS30nBT9vtr2tunciOtrR4fD6FUA==",
"cpu": [
"ppc64"
],
@@ -8491,9 +8492,9 @@
}
},
"node_modules/@oxlint/binding-linux-riscv64-gnu": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.70.0.tgz",
"integrity": "sha512-N2+4lV2KLN+oXTIIIwmWDhwkrnvqf5oX7Hw0zPjk+RuIVgiBQSOlJWF7uQoFx2siEYX0ZQ5cfSbEAHm+J3t7Wg==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.71.0.tgz",
"integrity": "sha512-eZ8ieVXvzGi8jr7+ybQGPK2STw3mldfxZlgA2738iflfB/rzA69sE6m5rDRpQaxC7dpm745Enlh1Tod0QAk9Gg==",
"cpu": [
"riscv64"
],
@@ -8511,9 +8512,9 @@
}
},
"node_modules/@oxlint/binding-linux-riscv64-musl": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.70.0.tgz",
"integrity": "sha512-1e2L7cFCvx9QDzq6NPP+0tABKb5z6nWHyddWTNKprEsjO9xNrAtPowuCGpjNXxkTdsMiZ4jc8YQ5SstZd4XK6g==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.71.0.tgz",
"integrity": "sha512-puMDbQYe6+NXwfMusojoA7CXGn2b3utukmd23PQqc1E3XhVCwyZ+FueSMzDYeNgDV2dUfIVXAAKZBcFDeCL6sA==",
"cpu": [
"riscv64"
],
@@ -8531,9 +8532,9 @@
}
},
"node_modules/@oxlint/binding-linux-s390x-gnu": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.70.0.tgz",
"integrity": "sha512-Kwu/l/8GcYibCWA9m9N5pRXMIKVSsL/YbgpLzYkqDhWTiqdRfnNJ/+nqIKRKQiFbHWsdlHEhzMwruJK+qcEruA==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.71.0.tgz",
"integrity": "sha512-4NJLxBs1ujISCt3L/1FcywLs73PWtJuw+piD6feK2V6h6OS6P7xu9/sWt1DTRLibe6QCzmfZzmM/2HPORoV/Lg==",
"cpu": [
"s390x"
],
@@ -8551,9 +8552,9 @@
}
},
"node_modules/@oxlint/binding-linux-x64-gnu": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.70.0.tgz",
"integrity": "sha512-tap04CsHYOl0nSAQJfPNIuBxqEPB2HnhQqwaOXLg1jnp2XfRo8Fa814dA4QC4zpvTWXCjAAaCY1W5LOORkEQuQ==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.71.0.tgz",
"integrity": "sha512-cFDaiR8L3430qp88tfZnvFlt3KotFhR/DlbIL0nHOMMYiG/9Wy4l+6f7t8G8pTa9bd8Lt8+M0y/qjRQ/xcB74g==",
"cpu": [
"x64"
],
@@ -8571,9 +8572,9 @@
}
},
"node_modules/@oxlint/binding-linux-x64-musl": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.70.0.tgz",
"integrity": "sha512-hzJa/WgvtJpbBD9rgfy0qe+MjbxOXNUT0bfR1S6EQQzfTtBFA9xg5q8KSwRrQ2QfSS+TaP4j+4mVPQrfNc6UNg==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.71.0.tgz",
"integrity": "sha512-orfixdt76KlpNly9z0PkWBBNfwjKz+JFVLP/7wnVchlKNU9Dpt9InU/ZggeSej6fC7qwHmHNOGlhLnQXcYoGuA==",
"cpu": [
"x64"
],
@@ -8591,9 +8592,9 @@
}
},
"node_modules/@oxlint/binding-openharmony-arm64": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.70.0.tgz",
"integrity": "sha512-xbsaNSNzVSnaJACCUYr1HQMyY/Q/Q1LkePmHG3UvZPvGCYGNxrsZp9OmtA6ick8xH47ltRRbRrPCM1YXYcyC+A==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.71.0.tgz",
"integrity": "sha512-9emQu2lAp6yhPB3XuI+++vR+l/o6JR1X+EpxwcumPdQXBWXEPAsquPGL7l158EqU8SebQMXTUa/S5zN98juyHw==",
"cpu": [
"arm64"
],
@@ -8608,9 +8609,9 @@
}
},
"node_modules/@oxlint/binding-win32-arm64-msvc": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.70.0.tgz",
"integrity": "sha512-icAEsUI7JbW1TMRdEXV83mVAInhRVQYuuAlPpxdGwJ95chNdnCzjloRW8GglT0WvzOEZSio6fnYSk2DJ2Hv7LQ==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.71.0.tgz",
"integrity": "sha512-bd5kI8spYwTm3BILDtGhi73zoup5dw8MlPQNT8YB3BD5UIsjNe3K9/4ctrzQMX4SZMoK5HgzVLkLJzacEXB7fA==",
"cpu": [
"arm64"
],
@@ -8625,9 +8626,9 @@
}
},
"node_modules/@oxlint/binding-win32-ia32-msvc": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.70.0.tgz",
"integrity": "sha512-FHMSWbVsPVs/f+Jcl04ws4JJ2wUnauyTzlpxWRG/lSO/8GpX08Fo2gQZqdA6CrRFI+zvkxl+N/KwJGWfUwYVZA==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.71.0.tgz",
"integrity": "sha512-W4HvOHGzVLHcrmFu+bMrJlho+/yrlX5ZNdJZqGe8MEldkQG+RHYhxxad9P4jvWAYFmIqUA5i9DQ8QsJqSU9GIw==",
"cpu": [
"ia32"
],
@@ -8642,9 +8643,9 @@
}
},
"node_modules/@oxlint/binding-win32-x64-msvc": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.70.0.tgz",
"integrity": "sha512-ptOlKwCz7n4AKs5VweMqG6DAg677FmKOK+vBkkL9DMNgFATIQ+upqUYBTOEwRQyRAx1ncGlPlXleV2hIcm3z4g==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.71.0.tgz",
"integrity": "sha512-D2kyEIPHk/G/wiZLnwTVC/sVst+T/lKldVOjAFpgTIBUAOlry72e5OiapDbDBF4LfJLkN5ypJb/8Eu6yJzkveQ==",
"cpu": [
"x64"
],
@@ -10555,15 +10556,15 @@
}
},
"node_modules/@swc/core": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.41.tgz",
"integrity": "sha512-03nQq/082QRJJiOvp3FGbgxTGyyxMxohPTjhk/W9bD2J0tk4ukITI7goOhOO2WbaHn/lsPmo/zf8+DIXhwpgYQ==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.43.tgz",
"integrity": "sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/counter": "^0.1.3",
"@swc/types": "^0.1.26"
"@swc/types": "^0.1.27"
},
"engines": {
"node": ">=10"
@@ -10573,18 +10574,18 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
"@swc/core-darwin-arm64": "1.15.41",
"@swc/core-darwin-x64": "1.15.41",
"@swc/core-linux-arm-gnueabihf": "1.15.41",
"@swc/core-linux-arm64-gnu": "1.15.41",
"@swc/core-linux-arm64-musl": "1.15.41",
"@swc/core-linux-ppc64-gnu": "1.15.41",
"@swc/core-linux-s390x-gnu": "1.15.41",
"@swc/core-linux-x64-gnu": "1.15.41",
"@swc/core-linux-x64-musl": "1.15.41",
"@swc/core-win32-arm64-msvc": "1.15.41",
"@swc/core-win32-ia32-msvc": "1.15.41",
"@swc/core-win32-x64-msvc": "1.15.41"
"@swc/core-darwin-arm64": "1.15.43",
"@swc/core-darwin-x64": "1.15.43",
"@swc/core-linux-arm-gnueabihf": "1.15.43",
"@swc/core-linux-arm64-gnu": "1.15.43",
"@swc/core-linux-arm64-musl": "1.15.43",
"@swc/core-linux-ppc64-gnu": "1.15.43",
"@swc/core-linux-s390x-gnu": "1.15.43",
"@swc/core-linux-x64-gnu": "1.15.43",
"@swc/core-linux-x64-musl": "1.15.43",
"@swc/core-win32-arm64-msvc": "1.15.43",
"@swc/core-win32-ia32-msvc": "1.15.43",
"@swc/core-win32-x64-msvc": "1.15.43"
},
"peerDependencies": {
"@swc/helpers": ">=0.5.17"
@@ -10596,9 +10597,9 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.41.tgz",
"integrity": "sha512-kREh6J5paQFvP3i7f/4FbqRNOJREutVFVOkder4GVyCBQ39YmER55cW/y1NNjwrchzFqgYswFn0mMDCqbqKzrw==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.43.tgz",
"integrity": "sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA==",
"cpu": [
"arm64"
],
@@ -10612,9 +10613,9 @@
}
},
"node_modules/@swc/core-darwin-x64": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.41.tgz",
"integrity": "sha512-N8B56ESFazZAWZyIkecADSPCwlLEinW7QLMEeotCpv4J7VXwfH+OLkmRL8o96UZ+1355fwHxDTS6/wK7yucvkA==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.43.tgz",
"integrity": "sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ==",
"cpu": [
"x64"
],
@@ -10628,9 +10629,9 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.41.tgz",
"integrity": "sha512-6XrId2fyle0mS5xxON8rU84mPd2Cq1kDJRj+4BnQKTd7u+2kSA6Ww+JkOP0iTNqOqt9OXhPOEAjBHAuonWcdCg==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.43.tgz",
"integrity": "sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA==",
"cpu": [
"arm"
],
@@ -10644,12 +10645,15 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.41.tgz",
"integrity": "sha512-ynLIarxlkVnqHn1D0fKOVht6mNU5ks6lrH+MY3kkS+XFaGGgDxFZVjWKJlkYTKm3RCvBTfA8Ng5fLufXheMRKQ==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.43.tgz",
"integrity": "sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw==",
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -10660,12 +10664,15 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.41.tgz",
"integrity": "sha512-dXu/5vd4gh8symyhRF+4G7gOPkjmb4pONhh7sl+6GSiW0LOKZlfu5kXmyFbTz9smOT7jgr002qY9b1nujjXt2A==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.43.tgz",
"integrity": "sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ==",
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -10676,12 +10683,15 @@
}
},
"node_modules/@swc/core-linux-ppc64-gnu": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.41.tgz",
"integrity": "sha512-XGO6zVPXoPE0gf/XnI4jBbafNT13AYgoh6ns0JCSdOetI/kqVf0vhpz7NuNgAzZrMVCsmieqjPoTwViDgh4mOQ==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.43.tgz",
"integrity": "sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg==",
"cpu": [
"ppc64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -10692,12 +10702,15 @@
}
},
"node_modules/@swc/core-linux-s390x-gnu": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.41.tgz",
"integrity": "sha512-0WUglRwyZtW+iMi7J3iFdrCxreZZIKf4egTwEQfIYRsqFax69A0OrFj+NIoFSE03xBT/IFRrg+S8K6f9Ky+4hA==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.43.tgz",
"integrity": "sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA==",
"cpu": [
"s390x"
],
"libc": [
"glibc"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -10708,12 +10721,15 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.41.tgz",
"integrity": "sha512-VxkuQK59c0tHm6uJZCUrS3cyA2JhGGfdU6e41SZz0x/JS+4Sm7C1mIc97In14vkZJopEt7yXA2TouCqZDSygEA==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.43.tgz",
"integrity": "sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg==",
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -10724,12 +10740,15 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.41.tgz",
"integrity": "sha512-/0qXIu1ZxggLuovLb22vFfKHq2AA4n6Whw5UwmVCHk4pkw7KWnPIQpMCEqUMPsNkFJig7PPp/TSYFu8ZEb2rtQ==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.43.tgz",
"integrity": "sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ==",
"cpu": [
"x64"
],
"libc": [
"musl"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -10740,9 +10759,9 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.41.tgz",
"integrity": "sha512-Y481sMNZM6rECh9VO4+y26N1lWEDAyxnBZskUf37fl90uHE946VHfmiVQWT0uMFOhyJJFovGTRuF4W82dwewUg==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.43.tgz",
"integrity": "sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw==",
"cpu": [
"arm64"
],
@@ -10756,9 +10775,9 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.41.tgz",
"integrity": "sha512-BAchBD5qeUzy3hiPSLJtaaoSm4blCLyYffOF1bGE4ETcV+OisqjUAwDQMJj++4bTpvMCDzwC+Bj3PmQyBCtscw==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.43.tgz",
"integrity": "sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g==",
"cpu": [
"ia32"
],
@@ -10772,9 +10791,9 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
"version": "1.15.41",
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.41.tgz",
"integrity": "sha512-WOkA+fJ/ViVBQDsSV9JC52NACTe5PhlurA6viASDZGb7HR3KS01ZG7RZ+Bg6SVQFIoq3gSbTsskQVe6EbHFAYw==",
"version": "1.15.43",
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.43.tgz",
"integrity": "sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg==",
"cpu": [
"x64"
],
@@ -10813,9 +10832,9 @@
}
},
"node_modules/@swc/plugin-emotion": {
"version": "14.13.0",
"resolved": "https://registry.npmjs.org/@swc/plugin-emotion/-/plugin-emotion-14.13.0.tgz",
"integrity": "sha512-UT1l9tr934HjnktUiMGbw1rWrIXUhAByTB0DwZJwHmS8KWox+wNBIK4ZkJ2tKVU/PnQZRni+R9e6xklFkmgSYg==",
"version": "14.14.0",
"resolved": "https://registry.npmjs.org/@swc/plugin-emotion/-/plugin-emotion-14.14.0.tgz",
"integrity": "sha512-E62+zotGgiF+EIHjyHHgS1cFfLKy/dIuDVMy8S9aucu9qxwObg4qkrZIYjGsW/rIwVU4nnMU72QJRNM3LHBB5g==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -10833,9 +10852,9 @@
}
},
"node_modules/@swc/types": {
"version": "0.1.26",
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz",
"integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==",
"version": "0.1.27",
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.27.tgz",
"integrity": "sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@@ -14736,20 +14755,6 @@
"@babel/core": "^7.0.0"
}
},
"node_modules/babel-plugin-lodash": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz",
"integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.0.0-beta.49",
"@babel/types": "^7.0.0-beta.49",
"glob": "^7.1.1",
"lodash": "^4.17.10",
"require-package-name": "^2.0.1"
}
},
"node_modules/babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@@ -18747,13 +18752,13 @@
}
},
"node_modules/echarts": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
"integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-6.1.0.tgz",
"integrity": "sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "2.3.0",
"zrender": "5.6.1"
"zrender": "6.1.0"
}
},
"node_modules/echarts/node_modules/tslib": {
@@ -31386,9 +31391,9 @@
}
},
"node_modules/nanoid": {
"version": "5.1.14",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.14.tgz",
"integrity": "sha512-5c8l8kVzqpnDPaicbEop/fV0Q1w16FmbWtVhMqugTozAwYdlIQojWH5a/M7UfziFmGdQRrUdV+EPzc9Xng3VAQ==",
"version": "5.1.15",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.15.tgz",
"integrity": "sha512-kBg3RpGtIe+RpTbyXwoI6pk5yD7KUiI3sygUqgeBMRst42KmhB4RZC7eiO9Wa1HIpaCCtpE2DJ6OI4Wi5ebwFw==",
"funding": [
{
"type": "github",
@@ -32885,9 +32890,9 @@
}
},
"node_modules/oxlint": {
"version": "1.70.0",
"resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.70.0.tgz",
"integrity": "sha512-D6JgHtzkhRwvEC+A0Nw5AEc5bk8x5i1pHzvZIEf/a0C4hOzmAACNGtkDGPyFaxxX3ZVGxCPeig3P3rMM8XU3/g==",
"version": "1.71.0",
"resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.71.0.tgz",
"integrity": "sha512-U1m1X+C0vDj7DC1e13IoZULzEcPczE7UOMTs8VlZGHUEIUaSTZKo5qkPsQEfzpgnQ29Pea/w3Xntk62UCecxZw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -32900,25 +32905,25 @@
"url": "https://github.com/sponsors/Boshen"
},
"optionalDependencies": {
"@oxlint/binding-android-arm-eabi": "1.70.0",
"@oxlint/binding-android-arm64": "1.70.0",
"@oxlint/binding-darwin-arm64": "1.70.0",
"@oxlint/binding-darwin-x64": "1.70.0",
"@oxlint/binding-freebsd-x64": "1.70.0",
"@oxlint/binding-linux-arm-gnueabihf": "1.70.0",
"@oxlint/binding-linux-arm-musleabihf": "1.70.0",
"@oxlint/binding-linux-arm64-gnu": "1.70.0",
"@oxlint/binding-linux-arm64-musl": "1.70.0",
"@oxlint/binding-linux-ppc64-gnu": "1.70.0",
"@oxlint/binding-linux-riscv64-gnu": "1.70.0",
"@oxlint/binding-linux-riscv64-musl": "1.70.0",
"@oxlint/binding-linux-s390x-gnu": "1.70.0",
"@oxlint/binding-linux-x64-gnu": "1.70.0",
"@oxlint/binding-linux-x64-musl": "1.70.0",
"@oxlint/binding-openharmony-arm64": "1.70.0",
"@oxlint/binding-win32-arm64-msvc": "1.70.0",
"@oxlint/binding-win32-ia32-msvc": "1.70.0",
"@oxlint/binding-win32-x64-msvc": "1.70.0"
"@oxlint/binding-android-arm-eabi": "1.71.0",
"@oxlint/binding-android-arm64": "1.71.0",
"@oxlint/binding-darwin-arm64": "1.71.0",
"@oxlint/binding-darwin-x64": "1.71.0",
"@oxlint/binding-freebsd-x64": "1.71.0",
"@oxlint/binding-linux-arm-gnueabihf": "1.71.0",
"@oxlint/binding-linux-arm-musleabihf": "1.71.0",
"@oxlint/binding-linux-arm64-gnu": "1.71.0",
"@oxlint/binding-linux-arm64-musl": "1.71.0",
"@oxlint/binding-linux-ppc64-gnu": "1.71.0",
"@oxlint/binding-linux-riscv64-gnu": "1.71.0",
"@oxlint/binding-linux-riscv64-musl": "1.71.0",
"@oxlint/binding-linux-s390x-gnu": "1.71.0",
"@oxlint/binding-linux-x64-gnu": "1.71.0",
"@oxlint/binding-linux-x64-musl": "1.71.0",
"@oxlint/binding-openharmony-arm64": "1.71.0",
"@oxlint/binding-win32-arm64-msvc": "1.71.0",
"@oxlint/binding-win32-ia32-msvc": "1.71.0",
"@oxlint/binding-win32-x64-msvc": "1.71.0"
},
"peerDependencies": {
"oxlint-tsgolint": ">=0.22.1",
@@ -37591,13 +37596,6 @@
"dev": true,
"license": "ISC"
},
"node_modules/require-package-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz",
"integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==",
"dev": true,
"license": "MIT"
},
"node_modules/requireindex": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
@@ -40378,6 +40376,13 @@
"integrity": "sha512-pkJC8uIP/gxDHxNQUBUbjHyl6oZfT+ofn7tbaHW+CFIUjI+Q2MBbHcx1JSBQfhDaTcO9bNg328q0i7Vk5PismQ==",
"license": "MIT"
},
"node_modules/timezone-mock": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/timezone-mock/-/timezone-mock-1.4.3.tgz",
"integrity": "sha512-sO5xj1j5bXgKPgUzbM/t0l2O3hZ2F22cczYRo7Kj2Pm8wfbMMw3ohyAunBBP0Vltkd4X3tF0rFu0WAlGvAClGg==",
"dev": true,
"license": "MIT"
},
"node_modules/tiny-invariant": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
@@ -41674,19 +41679,34 @@
}
},
"node_modules/unzipper": {
"version": "0.12.3",
"resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz",
"integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==",
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz",
"integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"bluebird": "~3.7.2",
"duplexer2": "~0.1.4",
"fs-extra": "^11.2.0",
"fs-extra": "11.3.1",
"graceful-fs": "^4.2.2",
"node-int64": "^0.4.0"
}
},
"node_modules/unzipper/node_modules/fs-extra": {
"version": "11.3.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz",
"integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/upath": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
@@ -41836,9 +41856,9 @@
}
},
"node_modules/uuid": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz",
"integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==",
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz",
"integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -44155,9 +44175,9 @@
}
},
"node_modules/zrender": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
"integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-6.1.0.tgz",
"integrity": "sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==",
"license": "BSD-3-Clause",
"dependencies": {
"tslib": "2.3.0"
@@ -44244,6 +44264,9 @@
"name": "@apache-superset/core",
"version": "0.1.0",
"license": "Apache-2.0",
"dependencies": {
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@babel/cli": "^7.29.7",
"@babel/core": "^7.29.7",
@@ -44286,6 +44309,7 @@
"@apache-superset/core": "*",
"@types/react": "*",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"tinycolor2": "*"
},
"peerDependencies": {
@@ -44333,6 +44357,7 @@
"handlebars": "^4.7.9",
"jed": "^1.1.1",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"math-expression-evaluator": "^2.0.7",
"parse-ms": "^4.0.0",
"re-resizable": "^6.11.2",
@@ -44370,7 +44395,7 @@
"@types/seedrandom": "^3.0.8",
"fetch-mock": "^12.6.0",
"resize-observer-polyfill": "1.5.1",
"timezone-mock": "^1.4.2"
"timezone-mock": "^1.4.3"
},
"peerDependencies": {
"@emotion/cache": "^11.4.0",
@@ -44505,13 +44530,6 @@
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"packages/superset-ui-core/node_modules/timezone-mock": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/timezone-mock/-/timezone-mock-1.4.2.tgz",
"integrity": "sha512-RgPQkSrARNHBnchuFpjrYf97uWgEaseCXK2asSeGcgUzRUO3cBR9Zu0uO1z2Eyi/TQsQtHIvQLi0br30COHWUA==",
"dev": true,
"license": "MIT"
},
"packages/superset-ui-switchboard": {
"name": "@superset-ui/switchboard",
"version": "0.20.3",
@@ -44796,6 +44814,7 @@
"dompurify": "^3.4.11",
"fast-safe-stringify": "^2.1.1",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"nvd3-fork": "^2.0.5",
"prop-types": "^15.8.1",
"urijs": "^1.19.11"
@@ -44818,6 +44837,7 @@
"classnames": "^2.5.1",
"d3-array": "^3.2.4",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"memoize-one": "^6.0.0",
"react-table": "^7.8.0",
"regenerator-runtime": "^0.14.1",
@@ -44856,7 +44876,8 @@
"dependencies": {
"@types/geojson": "^7946.0.16",
"geojson": "^0.5.0",
"lodash": "^4.18.1"
"lodash": "^4.18.1",
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"@ant-design/icons": "^5.6.1",
@@ -44886,6 +44907,7 @@
"acorn": "^8.17.0",
"d3-array": "^3.2.4",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"zod": "^4.4.3"
},
"peerDependencies": {
@@ -44929,7 +44951,8 @@
"dependencies": {
"currencyformatter.js": "^1.0.5",
"handlebars-group-by": "^1.0.1",
"just-handlebars-helpers": "^1.0.19"
"just-handlebars-helpers": "^1.0.19",
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@types/jest": "^30.0.0",
@@ -45010,6 +45033,7 @@
"classnames": "^2.5.1",
"d3-array": "^3.2.4",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"memoize-one": "^6.0.0",
"react-table": "^7.8.0",
"regenerator-runtime": "^0.14.1",
@@ -45049,7 +45073,8 @@
"dependencies": {
"@types/d3-scale": "^4.0.9",
"d3-cloud": "^1.2.9",
"d3-scale": "^4.0.2"
"d3-scale": "^4.0.2",
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@types/d3-cloud": "^1.2.9"
@@ -45098,6 +45123,7 @@
"d3-scale": "^4.0.2",
"handlebars": "^4.7.9",
"lodash": "^4.18.1",
"lodash-es": "^4.17.21",
"maplibre-gl": "^5.24.0",
"mousetrap": "^1.6.5",
"ngeohash": "^0.6.3",
@@ -45167,36 +45193,6 @@
"version": "1.0.0",
"extraneous": true,
"license": "Apache-2.0"
},
"node_modules/jsdom/node_modules/@noble/hashes": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz",
"integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/whatwg-url/node_modules/@noble/hashes": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz",
"integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
}
}
}

View File

@@ -174,7 +174,7 @@
"dayjs": "^1.11.21",
"dom-to-image-more": "^3.10.0",
"dom-to-pdf": "^0.3.2",
"echarts": "^5.6.0",
"echarts": "^6.1.0",
"fast-glob": "^3.3.2",
"fs-extra": "^11.3.5",
"fuse.js": "^7.4.2",
@@ -198,7 +198,7 @@
"memoize-one": "^6.0.0",
"mousetrap": "^1.6.5",
"mustache": "^4.2.0",
"nanoid": "^5.1.14",
"nanoid": "^5.1.15",
"ol": "^10.9.0",
"query-string": "9.4.0",
"re-resizable": "^6.11.2",
@@ -237,9 +237,10 @@
"use-event-callback": "^0.1.0",
"use-immer": "^0.11.0",
"use-query-params": "^2.2.2",
"uuid": "^14.0.0",
"uuid": "^14.0.1",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
"yargs": "^18.0.0"
"yargs": "^18.0.0",
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@babel/cli": "^7.29.7",
@@ -269,8 +270,8 @@
"@storybook/react-webpack5": "10.4.4",
"@storybook/test-runner": "0.24.4",
"@svgr/webpack": "^8.1.0",
"@swc/core": "^1.15.41",
"@swc/plugin-emotion": "^14.13.0",
"@swc/core": "^1.15.43",
"@swc/plugin-emotion": "^14.14.0",
"@swc/plugin-transform-imports": "^12.5.0",
"@testing-library/dom": "^9.3.4",
"@testing-library/jest-dom": "^6.9.1",
@@ -302,7 +303,6 @@
"babel-loader": "^10.1.1",
"babel-plugin-dynamic-import-node": "^2.3.3",
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
"babel-plugin-lodash": "^3.3.4",
"baseline-browser-mapping": "^2.10.38",
"cheerio": "1.2.0",
"concurrently": "^10.0.3",
@@ -343,7 +343,7 @@
"lightningcss": "^1.32.0",
"mini-css-extract-plugin": "^2.10.2",
"open-cli": "^9.0.0",
"oxlint": "^1.70.0",
"oxlint": "^1.71.0",
"po2json": "^0.4.5",
"prettier": "3.8.4",
"prettier-plugin-packagejson": "^3.0.2",
@@ -363,7 +363,7 @@
"tscw-config": "^1.1.2",
"tsx": "^4.22.4",
"typescript": "5.4.5",
"unzipper": "^0.12.3",
"unzipper": "^0.12.5",
"vm-browserify": "^1.1.2",
"wait-on": "^9.0.10",
"webpack": "^5.107.2",
@@ -372,7 +372,8 @@
"webpack-dev-server": "^5.2.5",
"webpack-manifest-plugin": "^6.0.1",
"webpack-sources": "^3.5.0",
"webpack-visualizer-plugin2": "^2.0.0"
"webpack-visualizer-plugin2": "^2.0.0",
"@types/lodash-es": "^4.17.12"
},
"peerDependencies": {
"ace-builds": "^1.41.0",

View File

@@ -120,5 +120,8 @@
},
"publishConfig": {
"access": "public"
},
"dependencies": {
"lodash-es": "^4.17.21"
}
}

View File

@@ -25,7 +25,7 @@ import {
CacheProvider as EmotionCacheProvider,
} from '@emotion/react';
import createCache from '@emotion/cache';
import { noop, mergeWith } from 'lodash';
import { noop, mergeWith } from 'lodash-es';
import { GlobalStyles } from './GlobalStyles';
import {
AntdThemeConfig,

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { isEmpty, isNaN, isNil, isString, trim } from 'lodash';
import { isEmpty, isNaN, isNil, isString, trim } from 'lodash-es';
/**
* Checks if a value is null, undefined, NaN, or a whitespace-only string.

View File

@@ -27,7 +27,8 @@
"@apache-superset/core": "*",
"@types/react": "*",
"lodash": "^4.18.1",
"tinycolor2": "*"
"tinycolor2": "*",
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"@ant-design/icons": "^5.6.1",

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { kebabCase } from 'lodash';
import { kebabCase } from 'lodash-es';
import { t } from '@apache-superset/core/translation';
import { useTheme, styled } from '@apache-superset/core/theme';
import { Tooltip } from '@superset-ui/core/components';

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitationsxw
* under the License.
*/
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import {
ensureIsArray,
getMetricLabel,

View File

@@ -32,7 +32,7 @@
* here's a list of the keys that are common to all controls, and as a result define the
* control interface.
*/
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import { t } from '@apache-superset/core/translation';
import {
getCategoricalSchemeRegistry,

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import memoizeOne from 'memoize-one';
import { isString, isBoolean } from 'lodash';
import { isString, isBoolean } from 'lodash-es';
import { isBlank } from '@apache-superset/core/utils';
import { addAlpha, DataRecord } from '@superset-ui/core';
import tinycolor from 'tinycolor2';

View File

@@ -18,7 +18,7 @@
*/
import { histogramOperator } from '@superset-ui/chart-controls';
import { SqlaFormData, VizType } from '@superset-ui/core';
import { omit } from 'lodash';
import { omit } from 'lodash-es';
const formData: SqlaFormData = {
bins: 5,

View File

@@ -66,7 +66,8 @@
"reselect": "^5.2.0",
"rison": "^0.1.1",
"seedrandom": "^3.0.5",
"xss": "^1.0.15"
"xss": "^1.0.15",
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@emotion/styled": "^11.14.1",
@@ -85,7 +86,7 @@
"@types/seedrandom": "^3.0.8",
"fetch-mock": "^12.6.0",
"resize-observer-polyfill": "1.5.1",
"timezone-mock": "^1.4.2"
"timezone-mock": "^1.4.3"
},
"peerDependencies": {
"@emotion/cache": "^11.4.0",

View File

@@ -28,6 +28,7 @@ import {
RequestConfig,
getClientErrorObject,
} from '../..';
import type { HandlerFunction } from '../types/Base';
import { Loading } from '../../components/Loading';
import ChartClient from '../clients/ChartClient';
import getChartBuildQueryRegistry from '../registries/ChartBuildQueryRegistrySingleton';
@@ -482,7 +483,7 @@ export default function StatefulChart(props: StatefulChartProps) {
enableNoResults={enableNoResults}
noResults={NoDataComponent && <NoDataComponent />}
onRenderSuccess={onRenderSuccess}
onRenderFailure={onRenderFailure}
onRenderFailure={onRenderFailure as HandlerFunction | undefined}
hooks={hooks}
/>
);

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { cloneDeep } from 'lodash';
import { cloneDeep } from 'lodash-es';
import CategoricalColorScale from './CategoricalColorScale';
import { ColorsLookup } from './types';
import getCategoricalSchemeRegistry from './CategoricalSchemeRegistrySingleton';

View File

@@ -41,6 +41,7 @@ export const ActionButton = ({
<span
role="button"
tabIndex={0}
aria-label={typeof tooltip === 'string' ? tooltip : label}
css={css`
cursor: pointer;
color: ${theme.colorIcon};

View File

@@ -16,7 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
import React, { useEffect, useState, forwardRef, ComponentType } from 'react';
import React, {
useEffect,
useState,
forwardRef,
ComponentType,
ForwardedRef,
} from 'react';
import { Loading } from '../Loading';
import type { PlaceholderProps } from './types';
@@ -93,7 +99,7 @@ export function AsyncEsmComponent<
// @ts-expect-error -- generic forwardRef has PropsWithoutRef incompatibility with FullProps
const AsyncComponent: AsyncComponent = forwardRef(function AsyncComponent(
props: FullProps,
ref,
ref: ForwardedRef<ComponentType<FullProps>>,
) {
const [loaded, setLoaded] = useState(component !== undefined);
useEffect(() => {

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { Dropdown } from 'antd';
import { kebabCase } from 'lodash';
import { kebabCase } from 'lodash-es';
import { css, useTheme } from '@apache-superset/core/theme';
import { Tooltip } from '../Tooltip';
import type { DropdownButtonProps } from './types';

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { useRef, useCallback, useState } from 'react';
import { isEqual } from 'lodash';
import { isEqual } from 'lodash-es';
import { css } from '@apache-superset/core/theme';
import { Button } from '../Button';
import { Select } from '../Select';

View File

@@ -19,7 +19,7 @@
import {
cloneElement,
forwardRef,
RefObject,
ForwardedRef,
useEffect,
useImperativeHandle,
useLayoutEffect,
@@ -54,7 +54,7 @@ export const DropdownContainer = forwardRef(
forceRender,
style,
}: DropdownContainerProps,
outerRef: RefObject<DropdownRef>,
outerRef: ForwardedRef<DropdownRef>,
) => {
const theme = useTheme();
const { ref, width = 0 } = useResizeDetector<HTMLDivElement>();

View File

@@ -331,12 +331,21 @@ export const antdEnhancedIcons: Record<
.reduce(
(acc, key) => {
acc[key as AntdIconNames] = forwardRef<HTMLSpanElement, IconType>(
(props, ref) => (
(
{
// Forward-compat: TS 6.0 treats IconComponentProps.component as a
// different shape than BaseIconProps.component; strip it from spread
// props so our own component binding is authoritative.
component: _ignoredComponent,
...rest
},
ref,
) => (
<BaseIconComponent
ref={ref}
component={AntdIcons[key as AntdIconNames]}
fileName={key}
{...props}
{...rest}
/>
),
);

View File

@@ -18,7 +18,7 @@
*/
import { KeyboardEvent, useMemo } from 'react';
import { SerializedStyles, CSSObject } from '@emotion/react';
import { kebabCase } from 'lodash';
import { kebabCase } from 'lodash-es';
import { t } from '@apache-superset/core/translation';
import { css, useTheme, getFontSize } from '@apache-superset/core/theme';
import {

View File

@@ -18,7 +18,7 @@
*/
import { useCallback, useEffect, useRef, useState } from 'react';
import { useResizeDetector } from 'react-resize-detector';
import { uniqWith } from 'lodash';
import { uniqWith } from 'lodash-es';
import { styled } from '@apache-superset/core/theme';
import { Tooltip } from '../Tooltip';
import { TooltipPlacement } from '../Tooltip/types';

View File

@@ -24,7 +24,7 @@ import {
useState,
type ComponentType,
} from 'react';
import { isNil } from 'lodash';
import { isNil } from 'lodash-es';
import { t } from '@apache-superset/core/translation';
import { css, styled, useTheme } from '@apache-superset/core/theme';
import { Modal as AntdModal, ModalProps as AntdModalProps } from 'antd';

View File

@@ -16,7 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
import { forwardRef, useState, ReactNode, MouseEvent } from 'react';
import {
forwardRef,
ForwardedRef,
useState,
ReactNode,
MouseEvent,
} from 'react';
import { Button } from '../Button';
import { Modal } from '../Modal';
@@ -54,7 +60,7 @@ export interface ModalTriggerRef {
}
export const ModalTrigger = forwardRef(
(props: ModalTriggerProps, ref: ModalTriggerRef | null) => {
(props: ModalTriggerProps, ref: ForwardedRef<ModalTriggerRef['current']>) => {
const [showModal, setShowModal] = useState(false);
const {
beforeOpen = () => {},
@@ -87,8 +93,14 @@ export const ModalTrigger = forwardRef(
setShowModal(true);
};
if (ref) {
ref.current = { close, open, showModal }; // eslint-disable-line
// Forward both callback refs (e.g. `(value) => setRef(value)`) and
// object refs. Without the callback-ref branch, parents that pass a
// function ref get silently no-op'd and can't call close/open/showModal.
const refValue = { close, open, showModal };
if (typeof ref === 'function') {
ref(refValue);
} else if (ref) {
ref.current = refValue; // eslint-disable-line
}
/* eslint-disable jsx-a11y/interactive-supports-focus */

View File

@@ -22,7 +22,7 @@ import rehypeSanitize, { defaultSchema } from 'rehype-sanitize';
// remark-gfm v4+ requires react-markdown v9+, which requires React 18.
// Currently pinned to v3.0.1 for compatibility with react-markdown v8 and React 17.
import remarkGfm from 'remark-gfm';
import { cloneDeep, mergeWith } from 'lodash';
import { cloneDeep, mergeWith } from 'lodash-es';
import { FeatureFlag, isFeatureEnabled } from '../../utils';
interface SafeMarkdownProps {

View File

@@ -18,6 +18,7 @@
*/
import {
forwardRef,
ForwardedRef,
FocusEvent,
ReactElement,
RefObject,
@@ -38,10 +39,12 @@ import {
getClientErrorObject,
} from '@superset-ui/core';
import {
BaseOptionType,
DefaultOptionType,
LabeledValue as AntdLabeledValue,
RefSelectProps,
} from 'antd/es/select';
import { debounce, isEqual, uniq } from 'lodash';
import { debounce, isEqual, uniq } from 'lodash-es';
import { Constants, Icons } from '@superset-ui/core/components';
import { Space } from '../Space';
import {
@@ -146,7 +149,7 @@ const AsyncSelect = forwardRef(
maxTagCount: propsMaxTagCount,
...props
}: AsyncSelectProps,
ref: RefObject<AsyncSelectRef>,
ref: ForwardedRef<AsyncSelectRef>,
) => {
const isSingleMode = mode === 'single';
const [selectValue, setSelectValue] = useState(value);
@@ -324,7 +327,14 @@ const AsyncSelect = forwardRef(
mergedData = prevOptions
.filter(previousOption => !dataValues.has(previousOption.value))
.concat(data)
.sort(sortComparatorForNoSearch);
// Forward-compat: TS 6.0 infers stricter antd option types; widen
// the comparator to accept the broader DefaultOptionType shape.
.sort(
sortComparatorForNoSearch as unknown as (
a: BaseOptionType | DefaultOptionType,
b: BaseOptionType | DefaultOptionType,
) => number,
);
return mergedData;
});
}
@@ -509,7 +519,13 @@ const AsyncSelect = forwardRef(
if (isDropdownVisible && !inputValue && selectOptions.length > 1) {
const sortedOptions = selectOptions
.slice()
.sort(sortComparatorForNoSearch);
// Forward-compat: see note in mergeData above.
.sort(
sortComparatorForNoSearch as unknown as (
a: BaseOptionType | DefaultOptionType,
b: BaseOptionType | DefaultOptionType,
) => number,
);
if (!isEqual(sortedOptions, selectOptions)) {
setSelectOptions(sortedOptions);
}
@@ -632,14 +648,16 @@ const AsyncSelect = forwardRef(
setAllValuesLoaded(false);
};
useImperativeHandle(
ref,
() => ({
...(ref.current as RefSelectProps),
useImperativeHandle(ref, () => {
const current =
ref && typeof ref !== 'function' && ref.current
? (ref.current as RefSelectProps)
: ({} as RefSelectProps);
return {
...current,
clearCache,
}),
[ref],
);
};
}, [ref]);
const getPastedTextValue = useCallback(
async (text: string) => {
@@ -705,8 +723,21 @@ const AsyncSelect = forwardRef(
data-test={ariaLabel || name}
autoClearSearchValue={autoClearSearchValue}
popupRender={popupRender}
filterOption={handleFilterOption}
filterSort={sortComparatorWithSearch}
// Forward-compat: TS 6.0 infers stricter antd option types; local
// helpers typed against AntdLabeledValue are behaviorally compatible
// with the broader BaseOptionType/DefaultOptionType antd expects.
filterOption={
handleFilterOption as unknown as (
search: string,
option?: BaseOptionType | DefaultOptionType,
) => boolean
}
filterSort={
sortComparatorWithSearch as unknown as (
a: BaseOptionType | DefaultOptionType,
b: BaseOptionType | DefaultOptionType,
) => number
}
getPopupContainer={
getPopupContainer || (triggerNode => triggerNode.parentNode)
}
@@ -716,13 +747,26 @@ const AsyncSelect = forwardRef(
mode={mappedMode}
notFoundContent={isLoading ? t('Loading...') : notFoundContent}
onBlur={handleOnBlur}
onDeselect={handleOnDeselect}
// Forward-compat: TS 6.0 narrows the Select value type handed to
// SelectHandler; our local handlers already accept the broader union.
onDeselect={
handleOnDeselect as unknown as (
value: unknown,
option: BaseOptionType | DefaultOptionType,
) => void
}
onOpenChange={handleOnDropdownVisibleChange}
// @ts-expect-error
// @ts-expect-error antd Select does not declare onPaste on its prop
// surface, but the underlying input accepts it and we rely on that.
onPaste={onPaste}
onPopupScroll={handlePagination}
onSearch={showSearch ? handleOnSearch : undefined}
onSelect={handleOnSelect}
onSelect={
handleOnSelect as unknown as (
value: unknown,
option: BaseOptionType | DefaultOptionType,
) => void
}
onClear={handleClear}
options={fullSelectOptions}
optionRender={option => <Space>{option.label || option.value}</Space>}

View File

@@ -34,10 +34,12 @@ import { t } from '@apache-superset/core/translation';
import { ensureIsArray, formatNumber, usePrevious } from '@superset-ui/core';
import { Constants } from '@superset-ui/core/components';
import {
BaseOptionType,
DefaultOptionType,
LabeledValue as AntdLabeledValue,
RefSelectProps,
} from 'antd/es/select';
import { debounce, isEqual, uniq } from 'lodash';
import { debounce, isEqual, uniq } from 'lodash-es';
import {
dropDownRenderHelper,
getOption,
@@ -212,7 +214,17 @@ const Select = forwardRef(
);
const initialOptionsSorted = useMemo(
() => initialOptions.slice().sort(sortSelectedFirst),
() =>
initialOptions
.slice()
// Forward-compat: TS 6.0 infers stricter antd option types; widen the
// comparator to accept the broader DefaultOptionType shape.
.sort(
sortSelectedFirst as unknown as (
a: BaseOptionType | DefaultOptionType,
b: BaseOptionType | DefaultOptionType,
) => number,
),
[initialOptions, sortSelectedFirst],
);
@@ -240,7 +252,17 @@ const Select = forwardRef(
missingValues.length > 0
? missingValues.concat(selectOptions)
: selectOptions;
return result.slice().sort(sortSelectedFirst);
return (
result
.slice()
// Forward-compat: see note on initialOptionsSorted.
.sort(
sortSelectedFirst as unknown as (
a: BaseOptionType | DefaultOptionType,
b: BaseOptionType | DefaultOptionType,
) => number,
)
);
}, [selectOptions, selectValue, sortSelectedFirst]);
const enabledOptions = useMemo(
@@ -773,8 +795,21 @@ const Select = forwardRef(
data-test={ariaLabel || name}
autoClearSearchValue={autoClearSearchValue}
popupRender={popupRender}
filterOption={handleFilterOption}
filterSort={sortComparatorWithSearch}
// Forward-compat: TS 6.0 infers stricter antd option types; local
// helpers typed against AntdLabeledValue are behaviorally compatible
// with the broader BaseOptionType/DefaultOptionType antd expects.
filterOption={
handleFilterOption as unknown as (
search: string,
option?: BaseOptionType | DefaultOptionType,
) => boolean
}
filterSort={
sortComparatorWithSearch as unknown as (
a: BaseOptionType | DefaultOptionType,
b: BaseOptionType | DefaultOptionType,
) => number
}
getPopupContainer={
getPopupContainer || (triggerNode => triggerNode.parentNode)
}
@@ -785,13 +820,26 @@ const Select = forwardRef(
mode={mappedMode}
notFoundContent={isLoading ? t('Loading...') : notFoundContent}
onBlur={handleOnBlur}
onDeselect={handleOnDeselect}
// Forward-compat: TS 6.0 narrows the Select value type handed to
// SelectHandler; our local handlers already accept the broader union.
onDeselect={
handleOnDeselect as unknown as (
value: unknown,
option: BaseOptionType | DefaultOptionType,
) => void
}
onOpenChange={handleOnDropdownVisibleChange}
// @ts-expect-error
// @ts-expect-error antd Select does not declare onPaste on its prop
// surface, but the underlying input accepts it and we rely on that.
onPaste={onPaste}
onPopupScroll={undefined}
onSearch={shouldShowSearch ? handleOnSearch : undefined}
onSelect={handleOnSelect}
onSelect={
handleOnSelect as unknown as (
value: unknown,
option: BaseOptionType | DefaultOptionType,
) => void
}
onClear={handleClear}
placeholder={placeholder}
tokenSeparators={tokenSeparators}

View File

@@ -84,8 +84,8 @@ const VirtualTable = <RecordType extends object>(
allowHTML = false,
} = props;
const [tableWidth, setTableWidth] = useState<number>(0);
const onResize = useCallback((width: number) => {
setTableWidth(width);
const onResize = useCallback((width?: number) => {
setTableWidth(width ?? 0);
}, []);
const { ref } = useResizeDetector({ onResize });
const theme = useTheme();

View File

@@ -29,7 +29,7 @@ interface IInteractiveColumn extends HTMLElement {
export default class InteractiveTableUtils {
tableRef: HTMLTableElement | null;
columnRef: IInteractiveColumn | null;
columnRef: IInteractiveColumn | null = null;
setDerivedColumns: Function;

View File

@@ -27,7 +27,12 @@ import {
} from 'react-table';
import { styled } from '@apache-superset/core/theme';
import { Table, TableSize } from '@superset-ui/core/components/Table';
import { TableRowSelection, SorterResult } from 'antd/es/table/interface';
import {
ColumnsType,
TableRowSelection,
SorterResult,
} from 'antd/es/table/interface';
import type { TableProps } from 'antd/es/table';
import { mapColumns, mapRows } from './utils';
export interface TableCollectionProps<T extends object> {
@@ -303,7 +308,10 @@ function TableCollection<T extends object>({
<StyledTable
loading={loading}
sticky={sticky ?? false}
columns={mappedColumns}
// Forward-compat: TS 6.0 tightens antd Table's generic inference so our
// typed-against-react-table mapped columns must be widened to the antd
// ColumnsType<object> surface the Table expects here.
columns={mappedColumns as unknown as ColumnsType<object>}
data={mappedRows}
size={size}
data-test="listview-table"
@@ -316,7 +324,9 @@ function TableCollection<T extends object>({
sortDirections={['ascend', 'descend', 'ascend']}
isPaginationSticky={isPaginationSticky}
showRowCount={showRowCount}
rowClassName={getRowClassName}
rowClassName={
getRowClassName as unknown as TableProps<object>['rowClassName']
}
expandable={expandable}
components={{
header: {
@@ -342,7 +352,7 @@ function TableCollection<T extends object>({
),
},
}}
onChange={handleTableChange}
onChange={handleTableChange as unknown as TableProps<object>['onChange']}
/>
);
}

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { memo, useEffect, useRef, useMemo, useCallback, useState } from 'react';
import { isEqual } from 'lodash';
import { isEqual } from 'lodash-es';
import { styled } from '@apache-superset/core/theme';
import { useFilters, useSortBy, useTable } from 'react-table';
import { Empty } from '@superset-ui/core/components';

View File

@@ -20,6 +20,7 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { t } from '@apache-superset/core/translation';
import { Select } from '@superset-ui/core/components';
import type { LabeledValue } from '@superset-ui/core/components';
import { extendedDayjs } from '../../utils/dates';
import {
timezoneOptionsCache,
@@ -156,7 +157,16 @@ export default function TimezoneSelector({
onOpenChange={handleOpenChange}
value={selectValue}
options={timezoneOptions || []}
sortComparator={sortComparator}
// Forward-compat: TS 6.0 resolves sortComparator against antd's
// LabeledValue; our comparator only reads properties that always exist
// on TimezoneOption, so the broader shape is safe at runtime.
sortComparator={
sortComparator as unknown as (
a: LabeledValue,
b: LabeledValue,
search?: string,
) => number
}
loading={isLoadingOptions}
placeholder={isLoadingOptions ? t('Loading timezones...') : placeholder}
{...{ placement: 'topLeft', ...rest }}

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import _JSONbig from 'json-bigint';
import { cloneDeepWith } from 'lodash';
import { cloneDeepWith } from 'lodash-es';
import { ParseMethod, TextResponse, JsonResponse } from '../types';

View File

@@ -26,10 +26,18 @@ export type FetchRetryOptions = {
retries?: number;
retryDelay?:
| number
| ((attempt: number, error: Error, response: Response) => number);
| ((
attempt: number,
error: Error | null,
response: Response | null,
) => number);
retryOn?:
| number[]
| ((attempt: number, error: Error, response: Response) => boolean);
| ((
attempt: number,
error: Error | null,
response: Response | null,
) => boolean);
};
export type Headers = { [k: string]: string };
export type Host = string;

View File

@@ -26,6 +26,11 @@ import NumberFormats from '../number-format/NumberFormats';
import { Currency } from '../query';
import { RowData, RowDataValue } from './types';
import { AUTO_CURRENCY_SYMBOL, ISO_4217_REGEX } from './CurrencyFormats';
import { getCurrencyLocale } from './currencyLocale';
import {
resolveSymbolPosition,
formatWithSymbolPosition,
} from './symbolPosition';
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
@@ -90,7 +95,7 @@ class CurrencyFormatter extends ExtensibleFunction {
);
this.d3Format = config.d3Format || NumberFormats.SMART_NUMBER;
this.currency = config.currency;
this.locale = config.locale || 'en-US';
this.locale = config.locale || getCurrencyLocale();
}
hasValidCurrency() {
@@ -128,13 +133,16 @@ class CurrencyFormatter extends ExtensibleFunction {
try {
const symbol = getCurrencySymbol({ symbol: normalizedCurrency });
if (symbol) {
if (this.currency.symbolPosition === 'prefix') {
return `${symbol} ${normalizedValue}`;
} else if (this.currency.symbolPosition === 'suffix') {
return `${normalizedValue} ${symbol}`;
}
// Unknown symbolPosition - default to suffix
return `${normalizedValue} ${symbol}`;
const position = resolveSymbolPosition(
normalizedCurrency,
this.currency.symbolPosition,
this.locale,
);
return formatWithSymbolPosition(
symbol,
normalizedValue,
position,
);
}
} catch {
// Invalid currency code - return value without currency symbol
@@ -147,13 +155,15 @@ class CurrencyFormatter extends ExtensibleFunction {
try {
const symbol = getCurrencySymbol(this.currency);
if (this.currency.symbolPosition === 'prefix') {
return `${symbol} ${normalizedValue}`;
} else if (this.currency.symbolPosition === 'suffix') {
return `${normalizedValue} ${symbol}`;
if (!symbol) {
return formattedValue;
}
// Unknown symbolPosition - default to suffix
return `${normalizedValue} ${symbol}`;
const position = resolveSymbolPosition(
this.currency.symbol,
this.currency.symbolPosition,
this.locale,
);
return formatWithSymbolPosition(symbol, normalizedValue, position);
} catch {
// Invalid currency code - return value without currency symbol
return formattedValue;

View File

@@ -0,0 +1,52 @@
/**
* 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.
*/
const DEFAULT_CURRENCY_LOCALE = 'en-US';
let currencyLocale: string = DEFAULT_CURRENCY_LOCALE;
/**
* Set the locale used to resolve the default currency symbol position.
*
* Called once at application bootstrap with the deployment locale so that
* currency formatting follows the conventions of that locale (e.g. EUR is a
* suffix in `fr-FR`/`de-DE` but a prefix in `en-US`).
*
* Superset's bootstrap locale can be underscore-formatted (e.g. `zh_TW`,
* `pt_BR`), but `Intl.NumberFormat` expects BCP-47 tags with hyphens. The
* value is canonicalized before storing so symbol resolution does not throw
* and silently fall back. Empty or invalid tags leave the locale unchanged.
*/
export function setCurrencyLocale(locale?: string): void {
if (!locale) {
return;
}
try {
// getCanonicalLocales throws on a malformed tag and otherwise returns a
// non-empty list, so the first entry is always a valid canonical tag here.
[currencyLocale] = Intl.getCanonicalLocales(locale.replace(/_/g, '-'));
} catch {
// Invalid locale tag — keep the previously configured locale.
}
}
/** Get the locale used to resolve the default currency symbol position. */
export function getCurrencyLocale(): string {
return currencyLocale;
}

View File

@@ -24,5 +24,11 @@ export {
hasMixedCurrencies,
} from './CurrencyFormatter';
export { AUTO_CURRENCY_SYMBOL, ISO_4217_REGEX } from './CurrencyFormats';
export { getCurrencyLocale, setCurrencyLocale } from './currencyLocale';
export {
resolveSymbolPosition,
formatWithSymbolPosition,
type SymbolPosition,
} from './symbolPosition';
export * from './types';
export * from './utils';

View File

@@ -0,0 +1,93 @@
/**
* 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 { getCurrencyLocale } from './currencyLocale';
export type SymbolPosition = 'prefix' | 'suffix';
const NUMERIC_PART_TYPES = new Set<Intl.NumberFormatPartTypes>([
'integer',
'group',
'decimal',
'fraction',
]);
/**
* Memoize resolved positions by `(locale, currencyCode)`. `format` runs on a
* hot per-value path (every currency cell of every chart), so avoid rebuilding
* an `Intl.NumberFormat` and re-parsing the locale for repeated values.
*/
const positionCache = new Map<string, SymbolPosition>();
/**
* Resolve where the currency symbol should be placed relative to the value.
*
* An explicit `prefix`/`suffix` is always honored. When the position is unset,
* it is derived from the locale's own convention for that currency via
* `Intl.NumberFormat` (e.g. `$1` in `en-US` is a prefix, `1 €` in `fr-FR` is a
* suffix). Unknown currency codes fall back to `prefix`, the most common
* convention worldwide.
*/
export function resolveSymbolPosition(
currencyCode: string | undefined,
symbolPosition?: string,
locale: string = getCurrencyLocale(),
): SymbolPosition {
if (symbolPosition === 'prefix' || symbolPosition === 'suffix') {
return symbolPosition;
}
if (currencyCode) {
const cacheKey = `${locale}|${currencyCode}`;
const cached = positionCache.get(cacheKey);
if (cached) {
return cached;
}
try {
const parts = new Intl.NumberFormat(locale, {
style: 'currency',
currency: currencyCode,
}).formatToParts(1);
const currencyIndex = parts.findIndex(part => part.type === 'currency');
const valueIndex = parts.findIndex(part =>
NUMERIC_PART_TYPES.has(part.type),
);
if (currencyIndex !== -1 && valueIndex !== -1) {
const position = currencyIndex < valueIndex ? 'prefix' : 'suffix';
positionCache.set(cacheKey, position);
return position;
}
} catch {
// Unknown currency or locale — fall back to the default below.
}
}
return 'prefix';
}
/**
* Combine a symbol and a formatted value according to the resolved position.
*/
export function formatWithSymbolPosition(
symbol: string,
value: string,
position: SymbolPosition,
): string {
return position === 'prefix' ? `${symbol} ${value}` : `${value} ${symbol}`;
}

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import { QueryObject } from './types';

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { omit } from 'lodash';
import { omit } from 'lodash-es';
import {
AdhocColumn,

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import rison from 'rison';
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import {
SupersetClient,
getClientErrorObject,
@@ -103,10 +103,16 @@ export const fetchTimeRange = async (
),
),
};
} catch (response) {
} catch (caught) {
// Forward-compat: TS 6.0 types caught values as `unknown`; cast to the
// shape getClientErrorObject accepts and narrow for statusText access.
const response = caught as Parameters<typeof getClientErrorObject>[0];
const clientError = await getClientErrorObject(response);
return {
error: clientError.message || clientError.error || response.statusText,
error:
clientError.message ||
clientError.error ||
(response as { statusText?: string }).statusText,
};
}
};

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import { ensureIsArray } from '../utils';
import { customTimeRangeDecode } from './customTimeRangeDecode';

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { camelCase, isPlainObject, mapKeys } from 'lodash';
import { camelCase, isPlainObject, mapKeys } from 'lodash-es';
export default function convertKeysToCamelCase<T>(object: T) {
if (object === null || object === undefined) {

View File

@@ -55,7 +55,12 @@ class LRUCache<T> {
throw new TypeError('The LRUCache key must be string.');
}
if (this.cache.size >= this.capacity) {
this.cache.delete(this.cache.keys().next().value);
// Forward-compat: TS 6.0 types IteratorResult.value as `string | undefined`
// when not explicitly checked; guard before passing to Map#delete.
const oldestKey = this.cache.keys().next().value;
if (oldestKey !== undefined) {
this.cache.delete(oldestKey);
}
}
this.cache.set(key, value);
}

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { mergeWith } from 'lodash';
import { mergeWith } from 'lodash-es';
/**
* Merges objects using lodash.mergeWith, but replaces arrays instead of concatenating them.

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { render } from '@testing-library/react';
import { cloneDeep } from 'lodash';
import { cloneDeep } from 'lodash-es';
import { defaultSchema } from 'rehype-sanitize';
import {
getOverrideHtmlSchema,

View File

@@ -21,8 +21,14 @@ import {
CurrencyFormatter,
getCurrencySymbol,
NumberFormats,
setCurrencyLocale,
} from '@superset-ui/core';
afterEach(() => {
// Guard against any test mutating the shared currency locale singleton.
setCurrencyLocale('en-US');
});
test('getCurrencySymbol', () => {
expect(
getCurrencySymbol({ symbol: 'PLN', symbolPosition: 'prefix' }),
@@ -132,7 +138,9 @@ test('CurrencyFormatter:format', () => {
// @ts-expect-error
currency: { symbol: 'USD' },
});
expect(currencyFormatterWithoutPosition(VALUE)).toEqual('56.1M $');
// With no explicit position, placement follows the locale convention.
// USD is a prefix in the default en-US locale.
expect(currencyFormatterWithoutPosition(VALUE)).toEqual('$ 56.1M');
// @ts-expect-error
const currencyFormatterWithoutCurrency = new CurrencyFormatter({});
@@ -200,17 +208,29 @@ test('CurrencyFormatter AUTO mode uses suffix position from row context', () =>
expect(result).toMatch(/1,000\.00.*€/);
});
test('CurrencyFormatter AUTO mode uses default suffix when symbolPosition is unknown', () => {
const formatter = new CurrencyFormatter({
test('CurrencyFormatter AUTO mode resolves position from locale when symbolPosition is unset', () => {
// Default en-US locale: EUR symbol is a prefix.
const enFormatter = new CurrencyFormatter({
// @ts-expect-error
currency: { symbol: 'AUTO' },
d3Format: ',.2f',
});
const row = { currency: 'EUR' };
const result = formatter.format(1000, row, 'currency');
expect(result).toContain('€');
expect(result).toMatch(/1,000\.00.*€/);
const enResult = enFormatter.format(1000, row, 'currency');
expect(enResult).toContain('€');
expect(enResult).toMatch(/€.*1,000\.00/);
// fr-FR locale: EUR symbol is a suffix.
const frFormatter = new CurrencyFormatter({
// @ts-expect-error
currency: { symbol: 'AUTO' },
d3Format: ',.2f',
locale: 'fr-FR',
});
const frResult = frFormatter.format(1000, row, 'currency');
expect(frResult).toContain('€');
expect(frResult).toMatch(/1,000\.00.*€/);
});
test('CurrencyFormatter AUTO mode returns plain value when row currency is not a string (line 52)', () => {
@@ -265,3 +285,23 @@ test('CurrencyFormatter AUTO mode falls back to plain value when getCurrencySymb
expect(result).toBe('1,000.00');
});
test('CurrencyFormatter static mode returns plain value when getCurrencySymbol returns undefined', () => {
const formatter = new CurrencyFormatter({
currency: { symbol: 'USD', symbolPosition: 'prefix' },
d3Format: ',.2f',
});
const OrigNumberFormat = Intl.NumberFormat;
// formatToParts without a 'currency' entry → getCurrencySymbol returns
// undefined, exercising the `if (!symbol)` guard in the static branch.
Intl.NumberFormat = jest.fn().mockImplementation(() => ({
formatToParts: () => [{ type: 'integer', value: '1' }],
})) as unknown as typeof Intl.NumberFormat;
const result = formatter.format(1000);
Intl.NumberFormat = OrigNumberFormat;
expect(result).toBe('1,000.00');
});

View File

@@ -0,0 +1,65 @@
/*
* 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 {
getCurrencyLocale,
setCurrencyLocale,
resolveSymbolPosition,
} from '@superset-ui/core';
afterEach(() => {
// Restore the default so other tests are not affected by the global locale.
setCurrencyLocale('en-US');
});
test('currency locale defaults to en-US', () => {
expect(getCurrencyLocale()).toEqual('en-US');
});
test('setCurrencyLocale updates the locale used to resolve unset positions', () => {
setCurrencyLocale('fr-FR');
expect(getCurrencyLocale()).toEqual('fr-FR');
// EUR is a suffix in fr-FR.
expect(resolveSymbolPosition('EUR')).toEqual('suffix');
});
test('setCurrencyLocale ignores empty values', () => {
setCurrencyLocale('de-DE');
setCurrencyLocale(undefined);
setCurrencyLocale('');
expect(getCurrencyLocale()).toEqual('de-DE');
});
test('setCurrencyLocale canonicalizes underscore-formatted locales to BCP-47', () => {
// Superset bootstrap can emit underscore tags like `pt_BR`/`zh_TW`.
setCurrencyLocale('pt_BR');
expect(getCurrencyLocale()).toEqual('pt-BR');
// BRL is a prefix in pt-BR; the placement must resolve instead of throwing
// and falling back.
expect(resolveSymbolPosition('BRL')).toEqual('prefix');
setCurrencyLocale('zh_TW');
expect(getCurrencyLocale()).toEqual('zh-TW');
});
test('setCurrencyLocale keeps the previous locale for invalid tags', () => {
setCurrencyLocale('fr-FR');
setCurrencyLocale('not a locale!');
expect(getCurrencyLocale()).toEqual('fr-FR');
});

View File

@@ -0,0 +1,74 @@
/*
* 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 {
resolveSymbolPosition,
formatWithSymbolPosition,
} from '@superset-ui/core';
test('resolveSymbolPosition honors an explicit position regardless of locale', () => {
expect(resolveSymbolPosition('EUR', 'prefix', 'fr-FR')).toEqual('prefix');
expect(resolveSymbolPosition('USD', 'suffix', 'en-US')).toEqual('suffix');
});
test('resolveSymbolPosition derives the position from the locale when unset', () => {
// en-US places the symbol before the value for these currencies.
expect(resolveSymbolPosition('USD', undefined, 'en-US')).toEqual('prefix');
expect(resolveSymbolPosition('GBP', undefined, 'en-US')).toEqual('prefix');
expect(resolveSymbolPosition('EUR', undefined, 'en-US')).toEqual('prefix');
// Eurozone locales place the EUR symbol after the value.
expect(resolveSymbolPosition('EUR', undefined, 'fr-FR')).toEqual('suffix');
expect(resolveSymbolPosition('EUR', undefined, 'de-DE')).toEqual('suffix');
});
test('resolveSymbolPosition returns the same result on repeated calls (cached)', () => {
// The second call hits the memoized (locale, currencyCode) entry.
expect(resolveSymbolPosition('EUR', undefined, 'fr-FR')).toEqual('suffix');
expect(resolveSymbolPosition('EUR', undefined, 'fr-FR')).toEqual('suffix');
});
test('resolveSymbolPosition falls back to prefix for unknown currencies', () => {
expect(resolveSymbolPosition('INVALID_CODE', undefined, 'en-US')).toEqual(
'prefix',
);
expect(resolveSymbolPosition(undefined, undefined, 'en-US')).toEqual(
'prefix',
);
});
test('resolveSymbolPosition falls back to prefix when locale parts lack a currency', () => {
const OrigNumberFormat = Intl.NumberFormat;
// formatToParts without a 'currency' part → currencyIndex is -1, so the
// position cannot be derived and the default prefix is returned. Use a
// locale/currency pair not exercised elsewhere so the memoization cache
// does not short-circuit this call.
Intl.NumberFormat = jest.fn().mockImplementation(() => ({
formatToParts: () => [{ type: 'integer', value: '1' }],
})) as unknown as typeof Intl.NumberFormat;
expect(resolveSymbolPosition('USD', undefined, 'zz-mock')).toEqual('prefix');
Intl.NumberFormat = OrigNumberFormat;
});
test('formatWithSymbolPosition places the symbol according to the position', () => {
expect(formatWithSymbolPosition('$', '1,000', 'prefix')).toEqual('$ 1,000');
expect(formatWithSymbolPosition('€', '1,000', 'suffix')).toEqual('1,000 €');
});

View File

@@ -21,3 +21,4 @@ declare module '*.svg';
declare module '*.png';
declare module '*.jpg';
declare module '*.jpeg';
declare module '*.css';

View File

@@ -36,7 +36,8 @@
"nvd3-fork": "^2.0.5",
"dompurify": "^3.4.11",
"prop-types": "^15.8.1",
"urijs": "^1.19.11"
"urijs": "^1.19.11",
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"@apache-superset/core": "*",

View File

@@ -18,7 +18,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { kebabCase, throttle } from 'lodash';
import { kebabCase, throttle } from 'lodash-es';
import d3 from 'd3';
import utc from 'dayjs/plugin/utc';
import nv from 'nvd3-fork';

View File

@@ -32,7 +32,8 @@
"memoize-one": "^6.0.0",
"react-table": "^7.8.0",
"regenerator-runtime": "^0.14.1",
"xss": "^1.0.15"
"xss": "^1.0.15",
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"@ant-design/icons": "^5.6.1",

View File

@@ -50,7 +50,7 @@ import {
JsonObject,
} from '@superset-ui/core';
import { SearchOutlined } from '@ant-design/icons';
import { debounce, isEqual } from 'lodash';
import { debounce, isEqual } from 'lodash-es';
import Pagination from './components/Pagination';
import SearchSelectDropdown from './components/SearchSelectDropdown';
import { SearchOption, SortByItem } from '../types';

View File

@@ -24,7 +24,7 @@ import {
} from '@superset-ui/core';
import { GenericDataType } from '@apache-superset/core/common';
import { useCallback, useEffect, useRef, useState, useMemo } from 'react';
import { isEqual } from 'lodash';
import { isEqual } from 'lodash-es';
import {
CellClickedEvent,

View File

@@ -38,7 +38,7 @@ import {
isTimeComparison,
timeCompareOperator,
} from '@superset-ui/chart-controls';
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import { TableChartFormData } from './types';
import { updateTableOwnState } from './utils/externalAPIs';

View File

@@ -55,7 +55,7 @@ import {
withLabel,
} from '@superset-ui/core';
import { GenericDataType } from '@apache-superset/core/common';
import { isEmpty, last } from 'lodash';
import { isEmpty, last } from 'lodash-es';
import { PAGE_SIZE_OPTIONS, SERVER_PAGE_SIZE_OPTIONS } from './consts';
/**

View File

@@ -38,7 +38,7 @@ import {
AgGridFilterModel,
} from '@superset-ui/core';
import { GenericDataType } from '@apache-superset/core/common';
import { isEmpty, isEqual, merge } from 'lodash';
import { isEmpty, isEqual, merge } from 'lodash-es';
import {
ConditionalFormattingConfig,
getColorFormatters,

View File

@@ -17,7 +17,7 @@
* under the License.
*/
import { isNil } from 'lodash';
import { isNil } from 'lodash-es';
export default function extent<T = number | string | Date | undefined | null>(
values: T[],

View File

@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import type { AgGridChartState } from '@superset-ui/core';
const getInitialFilterModel = (

View File

@@ -31,7 +31,8 @@
"dependencies": {
"@types/geojson": "^7946.0.16",
"geojson": "^0.5.0",
"lodash": "^4.18.1"
"lodash": "^4.18.1",
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"@ant-design/icons": "^5.6.1",

View File

@@ -24,7 +24,7 @@ import { View } from 'ol';
import BaseEvent from 'ol/events/Event';
import { unByKey } from 'ol/Observable';
import { toLonLat } from 'ol/proj';
import { debounce } from 'lodash';
import { debounce } from 'lodash-es';
import { fitMapToCharts } from '../util/mapUtil';
import { ChartLayer } from './ChartLayer';
import { createLayer } from '../util/layerUtil';

View File

@@ -22,7 +22,7 @@ import {
convertKeysToCamelCase,
DataRecord,
} from '@superset-ui/core';
import { isObject } from 'lodash';
import { isObject } from 'lodash-es';
import {
LocationConfigMapping,
SelectedChartConfig,

View File

@@ -29,7 +29,8 @@
"acorn": "^8.17.0",
"d3-array": "^3.2.4",
"lodash": "^4.18.1",
"zod": "^4.4.3"
"zod": "^4.4.3",
"lodash-es": "^4.17.21"
},
"peerDependencies": {
"@apache-superset/core": "*",

View File

@@ -29,7 +29,7 @@ import {
DEFAULT_DATE_PATTERN,
ColorSchemeEnum,
} from '@superset-ui/chart-controls';
import { isEmpty } from 'lodash';
import { isEmpty } from 'lodash-es';
import {
PopKPIComparisonSymbolStyleProps,
PopKPIComparisonValueStyleProps,

Some files were not shown because too many files have changed in this diff Show More