Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate all rules to ESM again #7262

Merged
merged 3 commits into from
Oct 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions lib/__tests__/disableRanges-integration.test.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import blockNoEmpty from '../rules/block-no-empty/index.js';
import noDuplicateSelectors from '../rules/no-duplicate-selectors/index.js';
import numberMaxPrecision from '../rules/number-max-precision/index.js';
import stringNoNewline from '../rules/string-no-newline/index.js';
import blockNoEmpty from '../rules/block-no-empty/index.mjs';
import noDuplicateSelectors from '../rules/no-duplicate-selectors/index.mjs';
import numberMaxPrecision from '../rules/number-max-precision/index.mjs';
import stringNoNewline from '../rules/string-no-newline/index.mjs';

// disabling all rules
testRule({
Expand Down
4 changes: 2 additions & 2 deletions lib/__tests__/standalone-deprecations.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import standalone from '../standalone.mjs';

import { jest } from '@jest/globals';

jest.mock('../rules/block-no-empty');
jest.mock('../rules/block-no-empty/index.cjs');

const require = createRequire(import.meta.url);
const blockNoEmpty = require('../rules/block-no-empty/index.js');
const blockNoEmpty = require('../rules/block-no-empty/index.cjs');

const configBlockNoEmpty = readJSONFile(
new URL('./fixtures/config-block-no-empty.json', import.meta.url),
Expand Down
4 changes: 2 additions & 2 deletions lib/__tests__/standalone-parseErrors.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ const configBlockNoEmpty = readJSONFile(
new URL('./fixtures/config-block-no-empty.json', import.meta.url),
);

jest.mock('../rules/block-no-empty');
jest.mock('../rules/block-no-empty/index.cjs');

const require = createRequire(import.meta.url);
const blockNoEmpty = require('../rules/block-no-empty/index.js');
const blockNoEmpty = require('../rules/block-no-empty/index.cjs');

blockNoEmpty.mockImplementation(() => {
return (root, result) => {
Expand Down
4 changes: 2 additions & 2 deletions lib/__tests__/standalone-quiet-deprecation-warnings.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { jest } from '@jest/globals';
import report from '../utils/report.mjs';
import standalone from '../standalone.mjs';

jest.mock('../rules/block-no-empty');
jest.mock('../rules/block-no-empty/index.cjs');

const require = createRequire(import.meta.url);
const deprecatedRule = require('../rules/block-no-empty/index.js');
const deprecatedRule = require('../rules/block-no-empty/index.cjs');

deprecatedRule.mockImplementation(() => {
return (root, result) => {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/annotation-no-unknown/__tests__/index.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import rule from '../index.js';
import rule from '../index.mjs';
const { messages, ruleName } = rule;

testRule({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
'use strict';

const valueParser = require('postcss-value-parser');

const { isRegExp, isString } = require('../../utils/validateTypes.cjs');
const validateTypes = require('../../utils/validateTypes.cjs');
const getDeclarationValue = require('../../utils/getDeclarationValue.cjs');
const isStandardSyntaxValue = require('../../utils/isStandardSyntaxValue.cjs');
const optionsMatches = require('../../utils/optionsMatches.cjs');
Expand Down Expand Up @@ -30,7 +29,7 @@ const rule = (primary, secondaryOptions) => {
{
actual: secondaryOptions,
possible: {
ignoreAnnotations: [isString, isRegExp],
ignoreAnnotations: [validateTypes.isString, validateTypes.isRegExp],
},
optional: true,
},
Expand Down Expand Up @@ -87,4 +86,5 @@ const rule = (primary, secondaryOptions) => {
rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;

module.exports = rule;
88 changes: 88 additions & 0 deletions lib/rules/annotation-no-unknown/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import valueParser from 'postcss-value-parser';

import { isRegExp, isString } from '../../utils/validateTypes.mjs';
import getDeclarationValue from '../../utils/getDeclarationValue.mjs';
import isStandardSyntaxValue from '../../utils/isStandardSyntaxValue.mjs';
import optionsMatches from '../../utils/optionsMatches.mjs';
import report from '../../utils/report.mjs';
import ruleMessages from '../../utils/ruleMessages.mjs';
import validateOptions from '../../utils/validateOptions.mjs';

const ruleName = 'annotation-no-unknown';

const messages = ruleMessages(ruleName, {
rejected: (annotation) => `Unexpected unknown annotation "${annotation}"`,
});

const meta = {
url: 'https://stylelint.io/user-guide/rules/annotation-no-unknown',
};

/** @type {import('stylelint').Rule} */
const rule = (primary, secondaryOptions) => {
return (root, result) => {
const validOptions = validateOptions(
result,
ruleName,
{ actual: primary },
{
actual: secondaryOptions,
possible: {
ignoreAnnotations: [isString, isRegExp],
},
optional: true,
},
);

if (!validOptions) {
return;
}

root.walkDecls(checkStatement);

/**
* @param {import('postcss').Declaration} decl
*/
function checkStatement(decl) {
if (!isStandardSyntaxValue(decl.value)) return;

if (decl.important) return;

if (!decl.value.includes('!')) return;

const parsedValue = valueParser(getDeclarationValue(decl));

parsedValue.walk((node) => {
if (!isAnnotation(node)) return;

const value = node.value;
const tokenValue = value.slice(1);

if (optionsMatches(secondaryOptions, 'ignoreAnnotations', tokenValue)) {
return;
}

report({
message: messages.rejected,
messageArgs: [value],
node: decl,
result,
ruleName,
word: value,
});
});
}

/**
* @param {valueParser.Node} node
*/
function isAnnotation(node) {
return node.type === 'word' && node.value.startsWith('!');
}
};

Check warning on line 82 in lib/rules/annotation-no-unknown/index.mjs

View check run for this annotation

Codecov / codecov/patch

lib/rules/annotation-no-unknown/index.mjs#L23-L82

Added lines #L23 - L82 were not covered by tests
};

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
export default rule;
2 changes: 1 addition & 1 deletion lib/rules/at-rule-allowed-list/__tests__/index.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import rule from '../index.js';
import rule from '../index.mjs';
const { messages, ruleName } = rule;

testRule({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule.cjs');
const { isString } = require('../../utils/validateTypes.cjs');
const validateTypes = require('../../utils/validateTypes.cjs');
const report = require('../../utils/report.cjs');
const ruleMessages = require('../../utils/ruleMessages.cjs');
const validateOptions = require('../../utils/validateOptions.cjs');
Expand All @@ -22,7 +22,7 @@ const rule = (primary) => {
return (root, result) => {
const validOptions = validateOptions(result, ruleName, {
actual: primary,
possible: [isString],
possible: [validateTypes.isString],
});

if (!validOptions) {
Expand Down Expand Up @@ -59,4 +59,5 @@ rule.primaryOptionArray = true;
rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;

module.exports = rule;
60 changes: 60 additions & 0 deletions lib/rules/at-rule-allowed-list/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import isStandardSyntaxAtRule from '../../utils/isStandardSyntaxAtRule.mjs';
import { isString } from '../../utils/validateTypes.mjs';
import report from '../../utils/report.mjs';
import ruleMessages from '../../utils/ruleMessages.mjs';
import validateOptions from '../../utils/validateOptions.mjs';
import vendor from '../../utils/vendor.mjs';

const ruleName = 'at-rule-allowed-list';

const messages = ruleMessages(ruleName, {
rejected: (name) => `Unexpected at-rule "${name}"`,
});

const meta = {
url: 'https://stylelint.io/user-guide/rules/at-rule-allowed-list',
};

/** @type {import('stylelint').Rule<string | string[]>} */
const rule = (primary) => {
return (root, result) => {
const validOptions = validateOptions(result, ruleName, {
actual: primary,
possible: [isString],
});

if (!validOptions) {
return;
}

const primaryValues = [primary].flat();

root.walkAtRules((atRule) => {
const name = atRule.name;

if (!isStandardSyntaxAtRule(atRule)) {
return;
}

if (primaryValues.includes(vendor.unprefixed(name).toLowerCase())) {
return;
}

report({
message: messages.rejected,
messageArgs: [name],
node: atRule,
result,
ruleName,
word: `@${name}`,
});
});
};

Check warning on line 52 in lib/rules/at-rule-allowed-list/index.mjs

View check run for this annotation

Codecov / codecov/patch

lib/rules/at-rule-allowed-list/index.mjs#L20-L52

Added lines #L20 - L52 were not covered by tests
};

rule.primaryOptionArray = true;

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
export default rule;
2 changes: 1 addition & 1 deletion lib/rules/at-rule-disallowed-list/__tests__/index.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import rule from '../index.js';
import rule from '../index.mjs';
const { messages, ruleName } = rule;

testRule({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule.cjs');
const { isString } = require('../../utils/validateTypes.cjs');
const validateTypes = require('../../utils/validateTypes.cjs');
const report = require('../../utils/report.cjs');
const ruleMessages = require('../../utils/ruleMessages.cjs');
const validateOptions = require('../../utils/validateOptions.cjs');
Expand All @@ -22,7 +22,7 @@ const rule = (primary) => {
return (root, result) => {
const validOptions = validateOptions(result, ruleName, {
actual: primary,
possible: [isString],
possible: [validateTypes.isString],
});

if (!validOptions) {
Expand Down Expand Up @@ -59,4 +59,5 @@ rule.primaryOptionArray = true;
rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;

module.exports = rule;
60 changes: 60 additions & 0 deletions lib/rules/at-rule-disallowed-list/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import isStandardSyntaxAtRule from '../../utils/isStandardSyntaxAtRule.mjs';
import { isString } from '../../utils/validateTypes.mjs';
import report from '../../utils/report.mjs';
import ruleMessages from '../../utils/ruleMessages.mjs';
import validateOptions from '../../utils/validateOptions.mjs';
import vendor from '../../utils/vendor.mjs';

const ruleName = 'at-rule-disallowed-list';

const messages = ruleMessages(ruleName, {
rejected: (name) => `Unexpected at-rule "${name}"`,
});

const meta = {
url: 'https://stylelint.io/user-guide/rules/at-rule-disallowed-list',
};

/** @type {import('stylelint').Rule<string | string[]>} */
const rule = (primary) => {
return (root, result) => {
const validOptions = validateOptions(result, ruleName, {
actual: primary,
possible: [isString],
});

if (!validOptions) {
return;
}

const primaryValues = [primary].flat();

root.walkAtRules((atRule) => {
const name = atRule.name;

if (!isStandardSyntaxAtRule(atRule)) {
return;
}

if (!primaryValues.includes(vendor.unprefixed(name).toLowerCase())) {
return;
}

report({
message: messages.rejected,
messageArgs: [name],
node: atRule,
result,
ruleName,
word: `@${atRule.name}`,
});
});
};

Check warning on line 52 in lib/rules/at-rule-disallowed-list/index.mjs

View check run for this annotation

Codecov / codecov/patch

lib/rules/at-rule-disallowed-list/index.mjs#L20-L52

Added lines #L20 - L52 were not covered by tests
};

rule.primaryOptionArray = true;

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;
export default rule;
2 changes: 1 addition & 1 deletion lib/rules/at-rule-empty-line-before/__tests__/index.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { stripIndent } from 'common-tags';

import mergeTestDescriptions from '../../../testUtils/mergeTestDescriptions.mjs';
import rule from '../index.js';
import rule from '../index.mjs';
const { messages, ruleName } = rule;

const sharedAlwaysTests = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const addEmptyLineBefore = require('../../utils/addEmptyLineBefore.cjs');
const getPreviousNonSharedLineCommentNode = require('../../utils/getPreviousNonSharedLineCommentNode.cjs');
const hasEmptyLine = require('../../utils/hasEmptyLine.cjs');
const isAfterComment = require('../../utils/isAfterComment.cjs');
const { isAtRule } = require('../../utils/typeGuards.cjs');
const typeGuards = require('../../utils/typeGuards.cjs');
const isBlocklessAtRuleAfterBlocklessAtRule = require('../../utils/isBlocklessAtRuleAfterBlocklessAtRule.cjs');
const isBlocklessAtRuleAfterSameNameBlocklessAtRule = require('../../utils/isBlocklessAtRuleAfterSameNameBlocklessAtRule.cjs');
const isFirstNested = require('../../utils/isFirstNested.cjs');
const isFirstNodeOfRoot = require('../../utils/isFirstNodeOfRoot.cjs');
const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule.cjs');
const { isString } = require('../../utils/validateTypes.cjs');
const validateTypes = require('../../utils/validateTypes.cjs');
const optionsMatches = require('../../utils/optionsMatches.cjs');
const removeEmptyLinesBefore = require('../../utils/removeEmptyLinesBefore.cjs');
const report = require('../../utils/report.cjs');
Expand Down Expand Up @@ -56,7 +56,7 @@ const rule = (primary, secondaryOptions, context) => {
'blockless-after-same-name-blockless',
'blockless-after-blockless',
],
ignoreAtRules: [isString],
ignoreAtRules: [validateTypes.isString],
},
optional: true,
},
Expand Down Expand Up @@ -164,10 +164,11 @@ const rule = (primary, secondaryOptions, context) => {
function isAtRuleAfterSameNameAtRule(atRule) {
const previousNode = getPreviousNonSharedLineCommentNode(atRule);

return previousNode && isAtRule(previousNode) && previousNode.name === atRule.name;
return previousNode && typeGuards.isAtRule(previousNode) && previousNode.name === atRule.name;
}

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;

module.exports = rule;