Skip to content

Commit

Permalink
Migrate all rules to ESM again (#7262)
Browse files Browse the repository at this point in the history
1. Run `node scripts/rewrite-rules-to-esm.mjs`
2. Manually fix lint and test failures

Note that `scripts/rewrite-rules-to-esm.mjs` is removed.
  • Loading branch information
ybiquitous committed Oct 19, 2023
1 parent 6d040b2 commit 0f28bc6
Show file tree
Hide file tree
Showing 379 changed files with 15,548 additions and 945 deletions.
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;

0 comments on commit 0f28bc6

Please sign in to comment.