no-reserved-keys.js 2.1 KB

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