mirror of
https://github.com/grafana/grafana.git
synced 2025-01-27 16:57:14 -06:00
8c41137bcf
* chore(eslint): bump all eslint related packages to latest * chore(eslint): update linting scripts work with v9 * chore(eslint): introduce flat config * chore(eslint): delete legacy configs * feat(grafana-eslint-rules): update rules to use eslint 9 APIs * chore(eslint): migrate all nested eslintrc files over to root config * chore(packages): bump eslint dependencies * feat(betterer): make it work with eslint 9 * style(grafana-data): remove non-existant ban-types rule from disable declarations * chore(wip): [wip] link eslint-config-grafana * chore(packages): add @eslint/compat * chore(eslint): add compat to testing library and fix alerting rules * chore(eslint): bump grafana eslint-config to v8 * chore(explore): delete legacy eslint config * chore: clean codeowners file, remove grafana/eslint-config from e2e plugins * test(eslint-rules): fix no-border-radius-literal and no-aria-label-e2e-selectors rule tests * Add .js to prettier checks so new eslint.config.js file isn't missed * chore(eslint): move emotion/syntax-preference to grafana/defaults * test(eslint): use core-js structured-clone * revert(services): undo merge backend-format githook changes * test(eslint-rules): remove structured-clone polyfill from tests * chore(eslint): add back public/lib/monaco to ignore list, sort alphabetically * chore(e2e-plugins): remove eslint config 7 from plugins package.json --------- Co-authored-by: Tom Ratcliffe <tom.ratcliffe@grafana.com>
54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
// @ts-check
|
|
const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils');
|
|
|
|
const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/grafana/grafana/blob/main/packages/grafana-eslint-rules/README.md#${name}`);
|
|
|
|
const themeTokenUsage = createRule({
|
|
create(context) {
|
|
return {
|
|
Identifier: function (node) {
|
|
if (node.name === 'theme') {
|
|
const ancestors = context.sourceCode.getAncestors(node).reverse();
|
|
const paths = [];
|
|
let lastAncestor = null;
|
|
for (const ancestor of ancestors) {
|
|
if (
|
|
ancestor.type === AST_NODE_TYPES.MemberExpression &&
|
|
ancestor.property.type === AST_NODE_TYPES.Identifier
|
|
) {
|
|
paths.push(ancestor.property.name);
|
|
lastAncestor = ancestor;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
if (paths.length > 0 && lastAncestor) {
|
|
paths.unshift('theme');
|
|
context.report({
|
|
node: lastAncestor,
|
|
messageId: 'themeTokenUsed',
|
|
data: {
|
|
identifier: paths.join('.'),
|
|
},
|
|
});
|
|
}
|
|
}
|
|
},
|
|
};
|
|
},
|
|
name: 'theme-token-usage',
|
|
meta: {
|
|
type: 'problem',
|
|
docs: {
|
|
description: 'Check for theme token usage',
|
|
},
|
|
messages: {
|
|
themeTokenUsed: '{{ identifier }}',
|
|
},
|
|
schema: [],
|
|
},
|
|
defaultOptions: [],
|
|
});
|
|
|
|
module.exports = themeTokenUsage;
|