grafana/packages/grafana-eslint-rules/rules/theme-token-usage.cjs
Jack Westbrook 8c41137bcf
Frontend: Update to Eslint 9 (#94823)
* 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>
2024-11-07 16:31:06 +01:00

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;