@atlaskit/stylelint-design-system
Version:
Stylelint plugin for use with the Atlassian Design System.
93 lines (90 loc) • 3.47 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import valueParser from 'postcss-value-parser';
import stylelint from 'stylelint';
import renameMapping from '@atlaskit/tokens/rename-mapping';
import { getCSSCustomProperty } from '@atlaskit/tokens/utils/get-css-custom-property';
import { isFunction } from '../../utils/is-function';
import { isWord } from '../../utils/is-word';
export var ruleName = 'design-system/no-deprecated-design-token-usage';
export var messages = stylelint.utils.ruleMessages(ruleName, {
invalidToken: function invalidToken(name, replacement) {
return "The token '".concat(name, "' has been deprecated. Please use ").concat(replacement, " instead.");
},
deprecatedToken: function deprecatedToken(name) {
return "The token '".concat(name, "' is deprecated, Please refer to the changelog for guidance on how to migrate. https://atlassian.design/components/tokens/changelog");
}
});
var isDeprecatedToken = function isDeprecatedToken(node) {
return isWord(node) && node.value.startsWith('--ds-') && renameMapping.filter(function (_ref) {
var state = _ref.state;
return state === 'deprecated';
}).some(function (token) {
return getCSSCustomProperty(token.path) === node.value;
});
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var ruleBase = function ruleBase(isEnabled) {
var flags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var context = arguments.length > 2 ? arguments[2] : undefined;
return function (root, result) {
var validOptions = stylelint.utils.validateOptions(result, ruleName, {
actual: isEnabled,
possible: [true, false]
});
if (!validOptions || !isEnabled) {
return;
}
root.walkDecls(function (decl) {
var parsedValue = valueParser(decl.value);
parsedValue.walk(function (node) {
if (!isFunction(node) || node.value !== 'var') {
return;
}
var _node$nodes = _slicedToArray(node.nodes, 1),
head = _node$nodes[0];
if (!head) {
return;
}
if (isDeprecatedToken(head)) {
var tokenMeta = renameMapping.find(function (_ref2) {
var path = _ref2.path;
return getCSSCustomProperty(path) === head.value;
});
if (!tokenMeta) {
return;
}
if (tokenMeta.replacement) {
var replacement = getCSSCustomProperty(tokenMeta.replacement);
if (context.fix) {
decl.value = decl.value.replace(head.value, replacement);
return;
} else {
return stylelint.utils.report({
message: messages.invalidToken(head.value, replacement),
node: decl,
word: node.value,
result: result,
ruleName: ruleName
});
}
}
// No replacement specified
return stylelint.utils.report({
message: messages.deprecatedToken(head.value),
node: decl,
word: node.value,
result: result,
ruleName: ruleName
});
}
});
});
};
};
var rule = Object.assign(ruleBase, {
ruleName: ruleName,
messages: messages
});
var plugin = stylelint.createPlugin(ruleName, rule);
// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
export default plugin;