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 new rule: no-restricted-html-elements #1820

Merged
merged 21 commits into from Mar 23, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
555b64b
Add new rule: html-forbid-elements
doug-wade Mar 18, 2022
994bbe9
PR Feedback
doug-wade Mar 20, 2022
40c20cd
Update lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
2f837ba
Update docs/rules/no-restricted-html-elements.md
doug-wade Mar 23, 2022
d32eac1
Update lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
59d1c5d
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
409f48a
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
b7ca92b
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
4a62c15
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
51c0f9b
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
28b7883
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
6800118
Update docs/rules/no-restricted-html-elements.md
doug-wade Mar 23, 2022
0202bce
Update tests/lib/rules/no-restricted-html-elements.js
doug-wade Mar 23, 2022
d87c63b
Update docs/rules/no-restricted-html-elements.md
doug-wade Mar 23, 2022
55fd543
Update docs/rules/no-restricted-html-elements.md
doug-wade Mar 23, 2022
b989b15
Update docs/rules/no-restricted-html-elements.md
doug-wade Mar 23, 2022
3812f9f
run npm update
doug-wade Mar 23, 2022
07cc3a8
Remove messages block
doug-wade Mar 23, 2022
33a4d90
Update docs/rules/no-restricted-html-elements.md
ota-meshi Mar 23, 2022
cdb4636
Update docs/rules/no-restricted-html-elements.md
ota-meshi Mar 23, 2022
daa01ec
Fix demo site
ota-meshi Mar 23, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
49 changes: 49 additions & 0 deletions docs/rules/html-forbid-elements.md
@@ -0,0 +1,49 @@
---
pageClass: rule-details
sidebarDepth: 0
title: vue/html-forbid-elements
description: prevent use of forbidden html elements
since: v8.6.0
doug-wade marked this conversation as resolved.
Show resolved Hide resolved
---

# vue/html-forbid-elements

> prevent use of forbidden html elements

## :book: Rule Details

This rule aims to disallow html elements that have been forbidden.

<eslint-code-block fix :rules="{'vue/html-forbid-elements': ['error', { forbid: ['div', 'button'] } ] }">
doug-wade marked this conversation as resolved.
Show resolved Hide resolved

```vue
<template>
<!-- ✓ GOOD -->
<p></p>
<input />
<br />

<!-- ✗ BAD -->
<button></button>
<div></div>
</template>
```

</eslint-code-block>

## :wrench: Options

```json
{
"vue/html-forbid-elements": ["error", { "forbid": ["button"] }]
}
```

doug-wade marked this conversation as resolved.
Show resolved Hide resolved
## :rocket: Version

This rule was introduced in eslint-plugin-vue v8.6.0

## :mag: Implementation

- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/html-forbid-elements.js)
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/html-forbid-elements.js)
1 change: 1 addition & 0 deletions lib/index.js
Expand Up @@ -40,6 +40,7 @@ module.exports = {
'html-comment-content-spacing': require('./rules/html-comment-content-spacing'),
'html-comment-indent': require('./rules/html-comment-indent'),
'html-end-tags': require('./rules/html-end-tags'),
'html-forbid-elements': require('./rules/html-forbid-elements'),
'html-indent': require('./rules/html-indent'),
'html-quotes': require('./rules/html-quotes'),
'html-self-closing': require('./rules/html-self-closing'),
Expand Down
66 changes: 66 additions & 0 deletions lib/rules/html-forbid-elements.js
@@ -0,0 +1,66 @@
/**
* @author Doug Wade <douglas.b.wade@gmail.com>
*/

'use strict'

const utils = require('../utils')

module.exports = {
meta: {
type: 'suggestion',
docs: {
description: 'prevent usage of forbidden html elements',
categories: undefined,
url: 'https://eslint.vuejs.org/rules/html-forbid-elements.html'
},
fixable: null,
schema: [
{
type: 'object',
additionalProperties: false,
properties: {
forbid: {
type: 'array',
uniqueItems: true,
minItems: 1,
items: {
type: 'string'
}
}
},
required: ['forbid']
}
],
messages: {
unexpectedUseOfForbiddenElement:
'Unexpected use of forbidden HTML element {{ actual }}.'
}
},
/**
* @param {RuleContext} context - The rule context.
* @returns {RuleListener} AST event handlers.
*/
create(context) {
const option = context.options[0]

return utils.defineTemplateBodyVisitor(context, {
/**
* @param {VElement} node
*/
VElement(node) {
if (!utils.isHtmlElementNode(node)) {
return
}

if (option.forbid.includes(node.name)) {
context.report({
messageId: 'unexpectedUseOfForbiddenElement',
node: node.startTag,
data: { actual: node.name }
})
}
}
})
}
}
41 changes: 41 additions & 0 deletions tests/lib/rules/html-forbid-elements.js
@@ -0,0 +1,41 @@
/**
* @author Doug Wade
*/
'use strict'

const RuleTester = require('eslint').RuleTester
const rule = require('../../../lib/rules/html-forbid-elements')

const tester = new RuleTester({
parser: require.resolve('vue-eslint-parser'),
parserOptions: { ecmaVersion: 2015 }
})

tester.run('html-forbid-elements', rule, {
valid: [
{
filename: 'test.vue',
code: '',
options: [{ forbid: ['button'] }]
},
{
filename: 'test.vue',
code: '<template><div class="foo"></div></template>',
options: [{ forbid: ['button'] }]
}
],
invalid: [
{
filename: 'test.vue',
code: '<template><button type="submit"></button></template>',
errors: ['Unexpected use of forbidden HTML element button.'],
options: [{ forbid: ['button'] }]
},
{
filename: 'test.vue',
code: "<template><div class='foo'></div></template>",
errors: ['Unexpected use of forbidden HTML element div.'],
doug-wade marked this conversation as resolved.
Show resolved Hide resolved
options: [{ forbid: ['div'] }]
}
]
})