blob: 89894bde925596b6c0ad8f0b5ab492991e4c9faf [file] [log] [blame]
Mathias Bynens79e2cf02020-05-29 16:46:17 +02001'use strict';
2
Tim van der Lippeefb716a2020-12-01 12:54:04 +00003const isScssVariable = require('./isScssVariable');
Tim van der Lippef2ea2c92021-11-08 10:55:56 +00004const { isRoot, isRule } = require('./typeGuards');
Mathias Bynens79e2cf02020-05-29 16:46:17 +02005
6/**
7 * @param {string} [lang]
8 */
9function isStandardSyntaxLang(lang) {
10 return lang && (lang === 'css' || lang === 'custom-template' || lang === 'template-literal');
11}
12
13/**
14 * Check whether a declaration is standard
15 *
Tim van der Lippeefb716a2020-12-01 12:54:04 +000016 * @param {import('postcss').Declaration | import('postcss-less').Declaration} decl
Mathias Bynens79e2cf02020-05-29 16:46:17 +020017 */
18module.exports = function (decl) {
19 const prop = decl.prop;
20 const parent = decl.parent;
Tim van der Lippef2ea2c92021-11-08 10:55:56 +000021 const value = decl.value;
Mathias Bynens79e2cf02020-05-29 16:46:17 +020022
23 // Declarations belong in a declaration block or standard CSS source
24 if (
Tim van der Lippef2ea2c92021-11-08 10:55:56 +000025 parent &&
Mathias Bynens79e2cf02020-05-29 16:46:17 +020026 isRoot(parent) &&
27 parent.source &&
28 !isStandardSyntaxLang(
Tim van der Lippef2ea2c92021-11-08 10:55:56 +000029 /** @type {import('postcss').Source & {lang?: string}} */ (parent.source).lang,
Mathias Bynens79e2cf02020-05-29 16:46:17 +020030 )
31 ) {
32 return false;
33 }
34
Tim van der Lippeefb716a2020-12-01 12:54:04 +000035 // SCSS var
36 if (isScssVariable(prop)) {
Mathias Bynens79e2cf02020-05-29 16:46:17 +020037 return false;
38 }
39
Tim van der Lippef2ea2c92021-11-08 10:55:56 +000040 // SCSS map and list declarations
41 if (value.startsWith('(') && value.endsWith(')')) {
42 return false;
43 }
44
Mathias Bynens79e2cf02020-05-29 16:46:17 +020045 // Less var (e.g. @var: x), but exclude variable interpolation (e.g. @{var})
46 if (prop[0] === '@' && prop[1] !== '{') {
47 return false;
48 }
49
Tim van der Lippef2ea2c92021-11-08 10:55:56 +000050 // Less map declaration
51 if (parent && parent.type === 'atrule' && parent.raws.afterName === ':') {
52 return false;
53 }
54
Mathias Bynens79e2cf02020-05-29 16:46:17 +020055 // Sass nested properties (e.g. border: { style: solid; color: red; })
56 if (
Tim van der Lippef2ea2c92021-11-08 10:55:56 +000057 parent &&
58 isRule(parent) &&
Mathias Bynens79e2cf02020-05-29 16:46:17 +020059 parent.selector &&
Mathias Bynens79e2cf02020-05-29 16:46:17 +020060 parent.selector[parent.selector.length - 1] === ':' &&
Mathias Bynens79e2cf02020-05-29 16:46:17 +020061 parent.selector.substring(0, 2) !== '--'
62 ) {
63 return false;
64 }
65
66 // Less &:extend
Tim van der Lippeefb716a2020-12-01 12:54:04 +000067 if ('extend' in decl && decl.extend) {
Mathias Bynens79e2cf02020-05-29 16:46:17 +020068 return false;
69 }
70
71 return true;
72};