diff --git a/.eslintrc.json b/.eslintrc.json index 0d28b76..81d6b90 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,8 +9,20 @@ "es6": true, "jest": true }, + "parserOptions": { + "sourceType": "module", + "ecmaVersion": "latest" + }, "globals": { "testConfig": true, "testRule": true + }, + "rules": { + "import/extensions": ["error", "always", { "ignorePackages": true } ], + "import/no-default-export": "error", + "import/no-useless-path-segments": ["warn", { "commonjs": false, "noUselessIndex": false }], + "import/prefer-default-export": "off", + "unicorn/prefer-module": "error", + "unicorn/prefer-node-protocol": "error" } } diff --git a/index.js b/index.js index b5ad8cf..a697fa6 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,10 @@ -const { createPlugin } = require('stylelint'); -const { namespace } = require('./utils'); -const rules = require('./rules'); +import stylelint from 'stylelint'; +import { rules } from './rules/index.js'; +import { namespace } from './utils/namespace.js'; const rulesPlugins = Object.keys(rules).map((ruleName) => { - return createPlugin(namespace(ruleName), rules[ruleName]); + return stylelint.createPlugin(namespace(ruleName), rules[ruleName]); }); -module.exports = rulesPlugins; +// eslint-disable-next-line import/no-default-export +export default rulesPlugins; diff --git a/jest-setup.js b/jest-setup.js index 83d5bf0..19bcdbb 100644 --- a/jest-setup.js +++ b/jest-setup.js @@ -1,6 +1,6 @@ -const stylelint = require('stylelint'); +import stylelint from 'stylelint'; // eslint-disable-next-line import/no-extraneous-dependencies -const getTestRule = require('jest-preset-stylelint/getTestRule'); +import { getTestRule } from 'jest-preset-stylelint'; global.testRule = getTestRule({ plugins: ['./'] }); @@ -27,7 +27,6 @@ global.testConfig = (input) => { .lint({ code: '', config, - quietDeprecationWarnings: true, }) .then((data) => { const { invalidOptionWarnings } = data.results[0]; diff --git a/package.json b/package.json index 8604dbc..606d807 100644 --- a/package.json +++ b/package.json @@ -19,13 +19,17 @@ "index.js", "!.DS_Store" ], - "main": "index.js", + "type": "module", + "exports": "./index.js", + "engines": { + "node": ">=18.12.0" + }, "dependencies": { "postcss": "^8.4.38", "postcss-sorting": "^8.0.2" }, "peerDependencies": { - "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + "stylelint": "^16.3.1" }, "devDependencies": { "eslint": "^8.55.0", @@ -46,9 +50,9 @@ }, "scripts": { "lint": "eslint . --max-warnings=0 && prettier '**/*.js' --check", - "test": "jest", - "watch": "jest --watch", - "coverage": "jest --coverage", + "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js", + "watch": "npm run test -- --watch", + "coverage": "npm run test -- --coverage", "fix": "eslint . --fix --max-warnings=0 && prettier '**/*.js' --write", "prepare": "husky" }, diff --git a/rules/checkAlphabeticalOrder.js b/rules/checkAlphabeticalOrder.js index 3aa48bd..9c5bdab 100644 --- a/rules/checkAlphabeticalOrder.js +++ b/rules/checkAlphabeticalOrder.js @@ -1,5 +1,5 @@ -const shorthandData = require('./shorthandData'); -const { vendor } = require('../utils'); +import { shorthandData } from './shorthandData.js'; +import * as vendor from '../utils/vendor.js'; function isShorthand(a, b) { const longhands = shorthandData[a] || []; @@ -7,7 +7,7 @@ function isShorthand(a, b) { return longhands.includes(b); } -module.exports = function checkAlphabeticalOrder(firstPropData, secondPropData) { +export function checkAlphabeticalOrder(firstPropData, secondPropData) { // OK if the first is shorthand for the second: if (isShorthand(firstPropData.unprefixedName, secondPropData.unprefixedName)) { return true; @@ -32,4 +32,4 @@ module.exports = function checkAlphabeticalOrder(firstPropData, secondPropData) } return firstPropData.unprefixedName < secondPropData.unprefixedName; -}; +} diff --git a/rules/index.js b/rules/index.js index 77cbb2d..0c81f12 100644 --- a/rules/index.js +++ b/rules/index.js @@ -1,5 +1,9 @@ -module.exports = { - order: require('./order'), - 'properties-order': require('./properties-order'), - 'properties-alphabetical-order': require('./properties-alphabetical-order'), +import { rule as order } from './order/index.js'; +import { rule as propertiesOrder } from './properties-order/index.js'; +import { rule as propertiesAlphabeticalOrder } from './properties-alphabetical-order/index.js'; + +export const rules = { + order, + 'properties-order': propertiesOrder, + 'properties-alphabetical-order': propertiesAlphabeticalOrder, }; diff --git a/rules/order/calcAtRulePatternPriority.js b/rules/order/calcAtRulePatternPriority.js index eaefd44..7fe816b 100644 --- a/rules/order/calcAtRulePatternPriority.js +++ b/rules/order/calcAtRulePatternPriority.js @@ -1,4 +1,4 @@ -module.exports = function calcAtRulePatternPriority(pattern, node) { +export function calcAtRulePatternPriority(pattern, node) { // 0 — it pattern doesn't match // 1 — pattern without `name` and `hasBlock` // 10010 — pattern match `hasBlock` @@ -57,4 +57,4 @@ module.exports = function calcAtRulePatternPriority(pattern, node) { } return priority; -}; +} diff --git a/rules/order/calcRulePatternPriority.js b/rules/order/calcRulePatternPriority.js index 00c22ba..cae9035 100644 --- a/rules/order/calcRulePatternPriority.js +++ b/rules/order/calcRulePatternPriority.js @@ -1,4 +1,4 @@ -module.exports = function calcRulePatternPriority(pattern, node) { +export function calcRulePatternPriority(pattern, node) { // 0 — it pattern doesn't match // 1 — pattern without `selector` // 2 — pattern match `selector` @@ -16,4 +16,4 @@ module.exports = function calcRulePatternPriority(pattern, node) { } return priority; -}; +} diff --git a/rules/order/checkNode.js b/rules/order/checkNode.js index cc05321..8b34bfc 100644 --- a/rules/order/checkNode.js +++ b/rules/order/checkNode.js @@ -1,18 +1,11 @@ -const stylelint = require('stylelint'); -const sortNode = require('postcss-sorting/lib/order/sortNode'); -const checkOrder = require('./checkOrder'); -const getOrderData = require('./getOrderData'); -const ruleName = require('./ruleName'); -const messages = require('./messages'); - -module.exports = function checkNode({ - node, - isFixEnabled, - orderInfo, - primaryOption, - result, - unspecified, -}) { +import stylelint from 'stylelint'; +import sortNode from 'postcss-sorting/lib/order/sortNode.js'; +import { checkOrder } from './checkOrder.js'; +import { getOrderData } from './getOrderData.js'; +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; + +export function checkNode({ node, isFixEnabled, orderInfo, primaryOption, result, unspecified }) { if (isFixEnabled) { let shouldFix = false; let allNodesData = []; @@ -104,4 +97,4 @@ module.exports = function checkNode({ previousNodeData, }; } -}; +} diff --git a/rules/order/checkOrder.js b/rules/order/checkOrder.js index d3ca027..6a8076b 100644 --- a/rules/order/checkOrder.js +++ b/rules/order/checkOrder.js @@ -1,9 +1,9 @@ -let stylelint = require('stylelint'); -let ruleName = require('./ruleName'); -let messages = require('./messages'); +import stylelint from 'stylelint'; +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; // eslint-disable-next-line max-params, consistent-return -module.exports = function checkOrder({ +export function checkOrder({ firstNodeData, secondNodeData, allNodesData, @@ -75,4 +75,4 @@ module.exports = function checkOrder({ if (unspecified === 'bottom' && !firstNodeIsSpecified) { return false; } -}; +} diff --git a/rules/order/createOrderInfo.js b/rules/order/createOrderInfo.js index 8739673..6c5177c 100644 --- a/rules/order/createOrderInfo.js +++ b/rules/order/createOrderInfo.js @@ -1,7 +1,7 @@ -const getDescription = require('./getDescription'); -const { isString } = require('../../utils/validateType'); +import { getDescription } from './getDescription.js'; +import { isString } from '../../utils/validateType.js'; -module.exports = function createOrderInfo(input) { +export function createOrderInfo(input) { let order = {}; let expectedPosition = 0; @@ -85,4 +85,4 @@ module.exports = function createOrderInfo(input) { }); return order; -}; +} diff --git a/rules/order/getDescription.js b/rules/order/getDescription.js index a0939ab..d326f10 100644 --- a/rules/order/getDescription.js +++ b/rules/order/getDescription.js @@ -1,6 +1,6 @@ -const { isObject } = require('../../utils/validateType'); +import { isObject } from '../../utils/validateType.js'; -module.exports = function getDescription(item) { +export function getDescription(item) { const descriptions = { 'custom-properties': 'custom property', 'dollar-variables': '$-variable', @@ -48,4 +48,4 @@ module.exports = function getDescription(item) { // Return description for keyword patterns return descriptions[item]; -}; +} diff --git a/rules/order/getOrderData.js b/rules/order/getOrderData.js index a56406a..a56a6d9 100644 --- a/rules/order/getOrderData.js +++ b/rules/order/getOrderData.js @@ -1,21 +1,25 @@ -const utils = require('../../utils'); -const calcAtRulePatternPriority = require('./calcAtRulePatternPriority'); -const calcRulePatternPriority = require('./calcRulePatternPriority'); -const getDescription = require('./getDescription'); - -module.exports = function getOrderData(orderInfo, node) { +import { calcAtRulePatternPriority } from './calcAtRulePatternPriority.js'; +import { calcRulePatternPriority } from './calcRulePatternPriority.js'; +import { getDescription } from './getDescription.js'; +import { isAtVariable } from '../../utils/isAtVariable.js'; +import { isCustomProperty } from '../../utils/isCustomProperty.js'; +import { isDollarVariable } from '../../utils/isDollarVariable.js'; +import { isLessMixin } from '../../utils/isLessMixin.js'; +import { isStandardSyntaxProperty } from '../../utils/isStandardSyntaxProperty.js'; + +export function getOrderData(orderInfo, node) { let nodeType; - if (utils.isAtVariable(node)) { + if (isAtVariable(node)) { nodeType = 'at-variables'; - } else if (utils.isLessMixin(node)) { + } else if (isLessMixin(node)) { nodeType = 'less-mixins'; } else if (node.type === 'decl') { - if (utils.isCustomProperty(node.prop)) { + if (isCustomProperty(node.prop)) { nodeType = 'custom-properties'; - } else if (utils.isDollarVariable(node.prop)) { + } else if (isDollarVariable(node.prop)) { nodeType = 'dollar-variables'; - } else if (utils.isStandardSyntaxProperty(node.prop)) { + } else if (isStandardSyntaxProperty(node.prop)) { nodeType = 'declarations'; } } else if (node.type === 'rule') { @@ -89,4 +93,4 @@ module.exports = function getOrderData(orderInfo, node) { return { description: getDescription(nodeType), }; -}; +} diff --git a/rules/order/index.js b/rules/order/index.js index 89cb10e..f4322c4 100644 --- a/rules/order/index.js +++ b/rules/order/index.js @@ -1,12 +1,13 @@ -const stylelint = require('stylelint'); -const { getContainingNode, isRuleWithNodes } = require('../../utils'); -const checkNode = require('./checkNode'); -const createOrderInfo = require('./createOrderInfo'); -const validatePrimaryOption = require('./validatePrimaryOption'); -const ruleName = require('./ruleName'); -const messages = require('./messages'); +import stylelint from 'stylelint'; +import { getContainingNode } from '../../utils/getContainingNode.js'; +import { isRuleWithNodes } from '../../utils/isRuleWithNodes.js'; +import { checkNode } from './checkNode.js'; +import { createOrderInfo } from './createOrderInfo.js'; +import { validatePrimaryOption } from './validatePrimaryOption.js'; +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; -function rule(primaryOption, options = {}, context = {}) { +export function rule(primaryOption, options = {}, context = {}) { return function ruleBody(root, result) { let validOptions = stylelint.utils.validateOptions( result, @@ -61,5 +62,3 @@ function rule(primaryOption, options = {}, context = {}) { rule.ruleName = ruleName; rule.messages = messages; rule.primaryOptionArray = true; - -module.exports = rule; diff --git a/rules/order/messages.js b/rules/order/messages.js index 669f796..2bcb57a 100644 --- a/rules/order/messages.js +++ b/rules/order/messages.js @@ -1,6 +1,6 @@ -const stylelint = require('stylelint'); -const ruleName = require('./ruleName'); +import stylelint from 'stylelint'; +import { ruleName } from './ruleName.js'; -module.exports = stylelint.utils.ruleMessages(ruleName, { +export const messages = stylelint.utils.ruleMessages(ruleName, { expected: (first, second) => `Expected ${first} to come before ${second}`, }); diff --git a/rules/order/ruleName.js b/rules/order/ruleName.js index c9d6897..44b92f7 100644 --- a/rules/order/ruleName.js +++ b/rules/order/ruleName.js @@ -1,3 +1,3 @@ -const { namespace } = require('../../utils'); +import { namespace } from '../../utils/namespace.js'; -module.exports = namespace('order'); +export const ruleName = namespace('order'); diff --git a/rules/order/tests/index.js b/rules/order/tests/index.js index a7a84c2..411cf2a 100644 --- a/rules/order/tests/index.js +++ b/rules/order/tests/index.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/order/tests/validate-options.js b/rules/order/tests/validate-options.js index 0304899..1e11811 100644 --- a/rules/order/tests/validate-options.js +++ b/rules/order/tests/validate-options.js @@ -1,4 +1,4 @@ -const { ruleName } = require('..'); +import { ruleName } from '../ruleName.js'; testConfig({ ruleName, diff --git a/rules/order/validatePrimaryOption.js b/rules/order/validatePrimaryOption.js index 4b388f8..12eac7e 100644 --- a/rules/order/validatePrimaryOption.js +++ b/rules/order/validatePrimaryOption.js @@ -1,6 +1,6 @@ -const { isObject, isString } = require('../../utils/validateType'); +import { isObject, isString } from '../../utils/validateType.js'; -module.exports = function validatePrimaryOption(actualOptions) { +export function validatePrimaryOption(actualOptions) { // Otherwise, begin checking array options if (!Array.isArray(actualOptions)) { return false; @@ -78,7 +78,7 @@ module.exports = function validatePrimaryOption(actualOptions) { } return true; -}; +} function isRegExp(value) { return Object.prototype.toString.call(value) === '[object RegExp]'; diff --git a/rules/properties-alphabetical-order/checkNode.js b/rules/properties-alphabetical-order/checkNode.js index ed3f051..9ab9324 100644 --- a/rules/properties-alphabetical-order/checkNode.js +++ b/rules/properties-alphabetical-order/checkNode.js @@ -1,9 +1,11 @@ -let stylelint = require('stylelint'); -let checkAlphabeticalOrder = require('../checkAlphabeticalOrder'); -let { isStandardSyntaxProperty, isCustomProperty, vendor } = require('../../utils'); +import stylelint from 'stylelint'; +import { checkAlphabeticalOrder } from '../checkAlphabeticalOrder.js'; +import { isCustomProperty } from '../../utils/isCustomProperty.js'; +import { isStandardSyntaxProperty } from '../../utils/isStandardSyntaxProperty.js'; +import * as vendor from '../../utils/vendor.js'; // eslint-disable-next-line max-params -module.exports = function checkNode(node, result, ruleName, messages) { +export function checkNode(node, result, ruleName, messages) { let allPropData = []; node.each(function processEveryNode(child) { @@ -58,4 +60,4 @@ module.exports = function checkNode(node, result, ruleName, messages) { ruleName, }); }); -}; +} diff --git a/rules/properties-alphabetical-order/index.js b/rules/properties-alphabetical-order/index.js index 6ef82b1..4c3d7af 100644 --- a/rules/properties-alphabetical-order/index.js +++ b/rules/properties-alphabetical-order/index.js @@ -1,7 +1,9 @@ -let stylelint = require('stylelint'); -let sortNodeProperties = require('postcss-sorting/lib/properties-order/sortNodeProperties'); -let { namespace, getContainingNode, isRuleWithNodes } = require('../../utils'); -let checkNode = require('./checkNode'); +import stylelint from 'stylelint'; +import sortNodeProperties from 'postcss-sorting/lib/properties-order/sortNodeProperties.js'; +import { checkNode } from './checkNode.js'; +import { namespace } from '../../utils/namespace.js'; +import { getContainingNode } from '../../utils/getContainingNode.js'; +import { isRuleWithNodes } from '../../utils/isRuleWithNodes.js'; let ruleName = namespace('properties-alphabetical-order'); @@ -9,7 +11,7 @@ let messages = stylelint.utils.ruleMessages(ruleName, { expected: (first, second) => `Expected ${first} to come before ${second}`, }); -function rule(actual, options, context = {}) { +export function rule(actual, options, context = {}) { return function ruleBody(root, result) { let validOptions = stylelint.utils.validateOptions(result, ruleName, { actual, @@ -45,5 +47,3 @@ function rule(actual, options, context = {}) { rule.ruleName = ruleName; rule.messages = messages; - -module.exports = rule; diff --git a/rules/properties-alphabetical-order/tests/index.js b/rules/properties-alphabetical-order/tests/index.js index 1b35136..4f5260c 100644 --- a/rules/properties-alphabetical-order/tests/index.js +++ b/rules/properties-alphabetical-order/tests/index.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/addEmptyLineBefore.js b/rules/properties-order/addEmptyLineBefore.js index 03acd32..9844212 100644 --- a/rules/properties-order/addEmptyLineBefore.js +++ b/rules/properties-order/addEmptyLineBefore.js @@ -1,5 +1,5 @@ // Add an empty line before a node. Mutates the node. -module.exports = function addEmptyLineBefore(node, newline) { +export function addEmptyLineBefore(node, newline) { if (!/\r?\n/.test(node.raws.before)) { node.raws.before = newline.repeat(2) + node.raws.before; } else if (/^\r?\n/.test(node.raws.before)) { @@ -11,4 +11,4 @@ module.exports = function addEmptyLineBefore(node, newline) { } return node; -}; +} diff --git a/rules/properties-order/checkEmptyLineBefore.js b/rules/properties-order/checkEmptyLineBefore.js index 5099ce9..edbedc5 100644 --- a/rules/properties-order/checkEmptyLineBefore.js +++ b/rules/properties-order/checkEmptyLineBefore.js @@ -1,12 +1,12 @@ -let stylelint = require('stylelint'); -const { isString } = require('../../utils/validateType'); -let addEmptyLineBefore = require('./addEmptyLineBefore'); -let hasEmptyLineBefore = require('./hasEmptyLineBefore'); -let removeEmptyLinesBefore = require('./removeEmptyLinesBefore'); -let ruleName = require('./ruleName'); -let messages = require('./messages'); +import stylelint from 'stylelint'; +import { isString } from '../../utils/validateType.js'; +import { addEmptyLineBefore } from './addEmptyLineBefore.js'; +import { hasEmptyLineBefore } from './hasEmptyLineBefore.js'; +import { removeEmptyLinesBefore } from './removeEmptyLinesBefore.js'; +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; -module.exports = function checkEmptyLineBefore({ +export function checkEmptyLineBefore({ firstPropData, secondPropData, propsCount, @@ -106,4 +106,4 @@ module.exports = function checkEmptyLineBefore({ } } } -}; +} diff --git a/rules/properties-order/checkEmptyLineBeforeFirstProp.js b/rules/properties-order/checkEmptyLineBeforeFirstProp.js index 60eaa1a..4bad3f1 100644 --- a/rules/properties-order/checkEmptyLineBeforeFirstProp.js +++ b/rules/properties-order/checkEmptyLineBeforeFirstProp.js @@ -1,11 +1,11 @@ -const stylelint = require('stylelint'); -const { isString } = require('../../utils/validateType'); -const ruleName = require('./ruleName'); -const messages = require('./messages'); -const hasEmptyLineBefore = require('./hasEmptyLineBefore'); -const removeEmptyLinesBefore = require('./removeEmptyLinesBefore'); +import stylelint from 'stylelint'; +import { isString } from '../../utils/validateType.js'; +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; +import { hasEmptyLineBefore } from './hasEmptyLineBefore.js'; +import { removeEmptyLinesBefore } from './removeEmptyLinesBefore.js'; -module.exports = function checkEmptyLineBeforeFirstProp({ +export function checkEmptyLineBeforeFirstProp({ propData, primaryOption, emptyLineBeforeUnspecified, @@ -38,4 +38,4 @@ module.exports = function checkEmptyLineBeforeFirstProp({ }); } } -}; +} diff --git a/rules/properties-order/checkNodeForEmptyLines.js b/rules/properties-order/checkNodeForEmptyLines.js index edf9b1f..a699870 100644 --- a/rules/properties-order/checkNodeForEmptyLines.js +++ b/rules/properties-order/checkNodeForEmptyLines.js @@ -1,9 +1,9 @@ -const { isProperty } = require('../../utils'); -const checkEmptyLineBefore = require('./checkEmptyLineBefore'); -const checkEmptyLineBeforeFirstProp = require('./checkEmptyLineBeforeFirstProp'); -const getNodeData = require('./getNodeData'); +import { isProperty } from '../../utils/isProperty.js'; +import { checkEmptyLineBefore } from './checkEmptyLineBefore.js'; +import { checkEmptyLineBeforeFirstProp } from './checkEmptyLineBeforeFirstProp.js'; +import { getNodeData } from './getNodeData.js'; -module.exports = function checkNodeForEmptyLines({ +export function checkNodeForEmptyLines({ node, context, emptyLineBeforeUnspecified, @@ -65,4 +65,4 @@ module.exports = function checkNodeForEmptyLines({ result, }); } -}; +} diff --git a/rules/properties-order/checkNodeForOrder.js b/rules/properties-order/checkNodeForOrder.js index 9560d8f..5256b52 100644 --- a/rules/properties-order/checkNodeForOrder.js +++ b/rules/properties-order/checkNodeForOrder.js @@ -1,13 +1,13 @@ -const stylelint = require('stylelint'); -const sortNodeProperties = require('postcss-sorting/lib/properties-order/sortNodeProperties'); -const { isProperty } = require('../../utils'); -const checkOrder = require('./checkOrder'); -const getNodeData = require('./getNodeData'); -const createFlatOrder = require('./createFlatOrder'); -const ruleName = require('./ruleName'); -const messages = require('./messages'); +import stylelint from 'stylelint'; +import sortNodeProperties from 'postcss-sorting/lib/properties-order/sortNodeProperties.js'; +import { isProperty } from '../../utils/isProperty.js'; +import { checkOrder } from './checkOrder.js'; +import { getNodeData } from './getNodeData.js'; +import { createFlatOrder } from './createFlatOrder.js'; +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; -module.exports = function checkNodeForOrder({ +export function checkNodeForOrder({ node, isFixEnabled, primaryOption, @@ -89,4 +89,4 @@ module.exports = function checkNodeForOrder({ .filter((item) => isProperty(item)) .map((item) => getNodeData(item, expectedOrder)); } -}; +} diff --git a/rules/properties-order/checkOrder.js b/rules/properties-order/checkOrder.js index 4e378a2..7e72f1b 100644 --- a/rules/properties-order/checkOrder.js +++ b/rules/properties-order/checkOrder.js @@ -1,8 +1,8 @@ -const checkAlphabeticalOrder = require('../checkAlphabeticalOrder'); -const { vendor } = require('../../utils'); +import { checkAlphabeticalOrder } from '../checkAlphabeticalOrder.js'; +import * as vendor from '../../utils/vendor.js'; // eslint-disable-next-line consistent-return -module.exports = function checkOrder({ +export function checkOrder({ firstPropertyData, secondPropertyData, allPropertiesData, @@ -98,4 +98,4 @@ module.exports = function checkOrder({ if (unspecified === 'bottom' && !firstPropIsSpecified) { return report(false); } -}; +} diff --git a/rules/properties-order/createFlatOrder.js b/rules/properties-order/createFlatOrder.js index 0bf7ea9..3eb39cc 100644 --- a/rules/properties-order/createFlatOrder.js +++ b/rules/properties-order/createFlatOrder.js @@ -1,6 +1,6 @@ -const { isString } = require('../../utils/validateType'); +import { isString } from '../../utils/validateType.js'; -module.exports = function createFlatOrder(order) { +export function createFlatOrder(order) { const flatOrder = []; appendGroup(order); @@ -20,4 +20,4 @@ module.exports = function createFlatOrder(order) { } return flatOrder; -}; +} diff --git a/rules/properties-order/createOrderInfo.js b/rules/properties-order/createOrderInfo.js index 5a9c5dc..34c1bc2 100644 --- a/rules/properties-order/createOrderInfo.js +++ b/rules/properties-order/createOrderInfo.js @@ -1,6 +1,6 @@ -const { isString } = require('../../utils/validateType'); +import { isString } from '../../utils/validateType.js'; -module.exports = function createOrderInfo(input) { +export function createOrderInfo(input) { let order = {}; let expectedPosition = 0; let separatedGroup = 1; @@ -51,4 +51,4 @@ module.exports = function createOrderInfo(input) { } return order; -}; +} diff --git a/rules/properties-order/getNodeData.js b/rules/properties-order/getNodeData.js index 523ffb0..54b2b94 100644 --- a/rules/properties-order/getNodeData.js +++ b/rules/properties-order/getNodeData.js @@ -1,6 +1,7 @@ -const { isProperty, vendor } = require('../../utils'); +import { isProperty } from '../../utils/isProperty.js'; +import * as vendor from '../../utils/vendor.js'; -module.exports = function getNodeData(node, expectedOrder) { +export function getNodeData(node, expectedOrder) { if (isProperty(node)) { let { prop } = node; let unprefixedName = vendor.unprefixed(prop); @@ -22,4 +23,4 @@ module.exports = function getNodeData(node, expectedOrder) { return { node, }; -}; +} diff --git a/rules/properties-order/hasEmptyLineBefore.js b/rules/properties-order/hasEmptyLineBefore.js index e1228be..d4c8385 100644 --- a/rules/properties-order/hasEmptyLineBefore.js +++ b/rules/properties-order/hasEmptyLineBefore.js @@ -1,4 +1,4 @@ -module.exports = function hasEmptyLineBefore(decl) { +export function hasEmptyLineBefore(decl) { if (/\r?\n\s*\r?\n/.test(decl.raw('before'))) { return true; } @@ -18,4 +18,4 @@ module.exports = function hasEmptyLineBefore(decl) { } return false; -}; +} diff --git a/rules/properties-order/index.js b/rules/properties-order/index.js index 68aa594..b44b521 100644 --- a/rules/properties-order/index.js +++ b/rules/properties-order/index.js @@ -1,15 +1,16 @@ -const stylelint = require('stylelint'); -const { getContainingNode, isRuleWithNodes } = require('../../utils'); -const { isNumber } = require('../../utils/validateType'); -const checkNodeForOrder = require('./checkNodeForOrder'); -const checkNodeForEmptyLines = require('./checkNodeForEmptyLines'); -const createOrderInfo = require('./createOrderInfo'); -const validatePrimaryOption = require('./validatePrimaryOption'); +import stylelint from 'stylelint'; +import { getContainingNode } from '../../utils/getContainingNode.js'; +import { isRuleWithNodes } from '../../utils/isRuleWithNodes.js'; +import { isNumber } from '../../utils/validateType.js'; +import { checkNodeForOrder } from './checkNodeForOrder.js'; +import { checkNodeForEmptyLines } from './checkNodeForEmptyLines.js'; +import { createOrderInfo } from './createOrderInfo.js'; +import { validatePrimaryOption } from './validatePrimaryOption.js'; -const ruleName = require('./ruleName'); -const messages = require('./messages'); +import { ruleName } from './ruleName.js'; +import { messages } from './messages.js'; -function rule(primaryOption, options = {}, context = {}) { +export function rule(primaryOption, options = {}, context = {}) { return function ruleBody(root, result) { let validOptions = stylelint.utils.validateOptions( result, @@ -78,5 +79,3 @@ function rule(primaryOption, options = {}, context = {}) { rule.primaryOptionArray = true; rule.ruleName = ruleName; rule.messages = messages; - -module.exports = rule; diff --git a/rules/properties-order/messages.js b/rules/properties-order/messages.js index 5e54cb0..7d7c9d9 100644 --- a/rules/properties-order/messages.js +++ b/rules/properties-order/messages.js @@ -1,7 +1,7 @@ -const stylelint = require('stylelint'); -const ruleName = require('./ruleName'); +import stylelint from 'stylelint'; +import { ruleName } from './ruleName.js'; -module.exports = stylelint.utils.ruleMessages(ruleName, { +export const messages = stylelint.utils.ruleMessages(ruleName, { expected: (first, second, groupName) => `Expected "${first}" to come before "${second}"${ groupName ? ` in group "${groupName}"` : '' diff --git a/rules/properties-order/removeEmptyLinesBefore.js b/rules/properties-order/removeEmptyLinesBefore.js index cbf261a..7ad2cf8 100644 --- a/rules/properties-order/removeEmptyLinesBefore.js +++ b/rules/properties-order/removeEmptyLinesBefore.js @@ -1,6 +1,6 @@ // Remove empty lines before a node. Mutates the node. -module.exports = function removeEmptyLinesBefore(node, newline) { +export function removeEmptyLinesBefore(node, newline) { node.raws.before = node.raws.before.replace(/(\r?\n\s*\r?\n)+/g, newline); return node; -}; +} diff --git a/rules/properties-order/ruleName.js b/rules/properties-order/ruleName.js index 145fc12..f6098a9 100644 --- a/rules/properties-order/ruleName.js +++ b/rules/properties-order/ruleName.js @@ -1,3 +1,3 @@ -const { namespace } = require('../../utils'); +import { namespace } from '../../utils/namespace.js'; -module.exports = namespace('properties-order'); +export const ruleName = namespace('properties-order'); diff --git a/rules/properties-order/tests/addEmptyLineBefore.test.js b/rules/properties-order/tests/addEmptyLineBefore.test.js index dcc3b55..1e7229b 100644 --- a/rules/properties-order/tests/addEmptyLineBefore.test.js +++ b/rules/properties-order/tests/addEmptyLineBefore.test.js @@ -1,5 +1,5 @@ -const addEmptyLineBefore = require('../addEmptyLineBefore'); -const postcss = require('postcss'); +import { addEmptyLineBefore } from '../addEmptyLineBefore.js'; +import postcss from 'postcss'; function addEmptyLine(css, lineEnding) { const root = postcss.parse(css); diff --git a/rules/properties-order/tests/createFlatOrder.test.js b/rules/properties-order/tests/createFlatOrder.test.js index d4969b5..0ebe812 100644 --- a/rules/properties-order/tests/createFlatOrder.test.js +++ b/rules/properties-order/tests/createFlatOrder.test.js @@ -1,4 +1,4 @@ -const createFlatOrder = require('../createFlatOrder'); +import { createFlatOrder } from '../createFlatOrder.js'; describe('createFlatOrder', () => { it('valid group and declaration', () => { diff --git a/rules/properties-order/tests/empty-line-before-unspecified.js b/rules/properties-order/tests/empty-line-before-unspecified.js index d2547ba..757bcfa 100644 --- a/rules/properties-order/tests/empty-line-before-unspecified.js +++ b/rules/properties-order/tests/empty-line-before-unspecified.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/empty-line-before.js b/rules/properties-order/tests/empty-line-before.js index f5b4b9f..304289b 100644 --- a/rules/properties-order/tests/empty-line-before.js +++ b/rules/properties-order/tests/empty-line-before.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/empty-line-minimum-property-threshold.js b/rules/properties-order/tests/empty-line-minimum-property-threshold.js index a749194..1b4ec4c 100644 --- a/rules/properties-order/tests/empty-line-minimum-property-threshold.js +++ b/rules/properties-order/tests/empty-line-minimum-property-threshold.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/flat.js b/rules/properties-order/tests/flat.js index e8536a6..884c0f1 100644 --- a/rules/properties-order/tests/flat.js +++ b/rules/properties-order/tests/flat.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/grouped-flexible.js b/rules/properties-order/tests/grouped-flexible.js index 4820d77..c4cb9ef 100644 --- a/rules/properties-order/tests/grouped-flexible.js +++ b/rules/properties-order/tests/grouped-flexible.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/grouped-strict.js b/rules/properties-order/tests/grouped-strict.js index 1bbfb0c..c22182f 100644 --- a/rules/properties-order/tests/grouped-strict.js +++ b/rules/properties-order/tests/grouped-strict.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/no-empty-line-between.js b/rules/properties-order/tests/no-empty-line-between.js index 61b2c59..cd2163f 100644 --- a/rules/properties-order/tests/no-empty-line-between.js +++ b/rules/properties-order/tests/no-empty-line-between.js @@ -1,4 +1,4 @@ -const rule = require('..'); +import { rule } from '../index.js'; const { ruleName, messages } = rule; diff --git a/rules/properties-order/tests/removeEmptyLineBefore.test.js b/rules/properties-order/tests/removeEmptyLineBefore.test.js index 6ec0819..c126022 100644 --- a/rules/properties-order/tests/removeEmptyLineBefore.test.js +++ b/rules/properties-order/tests/removeEmptyLineBefore.test.js @@ -1,5 +1,5 @@ -const removeEmptyLinesBefore = require('../removeEmptyLinesBefore'); -const postcss = require('postcss'); +import { removeEmptyLinesBefore } from '../removeEmptyLinesBefore.js'; +import postcss from 'postcss'; function removeEmptyLine(css, lineEnding) { const root = postcss.parse(css); diff --git a/rules/properties-order/tests/report-when-not-fixed.js b/rules/properties-order/tests/report-when-not-fixed.js index 46b17da..1b2e30a 100644 --- a/rules/properties-order/tests/report-when-not-fixed.js +++ b/rules/properties-order/tests/report-when-not-fixed.js @@ -1,5 +1,7 @@ -const stylelint = require('stylelint'); -const { ruleName } = require('..'); +import stylelint from 'stylelint'; +import { rule } from '../index.js'; + +const { ruleName } = rule; test(`show warning if --fix enabled, but it didn't fix`, () => { const code = ` @@ -22,7 +24,6 @@ test(`show warning if --fix enabled, but it didn't fix`, () => { config: stylelintConfig, customSyntax: 'postcss-styled-syntax', fix: true, - quietDeprecationWarnings: true, }; return stylelint.lint(options).then((output) => { @@ -61,7 +62,6 @@ test(`show warning if --fix enabled, and it fixed`, () => { config: stylelintConfig, customSyntax: 'postcss-styled-syntax', fix: true, - quietDeprecationWarnings: true, }; return stylelint.lint(options).then((output) => { diff --git a/rules/properties-order/tests/validate-options.js b/rules/properties-order/tests/validate-options.js index 9cdfa80..10c68f9 100644 --- a/rules/properties-order/tests/validate-options.js +++ b/rules/properties-order/tests/validate-options.js @@ -1,4 +1,6 @@ -const { ruleName } = require('..'); +import { rule } from '../index.js'; + +const { ruleName } = rule; testConfig({ ruleName, diff --git a/rules/properties-order/validatePrimaryOption.js b/rules/properties-order/validatePrimaryOption.js index 18d2782..0648ab8 100644 --- a/rules/properties-order/validatePrimaryOption.js +++ b/rules/properties-order/validatePrimaryOption.js @@ -1,6 +1,6 @@ -const { isBoolean, isString, isObject } = require('../../utils/validateType'); +import { isBoolean, isString, isObject } from '../../utils/validateType.js'; -module.exports = function validatePrimaryOption(actualOptions) { +export function validatePrimaryOption(actualOptions) { // Begin checking array options if (!Array.isArray(actualOptions)) { return false; @@ -62,4 +62,4 @@ module.exports = function validatePrimaryOption(actualOptions) { } return true; -}; +} diff --git a/rules/shorthandData.js b/rules/shorthandData.js index 9c01dcf..8bc2150 100644 --- a/rules/shorthandData.js +++ b/rules/shorthandData.js @@ -1,7 +1,5 @@ -'use strict'; - // See https://github.com/stylelint/stylelint/blob/10.1.0/lib/reference/shorthandData.js -module.exports = { +export const shorthandData = { margin: ['margin-top', 'margin-bottom', 'margin-left', 'margin-right'], padding: ['padding-top', 'padding-bottom', 'padding-left', 'padding-right'], background: [ diff --git a/utils/__tests__/vendor.test.js b/utils/__tests__/vendor.test.js index 6fad3c3..bbe4cfb 100644 --- a/utils/__tests__/vendor.test.js +++ b/utils/__tests__/vendor.test.js @@ -1,15 +1,15 @@ -let vendor = require('../vendor'); +import { prefix, unprefixed } from '../vendor.js'; const VALUE = '-1px -1px 1px rgba(0, 0, 0, 0.2) inset'; it('returns prefix', () => { - expect(vendor.prefix('-moz-color')).toBe('-moz-'); - expect(vendor.prefix('color')).toBe(''); - expect(vendor.prefix(VALUE)).toBe(''); + expect(prefix('-moz-color')).toBe('-moz-'); + expect(prefix('color')).toBe(''); + expect(prefix(VALUE)).toBe(''); }); it('returns unprefixed version', () => { - expect(vendor.unprefixed('-moz-color')).toBe('color'); - expect(vendor.unprefixed('color')).toBe('color'); - expect(vendor.unprefixed(VALUE)).toEqual(VALUE); + expect(unprefixed('-moz-color')).toBe('color'); + expect(unprefixed('color')).toBe('color'); + expect(unprefixed(VALUE)).toEqual(VALUE); }); diff --git a/utils/getContainingNode.js b/utils/getContainingNode.js index 848194b..9d97420 100644 --- a/utils/getContainingNode.js +++ b/utils/getContainingNode.js @@ -1,4 +1,4 @@ -module.exports = function getContainingNode(node) { +export function getContainingNode(node) { if (node.type === 'rule' || node.type === 'atrule') { return node; } @@ -14,4 +14,4 @@ module.exports = function getContainingNode(node) { } return node; -}; +} diff --git a/utils/index.js b/utils/index.js deleted file mode 100644 index 25656c3..0000000 --- a/utils/index.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - getContainingNode: require('./getContainingNode'), - namespace: require('./namespace'), - isCustomProperty: require('./isCustomProperty'), - isStandardSyntaxProperty: require('./isStandardSyntaxProperty'), - isProperty: require('./isProperty'), - isDollarVariable: require('./isDollarVariable'), - isAtVariable: require('./isAtVariable'), - isRuleWithNodes: require('./isRuleWithNodes'), - isLessMixin: require('./isLessMixin'), - vendor: require('./vendor'), -}; diff --git a/utils/isAtVariable.js b/utils/isAtVariable.js index 1aad358..fb90672 100644 --- a/utils/isAtVariable.js +++ b/utils/isAtVariable.js @@ -2,6 +2,6 @@ * Check whether a property is a @-variable (Less) */ -module.exports = function isAtVariable(node) { +export function isAtVariable(node) { return node.type === 'atrule' && node.variable; -}; +} diff --git a/utils/isCustomProperty.js b/utils/isCustomProperty.js index a78b417..71edb8f 100644 --- a/utils/isCustomProperty.js +++ b/utils/isCustomProperty.js @@ -5,6 +5,6 @@ * @return {boolean} If `true`, property is a custom one */ -module.exports = function isCustomProperty(property) { +export function isCustomProperty(property) { return property.startsWith('--'); -}; +} diff --git a/utils/isDollarVariable.js b/utils/isDollarVariable.js index 656c0d8..3de80d6 100644 --- a/utils/isDollarVariable.js +++ b/utils/isDollarVariable.js @@ -5,6 +5,6 @@ * @return {boolean} If `true`, property is a $-variable */ -module.exports = function isDollarVariable(property) { +export function isDollarVariable(property) { return property.startsWith('$'); -}; +} diff --git a/utils/isLessMixin.js b/utils/isLessMixin.js index fcd9f9f..e5153cc 100644 --- a/utils/isLessMixin.js +++ b/utils/isLessMixin.js @@ -2,6 +2,6 @@ * Check whether a property is a Less mixin */ -module.exports = function isLessMixin(node) { +export function isLessMixin(node) { return node.type === 'atrule' && node.mixin; -}; +} diff --git a/utils/isProperty.js b/utils/isProperty.js index 2a36d3a..7d00559 100644 --- a/utils/isProperty.js +++ b/utils/isProperty.js @@ -1,9 +1,9 @@ // Check whether a property is a CSS property -const isCustomProperty = require('./isCustomProperty'); -const isStandardSyntaxProperty = require('./isStandardSyntaxProperty'); +import { isCustomProperty } from './isCustomProperty.js'; +import { isStandardSyntaxProperty } from './isStandardSyntaxProperty.js'; -module.exports = function isProperty(node) { +export function isProperty(node) { return ( node.type === 'decl' && isStandardSyntaxProperty(node.prop) && !isCustomProperty(node.prop) ); -}; +} diff --git a/utils/isRuleWithNodes.js b/utils/isRuleWithNodes.js index ea28563..c6dfe5f 100644 --- a/utils/isRuleWithNodes.js +++ b/utils/isRuleWithNodes.js @@ -1,3 +1,3 @@ -module.exports = function isRuleWithNodes(node) { +export function isRuleWithNodes(node) { return node.nodes && node.nodes.length; -}; +} diff --git a/utils/isStandardSyntaxProperty.js b/utils/isStandardSyntaxProperty.js index 3485bd8..377bcfc 100644 --- a/utils/isStandardSyntaxProperty.js +++ b/utils/isStandardSyntaxProperty.js @@ -5,7 +5,7 @@ * @return {boolean} If `true`, the property is standard */ -module.exports = function isStandardSyntaxProperty(property) { +export function isStandardSyntaxProperty(property) { // SCSS var (e.g. $var: x), list (e.g. $list: (x)) or map (e.g. $map: (key:value)) if (property.startsWith('$')) { return false; @@ -22,4 +22,4 @@ module.exports = function isStandardSyntaxProperty(property) { } return true; -}; +} diff --git a/utils/namespace.js b/utils/namespace.js index f735035..4f3cb13 100644 --- a/utils/namespace.js +++ b/utils/namespace.js @@ -1,5 +1,5 @@ const prefix = 'order'; -module.exports = function namespace(ruleName) { +export function namespace(ruleName) { return `${prefix}/${ruleName}`; -}; +} diff --git a/utils/validateType.js b/utils/validateType.js index 2791f51..c401b1e 100644 --- a/utils/validateType.js +++ b/utils/validateType.js @@ -3,7 +3,7 @@ * @param {any} value * @returns {boolean} */ -function isBoolean(value) { +export function isBoolean(value) { return typeof value === 'boolean' || value instanceof Boolean; } @@ -12,7 +12,7 @@ function isBoolean(value) { * @param {any} value * @returns {boolean} */ -function isNumber(value) { +export function isNumber(value) { return typeof value === 'number' || value instanceof Number; } @@ -21,7 +21,7 @@ function isNumber(value) { * @param {any} value * @returns {boolean} */ -function isRegExp(value) { +export function isRegExp(value) { return value instanceof RegExp; } @@ -30,7 +30,7 @@ function isRegExp(value) { * @param {any} value * @returns {boolean} */ -function isString(value) { +export function isString(value) { return typeof value === 'string' || value instanceof String; } @@ -39,14 +39,6 @@ function isString(value) { * @param {any} value * @returns {boolean} */ -function isObject(value) { +export function isObject(value) { return typeof value === 'object' && value !== null; } - -module.exports = { - isBoolean, - isNumber, - isRegExp, - isString, - isObject, -}; diff --git a/utils/vendor.js b/utils/vendor.js index 6d4feb4..3ba09c0 100644 --- a/utils/vendor.js +++ b/utils/vendor.js @@ -3,43 +3,39 @@ * * Copied from https://github.com/postcss/postcss/commit/777c55b5d2a10605313a4972888f4f32005f5ac2 * - * @namespace vendor */ -let vendor = { - /** - * Returns the vendor prefix extracted from an input string. - * - * @param {string} prop String with or without vendor prefix. - * - * @return {string} vendor prefix or empty string - * - * @example - * vendor.prefix('-moz-tab-size') //=> '-moz-' - * vendor.prefix('tab-size') //=> '' - */ - prefix(prop) { - let match = prop.match(/^(-\w+-)/); - if (match) { - return match[0]; - } +/** + * Returns the vendor prefix extracted from an input string. + * + * @param {string} prop String with or without vendor prefix. + * + * @return {string} vendor prefix or empty string + * + * @example + * vendor.prefix('-moz-tab-size') //=> '-moz-' + * vendor.prefix('tab-size') //=> '' + */ +export function prefix(prop) { + let match = prop.match(/^(-\w+-)/); - return ''; - }, + if (match) { + return match[0]; + } - /** - * Returns the input string stripped of its vendor prefix. - * - * @param {string} prop String with or without vendor prefix. - * - * @return {string} String name without vendor prefixes. - * - * @example - * vendor.unprefixed('-moz-tab-size') //=> 'tab-size' - */ - unprefixed(prop) { - return prop.replace(/^-\w+-/, ''); - }, -}; + return ''; +} -module.exports = vendor; +/** + * Returns the input string stripped of its vendor prefix. + * + * @param {string} prop String with or without vendor prefix. + * + * @return {string} String name without vendor prefixes. + * + * @example + * vendor.unprefixed('-moz-tab-size') //=> 'tab-size' + */ +export function unprefixed(prop) { + return prop.replace(/^-\w+-/, ''); +}