You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ha...@apache.org on 2026/09/12 09:16:17 UTC
(superset) 01/03: feat(build): migrate custom Superset-specific lint rules from ESLint to Oxlint
This is an automated email from the ASF dual-hosted git repository.
hainenber pushed a commit to branch feat/migrate-eslint-custom-rules-to-oxlint
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 9419f60649871a570342ce715ff1b66b3dd91946
Author: hainenber <do...@gmail.com>
AuthorDate: Sat Sep 12 14:16:01 2026 +0700
feat(build): migrate custom Superset-specific lint rules from ESLint to Oxlint
Signed-off-by: hainenber <do...@gmail.com>
---
.../i18n-strings/index.js} | 126 +-
.../i18n-strings}/no-eager-t-in-config.test.ts | 11 +-
.../i18n-strings}/no-template-vars.test.ts | 10 +-
.../i18n-strings}/package.json | 8 +-
.../index.ts => custom-lint-rules/icons/index.js} | 67 +-
.../icons}/no-fontawesome.test.ts | 15 +-
.../icons}/package.json | 8 +-
.../theme-colors/colors.js} | 7 +-
.../theme-colors/index.js} | 116 +-
.../theme-colors/no-literal-colors.test.ts} | 46 +-
.../theme-colors}/package.json | 11 +-
superset-frontend/jest.config.js | 2 +-
superset-frontend/package-lock.json | 1493 +-------------------
superset-frontend/package.json | 27 +-
superset-frontend/scripts/check-custom-rules.js | 6 +-
15 files changed, 266 insertions(+), 1687 deletions(-)
diff --git a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/index.ts b/superset-frontend/custom-lint-rules/i18n-strings/index.js
similarity index 67%
rename from superset-frontend/eslint-rules/eslint-plugin-i18n-strings/index.ts
rename to superset-frontend/custom-lint-rules/i18n-strings/index.js
index d433894196a..2137b4a560d 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/index.ts
+++ b/superset-frontend/custom-lint-rules/i18n-strings/index.js
@@ -22,14 +22,17 @@
* @author Apache
*/
-import type { Rule } from 'eslint';
-import type { Node } from 'estree';
-
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
-const plugin: { rules: Record<string, Rule.RuleModule> } = {
+import { eslintCompatPlugin } from '@oxlint/plugins';
+
+/** @type {{ rules: Record<string, import('oxlint').Rule.RuleModule> }} */
+const plugin = eslintCompatPlugin({
+ meta: {
+ name: '@superset-ui/i18n-strings',
+ },
rules: {
'no-template-vars': {
meta: {
@@ -39,17 +42,22 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
schema: [],
},
- create(context: Rule.RuleContext): Rule.RuleListener {
- function handler(node: Node): void {
- const callNode = node as Node & {
- arguments: Array<Node & { type: string; expressions?: Node[] }>;
- };
+ /** @param {import('eslint').Rule.RuleContext} context */
+ createOnce(context) {
+ /** @param {import('estree').Node} node */
+ function handler(node) {
+ /**
+ * @type {import('estree').Node & {
+ * arguments: Array<import('estree').Node & {
+ * type: string;
+ * expressions?: import('estree').Node[];
+ * }>;
+ * }}
+ */
+ const callNode = node;
// Check all arguments (e.g., tn has singular and plural templates)
for (const arg of callNode.arguments ?? []) {
- if (
- arg.type === 'TemplateLiteral' &&
- (arg as Node & { expressions?: Node[] }).expressions?.length
- ) {
+ if (arg.type === 'TemplateLiteral' && arg.expressions?.length) {
context.report({
node,
message:
@@ -90,23 +98,29 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
'Eager `{{property}}: {{fn}}(...)` is evaluated at module load, before i18n is initialized. Wrap in an arrow function: `{{property}}: () => {{fn}}(...)`.',
},
},
- create(context: Rule.RuleContext): Rule.RuleListener {
- const watchedProps: string[] = context.options[0]?.properties ?? [
+ /** @param {import('oxlint').Rule.RuleContext} context */
+ createOnce(context) {
+ /** @type {string[]} */
+ const watchedProps = context?.options?.[0]?.properties ?? [
'label',
'description',
];
const TRANSLATE_FNS = new Set(['t', 'tn']);
- function handler(node: Node): void {
- const prop = node as Node & {
- key: { type: string; name?: string; value?: string };
- value: Node & {
- type: string;
- callee?: { type: string; name?: string };
- };
- shorthand?: boolean;
- computed?: boolean;
- };
+ /** @param {import('estree').Node} node */
+ function handler(node) {
+ /**
+ * @type {import('estree').Node & {
+ * key: { type: string; name?: string; value?: string };
+ * value: import('estree').Node & {
+ * type: string;
+ * callee?: { type: string; name?: string };
+ * };
+ * shorthand?: boolean;
+ * computed?: boolean;
+ * }}
+ */
+ const prop = node;
if (prop.shorthand || prop.computed) return;
const keyName =
@@ -134,7 +148,7 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
messageId: 'eager',
data: { property: keyName, fn: callee.callee.name },
fix(fixer) {
- const source = context.getSourceCode().getText(prop.value);
+ const source = context.sourceCode.getText(prop.value);
return fixer.replaceText(prop.value, `() => ${source}`);
},
});
@@ -153,22 +167,23 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
schema: [],
},
- create(context: Rule.RuleContext): Rule.RuleListener {
- function isTitleCase(str: string): boolean {
+ /** @param {import('oxlint').Rule.RuleContext} context */
+ createOnce(context) {
+ /** @param {string} str */
+ function isTitleCase(str) {
// Match "Delete Dataset", "Create Chart", etc. (2+ title-cased words)
return /^[A-Z][a-z]+(\s+[A-Z][a-z]*)+$/.test(str);
}
- function isButtonContext(node: Node & { parent?: Node }): boolean {
- const { parent } = node as Node & {
- parent?: Node & Record<string, unknown>;
- };
+ /** @param {import('estree').Node & { parent?: import('estree').Node }} node */
+ function isButtonContext(node) {
+ const { parent } = node;
if (!parent) return false;
// Check for button-specific props
if (parent.type === 'Property') {
- const key = (parent as unknown as { key: { name: string } }).key
- .name;
+ const key =
+ /** @type {{ key: { name: string } }} */ (parent).key.name;
return [
'primaryButtonName',
'secondaryButtonName',
@@ -179,14 +194,15 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
// Check for Button components
// Cast to string because ESTree Node type doesn't include JSX types
- if ((parent.type as string) === 'JSXExpressionContainer') {
- const jsx = (parent as Node & { parent?: Node }).parent as
- | (Node & {
- type: string;
- openingElement?: { name: { name: string } };
- })
- | undefined;
- if ((jsx?.type as string) === 'JSXElement') {
+ if (parent.type === 'JSXExpressionContainer') {
+ /**
+ * @type {(import('estree').Node & {
+ * type: string;
+ * openingElement?: { name: { name: string } };
+ * }) | undefined}
+ */
+ const jsx = parent.parent;
+ if (jsx?.type === 'JSXElement') {
const elementName = jsx?.openingElement?.name.name;
return elementName === 'Button';
}
@@ -195,22 +211,26 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
return false;
}
- function handler(node: Node): void {
- const callNode = node as Node & {
- arguments: Array<Node & { type: string; value?: unknown }>;
- };
+ /** @param {import('estree').Node} node */
+ function handler(node) {
+ /**
+ * @type {import('estree').Node & {
+ * arguments: Array<import('estree').Node & {
+ * type: string;
+ * value?: unknown;
+ * }>;
+ * }}
+ */
+ const callNode = node;
// Check all string literal arguments (e.g., tn has singular and plural)
for (const arg of callNode.arguments ?? []) {
if (arg.type === 'Literal' && typeof arg.value === 'string') {
const text = arg.value;
- if (
- isButtonContext(node as Node & { parent?: Node }) &&
- isTitleCase(text)
- ) {
+ if (isButtonContext(node) && isTitleCase(text)) {
const sentenceCase = text
.toLowerCase()
- .replace(/^\w/, (c: string) => c.toUpperCase());
+ .replace(/^\w/, c => c.toUpperCase());
context.report({
node: arg,
message: `Button text should use sentence case: "${text}" should be "${sentenceCase}"`,
@@ -227,6 +247,6 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
},
},
-};
+});
-module.exports = plugin;
+export default plugin;
diff --git a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/no-eager-t-in-config.test.ts b/superset-frontend/custom-lint-rules/i18n-strings/no-eager-t-in-config.test.ts
similarity index 90%
rename from superset-frontend/eslint-rules/eslint-plugin-i18n-strings/no-eager-t-in-config.test.ts
rename to superset-frontend/custom-lint-rules/i18n-strings/no-eager-t-in-config.test.ts
index a6a9f11de7b..5a6f4eee3eb 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/no-eager-t-in-config.test.ts
+++ b/superset-frontend/custom-lint-rules/i18n-strings/no-eager-t-in-config.test.ts
@@ -16,15 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-import type { Rule } from 'eslint';
-const { RuleTester } = require('eslint');
-const plugin: { rules: Record<string, Rule.RuleModule> } = require('.');
+import { RuleTester } from 'oxlint/plugins-dev';
+import plugin from '.';
-const ruleTester = new RuleTester({
- parserOptions: { ecmaVersion: 2020, sourceType: 'module' },
-});
-const rule: Rule.RuleModule = plugin.rules['no-eager-t-in-config'];
+const ruleTester = new RuleTester();
+const rule = plugin.rules['no-eager-t-in-config'];
ruleTester.run('no-eager-t-in-config', rule, {
valid: [
diff --git a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/no-template-vars.test.ts b/superset-frontend/custom-lint-rules/i18n-strings/no-template-vars.test.ts
similarity index 83%
rename from superset-frontend/eslint-rules/eslint-plugin-i18n-strings/no-template-vars.test.ts
rename to superset-frontend/custom-lint-rules/i18n-strings/no-template-vars.test.ts
index 7476ce8aee0..20a002472fa 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/no-template-vars.test.ts
+++ b/superset-frontend/custom-lint-rules/i18n-strings/no-template-vars.test.ts
@@ -21,18 +21,16 @@
* @fileoverview Rule to warn about translation template variables
* @author Apache
*/
-/* eslint-disable no-template-curly-in-string */
-import type { Rule } from 'eslint';
-const { RuleTester } = require('eslint');
-const plugin: { rules: Record<string, Rule.RuleModule> } = require('.');
+import { RuleTester } from 'oxlint/plugins-dev';
+import plugin from '.';
//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
-const ruleTester = new RuleTester({ languageOptions: { ecmaVersion: 6 } });
-const rule: Rule.RuleModule = plugin.rules['no-template-vars'];
+const ruleTester = new RuleTester();
+const rule = plugin.rules['no-template-vars'];
const errors: Array<{ message: string }> = [
{
diff --git a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/package.json b/superset-frontend/custom-lint-rules/i18n-strings/package.json
similarity index 66%
rename from superset-frontend/eslint-rules/eslint-plugin-i18n-strings/package.json
rename to superset-frontend/custom-lint-rules/i18n-strings/package.json
index 4c532c27175..1b8bfe40d6e 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-i18n-strings/package.json
+++ b/superset-frontend/custom-lint-rules/i18n-strings/package.json
@@ -1,16 +1,18 @@
{
- "name": "@superset-ui/eslint-plugin-i18n-strings",
+ "name": "@superset-ui/lint-plugin-i18n-strings",
"version": "1.0.0",
"description": "Warns about translation variables",
"keywords": [],
"license": "Apache-2.0",
"author": "Apache",
- "main": "index.ts",
+ "type": "module",
+ "main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {},
"peerDependencies": {
- "eslint": ">=0.8.0"
+ "@oxlint/plugins": "*",
+ "jest": "*"
}
}
diff --git a/superset-frontend/eslint-rules/eslint-plugin-icons/index.ts b/superset-frontend/custom-lint-rules/icons/index.js
similarity index 64%
rename from superset-frontend/eslint-rules/eslint-plugin-icons/index.ts
rename to superset-frontend/custom-lint-rules/icons/index.js
index 280887348da..a0c6d9d2e5c 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-icons/index.ts
+++ b/superset-frontend/custom-lint-rules/icons/index.js
@@ -17,34 +17,46 @@
* under the License.
*/
+import { eslintCompatPlugin } from '@oxlint/plugins';
+
/**
* @fileoverview Rule to warn about direct imports from @ant-design/icons
* @author Apache
*/
-import type { Rule } from 'eslint';
-import type { Node } from 'estree';
-
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
-interface JSXAttribute {
- name?: { name: string };
- value?: { type: string; value?: string; expression?: { value: string } };
-}
+/**
+ * @typedef {Object} JSXAttribute
+ * @property {Object} [name]
+ * @property {string} [name.name]
+ * @property {Object} [value]
+ * @property {string} [value.type]
+ * @property {string} [value.value]
+ * @property {Object} [value.expression]
+ * @property {string} [value.expression.value]
+ */
-interface JSXOpeningElement {
- name: { name: string };
- attributes: JSXAttribute[];
-}
+/**
+ * @typedef {Object} JSXOpeningElement
+ * @property {Object} name
+ * @property {string} name.name
+ * @property {JSXAttribute[]} attributes
+ */
-interface JSXElementNode {
- type: string;
- openingElement: JSXOpeningElement;
-}
+/**
+ * @typedef {Object} JSXElementNode
+ * @property {string} type
+ * @property {JSXOpeningElement} openingElement
+ */
-const plugin: { rules: Record<string, Rule.RuleModule> } = {
+/** @type {{ rules: Record<string, import('oxlint').Rule.RuleModule> }} */
+const plugin = eslintCompatPlugin({
+ meta: {
+ name: '@superset-ui/icons',
+ },
rules: {
'no-fa-icons-usage': {
meta: {
@@ -56,16 +68,25 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
schema: [],
},
- create(context: Rule.RuleContext): Rule.RuleListener {
+ /**
+ * @param {import('oxlint').Rule.RuleContext} context
+ * @returns {import('oxlint').Rule.RuleListener}
+ */
+ createOnce(context) {
return {
- // Check for JSX elements with class names containing "fa"
- JSXElement(node: Node): void {
- const jsxNode = node as unknown as JSXElementNode;
+ /**
+ * Check for JSX elements with class names containing "fa"
+ * @param {import('estree').Node} node
+ * @returns {void}
+ */
+ JSXElement(node) {
+ /** @type {JSXElementNode} */
+ const jsxNode = node;
if (
jsxNode.openingElement &&
jsxNode.openingElement.name.name === 'i' &&
jsxNode.openingElement.attributes &&
- jsxNode.openingElement.attributes.some((attr: JSXAttribute) => {
+ jsxNode.openingElement.attributes.some(attr => {
if (attr.name?.name !== 'className') return false;
// Handle className="fa fa-home"
if (attr.value?.type === 'Literal') {
@@ -89,6 +110,6 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
},
},
-};
+});
-module.exports = plugin;
+export default plugin;
diff --git a/superset-frontend/eslint-rules/eslint-plugin-icons/no-fontawesome.test.ts b/superset-frontend/custom-lint-rules/icons/no-fontawesome.test.ts
similarity index 82%
copy from superset-frontend/eslint-rules/eslint-plugin-icons/no-fontawesome.test.ts
copy to superset-frontend/custom-lint-rules/icons/no-fontawesome.test.ts
index fc0d19d33aa..15fcdfa7485 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-icons/no-fontawesome.test.ts
+++ b/superset-frontend/custom-lint-rules/icons/no-fontawesome.test.ts
@@ -22,21 +22,14 @@
* @author Apache
*/
-import type { Rule } from 'eslint';
-
-const { RuleTester } = require('eslint');
-const plugin: { rules: Record<string, Rule.RuleModule> } = require('.');
+import { RuleTester } from 'oxlint/plugins-dev';
+import plugin from '.';
//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
-const ruleTester = new RuleTester({
- languageOptions: {
- ecmaVersion: 6,
- parserOptions: { ecmaFeatures: { jsx: true } },
- },
-});
-const rule: Rule.RuleModule = plugin.rules['no-fa-icons-usage'];
+const ruleTester = new RuleTester();
+const rule = plugin.rules['no-fa-icons-usage'];
const errors: Array<{ message: string }> = [
{
diff --git a/superset-frontend/eslint-rules/eslint-plugin-icons/package.json b/superset-frontend/custom-lint-rules/icons/package.json
similarity index 68%
rename from superset-frontend/eslint-rules/eslint-plugin-icons/package.json
rename to superset-frontend/custom-lint-rules/icons/package.json
index fced5fa7e65..522636b8e6b 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-icons/package.json
+++ b/superset-frontend/custom-lint-rules/icons/package.json
@@ -1,16 +1,18 @@
{
- "name": "@superset-ui/eslint-plugin-icons",
+ "name": "@superset-ui/lint-plugin-icons",
"version": "1.0.0",
"description": "Warns about direct usage of Ant Design icons",
"keywords": [],
"license": "Apache-2.0",
"author": "Apache",
- "main": "index.ts",
+ "type": "module",
+ "main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {},
"peerDependencies": {
- "eslint": ">=0.8.0"
+ "@oxlint/plugins": "*",
+ "jest": "*"
}
}
diff --git a/superset-frontend/eslint-rules/eslint-plugin-theme-colors/colors.ts b/superset-frontend/custom-lint-rules/theme-colors/colors.js
similarity index 97%
rename from superset-frontend/eslint-rules/eslint-plugin-theme-colors/colors.ts
rename to superset-frontend/custom-lint-rules/theme-colors/colors.js
index 46974c7331f..ec2a8eed4ca 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-theme-colors/colors.ts
+++ b/superset-frontend/custom-lint-rules/theme-colors/colors.js
@@ -18,7 +18,8 @@
*/
// https://www.w3.org/wiki/CSS/Properties/color/keywords
-const COLOR_KEYWORDS: string[] = [
+/** @type {string[]} */
+export const COLOR_KEYWORDS = [
'black',
'silver',
'gray',
@@ -153,6 +154,7 @@ const COLOR_KEYWORDS: string[] = [
'seagreen',
'seashell',
'sienna',
+ 'silver',
'skyblue',
'slateblue',
'slategray',
@@ -167,8 +169,7 @@ const COLOR_KEYWORDS: string[] = [
'turquoise',
'violet',
'wheat',
+ 'white',
'whitesmoke',
'yellowgreen',
];
-
-export default COLOR_KEYWORDS;
diff --git a/superset-frontend/eslint-rules/eslint-plugin-theme-colors/index.ts b/superset-frontend/custom-lint-rules/theme-colors/index.js
similarity index 66%
rename from superset-frontend/eslint-rules/eslint-plugin-theme-colors/index.ts
rename to superset-frontend/custom-lint-rules/theme-colors/index.js
index 6c6b7188f55..aad00e91b57 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-theme-colors/index.ts
+++ b/superset-frontend/custom-lint-rules/theme-colors/index.js
@@ -22,24 +22,35 @@
* @author Apache
*/
-import type { Rule } from 'eslint';
-import type { Node, SourceLocation } from 'estree';
+import { eslintCompatPlugin } from '@oxlint/plugins';
+import { COLOR_KEYWORDS } from './colors.js';
-import COLOR_KEYWORDS from './colors';
-
-function hasHexColor(quasi: string): boolean {
+/**
+ * @param {string} quasi
+ * @returns {boolean}
+ */
+function hasHexColor(quasi) {
const regex = /#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})\b/gi;
return !!quasi.match(regex);
}
-function hasRgbColor(quasi: string): boolean {
+/**
+ * @param {string} quasi
+ * @returns {boolean}
+ */
+function hasRgbColor(quasi) {
const regex = /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)/i;
return !!quasi.match(regex);
}
-function hasLiteralColor(quasi: string, strict: boolean = false): boolean {
+/**
+ * @param {string} quasi
+ * @param {boolean} [strict=false]
+ * @returns {boolean}
+ */
+function hasLiteralColor(quasi, strict = false) {
// matches literal colors at the start or end of a CSS prop
- return COLOR_KEYWORDS.some((color: string) => {
+ return COLOR_KEYWORDS.some(color => {
const regexColon = new RegExp(`: ${color}`);
const regexSemicolon = new RegExp(` ${color};`);
return (
@@ -50,31 +61,41 @@ function hasLiteralColor(quasi: string, strict: boolean = false): boolean {
});
}
-const WARNING_MESSAGE: string =
+/** @type {string} */
+const WARNING_MESSAGE =
'Theme color variables are preferred over rgb(a)/hex/literal colors';
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
-interface TemplateElementNode {
- type: string;
- value?: { raw: string };
- loc?: SourceLocation | null;
- parent?: {
- type: string;
- parent?: { type: string; loc?: SourceLocation | null };
- };
-}
+/**
+ * @typedef {Object} TemplateElementNode
+ * @property {string} type
+ * @property {Object} [value]
+ * @property {string} [value.raw]
+ * @property {Object} [loc]
+ * @property {Object} [parent]
+ * @property {string} [parent.type]
+ * @property {Object} [parent.parent]
+ * @property {string} [parent.parent.type]
+ * @property {Object} [parent.parent.loc]
+ */
-interface LiteralNode {
- type: string;
- value?: unknown;
- loc?: SourceLocation | null;
- parent?: { type: string };
-}
+/**
+ * @typedef {Object} LiteralNode
+ * @property {string} type
+ * @property {unknown} [value]
+ * @property {Object} [loc]
+ * @property {Object} [parent]
+ * @property {string} [parent.type]
+ */
-const plugin: { rules: Record<string, Rule.RuleModule> } = {
+/** @type {{ rules: Record<string, import('oxlint').Rule.RuleModule> }} */
+const plugin = eslintCompatPlugin({
+ meta: {
+ name: '@superset-ui/theme-colors',
+ },
rules: {
'no-literal-colors': {
meta: {
@@ -85,11 +106,22 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
schema: [],
},
- create(context: Rule.RuleContext): Rule.RuleListener {
- const warned: string[] = [];
+ /**
+ * @param {import('oxlint').Rule.RuleContext} context
+ * @returns {import('oxlint').Rule.RuleListener}
+ */
+ createOnce(context) {
+ /** @type {string[]} */
+ const warned = [];
+
return {
- TemplateElement(node: Node): void {
- const templateNode = node as TemplateElementNode;
+ /**
+ * @param {import('estree').Node} node
+ * @returns {void}
+ */
+ TemplateElement(node) {
+ /** @type {TemplateElementNode} */
+ const templateNode = node;
const rawValue = templateNode?.value?.raw;
const isChildParentTagged =
templateNode?.parent?.parent?.type === 'TaggedTemplateExpression';
@@ -100,6 +132,7 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
const loc = templateNode?.parent?.parent?.loc;
const locId = loc && JSON.stringify(loc);
const hasWarned = locId ? warned.includes(locId) : false;
+
if (
!hasWarned &&
(isChildParentTagged ||
@@ -111,7 +144,7 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
) {
context.report({
node,
- ...(loc && { loc: loc as SourceLocation }),
+ ...(loc && { loc }),
message: WARNING_MESSAGE,
});
if (locId) {
@@ -119,17 +152,22 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
}
}
},
- Literal(node: Node): void {
- const literalNode = node as LiteralNode;
+
+ /**
+ * @param {import('estree').Node} node
+ * @returns {void}
+ */
+ Literal(node) {
+ /** @type {LiteralNode} */
+ const literalNode = node;
const value = literalNode?.value;
+
// Only process string literals (not numbers, booleans, null, or RegExp)
if (typeof value !== 'string') {
return;
}
- const parent = literalNode?.parent as Node & {
- type: string;
- value?: Node;
- };
+
+ const parent = literalNode?.parent;
// Only check property values, not keys (e.g., { color: 'red' } not { red: 1 })
const isPropertyValue =
parent?.type === 'Property' && parent.value === node;
@@ -145,7 +183,7 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
) {
context.report({
node,
- ...(node.loc && { loc: node.loc as SourceLocation }),
+ ...(node.loc && { loc: node.loc }),
message: WARNING_MESSAGE,
});
if (locId) {
@@ -157,6 +195,6 @@ const plugin: { rules: Record<string, Rule.RuleModule> } = {
},
},
},
-};
+});
-module.exports = plugin;
+export default plugin;
diff --git a/superset-frontend/eslint-rules/eslint-plugin-icons/no-fontawesome.test.ts b/superset-frontend/custom-lint-rules/theme-colors/no-literal-colors.test.ts
similarity index 50%
rename from superset-frontend/eslint-rules/eslint-plugin-icons/no-fontawesome.test.ts
rename to superset-frontend/custom-lint-rules/theme-colors/no-literal-colors.test.ts
index fc0d19d33aa..9c4bd9ad15a 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-icons/no-fontawesome.test.ts
+++ b/superset-frontend/custom-lint-rules/theme-colors/no-literal-colors.test.ts
@@ -17,51 +17,45 @@
* under the License.
*/
-/**
- * @fileoverview Test file for the no-fa-icons-usage rule
- * @author Apache
- */
-
-import type { Rule } from 'eslint';
+import { RuleTester } from 'oxlint/plugins-dev';
+import plugin from '.';
-const { RuleTester } = require('eslint');
-const plugin: { rules: Record<string, Rule.RuleModule> } = require('.');
-
-//------------------------------------------------------------------------------
-// Tests
-//------------------------------------------------------------------------------
-const ruleTester = new RuleTester({
- languageOptions: {
- ecmaVersion: 6,
- parserOptions: { ecmaFeatures: { jsx: true } },
- },
-});
-const rule: Rule.RuleModule = plugin.rules['no-fa-icons-usage'];
+const ruleTester = new RuleTester();
+const rule = plugin.rules['no-literal-colors'];
const errors: Array<{ message: string }> = [
{
message:
- 'FontAwesome icons should not be used. Use the src/components/Icons component instead.',
+ 'Theme color variables are preferred over rgb(a)/hex/literal colors',
},
];
-ruleTester.run('no-fa-icons-usage', rule, {
- valid: ['<Icons.Database />', '<Icons.Search />'],
+ruleTester.run('no-literal-colors', rule, {
+ valid: [
+ 'const styles = { color: theme.colorText, background: theme.colorBg };',
+ "const colors = { red: 'not a property value' };",
+ "const color = 'red';",
+ 'styled.div`color: ${theme.colorText};`',
+ ],
invalid: [
{
- code: '<i className="fa fa-database"></i>',
+ code: "const styles = { color: 'red' };",
+ errors,
+ },
+ {
+ code: "const styles = { background: '#fff' };",
errors,
},
{
- code: '<i className="fa fa-search"></i>',
+ code: "const styles = { color: 'rgb(1, 2, 3)' };",
errors,
},
{
- code: '<i className="fa fa-home"></i>',
+ code: 'styled.div`color: red;`',
errors,
},
{
- code: '<i className="fa fa-arrow-right"></i>',
+ code: 'const styles = () => `background: #fff;`;',
errors,
},
],
diff --git a/superset-frontend/eslint-rules/eslint-plugin-theme-colors/package.json b/superset-frontend/custom-lint-rules/theme-colors/package.json
similarity index 55%
rename from superset-frontend/eslint-rules/eslint-plugin-theme-colors/package.json
rename to superset-frontend/custom-lint-rules/theme-colors/package.json
index f42959718b2..7b3ad275af7 100644
--- a/superset-frontend/eslint-rules/eslint-plugin-theme-colors/package.json
+++ b/superset-frontend/custom-lint-rules/theme-colors/package.json
@@ -1,13 +1,18 @@
{
- "name": "@superset-ui/eslint-plugin-theme-colors",
+ "name": "@superset-ui/lint-plugin-theme-colors",
"version": "1.0.0",
"description": "Warns about rgb(a)/hex/literal colors",
"keywords": [],
"license": "Apache-2.0",
"author": "Apache",
- "main": "index.ts",
+ "type": "module",
+ "main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
- "dependencies": {}
+ "dependencies": {},
+ "peerDependencies": {
+ "@oxlint/plugins": "*",
+ "jest": "*"
+ }
}
diff --git a/superset-frontend/jest.config.js b/superset-frontend/jest.config.js
index e62c3957e06..b96e0400c5b 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/jest.config.js
@@ -35,7 +35,7 @@ module.exports = {
// [/\\] matches both path separators so the suite also collects on
// native Windows, where jest hands the regex backslash-separated paths.
testRegex:
- '[/\\\\]superset-frontend[/\\\\](spec|src|plugins|packages|tools)[/\\\\].*(_spec|\\.test)\\.[jt]sx?$',
+ '[/\\\\]superset-frontend[/\\\\](spec|src|plugins|packages|tools|custom-lint-rules)[/\\\\].*(_spec|\\.test)\\.[jt]sx?$',
moduleNameMapper: {
'\\.(css|less|geojson)$': '<rootDir>/spec/__mocks__/mockExportObject.js',
'\\.(gif|ttf|eot|png|jpg)$': '<rootDir>/spec/__mocks__/mockExportString.js',
diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json
index 9a74634c4f1..01e5678fa9f 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -161,7 +161,6 @@
"@babel/cli": "^7.29.7",
"@babel/compat-data": "^7.28.4",
"@babel/core": "^7.29.7",
- "@babel/eslint-parser": "^7.29.7",
"@babel/node": "^7.29.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-export-namespace-from": "^7.29.7",
@@ -178,15 +177,13 @@
"@emotion/jest": "^11.14.2",
"@formatjs/intl-durationformat": "^0.10.18",
"@istanbuljs/nyc-config-typescript": "^1.0.1",
+ "@oxlint/plugins": "^1.81.0",
"@playwright/test": "^1.62.1",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.3",
"@storybook/addon-docs": "10.6.0",
"@storybook/addon-links": "10.6.0",
"@storybook/react-webpack5": "10.6.0",
"@storybook/test-runner": "0.24.5",
- "@superset-ui/eslint-plugin-i18n-strings": "file:eslint-rules/eslint-plugin-i18n-strings",
- "@superset-ui/eslint-plugin-icons": "file:eslint-rules/eslint-plugin-icons",
- "@superset-ui/eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
"@svgr/webpack": "^8.1.0",
"@swc/core": "^1.16.1",
"@swc/plugin-emotion": "^15.0.0",
@@ -215,8 +212,6 @@
"@types/rison": "0.1.0",
"@types/tinycolor2": "^1.4.3",
"@types/unzipper": "^0.10.11",
- "@typescript-eslint/eslint-plugin": "^8.69.0",
- "@typescript-eslint/parser": "^8.63.0",
"babel-jest": "^30.5.1",
"babel-loader": "^10.1.1",
"babel-plugin-dynamic-import-node": "^2.3.3",
@@ -227,17 +222,6 @@
"copy-webpack-plugin": "^14.0.0",
"cross-env": "^10.1.0",
"css-loader": "^7.1.5",
- "eslint": "^10.9.1",
- "eslint-import-resolver-alias": "^1.1.2",
- "eslint-import-resolver-typescript": "^4.4.5",
- "eslint-plugin-import": "^2.32.0",
- "eslint-plugin-jest-dom": "^5.10.1",
- "eslint-plugin-lodash": "^8.0.0",
- "eslint-plugin-no-only-tests": "^3.4.0",
- "eslint-plugin-react-prefer-function-component": "^5.0.0",
- "eslint-plugin-react-you-might-not-need-an-effect": "^1.0.2",
- "eslint-plugin-storybook": "10.6.0",
- "eslint-plugin-testing-library": "^7.16.2",
"fetch-mock": "^12.6.0",
"fork-ts-checker-webpack-plugin": "^9.1.0",
"history": "^5.3.0",
@@ -296,30 +280,6 @@
"regenerator-runtime": "^0.14.1"
}
},
- "eslint-rules/eslint-plugin-i18n-strings": {
- "name": "@superset-ui/eslint-plugin-i18n-strings",
- "version": "1.0.0",
- "dev": true,
- "license": "Apache-2.0",
- "peerDependencies": {
- "eslint": ">=0.8.0"
- }
- },
- "eslint-rules/eslint-plugin-icons": {
- "name": "@superset-ui/eslint-plugin-icons",
- "version": "1.0.0",
- "dev": true,
- "license": "Apache-2.0",
- "peerDependencies": {
- "eslint": ">=0.8.0"
- }
- },
- "eslint-rules/eslint-plugin-theme-colors": {
- "name": "@superset-ui/eslint-plugin-theme-colors",
- "version": "1.0.0",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/@adobe/css-tools": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz",
@@ -614,35 +574,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/@babel/eslint-parser": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz",
- "integrity": "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
- "eslint-visitor-keys": "^2.1.0",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.11.0",
- "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
- }
- },
- "node_modules/@babel/eslint-parser/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/generator": {
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
@@ -3908,129 +3839,6 @@
"node": ">=18"
}
},
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
- "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.23.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
- "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^3.0.5",
- "debug": "^4.3.1",
- "minimatch": "^10.2.4"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/config-array/node_modules/minimatch": {
- "version": "10.2.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
- "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.5"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz",
- "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/core": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
- "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
- "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
- "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
"node_modules/@exodus/bytes": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.8.0.tgz",
@@ -4207,72 +4015,6 @@
"@hapi/hoek": "^11.0.2"
}
},
- "node_modules/@humanfs/core": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
- "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/types": "^0.15.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
- "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.2",
- "@humanfs/types": "^0.15.0",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/types": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
- "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
"node_modules/@inquirer/ansi": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
@@ -8246,16 +7988,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
- "version": "5.1.1-v1",
- "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
- "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-scope": "5.1.1"
- }
- },
"node_modules/@noble/hashes": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
@@ -10622,6 +10354,19 @@
"node": "^20.19.0 || >=22.12.0"
}
},
+ "node_modules/@oxlint/plugins": {
+ "version": "1.81.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/plugins/-/plugins-1.81.0.tgz",
+ "integrity": "sha512-HhD8kd3r6XpelZkhxhRty/po8V6yK1VV63Eq4kSsOS2IoHUywG3DV2EX+z/ZHw46aLI74Y6aA604NRiAqLKW9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/oxc-project"
+ }
+ },
"node_modules/@parcel/watcher": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
@@ -12203,13 +11948,6 @@
"@rjsf/utils": "^6.8.0"
}
},
- "node_modules/@rtsao/scc": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
- "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@scarf/scarf": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
@@ -12963,18 +12701,6 @@
"resolved": "packages/superset-ui-core",
"link": true
},
- "node_modules/@superset-ui/eslint-plugin-i18n-strings": {
- "resolved": "eslint-rules/eslint-plugin-i18n-strings",
- "link": true
- },
- "node_modules/@superset-ui/eslint-plugin-icons": {
- "resolved": "eslint-rules/eslint-plugin-icons",
- "link": true
- },
- "node_modules/@superset-ui/eslint-plugin-theme-colors": {
- "resolved": "eslint-rules/eslint-plugin-theme-colors",
- "link": true
- },
"node_modules/@superset-ui/generator-superset": {
"resolved": "packages/generator-superset",
"link": true
@@ -14178,13 +13904,6 @@
"integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==",
"license": "MIT"
},
- "node_modules/@types/esrecurse": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
- "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -14427,13 +14146,6 @@
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"license": "MIT"
},
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/lodash": {
"version": "4.17.25",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz",
@@ -14945,265 +14657,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz",
- "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.69.0",
- "@typescript-eslint/type-utils": "8.69.0",
- "@typescript-eslint/utils": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0",
- "ignore": "^7.0.5",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.69.0",
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz",
- "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.69.0",
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/project-service": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz",
- "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.69.0",
- "@typescript-eslint/types": "^8.69.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz",
- "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz",
- "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz",
- "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0",
- "@typescript-eslint/utils": "8.69.0",
- "debug": "^4.4.3",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz",
- "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz",
- "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/project-service": "8.69.0",
- "@typescript-eslint/tsconfig-utils": "8.69.0",
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0",
- "debug": "^4.4.3",
- "minimatch": "^10.2.2",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz",
- "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.69.0",
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz",
- "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.69.0",
- "eslint-visitor-keys": "^5.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
@@ -16499,16 +15952,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
"node_modules/acorn-walk": {
"version": "8.3.5",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
@@ -16930,29 +16373,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/array-includes": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
- "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.24.0",
- "es-object-atoms": "^1.1.1",
- "get-intrinsic": "^1.3.0",
- "is-string": "^1.1.1",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/array-union": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
@@ -16965,66 +16385,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
- "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.9",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "es-shim-unscopables": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
- "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
- "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/array.prototype.reduce": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz",
@@ -21636,19 +20996,6 @@
"node": ">= 0.4"
}
},
- "node_modules/es-shim-unscopables": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
- "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/es-to-primitive": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
@@ -21773,574 +21120,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/eslint": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz",
- "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==",
- "dev": true,
- "license": "MIT",
- "workspaces": [
- "packages/*"
- ],
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.8.0",
- "@eslint-community/regexpp": "^4.12.2",
- "@eslint/config-array": "^0.23.5",
- "@eslint/config-helpers": "^0.7.0",
- "@eslint/core": "^1.2.1",
- "@eslint/plugin-kit": "^0.7.2",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "ajv": "^6.14.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^9.1.2",
- "eslint-visitor-keys": "^5.0.1",
- "espree": "^11.2.0",
- "esquery": "^1.7.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "minimatch": "^10.2.5",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-import-context": {
- "version": "0.1.9",
- "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz",
- "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-tsconfig": "^4.10.1",
- "stable-hash-x": "^0.2.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-import-context"
- },
- "peerDependencies": {
- "unrs-resolver": "^1.0.0"
- },
- "peerDependenciesMeta": {
- "unrs-resolver": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-import-resolver-alias": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz",
- "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- },
- "peerDependencies": {
- "eslint-plugin-import": ">=1.4.0"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-import-resolver-typescript": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.5.tgz",
- "integrity": "sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "debug": "^4.4.1",
- "eslint-import-context": "^0.1.8",
- "get-tsconfig": "^4.10.1",
- "is-bun-module": "^2.0.0",
- "stable-hash-x": "^0.2.0",
- "tinyglobby": "^0.2.14",
- "unrs-resolver": "^1.7.11"
- },
- "engines": {
- "node": "^16.17.0 || >=18.6.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-import-resolver-typescript"
- },
- "peerDependencies": {
- "eslint": "*",
- "eslint-plugin-import": "*",
- "eslint-plugin-import-x": "*"
- },
- "peerDependenciesMeta": {
- "eslint-plugin-import": {
- "optional": true
- },
- "eslint-plugin-import-x": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
- "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.32.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
- "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rtsao/scc": "^1.1.0",
- "array-includes": "^3.1.9",
- "array.prototype.findlastindex": "^1.2.6",
- "array.prototype.flat": "^1.3.3",
- "array.prototype.flatmap": "^1.3.3",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.12.1",
- "hasown": "^2.0.2",
- "is-core-module": "^2.16.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "object.groupby": "^1.0.3",
- "object.values": "^1.2.1",
- "semver": "^6.3.1",
- "string.prototype.trimend": "^1.0.9",
- "tsconfig-paths": "^3.15.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/eslint-plugin-jest-dom": {
- "version": "5.10.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest-dom/-/eslint-plugin-jest-dom-5.10.1.tgz",
- "integrity": "sha512-IIJdzbACbhJUJyMAqpA9E9gxp1Gv29TeQ3DtL+pepwP8Oq2WiqjOB2HbnEIs23h0ewdKIZRDI56yLro2eUO+DA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "requireindex": "^1.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
- "npm": ">=6",
- "yarn": ">=1"
- },
- "peerDependencies": {
- "@testing-library/dom": "^8.0.0 || ^9.0.0 || ^10.0.0",
- "eslint": "^6.8.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "@testing-library/dom": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-plugin-lodash": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-lodash/-/eslint-plugin-lodash-8.0.0.tgz",
- "integrity": "sha512-7DA8485FolmWRzh+8t4S8Pzin2TTuWfb0ZW3j/2fYElgk82ZanFz8vDcvc4BBPceYdX1p/za+tkbO68maDBGGw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.21"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": ">=9.0.0"
- }
- },
- "node_modules/eslint-plugin-no-only-tests": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.4.0.tgz",
- "integrity": "sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=5.0.0"
- }
- },
- "node_modules/eslint-plugin-react-prefer-function-component": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-prefer-function-component/-/eslint-plugin-react-prefer-function-component-5.0.0.tgz",
- "integrity": "sha512-kXRP41OT/hgR8QDlHCO2tOFGbQgXcER58xjV3nlNOggGvRoSZ5u3wdqogWnD/W2lOTmk/noNOLDt3LRD39G9iQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint-plugin-react-you-might-not-need-an-effect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-you-might-not-need-an-effect/-/eslint-plugin-react-you-might-not-need-an-effect-1.0.2.tgz",
- "integrity": "sha512-HgYol2zhH3KbnW9Q4FY/FcIINbsYVL6rwQESChqBC2s9SLWtw1wg05+J7SCrr3BfQpNY2ReYhf8xjpd2JhKJOQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "globals": "^16.2.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/nickjvandyke"
- },
- "peerDependencies": {
- "eslint": ">=8.40.0"
- }
- },
- "node_modules/eslint-plugin-react-you-might-not-need-an-effect/node_modules/globals": {
- "version": "16.5.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
- "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint-plugin-storybook": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.6.0.tgz",
- "integrity": "sha512-HK3yD5Nslv97buJ5JfT1xFkTOoyJgGIENmBoZZI3F8t2UpBzb/dHpKyCh5bQ8AvJWnhoM/WAtDNqyd9nq6xgcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "^8.60.0",
- "@typescript-eslint/utils": "^8.60.0"
- },
- "peerDependencies": {
- "eslint": ">=8"
- }
- },
- "node_modules/eslint-plugin-testing-library": {
- "version": "7.16.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.16.2.tgz",
- "integrity": "sha512-8gleGnQXK2ZA3hHwjCwpYTZvM+9VsrJ+/9kDI8CjqAQGAdMQOdn/rJNu7ZySENuiWlGKQWyZJ4ZjEg2zamaRHw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "^8.56.0",
- "@typescript-eslint/utils": "^8.56.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/eslint-scope/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint/node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/eslint/node_modules/eslint-scope": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
- "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@types/esrecurse": "^4.3.1",
- "@types/estree": "^1.0.8",
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/eslint/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint/node_modules/minimatch": {
- "version": "10.2.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
- "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.5"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/espree": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
- "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.16.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^5.0.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree/node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/espree/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -22354,32 +21133,6 @@
"node": ">=4"
}
},
- "node_modules/esquery": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
- "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
@@ -22903,33 +21656,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/file-entry-cache/node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
@@ -24410,19 +23136,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-tsconfig": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
- "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve-pkg-maps": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
- }
- },
"node_modules/get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -25638,16 +24351,6 @@
],
"license": "BSD-3-Clause"
},
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
"node_modules/ignore-walk": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz",
@@ -26052,16 +24755,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-bun-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
- "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "semver": "^7.7.1"
- }
- },
"node_modules/is-callable": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
@@ -31050,13 +29743,6 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"license": "MIT"
},
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/json-stringify-nice": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz",
@@ -31832,20 +30518,6 @@
"node": ">=6"
}
},
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/libnpmaccess": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-10.0.3.tgz",
@@ -35467,25 +34139,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.fromentries": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
- "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/object.getownpropertydescriptors": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz",
@@ -35508,40 +34161,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.groupby": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
- "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.values": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
- "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/objectorarray": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
@@ -35736,24 +34355,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/ora": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
@@ -37050,16 +35651,6 @@
"url": "https://opencollective.com/preact"
}
},
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/pretty-error": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
@@ -40071,16 +38662,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/requireindex": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
- "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.5"
- }
- },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -40163,16 +38744,6 @@
"integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
"license": "MIT"
},
- "node_modules/resolve-pkg-maps": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
- "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
- }
- },
"node_modules/resolve-protobuf-schema": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
@@ -41452,16 +40023,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/stable-hash-x": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz",
- "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- }
- },
"node_modules/stack-utils": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@@ -43501,19 +42062,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/ts-api-utils": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
- "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
"node_modules/ts-dedent": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
@@ -43768,19 +42316,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 89649c5d0d0..c288e226f7e 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -238,7 +238,6 @@
"@babel/cli": "^7.29.7",
"@babel/compat-data": "^7.28.4",
"@babel/core": "^7.29.7",
- "@babel/eslint-parser": "^7.29.7",
"@babel/node": "^7.29.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-export-namespace-from": "^7.29.7",
@@ -255,15 +254,13 @@
"@emotion/jest": "^11.14.2",
"@formatjs/intl-durationformat": "^0.10.18",
"@istanbuljs/nyc-config-typescript": "^1.0.1",
+ "@oxlint/plugins": "^1.81.0",
"@playwright/test": "^1.62.1",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.3",
"@storybook/addon-docs": "10.6.0",
"@storybook/addon-links": "10.6.0",
"@storybook/react-webpack5": "10.6.0",
"@storybook/test-runner": "0.24.5",
- "@superset-ui/eslint-plugin-i18n-strings": "file:eslint-rules/eslint-plugin-i18n-strings",
- "@superset-ui/eslint-plugin-icons": "file:eslint-rules/eslint-plugin-icons",
- "@superset-ui/eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
"@svgr/webpack": "^8.1.0",
"@swc/core": "^1.16.1",
"@swc/plugin-emotion": "^15.0.0",
@@ -292,8 +289,6 @@
"@types/rison": "0.1.0",
"@types/tinycolor2": "^1.4.3",
"@types/unzipper": "^0.10.11",
- "@typescript-eslint/eslint-plugin": "^8.69.0",
- "@typescript-eslint/parser": "^8.63.0",
"babel-jest": "^30.5.1",
"babel-loader": "^10.1.1",
"babel-plugin-dynamic-import-node": "^2.3.3",
@@ -304,17 +299,6 @@
"copy-webpack-plugin": "^14.0.0",
"cross-env": "^10.1.0",
"css-loader": "^7.1.5",
- "eslint": "^10.9.1",
- "eslint-import-resolver-alias": "^1.1.2",
- "eslint-import-resolver-typescript": "^4.4.5",
- "eslint-plugin-import": "^2.32.0",
- "eslint-plugin-jest-dom": "^5.10.1",
- "eslint-plugin-lodash": "^8.0.0",
- "eslint-plugin-no-only-tests": "^3.4.0",
- "eslint-plugin-react-prefer-function-component": "^5.0.0",
- "eslint-plugin-react-you-might-not-need-an-effect": "^1.0.2",
- "eslint-plugin-storybook": "10.6.0",
- "eslint-plugin-testing-library": "^7.16.2",
"fetch-mock": "^12.6.0",
"fork-ts-checker-webpack-plugin": "^9.1.0",
"history": "^5.3.0",
@@ -369,9 +353,6 @@
"regenerator-runtime": "^0.14.1"
},
"overrides": {
- "@babel/eslint-parser": {
- "eslint": "$eslint"
- },
"@deck.gl/aggregation-layers": "~9.2.5",
"@deck.gl/core": "~9.2.5",
"@deck.gl/extensions": "~9.2.5",
@@ -400,12 +381,6 @@
},
"dompurify": "^3.4.13",
"esbuild": "^0.28.1",
- "eslint-plugin-import": {
- "eslint": "$eslint"
- },
- "eslint-plugin-jest-dom": {
- "eslint": "$eslint"
- },
"fast-uri": "^3.1.7",
"fast-xml-parser": "^5.8.0",
"http-proxy-middleware": "^2.0.10",
diff --git a/superset-frontend/scripts/check-custom-rules.js b/superset-frontend/scripts/check-custom-rules.js
index c8ab418336f..3a5b4993093 100755
--- a/superset-frontend/scripts/check-custom-rules.js
+++ b/superset-frontend/scripts/check-custom-rules.js
@@ -238,15 +238,13 @@ function checkEagerTranslationsInConfig(ast, filepath) {
if (hasEslintDisable(path, 'i18n-strings/no-eager-t-in-config')) return;
// Warn (not error) because there are many pre-existing violations.
- // The ESLint plugin provides an autofix so authors can sweep files
- // as they touch them. Promote to error once the codebase is clean.
+ // Promote to error once the codebase is clean.
// eslint-disable-next-line no-console
console.warn(
`${YELLOW}⚠${RESET} ${filepath}:${node.loc?.start.line ?? '?'}: ` +
`Eager \`${keyName}: ${value.callee.name}(...)\` is evaluated at ` +
`module load, before i18n is initialized. Wrap in an arrow ` +
- `function: \`${keyName}: () => ${value.callee.name}(...)\`. ` +
- `Run \`eslint --fix\` to autofix.`,
+ `function: \`${keyName}: () => ${value.callee.name}(...)\`. `,
);
warningCount += 1;
},