prop-name-casing.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * @fileoverview Requires specific casing for the Prop name in Vue components
  3. * @author Yu Kimura
  4. */
  5. 'use strict'
  6. const utils = require('../utils')
  7. const casing = require('../utils/casing')
  8. const allowedCaseOptions = ['camelCase', 'snake_case']
  9. // ------------------------------------------------------------------------------
  10. // Rule Definition
  11. // ------------------------------------------------------------------------------
  12. /** @param {RuleContext} context */
  13. function create(context) {
  14. const options = context.options[0]
  15. const caseType =
  16. allowedCaseOptions.indexOf(options) !== -1 ? options : 'camelCase'
  17. const checker = casing.getChecker(caseType)
  18. // ----------------------------------------------------------------------
  19. // Public
  20. // ----------------------------------------------------------------------
  21. return utils.executeOnVue(context, (obj) => {
  22. for (const item of utils.getComponentProps(obj)) {
  23. const propName = item.propName
  24. if (propName == null) {
  25. continue
  26. }
  27. if (!checker(propName)) {
  28. context.report({
  29. node: item.node,
  30. message: 'Prop "{{name}}" is not in {{caseType}}.',
  31. data: {
  32. name: propName,
  33. caseType
  34. }
  35. })
  36. }
  37. }
  38. })
  39. }
  40. // ------------------------------------------------------------------------------
  41. // Rule Definition
  42. // ------------------------------------------------------------------------------
  43. module.exports = {
  44. meta: {
  45. type: 'suggestion',
  46. docs: {
  47. description:
  48. 'enforce specific casing for the Prop name in Vue components',
  49. categories: ['vue3-strongly-recommended', 'strongly-recommended'],
  50. url: 'https://eslint.vuejs.org/rules/prop-name-casing.html'
  51. },
  52. fixable: null, // null or "code" or "whitespace"
  53. schema: [
  54. {
  55. enum: allowedCaseOptions
  56. }
  57. ]
  58. },
  59. create
  60. }