stylelint-plugin-logical-css 0.13.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -270,6 +270,10 @@ directions. Instead, this rule will enforce the logical equivalents, `vi` and
270
270
  body {
271
271
  max-block-size: 100vh; /* Will flag the physical use of viewport "height" */
272
272
  }
273
+
274
+ .container {
275
+ inline-size: clamp(10vw, 100%, 50vw); /* Will flag the physical use of viewport "width" */
276
+ }
273
277
  ```
274
278
 
275
279
  ##### Allowed
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "stylelint-plugin-logical-css",
3
- "version": "0.13.2",
3
+ "version": "1.1.0",
4
4
  "description": "A Stylelint plugin to enforce the use of logical CSS properties, values and units.",
5
5
  "main": "src/index.js",
6
+ "type": "module",
7
+ "exports": "./src/index.js",
6
8
  "files": [
7
9
  "src/**/*.js",
8
10
  "!**/**/*.test.js"
9
11
  ],
10
12
  "scripts": {
11
13
  "prepare": "husky install",
12
- "test": "jest"
14
+ "jest": "cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest --runInBand",
15
+ "test": "npm run jest",
16
+ "test:watch": "npm run jest -- --watch"
13
17
  },
14
18
  "repository": {
15
19
  "type": "git",
@@ -22,34 +26,39 @@
22
26
  },
23
27
  "homepage": "https://github.com/yuschick/stylelint-plugin-logical-css#readme",
24
28
  "engines": {
25
- "node": ">=16.0.0"
29
+ "node": ">=18.12.0"
26
30
  },
27
31
  "keywords": [
28
- "Stylelint",
29
- "Plugin",
30
- "CSS",
31
- "Logical CSS",
32
- "Internationalization",
33
- "i18n"
32
+ "css",
33
+ "csslint",
34
+ "internationalization",
35
+ "i18n",
36
+ "lint",
37
+ "linter",
38
+ "stylelint",
39
+ "stylelint-plugin",
40
+ "logical css"
34
41
  ],
35
42
  "peerDependencies": {
36
- "stylelint": "^14.0.0 || ^15.0.0"
43
+ "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.0"
37
44
  },
38
45
  "devDependencies": {
39
- "@commitlint/cli": "^17.4.4",
40
- "@commitlint/config-conventional": "^17.4.4",
46
+ "@commitlint/cli": "^18.4.3",
47
+ "@commitlint/config-conventional": "^18.4.3",
48
+ "cross-env": "^7.0.3",
41
49
  "eslint": "^8.35.0",
42
- "husky": "^8.0.0",
50
+ "husky": "^8.0.3",
43
51
  "jest": "^29.4.3",
44
52
  "jest-cli": "^29.4.3",
45
- "jest-preset-stylelint": "^6.1.0",
46
- "lint-staged": "^13.1.2",
47
- "prettier": "^2.8.4",
48
- "prettier-eslint": "^15.0.1",
49
- "stylelint": "^15.2.0"
53
+ "jest-light-runner": "^0.6.0",
54
+ "jest-preset-stylelint": "^7.0.0",
55
+ "lint-staged": "^15.0.2",
56
+ "prettier": "^3.0.3",
57
+ "prettier-eslint": "^16.1.2",
58
+ "stylelint": "^16.1.0"
50
59
  },
51
60
  "lint-staged": {
52
- "**/*.{js|md}": [
61
+ "**/*.js|md|json": [
53
62
  "eslint",
54
63
  "prettier --write"
55
64
  ]
package/src/index.js CHANGED
@@ -1,4 +1,4 @@
1
- const useLogicalPropertiesAndValues = require('./rules/use-logical-properties-and-values');
2
- const useLogicalUnits = require('./rules/use-logical-units');
1
+ import useLogicalPropertiesAndValues from './rules/use-logical-properties-and-values/index.js';
2
+ import useLogicalUnits from './rules/use-logical-units/index.js';
3
3
 
4
- module.exports = [useLogicalPropertiesAndValues, useLogicalUnits];
4
+ export default [useLogicalPropertiesAndValues, useLogicalUnits];
@@ -1,10 +1,8 @@
1
- 'use strict';
1
+ import stylelint from 'stylelint';
2
2
 
3
- const stylelint = require('stylelint');
3
+ export const ruleName = 'plugin/use-logical-properties-and-values';
4
4
 
5
- const ruleName = 'plugin/use-logical-properties-and-values';
6
-
7
- const ruleMessages = stylelint.utils.ruleMessages(ruleName, {
5
+ export const ruleMessages = stylelint.utils.ruleMessages(ruleName, {
8
6
  unexpectedProp(physicalProperty, logicalProperty) {
9
7
  return `Unexpected "${physicalProperty}" property. Use "${logicalProperty}".`;
10
8
  },
@@ -16,12 +14,6 @@ const ruleMessages = stylelint.utils.ruleMessages(ruleName, {
16
14
  },
17
15
  });
18
16
 
19
- const ruleMeta = {
17
+ export const ruleMeta = {
20
18
  url: 'https://github.com/yuschick/stylelint-plugin-logical-css',
21
19
  };
22
-
23
- module.exports = {
24
- ruleName,
25
- ruleMessages,
26
- ruleMeta,
27
- };
@@ -1,14 +1,12 @@
1
- 'use strict';
1
+ import stylelint from 'stylelint';
2
2
 
3
- const stylelint = require('stylelint');
4
-
5
- const { ruleName, ruleMessages, ruleMeta } = require('./base');
6
- const { vendorPrefixes } = require('../../utils/vendorPrefixes');
7
- const { physicalProperties } = require('../../utils/physical');
8
- const { isPhysicalProperty } = require('../../utils/isPhysicalProperty');
9
- const { isPhysicalValue } = require('../../utils/isPhysicalValue');
10
- const { physicalPropertiesMap } = require('../../utils/physicalPropertiesMap');
11
- const { physicalValuesMap } = require('../../utils/physicalValuesMap');
3
+ import { ruleName, ruleMessages, ruleMeta } from './base.js';
4
+ import { vendorPrefixes } from '../../utils/vendorPrefixes.js';
5
+ import { physicalProperties } from '../../utils/physical.js';
6
+ import { isPhysicalProperty } from '../../utils/isPhysicalProperty.js';
7
+ import { isPhysicalValue } from '../../utils/isPhysicalValue.js';
8
+ import { physicalPropertiesMap } from '../../utils/physicalPropertiesMap.js';
9
+ import { physicalValuesMap } from '../../utils/physicalValuesMap.js';
12
10
 
13
11
  const ruleFunction = (_, options, context) => {
14
12
  return (root, result) => {
@@ -119,4 +117,4 @@ ruleFunction.ruleName = ruleName;
119
117
  ruleFunction.messages = ruleMessages;
120
118
  ruleFunction.meta = ruleMeta;
121
119
 
122
- module.exports = stylelint.createPlugin(ruleName, ruleFunction);
120
+ export default stylelint.createPlugin(ruleName, ruleFunction);
@@ -1,21 +1,13 @@
1
- 'use strict';
1
+ import stylelint from 'stylelint';
2
2
 
3
- const stylelint = require('stylelint');
3
+ export const ruleName = 'plugin/use-logical-units';
4
4
 
5
- const ruleName = 'plugin/use-logical-units';
6
-
7
- const ruleMessages = stylelint.utils.ruleMessages(ruleName, {
5
+ export const ruleMessages = stylelint.utils.ruleMessages(ruleName, {
8
6
  unexpectedUnit(physicalUnit, logicalUnit) {
9
7
  return `Unexpected "${physicalUnit}" unit. Use "${logicalUnit}".`;
10
8
  },
11
9
  });
12
10
 
13
- const ruleMeta = {
11
+ export const ruleMeta = {
14
12
  url: 'https://github.com/yuschick/stylelint-plugin-logical-css',
15
13
  };
16
-
17
- module.exports = {
18
- ruleName,
19
- ruleMessages,
20
- ruleMeta,
21
- };
@@ -1,10 +1,8 @@
1
- 'use strict';
1
+ import stylelint from 'stylelint';
2
2
 
3
- const stylelint = require('stylelint');
4
-
5
- const { ruleName, ruleMessages, ruleMeta } = require('./base');
6
- const { getValueUnit, isPhysicalUnit } = require('../../utils/isPhysicalUnit');
7
- const { physicalUnitsMap } = require('../../utils/physicalUnitsMap');
3
+ import { ruleName, ruleMessages, ruleMeta } from './base.js';
4
+ import { getValueUnit, isPhysicalUnit } from '../../utils/isPhysicalUnit.js';
5
+ import { physicalUnitsMap } from '../../utils/physicalUnitsMap.js';
8
6
 
9
7
  const ruleFunction = (_, options, context) => {
10
8
  return (root, result) => {
@@ -21,22 +19,24 @@ const ruleFunction = (_, options, context) => {
21
19
 
22
20
  const physicalUnit = getValueUnit(decl.value);
23
21
 
24
- if (
25
- Array.isArray(options?.ignore) &&
26
- options?.ignore.includes(physicalUnit)
27
- ) {
22
+ const ignore = physicalUnit.some(
23
+ (unit) =>
24
+ Array.isArray(options?.ignore) && options?.ignore.includes(unit),
25
+ );
26
+
27
+ if (ignore) {
28
28
  return;
29
29
  }
30
30
 
31
31
  const message = ruleMessages.unexpectedUnit(
32
32
  physicalUnit,
33
- physicalUnitsMap[physicalUnit],
33
+ physicalUnit.map((unit) => physicalUnitsMap[unit]),
34
34
  );
35
35
 
36
36
  if (context.fix) {
37
- decl.value = decl.value.replace(
38
- physicalUnit,
39
- physicalUnitsMap[physicalUnit],
37
+ physicalUnit.forEach(
38
+ (unit) =>
39
+ (decl.value = decl.value.replace(unit, physicalUnitsMap[unit])),
40
40
  );
41
41
 
42
42
  return;
@@ -56,4 +56,4 @@ ruleFunction.ruleName = ruleName;
56
56
  ruleFunction.messages = ruleMessages;
57
57
  ruleFunction.meta = ruleMeta;
58
58
 
59
- module.exports = stylelint.createPlugin(ruleName, ruleFunction);
59
+ export default stylelint.createPlugin(ruleName, ruleFunction);
@@ -1,13 +1,9 @@
1
- const { physicalPropertiesMap } = require('./physicalPropertiesMap');
1
+ import { physicalPropertiesMap } from './physicalPropertiesMap.js';
2
2
 
3
- function isPhysicalProperty(property) {
3
+ export function isPhysicalProperty(property) {
4
4
  const physicalProperties = Object.keys(physicalPropertiesMap);
5
5
 
6
6
  const propIsPhysical = physicalProperties.includes(property);
7
7
 
8
8
  return propIsPhysical;
9
9
  }
10
-
11
- module.exports = {
12
- isPhysicalProperty,
13
- };
@@ -1,30 +1,29 @@
1
- const { physicalUnits } = require('./physical');
1
+ import { physicalUnits } from './physical.js';
2
2
 
3
- const expression = /(\d+\s?)(cqh|cqw|dvh|dvw|lvh|lvw|svh|svw|vh|vw|)(\s+|$)/;
3
+ const expression = /\b\d+(\.\d+)?\s*(cqh|cqw|dvh|dvw|lvh|lvw|svh|svw|vh|vw)\b/g;
4
4
 
5
- function getValueUnit(value) {
5
+ export function getValueUnit(value) {
6
6
  const match = value.match(expression);
7
7
 
8
8
  if (!match) return false;
9
9
 
10
- const matchedUnit = match.find((item) =>
11
- Object.values(physicalUnits).includes(item),
10
+ const matches = Array.isArray(match) ? match : [match];
11
+
12
+ const matchedUnit = matches.map(
13
+ (match) => physicalUnits[match.replace(/[0-9]/g, '')],
12
14
  );
13
15
 
14
16
  return matchedUnit;
15
17
  }
16
18
 
17
- function isPhysicalUnit(value) {
18
- const unit = getValueUnit(value);
19
+ export function isPhysicalUnit(value) {
20
+ const units = getValueUnit(value);
19
21
 
20
- if (!unit) return false;
22
+ if (!units) return false;
21
23
 
22
- const unitIsPhysical = Object.values(physicalUnits).includes(unit);
24
+ const unitIsPhysical = Object.values(physicalUnits).some((unit) =>
25
+ units.find((match) => match.includes(unit)),
26
+ );
23
27
 
24
28
  return unitIsPhysical;
25
29
  }
26
-
27
- module.exports = {
28
- getValueUnit,
29
- isPhysicalUnit,
30
- };
@@ -1,6 +1,6 @@
1
- const { physicalAxis, physicalValues } = require('./physical');
1
+ import { physicalAxis, physicalValues } from './physical.js';
2
2
 
3
- function isPhysicalValue(value) {
3
+ export function isPhysicalValue(value) {
4
4
  const values = [
5
5
  ...Object.values(physicalValues),
6
6
  ...Object.values(physicalAxis),
@@ -10,7 +10,3 @@ function isPhysicalValue(value) {
10
10
 
11
11
  return valueIsPhysical;
12
12
  }
13
-
14
- module.exports = {
15
- isPhysicalValue,
16
- };
@@ -1,14 +1,14 @@
1
- const logicalAxis = Object.freeze({
1
+ export const logicalAxis = Object.freeze({
2
2
  block: 'block',
3
3
  inline: 'inline',
4
4
  });
5
5
 
6
- const logicalInlinePoints = Object.freeze({
6
+ export const logicalInlinePoints = Object.freeze({
7
7
  end: 'end',
8
8
  start: 'start',
9
9
  });
10
10
 
11
- const logicalProperties = Object.freeze({
11
+ export const logicalProperties = Object.freeze({
12
12
  blockSize: 'block-size',
13
13
  borderBlock: 'border-block',
14
14
  borderBlockColor: 'border-block-color',
@@ -85,7 +85,7 @@ const logicalProperties = Object.freeze({
85
85
  scrollPaddingInlineStart: 'scroll-padding-inline-start',
86
86
  });
87
87
 
88
- const logicalUnits = Object.freeze({
88
+ export const logicalUnits = Object.freeze({
89
89
  cqb: 'cqb',
90
90
  cqi: 'cqi',
91
91
  dvb: 'dvb',
@@ -98,17 +98,9 @@ const logicalUnits = Object.freeze({
98
98
  vi: 'vi',
99
99
  });
100
100
 
101
- const logicalValues = Object.freeze({
101
+ export const logicalValues = Object.freeze({
102
102
  blockEnd: 'block-end',
103
103
  blockStart: 'block-start',
104
104
  inlineEnd: 'inline-end',
105
105
  inlineStart: 'inline-start',
106
106
  });
107
-
108
- module.exports = {
109
- logicalAxis,
110
- logicalInlinePoints,
111
- logicalProperties,
112
- logicalUnits,
113
- logicalValues,
114
- };
@@ -1,11 +1,11 @@
1
- const physicalAxis = Object.freeze({
1
+ export const physicalAxis = Object.freeze({
2
2
  horizontal: 'horizontal',
3
3
  vertical: 'vertical',
4
4
  x: 'x',
5
5
  y: 'y',
6
6
  });
7
7
 
8
- const physicalProperties = Object.freeze({
8
+ export const physicalProperties = Object.freeze({
9
9
  borderBottom: 'border-bottom',
10
10
  borderBottomColor: 'border-bottom-color',
11
11
  borderBottomLeftRadius: 'border-bottom-left-radius',
@@ -66,7 +66,7 @@ const physicalProperties = Object.freeze({
66
66
  width: 'width',
67
67
  });
68
68
 
69
- const physicalUnits = Object.freeze({
69
+ export const physicalUnits = Object.freeze({
70
70
  cqh: 'cqh',
71
71
  cqw: 'cqw',
72
72
  dvh: 'dvh',
@@ -79,16 +79,9 @@ const physicalUnits = Object.freeze({
79
79
  vw: 'vw',
80
80
  });
81
81
 
82
- const physicalValues = Object.freeze({
82
+ export const physicalValues = Object.freeze({
83
83
  bottom: 'bottom',
84
84
  left: 'left',
85
85
  right: 'right',
86
86
  top: 'top',
87
87
  });
88
-
89
- module.exports = {
90
- physicalAxis,
91
- physicalProperties,
92
- physicalUnits,
93
- physicalValues,
94
- };
@@ -1,7 +1,7 @@
1
- const { logicalProperties } = require('./logical');
2
- const { physicalProperties } = require('./physical');
1
+ import { logicalProperties } from './logical.js';
2
+ import { physicalProperties } from './physical.js';
3
3
 
4
- const physicalPropertiesMap = Object.freeze({
4
+ export const physicalPropertiesMap = Object.freeze({
5
5
  [physicalProperties.borderBottom]: logicalProperties.borderBlockEnd,
6
6
  [physicalProperties.borderBottomColor]: logicalProperties.borderBlockEndColor,
7
7
  [physicalProperties.borderBottomLeftRadius]:
@@ -74,7 +74,3 @@ const physicalPropertiesMap = Object.freeze({
74
74
  [physicalProperties.top]: logicalProperties.insetBlockStart,
75
75
  [physicalProperties.width]: logicalProperties.inlineSize,
76
76
  });
77
-
78
- module.exports = {
79
- physicalPropertiesMap,
80
- };
@@ -1,7 +1,7 @@
1
- const { logicalUnits } = require('./logical');
2
- const { physicalUnits } = require('./physical');
1
+ import { logicalUnits } from './logical.js';
2
+ import { physicalUnits } from './physical.js';
3
3
 
4
- const physicalUnitsMap = Object.freeze({
4
+ export const physicalUnitsMap = Object.freeze({
5
5
  [physicalUnits.cqh]: logicalUnits.cqb,
6
6
  [physicalUnits.cqw]: logicalUnits.cqi,
7
7
  [physicalUnits.dvh]: logicalUnits.dvb,
@@ -13,7 +13,3 @@ const physicalUnitsMap = Object.freeze({
13
13
  [physicalUnits.vh]: logicalUnits.vb,
14
14
  [physicalUnits.vw]: logicalUnits.vi,
15
15
  });
16
-
17
- module.exports = {
18
- physicalUnitsMap,
19
- };
@@ -1,15 +1,11 @@
1
- const {
2
- logicalAxis,
3
- logicalInlinePoints,
4
- logicalValues,
5
- } = require('./logical');
6
- const {
1
+ import { logicalAxis, logicalInlinePoints, logicalValues } from './logical.js';
2
+ import {
7
3
  physicalAxis,
8
4
  physicalProperties,
9
5
  physicalValues,
10
- } = require('./physical');
6
+ } from './physical.js';
11
7
 
12
- const physicalValuesMap = Object.freeze({
8
+ export const physicalValuesMap = Object.freeze({
13
9
  [physicalProperties.boxOrient]: {
14
10
  [physicalAxis.horizontal]: `${logicalAxis.inline}-axis`,
15
11
  [physicalAxis.vertical]: `${logicalAxis.block}-axis`,
@@ -37,7 +33,3 @@ const physicalValuesMap = Object.freeze({
37
33
  [physicalValues.right]: logicalInlinePoints.end,
38
34
  },
39
35
  });
40
-
41
- module.exports = {
42
- physicalValuesMap,
43
- };
@@ -1,3 +1 @@
1
- const vendorPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];
2
-
3
- module.exports = { vendorPrefixes };
1
+ export const vendorPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];