@atlaskit/eslint-plugin-design-system
Version:
The essential plugin for use with the Atlassian Design System.
78 lines (77 loc) • 2.47 kB
JavaScript
import renameMapping from '@atlaskit/tokens/rename-mapping';
import { getTokenId } from '@atlaskit/tokens/utils/get-token-id';
import { createLintRule } from '../utils/create-lint-rule';
var rule = createLintRule({
meta: {
name: 'no-deprecated-design-token-usage',
docs: {
description: 'Disallow using deprecated design tokens.',
recommended: true,
severity: 'warn'
},
hasSuggestions: true,
type: 'problem',
messages: {
tokenDeprecated: 'The token "{{name}}" is deprecated, Please refer to the changelog for guidance on how to migrate. https://atlassian.design/components/tokens/changelog',
tokenRenamed: 'The token "{{name}}" is deprecated in favour of "{{replacement}}".'
}
},
create: function create(context) {
return {
'CallExpression[callee.name="token"]': function CallExpressionCalleeNameToken(node) {
if (node.type !== 'CallExpression') {
return;
}
if (node.arguments[0].type !== 'Literal') {
return;
}
var tokenKey = node.arguments[0].value;
if (!tokenKey) {
return;
}
if (typeof tokenKey !== 'string') {
return;
}
var migrationMeta = renameMapping.filter(function (t) {
return t.state === 'deprecated';
}).find(function (t) {
return getTokenId(t.path) === tokenKey;
});
if (!migrationMeta) {
return;
}
if (migrationMeta.replacement) {
// Replacement specified, apply fixer
var replacement = getTokenId(migrationMeta.replacement);
context.report({
messageId: 'tokenRenamed',
node: node,
data: {
name: tokenKey,
replacement: replacement
},
suggest: [{
desc: "Replace with '".concat(replacement, "'"),
fix: function fix(fixer) {
return fixer.replaceText(node.arguments[0], "'".concat(replacement, "'"));
}
}]
});
return;
}
// No replacement specified
if (migrationMeta.state === 'deprecated' && !migrationMeta.replacement) {
context.report({
messageId: 'tokenDeprecated',
node: node,
data: {
name: tokenKey
}
});
return;
}
}
};
}
});
export default rule;