mirror of
https://github.com/apache/superset.git
synced 2026-05-03 06:54:19 +00:00
Compare commits
8 Commits
nodejs-sid
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc1c0f6ba1 | ||
|
|
ad73395c89 | ||
|
|
867e173427 | ||
|
|
c90c8612ad | ||
|
|
b14cca15f6 | ||
|
|
9d4384e49e | ||
|
|
d8dd2d99b3 | ||
|
|
dbe26d81ce |
143
docs/docs/using-superset/handlebars-chart.mdx
Normal file
143
docs/docs/using-superset/handlebars-chart.mdx
Normal file
@@ -0,0 +1,143 @@
|
||||
---
|
||||
title: Handlebars Chart
|
||||
hide_title: true
|
||||
sidebar_position: 10
|
||||
version: 1
|
||||
---
|
||||
|
||||
## Handlebars Chart
|
||||
|
||||
The Handlebars chart lets you render query results using a custom [Handlebars](https://handlebarsjs.com/) template. This gives you full control over how your data is displayed — from simple tables to rich HTML layouts.
|
||||
|
||||
### Basic Usage
|
||||
|
||||
In the chart editor, write a Handlebars template in the **Template** field. Your query results are available as `data`, an array of row objects.
|
||||
|
||||
```handlebars
|
||||
{{#each data}}
|
||||
<p>{{this.name}}: {{this.value}}</p>
|
||||
{{/each}}
|
||||
```
|
||||
|
||||
### Built-in Helpers
|
||||
|
||||
Superset registers several custom helpers on top of the standard Handlebars built-ins.
|
||||
|
||||
#### `dateFormat`
|
||||
|
||||
Formats a date value using [Day.js](https://day.js.org/) format strings.
|
||||
|
||||
```handlebars
|
||||
{{dateFormat my_date format="MMMM YYYY"}}
|
||||
```
|
||||
|
||||
| Option | Default | Description |
|
||||
|--------|---------|-------------|
|
||||
| `format` | `YYYY-MM-DD` | A Day.js-compatible format string |
|
||||
|
||||
---
|
||||
|
||||
#### `stringify`
|
||||
|
||||
Converts an object to a JSON string, or any other value to its string representation.
|
||||
|
||||
```handlebars
|
||||
{{stringify myObj}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `formatNumber`
|
||||
|
||||
Formats a number using locale-aware formatting.
|
||||
|
||||
```handlebars
|
||||
{{formatNumber myNumber "en-US"}}
|
||||
```
|
||||
|
||||
| Option | Default | Description |
|
||||
|--------|---------|-------------|
|
||||
| `locale` | `en-US` | A BCP 47 language tag |
|
||||
|
||||
---
|
||||
|
||||
#### `parseJson`
|
||||
|
||||
Parses a JSON string into an object that can be used in your template.
|
||||
|
||||
```handlebars
|
||||
{{parseJson myJsonString}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `groupBy`
|
||||
|
||||
Groups an array of objects by a key, powered by [handlebars-group-by](https://github.com/nicktindall/handlebars-group-by).
|
||||
|
||||
```handlebars
|
||||
{{#groupBy data "department"}}
|
||||
<h3>{{value}}</h3>
|
||||
{{#each items}}
|
||||
<p>{{this.name}}</p>
|
||||
{{/each}}
|
||||
{{/groupBy}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Helpers from just-handlebars-helpers
|
||||
|
||||
Superset also registers all helpers from the [just-handlebars-helpers](https://github.com/leapfrogtechnology/just-handlebars-helpers) library. These include a wide range of comparison, math, string, and conditional helpers. Commonly used ones include:
|
||||
|
||||
#### Comparison
|
||||
|
||||
| Helper | Description | Example |
|
||||
|--------|-------------|---------|
|
||||
| `eq` | Strict equality | `{{#if (eq status "active")}}` |
|
||||
| `eqw` | Weak equality | `{{#if (eqw count "5")}}` |
|
||||
| `neq` | Strict inequality | `{{#if (neq role "admin")}}` |
|
||||
| `lt` | Less than | `{{#if (lt score 50)}}` |
|
||||
| `lte` | Less than or equal | `{{#if (lte score 100)}}` |
|
||||
| `gt` | Greater than | `{{#if (gt price 0)}}` |
|
||||
| `gte` | Greater than or equal | `{{#if (gte age 18)}}` |
|
||||
|
||||
#### Logical
|
||||
|
||||
| Helper | Description | Example |
|
||||
|--------|-------------|---------|
|
||||
| `and` | Logical AND | `{{#if (and isActive isVerified)}}` |
|
||||
| `or` | Logical OR | `{{#if (or isAdmin isMod)}}` |
|
||||
| `not` | Logical NOT | `{{#if (not isDisabled)}}` |
|
||||
| `ifx` | Inline conditional | `{{ifx isActive "Yes" "No"}}` |
|
||||
| `coalesce` | Returns first non-falsy value | `{{coalesce nickname name "Anonymous"}}` |
|
||||
|
||||
#### String
|
||||
|
||||
| Helper | Description | Example |
|
||||
|--------|-------------|---------|
|
||||
| `capitalize` | Capitalizes first letter | `{{capitalize name}}` |
|
||||
| `uppercase` | Converts to uppercase | `{{uppercase status}}` |
|
||||
| `lowercase` | Converts to lowercase | `{{lowercase email}}` |
|
||||
| `truncate` | Truncates a string | `{{truncate description 100}}` |
|
||||
| `contains` | Checks if string contains substring | `{{#if (contains tag "urgent")}}` |
|
||||
|
||||
#### Math
|
||||
|
||||
| Helper | Description | Example |
|
||||
|--------|-------------|---------|
|
||||
| `add` | Addition | `{{add a b}}` |
|
||||
| `subtract` | Subtraction | `{{subtract total discount}}` |
|
||||
| `multiply` | Multiplication | `{{multiply price quantity}}` |
|
||||
| `divide` | Division | `{{divide total count}}` |
|
||||
| `ceil` | Ceiling | `{{ceil value}}` |
|
||||
| `floor` | Floor | `{{floor value}}` |
|
||||
| `round` | Round | `{{round value}}` |
|
||||
|
||||
For the full list of available helpers, see the [just-handlebars-helpers documentation](https://github.com/leapfrogtechnology/just-handlebars-helpers).
|
||||
|
||||
### Tips
|
||||
|
||||
- Use raw blocks to escape Handlebars syntax if you need to display double curly braces literally.
|
||||
- Comparison helpers like `eq` must be wrapped in a subexpression when used with `#if`: `{{#if (eq myVal "foo")}}`.
|
||||
- HTML output is sanitized by default based on your Superset configuration (`HTML_SANITIZATION`).
|
||||
@@ -41,12 +41,12 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@ant-design/icons": "^6.2.2",
|
||||
"@docusaurus/core": "^3.10.0",
|
||||
"@docusaurus/faster": "^3.10.0",
|
||||
"@docusaurus/plugin-client-redirects": "^3.10.0",
|
||||
"@docusaurus/preset-classic": "3.10.0",
|
||||
"@docusaurus/theme-live-codeblock": "^3.10.0",
|
||||
"@docusaurus/theme-mermaid": "^3.10.0",
|
||||
"@docusaurus/core": "^3.10.1",
|
||||
"@docusaurus/faster": "^3.10.1",
|
||||
"@docusaurus/plugin-client-redirects": "^3.10.1",
|
||||
"@docusaurus/preset-classic": "3.10.1",
|
||||
"@docusaurus/theme-live-codeblock": "^3.10.1",
|
||||
"@docusaurus/theme-mermaid": "^3.10.1",
|
||||
"@emotion/core": "^11.0.0",
|
||||
"@emotion/react": "^11.13.3",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
@@ -92,7 +92,7 @@
|
||||
"unist-util-visit": "^5.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "^3.10.0",
|
||||
"@docusaurus/module-type-aliases": "^3.10.1",
|
||||
"@docusaurus/tsconfig": "^3.10.1",
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@types/js-yaml": "^4.0.9",
|
||||
@@ -124,8 +124,7 @@
|
||||
"resolutions": {
|
||||
"react-redux": "^9.2.0",
|
||||
"@reduxjs/toolkit": "^2.5.0",
|
||||
"baseline-browser-mapping": "^2.9.19",
|
||||
"webpackbar": "^7.0.0"
|
||||
"baseline-browser-mapping": "^2.9.19"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
|
||||
}
|
||||
|
||||
500
docs/yarn.lock
500
docs/yarn.lock
@@ -1570,10 +1570,10 @@
|
||||
"@docsearch/core" "4.6.2"
|
||||
"@docsearch/css" "4.6.2"
|
||||
|
||||
"@docusaurus/babel@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.0.tgz#819819f107233dfcf50b59cd51158f23fb04878a"
|
||||
integrity sha512-mqCJhCZNZUDg0zgDEaPTM4DnRsisa24HdqTy/qn/MQlbwhTb4WVaZg6ZyX6yIVKqTz8fS1hBMgM+98z+BeJJDg==
|
||||
"@docusaurus/babel@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.1.tgz#2f714f682117658ba43d308e9b35b6a73a105227"
|
||||
integrity sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==
|
||||
dependencies:
|
||||
"@babel/core" "^7.25.9"
|
||||
"@babel/generator" "^7.25.9"
|
||||
@@ -1584,23 +1584,23 @@
|
||||
"@babel/preset-typescript" "^7.25.9"
|
||||
"@babel/runtime" "^7.25.9"
|
||||
"@babel/traverse" "^7.25.9"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
fs-extra "^11.1.1"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/bundler@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.0.tgz#878c4c46bfa3434671ea37a43da184238a6aae26"
|
||||
integrity sha512-iONUGZGgp+lAkw/cJZH6irONcF4p8+278IsdRlq8lYhxGjkoNUs0w7F4gVXBYSNChq5KG5/JleTSsdJySShxow==
|
||||
"@docusaurus/bundler@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.1.tgz#82fa5079f3787a67502e25f82d37d05ec5de0cc3"
|
||||
integrity sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==
|
||||
dependencies:
|
||||
"@babel/core" "^7.25.9"
|
||||
"@docusaurus/babel" "3.10.0"
|
||||
"@docusaurus/cssnano-preset" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/babel" "3.10.1"
|
||||
"@docusaurus/cssnano-preset" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
babel-loader "^9.2.1"
|
||||
clean-css "^5.3.3"
|
||||
copy-webpack-plugin "^11.0.0"
|
||||
@@ -1618,20 +1618,20 @@
|
||||
tslib "^2.6.0"
|
||||
url-loader "^4.1.1"
|
||||
webpack "^5.95.0"
|
||||
webpackbar "^6.0.1"
|
||||
webpackbar "^7.0.0"
|
||||
|
||||
"@docusaurus/core@3.10.0", "@docusaurus/core@^3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.0.tgz#642e71a0209d62c3f5ef275ed9d74a881f40df39"
|
||||
integrity sha512-mgLdQsO8xppnQZc3LPi+Mf+PkPeyxJeIx11AXAq/14fsaMefInQiMEZUUmrc7J+956G/f7MwE7tn8KZgi3iRcA==
|
||||
"@docusaurus/core@3.10.1", "@docusaurus/core@^3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.1.tgz#3f8bdb97451b4df14f2a3b39ab0186366fbf8fbe"
|
||||
integrity sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==
|
||||
dependencies:
|
||||
"@docusaurus/babel" "3.10.0"
|
||||
"@docusaurus/bundler" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/mdx-loader" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/babel" "3.10.1"
|
||||
"@docusaurus/bundler" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/mdx-loader" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
boxen "^6.2.1"
|
||||
chalk "^4.1.2"
|
||||
chokidar "^3.5.3"
|
||||
@@ -1668,22 +1668,22 @@
|
||||
webpack-dev-server "^5.2.2"
|
||||
webpack-merge "^6.0.1"
|
||||
|
||||
"@docusaurus/cssnano-preset@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.0.tgz#be1b435c33df09d743473d3fadda67b4568dfae3"
|
||||
integrity sha512-qzSshTO1DB3TYW+dPUal5KHM7XPc5YQfzF3Kdb2NDACJUyGbNcFtw3tGkCJlYwhNCRKbZcmwraKUS1i5dcHdGg==
|
||||
"@docusaurus/cssnano-preset@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz#4b6bafeca8bb9423364d2fd6683c28e2f85a4665"
|
||||
integrity sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==
|
||||
dependencies:
|
||||
cssnano-preset-advanced "^6.1.2"
|
||||
postcss "^8.5.4"
|
||||
postcss-sort-media-queries "^5.2.0"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/faster@^3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.10.0.tgz#0758a93196f685537aa7700bde62faf926e6c817"
|
||||
integrity sha512-GNPtVH14ISjHfSwnHu3KiFGf86ICmJSQDeSv/QaanpBgiZGOtgZaslnC5q8WiguxM1EVkwcGxPuD8BXF4eggKw==
|
||||
"@docusaurus/faster@^3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.10.1.tgz#a63d89ae980c98e1eeab3ff15ee083f7c20ed353"
|
||||
integrity sha512-XTZhE5C1gZ/DaYYMlSk02dwP5vhpQON5QHVz1s3892mSESAywgWanURpXEDAvt4GvGuq7s+XP8rTWHZvfaJmdQ==
|
||||
dependencies:
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@rspack/core" "^1.7.10"
|
||||
"@swc/core" "^1.7.39"
|
||||
"@swc/html" "^1.13.5"
|
||||
@@ -1694,22 +1694,22 @@
|
||||
tslib "^2.6.0"
|
||||
webpack "^5.95.0"
|
||||
|
||||
"@docusaurus/logger@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.0.tgz#2bacbd004dd78e3da926dbe8f6fa9a930856575d"
|
||||
integrity sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==
|
||||
"@docusaurus/logger@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.1.tgz#34c964e32e18f120e30f80171a38cfefe72cfb4b"
|
||||
integrity sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==
|
||||
dependencies:
|
||||
chalk "^4.1.2"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/mdx-loader@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.0.tgz#1d4b050d751389ecf38dee48bcb61e53df8ffb82"
|
||||
integrity sha512-mQQV97080AH4PYNs087l202NMDqRopZA4mg5W76ZZyTFrmWhJ3mHg+8A+drJVENxw5/Q+wHMHLgsx+9z1nEs0A==
|
||||
"@docusaurus/mdx-loader@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz#050ae9bc614158a4ec07a628aa75fa9ae90d7e82"
|
||||
integrity sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==
|
||||
dependencies:
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
"@mdx-js/mdx" "^3.0.0"
|
||||
"@slorber/remark-comment" "^1.0.0"
|
||||
escape-html "^1.0.3"
|
||||
@@ -1732,12 +1732,12 @@
|
||||
vfile "^6.0.1"
|
||||
webpack "^5.88.1"
|
||||
|
||||
"@docusaurus/module-type-aliases@3.10.0", "@docusaurus/module-type-aliases@^3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.0.tgz#749928f104d563f11f046bf0c9ab6489a470c7c8"
|
||||
integrity sha512-/1O0Zg8w3DFrYX/I6Fbss7OJrtZw1QoyjDhegiFNHVi9A9Y0gQ3jUAytVxF6ywpAWpLyLxch8nN8H/V3XfzdJQ==
|
||||
"@docusaurus/module-type-aliases@3.10.1", "@docusaurus/module-type-aliases@^3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz#22d39177c296786eb6e0d940699cd590cc93ca77"
|
||||
integrity sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==
|
||||
dependencies:
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@types/history" "^4.7.11"
|
||||
"@types/react" "*"
|
||||
"@types/react-router-config" "*"
|
||||
@@ -1745,34 +1745,34 @@
|
||||
react-helmet-async "npm:@slorber/react-helmet-async@1.3.0"
|
||||
react-loadable "npm:@docusaurus/react-loadable@6.0.0"
|
||||
|
||||
"@docusaurus/plugin-client-redirects@^3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.0.tgz#4dd4619817fd69462d1e6d986580343aeb911111"
|
||||
integrity sha512-P+VLoLoZTc74so8+IbsaPZ33/mkf2BWL1CYXQpPRkl0v1QVCN2CgfsZY/8QtbYjQnx2upXUnv45abDhNcSggNw==
|
||||
"@docusaurus/plugin-client-redirects@^3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.1.tgz#e22ed20e5837b7c3a28258e3d1816c4239c82b36"
|
||||
integrity sha512-LHgd+YDvkhfOHMAE6XtUng3DQNzVM765RqVRrMJgHtzAvfopQhY6ieprqjxDVBdv21cLma6I0jHr+YCZH8fL9A==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
eta "^2.2.0"
|
||||
fs-extra "^11.1.1"
|
||||
lodash "^4.17.21"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-content-blog@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.0.tgz#10095291b637440847854ecb2c8afcd8746debd7"
|
||||
integrity sha512-RuTz68DhB7CL96QO5UsFbciD7GPYq6QV+YMfF9V0+N4ZgLhJIBgpVAr8GobrKF6NRe5cyWWETU5z5T834piG9g==
|
||||
"@docusaurus/plugin-content-blog@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz#0bd8de700ccbd8e95d920df2613304ef59abe72b"
|
||||
integrity sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/mdx-loader" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/mdx-loader" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
cheerio "1.0.0-rc.12"
|
||||
combine-promises "^1.1.0"
|
||||
feed "^4.2.2"
|
||||
@@ -1785,20 +1785,20 @@
|
||||
utility-types "^3.10.0"
|
||||
webpack "^5.88.1"
|
||||
|
||||
"@docusaurus/plugin-content-docs@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.0.tgz#9c4ea1d5a405340f28c281d2e4586c695a7c65a5"
|
||||
integrity sha512-9BjHhf15ct8Z7TThTC0xRndKDVvMKmVsAGAN7W9FpNRzfMdScOGcXtLmcCWtJGvAezjOJIm6CxOYCy3Io5+RnQ==
|
||||
"@docusaurus/plugin-content-docs@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz#261e0e982e4a937c05b462e3c5729374f433b752"
|
||||
integrity sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/mdx-loader" "3.10.0"
|
||||
"@docusaurus/module-type-aliases" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/mdx-loader" "3.10.1"
|
||||
"@docusaurus/module-type-aliases" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
"@types/react-router-config" "^5.0.7"
|
||||
combine-promises "^1.1.0"
|
||||
fs-extra "^11.1.1"
|
||||
@@ -1809,142 +1809,142 @@
|
||||
utility-types "^3.10.0"
|
||||
webpack "^5.88.1"
|
||||
|
||||
"@docusaurus/plugin-content-pages@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.0.tgz#7670cbb3c849f434949f542bfdfded1580a13165"
|
||||
integrity sha512-5amX8kEJI+nIGtuLVjYk59Y5utEJ3CHETFOPEE4cooIRLA4xM4iBsA6zFgu4ljcopeYwvBzFEWf5g2I6Yb9SkA==
|
||||
"@docusaurus/plugin-content-pages@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz#8c6ffc2079ed0262548ecc4df1dea6add6aa9673"
|
||||
integrity sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/mdx-loader" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/mdx-loader" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
fs-extra "^11.1.1"
|
||||
tslib "^2.6.0"
|
||||
webpack "^5.88.1"
|
||||
|
||||
"@docusaurus/plugin-css-cascade-layers@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.0.tgz#71e318d842be95f92be6c3dca00ceea4971d0edb"
|
||||
integrity sha512-6q1vtt5FJcg5osgkHeM1euErECNqEZ5Z1j69yiNx2luEBIso+nxCkS9nqj8w+MK5X7rvKEToGhFfOFWncs51pQ==
|
||||
"@docusaurus/plugin-css-cascade-layers@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz#440578d95cbe1a6120936fa83df868d2626cd1d8"
|
||||
integrity sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-debug@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.0.tgz#e77f924604e1e09d5d90fe0bdf23a3be8ea3307e"
|
||||
integrity sha512-XcljKN+G+nmmK69uQA1d9BlYU3ZftG3T3zpK8/7Hf/wrOlV7TA4Ampdrdwkg0jElKdKAoSnPhCO0/U3bQGsVQQ==
|
||||
"@docusaurus/plugin-debug@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz#b8b7b24d9a7d185fd8a56a030f90145d3bfd8239"
|
||||
integrity sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
fs-extra "^11.1.1"
|
||||
react-json-view-lite "^2.3.0"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-google-analytics@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.0.tgz#22c7e976fe4d970c7cd1c73c9723d9a5786c6e37"
|
||||
integrity sha512-hTEoodatpBZnUat5nFExbuTGA1lhWGy7vZGuTew5Q3QDtGKFpSJLYmZJhdTjvCFwv1+qQ67hgAVlKdJOB8TXow==
|
||||
"@docusaurus/plugin-google-analytics@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz#ac15afc77386e0352edb8a1698d993aa5de36ffc"
|
||||
integrity sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-google-gtag@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.0.tgz#c38a2ba638257851cc845b934506b80c08d47f96"
|
||||
integrity sha512-iB/Zzjv/eelJRbdULZqzWCbgMgJ7ht4ONVjXtN3+BI/muil6S87gQ1OJyPwlXD+ELdKkitC7bWv5eJdYOZLhrQ==
|
||||
"@docusaurus/plugin-google-gtag@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz#0482b83b9bc411aa99a432be2b39d2e53a00e2e0"
|
||||
integrity sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
"@types/gtag.js" "^0.0.20"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-google-tag-manager@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.0.tgz#5469c923cc1ad4608399d0b17e5fcacd8e030d56"
|
||||
integrity sha512-FEjZxqKgLHa+Wez/EgKxRwvArNCWIScfyEQD95rot7jkxp6nonjI5XIbGfO/iYhM5Qinwe8aIEQHP2KZtpqVuA==
|
||||
"@docusaurus/plugin-google-tag-manager@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz#eaf5765d6f82b4fb661d92a793d1883f9d1ec106"
|
||||
integrity sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-sitemap@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.0.tgz#35d59d46803f279f22aa64fc1bd18c048f12662b"
|
||||
integrity sha512-DVTSLjB97hIjmayGnGcBfognCeI7ZuUKgEnU7Oz81JYqXtVg94mVTthDjq3QHTylYNeCUbkaW8VF0FDLcc8pPw==
|
||||
"@docusaurus/plugin-sitemap@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz#66a6974bb2fd1b9d8f5cb0f3c5ecd2201c118565"
|
||||
integrity sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
fs-extra "^11.1.1"
|
||||
sitemap "^7.1.1"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/plugin-svgr@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.0.tgz#8ada2e6dd8318d20206a9b044fc091a5794ba3f0"
|
||||
integrity sha512-lNljBESaETZqVBMPqkrGchr+UPT1eZzEPLmJhz8I76BxbjqgsUnRvrq6lQJ9sYjgmgX52KB7kkgczqd2yzoswQ==
|
||||
"@docusaurus/plugin-svgr@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz#c217c24d6d23fd2bc6f54d44c040635b49d6b36e"
|
||||
integrity sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
"@svgr/core" "8.1.0"
|
||||
"@svgr/webpack" "^8.1.0"
|
||||
tslib "^2.6.0"
|
||||
webpack "^5.88.1"
|
||||
|
||||
"@docusaurus/preset-classic@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.0.tgz#74b6facdaf568bcd41ec90cae9aebb7ca0ac8619"
|
||||
integrity sha512-kw/Ye02Hc6xP1OdTswy8yxQEHg0fdPpyWAQRxr5b2x3h7LlG2Zgbb5BDFROnXDDMpUxB7YejlocJIE5HIEfpNA==
|
||||
"@docusaurus/preset-classic@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz#faf330d96aedc9083a59bec09d966ae4dfc8b2fb"
|
||||
integrity sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/plugin-content-blog" "3.10.0"
|
||||
"@docusaurus/plugin-content-docs" "3.10.0"
|
||||
"@docusaurus/plugin-content-pages" "3.10.0"
|
||||
"@docusaurus/plugin-css-cascade-layers" "3.10.0"
|
||||
"@docusaurus/plugin-debug" "3.10.0"
|
||||
"@docusaurus/plugin-google-analytics" "3.10.0"
|
||||
"@docusaurus/plugin-google-gtag" "3.10.0"
|
||||
"@docusaurus/plugin-google-tag-manager" "3.10.0"
|
||||
"@docusaurus/plugin-sitemap" "3.10.0"
|
||||
"@docusaurus/plugin-svgr" "3.10.0"
|
||||
"@docusaurus/theme-classic" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/theme-search-algolia" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/plugin-content-blog" "3.10.1"
|
||||
"@docusaurus/plugin-content-docs" "3.10.1"
|
||||
"@docusaurus/plugin-content-pages" "3.10.1"
|
||||
"@docusaurus/plugin-css-cascade-layers" "3.10.1"
|
||||
"@docusaurus/plugin-debug" "3.10.1"
|
||||
"@docusaurus/plugin-google-analytics" "3.10.1"
|
||||
"@docusaurus/plugin-google-gtag" "3.10.1"
|
||||
"@docusaurus/plugin-google-tag-manager" "3.10.1"
|
||||
"@docusaurus/plugin-sitemap" "3.10.1"
|
||||
"@docusaurus/plugin-svgr" "3.10.1"
|
||||
"@docusaurus/theme-classic" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/theme-search-algolia" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
|
||||
"@docusaurus/theme-classic@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.0.tgz#d937915c691189f27ced649c822994d839ea565b"
|
||||
integrity sha512-9msCAsRdN+UG+RwPwCFb0uKy4tGoPh5YfBozXeGUtIeAgsMdn6f3G/oY861luZ3t8S2ET8S9Y/1GnpJAGWytww==
|
||||
"@docusaurus/theme-classic@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz#deed8cf73cc0f56113e53775cbb3b168c3c61566"
|
||||
integrity sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/mdx-loader" "3.10.0"
|
||||
"@docusaurus/module-type-aliases" "3.10.0"
|
||||
"@docusaurus/plugin-content-blog" "3.10.0"
|
||||
"@docusaurus/plugin-content-docs" "3.10.0"
|
||||
"@docusaurus/plugin-content-pages" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/theme-translations" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/mdx-loader" "3.10.1"
|
||||
"@docusaurus/module-type-aliases" "3.10.1"
|
||||
"@docusaurus/plugin-content-blog" "3.10.1"
|
||||
"@docusaurus/plugin-content-docs" "3.10.1"
|
||||
"@docusaurus/plugin-content-pages" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/theme-translations" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
"@mdx-js/react" "^3.0.0"
|
||||
clsx "^2.0.0"
|
||||
copy-text-to-clipboard "^3.2.0"
|
||||
@@ -1959,15 +1959,15 @@
|
||||
tslib "^2.6.0"
|
||||
utility-types "^3.10.0"
|
||||
|
||||
"@docusaurus/theme-common@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.0.tgz#70b419ccfdf62f092299354a72d1692e81be597d"
|
||||
integrity sha512-Dkp1YXKn16ByCJAdIjbDIOpVb4Z66MsVD694/ilX1vAAHaVEMrVsf/NPd9VgreyFx08rJ9GqV1MtzsbTcU73Kg==
|
||||
"@docusaurus/theme-common@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.1.tgz#cbfec82b1b107be5c229811ed9caae14a501361c"
|
||||
integrity sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==
|
||||
dependencies:
|
||||
"@docusaurus/mdx-loader" "3.10.0"
|
||||
"@docusaurus/module-type-aliases" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/mdx-loader" "3.10.1"
|
||||
"@docusaurus/module-type-aliases" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
"@types/history" "^4.7.11"
|
||||
"@types/react" "*"
|
||||
"@types/react-router-config" "*"
|
||||
@@ -1977,48 +1977,48 @@
|
||||
tslib "^2.6.0"
|
||||
utility-types "^3.10.0"
|
||||
|
||||
"@docusaurus/theme-live-codeblock@^3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.10.0.tgz#05a38c6bfac479fd698f18f27ca06ebb126633d9"
|
||||
integrity sha512-1Ycxu0dBAhEXzXPQ1dQW01aY1MNi7TCTUOBtIF0GcNrQBFj74XxhDqv/T6GxYBsaN+6QnIDs1T+D43iV2/r2hQ==
|
||||
"@docusaurus/theme-live-codeblock@^3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.10.1.tgz#29e6ddee467d816205ad611fd7bf10f00db5bdef"
|
||||
integrity sha512-MKG/0zreelS6YlupQAoKmS5nCw9RRKwDHihJg2FinsU1+rqbrOYNYVq//eQy+m649k9b8XCazEw9VUMTFhpCTg==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/theme-translations" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/theme-translations" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
"@philpl/buble" "^0.19.7"
|
||||
clsx "^2.0.0"
|
||||
fs-extra "^11.1.1"
|
||||
react-live "^4.1.6"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/theme-mermaid@^3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.0.tgz#6581ccf16d27e4c02fe8c7cf15488862f27be9c8"
|
||||
integrity sha512-Y2xrlwhIJ80oOZIO3PXL6A7J869splfcMI87E3NKpYsy3zJxOyV+BP1QMtGi59ajKgU868HPuyyn6J+6BZGOBg==
|
||||
"@docusaurus/theme-mermaid@^3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.1.tgz#dada9c50c780524d246906234ace8a35446f26fc"
|
||||
integrity sha512-2gxpmln8Pc4EN1oWzshQEx2HTs67jk14v7MmgqGs8ZU7Nm8oihg+fTouof2u4vN8DtB3Fln4cDJu4UprSX1S3Q==
|
||||
dependencies:
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/module-type-aliases" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/module-type-aliases" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
mermaid ">=11.6.0"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/theme-search-algolia@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.0.tgz#0ff57fe58db6abde8f5ad2877e459cd2fa6e7464"
|
||||
integrity sha512-f5FPKI08e3JRG63vR/o4qeuUVHUHzFzM0nnF+AkB67soAZgNsKJRf2qmUZvlQkGwlV+QFkKe4D0ANMh1jToU3g==
|
||||
"@docusaurus/theme-search-algolia@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz#6f422058711629ce8d7c2f17e1e54efa075c626e"
|
||||
integrity sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==
|
||||
dependencies:
|
||||
"@algolia/autocomplete-core" "^1.19.2"
|
||||
"@docsearch/react" "^3.9.0 || ^4.3.2"
|
||||
"@docusaurus/core" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/plugin-content-docs" "3.10.0"
|
||||
"@docusaurus/theme-common" "3.10.0"
|
||||
"@docusaurus/theme-translations" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-validation" "3.10.0"
|
||||
"@docusaurus/core" "3.10.1"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/plugin-content-docs" "3.10.1"
|
||||
"@docusaurus/theme-common" "3.10.1"
|
||||
"@docusaurus/theme-translations" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-validation" "3.10.1"
|
||||
algoliasearch "^5.37.0"
|
||||
algoliasearch-helper "^3.26.0"
|
||||
clsx "^2.0.0"
|
||||
@@ -2028,10 +2028,10 @@
|
||||
tslib "^2.6.0"
|
||||
utility-types "^3.10.0"
|
||||
|
||||
"@docusaurus/theme-translations@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.0.tgz#8fdc23d29bd7f907db49c36cf65e2123d96be300"
|
||||
integrity sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==
|
||||
"@docusaurus/theme-translations@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz#c3119a015652290eea560ca45ac775963d6eb75b"
|
||||
integrity sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==
|
||||
dependencies:
|
||||
fs-extra "^11.1.1"
|
||||
tslib "^2.6.0"
|
||||
@@ -2041,10 +2041,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/tsconfig/-/tsconfig-3.10.1.tgz#1db31b4a4a5c914bdffa80070a35b6365d34f2e8"
|
||||
integrity sha512-rYvB7yqkdqWIpAbDzQljGfM4cDBkLTbhmagZBEcsyj6oPUsz47lmW2pYdN1j+7sGFgltbAmQH62xfbrij4Eh6Q==
|
||||
|
||||
"@docusaurus/types@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.0.tgz#a69232bba74b738fcf4671fd5f0f079366dd3d13"
|
||||
integrity sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==
|
||||
"@docusaurus/types@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.1.tgz#d42837938ae43ca2be0ca47e63e00476b5eb94be"
|
||||
integrity sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==
|
||||
dependencies:
|
||||
"@mdx-js/mdx" "^3.0.0"
|
||||
"@types/history" "^4.7.11"
|
||||
@@ -2057,36 +2057,36 @@
|
||||
webpack "^5.95.0"
|
||||
webpack-merge "^5.9.0"
|
||||
|
||||
"@docusaurus/utils-common@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.0.tgz#2a6dc76b312664fca7234d33607c085318ff1ae3"
|
||||
integrity sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==
|
||||
"@docusaurus/utils-common@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.1.tgz#6350b4898691e765de750f90eade0e0fa7902d99"
|
||||
integrity sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==
|
||||
dependencies:
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/utils-validation@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.0.tgz#a2418d7f31980d991fd3a1f39c8aad8820b36812"
|
||||
integrity sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==
|
||||
"@docusaurus/utils-validation@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz#ddbcce997a5506424cdd16abf6845cc51692acae"
|
||||
integrity sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==
|
||||
dependencies:
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/utils" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/utils" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
fs-extra "^11.2.0"
|
||||
joi "^17.9.2"
|
||||
js-yaml "^4.1.0"
|
||||
lodash "^4.17.21"
|
||||
tslib "^2.6.0"
|
||||
|
||||
"@docusaurus/utils@3.10.0":
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.0.tgz#ea7d7b0d325b60f728decc00bb3908d00ef86faf"
|
||||
integrity sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==
|
||||
"@docusaurus/utils@3.10.1":
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.1.tgz#535968caa2c9bff69f997a081b98b95b3c5d3785"
|
||||
integrity sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==
|
||||
dependencies:
|
||||
"@docusaurus/logger" "3.10.0"
|
||||
"@docusaurus/types" "3.10.0"
|
||||
"@docusaurus/utils-common" "3.10.0"
|
||||
"@docusaurus/logger" "3.10.1"
|
||||
"@docusaurus/types" "3.10.1"
|
||||
"@docusaurus/utils-common" "3.10.1"
|
||||
escape-string-regexp "^4.0.0"
|
||||
execa "^5.1.1"
|
||||
file-loader "^6.2.0"
|
||||
@@ -13328,7 +13328,7 @@ renderkid@^3.0.0:
|
||||
|
||||
repeat-string@^1.5.2:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
|
||||
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
|
||||
integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
|
||||
|
||||
require-directory@^2.1.1:
|
||||
@@ -15368,7 +15368,7 @@ webpack@^5.106.2, webpack@^5.88.1, webpack@^5.95.0:
|
||||
watchpack "^2.5.1"
|
||||
webpack-sources "^3.3.4"
|
||||
|
||||
webpackbar@^6.0.1, webpackbar@^7.0.0:
|
||||
webpackbar@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-7.0.0.tgz#7228d32881af2392381b6514499ddea73cdf218a"
|
||||
integrity sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==
|
||||
|
||||
63
superset-frontend/package-lock.json
generated
63
superset-frontend/package-lock.json
generated
@@ -163,7 +163,7 @@
|
||||
"@babel/plugin-transform-export-namespace-from": "^7.27.1",
|
||||
"@babel/plugin-transform-modules-commonjs": "^7.28.6",
|
||||
"@babel/plugin-transform-runtime": "^7.29.0",
|
||||
"@babel/preset-env": "^7.29.2",
|
||||
"@babel/preset-env": "^7.29.3",
|
||||
"@babel/preset-react": "^7.28.5",
|
||||
"@babel/preset-typescript": "^7.28.5",
|
||||
"@babel/register": "^7.23.7",
|
||||
@@ -225,7 +225,7 @@
|
||||
"babel-plugin-dynamic-import-node": "^2.3.3",
|
||||
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
|
||||
"babel-plugin-lodash": "^3.3.4",
|
||||
"baseline-browser-mapping": "^2.10.21",
|
||||
"baseline-browser-mapping": "^2.10.24",
|
||||
"cheerio": "1.2.0",
|
||||
"concurrently": "^9.2.1",
|
||||
"copy-webpack-plugin": "^14.0.0",
|
||||
@@ -578,9 +578,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/compat-data": {
|
||||
"version": "7.29.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
|
||||
"integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
|
||||
"version": "7.29.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
|
||||
"integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -1062,6 +1062,23 @@
|
||||
"@babel/core": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
|
||||
"version": "7.29.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz",
|
||||
"integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": "^7.28.6",
|
||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
|
||||
@@ -2388,19 +2405,20 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/preset-env": {
|
||||
"version": "7.29.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz",
|
||||
"integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==",
|
||||
"version": "7.29.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.3.tgz",
|
||||
"integrity": "sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/compat-data": "^7.29.0",
|
||||
"@babel/compat-data": "^7.29.3",
|
||||
"@babel/helper-compilation-targets": "^7.28.6",
|
||||
"@babel/helper-plugin-utils": "^7.28.6",
|
||||
"@babel/helper-validator-option": "^7.27.1",
|
||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",
|
||||
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
|
||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
|
||||
"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3",
|
||||
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
|
||||
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",
|
||||
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
|
||||
@@ -18689,9 +18707,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/baseline-browser-mapping": {
|
||||
"version": "2.10.21",
|
||||
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz",
|
||||
"integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==",
|
||||
"version": "2.10.24",
|
||||
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz",
|
||||
"integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
@@ -51400,7 +51418,7 @@
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.28.6",
|
||||
"@babel/core": "^7.29.0",
|
||||
"@babel/preset-env": "^7.29.2",
|
||||
"@babel/preset-env": "^7.29.3",
|
||||
"@babel/preset-react": "^7.28.5",
|
||||
"@babel/preset-typescript": "^7.28.5",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
@@ -52666,25 +52684,6 @@
|
||||
"integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"plugins/legacy-plugin-chart-map-box": {
|
||||
"name": "@superset-ui/legacy-plugin-chart-map-box",
|
||||
"version": "0.20.3",
|
||||
"extraneous": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@math.gl/web-mercator": "^4.1.0",
|
||||
"prop-types": "^15.8.1",
|
||||
"react-map-gl": "^6.1.19",
|
||||
"supercluster": "^8.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@apache-superset/core": "*",
|
||||
"@superset-ui/chart-controls": "*",
|
||||
"@superset-ui/core": "*",
|
||||
"mapbox-gl": "*",
|
||||
"react": "^17.0.2"
|
||||
}
|
||||
},
|
||||
"plugins/legacy-plugin-chart-paired-t-test": {
|
||||
"name": "@superset-ui/legacy-plugin-chart-paired-t-test",
|
||||
"version": "0.20.3",
|
||||
|
||||
@@ -244,7 +244,7 @@
|
||||
"@babel/plugin-transform-export-namespace-from": "^7.27.1",
|
||||
"@babel/plugin-transform-modules-commonjs": "^7.28.6",
|
||||
"@babel/plugin-transform-runtime": "^7.29.0",
|
||||
"@babel/preset-env": "^7.29.2",
|
||||
"@babel/preset-env": "^7.29.3",
|
||||
"@babel/preset-react": "^7.28.5",
|
||||
"@babel/preset-typescript": "^7.28.5",
|
||||
"@babel/register": "^7.23.7",
|
||||
@@ -306,7 +306,7 @@
|
||||
"babel-plugin-dynamic-import-node": "^2.3.3",
|
||||
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
|
||||
"babel-plugin-lodash": "^3.3.4",
|
||||
"baseline-browser-mapping": "^2.10.21",
|
||||
"baseline-browser-mapping": "^2.10.24",
|
||||
"cheerio": "1.2.0",
|
||||
"concurrently": "^9.2.1",
|
||||
"copy-webpack-plugin": "^14.0.0",
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"cross-env": "^10.1.0",
|
||||
"fs-extra": "^11.3.4",
|
||||
"jest": "^30.3.0",
|
||||
"yeoman-test": "^11.3.1"
|
||||
"yeoman-test": "^11.4.2"
|
||||
},
|
||||
"engines": {
|
||||
"npm": ">= 4.0.0",
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.28.6",
|
||||
"@babel/core": "^7.29.0",
|
||||
"@babel/preset-env": "^7.29.2",
|
||||
"@babel/preset-env": "^7.29.3",
|
||||
"@babel/preset-react": "^7.28.5",
|
||||
"@babel/preset-typescript": "^7.28.5",
|
||||
"typescript": "^5.0.0",
|
||||
|
||||
@@ -1,95 +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.
|
||||
-->
|
||||
|
||||
## @superset-ui/plugin-chart-handlebars
|
||||
|
||||
[](https://www.npmjs.com/package/@superset-ui/plugin-chart-handlebars)
|
||||
[](https://libraries.io/npm/@superset-ui%2Fplugin-chart-handlebars)
|
||||
|
||||
This plugin renders the data using a handlebars template.
|
||||
|
||||
### Usage
|
||||
|
||||
Configure `key`, which can be any `string`, and register the plugin. This `key` will be used to
|
||||
lookup this chart throughout the app.
|
||||
|
||||
```js
|
||||
import HandlebarsChartPlugin from '@superset-ui/plugin-chart-handlebars';
|
||||
|
||||
new HandlebarsChartPlugin().configure({ key: 'handlebars' }).register();
|
||||
```
|
||||
|
||||
Then use it via `SuperChart`. See
|
||||
[storybook](https://apache-superset.github.io/superset-ui/?selectedKind=plugin-chart-handlebars) for
|
||||
more details.
|
||||
|
||||
```js
|
||||
<SuperChart
|
||||
chartType="handlebars"
|
||||
width={600}
|
||||
height={600}
|
||||
formData={...}
|
||||
queriesData={[{
|
||||
data: {...},
|
||||
}]}
|
||||
/>
|
||||
```
|
||||
|
||||
### File structure generated
|
||||
|
||||
```
|
||||
├── package.json
|
||||
├── README.md
|
||||
├── tsconfig.json
|
||||
├── src
|
||||
│ ├── Handlebars.tsx
|
||||
│ ├── images
|
||||
│ │ └── thumbnail.png
|
||||
│ ├── index.ts
|
||||
│ ├── plugin
|
||||
│ │ ├── buildQuery.ts
|
||||
│ │ ├── controlPanel.ts
|
||||
│ │ ├── index.ts
|
||||
│ │ └── transformProps.ts
|
||||
│ └── types.ts
|
||||
├── test
|
||||
│ └── index.test.ts
|
||||
└── types
|
||||
└── external.d.ts
|
||||
```
|
||||
|
||||
### Available Handlebars Helpers in Superset
|
||||
|
||||
Below, you will find a list of all currently registered helpers in the Handlebars plugin for Superset. These helpers are registered and managed in the file [`HandlebarsViewer.tsx`](./path/to/HandlebarsViewer.tsx).
|
||||
|
||||
#### List of Registered Helpers:
|
||||
|
||||
1. **`dateFormat`**: Formats a date using a specified format.
|
||||
- **Usage**: `{{dateFormat my_date format="MMMM YYYY"}}`
|
||||
- **Default format**: `YYYY-MM-DD`.
|
||||
|
||||
2. **`stringify`**: Converts an object into a JSON string or returns a string representation of non-object values.
|
||||
- **Usage**: `{{stringify myObj}}`.
|
||||
|
||||
3. **`formatNumber`**: Formats a number using locale-specific formatting.
|
||||
- **Usage**: `{{formatNumber number locale="en-US"}}`.
|
||||
- **Default locale**: `en-US`.
|
||||
|
||||
4. **`parseJson`**: Parses a JSON string into a JavaScript object.
|
||||
- **Usage**: `{{parseJson jsonString}}`.
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
/**
|
||||
* 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
|
||||
@@ -24,7 +24,7 @@ import {
|
||||
import { t } from '@apache-superset/core/translation';
|
||||
import { validateNonEmpty } from '@superset-ui/core';
|
||||
import { useTheme } from '@apache-superset/core/theme';
|
||||
import { InfoTooltip, SafeMarkdown } from '@superset-ui/core/components';
|
||||
import { InfoTooltip } from '@superset-ui/core/components';
|
||||
import { CodeEditor } from '../../components/CodeEditor/CodeEditor';
|
||||
import { ControlHeader } from '../../components/ControlHeader/controlHeader';
|
||||
import { debounceFunc } from '../../consts';
|
||||
@@ -37,36 +37,10 @@ const HandlebarsTemplateControl = (
|
||||
props: CustomControlConfig<HandlebarsCustomControlProps>,
|
||||
) => {
|
||||
const theme = useTheme();
|
||||
|
||||
const val = String(
|
||||
props?.value ? props?.value : props?.default ? props?.default : '',
|
||||
);
|
||||
|
||||
const helperDescriptionsHeader = t(
|
||||
'Available Handlebars Helpers in Superset:',
|
||||
);
|
||||
|
||||
const helperDescriptions = [
|
||||
{ key: 'dateFormat', descKey: 'Formats a date using a specified format.' },
|
||||
{ key: 'stringify', descKey: 'Converts an object to a JSON string.' },
|
||||
{
|
||||
key: 'formatNumber',
|
||||
descKey: 'Formats a number using locale-specific formatting.',
|
||||
},
|
||||
{
|
||||
key: 'parseJson',
|
||||
descKey: 'Parses a JSON string into a JavaScript object.',
|
||||
},
|
||||
];
|
||||
|
||||
const helpersTooltipContent = `
|
||||
${helperDescriptionsHeader}
|
||||
|
||||
${helperDescriptions
|
||||
.map(({ key, descKey }) => `- **${key}**: ${t(descKey)}`)
|
||||
.join('\n')}
|
||||
`;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<ControlHeader>
|
||||
@@ -74,7 +48,7 @@ ${helperDescriptions
|
||||
{props.label}
|
||||
<InfoTooltip
|
||||
iconStyle={{ marginLeft: theme.sizeUnit }}
|
||||
tooltip={<SafeMarkdown source={helpersTooltipContent} />}
|
||||
tooltip={<span>{t('See ')} <a href="https://superset.apache.org/docs/using-superset/handlebars-chart" target="_blank" rel="noopener noreferrer">{t('the Handlebars chart documentation')}</a> {t('for a list of available helpers.')}</span>}
|
||||
/>
|
||||
</div>
|
||||
</ControlHeader>
|
||||
@@ -104,7 +78,6 @@ export const handlebarsTemplateControlSetItem: ControlSetItem = {
|
||||
isInt: false,
|
||||
renderTrigger: true,
|
||||
valueKey: null,
|
||||
|
||||
validators: [validateNonEmpty],
|
||||
mapStateToProps: ({ form_data }) => ({
|
||||
value: form_data?.handlebarsTemplate ?? form_data?.handlebars_template,
|
||||
|
||||
@@ -130,13 +130,12 @@ const processComparisonTotals = (
|
||||
Object.keys(totalRecord).forEach(key => {
|
||||
if (totalRecord[key] !== undefined && !key.includes(comparisonSuffix)) {
|
||||
transformedTotals[`Main ${key}`] =
|
||||
parseInt(transformedTotals[`Main ${key}`]?.toString() || '0', 10) +
|
||||
parseInt(totalRecord[key]?.toString() || '0', 10);
|
||||
parseFloat(transformedTotals[`Main ${key}`]?.toString() || '0') +
|
||||
parseFloat(totalRecord[key]?.toString() || '0');
|
||||
transformedTotals[`# ${key}`] =
|
||||
parseInt(transformedTotals[`# ${key}`]?.toString() || '0', 10) +
|
||||
parseInt(
|
||||
parseFloat(transformedTotals[`# ${key}`]?.toString() || '0') +
|
||||
parseFloat(
|
||||
totalRecord[`${key}__${comparisonSuffix}`]?.toString() || '0',
|
||||
10,
|
||||
);
|
||||
const { valueDifference, percentDifferenceNum } = calculateDifferences(
|
||||
transformedTotals[`Main ${key}`] as number,
|
||||
|
||||
@@ -1585,11 +1585,17 @@ class ExploreMixin: # pylint: disable=too-many-public-methods
|
||||
for metric in metric_names
|
||||
}
|
||||
|
||||
# When the original query has limit or offset we wont apply those
|
||||
# to the subquery so we prevent data inconsistency due to missing records
|
||||
# in the dataframes when performing the join
|
||||
# The subquery drops row_offset (the offset period's own row ordering
|
||||
# differs from the main query's, so applying the same offset would skew
|
||||
# the join). It must still fetch enough rows to cover the main query's
|
||||
# window, hence row_limit + row_offset when a chart limit is set.
|
||||
if query_object.row_limit or query_object.row_offset:
|
||||
query_object_clone_dct["row_limit"] = app.config["ROW_LIMIT"]
|
||||
if query_object.row_limit:
|
||||
query_object_clone_dct["row_limit"] = (
|
||||
query_object.row_limit + query_object.row_offset
|
||||
)
|
||||
else:
|
||||
query_object_clone_dct["row_limit"] = app.config["ROW_LIMIT"]
|
||||
query_object_clone_dct["row_offset"] = 0
|
||||
|
||||
# Call the unified query method on the datasource
|
||||
|
||||
@@ -23,7 +23,6 @@ from unittest.mock import Mock, patch
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import pytest
|
||||
from flask import current_app
|
||||
from pandas import DateOffset
|
||||
|
||||
from superset import db
|
||||
@@ -43,6 +42,7 @@ from superset.utils.core import (
|
||||
QueryStatus,
|
||||
)
|
||||
from superset.utils.pandas_postprocessing.utils import FLAT_COLUMN_SEPARATOR
|
||||
from tests.conftest import with_config
|
||||
from tests.integration_tests.base_tests import SupersetTestCase
|
||||
from tests.integration_tests.conftest import (
|
||||
only_postgresql,
|
||||
@@ -68,6 +68,130 @@ def get_sql_text(payload: dict[str, Any]) -> str:
|
||||
return response["query"]
|
||||
|
||||
|
||||
def _time_comparison_offset_queries_payload() -> dict[str, Any]:
|
||||
"""Birth-names chart payload with time comparison and x-axis suitable for tests."""
|
||||
payload = get_query_context("birth_names")
|
||||
payload["queries"][0]["columns"] = [
|
||||
{
|
||||
"timeGrain": "P1D",
|
||||
"columnType": "BASE_AXIS",
|
||||
"sqlExpression": "ds",
|
||||
"label": "ds",
|
||||
"expressionType": "SQL",
|
||||
}
|
||||
]
|
||||
payload["queries"][0]["metrics"] = ["sum__num"]
|
||||
payload["queries"][0]["groupby"] = ["name"]
|
||||
payload["queries"][0]["is_timeseries"] = True
|
||||
payload["queries"][0]["time_range"] = "1990 : 1991"
|
||||
return payload
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
|
||||
@patch("superset.common.query_context.QueryContext.get_query_result")
|
||||
def test_time_offset_comparison_queries_use_chart_row_limit(
|
||||
query_result_mock: Mock,
|
||||
) -> None:
|
||||
"""Comparison SQL covers the main query's window (row_limit + row_offset)."""
|
||||
payload = _time_comparison_offset_queries_payload()
|
||||
payload["queries"][0]["row_limit"] = 100
|
||||
payload["queries"][0]["row_offset"] = 10
|
||||
|
||||
initial_df = pd.DataFrame(
|
||||
{
|
||||
"__timestamp": ["1990-01-01", "1990-01-01"],
|
||||
"name": ["zban", "ahwb"],
|
||||
"sum__num": [43571, 27225],
|
||||
}
|
||||
)
|
||||
mock_query_result = Mock()
|
||||
mock_query_result.df = initial_df
|
||||
query_result_mock.side_effect = [mock_query_result]
|
||||
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
df = query_context.get_query_result(query_object).df
|
||||
|
||||
payload["queries"][0]["time_offsets"] = ["1 year ago", "1 year later"]
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
|
||||
def cache_key_fn(qo: QueryObject, time_offset: str, time_grain: Any) -> str | None:
|
||||
return query_context._processor.query_cache_key(
|
||||
qo, time_offset=time_offset, time_grain=time_grain
|
||||
)
|
||||
|
||||
def cache_timeout_fn() -> int:
|
||||
return query_context._processor.get_cache_timeout()
|
||||
|
||||
time_offsets_obj = query_context.datasource.processing_time_offsets(
|
||||
df, query_object, cache_key_fn, cache_timeout_fn, query_context.force
|
||||
)
|
||||
sqls = time_offsets_obj["queries"]
|
||||
assert len(sqls) == 2
|
||||
assert re.search(r"1989-01-01.+1990-01-01", sqls[0], re.S)
|
||||
assert re.search(r"LIMIT 110", sqls[0], re.S)
|
||||
assert not re.search(r"OFFSET 10", sqls[0], re.S)
|
||||
assert re.search(r"1991-01-01.+1992-01-01", sqls[1], re.S)
|
||||
assert re.search(r"LIMIT 110", sqls[1], re.S)
|
||||
assert not re.search(r"OFFSET 10", sqls[1], re.S)
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
|
||||
@with_config({"ROW_LIMIT": 4242})
|
||||
@patch("superset.common.query_context.QueryContext.get_query_result")
|
||||
def test_time_offset_comparison_queries_use_config_row_limit_without_chart_limit(
|
||||
query_result_mock: Mock,
|
||||
) -> None:
|
||||
"""Chart with row_offset only: subquery widens the config ROW_LIMIT by row_offset.
|
||||
|
||||
The schema fills `row_limit` with `app.config["ROW_LIMIT"]` when the payload
|
||||
omits it, so the query_object arrives with row_limit=4242. The subquery then
|
||||
covers the window via row_limit + row_offset = 4252.
|
||||
"""
|
||||
payload = _time_comparison_offset_queries_payload()
|
||||
del payload["queries"][0]["row_limit"]
|
||||
payload["queries"][0]["row_offset"] = 10
|
||||
|
||||
initial_df = pd.DataFrame(
|
||||
{
|
||||
"__timestamp": ["1990-01-01", "1990-01-01"],
|
||||
"name": ["zban", "ahwb"],
|
||||
"sum__num": [43571, 27225],
|
||||
}
|
||||
)
|
||||
mock_query_result = Mock()
|
||||
mock_query_result.df = initial_df
|
||||
query_result_mock.side_effect = [mock_query_result]
|
||||
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
df = query_context.get_query_result(query_object).df
|
||||
|
||||
payload["queries"][0]["time_offsets"] = ["1 year ago", "1 year later"]
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
|
||||
def cache_key_fn(qo: QueryObject, time_offset: str, time_grain: Any) -> str | None:
|
||||
return query_context._processor.query_cache_key(
|
||||
qo, time_offset=time_offset, time_grain=time_grain
|
||||
)
|
||||
|
||||
def cache_timeout_fn() -> int:
|
||||
return query_context._processor.get_cache_timeout()
|
||||
|
||||
time_offsets_obj = query_context.datasource.processing_time_offsets(
|
||||
df, query_object, cache_key_fn, cache_timeout_fn, query_context.force
|
||||
)
|
||||
sqls = time_offsets_obj["queries"]
|
||||
limit_pattern = re.compile(r"LIMIT\s+4252\b")
|
||||
assert len(sqls) == 2
|
||||
assert limit_pattern.search(sqls[0])
|
||||
assert not re.search(r"OFFSET 10", sqls[0], re.S)
|
||||
assert limit_pattern.search(sqls[1])
|
||||
assert not re.search(r"OFFSET 10", sqls[1], re.S)
|
||||
|
||||
|
||||
@pytest.mark.skip(
|
||||
reason=(
|
||||
"TODO: Fix test class to work with DuckDB example data format. "
|
||||
@@ -794,28 +918,17 @@ class TestQueryContext(SupersetTestCase):
|
||||
|
||||
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
|
||||
@patch("superset.common.query_context.QueryContext.get_query_result")
|
||||
def test_time_offsets_in_query_object_no_limit(self, query_result_mock):
|
||||
def test_time_offsets_in_query_object_uses_chart_row_limit(self, query_result_mock):
|
||||
"""
|
||||
Ensure that time_offsets can generate the correct queries and
|
||||
it doesnt use the row_limit nor row_offset from the original
|
||||
query object
|
||||
Subquery honors the chart's row_limit (widened by row_offset so the
|
||||
LEFT JOIN covers the main query's paginated window) and drops
|
||||
row_offset. Before this fix, row_limit was replaced with
|
||||
app.config["ROW_LIMIT"], which caused the main query and offset
|
||||
subquery to fetch different row counts.
|
||||
"""
|
||||
payload = get_query_context("birth_names")
|
||||
payload["queries"][0]["columns"] = [
|
||||
{
|
||||
"timeGrain": "P1D",
|
||||
"columnType": "BASE_AXIS",
|
||||
"sqlExpression": "ds",
|
||||
"label": "ds",
|
||||
"expressionType": "SQL",
|
||||
}
|
||||
]
|
||||
payload["queries"][0]["metrics"] = ["sum__num"]
|
||||
payload["queries"][0]["groupby"] = ["name"]
|
||||
payload["queries"][0]["is_timeseries"] = True
|
||||
payload = _time_comparison_offset_queries_payload()
|
||||
payload["queries"][0]["row_limit"] = 100
|
||||
payload["queries"][0]["row_offset"] = 10
|
||||
payload["queries"][0]["time_range"] = "1990 : 1991"
|
||||
|
||||
initial_data = {
|
||||
"__timestamp": ["1990-01-01", "1990-01-01"],
|
||||
@@ -839,33 +952,86 @@ class TestQueryContext(SupersetTestCase):
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
|
||||
def cache_key_fn(qo, time_offset, time_grain):
|
||||
def cache_key_fn(
|
||||
qo: QueryObject, time_offset: str, time_grain: Any
|
||||
) -> str | None:
|
||||
return query_context._processor.query_cache_key(
|
||||
qo, time_offset=time_offset, time_grain=time_grain
|
||||
)
|
||||
|
||||
def cache_timeout_fn():
|
||||
def cache_timeout_fn() -> int:
|
||||
return query_context._processor.get_cache_timeout()
|
||||
|
||||
time_offsets_obj = query_context.datasource.processing_time_offsets(
|
||||
df, query_object, cache_key_fn, cache_timeout_fn, query_context.force
|
||||
)
|
||||
sqls = time_offsets_obj["queries"]
|
||||
row_limit_value = current_app.config["ROW_LIMIT"]
|
||||
row_limit_pattern_with_config_value = r"LIMIT " + re.escape(
|
||||
str(row_limit_value)
|
||||
)
|
||||
assert len(sqls) == 2
|
||||
# 1 year ago
|
||||
# 1 year ago — subquery widens row_limit to cover main window (100 + 10)
|
||||
assert re.search(r"1989-01-01.+1990-01-01", sqls[0], re.S)
|
||||
assert not re.search(r"LIMIT 100", sqls[0], re.S)
|
||||
assert re.search(r"LIMIT 110", sqls[0], re.S)
|
||||
assert not re.search(r"OFFSET 10", sqls[0], re.S)
|
||||
assert re.search(row_limit_pattern_with_config_value, sqls[0], re.S)
|
||||
# 1 year later
|
||||
assert re.search(r"1991-01-01.+1992-01-01", sqls[1], re.S)
|
||||
assert not re.search(r"LIMIT 100", sqls[1], re.S)
|
||||
assert re.search(r"LIMIT 110", sqls[1], re.S)
|
||||
assert not re.search(r"OFFSET 10", sqls[1], re.S)
|
||||
|
||||
@pytest.mark.usefixtures("load_birth_names_dashboard_with_slices")
|
||||
@with_config({"ROW_LIMIT": 4242})
|
||||
@patch("superset.common.query_context.QueryContext.get_query_result")
|
||||
def test_time_offsets_use_config_row_limit_when_chart_has_offset_only(
|
||||
self, query_result_mock
|
||||
):
|
||||
"""
|
||||
Chart with row_offset only: subquery widens the config ROW_LIMIT by row_offset.
|
||||
|
||||
The schema fills row_limit with app.config["ROW_LIMIT"] (4242) when the
|
||||
payload omits it, so the subquery covers the window via 4242 + 10 = 4252.
|
||||
"""
|
||||
payload = _time_comparison_offset_queries_payload()
|
||||
del payload["queries"][0]["row_limit"]
|
||||
payload["queries"][0]["row_offset"] = 10
|
||||
|
||||
initial_data = {
|
||||
"__timestamp": ["1990-01-01", "1990-01-01"],
|
||||
"name": ["zban", "ahwb"],
|
||||
"sum__num": [43571, 27225],
|
||||
}
|
||||
initial_df = pd.DataFrame(initial_data)
|
||||
|
||||
mock_query_result = Mock()
|
||||
mock_query_result.df = initial_df
|
||||
query_result_mock.side_effect = [mock_query_result]
|
||||
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
query_result = query_context.get_query_result(query_object)
|
||||
df = query_result.df
|
||||
|
||||
payload["queries"][0]["time_offsets"] = ["1 year ago", "1 year later"]
|
||||
query_context = ChartDataQueryContextSchema().load(payload)
|
||||
query_object = query_context.queries[0]
|
||||
|
||||
def cache_key_fn(
|
||||
qo: QueryObject, time_offset: str, time_grain: Any
|
||||
) -> str | None:
|
||||
return query_context._processor.query_cache_key(
|
||||
qo, time_offset=time_offset, time_grain=time_grain
|
||||
)
|
||||
|
||||
def cache_timeout_fn() -> int:
|
||||
return query_context._processor.get_cache_timeout()
|
||||
|
||||
time_offsets_obj = query_context.datasource.processing_time_offsets(
|
||||
df, query_object, cache_key_fn, cache_timeout_fn, query_context.force
|
||||
)
|
||||
sqls = time_offsets_obj["queries"]
|
||||
limit_pattern = re.compile(r"LIMIT\s+4252\b")
|
||||
assert len(sqls) == 2
|
||||
assert limit_pattern.search(sqls[0])
|
||||
assert not re.search(r"OFFSET 10", sqls[0], re.S)
|
||||
assert limit_pattern.search(sqls[1])
|
||||
assert not re.search(r"OFFSET 10", sqls[1], re.S)
|
||||
assert re.search(row_limit_pattern_with_config_value, sqls[1], re.S)
|
||||
|
||||
|
||||
def test_get_label_map(app_context, virtual_dataset_comma_in_column_value):
|
||||
|
||||
@@ -700,6 +700,233 @@ def test_processing_time_offsets_date_range_enabled(processor):
|
||||
assert isinstance(result["cache_keys"], list)
|
||||
|
||||
|
||||
def test_processing_time_offsets_uses_chart_row_limit(processor):
|
||||
"""Offset subquery inherits the chart's row_limit when one is set."""
|
||||
from superset.common.query_object import QueryObject
|
||||
from superset.models.helpers import ExploreMixin
|
||||
|
||||
processor._qc_datasource.processing_time_offsets = (
|
||||
ExploreMixin.processing_time_offsets.__get__(processor._qc_datasource)
|
||||
)
|
||||
|
||||
df = pd.DataFrame({"__timestamp": ["1990-01-01"], "sum__num": [100]})
|
||||
|
||||
query_object = QueryObject(
|
||||
datasource=MagicMock(),
|
||||
granularity="ds",
|
||||
columns=[],
|
||||
metrics=["sum__num"],
|
||||
is_timeseries=True,
|
||||
row_limit=100,
|
||||
row_offset=0,
|
||||
time_offsets=["1 year ago"],
|
||||
filters=[
|
||||
{
|
||||
"col": "ds",
|
||||
"op": "TEMPORAL_RANGE",
|
||||
"val": "1990-01-01 : 1991-01-01",
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
captured: list[dict[str, Any]] = []
|
||||
|
||||
def fake_query(dct: dict[str, Any]) -> MagicMock:
|
||||
captured.append(dct)
|
||||
result = MagicMock()
|
||||
result.df = pd.DataFrame()
|
||||
result.query = "SELECT 1"
|
||||
return result
|
||||
|
||||
processor._qc_datasource.query = fake_query
|
||||
processor._qc_datasource.normalize_df = MagicMock(return_value=pd.DataFrame())
|
||||
|
||||
with (
|
||||
patch(
|
||||
"superset.models.helpers.get_since_until_from_query_object",
|
||||
return_value=(pd.Timestamp("1990-01-01"), pd.Timestamp("1991-01-01")),
|
||||
),
|
||||
patch(
|
||||
"superset.common.utils.query_cache_manager.QueryCacheManager"
|
||||
) as mock_cache_manager,
|
||||
patch.object(
|
||||
processor._qc_datasource,
|
||||
"get_time_grain",
|
||||
return_value=None,
|
||||
),
|
||||
patch.object(
|
||||
processor._qc_datasource,
|
||||
"join_offset_dfs",
|
||||
return_value=df,
|
||||
),
|
||||
):
|
||||
mock_cache = MagicMock()
|
||||
mock_cache.is_loaded = False
|
||||
mock_cache_manager.get.return_value = mock_cache
|
||||
|
||||
processor._qc_datasource.processing_time_offsets(
|
||||
df, query_object, None, None, False
|
||||
)
|
||||
|
||||
assert len(captured) == 1
|
||||
assert captured[0]["row_limit"] == 100
|
||||
assert captured[0]["row_offset"] == 0
|
||||
|
||||
|
||||
def test_processing_time_offsets_row_offset_extends_window(processor):
|
||||
"""Offset subquery limit covers the main query's window (row_limit + row_offset).
|
||||
|
||||
When the chart has pagination (row_offset > 0), fetching only row_limit rows
|
||||
in the offset period would likely miss the dimensions present in the main
|
||||
query's page, yielding null comparison values. The subquery instead drops
|
||||
row_offset and widens row_limit to cover the full window.
|
||||
"""
|
||||
from superset.common.query_object import QueryObject
|
||||
from superset.models.helpers import ExploreMixin
|
||||
|
||||
processor._qc_datasource.processing_time_offsets = (
|
||||
ExploreMixin.processing_time_offsets.__get__(processor._qc_datasource)
|
||||
)
|
||||
|
||||
df = pd.DataFrame({"__timestamp": ["1990-01-01"], "sum__num": [100]})
|
||||
|
||||
query_object = QueryObject(
|
||||
datasource=MagicMock(),
|
||||
granularity="ds",
|
||||
columns=[],
|
||||
metrics=["sum__num"],
|
||||
is_timeseries=True,
|
||||
row_limit=100,
|
||||
row_offset=10,
|
||||
time_offsets=["1 year ago"],
|
||||
filters=[
|
||||
{
|
||||
"col": "ds",
|
||||
"op": "TEMPORAL_RANGE",
|
||||
"val": "1990-01-01 : 1991-01-01",
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
captured: list[dict[str, Any]] = []
|
||||
|
||||
def fake_query(dct: dict[str, Any]) -> MagicMock:
|
||||
captured.append(dct)
|
||||
result = MagicMock()
|
||||
result.df = pd.DataFrame()
|
||||
result.query = "SELECT 1"
|
||||
return result
|
||||
|
||||
processor._qc_datasource.query = fake_query
|
||||
processor._qc_datasource.normalize_df = MagicMock(return_value=pd.DataFrame())
|
||||
|
||||
with (
|
||||
patch(
|
||||
"superset.models.helpers.get_since_until_from_query_object",
|
||||
return_value=(pd.Timestamp("1990-01-01"), pd.Timestamp("1991-01-01")),
|
||||
),
|
||||
patch(
|
||||
"superset.common.utils.query_cache_manager.QueryCacheManager"
|
||||
) as mock_cache_manager,
|
||||
patch.object(
|
||||
processor._qc_datasource,
|
||||
"get_time_grain",
|
||||
return_value=None,
|
||||
),
|
||||
patch.object(
|
||||
processor._qc_datasource,
|
||||
"join_offset_dfs",
|
||||
return_value=df,
|
||||
),
|
||||
):
|
||||
mock_cache = MagicMock()
|
||||
mock_cache.is_loaded = False
|
||||
mock_cache_manager.get.return_value = mock_cache
|
||||
|
||||
processor._qc_datasource.processing_time_offsets(
|
||||
df, query_object, None, None, False
|
||||
)
|
||||
|
||||
assert len(captured) == 1
|
||||
assert captured[0]["row_limit"] == 110
|
||||
assert captured[0]["row_offset"] == 0
|
||||
|
||||
|
||||
def test_processing_time_offsets_falls_back_to_config_row_limit(processor):
|
||||
"""Offset subquery uses app config ROW_LIMIT when chart has offset but no limit."""
|
||||
from superset.common.query_object import QueryObject
|
||||
from superset.models.helpers import ExploreMixin
|
||||
|
||||
processor._qc_datasource.processing_time_offsets = (
|
||||
ExploreMixin.processing_time_offsets.__get__(processor._qc_datasource)
|
||||
)
|
||||
|
||||
df = pd.DataFrame({"__timestamp": ["1990-01-01"], "sum__num": [100]})
|
||||
|
||||
query_object = QueryObject(
|
||||
datasource=MagicMock(),
|
||||
granularity="ds",
|
||||
columns=[],
|
||||
metrics=["sum__num"],
|
||||
is_timeseries=True,
|
||||
row_limit=None,
|
||||
row_offset=10,
|
||||
time_offsets=["1 year ago"],
|
||||
filters=[
|
||||
{
|
||||
"col": "ds",
|
||||
"op": "TEMPORAL_RANGE",
|
||||
"val": "1990-01-01 : 1991-01-01",
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
captured: list[dict[str, Any]] = []
|
||||
|
||||
def fake_query(dct: dict[str, Any]) -> MagicMock:
|
||||
captured.append(dct)
|
||||
result = MagicMock()
|
||||
result.df = pd.DataFrame()
|
||||
result.query = "SELECT 1"
|
||||
return result
|
||||
|
||||
processor._qc_datasource.query = fake_query
|
||||
processor._qc_datasource.normalize_df = MagicMock(return_value=pd.DataFrame())
|
||||
|
||||
with (
|
||||
patch(
|
||||
"superset.models.helpers.get_since_until_from_query_object",
|
||||
return_value=(pd.Timestamp("1990-01-01"), pd.Timestamp("1991-01-01")),
|
||||
),
|
||||
patch(
|
||||
"superset.common.utils.query_cache_manager.QueryCacheManager"
|
||||
) as mock_cache_manager,
|
||||
patch.object(
|
||||
processor._qc_datasource,
|
||||
"get_time_grain",
|
||||
return_value=None,
|
||||
),
|
||||
patch.object(
|
||||
processor._qc_datasource,
|
||||
"join_offset_dfs",
|
||||
return_value=df,
|
||||
),
|
||||
patch("superset.models.helpers.app") as mock_app,
|
||||
):
|
||||
mock_app.config = {"ROW_LIMIT": 4242}
|
||||
mock_cache = MagicMock()
|
||||
mock_cache.is_loaded = False
|
||||
mock_cache_manager.get.return_value = mock_cache
|
||||
|
||||
processor._qc_datasource.processing_time_offsets(
|
||||
df, query_object, None, None, False
|
||||
)
|
||||
|
||||
assert len(captured) == 1
|
||||
assert captured[0]["row_limit"] == 4242
|
||||
assert captured[0]["row_offset"] == 0
|
||||
|
||||
|
||||
def test_ensure_totals_available_updates_cache_values():
|
||||
"""
|
||||
Test that ensure_totals_available() updates the query objects AND
|
||||
|
||||
Reference in New Issue
Block a user