no-reserved-keys.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /**
  2. * @fileoverview Prevent overwrite reserved keys
  3. * @author Armano
  4. */
  5. 'use strict'
  6. const utils = require('../utils')
  7. // ------------------------------------------------------------------------------
  8. // Rule Definition
  9. // ------------------------------------------------------------------------------
  10. const RESERVED_KEYS = require('../utils/vue-reserved.json')
  11. const GROUP_NAMES = ['props', 'computed', 'data', 'methods']
  12. module.exports = {
  13. meta: {
  14. docs: {
  15. description: 'disallow overwriting reserved keys',
  16. category: 'essential',
  17. url: 'https://github.com/vuejs/eslint-plugin-vue/blob/v4.7.1/docs/rules/no-reserved-keys.md'
  18. },
  19. fixable: null,
  20. schema: [
  21. {
  22. type: 'object',
  23. properties: {
  24. reserved: {
  25. type: 'array'
  26. },
  27. groups: {
  28. type: 'array'
  29. }
  30. },
  31. additionalProperties: false
  32. }
  33. ]
  34. },
  35. create (context) {
  36. const options = context.options[0] || {}
  37. const reservedKeys = new Set(RESERVED_KEYS.concat(options.reserved || []))
  38. const groups = new Set(GROUP_NAMES.concat(options.groups || []))
  39. // ----------------------------------------------------------------------
  40. // Public
  41. // ----------------------------------------------------------------------
  42. return utils.executeOnVue(context, (obj) => {
  43. const properties = utils.iterateProperties(obj, groups)
  44. for (const o of properties) {
  45. if (o.groupName === 'data' && o.name[0] === '_') {
  46. context.report({
  47. node: o.node,
  48. message: "Keys starting with with '_' are reserved in '{{name}}' group.",
  49. data: {
  50. name: o.name
  51. }
  52. })
  53. } else if (reservedKeys.has(o.name)) {
  54. context.report({
  55. node: o.node,
  56. message: "Key '{{name}}' is reserved.",
  57. data: {
  58. name: o.name
  59. }
  60. })
  61. }
  62. }
  63. })
  64. }
  65. }