Skip to content

Commit

Permalink
Add at-use-no-redundant-alias rule
Browse files Browse the repository at this point in the history
  • Loading branch information
pamelalozano16 committed Sep 5, 2023
1 parent 9aa4449 commit 3d7e525
Show file tree
Hide file tree
Showing 6 changed files with 201 additions and 3 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,9 @@
# 5.2.0

- Added: `at-use-no-redundant-alias` rule to disallow redundant namespace aliases (#445).

**Full Changelog**: https://github.com/stylelint-scss/stylelint-scss/compare/v5.1.0...v5.2.0

# 5.1.0

- Added: `function-disallowed-list` rule support to ban specific built-in functions (#422, #844).
Expand Down
5 changes: 2 additions & 3 deletions README.md
Expand Up @@ -30,9 +30,7 @@ Create the `.stylelintrc.json` config file (or open the existing one), add `styl

```jsonc
{
"plugins": [
"stylelint-scss"
],
"plugins": ["stylelint-scss"],
"rules": {
// recommended rules
"at-rule-no-unknown": null,
Expand Down Expand Up @@ -102,6 +100,7 @@ Please also see the [example configs](./docs/examples/) for special cases.
### `@`-use

- [`at-use-no-unnamespaced`](./src/rules/at-use-no-unnamespaced/README.md): Disallow `@use` without a namespace (i.e. `@use "..." as *`).
- [`at-use-no-redundant-alias`](./src/rules/at-use-no-redundant-alias/README.md): Disallow redundant namespace aliases (i.e. `@use "foo" as foo`).

### `$`-variable

Expand Down
44 changes: 44 additions & 0 deletions src/rules/at-use-no-redundant-alias/README.md
@@ -0,0 +1,44 @@
# at-use-no-redundant-alias

Disallow redundant namespace aliases.

```scss
@use "foo" as foo;
/** ↑
* Disallow this */
```

By default, the [module's namespace](https://sass-lang.com/documentation/at-rules/use/#loading-members)
is the last component of the module’s URL.

## Options

### `true`

The following patterns are considered warnings:

```scss
@use "foo" as foo;
```

```scss
@use "sass:math" as math;
```

```scss
@use "src/corners" as corners;
```

The following patterns are _not_ considered warnings:

```scss
@use "foo" as bar;
```

```scss
@use "sass:math";
```

```scss
@use "src/corners" as c;
```
95 changes: 95 additions & 0 deletions src/rules/at-use-no-redundant-alias/__tests__/index.js
@@ -0,0 +1,95 @@
"use strict";

const { messages, ruleName } = require("..");

testRule({
ruleName,
config: [true],
customSyntax: "postcss-scss",

accept: [
{
code: `
@use "foo";
`,
description: "Default namespace"
},
{
code: `
@use "foo/bar" as foo;
`,
description: "Different namespace"
},
{
code: `
@use "sass:math" as *;
`,
description: "Without namespace"
},
{
code: `
@use "sass:math";
`,
description: "No explicit namespace"
}
],

reject: [
{
code: `
@use "foo" as foo;
`,
line: 2,
column: 7,
message: messages.rejected,
description: "Without url"
},
{
code: `
@use "src/corners" as corners;
`,
line: 2,
column: 7,
message: messages.rejected,
description: "With url"
},
{
code: `
@use "sass:math" as math;
`,
line: 2,
column: 7,
message: messages.rejected,
description: "Built-in module"
},
{
code: `
@use "foo" as foo;
`,
line: 2,
column: 7,
message: messages.rejected,
description: "Without space"
},
{
code: `
@use "foo" as foo with ($baz: 1px);
`,
line: 2,
column: 7,
message: messages.rejected,
description: "Configured"
},
{
code: `
@use "sass:color" as color with (
$baz: 1px
);
`,
line: 2,
column: 7,
message: messages.rejected,
description: "Configured multiline"
}
]
});
53 changes: 53 additions & 0 deletions src/rules/at-use-no-redundant-alias/index.js
@@ -0,0 +1,53 @@
"use strict";

const { utils } = require("stylelint");
const namespace = require("../../utils/namespace");
const ruleUrl = require("../../utils/ruleUrl");

const ruleName = namespace("at-use-no-redundant-alias");

const messages = utils.ruleMessages(ruleName, {
rejected: "Unnecessary explicit namespace"
});

const meta = {
url: ruleUrl(ruleName)
};

function getDefaultNamespace(module) {
return module.match(/([^/:]+)$/)[1].replace(/\.[^.]|["]+$/, "");
}

function separateEachParams(paramString) {
const parts = paramString.replace(/"/g, "").split(/\s+as\s+|\s+with\s+/);
if (parts.length < 2) return;
return parts;
}

function rule(actual) {
return (root, result) => {
const validOptions = utils.validateOptions(result, ruleName, { actual });

if (!validOptions) {
return;
}

root.walkAtRules("use", decl => {
const parts = separateEachParams(decl.params);
if (parts && getDefaultNamespace(parts[0]) === parts[1]) {
utils.report({
message: messages.rejected,
node: decl,
result,
ruleName
});
}
});
};
}

rule.ruleName = ruleName;
rule.messages = messages;
rule.meta = meta;

module.exports = rule;
1 change: 1 addition & 0 deletions src/rules/index.js
Expand Up @@ -23,6 +23,7 @@ const rules = {
"at-mixin-pattern": require("./at-mixin-pattern"),
"at-rule-conditional-no-parentheses": require("./at-rule-conditional-no-parentheses"),
"at-rule-no-unknown": require("./at-rule-no-unknown"),
"at-use-no-redundant-alias": require("./at-use-no-redundant-alias"),
"at-use-no-unnamespaced": require("./at-use-no-unnamespaced"),
"comment-no-empty": require("./comment-no-empty"),
"comment-no-loud": require("./comment-no-loud"),
Expand Down

0 comments on commit 3d7e525

Please sign in to comment.