Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "comment-pattern" rule #4962

Merged
merged 10 commits into from Oct 15, 2020
1 change: 1 addition & 0 deletions docs/user-guide/rules/list.md
Expand Up @@ -230,6 +230,7 @@ Grouped first by the following categories and then by the [_thing_](http://apps.

- [`comment-word-blacklist`](../../../lib/rules/comment-word-blacklist/README.md): Specify a list of disallowed words within comments. **(deprecated)**
- [`comment-word-disallowed-list`](../../../lib/rules/comment-word-disallowed-list/README.md): Specify a list of disallowed words within comments.
- [`comment-pattern`](../../../lib/rules/comment-pattern/README.md): Specify a pattern for comments.
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved

### General / Sheet

Expand Down
39 changes: 39 additions & 0 deletions lib/rules/comment-pattern/README.md
@@ -0,0 +1,39 @@
# custom-property-pattern
omril321 marked this conversation as resolved.
Show resolved Hide resolved

Specify a pattern for comments.

<!-- prettier-ignore -->
```css
/*comment*/
/* ↑ */ a { --foo-: 1px; }
/** ↑
* The pattern of this */
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved
```

## Options

`regex`

The pattern to match the comments with.

Given the regex:

```js
/foo .+/
```
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved

The following patterns are considered violations:

<!-- prettier-ignore -->
```css
/*not starting with foo*/
a { color: red; }
```

The following patterns are _not_ considered violations:

<!-- prettier-ignore -->
```css
/*foo at the beginning*/
a { color: red; }
```
84 changes: 84 additions & 0 deletions lib/rules/comment-pattern/__tests__/index.js
@@ -0,0 +1,84 @@
'use strict';

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

testRule({
ruleName,
config: [/foo-.+/],
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved

accept: [
{
code: '/* foo-valid yay */',
},
{
code: `/* foo--
multi-line
\n
\r
\r\n
\n\r
\t
*/`,
},
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can remove these .without-comment {} tests as they are duplicated in the basic checks.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, I didn't know the basic checks :)

code: '.without-comment {}',
},
],

reject: [
{
code: '/* not foo- */',
message: messages.expected,
},
{
code: '/**/',
message: messages.expected,
},
],
});

testRule({
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can remove this testRule.


I'd expect config: [true] to produce an invalid option error. This is likely a short coming in the validateOptions function, that we can pick up another time.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this. I'll open an issue soon 👍

ruleName,
config: [true],

accept: [
{
code: '/* some comment */',
},
{
code: '/**/',
},
{
code: '.without-comment {}',
},
]
});

testRule({
ruleName,
config: [/foo-.+/],
syntax: 'scss',

accept: [
{
code: 'a {} // foo-ok',
description: 'ignored inline scss comments',
},
{
code: '// foo-ok',
description: 'ignored inline scss comments',
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved
},
{
code: '.without-comment { }',
description: 'ignores scss without comments',
},
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved
],

reject: [
{
code: 'a {} // not-foo',
description: 'checks inline scss comments',
message: messages.expected,
},
]
});
47 changes: 47 additions & 0 deletions lib/rules/comment-pattern/index.js
@@ -0,0 +1,47 @@
// @ts-nocheck

'use strict';

const _ = require('lodash');
const report = require('../../utils/report');
const ruleMessages = require('../../utils/ruleMessages');
const validateOptions = require('../../utils/validateOptions');

const ruleName = 'comment-pattern';

const messages = ruleMessages(ruleName, {
expected: 'Expected comment to match specified pattern',
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved
});

function rule(pattern) {
return (root, result) => {
const validOptions = validateOptions(result, ruleName, {
actual: pattern,
possible: [_.isRegExp],
});

if (!validOptions) {
return;
}
hudochenkov marked this conversation as resolved.
Show resolved Hide resolved

root.walkComments((comment) => {
const text = comment.text;


if (pattern.test(text)) {
return;
}

report({
message: messages.expected,
node: comment,
result,
ruleName,
});
});
};
}

rule.ruleName = ruleName;
rule.messages = messages;
module.exports = rule;
1 change: 1 addition & 0 deletions lib/rules/index.js
Expand Up @@ -61,6 +61,7 @@ const rules = {
'color-no-invalid-hex': importLazy(() => require('./color-no-invalid-hex'))(),
'comment-empty-line-before': importLazy(() => require('./comment-empty-line-before'))(),
'comment-no-empty': importLazy(() => require('./comment-no-empty'))(),
'comment-pattern': importLazy(() => require('./comment-pattern'))(),
'comment-whitespace-inside': importLazy(() => require('./comment-whitespace-inside'))(),
'comment-word-blacklist': importLazy(() => require('./comment-word-blacklist'))(),
'comment-word-disallowed-list': importLazy(() => require('./comment-word-disallowed-list'))(),
Expand Down