index.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. 'use strict';
  2. const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule');
  3. const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
  4. const optionsMatches = require('../../utils/optionsMatches');
  5. const report = require('../../utils/report');
  6. const ruleMessages = require('../../utils/ruleMessages');
  7. const { isAtRule } = require('../../utils/typeGuards');
  8. const validateOptions = require('../../utils/validateOptions');
  9. const { isRegExp, isString } = require('../../utils/validateTypes');
  10. const ruleName = 'no-invalid-position-at-import-rule';
  11. const messages = ruleMessages(ruleName, {
  12. rejected: 'Unexpected invalid position @import rule',
  13. });
  14. const meta = {
  15. url: 'https://stylelint.io/user-guide/rules/list/no-invalid-position-at-import-rule',
  16. };
  17. /** @type {import('stylelint').Rule} */
  18. const rule = (primary, options) => {
  19. return (root, result) => {
  20. const validOptions = validateOptions(
  21. result,
  22. ruleName,
  23. { actual: primary },
  24. {
  25. actual: options,
  26. possible: {
  27. ignoreAtRules: [isString, isRegExp],
  28. },
  29. optional: true,
  30. },
  31. );
  32. if (!validOptions) {
  33. return;
  34. }
  35. let invalidPosition = false;
  36. root.walk((node) => {
  37. const nodeName = ('name' in node && node.name && node.name.toLowerCase()) || '';
  38. if (
  39. (isAtRule(node) &&
  40. nodeName !== 'charset' &&
  41. nodeName !== 'import' &&
  42. nodeName !== 'layer' &&
  43. !optionsMatches(options, 'ignoreAtRules', node.name) &&
  44. isStandardSyntaxAtRule(node)) ||
  45. (node.type === 'rule' && isStandardSyntaxRule(node))
  46. ) {
  47. invalidPosition = true;
  48. return;
  49. }
  50. if (isAtRule(node) && nodeName === 'import' && invalidPosition) {
  51. report({
  52. message: messages.rejected,
  53. node,
  54. result,
  55. ruleName,
  56. word: node.toString(),
  57. });
  58. }
  59. });
  60. };
  61. };
  62. rule.ruleName = ruleName;
  63. rule.messages = messages;
  64. rule.meta = meta;
  65. module.exports = rule;