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 Aug 28, 2023
1 parent 9aa4449 commit 56aeb30
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 0 deletions.
38 changes: 38 additions & 0 deletions src/rules/at-use-no-redundant-alias/README.md
@@ -0,0 +1,38 @@
# at-use-no-redundant-alias

By default, the module's namespace is just the last component of the module’s URL.
This rule is to disallow redundant namespace aliases.

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

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 56aeb30

Please sign in to comment.