index.cjs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // NOTICE: This file is generated by Rollup. To modify it,
  2. // please instead edit the ESM counterpart and rebuild with Rollup (npm run build).
  3. 'use strict';
  4. const node_module = require('node:module');
  5. const cssParserAlgorithms = require('@csstools/css-parser-algorithms');
  6. const cssTokenizer = require('@csstools/css-tokenizer');
  7. const validateTypes = require('../../utils/validateTypes.cjs');
  8. const nodeFieldIndices = require('../../utils/nodeFieldIndices.cjs');
  9. const isCustomFunction = require('../../utils/isCustomFunction.cjs');
  10. const isStandardSyntaxValue = require('../../utils/isStandardSyntaxValue.cjs');
  11. const optionsMatches = require('../../utils/optionsMatches.cjs');
  12. const report = require('../../utils/report.cjs');
  13. const ruleMessages = require('../../utils/ruleMessages.cjs');
  14. const validateOptions = require('../../utils/validateOptions.cjs');
  15. var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
  16. /** @todo leverage import attributes once support for Node.js v18.19 is dropped */
  17. const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('lib/rules/function-no-unknown/index.cjs', document.baseURI).href)));
  18. const functionsList = require$1('css-functions-list/index.json');
  19. const FUNCTIONS = [
  20. ...functionsList,
  21. // https://drafts.csswg.org/css-values-5/#if-notation
  22. 'if',
  23. 'media',
  24. 'style',
  25. 'supports',
  26. // niksy/css-functions-list#10
  27. 'content',
  28. 'running',
  29. 'string',
  30. // https://drafts.csswg.org/css-values-5/#tree-counting
  31. 'sibling-count',
  32. 'sibling-index',
  33. // https://drafts.csswg.org/css-color-5/#contrast-color
  34. 'contrast-color',
  35. ];
  36. const ruleName = 'function-no-unknown';
  37. const messages = ruleMessages(ruleName, {
  38. rejected: (name) => `Unexpected unknown function "${name}"`,
  39. });
  40. const meta = {
  41. url: 'https://stylelint.io/user-guide/rules/function-no-unknown',
  42. };
  43. /** @type {import('stylelint').CoreRules[ruleName]} */
  44. const rule = (primary, secondaryOptions) => {
  45. return (root, result) => {
  46. const validOptions = validateOptions(
  47. result,
  48. ruleName,
  49. { actual: primary },
  50. {
  51. actual: secondaryOptions,
  52. possible: {
  53. ignoreFunctions: [validateTypes.isString, validateTypes.isRegExp],
  54. },
  55. optional: true,
  56. },
  57. );
  58. if (!validOptions) {
  59. return;
  60. }
  61. root.walkDecls((decl) => {
  62. const { value } = decl;
  63. if (!value.includes('(')) return;
  64. if (!isStandardSyntaxValue(value)) return;
  65. cssParserAlgorithms.walk(cssParserAlgorithms.parseListOfComponentValues(cssTokenizer.tokenize({ css: value })), ({ node }) => {
  66. if (!cssParserAlgorithms.isFunctionNode(node)) return;
  67. const name = node.getName();
  68. if (isCustomFunction(name)) return;
  69. if (optionsMatches(secondaryOptions, 'ignoreFunctions', name)) return;
  70. if (FUNCTIONS.includes(name.toLowerCase())) return;
  71. const declIndex = nodeFieldIndices.declarationValueIndex(decl);
  72. const index = declIndex + node.name[2];
  73. const endIndex = declIndex + node.name[3];
  74. report({
  75. message: messages.rejected,
  76. messageArgs: [name],
  77. node: decl,
  78. index,
  79. endIndex,
  80. result,
  81. ruleName,
  82. });
  83. });
  84. });
  85. };
  86. };
  87. rule.ruleName = ruleName;
  88. rule.messages = messages;
  89. rule.meta = meta;
  90. module.exports = rule;