grafana/packages/grafana-eslint-rules/rules/theme-token-usage.cjs
Ashley Harrison ae4810f854
Chore: Emit theme token usage metrics (#72500)
* create rule to find instances of theme variables

* emit theme token usage metrics

* move awking into script

* make sure theme usage is covering ts and tsx files, remove commented lines
2023-07-28 17:08:02 +03:00

52 lines
1.4 KiB
JavaScript

// @ts-check
const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils');
const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/grafana/grafana#${name}`);
const themeTokenUsage = createRule({
create(context) {
return {
Identifier: function (node) {
if (node.name === 'theme') {
const ancestors = context.getAncestors().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',
recommended: false,
},
messages: {
themeTokenUsed: '{{ identifier }}',
},
schema: [],
},
defaultOptions: [],
});
module.exports = themeTokenUsage;