@alexlit/lint-kit 167.3.0 → 167.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/package.json +1 -1
  2. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/LICENSE +21 -0
  3. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/README.md +54 -0
  4. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/base.d.ts +23 -0
  5. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/base.js +25 -0
  6. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/flat/base.d.ts +35 -0
  7. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/flat/base.js +35 -0
  8. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/flat/recommended.d.ts +1194 -0
  9. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/flat/recommended.js +39 -0
  10. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/recommended.d.ts +29 -0
  11. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/configs/recommended.js +29 -0
  12. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/index.d.ts +2532 -0
  13. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/index.js +62 -0
  14. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/key-format-style.d.ts +2 -0
  15. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/key-format-style.js +247 -0
  16. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-i18n-component.d.ts +2 -0
  17. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-i18n-component.js +85 -0
  18. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-i18n-place-attr.d.ts +2 -0
  19. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-i18n-place-attr.js +41 -0
  20. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-i18n-places-prop.d.ts +2 -0
  21. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-i18n-places-prop.js +36 -0
  22. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-modulo-syntax.d.ts +2 -0
  23. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-modulo-syntax.js +94 -0
  24. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-tc.d.ts +2 -0
  25. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-tc.js +42 -0
  26. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-v-t.d.ts +2 -0
  27. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-deprecated-v-t.js +33 -0
  28. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-duplicate-keys-in-locale.d.ts +2 -0
  29. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-duplicate-keys-in-locale.js +271 -0
  30. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-dynamic-keys.d.ts +2 -0
  31. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-dynamic-keys.js +105 -0
  32. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-html-messages.d.ts +2 -0
  33. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-html-messages.js +137 -0
  34. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-i18n-t-path-prop.d.ts +2 -0
  35. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-i18n-t-path-prop.js +44 -0
  36. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-missing-keys-in-other-locales.d.ts +2 -0
  37. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-missing-keys-in-other-locales.js +264 -0
  38. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-missing-keys.d.ts +2 -0
  39. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-missing-keys.js +111 -0
  40. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-raw-text.d.ts +2 -0
  41. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-raw-text.js +575 -0
  42. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-unknown-locale.d.ts +2 -0
  43. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-unknown-locale.js +198 -0
  44. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-unused-keys.d.ts +2 -0
  45. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-unused-keys.js +456 -0
  46. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-v-html.d.ts +2 -0
  47. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/no-v-html.js +50 -0
  48. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/prefer-linked-key-with-paren.d.ts +2 -0
  49. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/prefer-linked-key-with-paren.js +108 -0
  50. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/prefer-sfc-lang-attr.d.ts +2 -0
  51. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/prefer-sfc-lang-attr.js +58 -0
  52. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/sfc-locale-attr.d.ts +2 -0
  53. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/sfc-locale-attr.js +65 -0
  54. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/valid-message-syntax.d.ts +2 -0
  55. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/rules/valid-message-syntax.js +186 -0
  56. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/eslint.d.ts +216 -0
  57. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/eslint.js +2 -0
  58. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/i18n.d.ts +5 -0
  59. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/i18n.js +2 -0
  60. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/index.d.ts +6 -0
  61. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/index.js +22 -0
  62. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/nodes.d.ts +7 -0
  63. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/nodes.js +2 -0
  64. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/settings.d.ts +8 -0
  65. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/settings.js +2 -0
  66. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/types.d.ts +38 -0
  67. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/types.js +2 -0
  68. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/vue-parser-services.d.ts +32 -0
  69. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/types/vue-parser-services.js +2 -0
  70. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/cache-function.d.ts +2 -0
  71. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/cache-function.js +11 -0
  72. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/cache-loader.d.ts +10 -0
  73. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/cache-loader.js +27 -0
  74. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/casing.d.ts +10 -0
  75. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/casing.js +101 -0
  76. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/collect-keys.d.ts +13 -0
  77. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/collect-keys.js +160 -0
  78. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/collect-linked-keys.d.ts +2 -0
  79. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/collect-linked-keys.js +49 -0
  80. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/compat.d.ts +3 -0
  81. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/compat.js +35 -0
  82. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/default-timeouts.d.ts +6 -0
  83. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/default-timeouts.js +10 -0
  84. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/get-cwd.d.ts +2 -0
  85. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/get-cwd.js +9 -0
  86. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/glob-utils.d.ts +15 -0
  87. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/glob-utils.js +154 -0
  88. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/ignored-paths.d.ts +43 -0
  89. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/ignored-paths.js +234 -0
  90. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/index.d.ts +25 -0
  91. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/index.js +446 -0
  92. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/key-path.d.ts +2 -0
  93. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/key-path.js +27 -0
  94. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/locale-messages.d.ts +54 -0
  95. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/locale-messages.js +187 -0
  96. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/parser-v9.d.ts +8 -0
  97. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/parser-v9.js +40 -0
  98. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/parser.d.ts +5 -0
  99. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/parser.js +18 -0
  100. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/traverser.d.ts +6 -0
  101. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/traverser.js +31 -0
  102. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/utils.d.ts +28 -0
  103. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/message-compiler/utils.js +279 -0
  104. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/build-parser-using-flat-config.d.ts +2 -0
  105. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/build-parser-using-flat-config.js +11 -0
  106. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/build-parser-using-legacy-config.d.ts +2 -0
  107. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/build-parser-using-legacy-config.js +46 -0
  108. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/index.d.ts +4 -0
  109. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/index.js +18 -0
  110. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/parse-by-parser.d.ts +3 -0
  111. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/parse-by-parser.js +42 -0
  112. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/should-use-flat-config.d.ts +2 -0
  113. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/should-use-flat-config.js +54 -0
  114. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/worker.d.ts +1 -0
  115. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parser-config-resolver/worker.js +32 -0
  116. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parsers/index.d.ts +4 -0
  117. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/parsers/index.js +32 -0
  118. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/path-utils.d.ts +2 -0
  119. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/path-utils.js +21 -0
  120. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/regexp.d.ts +1 -0
  121. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/regexp.js +16 -0
  122. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/resource-loader.d.ts +10 -0
  123. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/resource-loader.js +32 -0
  124. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/rule.d.ts +9 -0
  125. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/dist/utils/rule.js +75 -0
  126. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/globals/globals.json +3345 -0
  127. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/globals/index.d.ts +3452 -0
  128. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/globals/index.js +2 -0
  129. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/globals/license +9 -0
  130. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/globals/package.json +117 -0
  131. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/node_modules/globals/readme.md +42 -0
  132. package/packages/config-eslint/node_modules/@intlify/eslint-plugin-vue-i18n/package.json +147 -0
  133. package/packages/config-eslint/node_modules/vue-eslint-parser/LICENSE +21 -0
  134. package/packages/config-eslint/node_modules/vue-eslint-parser/README.md +332 -0
  135. package/packages/config-eslint/node_modules/vue-eslint-parser/index.d.ts +667 -0
  136. package/packages/config-eslint/node_modules/vue-eslint-parser/index.js +6642 -0
  137. package/packages/config-eslint/node_modules/vue-eslint-parser/index.js.map +1 -0
  138. package/packages/config-eslint/node_modules/vue-eslint-parser/package.json +100 -0
  139. package/packages/config-eslint/package.json +5 -5
  140. package/packages/config-eslint/plugins/unicorn.js +2 -0
  141. package/packages/config-prettier/package.json +2 -2
  142. package/packages/config-stylelint/package.json +2 -2
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const path_1 = require("path");
6
+ const is_language_code_1 = require("is-language-code");
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const rule_1 = require("../utils/rule");
9
+ const index_1 = require("../utils/index");
10
+ const compat_1 = require("../utils/compat");
11
+ const debug = (0, debug_1.default)('eslint-plugin-vue-i18n:no-unknown-locale');
12
+ function create(context) {
13
+ var _a, _b;
14
+ const filename = (0, compat_1.getFilename)(context);
15
+ const sourceCode = (0, compat_1.getSourceCode)(context);
16
+ const locales = ((_a = context.options[0]) === null || _a === void 0 ? void 0 : _a.locales) || [];
17
+ const disableRFC5646 = ((_b = context.options[0]) === null || _b === void 0 ? void 0 : _b.disableRFC5646) || false;
18
+ function verifyLocaleCode(locale, reportNode) {
19
+ if (locales.includes(locale)) {
20
+ return;
21
+ }
22
+ if (!disableRFC5646 && (0, is_language_code_1.isLangCode)(locale).res) {
23
+ return;
24
+ }
25
+ context.report({
26
+ message: "'{{locale}}' is unknown locale name",
27
+ data: {
28
+ locale
29
+ },
30
+ loc: (reportNode === null || reportNode === void 0 ? void 0 : reportNode.loc) || { line: 1, column: 0 }
31
+ });
32
+ }
33
+ function createVerifyContext(targetLocaleMessage, block) {
34
+ let keyStack;
35
+ if (targetLocaleMessage.isResolvedLocaleByFileName()) {
36
+ const locale = targetLocaleMessage.locales[0];
37
+ keyStack = {
38
+ locale
39
+ };
40
+ verifyLocaleCode(locale, block && (0, index_1.getAttribute)(block, 'locale'));
41
+ }
42
+ else {
43
+ keyStack = {
44
+ locale: null
45
+ };
46
+ }
47
+ return {
48
+ enterKey(key, node) {
49
+ if (keyStack.locale == null) {
50
+ const locale = String(key);
51
+ keyStack = {
52
+ node,
53
+ locale,
54
+ upper: keyStack
55
+ };
56
+ verifyLocaleCode(locale, node);
57
+ }
58
+ else {
59
+ keyStack = {
60
+ node,
61
+ locale: keyStack.locale,
62
+ upper: keyStack
63
+ };
64
+ }
65
+ },
66
+ leaveKey(node) {
67
+ if (keyStack.node === node) {
68
+ keyStack = keyStack.upper;
69
+ }
70
+ }
71
+ };
72
+ }
73
+ function createVisitorForJson(targetLocaleMessage, block) {
74
+ const ctx = createVerifyContext(targetLocaleMessage, block);
75
+ return {
76
+ JSONProperty(node) {
77
+ const key = node.key.type === 'JSONLiteral' ? `${node.key.value}` : node.key.name;
78
+ ctx.enterKey(key, node.key);
79
+ },
80
+ 'JSONProperty:exit'(node) {
81
+ ctx.leaveKey(node.key);
82
+ },
83
+ 'JSONArrayExpression > *'(node) {
84
+ const key = node.parent.elements.indexOf(node);
85
+ ctx.enterKey(key, node);
86
+ },
87
+ 'JSONArrayExpression > *:exit'(node) {
88
+ ctx.leaveKey(node);
89
+ }
90
+ };
91
+ }
92
+ function createVisitorForYaml(targetLocaleMessage, block) {
93
+ const yamlKeyNodes = new Set();
94
+ function withinKey(node) {
95
+ for (const keyNode of yamlKeyNodes) {
96
+ if (keyNode.range[0] <= node.range[0] &&
97
+ node.range[0] < keyNode.range[1]) {
98
+ return true;
99
+ }
100
+ }
101
+ return false;
102
+ }
103
+ const ctx = createVerifyContext(targetLocaleMessage, block);
104
+ return {
105
+ YAMLPair(node) {
106
+ if (node.key != null) {
107
+ if (withinKey(node)) {
108
+ return;
109
+ }
110
+ yamlKeyNodes.add(node.key);
111
+ }
112
+ if (node.key != null && node.key.type === 'YAMLScalar') {
113
+ const keyValue = node.key.value;
114
+ const key = typeof keyValue === 'string' ? keyValue : String(keyValue);
115
+ ctx.enterKey(key, node.key);
116
+ }
117
+ },
118
+ 'YAMLPair:exit'(node) {
119
+ if (node.key != null) {
120
+ ctx.leaveKey(node.key);
121
+ }
122
+ },
123
+ 'YAMLSequence > *'(node) {
124
+ if (withinKey(node)) {
125
+ return;
126
+ }
127
+ const key = node.parent.entries.indexOf(node);
128
+ ctx.enterKey(key, node);
129
+ },
130
+ 'YAMLSequence > *:exit'(node) {
131
+ ctx.leaveKey(node);
132
+ }
133
+ };
134
+ }
135
+ if ((0, path_1.extname)(filename) === '.vue') {
136
+ return (0, index_1.defineCustomBlocksVisitor)(context, ctx => {
137
+ const localeMessages = (0, index_1.getLocaleMessages)(context);
138
+ const targetLocaleMessage = localeMessages.findBlockLocaleMessage(ctx.parserServices.customBlock);
139
+ if (!targetLocaleMessage) {
140
+ return {};
141
+ }
142
+ return createVisitorForJson(targetLocaleMessage, ctx.parserServices.customBlock);
143
+ }, ctx => {
144
+ const localeMessages = (0, index_1.getLocaleMessages)(context);
145
+ const targetLocaleMessage = localeMessages.findBlockLocaleMessage(ctx.parserServices.customBlock);
146
+ if (!targetLocaleMessage) {
147
+ return {};
148
+ }
149
+ return createVisitorForYaml(targetLocaleMessage, ctx.parserServices.customBlock);
150
+ });
151
+ }
152
+ else if (sourceCode.parserServices.isJSON ||
153
+ sourceCode.parserServices.isYAML) {
154
+ const localeMessages = (0, index_1.getLocaleMessages)(context);
155
+ const targetLocaleMessage = localeMessages.findExistLocaleMessage(filename);
156
+ if (!targetLocaleMessage) {
157
+ debug(`ignore ${filename} in no-unknown-locale`);
158
+ return {};
159
+ }
160
+ if (sourceCode.parserServices.isJSON) {
161
+ return createVisitorForJson(targetLocaleMessage, null);
162
+ }
163
+ else if (sourceCode.parserServices.isYAML) {
164
+ return createVisitorForYaml(targetLocaleMessage, null);
165
+ }
166
+ return {};
167
+ }
168
+ else {
169
+ debug(`ignore ${filename} in no-unknown-locale`);
170
+ return {};
171
+ }
172
+ }
173
+ module.exports = (0, rule_1.createRule)({
174
+ meta: {
175
+ type: 'suggestion',
176
+ docs: {
177
+ description: 'disallow unknown locale name',
178
+ category: 'Best Practices',
179
+ url: 'https://eslint-plugin-vue-i18n.intlify.dev/rules/no-unknown-locale.html',
180
+ recommended: false
181
+ },
182
+ fixable: null,
183
+ schema: [
184
+ {
185
+ type: 'object',
186
+ properties: {
187
+ locales: {
188
+ type: 'array',
189
+ items: { type: 'string' }
190
+ },
191
+ disableRFC5646: { type: 'boolean' }
192
+ },
193
+ additionalProperties: false
194
+ }
195
+ ]
196
+ },
197
+ create
198
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: import("../types").RuleModule;
2
+ export = _default;
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const path_1 = require("path");
6
+ const collect_keys_1 = require("../utils/collect-keys");
7
+ const collect_linked_keys_1 = require("../utils/collect-linked-keys");
8
+ const index_1 = require("../utils/index");
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const key_path_1 = require("../utils/key-path");
11
+ const get_cwd_1 = require("../utils/get-cwd");
12
+ const rule_1 = require("../utils/rule");
13
+ const regexp_1 = require("../utils/regexp");
14
+ const compat_1 = require("../utils/compat");
15
+ const debug = (0, debug_1.default)('eslint-plugin-vue-i18n:no-unused-keys');
16
+ function isDef(v) {
17
+ return v != null;
18
+ }
19
+ function getUsedKeysMap(targetLocaleMessage, values, usedkeys, context) {
20
+ const usedKeysMap = {};
21
+ for (const key of [...usedkeys, ...(0, collect_linked_keys_1.collectLinkedKeys)(values, context)]) {
22
+ usedKeysMap[key] = {};
23
+ const paths = (0, key_path_1.parsePath)(key);
24
+ let map = usedKeysMap;
25
+ while (paths.length) {
26
+ const path = paths.shift();
27
+ map = map[path] = map[path] || {};
28
+ }
29
+ }
30
+ if (targetLocaleMessage.localeKey === 'key') {
31
+ return targetLocaleMessage.locales.reduce((keys, locale) => {
32
+ keys[locale] = usedKeysMap;
33
+ return keys;
34
+ }, {});
35
+ }
36
+ return usedKeysMap;
37
+ }
38
+ function create(context) {
39
+ const filename = (0, compat_1.getFilename)(context);
40
+ const options = (context.options && context.options[0]) || {};
41
+ const enableFix = options.enableFix;
42
+ const ignores = (options.ignores || []).map(regexp_1.toRegExp);
43
+ function createVerifyContext(usedKeys, { buildFixer, buildAllFixer }) {
44
+ let pathStack = { usedKeys, keyPath: [] };
45
+ const reports = [];
46
+ return {
47
+ enterKey(key, reportNode, ignoreReport) {
48
+ const keyPath = [...pathStack.keyPath, key];
49
+ pathStack = {
50
+ upper: pathStack,
51
+ node: reportNode,
52
+ usedKeys: (pathStack.usedKeys && pathStack.usedKeys[key]) ||
53
+ false,
54
+ keyPath
55
+ };
56
+ const isUnused = !pathStack.usedKeys;
57
+ if (isUnused) {
58
+ if (!ignoreReport)
59
+ reports.push({
60
+ node: reportNode,
61
+ keyPath
62
+ });
63
+ }
64
+ },
65
+ leaveKey(reportNode) {
66
+ if (pathStack.node === reportNode) {
67
+ pathStack = pathStack.upper;
68
+ }
69
+ },
70
+ reports() {
71
+ for (const { node, keyPath } of reports) {
72
+ const keyPathStr = (0, key_path_1.joinPath)(...keyPath);
73
+ if (ignores.some(reg => reg.test(keyPathStr))) {
74
+ continue;
75
+ }
76
+ const fix = buildFixer(node);
77
+ context.report({
78
+ message: `unused '${keyPathStr}' key`,
79
+ loc: node.loc,
80
+ fix: enableFix ? fix : null,
81
+ suggest: [
82
+ {
83
+ desc: `Remove the '${keyPathStr}' key.`,
84
+ fix
85
+ },
86
+ reports.length > 1
87
+ ? {
88
+ desc: 'Remove all unused keys.',
89
+ fix: buildAllFixer(reports.map(({ node: n }) => n))
90
+ }
91
+ : null
92
+ ].filter(isDef)
93
+ });
94
+ }
95
+ }
96
+ };
97
+ }
98
+ function createVisitorForJson(sourceCode, usedKeys) {
99
+ const verifyContext = createVerifyContext(usedKeys, {
100
+ buildFixer(node) {
101
+ return fixer => fixer.removeRange(fixRemoveRange(node));
102
+ },
103
+ buildAllFixer(nodes) {
104
+ return function* (fixer) {
105
+ yield* fixAllRemoveKeys(fixer, nodes);
106
+ };
107
+ }
108
+ });
109
+ function isIgnore(node) {
110
+ return (node.type === 'JSONArrayExpression' ||
111
+ node.type === 'JSONObjectExpression');
112
+ }
113
+ return {
114
+ JSONProperty(node) {
115
+ const key = node.key.type === 'JSONLiteral' ? `${node.key.value}` : node.key.name;
116
+ verifyContext.enterKey(key, node.key, isIgnore(node.value));
117
+ },
118
+ 'JSONProperty:exit'(node) {
119
+ verifyContext.leaveKey(node.key);
120
+ },
121
+ 'JSONArrayExpression > *'(node) {
122
+ const key = node.parent.elements.indexOf(node);
123
+ verifyContext.enterKey(key, node, isIgnore(node));
124
+ },
125
+ 'JSONArrayExpression > *:exit'(node) {
126
+ verifyContext.leaveKey(node);
127
+ },
128
+ 'Program:exit'() {
129
+ verifyContext.reports();
130
+ }
131
+ };
132
+ function* fixAllRemoveKeys(fixer, nodes) {
133
+ const removed = new Set();
134
+ let preLast = 0;
135
+ for (const node of nodes) {
136
+ const range = fixRemoveRange(node, removed);
137
+ const start = Math.max(preLast, range[0]);
138
+ yield fixer.removeRange([start, range[1]]);
139
+ preLast = range[1];
140
+ }
141
+ }
142
+ function fixRemoveRange(node, removedNodes = new Set()) {
143
+ const parent = node.parent;
144
+ let removeNode;
145
+ let isFirst = false;
146
+ let isLast = false;
147
+ if (parent.type === 'JSONProperty') {
148
+ removeNode = parent;
149
+ const properties = parent.parent.properties.filter(p => !removedNodes.has(p));
150
+ const index = properties.indexOf(parent);
151
+ isFirst = index === 0;
152
+ isLast = index === properties.length - 1;
153
+ }
154
+ else {
155
+ removeNode = node;
156
+ if (parent.type === 'JSONArrayExpression') {
157
+ const elements = parent.elements.filter(e => e == null || !removedNodes.has(e));
158
+ const index = elements.indexOf(node);
159
+ isFirst = index === 0;
160
+ isLast = index === elements.length - 1;
161
+ }
162
+ }
163
+ removedNodes.add(removeNode);
164
+ const range = [...removeNode.range];
165
+ if (isLast || isFirst) {
166
+ const after = sourceCode.getTokenAfter(removeNode);
167
+ if (after && after.type === 'Punctuator' && after.value === ',') {
168
+ range[1] = after.range[1];
169
+ }
170
+ }
171
+ const before = sourceCode.getTokenBefore(removeNode);
172
+ if (before) {
173
+ if (before.type === 'Punctuator' && before.value === ',') {
174
+ range[0] = before.range[0];
175
+ }
176
+ else {
177
+ range[0] = before.range[1];
178
+ }
179
+ }
180
+ return range;
181
+ }
182
+ }
183
+ function createVisitorForYaml(sourceCode, usedKeys) {
184
+ const verifyContext = createVerifyContext(usedKeys, {
185
+ buildFixer(node) {
186
+ return function* (fixer) {
187
+ const parentToCheck = node.parent;
188
+ const removeNode = parentToCheck.type === 'YAMLPair' ? parentToCheck : node;
189
+ const parent = removeNode.parent;
190
+ if (parent.type === 'YAMLMapping' || parent.type === 'YAMLSequence') {
191
+ if (parent.style === 'flow') {
192
+ yield fixForFlow(fixer, removeNode);
193
+ }
194
+ else {
195
+ yield* fixForBlock(fixer, removeNode);
196
+ }
197
+ }
198
+ };
199
+ },
200
+ buildAllFixer(nodes) {
201
+ return function* (fixer) {
202
+ const removed = new Set();
203
+ const removeNodes = nodes.map(node => {
204
+ const parentToCheck = node.parent;
205
+ return parentToCheck.type === 'YAMLPair' ? parentToCheck : node;
206
+ });
207
+ for (const removeNode of removeNodes) {
208
+ if (removed.has(removeNode)) {
209
+ continue;
210
+ }
211
+ const parent = removeNode.parent;
212
+ if (parent.type === 'YAMLMapping') {
213
+ if (parent.pairs.every(p => removeNodes.includes(p))) {
214
+ const before = sourceCode.getTokenBefore(parent);
215
+ if (before) {
216
+ yield fixer.replaceTextRange([before.range[1], parent.range[1]], ' {}');
217
+ }
218
+ else {
219
+ yield fixer.replaceText(parent, '{}');
220
+ }
221
+ parent.pairs.forEach(n => removed.add(n));
222
+ continue;
223
+ }
224
+ removed.add(removeNode);
225
+ if (parent.style === 'flow') {
226
+ yield fixForFlow(fixer, removeNode);
227
+ }
228
+ else {
229
+ yield* fixForBlock(fixer, removeNode);
230
+ }
231
+ }
232
+ else if (parent.type === 'YAMLSequence') {
233
+ if (parent.entries.every(p => p && removeNodes.includes(p))) {
234
+ const before = sourceCode.getTokenBefore(parent);
235
+ if (before) {
236
+ yield fixer.replaceTextRange([before.range[1], parent.range[1]], ' []');
237
+ }
238
+ else {
239
+ yield fixer.replaceText(parent, '[]');
240
+ }
241
+ parent.entries.forEach(n => removed.add(n));
242
+ continue;
243
+ }
244
+ removed.add(removeNode);
245
+ if (parent.style === 'flow') {
246
+ yield fixForFlow(fixer, removeNode);
247
+ }
248
+ else {
249
+ yield* fixForBlock(fixer, removeNode);
250
+ }
251
+ }
252
+ }
253
+ };
254
+ }
255
+ });
256
+ const yamlKeyNodes = new Set();
257
+ function withinKey(node) {
258
+ for (const keyNode of yamlKeyNodes) {
259
+ if (keyNode.range[0] <= node.range[0] &&
260
+ node.range[0] < keyNode.range[1]) {
261
+ return true;
262
+ }
263
+ }
264
+ return false;
265
+ }
266
+ function isIgnore(node) {
267
+ return Boolean(node && (node.type === 'YAMLMapping' || node.type === 'YAMLSequence'));
268
+ }
269
+ return {
270
+ YAMLPair(node) {
271
+ if (node.key != null) {
272
+ if (withinKey(node)) {
273
+ return;
274
+ }
275
+ yamlKeyNodes.add(node.key);
276
+ }
277
+ else {
278
+ return;
279
+ }
280
+ const keyValue = node.key.type !== 'YAMLScalar'
281
+ ? sourceCode.getText(node.key)
282
+ : node.key.value;
283
+ const key = typeof keyValue === 'boolean' || keyValue === null
284
+ ? String(keyValue)
285
+ : keyValue;
286
+ verifyContext.enterKey(key, node.key, isIgnore(node.value));
287
+ },
288
+ 'YAMLPair:exit'(node) {
289
+ verifyContext.leaveKey(node.key);
290
+ },
291
+ 'YAMLSequence > *'(node) {
292
+ const key = node.parent.entries.indexOf(node);
293
+ verifyContext.enterKey(key, node, isIgnore(node));
294
+ },
295
+ 'YAMLSequence > *:exit'(node) {
296
+ verifyContext.leaveKey(node);
297
+ },
298
+ 'Program:exit'() {
299
+ verifyContext.reports();
300
+ }
301
+ };
302
+ function* fixForBlock(fixer, removeNode) {
303
+ const parent = removeNode.parent;
304
+ if (parent.type === 'YAMLMapping') {
305
+ if (parent.pairs.length === 1) {
306
+ const before = sourceCode.getTokenBefore(parent);
307
+ if (before) {
308
+ yield fixer.replaceTextRange([before.range[1], parent.range[1]], ' {}');
309
+ }
310
+ else {
311
+ yield fixer.replaceText(parent, '{}');
312
+ }
313
+ }
314
+ else {
315
+ const before = sourceCode.getTokenBefore(removeNode);
316
+ yield fixer.removeRange([
317
+ before ? before.range[1] : removeNode.range[0],
318
+ removeNode.range[1]
319
+ ]);
320
+ }
321
+ }
322
+ else if (parent.type === 'YAMLSequence') {
323
+ if (parent.entries.length === 1) {
324
+ const before = sourceCode.getTokenBefore(parent);
325
+ if (before) {
326
+ yield fixer.replaceTextRange([before.range[1], parent.range[1]], ' []');
327
+ }
328
+ else {
329
+ yield fixer.replaceText(parent, '[]');
330
+ }
331
+ }
332
+ else {
333
+ const hyphen = sourceCode.getTokenBefore(removeNode);
334
+ const before = sourceCode.getTokenBefore(hyphen || removeNode);
335
+ yield fixer.removeRange([
336
+ before
337
+ ? before.range[1]
338
+ : hyphen
339
+ ? hyphen.range[0]
340
+ : removeNode.range[0],
341
+ removeNode.range[1]
342
+ ]);
343
+ }
344
+ }
345
+ }
346
+ function fixForFlow(fixer, removeNode) {
347
+ const parent = removeNode.parent;
348
+ let isFirst = false;
349
+ let isLast = false;
350
+ if (parent.type === 'YAMLMapping') {
351
+ const index = parent.pairs.indexOf(removeNode);
352
+ isFirst = index === 0;
353
+ isLast = index === parent.pairs.length - 1;
354
+ }
355
+ else if (parent.type === 'YAMLSequence') {
356
+ const index = parent.entries.indexOf(removeNode);
357
+ isFirst = index === 0;
358
+ isLast = index === parent.entries.length - 1;
359
+ }
360
+ const range = [...removeNode.range];
361
+ if (isLast || isFirst) {
362
+ const after = sourceCode.getTokenAfter(removeNode);
363
+ if (after && after.type === 'Punctuator' && after.value === ',') {
364
+ range[1] = after.range[1];
365
+ }
366
+ }
367
+ const before = sourceCode.getTokenBefore(removeNode);
368
+ if (before) {
369
+ if (before.type === 'Punctuator' && before.value === ',') {
370
+ range[0] = before.range[0];
371
+ }
372
+ else {
373
+ range[0] = before.range[1];
374
+ }
375
+ }
376
+ return fixer.removeRange(range);
377
+ }
378
+ }
379
+ const sourceCode = (0, compat_1.getSourceCode)(context);
380
+ if ((0, path_1.extname)(filename) === '.vue') {
381
+ const createCustomBlockRule = (createVisitor) => {
382
+ return ctx => {
383
+ const localeMessages = (0, index_1.getLocaleMessages)(context);
384
+ const usedLocaleMessageKeys = (0, collect_keys_1.collectKeysFromAST)(sourceCode.ast, sourceCode.visitorKeys);
385
+ const targetLocaleMessage = localeMessages.findBlockLocaleMessage(ctx.parserServices.customBlock);
386
+ if (!targetLocaleMessage) {
387
+ return {};
388
+ }
389
+ const usedKeys = getUsedKeysMap(targetLocaleMessage, targetLocaleMessage.messages, usedLocaleMessageKeys, context);
390
+ return createVisitor((0, compat_1.getSourceCode)(ctx), usedKeys);
391
+ };
392
+ };
393
+ return (0, index_1.defineCustomBlocksVisitor)(context, createCustomBlockRule(createVisitorForJson), createCustomBlockRule(createVisitorForYaml));
394
+ }
395
+ else if (sourceCode.parserServices.isJSON ||
396
+ sourceCode.parserServices.isYAML) {
397
+ const localeMessages = (0, index_1.getLocaleMessages)(context);
398
+ const targetLocaleMessage = localeMessages.findExistLocaleMessage(filename);
399
+ if (!targetLocaleMessage) {
400
+ debug(`ignore ${filename} in no-unused-keys`);
401
+ return {};
402
+ }
403
+ const src = options.src || (0, get_cwd_1.getCwd)(context);
404
+ const extensions = options.extensions || ['.js', '.vue'];
405
+ const usedLocaleMessageKeys = collect_keys_1.usedKeysCache.collectKeysFromFiles([src], extensions, context);
406
+ const usedKeys = getUsedKeysMap(targetLocaleMessage, targetLocaleMessage.messages, usedLocaleMessageKeys, context);
407
+ if (sourceCode.parserServices.isJSON) {
408
+ return createVisitorForJson(sourceCode, usedKeys);
409
+ }
410
+ else if (sourceCode.parserServices.isYAML) {
411
+ return createVisitorForYaml(sourceCode, usedKeys);
412
+ }
413
+ return {};
414
+ }
415
+ else {
416
+ debug(`ignore ${filename} in no-unused-keys`);
417
+ return {};
418
+ }
419
+ }
420
+ module.exports = (0, rule_1.createRule)({
421
+ meta: {
422
+ type: 'suggestion',
423
+ docs: {
424
+ description: 'disallow unused localization keys',
425
+ category: 'Best Practices',
426
+ url: 'https://eslint-plugin-vue-i18n.intlify.dev/rules/no-unused-keys.html',
427
+ recommended: false
428
+ },
429
+ fixable: 'code',
430
+ hasSuggestions: true,
431
+ schema: [
432
+ {
433
+ type: 'object',
434
+ properties: {
435
+ src: {
436
+ type: 'string'
437
+ },
438
+ extensions: {
439
+ type: 'array',
440
+ items: { type: 'string' },
441
+ default: ['.js', '.vue']
442
+ },
443
+ ignores: {
444
+ type: 'array',
445
+ items: { type: 'string' }
446
+ },
447
+ enableFix: {
448
+ type: 'boolean'
449
+ }
450
+ },
451
+ additionalProperties: false
452
+ }
453
+ ]
454
+ },
455
+ create
456
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: import("../types").RuleModule;
2
+ export = _default;