This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new ef4b1d674be feat(docs): add filterable UI Components table and improve
build performance (#38253)
ef4b1d674be is described below
commit ef4b1d674be9e9203a2d8f7d9e77e5001635ea9d
Author: Evan Rusackas <[email protected]>
AuthorDate: Wed Mar 4 08:32:25 2026 -0500
feat(docs): add filterable UI Components table and improve build
performance (#38253)
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
---
docs/.gitignore | 8 +-
docs/developer_docs/api.mdx | 36 +-
docs/developer_docs/extensions/development.md | 2 +-
docs/developer_docs/extensions/overview.md | 4 +
docs/docusaurus.config.ts | 28 +
docs/package.json | 11 +-
docs/scripts/generate-database-docs.mjs | 8 +-
docs/scripts/generate-extension-components.mjs | 676 --------------------
docs/scripts/generate-if-changed.mjs | 307 +++++++++
docs/scripts/generate-superset-components.mjs | 241 ++++++-
docs/sidebarTutorials.js | 11 -
docs/src/components/databases/DatabaseIndex.tsx | 1 +
.../components/ui-components/ComponentIndex.tsx | 262 ++++++++
.../components/ui-components/index.ts} | 15 +-
.../ui-components/types.ts} | 37 +-
docs/src/data/databases.json | 12 +-
docs/src/shims/superset-ui-core.ts | 57 ++
docs/src/types/apache-superset-core/index.d.ts | 4 +-
docs/src/webpack.extend.ts | 15 +-
docs/tsconfig.json | 5 +-
docs/yarn.lock | 697 ++++++++++++++++++---
21 files changed, 1585 insertions(+), 852 deletions(-)
diff --git a/docs/.gitignore b/docs/.gitignore
index bdf3078bb36..d5cf1228397 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -37,10 +37,10 @@ developer_docs/api/
# Generated component documentation MDX files (regenerated at build time)
# Source of truth is Storybook stories in
superset-frontend/packages/superset-ui-core/src/components/
-developer_portal/components/
-
-# Generated extension component documentation (regenerated at build time)
-developer_portal/extensions/components/
+developer_docs/components/
# Note: src/data/databases.json is COMMITTED (not ignored) to preserve feature
diagnostics
# that require Flask context to generate. Update it locally with: npm run
gen-db-docs
+
+# Generated component metadata JSON (regenerated by
generate-superset-components.mjs)
+static/data/components.json
diff --git a/docs/developer_docs/api.mdx b/docs/developer_docs/api.mdx
index ff563805a8e..09f3843087f 100644
--- a/docs/developer_docs/api.mdx
+++ b/docs/developer_docs/api.mdx
@@ -68,14 +68,14 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| `POST` | [Create a new dashboard](./api/create-a-new-dashboard) |
`/api/v1/dashboard/` |
| `GET` | [Get metadata information about this API resource
(dashboard--info)](./api/get-metadata-information-about-this-api-resource-dashboard-info)
| `/api/v1/dashboard/_info` |
| `GET` | [Get a dashboard detail
information](./api/get-a-dashboard-detail-information) |
`/api/v1/dashboard/{id_or_slug}` |
-| `GET` | [Get a dashboard's chart
definitions.](./api/get-a-dashboards-chart-definitions) |
`/api/v1/dashboard/{id_or_slug}/charts` |
+| `GET` | [Get a dashboard's chart
definitions.](./api/get-a-dashboard-s-chart-definitions) |
`/api/v1/dashboard/{id_or_slug}/charts` |
| `POST` | [Create a copy of an existing
dashboard](./api/create-a-copy-of-an-existing-dashboard) |
`/api/v1/dashboard/{id_or_slug}/copy/` |
-| `GET` | [Get dashboard's datasets](./api/get-dashboards-datasets) |
`/api/v1/dashboard/{id_or_slug}/datasets` |
-| `DELETE` | [Delete a dashboard's embedded
configuration](./api/delete-a-dashboards-embedded-configuration) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
-| `GET` | [Get the dashboard's embedded
configuration](./api/get-the-dashboards-embedded-configuration) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
-| `POST` | [Set a dashboard's embedded
configuration](./api/set-a-dashboards-embedded-configuration) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
+| `GET` | [Get dashboard's datasets](./api/get-dashboard-s-datasets) |
`/api/v1/dashboard/{id_or_slug}/datasets` |
+| `DELETE` | [Delete a dashboard's embedded
configuration](./api/delete-a-dashboard-s-embedded-configuration) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
+| `GET` | [Get the dashboard's embedded
configuration](./api/get-the-dashboard-s-embedded-configuration) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
+| `POST` | [Set a dashboard's embedded
configuration](./api/set-a-dashboard-s-embedded-configuration) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
| `PUT` | [Update dashboard by id_or_slug
embedded](./api/update-dashboard-by-id-or-slug-embedded) |
`/api/v1/dashboard/{id_or_slug}/embedded` |
-| `GET` | [Get dashboard's tabs](./api/get-dashboards-tabs) |
`/api/v1/dashboard/{id_or_slug}/tabs` |
+| `GET` | [Get dashboard's tabs](./api/get-dashboard-s-tabs) |
`/api/v1/dashboard/{id_or_slug}/tabs` |
| `DELETE` | [Delete a dashboard](./api/delete-a-dashboard) |
`/api/v1/dashboard/{pk}` |
| `PUT` | [Update a dashboard](./api/update-a-dashboard) |
`/api/v1/dashboard/{pk}` |
| `POST` | [Compute and cache a screenshot
(dashboard-pk-cache-dashboard-screenshot)](./api/compute-and-cache-a-screenshot-dashboard-pk-cache-dashboard-screenshot)
| `/api/v1/dashboard/{pk}/cache_dashboard_screenshot/` |
@@ -84,7 +84,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| `POST` | [Mark the dashboard as favorite for the current
user](./api/mark-the-dashboard-as-favorite-for-the-current-user) |
`/api/v1/dashboard/{pk}/favorites/` |
| `PUT` | [Update native filters configuration for a
dashboard.](./api/update-native-filters-configuration-for-a-dashboard) |
`/api/v1/dashboard/{pk}/filters` |
| `GET` | [Get a computed screenshot from cache
(dashboard-pk-screenshot-digest)](./api/get-a-computed-screenshot-from-cache-dashboard-pk-screenshot-digest)
| `/api/v1/dashboard/{pk}/screenshot/{digest}/` |
-| `GET` | [Get dashboard's thumbnail](./api/get-dashboards-thumbnail) |
`/api/v1/dashboard/{pk}/thumbnail/{digest}/` |
+| `GET` | [Get dashboard's thumbnail](./api/get-dashboard-s-thumbnail) |
`/api/v1/dashboard/{pk}/thumbnail/{digest}/` |
| `GET` | [Download multiple dashboards as YAML
files](./api/download-multiple-dashboards-as-yaml-files) |
`/api/v1/dashboard/export/` |
| `GET` | [Check favorited dashboards for current
user](./api/check-favorited-dashboards-for-current-user) |
`/api/v1/dashboard/favorite_status/` |
| `POST` | [Import dashboard(s) with associated
charts/datasets/databases](./api/import-dashboard-s-with-associated-charts-datasets-databases)
| `/api/v1/dashboard/import/` |
@@ -177,7 +177,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| `GET` | [Get names of databases currently
available](./api/get-names-of-databases-currently-available) |
`/api/v1/database/available/` |
| `GET` | [Download database(s) and associated dataset(s) as a zip
file](./api/download-database-s-and-associated-dataset-s-as-a-zip-file) |
`/api/v1/database/export/` |
| `POST` | [Import database(s) with associated
datasets](./api/import-database-s-with-associated-datasets) |
`/api/v1/database/import/` |
-| `GET` | [Receive personal access tokens from
OAuth2](./api/receive-personal-access-tokens-from-o-auth-2) |
`/api/v1/database/oauth2/` |
+| `GET` | [Receive personal access tokens from
OAuth2](./api/receive-personal-access-tokens-from-oauth2) |
`/api/v1/database/oauth2/` |
| `GET` | [Get related fields data
(database-related-column-name)](./api/get-related-fields-data-database-related-column-name)
| `/api/v1/database/related/{column_name}` |
| `POST` | [Test a database connection](./api/test-a-database-connection) |
`/api/v1/database/test_connection/` |
| `POST` | [Upload a file and returns file
metadata](./api/upload-a-file-and-returns-file-metadata) |
`/api/v1/database/upload_metadata/` |
@@ -201,7 +201,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| Method | Endpoint | Description |
|--------|----------|-------------|
-| `GET` | [Get the bootstrap data for SqlLab
page](./api/get-the-bootstrap-data-for-sql-lab-page) | `/api/v1/sqllab/` |
+| `GET` | [Get the bootstrap data for SqlLab
page](./api/get-the-bootstrap-data-for-sqllab-page) | `/api/v1/sqllab/` |
| `POST` | [Estimate the SQL query execution
cost](./api/estimate-the-sql-query-execution-cost) | `/api/v1/sqllab/estimate/`
|
| `POST` | [Execute a SQL query](./api/execute-a-sql-query) |
`/api/v1/sqllab/execute/` |
| `GET` | [Export the SQL query results to a
CSV](./api/export-the-sql-query-results-to-a-csv) |
`/api/v1/sqllab/export/{client_id}/` |
@@ -249,7 +249,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| Method | Endpoint | Description |
|--------|----------|-------------|
-| `GET` | [Return an
AdvancedDataTypeResponse](./api/return-an-advanced-data-type-response) |
`/api/v1/advanced_data_type/convert` |
+| `GET` | [Return an
AdvancedDataTypeResponse](./api/return-an-advanceddatatyperesponse) |
`/api/v1/advanced_data_type/convert` |
| `GET` | [Return a list of available advanced data
types](./api/return-a-list-of-available-advanced-data-types) |
`/api/v1/advanced_data_type/types` |
</details>
@@ -324,8 +324,8 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| Method | Endpoint | Description |
|--------|----------|-------------|
-| `POST` | [Create a new dashboard's permanent
link](./api/create-a-new-dashboards-permanent-link) |
`/api/v1/dashboard/{pk}/permalink` |
-| `GET` | [Get dashboard's permanent link
state](./api/get-dashboards-permanent-link-state) |
`/api/v1/dashboard/permalink/{key}` |
+| `POST` | [Create a new dashboard's permanent
link](./api/create-a-new-dashboard-s-permanent-link) |
`/api/v1/dashboard/{pk}/permalink` |
+| `GET` | [Get dashboard's permanent link
state](./api/get-dashboard-s-permanent-link-state) |
`/api/v1/dashboard/permalink/{key}` |
</details>
@@ -335,7 +335,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| Method | Endpoint | Description |
|--------|----------|-------------|
| `POST` | [Create a new permanent link
(explore-permalink)](./api/create-a-new-permanent-link-explore-permalink) |
`/api/v1/explore/permalink` |
-| `GET` | [Get chart's permanent link
state](./api/get-charts-permanent-link-state) |
`/api/v1/explore/permalink/{key}` |
+| `GET` | [Get chart's permanent link
state](./api/get-chart-s-permanent-link-state) |
`/api/v1/explore/permalink/{key}` |
</details>
@@ -345,7 +345,7 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| Method | Endpoint | Description |
|--------|----------|-------------|
| `POST` | [Create a new permanent link
(sqllab-permalink)](./api/create-a-new-permanent-link-sqllab-permalink) |
`/api/v1/sqllab/permalink` |
-| `GET` | [Get permanent link state for SQLLab
editor.](./api/get-permanent-link-state-for-sql-lab-editor) |
`/api/v1/sqllab/permalink/{key}` |
+| `GET` | [Get permanent link state for SQLLab
editor.](./api/get-permanent-link-state-for-sqllab-editor) |
`/api/v1/sqllab/permalink/{key}` |
</details>
@@ -363,10 +363,10 @@ curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
| Method | Endpoint | Description |
|--------|----------|-------------|
-| `POST` | [Create a dashboard's filter
state](./api/create-a-dashboards-filter-state) |
`/api/v1/dashboard/{pk}/filter_state` |
-| `DELETE` | [Delete a dashboard's filter state
value](./api/delete-a-dashboards-filter-state-value) |
`/api/v1/dashboard/{pk}/filter_state/{key}` |
-| `GET` | [Get a dashboard's filter state
value](./api/get-a-dashboards-filter-state-value) |
`/api/v1/dashboard/{pk}/filter_state/{key}` |
-| `PUT` | [Update a dashboard's filter state
value](./api/update-a-dashboards-filter-state-value) |
`/api/v1/dashboard/{pk}/filter_state/{key}` |
+| `POST` | [Create a dashboard's filter
state](./api/create-a-dashboard-s-filter-state) |
`/api/v1/dashboard/{pk}/filter_state` |
+| `DELETE` | [Delete a dashboard's filter state
value](./api/delete-a-dashboard-s-filter-state-value) |
`/api/v1/dashboard/{pk}/filter_state/{key}` |
+| `GET` | [Get a dashboard's filter state
value](./api/get-a-dashboard-s-filter-state-value) |
`/api/v1/dashboard/{pk}/filter_state/{key}` |
+| `PUT` | [Update a dashboard's filter state
value](./api/update-a-dashboard-s-filter-state-value) |
`/api/v1/dashboard/{pk}/filter_state/{key}` |
</details>
diff --git a/docs/developer_docs/extensions/development.md
b/docs/developer_docs/extensions/development.md
index c1f7a51be5e..41b112abb89 100644
--- a/docs/developer_docs/extensions/development.md
+++ b/docs/developer_docs/extensions/development.md
@@ -309,7 +309,7 @@ InteractiveMyComponent.argTypes = {
When the docs site is built (`yarn start` or `yarn build` in the `docs/`
directory):
-1. The `generate-extension-components` script scans all stories in
`superset-core`
+1. The `generate-superset-components` script scans all stories (including
`superset-core`)
2. For each story, it generates an MDX page with:
- Component description
- **Live interactive example** with controls extracted from `argTypes`
diff --git a/docs/developer_docs/extensions/overview.md
b/docs/developer_docs/extensions/overview.md
index 175fa9701ca..be8628836d8 100644
--- a/docs/developer_docs/extensions/overview.md
+++ b/docs/developer_docs/extensions/overview.md
@@ -41,6 +41,10 @@ Extensions can provide:
- **REST API Endpoints**: Backend services under the `/api/v1/extensions/`
namespace
- **MCP Tools and Prompts**: AI agent capabilities for enhanced user assistance
+## UI Components for Extensions
+
+Extension developers have access to pre-built UI components via
`@apache-superset/core/ui`. Browse all available components on the [UI
Components](/docs/components/) page and filter by **Extension Compatible** to
see components available to extensions.
+
## Next Steps
- **[Quick Start](./quick-start)** - Build your first extension with a
complete walkthrough
diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts
index 289ae9ed0e5..898bf3ff1c8 100644
--- a/docs/docusaurus.config.ts
+++ b/docs/docusaurus.config.ts
@@ -227,7 +227,35 @@ if (!versionsConfig.developer_docs.disabled &&
!versionsConfig.developer_docs.hi
});
}
+// Docusaurus Faster: Rspack bundler, SWC transpilation, and other build
+// optimizations. Only enabled for local development — CI runners (GitHub
+// Actions, Netlify) have ~8GB RAM and these features push memory usage over
+// the limit. See https://docusaurus.io/blog/releases/3.6#docusaurus-faster
+const isCI = process.env.CI === 'true';
+
const config: Config = {
+ ...(!isCI && {
+ future: {
+ v4: {
+ removeLegacyPostBuildHeadAttribute: true,
+ // Disabled: CSS cascade layers change specificity and cause antd
+ // styles (from Storybook component pages) to override theme styles
+ useCssCascadeLayers: false,
+ },
+ experimental_faster: {
+ swcJsLoader: true,
+ swcJsMinimizer: true,
+ swcHtmlMinimizer: true,
+ lightningCssMinimizer: true,
+ rspackBundler: true,
+ mdxCrossCompilerCache: true,
+ rspackPersistentCache: true,
+ // SSG worker threads spawn parallel Node processes, each consuming
+ // significant memory. Disabled to keep total usage reasonable.
+ ssgWorkerThreads: false,
+ },
+ },
+ }),
title: 'Superset',
tagline:
'Apache Superset is a modern data exploration and visualization platform',
diff --git a/docs/package.json b/docs/package.json
index b41324c9f3f..0d11ac24179 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -6,10 +6,12 @@
"scripts": {
"docusaurus": "docusaurus",
"_init": "cat src/intro_header.txt ../README.md > docs/intro.md",
- "start": "yarn run _init && yarn run generate:all &&
NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development docusaurus start",
+ "start": "yarn run _init && yarn run generate:smart &&
NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development docusaurus start",
"start:quick": "yarn run _init && NODE_OPTIONS='--max-old-space-size=8192'
NODE_ENV=development docusaurus start",
+ "start:full": "yarn run _init && yarn run generate:all &&
NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development docusaurus start",
"stop": "pkill -9 -f 'docusaurus start' || pkill -9 -f 'docusaurus serve'
|| echo 'No docusaurus server running'",
- "build": "yarn run _init && yarn run generate:all &&
NODE_OPTIONS='--max-old-space-size=8192' DEBUG=docusaurus:* docusaurus build",
+ "build": "yarn run _init && yarn run generate:smart &&
NODE_OPTIONS='--max-old-space-size=8192' docusaurus build",
+ "build:full": "yarn run _init && yarn run generate:all &&
NODE_OPTIONS='--max-old-space-size=8192' docusaurus build",
"generate:api-docs": "python3 scripts/fix-openapi-spec.py && docusaurus
gen-api-docs superset && node scripts/convert-api-sidebar.mjs && node
scripts/generate-api-index.mjs && node scripts/generate-api-tag-pages.mjs",
"clean:api-docs": "docusaurus clean-api-docs superset",
"swizzle": "docusaurus swizzle",
@@ -19,11 +21,11 @@
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "yarn run generate:all && tsc",
- "generate:extension-components": "node
scripts/generate-extension-components.mjs",
"generate:superset-components": "node
scripts/generate-superset-components.mjs",
"generate:database-docs": "node scripts/generate-database-docs.mjs",
"gen-db-docs": "node scripts/generate-database-docs.mjs",
- "generate:all": "yarn run generate:extension-components & yarn run
generate:superset-components & yarn run generate:database-docs & wait && yarn
run generate:api-docs",
+ "generate:smart": "node scripts/generate-if-changed.mjs",
+ "generate:all": "node scripts/generate-if-changed.mjs --force",
"lint:db-metadata": "python3 ../superset/db_engine_specs/lint_metadata.py",
"lint:db-metadata:report": "python3
../superset/db_engine_specs/lint_metadata.py --markdown -o
../superset/db_engine_specs/METADATA_STATUS.md",
"update:readme-db-logos": "node scripts/generate-database-docs.mjs
--update-readme",
@@ -40,6 +42,7 @@
"dependencies": {
"@ant-design/icons": "^6.1.0",
"@docusaurus/core": "3.9.2",
+ "@docusaurus/faster": "^3.9.2",
"@docusaurus/plugin-client-redirects": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
"@docusaurus/theme-live-codeblock": "^3.9.2",
diff --git a/docs/scripts/generate-database-docs.mjs
b/docs/scripts/generate-database-docs.mjs
index 85e5b18ff0c..0491683b951 100644
--- a/docs/scripts/generate-database-docs.mjs
+++ b/docs/scripts/generate-database-docs.mjs
@@ -460,6 +460,9 @@ function generateDatabaseMDX(name, db) {
.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"');
+ // Inline the database data directly to avoid importing the full
databases.json
+ const inlineData = JSON.stringify(db);
+
return `---
title: ${name}
sidebar_label: ${name}
@@ -487,9 +490,10 @@ under the License.
*/}
import { DatabasePage } from '@site/src/components/databases';
-import databaseData from '@site/src/data/databases.json';
-<DatabasePage name="${name}" database={databaseData.databases["${name}"]} />
+export const databaseInfo = ${inlineData};
+
+<DatabasePage name="${name}" database={databaseInfo} />
`;
}
diff --git a/docs/scripts/generate-extension-components.mjs
b/docs/scripts/generate-extension-components.mjs
deleted file mode 100644
index c7bed4901c1..00000000000
--- a/docs/scripts/generate-extension-components.mjs
+++ /dev/null
@@ -1,676 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * This script scans for Storybook stories in superset-core/src and generates
- * MDX documentation pages for the developer portal. All components in
- * superset-core are considered extension-compatible by virtue of their
location.
- *
- * Usage: node scripts/generate-extension-components.mjs
- */
-
-import fs from 'fs';
-import path from 'path';
-import { fileURLToPath } from 'url';
-
-const __filename = fileURLToPath(import.meta.url);
-const __dirname = path.dirname(__filename);
-const ROOT_DIR = path.resolve(__dirname, '../..');
-const DOCS_DIR = path.resolve(__dirname, '..');
-const OUTPUT_DIR = path.join(
- DOCS_DIR,
- 'developer_portal/extensions/components'
-);
-const TYPES_OUTPUT_DIR = path.join(DOCS_DIR, 'src/types/apache-superset-core');
-const TYPES_OUTPUT_PATH = path.join(TYPES_OUTPUT_DIR, 'index.d.ts');
-const SUPERSET_CORE_DIR = path.join(
- ROOT_DIR,
- 'superset-frontend/packages/superset-core'
-);
-
-/**
- * Find all story files in the superset-core package
- */
-async function findStoryFiles() {
- const files = [];
-
- // Use fs to recursively find files since glob might not be available
- function walkDir(dir) {
- if (!fs.existsSync(dir)) return;
- const entries = fs.readdirSync(dir, { withFileTypes: true });
- for (const entry of entries) {
- const fullPath = path.join(dir, entry.name);
- if (entry.isDirectory()) {
- walkDir(fullPath);
- } else if (entry.name.endsWith('.stories.tsx')) {
- files.push(fullPath);
- }
- }
- }
-
- walkDir(path.join(SUPERSET_CORE_DIR, 'src'));
- return files;
-}
-
-/**
- * Parse a story file and extract metadata
- *
- * All stories in superset-core are considered extension-compatible
- * by virtue of their location - no tag needed.
- */
-function parseStoryFile(filePath) {
- const content = fs.readFileSync(filePath, 'utf-8');
-
- // Extract component name from title
- const titleMatch = content.match(/title:\s*['"]([^'"]+)['"]/);
- const title = titleMatch ? titleMatch[1] : null;
-
- // Extract component name (last part of title path)
- const componentName = title ? title.split('/').pop() : null;
-
- // Extract description from parameters
- // Handle concatenated strings like: 'part1 ' + 'part2'
- let description = '';
-
- // First try to find the description block
- const descBlockMatch = content.match(
- /description:\s*{\s*component:\s*([\s\S]*?)\s*},?\s*}/
- );
-
- if (descBlockMatch) {
- const descBlock = descBlockMatch[1];
- // Extract all string literals and concatenate them
- const stringParts = [];
- const stringMatches = descBlock.matchAll(/['"]([^'"]*)['"]/g);
- for (const match of stringMatches) {
- stringParts.push(match[1]);
- }
- description = stringParts.join('').trim();
- }
-
- // Extract package info
- const packageMatch = content.match(/package:\s*['"]([^'"]+)['"]/);
- const packageName = packageMatch ? packageMatch[1] :
'@apache-superset/core/ui';
-
- // Extract import path - handle double-quoted strings containing single
quotes
- // Match: importPath: "import { Alert } from '@apache-superset/core';"
- const importMatchDouble = content.match(/importPath:\s*"([^"]+)"/);
- const importMatchSingle = content.match(/importPath:\s*'([^']+)'/);
- let importPath = `import { ${componentName} } from '${packageName}';`;
- if (importMatchDouble) {
- importPath = importMatchDouble[1];
- } else if (importMatchSingle) {
- importPath = importMatchSingle[1];
- }
-
- // Get the directory containing the story to find the component
- const storyDir = path.dirname(filePath);
- const componentFile = path.join(storyDir, 'index.tsx');
- const hasComponentFile = fs.existsSync(componentFile);
-
- // Try to extract props interface from component file (for future use)
- if (hasComponentFile) {
- // Read component file - props extraction reserved for future enhancement
- // const componentContent = fs.readFileSync(componentFile, 'utf-8');
- }
-
- // Extract story exports (named exports that aren't the default)
- const storyExports = [];
- const exportMatches = content.matchAll(
- /export\s+(?:const|function)\s+(\w+)/g
- );
- for (const match of exportMatches) {
- if (match[1] !== 'default') {
- storyExports.push(match[1]);
- }
- }
-
- return {
- filePath,
- title,
- componentName,
- description,
- packageName,
- importPath,
- storyExports,
- hasComponentFile,
- relativePath: path.relative(ROOT_DIR, filePath),
- };
-}
-
-/**
- * Extract argTypes/args from story content for generating controls
- */
-function extractArgsAndControls(content, componentName, storyContent) {
- // Look for InteractiveX.args pattern - handle multi-line objects
- const argsMatch = content.match(
- new
RegExp(`Interactive${componentName}\\.args\\s*=\\s*\\{([\\s\\S]*?)\\};`, 's')
- );
-
- // Look for argTypes
- const argTypesMatch = content.match(
- new
RegExp(`Interactive${componentName}\\.argTypes\\s*=\\s*\\{([\\s\\S]*?)\\};`,
's')
- );
-
- const args = {};
- const controls = [];
- const propDescriptions = {};
-
- if (argsMatch) {
- // Parse args - handle strings, booleans, numbers
- // Note: Using simple regex without escape handling for security (avoids
ReDoS)
- // This is sufficient for Storybook args which rarely contain escaped
quotes
- const argsContent = argsMatch[1];
- const argLines =
argsContent.matchAll(/(\w+):\s*(['"]([^'"]*)['"']|true|false|\d+)/g);
- for (const match of argLines) {
- const key = match[1];
- let value = match[2];
- // Convert string booleans
- if (value === 'true') value = true;
- else if (value === 'false') value = false;
- else if (!isNaN(Number(value))) value = Number(value);
- else if (match[3] !== undefined) value = match[3]; // Use captured
string content
- args[key] = value;
- }
- }
-
- if (argTypesMatch) {
- const argTypesContent = argTypesMatch[1];
-
- // Match each top-level property in argTypes
- // Pattern: propertyName: { ... }, (with balanced braces)
- const propPattern = /(\w+):\s*\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
- let propMatch;
-
- while ((propMatch = propPattern.exec(argTypesContent)) !== null) {
- const name = propMatch[1];
- const propContent = propMatch[2];
-
- // Extract description if present
- const descMatch = propContent.match(/description:\s*['"]([^'"]+)['"]/);
- if (descMatch) {
- propDescriptions[name] = descMatch[1];
- }
-
- // Skip if it's an action (not a control)
- if (propContent.includes('action:')) continue;
-
- // Extract label for display
- const label = name.charAt(0).toUpperCase() +
name.slice(1).replace(/([A-Z])/g, ' $1');
-
- // Check for select control
- if (propContent.includes("type: 'select'") ||
propContent.includes('type: "select"')) {
- // Look for options - could be inline array or variable reference
- const inlineOptionsMatch =
propContent.match(/options:\s*\[([^\]]+)\]/);
- const varOptionsMatch = propContent.match(/options:\s*(\w+)/);
-
- let options = [];
- if (inlineOptionsMatch) {
- options =
[...inlineOptionsMatch[1].matchAll(/['"]([^'"]+)['"]/g)].map(m => m[1]);
- } else if (varOptionsMatch && storyContent) {
- // Look up the variable
- const varName = varOptionsMatch[1];
- const varDefMatch = storyContent.match(
- new RegExp(`const\\s+${varName}[^=]*=\\s*\\[([^\\]]+)\\]`)
- );
- if (varDefMatch) {
- options = [...varDefMatch[1].matchAll(/['"]([^'"]+)['"]/g)].map(m
=> m[1]);
- }
- }
-
- if (options.length > 0) {
- controls.push({ name, label, type: 'select', options });
- }
- }
- // Check for boolean control
- else if (propContent.includes("type: 'boolean'") ||
propContent.includes('type: "boolean"')) {
- controls.push({ name, label, type: 'boolean' });
- }
- // Check for text/string control (default for props in args without
explicit control)
- else if (args[name] !== undefined && typeof args[name] === 'string') {
- controls.push({ name, label, type: 'text' });
- }
- }
- }
-
- // Add text controls for string args that don't have explicit argTypes
- for (const [key, value] of Object.entries(args)) {
- if (typeof value === 'string' && !controls.find(c => c.name === key)) {
- const label = key.charAt(0).toUpperCase() +
key.slice(1).replace(/([A-Z])/g, ' $1');
- controls.push({ name: key, label, type: 'text' });
- }
- }
-
- return { args, controls, propDescriptions };
-}
-
-/**
- * Generate MDX content for a component
- */
-function generateMDX(component, storyContent) {
- const { componentName, description, importPath, packageName, relativePath } =
- component;
-
- // Extract args, controls, and descriptions from the story
- const { args, controls, propDescriptions } =
extractArgsAndControls(storyContent, componentName, storyContent);
-
- // Generate the controls array for StoryWithControls
- const controlsJson = JSON.stringify(controls, null, 2)
- .replace(/"(\w+)":/g, '$1:') // Remove quotes from keys
- .replace(/"/g, "'"); // Use single quotes for strings
-
- // Generate default props
- const propsJson = JSON.stringify(args, null, 2)
- .replace(/"(\w+)":/g, '$1:')
- .replace(/"/g, "'");
-
- // Generate a realistic live code example from the actual args
- const liveExampleProps = Object.entries(args)
- .map(([key, value]) => {
- if (typeof value === 'string') return `${key}="${value}"`;
- if (typeof value === 'boolean') return value ? key : null;
- return `${key}={${JSON.stringify(value)}}`;
- })
- .filter(Boolean)
- .join('\n ');
-
- // Generate props table with descriptions from argTypes
- const propsTable = Object.entries(args).map(([key, value]) => {
- const type = typeof value === 'boolean' ? 'boolean' : typeof value ===
'string' ? 'string' : 'any';
- const desc = propDescriptions[key] || key.charAt(0).toUpperCase() +
key.slice(1).replace(/([A-Z])/g, ' $1');
- return `| \`${key}\` | \`${type}\` | \`${JSON.stringify(value)}\` |
${desc} |`;
- }).join('\n');
-
- // Generate usage example props (simplified for readability)
- const usageExampleProps = Object.entries(args)
- .slice(0, 3) // Show first 3 props for brevity
- .map(([key, value]) => {
- if (typeof value === 'string') return `${key}="${value}"`;
- if (typeof value === 'boolean') return value ? key : `${key}={false}`;
- return `${key}={${JSON.stringify(value)}}`;
- })
- .join('\n ');
-
- return `---
-title: ${componentName}
-sidebar_label: ${componentName}
----
-
-<!--
- 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 { StoryWithControls } from '../../../src/components/StorybookWrapper';
-import { ${componentName} } from '@apache-superset/core/ui';
-
-# ${componentName}
-
-${description || `The ${componentName} component from the Superset extension
API.`}
-
-## Live Example
-
-<StoryWithControls
- component={${componentName}}
- props={${propsJson}}
- controls={${controlsJson}}
-/>
-
-## Try It
-
-Edit the code below to experiment with the component:
-
-\`\`\`tsx live
-function Demo() {
- return (
- <${componentName}
- ${liveExampleProps}
- />
- );
-}
-\`\`\`
-
-## Props
-
-| Prop | Type | Default | Description |
-|------|------|---------|-------------|
-${propsTable}
-
-## Usage in Extensions
-
-This component is available in the \`${packageName}\` package, which is
automatically available to Superset extensions.
-
-\`\`\`tsx
-${importPath}
-
-function MyExtension() {
- return (
- <${componentName}
- ${usageExampleProps}
- />
- );
-}
-\`\`\`
-
-## Source Links
-
-- [Story file](https://github.com/apache/superset/blob/master/${relativePath})
-- [Component
source](https://github.com/apache/superset/blob/master/${relativePath.replace(/\/[^/]+\.stories\.tsx$/,
'/index.tsx')})
-
----
-
-*This page was auto-generated from the component's Storybook story.*
-`;
-}
-
-/**
- * Generate index page for extension components
- */
-function generateIndexMDX(components) {
- const componentList = components
- .map(c => `- [${c.componentName}](./${c.componentName.toLowerCase()})`)
- .join('\n');
-
- return `---
-title: Extension Components
-sidebar_label: Overview
-sidebar_position: 1
----
-
-<!--
- 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.
--->
-
-# Extension Components
-
-These UI components are available to Superset extension developers through the
\`@apache-superset/core/ui\` package. They provide a consistent look and feel
with the rest of Superset and are designed to be used in extension panels,
views, and other UI elements.
-
-## Available Components
-
-${componentList}
-
-## Usage
-
-All components are exported from the \`@apache-superset/core/ui\` package:
-
-\`\`\`tsx
-import { Alert } from '@apache-superset/core/ui';
-
-export function MyExtensionPanel() {
- return (
- <Alert type="info">
- Welcome to my extension!
- </Alert>
- );
-}
-\`\`\`
-
-## Adding New Components
-
-Components in \`@apache-superset/core/ui\` are automatically documented here.
To add a new extension component:
-
-1. Add the component to
\`superset-frontend/packages/superset-core/src/ui/components/\`
-2. Export it from
\`superset-frontend/packages/superset-core/src/ui/components/index.ts\`
-3. Create a Storybook story with an \`Interactive\` export:
-
-\`\`\`tsx
-export default {
- title: 'Extension Components/MyComponent',
- component: MyComponent,
- parameters: {
- docs: {
- description: {
- component: 'Description of the component...',
- },
- },
- },
-};
-
-export const InteractiveMyComponent = (args) => <MyComponent {...args} />;
-
-InteractiveMyComponent.args = {
- variant: 'primary',
- disabled: false,
-};
-
-InteractiveMyComponent.argTypes = {
- variant: {
- control: { type: 'select' },
- options: ['primary', 'secondary'],
- },
- disabled: {
- control: { type: 'boolean' },
- },
-};
-\`\`\`
-
-4. Run \`yarn start\` in \`docs/\` - the page generates automatically!
-
-## Interactive Documentation
-
-For interactive examples with controls, visit the
[Storybook](/storybook/?path=/docs/extension-components--docs).
-`;
-}
-
-/**
- * Extract type exports from a component file
- */
-function extractComponentTypes(componentPath) {
- if (!fs.existsSync(componentPath)) {
- return null;
- }
-
- const content = fs.readFileSync(componentPath, 'utf-8');
- const types = [];
-
- // Find all "export type X = ..." declarations
- const typeMatches =
content.matchAll(/export\s+type\s+(\w+)\s*=\s*([^;]+);/g);
- for (const match of typeMatches) {
- types.push({
- name: match[1],
- definition: match[2].trim(),
- });
- }
-
- // Find all "export const X = ..." declarations (components)
- const constMatches = content.matchAll(/export\s+const\s+(\w+)\s*[=:]/g);
- const components = [];
- for (const match of constMatches) {
- components.push(match[1]);
- }
-
- return { types, components };
-}
-
-/**
- * Generate the type declarations file content
- */
-function generateTypeDeclarations(componentInfos) {
- const imports = new Set();
- const typeDeclarations = [];
- const componentDeclarations = [];
-
- for (const info of componentInfos) {
- const componentDir = path.dirname(info.filePath);
- const componentFile = path.join(componentDir, 'index.tsx');
- const extracted = extractComponentTypes(componentFile);
-
- if (!extracted) continue;
-
- // Check if types reference antd or react
- for (const type of extracted.types) {
- if (type.definition.includes('AntdAlertProps') ||
type.definition.includes('AlertProps')) {
- imports.add("import type { AlertProps as AntdAlertProps } from
'antd/es/alert';");
- }
- if (type.definition.includes('PropsWithChildren') ||
type.definition.includes('FC')) {
- imports.add("import type { PropsWithChildren, FC } from 'react';");
- }
-
- // Add the type declaration
- typeDeclarations.push(` export type ${type.name} =
${type.definition};`);
- }
-
- // Add component declarations
- for (const comp of extracted.components) {
- const propsType = `${comp}Props`;
- const hasPropsType = extracted.types.some(t => t.name === propsType);
- if (hasPropsType) {
- componentDeclarations.push(` export const ${comp}:
FC<${propsType}>;`);
- } else {
- componentDeclarations.push(` export const ${comp}: FC<Record<string,
unknown>>;`);
- }
- }
- }
-
- // Remove 'export' prefix for direct exports (not in declare module)
- const cleanedTypes = typeDeclarations.map(t => t.replace(/^ {2}export /,
'export '));
- const cleanedComponents = componentDeclarations.map(c => c.replace(/^
{2}export /, 'export '));
-
- return `/**
- * 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.
- */
-
-/**
- * Type declarations for @apache-superset/core/ui
- *
- * AUTO-GENERATED by scripts/generate-extension-components.mjs
- * Do not edit manually - regenerate by running: yarn
generate:extension-components
- */
-${Array.from(imports).join('\n')}
-
-${cleanedTypes.join('\n')}
-
-${cleanedComponents.join('\n')}
-`;
-}
-
-/**
- * Main function
- */
-async function main() {
- console.log('Scanning for extension-compatible stories...\n');
-
- // Find all story files
- const storyFiles = await findStoryFiles();
- console.log(`Found ${storyFiles.length} story files in superset-core\n`);
-
- // Parse each story file
- const components = [];
- for (const file of storyFiles) {
- const parsed = parseStoryFile(file);
- if (parsed) {
- components.push(parsed);
- console.log(` ✓ ${parsed.componentName} (${parsed.relativePath})`);
- }
- }
-
- if (components.length === 0) {
- console.log(
- '\nNo extension-compatible components found. Make sure stories have:'
- );
- console.log(" tags: ['extension-compatible']");
- return;
- }
-
- console.log(`\nFound ${components.length} extension-compatible
components\n`);
-
- // Ensure output directory exists
- if (!fs.existsSync(OUTPUT_DIR)) {
- fs.mkdirSync(OUTPUT_DIR, { recursive: true });
- console.log(`Created directory: ${OUTPUT_DIR}\n`);
- }
-
- // Generate MDX files
- for (const component of components) {
- // Read the story content for extracting args/controls
- const storyContent = fs.readFileSync(component.filePath, 'utf-8');
- const mdxContent = generateMDX(component, storyContent);
- const outputPath = path.join(
- OUTPUT_DIR,
- `${component.componentName.toLowerCase()}.mdx`
- );
- fs.writeFileSync(outputPath, mdxContent);
- console.log(` Generated: ${path.relative(DOCS_DIR, outputPath)}`);
- }
-
- // Generate index page
- const indexContent = generateIndexMDX(components);
- const indexPath = path.join(OUTPUT_DIR, 'index.mdx');
- fs.writeFileSync(indexPath, indexContent);
- console.log(` Generated: ${path.relative(DOCS_DIR, indexPath)}`);
-
- // Generate type declarations
- if (!fs.existsSync(TYPES_OUTPUT_DIR)) {
- fs.mkdirSync(TYPES_OUTPUT_DIR, { recursive: true });
- }
- const typesContent = generateTypeDeclarations(components);
- fs.writeFileSync(TYPES_OUTPUT_PATH, typesContent);
- console.log(` Generated: ${path.relative(DOCS_DIR, TYPES_OUTPUT_PATH)}`);
-
- console.log('\nDone! Extension component documentation generated.');
- console.log(
- `\nGenerated ${components.length + 2} files (${components.length + 1} MDX
+ 1 type declaration)`
- );
-}
-
-main().catch(console.error);
diff --git a/docs/scripts/generate-if-changed.mjs
b/docs/scripts/generate-if-changed.mjs
new file mode 100644
index 00000000000..b44d5e77ff5
--- /dev/null
+++ b/docs/scripts/generate-if-changed.mjs
@@ -0,0 +1,307 @@
+/**
+ * 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.
+ */
+
+/**
+ * Smart generator wrapper: only runs generators whose input files have
changed.
+ *
+ * Computes a hash of each generator's input files (stories, engine specs,
+ * openapi.json, and the generator scripts themselves). Compares against a
+ * stored cache. Skips generators whose inputs and outputs are unchanged.
+ *
+ * Usage:
+ * node scripts/generate-if-changed.mjs # smart mode (default)
+ * node scripts/generate-if-changed.mjs --force # force regenerate all
+ */
+
+import { createHash } from 'crypto';
+import { execSync, spawn } from 'child_process';
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const DOCS_DIR = path.resolve(__dirname, '..');
+const ROOT_DIR = path.resolve(DOCS_DIR, '..');
+const CACHE_FILE = path.join(DOCS_DIR, '.docusaurus', 'generator-hashes.json');
+
+const FORCE = process.argv.includes('--force');
+
+// Ensure local node_modules/.bin is on PATH (needed for docusaurus CLI)
+const localBin = path.join(DOCS_DIR, 'node_modules', '.bin');
+process.env.PATH = `${localBin}${path.delimiter}${process.env.PATH}`;
+
+// ---------------------------------------------------------------------------
+// Generator definitions
+// ---------------------------------------------------------------------------
+
+const GENERATORS = [
+ {
+ name: 'superset-components',
+ command: 'node scripts/generate-superset-components.mjs',
+ inputs: [
+ {
+ type: 'glob',
+ base: path.join(ROOT_DIR,
'superset-frontend/packages/superset-ui-core/src/components'),
+ pattern: '**/*.stories.tsx',
+ },
+ {
+ type: 'glob',
+ base: path.join(ROOT_DIR,
'superset-frontend/packages/superset-core/src'),
+ pattern: '**/*.stories.tsx',
+ },
+ { type: 'file', path: path.join(DOCS_DIR,
'scripts/generate-superset-components.mjs') },
+ { type: 'file', path: path.join(DOCS_DIR,
'src/components/StorybookWrapper.jsx') },
+ ],
+ outputs: [
+ path.join(DOCS_DIR, 'developer_docs/components/index.mdx'),
+ path.join(DOCS_DIR, 'static/data/components.json'),
+ path.join(DOCS_DIR, 'src/types/apache-superset-core/index.d.ts'),
+ ],
+ },
+ {
+ name: 'database-docs',
+ command: 'node scripts/generate-database-docs.mjs',
+ inputs: [
+ {
+ type: 'glob',
+ base: path.join(ROOT_DIR, 'superset/db_engine_specs'),
+ pattern: '**/*.py',
+ },
+ { type: 'file', path: path.join(DOCS_DIR,
'scripts/generate-database-docs.mjs') },
+ ],
+ outputs: [
+ path.join(DOCS_DIR, 'src/data/databases.json'),
+ path.join(DOCS_DIR, 'docs/databases/supported'),
+ ],
+ },
+ {
+ name: 'api-docs',
+ command:
+ 'python3 scripts/fix-openapi-spec.py && docusaurus gen-api-docs superset
&& node scripts/convert-api-sidebar.mjs && node scripts/generate-api-index.mjs
&& node scripts/generate-api-tag-pages.mjs',
+ inputs: [
+ { type: 'file', path: path.join(DOCS_DIR,
'static/resources/openapi.json') },
+ { type: 'file', path: path.join(DOCS_DIR, 'scripts/fix-openapi-spec.py')
},
+ { type: 'file', path: path.join(DOCS_DIR,
'scripts/convert-api-sidebar.mjs') },
+ { type: 'file', path: path.join(DOCS_DIR,
'scripts/generate-api-index.mjs') },
+ { type: 'file', path: path.join(DOCS_DIR,
'scripts/generate-api-tag-pages.mjs') },
+ ],
+ outputs: [
+ path.join(DOCS_DIR, 'docs/api.mdx'),
+ ],
+ },
+];
+
+// ---------------------------------------------------------------------------
+// Hashing utilities
+// ---------------------------------------------------------------------------
+
+function walkDir(dir, pattern) {
+ const results = [];
+ if (!fs.existsSync(dir)) return results;
+
+ const regex = globToRegex(pattern);
+ function walk(currentDir) {
+ for (const entry of fs.readdirSync(currentDir, { withFileTypes: true })) {
+ const fullPath = path.join(currentDir, entry.name);
+ if (entry.isDirectory()) {
+ if (entry.name === 'node_modules' || entry.name === '__pycache__')
continue;
+ walk(fullPath);
+ } else {
+ // Normalize to forward slashes so glob patterns work on all platforms
+ const relativePath = path.relative(dir,
fullPath).split(path.sep).join('/');
+ if (regex.test(relativePath)) {
+ results.push(fullPath);
+ }
+ }
+ }
+ }
+ walk(dir);
+ return results.sort();
+}
+
+function globToRegex(pattern) {
+ // Simple glob-to-regex: ** matches any path, * matches anything except /
+ const escaped = pattern
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
+ .replace(/\*\*/g, '<<<GLOBSTAR>>>')
+ .replace(/\*/g, '[^/]*')
+ .replace(/<<<GLOBSTAR>>>/g, '.*');
+ return new RegExp(`^${escaped}$`);
+}
+
+function hashFile(filePath) {
+ if (!fs.existsSync(filePath)) return 'missing';
+ const stat = fs.statSync(filePath);
+ // Use mtime + size for speed (avoids reading file contents)
+ return `${stat.mtimeMs}:${stat.size}`;
+}
+
+function computeInputHash(inputs) {
+ const hash = createHash('md5');
+ for (const input of inputs) {
+ if (input.type === 'file') {
+ hash.update(`file:${input.path}:${hashFile(input.path)}\n`);
+ } else if (input.type === 'glob') {
+ const files = walkDir(input.base, input.pattern);
+
hash.update(`glob:${input.base}:${input.pattern}:count=${files.length}\n`);
+ for (const file of files) {
+ hash.update(` ${path.relative(input.base,
file)}:${hashFile(file)}\n`);
+ }
+ }
+ }
+ return hash.digest('hex');
+}
+
+function outputsExist(outputs) {
+ return outputs.every((p) => fs.existsSync(p));
+}
+
+// ---------------------------------------------------------------------------
+// Cache management
+// ---------------------------------------------------------------------------
+
+function loadCache() {
+ try {
+ if (fs.existsSync(CACHE_FILE)) {
+ return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8'));
+ }
+ } catch {
+ // Corrupted cache — start fresh
+ }
+ return {};
+}
+
+function saveCache(cache) {
+ const dir = path.dirname(CACHE_FILE);
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir, { recursive: true });
+ }
+ fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));
+}
+
+// ---------------------------------------------------------------------------
+// Main
+// ---------------------------------------------------------------------------
+
+async function main() {
+ const cache = loadCache();
+ const updatedCache = { ...cache };
+ let skipped = 0;
+ let ran = 0;
+
+ // First pass: determine which generators need to run
+ // Run independent generators (superset-components, database-docs) in
+ // parallel, then api-docs sequentially (it depends on docusaurus CLI
+ // being available, not on other generators).
+
+ const independent = GENERATORS.filter((g) => g.name !== 'api-docs');
+ const sequential = GENERATORS.filter((g) => g.name === 'api-docs');
+
+ // Check and run independent generators in parallel
+ const parallelPromises = independent.map((gen) => {
+ const currentHash = computeInputHash(gen.inputs);
+ const cachedHash = cache[gen.name];
+ const hasOutputs = outputsExist(gen.outputs);
+
+ if (!FORCE && currentHash === cachedHash && hasOutputs) {
+ console.log(` ✓ ${gen.name} — no changes, skipping`);
+ skipped++;
+ return Promise.resolve();
+ }
+
+ const reason = FORCE
+ ? 'forced'
+ : !hasOutputs
+ ? 'output missing'
+ : 'inputs changed';
+ console.log(` ↻ ${gen.name} — ${reason}, regenerating...`);
+ ran++;
+
+ return new Promise((resolve, reject) => {
+ const child = spawn('sh', ['-c', gen.command], {
+ cwd: DOCS_DIR,
+ stdio: 'inherit',
+ env: process.env,
+ });
+ child.on('close', (code) => {
+ if (code === 0) {
+ updatedCache[gen.name] = currentHash;
+ resolve();
+ } else {
+ console.error(` ✗ ${gen.name} failed (exit ${code})`);
+ reject(new Error(`${gen.name} failed with exit code ${code}`));
+ }
+ });
+ child.on('error', (err) => {
+ console.error(` ✗ ${gen.name} failed to start`);
+ reject(err);
+ });
+ });
+ });
+
+ await Promise.all(parallelPromises);
+
+ // Run sequential generators (api-docs)
+ for (const gen of sequential) {
+ const currentHash = computeInputHash(gen.inputs);
+ const cachedHash = cache[gen.name];
+ const hasOutputs = outputsExist(gen.outputs);
+
+ if (!FORCE && currentHash === cachedHash && hasOutputs) {
+ console.log(` ✓ ${gen.name} — no changes, skipping`);
+ skipped++;
+ continue;
+ }
+
+ const reason = FORCE
+ ? 'forced'
+ : !hasOutputs
+ ? 'output missing'
+ : 'inputs changed';
+ console.log(` ↻ ${gen.name} — ${reason}, regenerating...`);
+ ran++;
+
+ try {
+ execSync(gen.command, {
+ cwd: DOCS_DIR,
+ stdio: 'inherit',
+ timeout: 300_000,
+ });
+ updatedCache[gen.name] = currentHash;
+ } catch (err) {
+ console.error(` ✗ ${gen.name} failed`);
+ throw err;
+ }
+ }
+
+ saveCache(updatedCache);
+
+ if (ran === 0) {
+ console.log(`\nAll ${skipped} generators up-to-date — nothing to do!\n`);
+ } else {
+ console.log(`\nDone: ${ran} regenerated, ${skipped} skipped.\n`);
+ }
+}
+
+console.log('Checking generators for changes...\n');
+main().catch((err) => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/docs/scripts/generate-superset-components.mjs
b/docs/scripts/generate-superset-components.mjs
index a85a49bef0a..55ee639293f 100644
--- a/docs/scripts/generate-superset-components.mjs
+++ b/docs/scripts/generate-superset-components.mjs
@@ -58,7 +58,10 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const ROOT_DIR = path.resolve(__dirname, '../..');
const DOCS_DIR = path.resolve(__dirname, '..');
-const OUTPUT_DIR = path.join(DOCS_DIR, 'developer_portal/components');
+const OUTPUT_DIR = path.join(DOCS_DIR, 'developer_docs/components');
+const JSON_OUTPUT_PATH = path.join(DOCS_DIR, 'static/data/components.json');
+const TYPES_OUTPUT_DIR = path.join(DOCS_DIR, 'src/types/apache-superset-core');
+const TYPES_OUTPUT_PATH = path.join(TYPES_OUTPUT_DIR, 'index.d.ts');
const FRONTEND_DIR = path.join(ROOT_DIR, 'superset-frontend');
// Source configurations with import paths and categories
@@ -146,6 +149,16 @@ const SOURCES = [
enabled: false, // Requires specific setup
skipComponents: new Set([]),
},
+ {
+ name: 'Extension Components',
+ path: 'packages/superset-core/src',
+ importPrefix: '@apache-superset/core/ui',
+ docImportPrefix: '@apache-superset/core/ui',
+ category: 'extension',
+ enabled: true,
+ extensionCompatible: true,
+ skipComponents: new Set([]),
+ },
];
// Category mapping from story title prefixes to output directories
@@ -156,7 +169,7 @@ const CATEGORY_MAP = {
'Legacy Chart Plugins/': 'legacy-charts',
'Core Packages/': 'core-packages',
'Others/': 'utilities',
- 'Extension Components/': 'extension', // Skip - handled by other script
+ 'Extension Components/': 'extension',
'Superset App/': 'app',
};
@@ -334,6 +347,7 @@ function parseStoryFile(filePath, sourceConfig) {
sourceConfig,
resolvedImportPath,
isDefaultExport,
+ extensionCompatible: Boolean(sourceConfig.extensionCompatible),
};
}
@@ -1141,6 +1155,7 @@ Help improve it by [editing the story
file](https://github.com/apache/superset/e
const CATEGORY_LABELS = {
ui: { title: 'Core Components', sidebarLabel: 'Core Components',
description: 'Buttons, inputs, modals, selects, and other fundamental UI
elements.' },
'design-system': { title: 'Layout Components', sidebarLabel: 'Layout
Components', description: 'Grid, Layout, Table, Flex, Space, and container
components for page structure.' },
+ extension: { title: 'Extension Components', sidebarLabel: 'Extension
Components', description: 'Components available to extension developers via
@apache-superset/core/ui.' },
};
/**
@@ -1194,20 +1209,7 @@ ${componentList}
/**
* Generate main overview page
*/
-function generateOverviewIndex(categories) {
- const categoryList = Object.entries(categories)
- .filter(([, components]) => components.length > 0)
- .map(([cat, components]) => {
- const labels = CATEGORY_LABELS[cat] || {
- title: cat.charAt(0).toUpperCase() + cat.slice(1).replace(/-/g, ' '),
- };
- const desc = labels.description ? ` ${labels.description}` : '';
- return `### [${labels.title}](./${cat}/)\n${components.length}
components —${desc}\n`;
- })
- .join('\n');
-
- const totalComponents = Object.values(categories).reduce((sum, c) => sum +
c.length, 0);
-
+function generateOverviewIndex() {
return `---
title: UI Components Overview
sidebar_label: Overview
@@ -1233,7 +1235,16 @@ sidebar_position: 0
under the License.
-->
-# Superset Design System
+import { ComponentIndex } from '@site/src/components/ui-components';
+import componentData from '@site/static/data/components.json';
+
+# UI Components
+
+<ComponentIndex data={componentData} />
+
+---
+
+## Design System
A design system is a complete set of standards intended to manage design at
scale using reusable components and patterns.
@@ -1245,14 +1256,6 @@ The Superset Design System uses [Atomic
Design](https://bradfrost.com/blog/post/
<img src="/img/atomic-design.png" alt="Atoms = Foundations, Molecules =
Components, Organisms = Patterns, Templates = Templates, Pages / Screens =
Features" style={{maxWidth: '100%'}} />
----
-
-## Component Library
-
-Interactive documentation for Superset's UI component library.
**${totalComponents} components** documented across
${Object.keys(categories).filter(k => categories[k].length > 0).length}
categories.
-
-${categoryList}
-
## Usage
All components are exported from \`@superset-ui/core/components\`:
@@ -1332,6 +1335,147 @@ ${sections}
`;
}
+/**
+ * Build metadata for a component (for JSON output)
+ */
+function buildComponentMetadata(component, storyContent) {
+ const { componentName, description, category, sourceConfig,
resolvedImportPath, extensionCompatible } = component;
+ const { args, controls, gallery, liveExample } =
extractArgsAndControls(storyContent, componentName);
+ const labels = CATEGORY_LABELS[category] || {
+ title: category.charAt(0).toUpperCase() + category.slice(1).replace(/-/g,
' '),
+ };
+
+ return {
+ name: componentName,
+ category,
+ categoryLabel: labels.title || category,
+ description: description || '',
+ importPath: resolvedImportPath || sourceConfig.importPrefix,
+ package: sourceConfig.docImportPrefix,
+ extensionCompatible: Boolean(extensionCompatible),
+ propsCount: Object.keys(args).length,
+ controlsCount: controls.length,
+ hasGallery: Boolean(gallery && gallery.sizes && gallery.styles),
+ hasLiveExample: Boolean(liveExample),
+ docPath:
`developer-docs/components/${category}/${componentName.toLowerCase()}`,
+ storyFile: component.relativePath,
+ };
+}
+
+/**
+ * Extract type and component export declarations from a component source file.
+ * Used to generate .d.ts type declarations for extension-compatible
components.
+ */
+function extractComponentTypes(componentPath) {
+ if (!fs.existsSync(componentPath)) return null;
+ const content = fs.readFileSync(componentPath, 'utf-8');
+
+ const types = [];
+ // Match "export type Name = <definition>;" handling nested braces
+ // so object types like { a: string; b: number } are captured fully.
+ const typeRegex = /export\s+type\s+(\w+)\s*=\s*/g;
+ let typeMatch;
+ while ((typeMatch = typeRegex.exec(content)) !== null) {
+ const start = typeMatch.index + typeMatch[0].length;
+ let depth = 0;
+ let end = start;
+ for (let i = start; i < content.length; i++) {
+ const ch = content[i];
+ if (ch === '{' || ch === '<' || ch === '(') depth++;
+ else if (ch === '}' || ch === '>' || ch === ')') depth--;
+ else if (ch === ';' && depth === 0) {
+ end = i;
+ break;
+ }
+ }
+ const definition = content.slice(start, end).trim();
+ if (definition) {
+ types.push({ name: typeMatch[1], definition });
+ }
+ }
+
+ const components = [];
+ for (const match of content.matchAll(/export\s+const\s+(\w+)\s*[=:]/g)) {
+ components.push(match[1]);
+ }
+
+ return { types, components };
+}
+
+/**
+ * Generate TypeScript type declarations for extension-compatible components.
+ * Produces a .d.ts file that downstream consumers can reference.
+ */
+function generateExtensionTypeDeclarations(extensionComponents) {
+ const imports = new Set();
+ const typeDeclarations = [];
+ const componentDeclarations = [];
+
+ for (const comp of extensionComponents) {
+ const componentDir = path.dirname(comp.filePath);
+ const componentFile = path.join(componentDir, 'index.tsx');
+ const extracted = extractComponentTypes(componentFile);
+ if (!extracted) continue;
+
+ for (const type of extracted.types) {
+ if (type.definition.includes('AntdAlertProps') ||
type.definition.includes('AlertProps')) {
+ imports.add("import type { AlertProps as AntdAlertProps } from
'antd/es/alert';");
+ }
+ if (type.definition.includes('PropsWithChildren') ||
type.definition.includes('FC')) {
+ imports.add("import type { PropsWithChildren, FC } from 'react';");
+ }
+ typeDeclarations.push(`export type ${type.name} = ${type.definition};`);
+ }
+
+ for (const name of extracted.components) {
+ const propsType = `${name}Props`;
+ const hasPropsType = extracted.types.some(t => t.name === propsType);
+ componentDeclarations.push(
+ hasPropsType
+ ? `export const ${name}: FC<${propsType}>;`
+ : `export const ${name}: FC<Record<string, unknown>>;`
+ );
+ }
+ }
+
+ // Always import FC when we have component declarations that reference it
+ if (componentDeclarations.length > 0) {
+ imports.add("import type { PropsWithChildren, FC } from 'react';");
+ }
+
+ return `/**
+ * 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.
+ */
+
+/**
+ * Type declarations for @apache-superset/core/ui
+ *
+ * AUTO-GENERATED by scripts/generate-superset-components.mjs
+ * Do not edit manually - regenerate by running: yarn
generate:superset-components
+ */
+${Array.from(imports).join('\n')}
+
+${typeDeclarations.join('\n')}
+
+${componentDeclarations.join('\n')}
+`;
+}
+
/**
* Main function
*/
@@ -1396,8 +1540,53 @@ async function main() {
console.log(` ✓ ${category}/index`);
}
+ // Build JSON metadata for all components
+ console.log('\nBuilding component metadata JSON...');
+ const componentMetadata = [];
+ for (const component of components) {
+ const storyContent = fs.readFileSync(component.filePath, 'utf-8');
+ componentMetadata.push(buildComponentMetadata(component, storyContent));
+ }
+
+ // Build statistics
+ const byCategory = {};
+ for (const comp of componentMetadata) {
+ if (!byCategory[comp.category]) byCategory[comp.category] = 0;
+ byCategory[comp.category]++;
+ }
+ const jsonData = {
+ generated: new Date().toISOString(),
+ statistics: {
+ totalComponents: componentMetadata.length,
+ byCategory,
+ extensionCompatible: componentMetadata.filter(c =>
c.extensionCompatible).length,
+ withGallery: componentMetadata.filter(c => c.hasGallery).length,
+ withLiveExample: componentMetadata.filter(c => c.hasLiveExample).length,
+ },
+ components: componentMetadata,
+ };
+
+ // Ensure data directory exists and write JSON
+ const jsonDir = path.dirname(JSON_OUTPUT_PATH);
+ if (!fs.existsSync(jsonDir)) {
+ fs.mkdirSync(jsonDir, { recursive: true });
+ }
+ fs.writeFileSync(JSON_OUTPUT_PATH, JSON.stringify(jsonData, null, 2));
+ console.log(` ✓ components.json (${componentMetadata.length} components)`);
+
+ // Generate type declarations for extension-compatible components
+ const extensionComponents = components.filter(c => c.extensionCompatible);
+ if (extensionComponents.length > 0) {
+ if (!fs.existsSync(TYPES_OUTPUT_DIR)) {
+ fs.mkdirSync(TYPES_OUTPUT_DIR, { recursive: true });
+ }
+ const typesContent =
generateExtensionTypeDeclarations(extensionComponents);
+ fs.writeFileSync(TYPES_OUTPUT_PATH, typesContent);
+ console.log(` ✓ extension types (${extensionComponents.length}
components)`);
+ }
+
// Generate main overview
- const overviewContent = generateOverviewIndex(categories);
+ const overviewContent = generateOverviewIndex();
const overviewPath = path.join(OUTPUT_DIR, 'index.mdx');
fs.writeFileSync(overviewPath, overviewContent);
console.log(` ✓ index (overview)`);
diff --git a/docs/sidebarTutorials.js b/docs/sidebarTutorials.js
index 77839807ade..807b1976091 100644
--- a/docs/sidebarTutorials.js
+++ b/docs/sidebarTutorials.js
@@ -75,17 +75,6 @@ const sidebars = {
'extensions/architecture',
'extensions/dependencies',
'extensions/contribution-types',
- {
- type: 'category',
- label: 'Components',
- collapsed: true,
- items: [
- {
- type: 'autogenerated',
- dirName: 'extensions/components',
- },
- ],
- },
{
type: 'category',
label: 'Extension Points',
diff --git a/docs/src/components/databases/DatabaseIndex.tsx
b/docs/src/components/databases/DatabaseIndex.tsx
index 26f71522dfc..91c58964a31 100644
--- a/docs/src/components/databases/DatabaseIndex.tsx
+++ b/docs/src/components/databases/DatabaseIndex.tsx
@@ -496,6 +496,7 @@ const DatabaseIndex: React.FC<DatabaseIndexProps> = ({ data
}) => {
return (
<div className="database-index">
+ {/* Statistics Cards */}
{/* Statistics Cards */}
<Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
<Col xs={12} sm={6}>
diff --git a/docs/src/components/ui-components/ComponentIndex.tsx
b/docs/src/components/ui-components/ComponentIndex.tsx
new file mode 100644
index 00000000000..180a67ea2db
--- /dev/null
+++ b/docs/src/components/ui-components/ComponentIndex.tsx
@@ -0,0 +1,262 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React, { useState, useMemo } from 'react';
+import { Card, Row, Col, Statistic, Table, Tag, Input, Select } from 'antd';
+import {
+ AppstoreOutlined,
+ ApiOutlined,
+ PictureOutlined,
+ PlayCircleOutlined,
+ SearchOutlined,
+} from '@ant-design/icons';
+import type { ComponentData, ComponentEntry } from './types';
+
+interface ComponentIndexProps {
+ data: ComponentData;
+}
+
+const CATEGORY_COLORS: Record<string, string> = {
+ ui: 'blue',
+ 'design-system': 'green',
+ extension: 'purple',
+};
+
+const CATEGORY_LABELS: Record<string, string> = {
+ ui: 'Core',
+ 'design-system': 'Layout',
+ extension: 'Extension',
+};
+
+const ComponentIndex: React.FC<ComponentIndexProps> = ({ data }) => {
+ const [searchText, setSearchText] = useState('');
+ const [categoryFilter, setCategoryFilter] = useState<string | null>(null);
+
+ const { statistics, components } = data;
+
+ const filteredComponents = useMemo(() => {
+ return components
+ .filter((comp) => {
+ const matchesSearch =
+ !searchText ||
+ comp.name.toLowerCase().includes(searchText.toLowerCase()) ||
+ comp.description.toLowerCase().includes(searchText.toLowerCase()) ||
+ comp.package.toLowerCase().includes(searchText.toLowerCase());
+ const matchesCategory =
+ !categoryFilter || comp.category === categoryFilter;
+ return matchesSearch && matchesCategory;
+ })
+ .sort((a, b) => a.name.localeCompare(b.name));
+ }, [components, searchText, categoryFilter]);
+
+ const { categories, categoryCounts } = useMemo(() => {
+ const counts: Record<string, number> = {};
+ components.forEach((comp) => {
+ counts[comp.category] = (counts[comp.category] || 0) + 1;
+ });
+ return {
+ categories: Object.keys(counts).sort(),
+ categoryCounts: counts,
+ };
+ }, [components]);
+
+ const columns = [
+ {
+ title: 'Component',
+ dataIndex: 'name',
+ key: 'name',
+ sorter: (a: ComponentEntry, b: ComponentEntry) =>
+ a.name.localeCompare(b.name),
+ defaultSortOrder: 'ascend' as const,
+ render: (name: string, record: ComponentEntry) => (
+ <div>
+ <a href={`/${record.docPath}`}>
+ <strong>{name}</strong>
+ </a>
+ {record.description && (
+ <div style={{ fontSize: '12px', color: '#666' }}>
+ {record.description.slice(0, 100)}
+ {record.description.length > 100 ? '...' : ''}
+ </div>
+ )}
+ </div>
+ ),
+ },
+ {
+ title: 'Category',
+ dataIndex: 'category',
+ key: 'category',
+ width: 120,
+ filters: categories.map((cat) => ({
+ text: CATEGORY_LABELS[cat] || cat,
+ value: cat,
+ })),
+ onFilter: (value: React.Key | boolean, record: ComponentEntry) =>
+ record.category === value,
+ render: (cat: string) => (
+ <Tag color={CATEGORY_COLORS[cat] || 'default'}>
+ {CATEGORY_LABELS[cat] || cat}
+ </Tag>
+ ),
+ },
+ {
+ title: 'Package',
+ dataIndex: 'package',
+ key: 'package',
+ width: 220,
+ render: (pkg: string) => (
+ <code style={{ fontSize: '12px' }}>{pkg}</code>
+ ),
+ },
+ {
+ title: 'Tags',
+ key: 'tags',
+ width: 280,
+ filters: [
+ { text: 'Extension Compatible', value: 'extension' },
+ { text: 'Gallery', value: 'gallery' },
+ { text: 'Live Demo', value: 'demo' },
+ ],
+ onFilter: (value: React.Key | boolean, record: ComponentEntry) => {
+ switch (value) {
+ case 'extension':
+ return record.extensionCompatible;
+ case 'gallery':
+ return record.hasGallery;
+ case 'demo':
+ return record.hasLiveExample;
+ default:
+ return true;
+ }
+ },
+ render: (_: unknown, record: ComponentEntry) => (
+ <div style={{ display: 'flex', gap: '4px', flexWrap: 'wrap' }}>
+ {record.extensionCompatible && (
+ <Tag color="purple">Extension Compatible</Tag>
+ )}
+ {record.hasGallery && <Tag color="cyan">Gallery</Tag>}
+ {record.hasLiveExample && <Tag color="green">Demo</Tag>}
+ </div>
+ ),
+ },
+ {
+ title: 'Props',
+ dataIndex: 'propsCount',
+ key: 'propsCount',
+ width: 80,
+ sorter: (a: ComponentEntry, b: ComponentEntry) =>
+ a.propsCount - b.propsCount,
+ render: (count: number) => (
+ <span style={{ color: count > 0 ? '#1890ff' : '#999' }}>{count}</span>
+ ),
+ },
+ ];
+
+ return (
+ <div className="component-index">
+ <Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
+ <Col xs={12} sm={6}>
+ <Card>
+ <Statistic
+ title="Total Components"
+ value={statistics.totalComponents}
+ prefix={<AppstoreOutlined />}
+ />
+ </Card>
+ </Col>
+ <Col xs={12} sm={6}>
+ <Card>
+ <Statistic
+ title="Extension Compatible"
+ value={statistics.extensionCompatible}
+ prefix={<ApiOutlined />}
+ />
+ </Card>
+ </Col>
+ <Col xs={12} sm={6}>
+ <Card>
+ <Statistic
+ title="With Gallery"
+ value={statistics.withGallery}
+ prefix={<PictureOutlined />}
+ />
+ </Card>
+ </Col>
+ <Col xs={12} sm={6}>
+ <Card>
+ <Statistic
+ title="With Live Demo"
+ value={statistics.withLiveExample}
+ prefix={<PlayCircleOutlined />}
+ />
+ </Card>
+ </Col>
+ </Row>
+
+ <Row gutter={[16, 16]} style={{ marginBottom: 16 }}>
+ <Col xs={24} sm={12}>
+ <Input
+ placeholder="Search components..."
+ prefix={<SearchOutlined />}
+ value={searchText}
+ onChange={(e) => setSearchText(e.target.value)}
+ allowClear
+ />
+ </Col>
+ <Col xs={24} sm={12}>
+ <Select
+ placeholder="Filter by category"
+ style={{ width: '100%' }}
+ value={categoryFilter}
+ onChange={setCategoryFilter}
+ allowClear
+ options={categories.map((cat) => ({
+ label: (
+ <span>
+ <Tag
+ color={CATEGORY_COLORS[cat] || 'default'}
+ style={{ marginRight: 8 }}
+ >
+ {categoryCounts[cat] || 0}
+ </Tag>
+ {CATEGORY_LABELS[cat] || cat}
+ </span>
+ ),
+ value: cat,
+ }))}
+ />
+ </Col>
+ </Row>
+
+ <Table
+ dataSource={filteredComponents}
+ columns={columns}
+ rowKey="name"
+ pagination={{
+ defaultPageSize: 20,
+ showSizeChanger: true,
+ showTotal: (total) => `${total} components`,
+ }}
+ size="middle"
+ />
+ </div>
+ );
+};
+
+export default ComponentIndex;
diff --git a/docs/babel.config.js b/docs/src/components/ui-components/index.ts
similarity index 75%
rename from docs/babel.config.js
rename to docs/src/components/ui-components/index.ts
index 61032e678a4..2081775d7dc 100644
--- a/docs/babel.config.js
+++ b/docs/src/components/ui-components/index.ts
@@ -1,4 +1,3 @@
-/* eslint-env node */
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -18,15 +17,5 @@
* under the License.
*/
-module.exports = {
- presets: [
- [
- require.resolve('@docusaurus/core/lib/babel/preset'),
- {
- runtime: 'automatic',
- importSource: '@emotion/react',
- },
- ],
- ],
- plugins: ['@emotion/babel-plugin'],
-};
+export { default as ComponentIndex } from './ComponentIndex';
+export * from './types';
diff --git a/docs/src/types/apache-superset-core/index.d.ts
b/docs/src/components/ui-components/types.ts
similarity index 55%
copy from docs/src/types/apache-superset-core/index.d.ts
copy to docs/src/components/ui-components/types.ts
index 5650b85bb2c..f4fb082b065 100644
--- a/docs/src/types/apache-superset-core/index.d.ts
+++ b/docs/src/components/ui-components/types.ts
@@ -17,15 +17,32 @@
* under the License.
*/
-/**
- * Type declarations for @apache-superset/core/ui
- *
- * AUTO-GENERATED by scripts/generate-extension-components.mjs
- * Do not edit manually - regenerate by running: yarn
generate:extension-components
- */
-import type { AlertProps as AntdAlertProps } from 'antd/es/alert';
-import type { PropsWithChildren, FC } from 'react';
+export interface ComponentEntry {
+ name: string;
+ category: string;
+ categoryLabel: string;
+ description: string;
+ importPath: string;
+ package: string;
+ extensionCompatible: boolean;
+ propsCount: number;
+ controlsCount: number;
+ hasGallery: boolean;
+ hasLiveExample: boolean;
+ docPath: string;
+ storyFile: string;
+}
-export type AlertProps = PropsWithChildren<Omit<AntdAlertProps, 'children'>>;
+export interface ComponentStatistics {
+ totalComponents: number;
+ byCategory: Record<string, number>;
+ extensionCompatible: number;
+ withGallery: number;
+ withLiveExample: number;
+}
-export const Alert: FC<AlertProps>;
+export interface ComponentData {
+ generated: string;
+ statistics: ComponentStatistics;
+ components: ComponentEntry[];
+}
diff --git a/docs/src/data/databases.json b/docs/src/data/databases.json
index ed8106d2b9b..38914dd7868 100644
--- a/docs/src/data/databases.json
+++ b/docs/src/data/databases.json
@@ -1,5 +1,5 @@
{
- "generated": "2026-02-26T01:18:11.347Z",
+ "generated": "2026-02-24T20:28:17.222Z",
"statistics": {
"totalDatabases": 72,
"withDocumentation": 72,
@@ -751,14 +751,14 @@
"OPEN_SOURCE"
],
"pypi_packages": [
- "clickhouse-connect>=0.13.0"
+ "clickhouse-connect>=0.6.8"
],
"connection_string":
"clickhousedb://{username}:{password}@{host}:{port}/{database}",
"default_port": 8123,
"drivers": [
{
"name": "clickhouse-connect (Recommended)",
- "pypi_package": "clickhouse-connect>=0.13.0",
+ "pypi_package": "clickhouse-connect>=0.6.8",
"connection_string":
"clickhousedb://{username}:{password}@{host}:{port}/{database}",
"is_recommended": true,
"notes": "Official ClickHouse Python driver with native protocol
support."
@@ -781,7 +781,7 @@
"connection_string": "clickhousedb://localhost/default"
}
],
- "install_instructions": "echo \"clickhouse-connect>=0.13.0\" >>
./docker/requirements-local.txt",
+ "install_instructions": "echo \"clickhouse-connect>=0.6.8\" >>
./docker/requirements-local.txt",
"compatible_databases": [
{
"name": "ClickHouse Cloud",
@@ -794,7 +794,7 @@
"HOSTED_OPEN_SOURCE"
],
"pypi_packages": [
- "clickhouse-connect>=0.13.0"
+ "clickhouse-connect>=0.6.8"
],
"connection_string":
"clickhousedb://{username}:{password}@{host}:8443/{database}?secure=true",
"parameters": {
@@ -816,7 +816,7 @@
"HOSTED_OPEN_SOURCE"
],
"pypi_packages": [
- "clickhouse-connect>=0.13.0"
+ "clickhouse-connect>=0.6.8"
],
"connection_string":
"clickhousedb://{username}:{password}@{host}/{database}?secure=true",
"docs_url": "https://docs.altinity.com/"
diff --git a/docs/src/shims/superset-ui-core.ts
b/docs/src/shims/superset-ui-core.ts
new file mode 100644
index 00000000000..29bf85e34f5
--- /dev/null
+++ b/docs/src/shims/superset-ui-core.ts
@@ -0,0 +1,57 @@
+/**
+ * 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.
+ */
+
+/**
+ * Lightweight shim for @superset-ui/core.
+ *
+ * Components in superset-ui-core/src/components/ self-reference the parent
+ * package for utility imports. This shim re-exports only the specific
+ * utilities they need, avoiding the full barrel file which pulls in heavy
+ * dependencies (d3, query engine, color scales) that cause OOM during the
+ * docs build.
+ *
+ * When adding exports here, verify the source file's imports don't cascade
+ * into heavy modules (connection/SupersetClientClass, query/types, etc.).
+ * Only add leaf-level utilities with minimal transitive dependencies.
+ *
+ * Exports that can't be shimmed safely (e.g. getClientErrorObject, which
+ * pulls in connection/types → SupersetClientClass) will produce
+ * ESModulesLinkingWarnings at build time — these are harmless.
+ */
+
+// Paths relative to docs/src/shims/ →
superset-frontend/packages/superset-ui-core/src/
+
+// utils — leaf modules with no heavy transitive deps
+export { default as ensureIsArray } from
'../../../superset-frontend/packages/superset-ui-core/src/utils/ensureIsArray';
+export {
+ safeHtmlSpan,
+ isProbablyHTML,
+ isJsonString,
+} from '../../../superset-frontend/packages/superset-ui-core/src/utils/html';
+
+// hooks
+export { usePrevious } from
'../../../superset-frontend/packages/superset-ui-core/src/hooks/usePrevious/usePrevious';
+export { useTruncation } from
'../../../superset-frontend/packages/superset-ui-core/src/hooks/useTruncation';
+
+// time-format
+export { getTimeFormatter } from
'../../../superset-frontend/packages/superset-ui-core/src/time-format/TimeFormatterRegistrySingleton';
+export { default as TimeFormats } from
'../../../superset-frontend/packages/superset-ui-core/src/time-format/TimeFormats';
+
+// color
+export { hexToRgb } from
'../../../superset-frontend/packages/superset-ui-core/src/color/utils';
diff --git a/docs/src/types/apache-superset-core/index.d.ts
b/docs/src/types/apache-superset-core/index.d.ts
index 5650b85bb2c..6e3a121e1b6 100644
--- a/docs/src/types/apache-superset-core/index.d.ts
+++ b/docs/src/types/apache-superset-core/index.d.ts
@@ -20,8 +20,8 @@
/**
* Type declarations for @apache-superset/core/ui
*
- * AUTO-GENERATED by scripts/generate-extension-components.mjs
- * Do not edit manually - regenerate by running: yarn
generate:extension-components
+ * AUTO-GENERATED by scripts/generate-superset-components.mjs
+ * Do not edit manually - regenerate by running: yarn
generate:superset-components
*/
import type { AlertProps as AntdAlertProps } from 'antd/es/alert';
import type { PropsWithChildren, FC } from 'react';
diff --git a/docs/src/webpack.extend.ts b/docs/src/webpack.extend.ts
index e3079ee7e73..0a96ce2d1f5 100644
--- a/docs/src/webpack.extend.ts
+++ b/docs/src/webpack.extend.ts
@@ -102,7 +102,7 @@ export default function webpackExtendPlugin(): Plugin<void>
{
return {
devtool: isDev ? false : config.devtool,
cache: {
- type: 'filesystem',
+ type: 'filesystem' as const,
buildDependencies: {
config: [__filename],
},
@@ -129,10 +129,15 @@ export default function webpackExtendPlugin():
Plugin<void> {
'react-dom': path.resolve(__dirname, '../node_modules/react-dom'),
// Allow importing from superset-frontend
src: path.resolve(__dirname, '../../superset-frontend/src'),
- // '@superset-ui/core': path.resolve(
- // __dirname,
- // '../../superset-frontend/packages/superset-ui-core',
- // ),
+ // Lightweight shim for @superset-ui/core that re-exports only the
+ // utilities needed by components (ensureIsArray, usePrevious,
etc.).
+ // Avoids pulling in the full barrel which includes d3, color,
query
+ // modules and causes OOM. Required for Rspack which is stricter
about
+ // module resolution than webpack.
+ '@superset-ui/core$': path.resolve(
+ __dirname,
+ './shims/superset-ui-core.ts',
+ ),
// Add aliases for our components to make imports easier
'@docs/components': path.resolve(__dirname, '../src/components'),
'@superset/components': path.resolve(
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
index b29d41ca6de..cdfed3f9f56 100644
--- a/docs/tsconfig.json
+++ b/docs/tsconfig.json
@@ -14,7 +14,7 @@
"paths": {
"@superset-ui/core":
["../superset-frontend/packages/superset-ui-core/src"],
"@superset-ui/core/*":
["../superset-frontend/packages/superset-ui-core/src/*"],
- // Types for @apache-superset/core/ui are auto-generated by
scripts/generate-extension-components.mjs
+ // Types for @apache-superset/core/ui are auto-generated by
scripts/generate-superset-components.mjs
// Runtime resolution uses webpack alias pointing to actual source (see
src/webpack.extend.ts)
// Using /ui path matches the established pattern used throughout the
Superset codebase
"@apache-superset/core/ui": ["./src/types/apache-superset-core"],
@@ -29,6 +29,7 @@
"exclude": [
"node_modules",
"../superset-frontend/**/*",
- "src/webpack.extend.ts"
+ "src/webpack.extend.ts",
+ "src/shims/**"
]
}
diff --git a/docs/yarn.lock b/docs/yarn.lock
index 5169302763f..316f4f7755c 100644
--- a/docs/yarn.lock
+++ b/docs/yarn.lock
@@ -1695,6 +1695,21 @@
postcss-sort-media-queries "^5.2.0"
tslib "^2.6.0"
+"@docusaurus/faster@^3.9.2":
+ version "3.9.2"
+ resolved
"https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.9.2.tgz#47b69f39ed935fdcc8dc03896274fca29056e962"
+ integrity
sha512-DEVIwhbrZZ4ir31X+qQNEQqDWkgCJUV6kiPPAd2MGTY8n5/n0c4B8qA5k1ipF2izwH00JEf0h6Daaut71zzkyw==
+ dependencies:
+ "@docusaurus/types" "3.9.2"
+ "@rspack/core" "^1.5.0"
+ "@swc/core" "^1.7.39"
+ "@swc/html" "^1.13.5"
+ browserslist "^4.24.2"
+ lightningcss "^1.27.0"
+ swc-loader "^0.2.6"
+ tslib "^2.6.0"
+ webpack "^5.95.0"
+
"@docusaurus/[email protected]":
version "3.9.2"
resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz"
@@ -2104,6 +2119,28 @@
utility-types "^3.10.0"
webpack "^5.88.1"
+"@emnapi/core@^1.5.0":
+ version "1.8.1"
+ resolved
"https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349"
+ integrity
sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==
+ dependencies:
+ "@emnapi/wasi-threads" "1.1.0"
+ tslib "^2.4.0"
+
+"@emnapi/runtime@^1.5.0":
+ version "1.8.1"
+ resolved
"https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5"
+ integrity
sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==
+ dependencies:
+ tslib "^2.4.0"
+
+"@emnapi/[email protected]":
+ version "1.1.0"
+ resolved
"https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf"
+ integrity
sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==
+ dependencies:
+ tslib "^2.4.0"
+
"@emotion/babel-plugin@^11.13.5":
version "11.13.5"
resolved
"https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
@@ -2679,6 +2716,58 @@
dependencies:
langium "3.3.1"
+"@module-federation/[email protected]":
+ version "0.22.0"
+ resolved
"https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz#31ccc990dc240d73912ba7bd001f7e35ac751992"
+ integrity
sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==
+
+"@module-federation/[email protected]":
+ version "0.22.0"
+ resolved
"https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz#7321ec792bb7d1d22bee6162ec43564b769d2a3c"
+ integrity
sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==
+ dependencies:
+ "@module-federation/error-codes" "0.22.0"
+ "@module-federation/sdk" "0.22.0"
+
+"@module-federation/[email protected]":
+ version "0.22.0"
+ resolved
"https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz#36f2a7cb267af208a9d1a237fe9a71b4bf31431e"
+ integrity
sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==
+ dependencies:
+ "@module-federation/runtime" "0.22.0"
+ "@module-federation/webpack-bundler-runtime" "0.22.0"
+
+"@module-federation/[email protected]":
+ version "0.22.0"
+ resolved
"https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.22.0.tgz#f789c9ef40d846d110711c8221ecc0ad938d43d8"
+ integrity
sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==
+ dependencies:
+ "@module-federation/error-codes" "0.22.0"
+ "@module-federation/runtime-core" "0.22.0"
+ "@module-federation/sdk" "0.22.0"
+
+"@module-federation/[email protected]":
+ version "0.22.0"
+ resolved
"https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.22.0.tgz#6ad4c1de85a900c3c80ff26cb87cce253e3a2770"
+ integrity
sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==
+
+"@module-federation/[email protected]":
+ version "0.22.0"
+ resolved
"https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz#dcbe8f972d722fe278e6a7c21988d4bee53d401d"
+ integrity
sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==
+ dependencies:
+ "@module-federation/runtime" "0.22.0"
+ "@module-federation/sdk" "0.22.0"
+
+"@napi-rs/[email protected]":
+ version "1.0.7"
+ resolved
"https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c"
+ integrity
sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==
+ dependencies:
+ "@emnapi/core" "^1.5.0"
+ "@emnapi/runtime" "^1.5.0"
+ "@tybys/wasm-util" "^0.10.1"
+
"@nodelib/[email protected]":
version "2.1.5"
resolved
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
@@ -2986,7 +3075,15 @@
dependencies:
"@babel/runtime" "^7.18.0"
-"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3",
"@rc-component/motion@^1.1.4", "@rc-component/motion@^1.3.1":
+"@rc-component/motion@^1.0.0", "@rc-component/motion@^1.1.3",
"@rc-component/motion@^1.1.4":
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/@rc-component/motion/-/motion-1.1.6.tgz"
+ integrity
sha512-aEQobs/YA0kqRvHIPjQvOytdtdRVyhf/uXAal4chBjxDu6odHckExJzjn2D+Ju1aKK6hx3pAs6BXdV9+86xkgQ==
+ dependencies:
+ "@rc-component/util" "^1.2.0"
+ clsx "^2.1.1"
+
+"@rc-component/motion@^1.3.1":
version "1.3.1"
resolved
"https://registry.yarnpkg.com/@rc-component/motion/-/motion-1.3.1.tgz#1e56b06841ee677261251e6e69fedc8d73e65b22"
integrity
sha512-Wo1mkd0tCcHtvYvpPOmlYJz546z16qlsiwaygmW7NPJpOZOF9GBjhGzdzZSsC2lEJ1IUkWLF4gMHlRA1aSA+Yw==
@@ -3087,7 +3184,18 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/select@~1.6.0", "@rc-component/select@~1.6.12":
+"@rc-component/select@~1.6.0":
+ version "1.6.5"
+ resolved
"https://registry.yarnpkg.com/@rc-component/select/-/select-1.6.5.tgz#69276239c6ac0884a67597961b0224c4ad0bc4ca"
+ integrity
sha512-Cx+/OYEorXlPQ6ZFDro3HbalPZLlJWagvGtl8DGYO4losXM6gw43qbsxWqU1c3XOQVIOUDBlr7dSksSNMj8kXg==
+ dependencies:
+ "@rc-component/overflow" "^1.0.0"
+ "@rc-component/trigger" "^3.0.0"
+ "@rc-component/util" "^1.3.0"
+ "@rc-component/virtual-list" "^1.0.1"
+ clsx "^2.1.1"
+
+"@rc-component/select@~1.6.12":
version "1.6.12"
resolved
"https://registry.yarnpkg.com/@rc-component/select/-/select-1.6.12.tgz#24312b31aad2a78ce1ec0062b15f56428bddab8f"
integrity
sha512-jYXAglYdOb54BrpWAcjjhdBP16NyCv/HbEaWFMbEHZQAJVmGHPAtmBqbFuPPuvInAVsIwLbCj4Agag9udOamiQ==
@@ -3273,6 +3381,88 @@
redux-thunk "^3.1.0"
reselect "^5.1.0"
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.6.tgz#10144f3841be88ea25c71a537df6b038ae84a87a"
+ integrity
sha512-NZ9AWtB1COLUX1tA9HQQvWpTy07NSFfKBU8A6ylWd5KH8AePZztpNgLLAVPTuNO4CZXYpwcoclf8jG/luJcQdQ==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.6.tgz#70588e30e1fdcd3149e09fe6798eb95609ad814b"
+ integrity
sha512-J2g6xk8ZS7uc024dNTGTHxoFzFovAZIRixUG7PiciLKTMP78svbSSWrmW6N8oAsAkzYfJWwQpVgWfFNRHvYxSw==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.6.tgz#322e7fe54fccefd57603d4730130bef311b8dd60"
+ integrity
sha512-eQfcsaxhFrv5FmtaA7+O1F9/2yFDNIoPZzV/ZvqvFz5bBXVc4FAm/1fVpBg8Po/kX1h0chBc7Xkpry3cabFW8w==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.6.tgz#4444dfe045323f341c7c82fdb7dce5809fea51c1"
+ integrity
sha512-DfQXKiyPIl7i1yECHy4eAkSmlUzzsSAbOjgMuKn7pudsWf483jg0UUYutNgXSlBjc/QSUp7906Cg8oty9OfwPA==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.6.tgz#c31bf72789c71eeee75cd3cb06d6a6e5449e1bd1"
+ integrity
sha512-NdA+2X3lk2GGrMMnTGyYTzM3pn+zNjaqXqlgKmFBXvjfZqzSsKq3pdD1KHZCd5QHN+Fwvoszj0JFsquEVhE1og==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.6.tgz#20f8ad786d581af7a7c2802220b533ce531fb4c6"
+ integrity
sha512-rEy6MHKob02t/77YNgr6dREyJ0e0tv1X6Xsg8Z5E7rPXead06zefUbfazj4RELYySWnM38ovZyJAkPx/gOn3VA==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.6.tgz#76ae0f9f584a054e109b83ec02516ce75dcff8e6"
+ integrity
sha512-YupOrz0daSG+YBbCIgpDgzfMM38YpChv+afZpaxx5Ml7xPeAZIIdgWmLHnQ2rts73N2M1NspAiBwV00Xx0N4Vg==
+ dependencies:
+ "@napi-rs/wasm-runtime" "1.0.7"
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.6.tgz#4e7f70338dfcc8efa3a67d72064562eb9f0662cb"
+ integrity
sha512-INj7aVXjBvlZ84kEhSK4kJ484ub0i+BzgnjDWOWM1K+eFYDZjLdAsQSS3fGGXwVc3qKbPIssFfnftATDMTEJHQ==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.6.tgz#efeb807c624536361467dfec0898705213fbd997"
+ integrity
sha512-lXGvC+z67UMcw58In12h8zCa9IyYRmuptUBMItQJzu+M278aMuD1nETyGLL7e4+OZ2lvrnnBIcjXN1hfw2yRzw==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.6.tgz#48014313c224e9fce31d02134c81525a7cb7f891"
+ integrity
sha512-zeUxEc0ZaPpmaYlCeWcjSJUPuRRySiSHN23oJ2Xyw0jsQ01Qm4OScPdr0RhEOFuK/UE+ANyRtDo4zJsY52Hadw==
+
+"@rspack/[email protected]":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/binding/-/binding-1.7.6.tgz#d61b241c0dbb4e395f7753de74a2fe760891d4f2"
+ integrity
sha512-/NrEcfo8Gx22hLGysanrV6gHMuqZSxToSci/3M4kzEQtF5cPjfOv5pqeLK/+B6cr56ul/OmE96cCdWcXeVnFjQ==
+ optionalDependencies:
+ "@rspack/binding-darwin-arm64" "1.7.6"
+ "@rspack/binding-darwin-x64" "1.7.6"
+ "@rspack/binding-linux-arm64-gnu" "1.7.6"
+ "@rspack/binding-linux-arm64-musl" "1.7.6"
+ "@rspack/binding-linux-x64-gnu" "1.7.6"
+ "@rspack/binding-linux-x64-musl" "1.7.6"
+ "@rspack/binding-wasm32-wasi" "1.7.6"
+ "@rspack/binding-win32-arm64-msvc" "1.7.6"
+ "@rspack/binding-win32-ia32-msvc" "1.7.6"
+ "@rspack/binding-win32-x64-msvc" "1.7.6"
+
+"@rspack/core@^1.5.0":
+ version "1.7.6"
+ resolved
"https://registry.yarnpkg.com/@rspack/core/-/core-1.7.6.tgz#d43a1c4103248cbe4011902906c6d7427b80f3a6"
+ integrity
sha512-Iax6UhrfZqJajA778c1d5DBFbSIqPOSrI34kpNIiNpWd8Jq7mFIa+Z60SQb5ZQDZuUxcCZikjz5BxinFjTkg7Q==
+ dependencies:
+ "@module-federation/runtime-tools" "0.22.0"
+ "@rspack/binding" "1.7.6"
+ "@rspack/lite-tapable" "1.1.0"
+
+"@rspack/[email protected]":
+ version "1.1.0"
+ resolved
"https://registry.yarnpkg.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz#3cfdafeed01078e116bd4f191b684c8b484de425"
+ integrity
sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==
+
"@saucelabs/theme-github-codeblock@^0.3.0":
version "0.3.0"
resolved
"https://registry.npmjs.org/@saucelabs/theme-github-codeblock/-/theme-github-codeblock-0.3.0.tgz"
@@ -4088,80 +4278,217 @@
dependencies:
apg-lite "^1.0.4"
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.17.tgz#7421beb8dc0277d809ed0cbf691b1ac4f4c9d613"
- integrity
sha512-eB9qdyt4E60323IS0rgV/rd79DJ+YWSyIKi+sT1dlIgR3ns4xlBiunREM3lVH0FKcUbhttiBvdVubT4QoOuZ+w==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.17.tgz#2994c4545725432a98405c9d243c115650933672"
- integrity
sha512-k1TZARYs8947jJpSioqcPrusz+wEeABF4iiSdwcSyQh2rIUdIEk5FOyaqJASFPJ6dZfx7ZVOyjtDATVAegs2/Q==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.17.tgz#3abe70d7aa4cedd366b516244ee1e8101d9c5a1a"
- integrity
sha512-p6282NQZo5bzx0wphz1ETGjhcRB9CN+/XUAjQwApyoyX9iCloI5IT/RC3vjbflo42g8RPTxUTaItAO0hlLSesQ==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.17.tgz#cfe8829e03a38e0579530e2d9a73a7070011a1c8"
- integrity
sha512-TGnDS4ejy8y9jqxXqZCyA+DvFc64nXUHS9rxdyeJ9B9uyIdtKVhBrA2xfghYRS/sSPSyHZ0yu89NxBICvONH+A==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.17.tgz#a08d724ebba05821dcb4d0de130a887728c6a763"
- integrity
sha512-D0/6Hj4CkgSTTahtlGxv9IDsLTuvQz30mkZEMDp8TqwYhCL8AomznkibwlQU8HtY4q/dqd1OGRPH+FmNb4BBEA==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.17.tgz#08feaa091f37ef0fa6d3967008701ee1db66ea73"
- integrity
sha512-1s2OFsg6DeRkWU7c+PIfIHZsFCbiZ34akXFHrg7KjpF8zIvpHZNoUUZimoWEwcB6GquXSkAO+1b5KpG5nusTeQ==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.17.tgz#2e694f1e6a252967bb7b3ca71eafbb31f5043259"
- integrity
sha512-gtxGMGYtRWWmCcgx6xM2Yos43uiE/j8kZwkeL/LNGG9zM0tatd23NsfL9PnQJ45hY7QZ+dx2rM68e4ArgG4kJg==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.17.tgz#4affd877dea00139e5d39c30a9e8b2a16a352f83"
- integrity
sha512-gxi+/Miytez/O9vJ/QiheIivA3oWZjPp9nJu3VmAfLMWUzcZORMwgaI1ygtDTLjz7CzcwlGMJz/Ab66Y5DfNpg==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.17.tgz#129ab225d231c36fa5356b8087756dbc64bebbf3"
- integrity
sha512-KUsRqNbTp7SpNK0T9m4+i8GlngzNjwb69a3ttKA6XJ5r6Pewm+NSYji93pNkawXIivbWY2jhvceGMAyd+4hWaQ==
-
-"@swc/[email protected]":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.17.tgz#cab85cb07b1609c43d9893e5fc3a07767e53dd03"
- integrity
sha512-zqtEGE0/rTKvEC5sOtpANLHeWEPjsTD4/rwpUxo6ymztcLI/Z+L9Wi9xQvIGmLTUih1gvNZcAwROqdfRP3oAWQ==
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.13.tgz#f60ff48cb93066b83405074015eb6373ea0cdd77"
+ integrity
sha512-ztXusRuC5NV2w+a6pDhX13CGioMLq8CjX5P4XgVJ21ocqz9t19288Do0y8LklplDtwcEhYGTNdMbkmUT7+lDTg==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.18.tgz#fb487392f7bbe3179166b9b0d128916e39a627af"
+ integrity
sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.13.tgz#3838c08653ac53a6508cdc34bfa191281da4ed26"
+ integrity
sha512-cVifxQUKhaE7qcO/y9Mq6PEhoyvN9tSLzCnnFZ4EIabFHBuLtDDO6a+vLveOy98hAs5Qu1+bb5Nv0oa1Pihe3Q==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.18.tgz#0e11fb0a80ebd56cb4417138a938ffc789ead492"
+ integrity
sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.13.tgz#9308b156fae3fe5d12684b86af31ada4255066fc"
+ integrity
sha512-t+xxEzZ48enl/wGGy7SRYd7kImWQ/+wvVFD7g5JZo234g6/QnIgZ+YdfIyjHB+ZJI3F7a2IQHS7RNjxF29UkWw==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.18.tgz#e7cac4b46d66dfd6b0fedea68877a5678fcf3579"
+ integrity
sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.13.tgz#b150d6091e2bb3cf97dc9712a711d3ba025811a9"
+ integrity
sha512-VndeGvKmTXFn6AGwjy0Kg8i7HccOCE7Jt/vmZwRxGtOfNZM1RLYRQ7MfDLo6T0h1Bq6eYzps3L5Ma4zBmjOnOg==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz#ca888f41be89887f9f6b4afd1cc38a1a596a655d"
+ integrity
sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.13.tgz#35dd5382554096118ecd1db2928e1f71b56aa41a"
+ integrity
sha512-SmZ9m+XqCB35NddHCctvHFLqPZDAs5j8IgD36GoutufDJmeq2VNfgk5rQoqNqKmAK3Y7iFdEmI76QoHIWiCLyw==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz#292bb894cf08be522487897f6e2a616cbdd6198a"
+ integrity
sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.13.tgz#03f89bbdce8f07a1bc02a3ef1c93a5b4e81aef2e"
+ integrity
sha512-5rij+vB9a29aNkHq72EXI2ihDZPszJb4zlApJY4aCC/q6utgqFA6CkrfTfIb+O8hxtG3zP5KERETz8mfFK6A0A==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.18.tgz#2241fd6a01d88bac32334812660d80ebae88fd12"
+ integrity
sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.13.tgz#27ae66914125bf35724e43bb06b856afed39770c"
+ integrity
sha512-OlSlaOK9JplQ5qn07WiBLibkOw7iml2++ojEXhhR3rbWrNEKCD7sd8+6wSavsInyFdw4PhLA+Hy6YyDBIE23Yw==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.18.tgz#7d70f02a383d9dbae18b0d2906ee8b49dfb0b533"
+ integrity
sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.13.tgz#39776831949a53754d8f62e4730ac9430d1671f3"
+ integrity
sha512-zwQii5YVdsfG8Ti9gIKgBKZg8qMkRZxl+OlYWUT5D93Jl4NuNBRausP20tfEkQdAPSRrMCSUZBM6FhW7izAZRg==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.18.tgz#6ea2b41d224a5ac84e1addf19fbc584e49698b08"
+ integrity
sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.13.tgz#995c45c9fd86d9959bc1a7275c4e60ac4efcc12f"
+ integrity
sha512-hYXvyVVntqRlYoAIDwNzkS3tL2ijP3rxyWQMNKaxcCxxkCDto/w3meOK/OB6rbQSkNw0qTUcBfU9k+T0ptYdfQ==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.18.tgz#0c498802837ef53452c744964cac1391eb889e4d"
+ integrity
sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.13.tgz#b329aec8bb5e84bab49c8f250ebb27f6c27dc213"
+ integrity
sha512-XTzKs7c/vYCcjmcwawnQvlHHNS1naJEAzcBckMI5OJlnrcgW8UtcX9NHFYvNjGtXuKv0/9KvqL4fuahdvlNGKw==
+
+"@swc/[email protected]":
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.18.tgz#878b48b38225680aad1e486880a6835461519e53"
+ integrity
sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==
"@swc/core@^1.15.17":
- version "1.15.17"
- resolved
"https://registry.yarnpkg.com/@swc/core/-/core-1.15.17.tgz#41685c478cce11bc787a5f41c6cd7e037743dd78"
- integrity
sha512-Mu3eOrYlkdQPl7yqotNckitTr6FZ0yd7mlWIBEzK+EGIyybgMENJHmbS2DeA7BMleJiBElP6ke+Nz93pkKmKJw==
+ version "1.15.18"
+ resolved
"https://registry.yarnpkg.com/@swc/core/-/core-1.15.18.tgz#9eed29c0267d2c262391d4a2e75a3978e3f9dc74"
+ integrity
sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==
+ dependencies:
+ "@swc/counter" "^0.1.3"
+ "@swc/types" "^0.1.25"
+ optionalDependencies:
+ "@swc/core-darwin-arm64" "1.15.18"
+ "@swc/core-darwin-x64" "1.15.18"
+ "@swc/core-linux-arm-gnueabihf" "1.15.18"
+ "@swc/core-linux-arm64-gnu" "1.15.18"
+ "@swc/core-linux-arm64-musl" "1.15.18"
+ "@swc/core-linux-x64-gnu" "1.15.18"
+ "@swc/core-linux-x64-musl" "1.15.18"
+ "@swc/core-win32-arm64-msvc" "1.15.18"
+ "@swc/core-win32-ia32-msvc" "1.15.18"
+ "@swc/core-win32-x64-msvc" "1.15.18"
+
+"@swc/core@^1.7.39":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/core/-/core-1.15.13.tgz#19b4117a76576f46b28199ac2f75cad5bc9cdde4"
+ integrity
sha512-0l1gl/72PErwUZuavcRpRAQN9uSst+Nk++niC5IX6lmMWpXoScYx3oq/narT64/sKv/eRiPTaAjBFGDEQiWJIw==
dependencies:
"@swc/counter" "^0.1.3"
"@swc/types" "^0.1.25"
optionalDependencies:
- "@swc/core-darwin-arm64" "1.15.17"
- "@swc/core-darwin-x64" "1.15.17"
- "@swc/core-linux-arm-gnueabihf" "1.15.17"
- "@swc/core-linux-arm64-gnu" "1.15.17"
- "@swc/core-linux-arm64-musl" "1.15.17"
- "@swc/core-linux-x64-gnu" "1.15.17"
- "@swc/core-linux-x64-musl" "1.15.17"
- "@swc/core-win32-arm64-msvc" "1.15.17"
- "@swc/core-win32-ia32-msvc" "1.15.17"
- "@swc/core-win32-x64-msvc" "1.15.17"
+ "@swc/core-darwin-arm64" "1.15.13"
+ "@swc/core-darwin-x64" "1.15.13"
+ "@swc/core-linux-arm-gnueabihf" "1.15.13"
+ "@swc/core-linux-arm64-gnu" "1.15.13"
+ "@swc/core-linux-arm64-musl" "1.15.13"
+ "@swc/core-linux-x64-gnu" "1.15.13"
+ "@swc/core-linux-x64-musl" "1.15.13"
+ "@swc/core-win32-arm64-msvc" "1.15.13"
+ "@swc/core-win32-ia32-msvc" "1.15.13"
+ "@swc/core-win32-x64-msvc" "1.15.13"
"@swc/counter@^0.1.3":
version "0.1.3"
resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz"
integrity
sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-darwin-arm64/-/html-darwin-arm64-1.15.13.tgz#6cb94e0a6685df46a48c7168e4d1a048ddcdeceb"
+ integrity
sha512-w/fTkqqkx9haSbws8YhhW/Bp7ZkxCJ6lns5YYZMHdZI2KJL4WEHl6GhGzgzavOXaO8LBouiUwucc2bYPgsfI/w==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-darwin-x64/-/html-darwin-x64-1.15.13.tgz#c9402ec555c7681370fc978f4f6cc12a19e6e9ba"
+ integrity
sha512-yYb8jq+R+FlM8DlFLt5zmm0G5zdF4UUrHjafETmNj3J05itOzcOO9kI7icZ6DUwCROYbfejG7AwkSooYOV5+kA==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.15.13.tgz#b10aa1b05ccf12610d145833a500aa83e4de6920"
+ integrity
sha512-n+/JK+vi9FwJCe5Jrv7i0J0/keal3x+8ZXROJbLAdzYWoAaqjbEeUNWuqmSH3uU64eOhqUl6kRERLz/NB6LoZw==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.13.tgz#8e98a5b4672155ff13c6f1404abe731c8967992e"
+ integrity
sha512-ThKrqeXiRKTj4/mo+KoXy4GE390Lt76GjF0apNwXB27YTQxMFLIlcHIntn/WhumAVJCu3pA/n0TYw8ZSu7K3DA==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.13.tgz#64487978fcdb347490a3daa2aeee95f2c025d516"
+ integrity
sha512-9nyG3dgAclXuAyOsHBpQq0Q15SwQXkGvifczfiKnyd3srjWrsl4ZhHiE3ZrBBshenoK76NwPxATazf/lU83JNg==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.15.13.tgz#16f72d180846bdb27b60038cd48582f2c8307488"
+ integrity
sha512-yzpOYvLXXDqplHrr9wVImJ+QBLeubP7m92zZTQaW8rdhag01bX2Y/+829emT58K3SfLJTiJdKBYsL3q3mbVWrg==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.15.13.tgz#4acf02ef41ee7dfc38cd824be81f79e7adc04483"
+ integrity
sha512-VakiAq/YTiSP3TcWKL6Vo5qu7iS8M647T22zGNNMc4D/gxg57R+89SITc1zCphR6p9rEh7vx6bk8/b8NXgYZeQ==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.15.13.tgz#3df9183ef9e9d3d08cf1b830a50c72fade286240"
+ integrity
sha512-AhO5wmpnK5doUDDkOLqoPMDnNUrY3xa5HShiqiZBiGH2opB++kys77Q1Q9iW9ZKZgAiFLLZmiqVfcQRjhgdy0g==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.15.13.tgz#1586e4b4d6aaf1d69ad93f58b5b996bcaca91705"
+ integrity
sha512-nyjUqwCSezmrWOBTCUf5EXl1oU+Fk/x+zSvvmrEGLAUo7fgpmSJtsNveODkZ8M755MI13ANdO8XkPg0UhYM+4g==
+
+"@swc/[email protected]":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.15.13.tgz#d00f0c1fb82658ccb2f3f92a8d0ae98c7214434c"
+ integrity
sha512-ClKtII06nneMXik7dURXOlkPX8XyyBKE/3VfAAEC7B4E00m228gOy4CwTy9E2TDCeo6eqdePcSETSQzY8uOe8w==
+
+"@swc/html@^1.13.5":
+ version "1.15.13"
+ resolved
"https://registry.yarnpkg.com/@swc/html/-/html-1.15.13.tgz#4f1a1e6f70e4fa31732f2acffb2f8b9968da9dcd"
+ integrity
sha512-3eICmZEt1QTYEF++ZiyGULhuB3QSyoDaFXRjq2Dso7gD8yENeZ00HHpGt340ievtve11BYSD3rVlPRN3/BGlIA==
+ dependencies:
+ "@swc/counter" "^0.1.3"
+ optionalDependencies:
+ "@swc/html-darwin-arm64" "1.15.13"
+ "@swc/html-darwin-x64" "1.15.13"
+ "@swc/html-linux-arm-gnueabihf" "1.15.13"
+ "@swc/html-linux-arm64-gnu" "1.15.13"
+ "@swc/html-linux-arm64-musl" "1.15.13"
+ "@swc/html-linux-x64-gnu" "1.15.13"
+ "@swc/html-linux-x64-musl" "1.15.13"
+ "@swc/html-win32-arm64-msvc" "1.15.13"
+ "@swc/html-win32-ia32-msvc" "1.15.13"
+ "@swc/html-win32-x64-msvc" "1.15.13"
+
"@swc/types@^0.1.25":
version "0.1.25"
resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz"
@@ -4189,6 +4516,13 @@
resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz"
integrity
sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+"@tybys/wasm-util@^0.10.1":
+ version "0.10.1"
+ resolved
"https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414"
+ integrity
sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
+ dependencies:
+ tslib "^2.4.0"
+
"@types/body-parser@*":
version "1.19.6"
resolved
"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz"
@@ -4807,7 +5141,7 @@
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/[email protected]",
"@typescript-eslint/eslint-plugin@^8.52.0":
+"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz#b1ce606d87221daec571e293009675992f0aae76"
integrity
sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==
@@ -4821,6 +5155,20 @@
natural-compare "^1.4.0"
ts-api-utils "^2.4.0"
+"@typescript-eslint/eslint-plugin@^8.52.0":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz#5aec3db807a6b8437ea5d5ebf7bd16b4119aba8d"
+ integrity
sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==
+ dependencies:
+ "@eslint-community/regexpp" "^4.12.2"
+ "@typescript-eslint/scope-manager" "8.56.0"
+ "@typescript-eslint/type-utils" "8.56.0"
+ "@typescript-eslint/utils" "8.56.0"
+ "@typescript-eslint/visitor-keys" "8.56.0"
+ ignore "^7.0.5"
+ natural-compare "^1.4.0"
+ ts-api-utils "^2.4.0"
+
"@typescript-eslint/[email protected]", "@typescript-eslint/parser@^8.56.1":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.56.1.tgz#21d13b3d456ffb08614c1d68bb9a4f8d9237cdc7"
@@ -4832,6 +5180,15 @@
"@typescript-eslint/visitor-keys" "8.56.1"
debug "^4.4.3"
+"@typescript-eslint/[email protected]":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.56.0.tgz#bb8562fecd8f7922e676fc6a1189c20dd7991d73"
+ integrity
sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==
+ dependencies:
+ "@typescript-eslint/tsconfig-utils" "^8.56.0"
+ "@typescript-eslint/types" "^8.56.0"
+ debug "^4.4.3"
+
"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.56.1.tgz#65c8d645f028b927bfc4928593b54e2ecd809244"
@@ -4841,6 +5198,14 @@
"@typescript-eslint/types" "^8.56.1"
debug "^4.4.3"
+"@typescript-eslint/[email protected]":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz#604030a4c6433df3728effdd441d47f45a86edb4"
+ integrity
sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==
+ dependencies:
+ "@typescript-eslint/types" "8.56.0"
+ "@typescript-eslint/visitor-keys" "8.56.0"
+
"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz#254df93b5789a871351335dd23e20bc164060f24"
@@ -4849,11 +5214,27 @@
"@typescript-eslint/types" "8.56.1"
"@typescript-eslint/visitor-keys" "8.56.1"
+"@typescript-eslint/[email protected]",
"@typescript-eslint/tsconfig-utils@^8.56.0":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz#2538ce83cbc376e685487960cbb24b65fe2abc4e"
+ integrity
sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==
+
"@typescript-eslint/[email protected]",
"@typescript-eslint/tsconfig-utils@^8.56.1":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz#1afa830b0fada5865ddcabdc993b790114a879b7"
integrity
sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==
+"@typescript-eslint/[email protected]":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz#72b4edc1fc73988998f1632b3ec99c2a66eaac6e"
+ integrity
sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==
+ dependencies:
+ "@typescript-eslint/types" "8.56.0"
+ "@typescript-eslint/typescript-estree" "8.56.0"
+ "@typescript-eslint/utils" "8.56.0"
+ debug "^4.4.3"
+ ts-api-utils "^2.4.0"
+
"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz#7a6c4fabf225d674644931e004302cbbdd2f2e24"
@@ -4865,11 +5246,31 @@
debug "^4.4.3"
ts-api-utils "^2.4.0"
+"@typescript-eslint/[email protected]", "@typescript-eslint/types@^8.56.0":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.0.tgz#a2444011b9a98ca13d70411d2cbfed5443b3526a"
+ integrity
sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==
+
"@typescript-eslint/[email protected]", "@typescript-eslint/types@^8.56.1":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.1.tgz#975e5942bf54895291337c91b9191f6eb0632ab9"
integrity
sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==
+"@typescript-eslint/[email protected]":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz#fadbc74c14c5bac947db04980ff58bb178701c2e"
+ integrity
sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==
+ dependencies:
+ "@typescript-eslint/project-service" "8.56.0"
+ "@typescript-eslint/tsconfig-utils" "8.56.0"
+ "@typescript-eslint/types" "8.56.0"
+ "@typescript-eslint/visitor-keys" "8.56.0"
+ debug "^4.4.3"
+ minimatch "^9.0.5"
+ semver "^7.7.3"
+ tinyglobby "^0.2.15"
+ ts-api-utils "^2.4.0"
+
"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz#3b9e57d8129a860c50864c42188f761bdef3eab0"
@@ -4885,6 +5286,16 @@
tinyglobby "^0.2.15"
ts-api-utils "^2.4.0"
+"@typescript-eslint/[email protected]":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.56.0.tgz#063ce6f702ec603de1b83ee795ed5e877d6f7841"
+ integrity
sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.9.1"
+ "@typescript-eslint/scope-manager" "8.56.0"
+ "@typescript-eslint/types" "8.56.0"
+ "@typescript-eslint/typescript-estree" "8.56.0"
+
"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.56.1.tgz#5a86acaf9f1b4c4a85a42effb217f73059f6deb7"
@@ -4895,6 +5306,14 @@
"@typescript-eslint/types" "8.56.1"
"@typescript-eslint/typescript-estree" "8.56.1"
+"@typescript-eslint/[email protected]":
+ version "8.56.0"
+ resolved
"https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz#7d6592ab001827d3ce052155edf7ecad19688d7d"
+ integrity
sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==
+ dependencies:
+ "@typescript-eslint/types" "8.56.0"
+ eslint-visitor-keys "^5.0.0"
+
"@typescript-eslint/[email protected]":
version "8.56.1"
resolved
"https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz#50e03475c33a42d123dc99e63acf1841c0231f87"
@@ -5095,7 +5514,12 @@ acorn@^6.1.1:
resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz"
integrity
sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
-acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0,
acorn@^8.16.0:
+acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0:
+ version "8.15.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
+ integrity
sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
+acorn@^8.16.0:
version "8.16.0"
resolved
"https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a"
integrity
sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
@@ -5691,7 +6115,7 @@ browser-assert@^1.2.1:
resolved
"https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz"
integrity
sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==
-browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0,
browserslist@^4.24.4, browserslist@^4.25.0, browserslist@^4.25.3,
browserslist@^4.28.1:
+browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0,
browserslist@^4.24.2, browserslist@^4.24.4, browserslist@^4.25.0,
browserslist@^4.25.3, browserslist@^4.28.1:
version "4.28.1"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"
integrity
sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
@@ -5814,7 +6238,12 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759,
caniuse-lite@^1.0.30001775:
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001759:
+ version "1.0.30001770"
+ resolved
"https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz#4dc47d3b263a50fbb243448034921e0a88591a84"
+ integrity
sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==
+
+caniuse-lite@^1.0.30001775:
version "1.0.30001775"
resolved
"https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz#9572266e3f7f77efee5deac1efeb4795879d1b7f"
integrity
sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==
@@ -9635,6 +10064,80 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz#609ff48332adff452a8157a7c2842fd692a8eac4"
+ integrity
sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz#a13da040a7929582bab3ace9a67bdc146e99fc2d"
+ integrity
sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz#f7482c311273571ec0c2bd8277c1f5f6e90e03a4"
+ integrity
sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz#91df1bb290f1cb7bb2af832d7d0d8809225e0124"
+ integrity
sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz#c3cad5ae8b70045f21600dc95295ab6166acf57e"
+ integrity
sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz#a5c4f6a5ac77447093f61b209c0bd7fef1f0a3e3"
+ integrity
sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz#af26ab8f829b727ada0a200938a6c8796ff36900"
+ integrity
sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz#a891d44e84b71c0d88959feb9a7522bbf61450ee"
+ integrity
sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz#8c8b21def851f4d477fa897b80cb3db2b650bc6e"
+ integrity
sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz#79000fb8c57e94a91b8fc643e74d5a54407d7080"
+ integrity
sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==
+
[email protected]:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz#7f025274c81c7d659829731e09c8b6f442209837"
+ integrity
sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==
+
+lightningcss@^1.27.0:
+ version "1.31.1"
+ resolved
"https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.31.1.tgz#1a19dd327b547a7eda1d5c296ebe1e72df5a184b"
+ integrity
sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==
+ dependencies:
+ detect-libc "^2.0.3"
+ optionalDependencies:
+ lightningcss-android-arm64 "1.31.1"
+ lightningcss-darwin-arm64 "1.31.1"
+ lightningcss-darwin-x64 "1.31.1"
+ lightningcss-freebsd-x64 "1.31.1"
+ lightningcss-linux-arm-gnueabihf "1.31.1"
+ lightningcss-linux-arm64-gnu "1.31.1"
+ lightningcss-linux-arm64-musl "1.31.1"
+ lightningcss-linux-x64-gnu "1.31.1"
+ lightningcss-linux-x64-musl "1.31.1"
+ lightningcss-win32-arm64-msvc "1.31.1"
+ lightningcss-win32-x64-msvc "1.31.1"
+
lilconfig@^3.1.1:
version "3.1.3"
resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz"
@@ -10840,13 +11343,20 @@ [email protected], minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^10.2.1, minimatch@^10.2.2:
+minimatch@^10.2.1:
version "10.2.2"
resolved
"https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.2.tgz#361603ee323cfb83496fea2ae17cc44ea4e1f99f"
integrity
sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==
dependencies:
brace-expansion "^5.0.2"
+minimatch@^10.2.2:
+ version "10.2.4"
+ resolved
"https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde"
+ integrity
sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==
+ dependencies:
+ brace-expansion "^5.0.2"
+
minimatch@^5.0.1:
version "5.1.6"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
@@ -10854,6 +11364,13 @@ minimatch@^5.0.1:
dependencies:
brace-expansion "^2.0.1"
+minimatch@^9.0.5:
+ version "9.0.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
+ integrity
sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimist@^1.2.0:
version "1.2.8"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
@@ -14147,7 +14664,7 @@ [email protected], swagger2openapi@^7.0.8:
yaml "^1.10.0"
yargs "^17.0.1"
-swc-loader@^0.2.7:
+swc-loader@^0.2.6, swc-loader@^0.2.7:
version "0.2.7"
resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.7.tgz"
integrity
sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==
@@ -14367,7 +14884,7 @@ ts-toolbelt@^9.6.0:
resolved "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz"
integrity
sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==
-tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.6.0:
+tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.4.0,
tslib@^2.6.0:
version "2.8.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
integrity
sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -15074,6 +15591,11 @@ webpack-merge@^6.0.1:
flat "^5.0.2"
wildcard "^2.0.1"
+webpack-sources@^3.3.3:
+ version "3.3.3"
+ resolved
"https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz"
+ integrity
sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==
+
webpack-sources@^3.3.4:
version "3.3.4"
resolved
"https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891"
@@ -15084,7 +15606,7 @@ webpack-virtual-modules@^0.6.2:
resolved
"https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz"
integrity
sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
-webpack@^5.105.3, webpack@^5.88.1, webpack@^5.95.0:
+webpack@^5.105.3:
version "5.105.3"
resolved
"https://registry.yarnpkg.com/webpack/-/webpack-5.105.3.tgz#307ad95bafffd08bc81049d6519477b16e42e7ba"
integrity
sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==
@@ -15115,6 +15637,37 @@ webpack@^5.105.3, webpack@^5.88.1, webpack@^5.95.0:
watchpack "^2.5.1"
webpack-sources "^3.3.4"
+webpack@^5.88.1, webpack@^5.95.0:
+ version "5.105.2"
+ resolved
"https://registry.yarnpkg.com/webpack/-/webpack-5.105.2.tgz#f3b76f9fc36f1152e156e63ffda3bbb82e6739ea"
+ integrity
sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==
+ dependencies:
+ "@types/eslint-scope" "^3.7.7"
+ "@types/estree" "^1.0.8"
+ "@types/json-schema" "^7.0.15"
+ "@webassemblyjs/ast" "^1.14.1"
+ "@webassemblyjs/wasm-edit" "^1.14.1"
+ "@webassemblyjs/wasm-parser" "^1.14.1"
+ acorn "^8.15.0"
+ acorn-import-phases "^1.0.3"
+ browserslist "^4.28.1"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.19.0"
+ es-module-lexer "^2.0.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.11"
+ json-parse-even-better-errors "^2.3.1"
+ loader-runner "^4.3.1"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^4.3.3"
+ tapable "^2.3.0"
+ terser-webpack-plugin "^5.3.16"
+ watchpack "^2.5.1"
+ webpack-sources "^3.3.3"
+
webpackbar@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz"