sorted-keys-in-locales.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Enforce alphabetically sorted top-level keys in JSON files.
  2. module.exports = {
  3. meta: {
  4. type: 'problem',
  5. fixable: 'code',
  6. docs: {
  7. description:
  8. 'Require top-level keys to be sorted alphabetically in JSON files (typically locale files).',
  9. },
  10. schema: [],
  11. messages: {
  12. unsorted:
  13. 'Top-level keys are not sorted alphabetically. Key "{{key}}" should come before "{{predecessor}}".',
  14. },
  15. },
  16. create(context) {
  17. return {
  18. 'Document > Object'(node) {
  19. const members = node.members
  20. for (let i = 1; i < members.length; i++) {
  21. const prev = members[i - 1].name.value
  22. const curr = members[i].name.value
  23. if (curr < prev) {
  24. const text = context.sourceCode.text
  25. const parsed = JSON.parse(text)
  26. const sortedKeys = Object.keys(parsed).sort()
  27. const sorted = JSON.stringify(parsed, sortedKeys, 2) + '\n'
  28. context.report({
  29. node: members[i],
  30. messageId: 'unsorted',
  31. data: { key: curr, predecessor: prev },
  32. fix(fixer) {
  33. return fixer.replaceTextRange([0, text.length], sorted)
  34. },
  35. })
  36. return // one violation per file is enough; the fix re-sorts everything
  37. }
  38. }
  39. },
  40. }
  41. },
  42. }