From a39a460109bb6f431445ba5a436555f6b08d87a9 Mon Sep 17 00:00:00 2001 From: Armano Date: Mon, 14 Aug 2017 13:35:30 +0200 Subject: [PATCH] Rename rule `no-reservered-keys` to `no-reserved-keys`. fixes #155 --- docs/rules/no-reserved-keys.md | 58 ++++++++++++++++ lib/rules/no-reserved-keys.js | 74 ++++++++++++++++++++ lib/rules/no-reservered-keys.js | 6 +- tests/lib/rules/no-reserved-keys.js | 100 ++++++++++++++++++++++++++++ 4 files changed, 236 insertions(+), 2 deletions(-) create mode 100644 docs/rules/no-reserved-keys.md create mode 100644 lib/rules/no-reserved-keys.js create mode 100644 tests/lib/rules/no-reserved-keys.js diff --git a/docs/rules/no-reserved-keys.md b/docs/rules/no-reserved-keys.md new file mode 100644 index 000000000..baf54a6a4 --- /dev/null +++ b/docs/rules/no-reserved-keys.md @@ -0,0 +1,58 @@ +# Prevent overwrite reserved keys (no-reserved-keys) + +This rule prevents to use reserved names from to avoid conflicts and unexpected behavior. + +## Rule Details + +:-1: Examples of **incorrect** code for this rule: + +```js +export default { + props: { + $el: String + }, + computed: { + $on: { + get () { + } + } + }, + data: { + _foo: null + }, + methods: { + $nextTick () { + } + } +} +``` + +## :wrench: Options + +This rule has an object option: + +`"reserved"`: [] (default) array of dissalowed names inside `groups`. + +`"groups"`: [] (default) array of additional groups to search for duplicates. + +### Example: + +``` +vue/no-reserved-keys: [2, { + reserved: ['foo', 'foo2'], + groups: ['asyncComputed'] +}] +``` + +:-1: Examples of **incorrect** code for this configuration + +```js +export default { + asyncComputed: { + foo2 () {} + }, + computed: { + foo () {} + } +} +``` diff --git a/lib/rules/no-reserved-keys.js b/lib/rules/no-reserved-keys.js new file mode 100644 index 000000000..bc4a89004 --- /dev/null +++ b/lib/rules/no-reserved-keys.js @@ -0,0 +1,74 @@ +/** + * @fileoverview Prevent overwrite reserved keys + * @author Armano + */ +'use strict' + +const utils = require('../utils') + +// ------------------------------------------------------------------------------ +// Rule Definition +// ------------------------------------------------------------------------------ + +const RESERVED_KEYS = require('../utils/vue-reserved.json') +const GROUP_NAMES = ['props', 'computed', 'data', 'methods'] + +function create (context) { + const options = context.options[0] || {} + const reservedKeys = new Set(RESERVED_KEYS.concat(options.reserved || [])) + const groups = new Set(GROUP_NAMES.concat(options.groups || [])) + + // ---------------------------------------------------------------------- + // Public + // ---------------------------------------------------------------------- + + return utils.executeOnVue(context, (obj) => { + const properties = utils.iterateProperties(obj, groups) + for (const o of properties) { + if (o.groupName === 'data' && o.name[0] === '_') { + context.report({ + node: o.node, + message: "Keys starting with with '_' are reserved in '{{name}}' group.", + data: { + name: o.name + } + }) + } else if (reservedKeys.has(o.name)) { + context.report({ + node: o.node, + message: "Key '{{name}}' is reserved.", + data: { + name: o.name + } + }) + } + } + }) +} + +module.exports = { + meta: { + docs: { + description: 'Prevent overwrite reserved keys.', + category: 'Possible Errors', + recommended: false + }, + fixable: null, + schema: [ + { + type: 'object', + properties: { + reserved: { + type: 'array' + }, + groups: { + type: 'array' + } + }, + additionalProperties: false + } + ] + }, + + create +} diff --git a/lib/rules/no-reservered-keys.js b/lib/rules/no-reservered-keys.js index c0ba613f2..e31fe710d 100644 --- a/lib/rules/no-reservered-keys.js +++ b/lib/rules/no-reservered-keys.js @@ -51,9 +51,11 @@ module.exports = { docs: { description: 'Prevent overwrite reserved keys.', category: 'Possible Errors', - recommended: false + recommended: false, + replacedBy: ['no-reserved-keys'] }, - fixable: null, // or "code" or "whitespace" + deprecated: true, + fixable: null, schema: [ { type: 'object', diff --git a/tests/lib/rules/no-reserved-keys.js b/tests/lib/rules/no-reserved-keys.js new file mode 100644 index 000000000..cc116f1dc --- /dev/null +++ b/tests/lib/rules/no-reserved-keys.js @@ -0,0 +1,100 @@ +/** + * @fileoverview Prevent overwrite reserved keys + * @author Armano + */ +'use strict' + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +const rule = require('../../../lib/rules/no-reserved-keys') +const RuleTester = require('eslint').RuleTester + +const parserOptions = { + ecmaVersion: 7, + sourceType: 'module', + ecmaFeatures: { experimentalObjectRestSpread: true } +} + +// ------------------------------------------------------------------------------ +// Tests +// ------------------------------------------------------------------------------ + +const ruleTester = new RuleTester() +ruleTester.run('no-reserved-keys', rule, { + valid: [ + { + filename: 'test.vue', + code: ` + export default { + props: ['foo'], + computed: { + bar () { + } + }, + data () { + return { + dat: null + } + }, + methods: { + _foo () {}, + test () { + } + } + } + `, + parserOptions + } + ], + + invalid: [ + { + filename: 'test.js', + code: ` + new Vue({ + props: { + $el: String + } + }) + `, + parserOptions: { ecmaVersion: 6 }, + errors: [{ + message: "Key '$el' is reserved.", + line: 4 + }] + }, + { + filename: 'test.js', + code: ` + new Vue({ + data: { + _foo: String + } + }) + `, + parserOptions: { ecmaVersion: 6 }, + errors: [{ + message: "Keys starting with with '_' are reserved in '_foo' group.", + line: 4 + }] + }, + { + filename: 'test.js', + code: ` + new Vue({ + foo: { + bar: String + } + }) + `, + options: [{ reserved: ['bar'], groups: ['foo'] }], + parserOptions: { ecmaVersion: 6 }, + errors: [{ + message: "Key 'bar' is reserved.", + line: 4 + }] + } + ] +})