Skip to content

Commit

Permalink
possible only booleans and fallback to 1
Browse files Browse the repository at this point in the history
  • Loading branch information
joseph118 committed Jan 6, 2021
1 parent cd3356e commit a703367
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 216 deletions.
26 changes: 21 additions & 5 deletions src/rules/no-duplicate-dollar-variables/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,22 @@ A dollar variable is considered a duplicate if it shadows a variable of the same
}
```

A dollar variable is **not** considered a duplicate if it contains the `!default` keyword (see the [Sass documentation](https://sass-lang.com/documentation/variables#default-values)). Two dollar variables are duplicates if they both contain `!default` keyword.

```scss
$a: 1;
$a: 5 !default;
/** ↑
* Not a duplicate */

$b: 1 !default;
$b: 5 !default;
/** ↑
* These are duplicates */
```



## Options

### `true`
Expand Down Expand Up @@ -163,9 +179,9 @@ $a: 1;

___

### `ignoreDefaults: [boolean, number]`
### `ignoreDefaults: [boolean]`

Ignores all or an amount of variables containing the `!default` keyword.
Ignore all variables containing the `!default` keyword.

Given:

Expand All @@ -185,12 +201,12 @@ $a: 15 !default;
Given:

```json
{ "ignoreDefaults": 1 }
{ "ignoreDefaults": false }
```

The following patterns are _not_ considered warnings:
The following patterns are considered warnings:

```scss
$a: 5 !default;
$a: $a + 1;
$a: 1;
```
284 changes: 80 additions & 204 deletions src/rules/no-duplicate-dollar-variables/__tests__/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,45 @@ testRule(rule, {
}
`,
description: "Two variables in unrelated at-rule scope cases."
},
{
code: `
$a: 1 !default;
$b: 1;
`,
description:
"Two dollar variables with different names and one containing a default."
},
{
code: `
$a: 1 !default;
$a: 1;
`,
description:
"Two dollar variables with same names and one containing a default."
},
{
code: `
$a: 1 !default;
$a: 1;
$b: 1 !default;
$b: 1;
`,
description:
"Two grouped dollar variables and each group contains a default."
},
{
code: `
$a: 1 !default;
$a: 1;
$b: 5;$b: 4 !default;
$c: 6 !default;
$c: $c + 5;
`,
description:
"Three grouped dollar variables and each group contains a default."
}
],

Expand Down Expand Up @@ -276,6 +315,47 @@ testRule(rule, {
message: messages.rejected("$ab"),
description:
"Two dollar variables with the same name and multi-level nesting."
},
{
code: `
$a: 1;
$a: 2;
`,
line: 3,
column: 7,
message: messages.rejected("$a"),
description: "Two dollar variables with the same name."
},
{
code: `
$a: 1 !default;
$a: 2 !default;
`,
line: 3,
column: 7,
message: messages.rejected("$a"),
description:
"Two dollar variables with the same name and containing default."
},
{
code: `
$a: 1 !default; $a: 2 !default;
`,
line: 2,
column: 23,
message: messages.rejected("$a"),
description:
"Two dollar variables with the same name on the same line and containing default."
},
{
code: `
$a: 5; $a: 1 !default; $a: 2 !default;
`,
line: 2,
column: 30,
message: messages.rejected("$a"),
description:
"Three dollar variables with the same name on the same line and two contains default."
}
]
});
Expand Down Expand Up @@ -1077,207 +1157,3 @@ testRule(rule, {
}
]
});

testRule(rule, {
ruleName,
config: [true, { ignoreDefaults: 1 }],
syntax: "scss",

accept: [
{
code: `
$a: 1 !default;
$b: 1;
`,
description:
"Two dollar variables with different names and one containing a default."
},
{
code: `
$a: 1 !default;
$a: 1;
`,
description:
"Two dollar variables with same names and one containing a default."
},
{
code: `
$a: 1 !default;
$a: 1;
$b: 1 !default;
$b: 1;
`,
description:
"Two grouped dollar variables and each group contains a default."
},
{
code: `
$a: 1 !default;
$a: 1;
$b: 5;$b: 4 !default;
$c: 6 !default;
$c: $c + 5;
`,
description:
"Three grouped dollar variables and each group contains a default."
}
],

reject: [
{
code: `
$a: 1;
$a: 2;
`,
line: 3,
column: 7,
message: messages.rejected("$a"),
description: "Two dollar variables with the same name."
},
{
code: `
$a: 1 !default;
$a: 2 !default;
`,
line: 3,
column: 7,
message: messages.rejected("$a"),
description:
"Two dollar variables with the same name and containing default."
},
{
code: `
$a: 1 !default; $a: 2 !default;
`,
line: 2,
column: 23,
message: messages.rejected("$a"),
description:
"Two dollar variables with the same name on the same line and containing default."
},
{
code: `
$a: 5; $a: 1 !default; $a: 2 !default;
`,
line: 2,
column: 30,
message: messages.rejected("$a"),
description:
"Three dollar variables with the same name on the same line and two contains default."
}
]
});

testRule(rule, {
ruleName,
config: [true, { ignoreDefaults: 3 }],
syntax: "scss",

accept: [
{
code: `
$a: 1 !default;
$b: 1;
`,
description:
"Two dollar variables with different names and one containing a default."
},
{
code: `
$a: 1 !default;
$a: 1;
`,
description:
"Two dollar variables with same names and one containing a default."
},
{
code: `
$a: 1;
$a: 1 !default;
$a: 1 !default;
$a: 1 !default;
`,
description:
"Four dollar variables with same names and three containing a default."
},
{
code: `
$a: 1;
$a: 1 !default;
$a: 1 !default;
$a: 1 !default;
$b: 1;
$b: 1 !default;
$b: 1 !default;
$b: 1 !default;
`,
description:
"Two grouped dollar variables and each group contains three variables with default."
},
{
code: `
$a: 1;
$a: 1 !default;
$a: 2 !default;
$a: 3 !default;
$b: 5;$b: 4 !default;$b: 5 !default;$b: 6 !default;
$c: 6 !default;
$c: 7 !default;
$c: 8 !default;
$c: $c + 5;
`,
description:
"Three grouped dollar variables and each group contains three variables with default."
}
],

reject: [
{
code: `
$a: 1;
$a: 2;
`,
line: 3,
column: 7,
message: messages.rejected("$a"),
description: "Two dollar variables with the same name."
},
{
code: `
$a: 1 !default;
$a: 2 !default;
$a: 2 !default;
$a: 2 !default;
`,
line: 5,
column: 7,
message: messages.rejected("$a"),
description:
"Four dollar variables with the same name and containing default."
},
{
code: `
$a: 1 !default; $a: 2 !default; $a: 3 !default; $a: 4 !default;
`,
line: 2,
column: 55,
message: messages.rejected("$a"),
description:
"Four dollar variables with the same name on the same line and containing default."
},
{
code: `
$a: 5; $a: 1 !default; $a: 2 !default; $a: 3 !default;$a: 4 !default;
`,
line: 2,
column: 61,
message: messages.rejected("$a"),
description:
"Five dollar variables with the same name on the same line and four contains default."
}
]
});
12 changes: 5 additions & 7 deletions src/rules/no-duplicate-dollar-variables/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default function(value, secondaryOptions) {
possible: {
ignoreInside: ["at-rule", "nested-at-rule"],
ignoreInsideAtRules: [isString],
ignoreDefaults: [isBoolean, isFinite]
ignoreDefaults: [isBoolean]
},
optional: true
}
Expand Down Expand Up @@ -85,7 +85,7 @@ export default function(value, secondaryOptions) {
* @returns true if declared.
*/
function isDeclared(variableData, isDefault, ignoreDefaults) {
if (isDefault && ignoreDefaults !== undefined) {
if (isDefault) {
if (isFinite(ignoreDefaults)) {
return variableData.defaultCount >= ignoreDefaults;
} else if (ignoreDefaults) {
Expand All @@ -110,16 +110,14 @@ export default function(value, secondaryOptions) {
? ++variableData.defaultCount
: variableData.defaultCount,
isDeclared:
isDefault && ignoreDefaults !== undefined
? variableData.isDeclared
: true
isDefault && ignoreDefaults !== false ? variableData.isDeclared : true
};
}

const ignoreDefaults =
secondaryOptions && secondaryOptions.ignoreDefaults
secondaryOptions && secondaryOptions.ignoreDefaults !== undefined
? secondaryOptions.ignoreDefaults
: undefined;
: 1;

root.walkDecls(decl => {
const isVar = decl.prop[0] === "$";
Expand Down

0 comments on commit a703367

Please sign in to comment.