Skip to content

Commit

Permalink
Update vue/no-unsupported-features rule to support <script setup> (
Browse files Browse the repository at this point in the history
  • Loading branch information
ota-meshi committed Jul 6, 2021
1 parent 6fdb024 commit d47de39
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 0 deletions.
3 changes: 3 additions & 0 deletions docs/rules/no-unsupported-features.md
Expand Up @@ -32,6 +32,7 @@ The `"ignores"` option accepts an array of the following strings.
- Vue.js 3.1.0+
- `"is-attribute-with-vue-prefix"` ... [`is` attribute with `vue:` prefix](https://v3.vuejs.org/api/special-attributes.html#is)
- Vue.js 3.0.0+
- `"script-setup"` ... [`<script setup>`][Vue RFCs - 0040-script-setup]
- `"v-model-argument"` ... [argument on `v-model`][Vue RFCs - 0005-replace-v-bind-sync-with-v-model-argument]
- `"v-model-custom-modifiers"` ... [custom modifiers on `v-model`][Vue RFCs - 0011-v-model-api-change]
- `"v-is"` ... [v-is](https://v3.vuejs.org/api/directives.html#v-is) directive.
Expand Down Expand Up @@ -105,13 +106,15 @@ The `"ignores"` option accepts an array of the following strings.
- [Vue RFCs - 0003-dynamic-directive-arguments]
- [Vue RFCs - 0005-replace-v-bind-sync-with-v-model-argument]
- [Vue RFCs - 0011-v-model-api-change]
- [Vue RFCs - 0040-script-setup]
- [Vue RFCs - v-bind .prop shorthand proposal]

[Vue RFCs - 0001-new-slot-syntax]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0001-new-slot-syntax.md
[Vue RFCs - 0002-slot-syntax-shorthand]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0002-slot-syntax-shorthand.md
[Vue RFCs - 0003-dynamic-directive-arguments]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0003-dynamic-directive-arguments.md
[Vue RFCs - 0005-replace-v-bind-sync-with-v-model-argument]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0005-replace-v-bind-sync-with-v-model-argument.md
[Vue RFCs - 0011-v-model-api-change]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0011-v-model-api-change.md
[Vue RFCs - 0040-script-setup]: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0040-script-setup.md

[Vue RFCs - v-bind .prop shorthand proposal]: https://github.com/vuejs/rfcs/pull/18

Expand Down
4 changes: 4 additions & 0 deletions lib/rules/no-unsupported-features.js
Expand Up @@ -26,6 +26,7 @@ const FEATURES = {
'v-model-argument': require('./syntaxes/v-model-argument'),
'v-model-custom-modifiers': require('./syntaxes/v-model-custom-modifiers'),
'v-is': require('./syntaxes/v-is'),
'script-setup': require('./syntaxes/script-setup'),
// Vue.js 3.1.0+
'is-attribute-with-vue-prefix': require('./syntaxes/is-attribute-with-vue-prefix')
}
Expand Down Expand Up @@ -100,6 +101,9 @@ module.exports = {
forbiddenVModelCustomModifiers:
'Custom modifiers on `v-model` are not supported until Vue.js "3.0.0".',
forbiddenVIs: '`v-is` are not supported until Vue.js "3.0.0".',
forbiddenScriptSetup:
'`<script setup>` are not supported until Vue.js "3.0.0".',
// Vue.js 3.1.0+
forbiddenIsAttributeWithVuePrefix:
'`is="vue:"` are not supported until Vue.js "3.1.0".'
}
Expand Down
28 changes: 28 additions & 0 deletions lib/rules/syntaxes/script-setup.js
@@ -0,0 +1,28 @@
/**
* @author Yosuke Ota
* See LICENSE file in root directory for full license.
*/
'use strict'

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

module.exports = {
supported: '>=3.0.0',
/** @param {RuleContext} context @returns {TemplateListener} */
createScriptVisitor(context) {
const scriptSetup = utils.getScriptSetupElement(context)
if (!scriptSetup) {
return {}
}
const reportNode =
utils.getAttribute(scriptSetup, 'setup') || scriptSetup.startTag
return {
Program() {
context.report({
node: reportNode,
messageId: 'forbiddenScriptSetup'
})
}
}
}
}
48 changes: 48 additions & 0 deletions tests/lib/rules/no-unsupported-features/script-setup.js
@@ -0,0 +1,48 @@
/**
* @author Yosuke Ota
* See LICENSE file in root directory for full license.
*/
'use strict'

const RuleTester = require('eslint').RuleTester
const rule = require('../../../../lib/rules/no-unsupported-features')
const utils = require('./utils')

const buildOptions = utils.optionsBuilder('script-setup', '^3.0.0')
const tester = new RuleTester({
parser: require.resolve('vue-eslint-parser'),
parserOptions: {
ecmaVersion: 2019
}
})

tester.run('no-unsupported-features/script-setup', rule, {
valid: [
{
code: `
<script setup>
</script>`,
options: buildOptions()
},
{
code: `
<script>
</script>`,
options: buildOptions({ version: '^2.6.0' })
}
],
invalid: [
{
code: `
<script setup>
</script>`,
options: buildOptions({ version: '^2.6.0' }),
errors: [
{
message: '`<script setup>` are not supported until Vue.js "3.0.0".',
line: 2
}
]
}
]
})

0 comments on commit d47de39

Please sign in to comment.