no-reserved-keys.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. messages: {
  40. reserved: "Key '{{name}}' is reserved.",
  41. startsWithUnderscore:
  42. "Keys starting with '_' are reserved in '{{name}}' group."
  43. }
  44. },
  45. /** @param {RuleContext} context */
  46. create(context) {
  47. const options = context.options[0] || {}
  48. const reservedKeys = new Set(RESERVED_KEYS.concat(options.reserved || []))
  49. const groups = new Set(GROUP_NAMES.concat(options.groups || []))
  50. // ----------------------------------------------------------------------
  51. // Public
  52. // ----------------------------------------------------------------------
  53. return utils.compositingVisitors(
  54. utils.defineScriptSetupVisitor(context, {
  55. onDefinePropsEnter(_node, props) {
  56. for (const { propName, node } of props) {
  57. if (propName && reservedKeys.has(propName)) {
  58. context.report({
  59. node,
  60. messageId: 'reserved',
  61. data: {
  62. name: propName
  63. }
  64. })
  65. }
  66. }
  67. }
  68. }),
  69. utils.executeOnVue(context, (obj) => {
  70. const properties = utils.iterateProperties(obj, groups)
  71. for (const o of properties) {
  72. if (o.groupName === 'data' && o.name[0] === '_') {
  73. context.report({
  74. node: o.node,
  75. messageId: 'startsWithUnderscore',
  76. data: {
  77. name: o.name
  78. }
  79. })
  80. } else if (reservedKeys.has(o.name)) {
  81. context.report({
  82. node: o.node,
  83. messageId: 'reserved',
  84. data: {
  85. name: o.name
  86. }
  87. })
  88. }
  89. }
  90. })
  91. )
  92. }
  93. }