UNPKG

@atlaskit/stylelint-design-system

Version:

Stylelint plugin for use with the Atlassian Design System.

93 lines (90 loc) • 3.47 kB
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;