eslint-plugin-smarthr 2.3.0 → 2.5.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 (79) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.json +2 -2
  3. package/rules/a11y-anchor-has-href-attribute/index.js +1 -0
  4. package/rules/a11y-clickable-element-has-text/index.js +1 -0
  5. package/rules/a11y-delegate-element-has-role-presentation/index.js +2 -0
  6. package/rules/a11y-form-control-in-form/index.js +1 -0
  7. package/rules/a11y-heading-in-sectioning-content/README.md +16 -1
  8. package/rules/a11y-heading-in-sectioning-content/index.js +7 -2
  9. package/rules/a11y-help-link-with-support-href/index.js +2 -1
  10. package/rules/a11y-image-has-alt-attribute/index.js +2 -0
  11. package/rules/a11y-input-has-name-attribute/index.js +6 -3
  12. package/rules/a11y-input-in-form-control/index.js +11 -4
  13. package/rules/a11y-numbered-text-within-ol/index.js +5 -0
  14. package/rules/a11y-prohibit-checkbox-or-radio-in-table-cell/index.js +5 -23
  15. package/rules/a11y-prohibit-input-maxlength-attribute/index.js +5 -4
  16. package/rules/a11y-prohibit-input-placeholder/index.js +7 -3
  17. package/rules/a11y-prohibit-sectioning-content-in-form/index.js +2 -0
  18. package/rules/a11y-prohibit-useless-sectioning-fragment/index.js +2 -1
  19. package/rules/a11y-trigger-has-button/index.js +4 -2
  20. package/rules/best-practice-for-async-current-target/index.js +2 -2
  21. package/rules/best-practice-for-button-element/index.js +1 -0
  22. package/rules/best-practice-for-data-test-attribute/index.js +1 -0
  23. package/rules/best-practice-for-date/index.js +2 -0
  24. package/rules/best-practice-for-layouts/index.js +22 -10
  25. package/rules/best-practice-for-nested-attributes-array-index/index.js +1 -0
  26. package/rules/best-practice-for-remote-trigger-dialog/index.js +2 -1
  27. package/rules/best-practice-for-tailwind-prohibit-root-margin/index.js +2 -1
  28. package/rules/best-practice-for-tailwind-variants/index.js +6 -3
  29. package/rules/component-name/README.md +11 -3
  30. package/rules/component-name/index.js +135 -2
  31. package/rules/design-system-guideline-prohibit-double-icons/index.js +1 -0
  32. package/rules/format-import-path/index.js +2 -1
  33. package/rules/jsx-start-with-spread-attributes/index.js +2 -1
  34. package/rules/no-import-other-domain/index.js +2 -1
  35. package/rules/prohibit-export-array-type/index.js +1 -0
  36. package/rules/prohibit-file-name/index.js +2 -1
  37. package/rules/prohibit-import/index.js +4 -2
  38. package/rules/prohibit-path-within-template-literal/index.js +2 -1
  39. package/rules/require-barrel-import/index.js +2 -1
  40. package/rules/require-declaration/index.js +4 -2
  41. package/rules/require-export/index.js +2 -1
  42. package/rules/require-i18n-text/index.js +4 -2
  43. package/rules/require-import/index.js +2 -1
  44. package/rules/trim-props/index.js +24 -12
  45. package/test/a11y-anchor-has-href-attribute.js +1 -0
  46. package/test/a11y-clickable-element-has-text.js +1 -0
  47. package/test/a11y-delegate-element-has-role-presentation.js +2 -0
  48. package/test/a11y-form-control-in-form.js +1 -0
  49. package/test/a11y-heading-in-sectioning-content.js +7 -2
  50. package/test/a11y-help-link-with-support-href.js +2 -1
  51. package/test/a11y-image-has-alt-attribute.js +2 -0
  52. package/test/a11y-input-has-name-attribute.js +30 -15
  53. package/test/a11y-input-in-form-control.js +15 -1
  54. package/test/a11y-numbered-text-within-ol.js +29 -0
  55. package/test/a11y-prohhibit-input-placeholder.js +19 -9
  56. package/test/a11y-prohibit-checkbox-or-radio-in-table-cell.js +35 -15
  57. package/test/a11y-prohibit-input-maxlength-attribute.js +5 -4
  58. package/test/a11y-prohibit-useless-sectioning-fragment.js +2 -1
  59. package/test/a11y-trigger-has-button.js +12 -6
  60. package/test/best-practice-for-async-current-target.js +2 -2
  61. package/test/best-practice-for-button-element.js +2 -0
  62. package/test/best-practice-for-data-test-attribute.js +1 -0
  63. package/test/best-practice-for-date.js +2 -0
  64. package/test/best-practice-for-layouts.js +26 -12
  65. package/test/best-practice-for-nested-attributes-array-index.js +1 -0
  66. package/test/best-practice-for-remote-trigger-dialog.js +6 -3
  67. package/test/best-practice-for-tailwind-prohibit-root-margin.js +2 -2
  68. package/test/best-practice-for-tailwind-variants.js +8 -4
  69. package/test/component-name.js +11 -2
  70. package/test/design-system-guideline-prohibit-double-icons.js +1 -0
  71. package/test/prohibit-file-name.js +4 -2
  72. package/test/prohibit-import.js +14 -7
  73. package/test/prohibit-path-within-template-literal.js +4 -2
  74. package/test/require-declaration.js +11 -5
  75. package/test/require-export.js +6 -3
  76. package/test/require-i18n-text.js +4 -3
  77. package/test/require-import.js +13 -7
  78. package/test/trim-props.js +23 -14
  79. package/libs/format_styled_components.js +0 -126
@@ -1,126 +0,0 @@
1
- const STYLED_COMPONENTS_METHOD = 'styled'
2
- const STYLED_COMPONENTS = `${STYLED_COMPONENTS_METHOD}-components`
3
-
4
- const findInvalidImportNameNode = (s) => s.type === 'ImportDefaultSpecifier' && s.local.name !== STYLED_COMPONENTS_METHOD
5
-
6
- const checkImportStyledComponents = (node, context) => {
7
- if (node.source.value !== STYLED_COMPONENTS) {
8
- return
9
- }
10
-
11
- const invalidNameNode = node.specifiers.find(findInvalidImportNameNode)
12
-
13
- if (invalidNameNode) {
14
- context.report({
15
- node: invalidNameNode,
16
- message: `${STYLED_COMPONENTS} をimportする際は、名称が"${STYLED_COMPONENTS_METHOD}" となるようにしてください。例: "import ${STYLED_COMPONENTS_METHOD} from '${STYLED_COMPONENTS}'"`,
17
- });
18
- }
19
- }
20
-
21
- const getStyledComponentBaseName = (node) => {
22
- let base = null
23
-
24
- if (!node.init) {
25
- return base
26
- }
27
-
28
- const tag = node.init.tag || node.init
29
-
30
- if (tag.object?.name === STYLED_COMPONENTS_METHOD) {
31
- base = tag.property.name
32
- } else if (tag.callee) {
33
- const callee = tag.callee
34
-
35
- switch (STYLED_COMPONENTS_METHOD) {
36
- case callee.name: {
37
- const arg = tag.arguments[0]
38
- base = arg.name || arg.value
39
- break
40
- }
41
- case callee.callee?.name: {
42
- const arg = callee.arguments[0]
43
- base = arg.name || arg.value
44
- break
45
- }
46
- case callee.object?.name:
47
- base = callee.property.name
48
- break
49
- case callee.object?.callee?.name:
50
- const arg = callee.object.arguments[0]
51
- base = arg.name || arg.value
52
- break
53
- }
54
- }
55
-
56
- return base
57
- }
58
-
59
- const generateTagFormatter = ({ context, EXPECTED_NAMES, UNEXPECTED_NAMES }) => {
60
- const entriesesTagNames = Object.entries(EXPECTED_NAMES).map(([b, e]) => [ new RegExp(b), new RegExp(e) ])
61
- const entriesesUnTagNames = UNEXPECTED_NAMES ? Object.entries(UNEXPECTED_NAMES).map(([b, e]) => {
62
- const [ auctualE, messageTemplate ] = Array.isArray(e) ? e : [e, '']
63
-
64
- return [ new RegExp(b), new RegExp(auctualE), messageTemplate ]
65
- }) : []
66
-
67
-
68
- const checkImportedNameToLocalName = (node, base, extended, isImport) => {
69
- entriesesTagNames.forEach(([b, e]) => {
70
- if (base.match(b) && !extended.match(e)) {
71
- context.report({
72
- node,
73
- message: `${extended}を正規表現 "${e.toString()}" がmatchする名称に変更してください。${isImport ? `
74
- - ${base}が型の場合、'import type { ${base} as ${extended} }' もしくは 'import { type ${base} as ${extended} }' のように明示的に型であることを宣言してください。名称変更が不要になります` : ''}`,
75
- });
76
- }
77
- })
78
- }
79
-
80
- return {
81
- ImportDeclaration: (node) => {
82
- checkImportStyledComponents(node, context)
83
-
84
- if (node.importKind !== 'type') {
85
- node.specifiers.forEach((s) => {
86
- if (s.importKind !== 'type' && s.imported && s.imported.name !== s.local.name) {
87
- checkImportedNameToLocalName(node, s.imported.name, s.local.name, true)
88
- }
89
- })
90
- }
91
- },
92
- VariableDeclarator: (node) => {
93
- const base = getStyledComponentBaseName(node)
94
-
95
- if (base) {
96
- const extended = node.id.name
97
-
98
- checkImportedNameToLocalName(node, base, extended)
99
-
100
- entriesesUnTagNames.forEach(([b, e, m]) => {
101
- const matcher = extended.match(e)
102
-
103
- if (matcher && !base.match(b)) {
104
- const expected = matcher[1]
105
- const isBareTag = base === base.toLowerCase()
106
- const sampleFixBase = `styled${isBareTag ? `.${base}` : `(${base})`}`
107
-
108
- context.report({
109
- node,
110
- message: m ? m
111
- .replaceAll('{{extended}}', extended)
112
- .replaceAll('{{expected}}', expected) : `${extended} は ${b.toString()} にmatchする名前のコンポーネントを拡張することを期待している名称になっています
113
- - ${extended} の名称の末尾が"${expected}" という文字列ではない状態にしつつ、"${base}"を継承していることをわかる名称に変更してください
114
- - もしくは"${base}"を"${extended}"の継承元であることがわかるような${isBareTag ? '適切なタグや別コンポーネントに差し替えてください' : '名称に変更するか、適切な別コンポーネントに差し替えてください'}
115
- - 修正例1: const ${extended.replace(expected, '')}Xxxx = ${sampleFixBase}
116
- - 修正例2: const ${extended}Xxxx = ${sampleFixBase}
117
- - 修正例3: const ${extended} = styled(Xxxx${expected})`
118
- })
119
- }
120
- })
121
- }
122
- },
123
- }
124
- }
125
-
126
- module.exports = { generateTagFormatter }