eslint-plugin-smarthr 2.0.0 → 2.2.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.
- package/CHANGELOG.md +16 -0
- package/libs/format_styled_components.js +1 -1
- package/package.json +4 -4
- package/rules/a11y-help-link-with-support-href/index.js +1 -1
- package/rules/a11y-image-has-alt-attribute/index.js +0 -1
- package/rules/a11y-prohibit-useless-sectioning-fragment/index.js +9 -44
- package/rules/a11y-trigger-has-button/index.js +18 -36
- package/rules/best-practice-for-async-current-target/index.js +14 -21
- package/rules/best-practice-for-button-element/index.js +10 -23
- package/rules/best-practice-for-data-test-attribute/index.js +9 -12
- package/rules/best-practice-for-date/index.js +16 -29
- package/rules/best-practice-for-nested-attributes-array-index/index.js +7 -15
- package/rules/best-practice-for-remote-trigger-dialog/index.js +10 -23
- package/rules/best-practice-for-tailwind-prohibit-root-margin/index.js +5 -93
- package/rules/design-system-guideline-prohibit-double-icons/index.js +6 -31
- package/rules/prohibit-export-array-type/index.js +6 -9
- package/rules/require-i18n-text/README.md +123 -0
- package/rules/require-i18n-text/index.js +94 -0
- package/rules/trim-props/index.js +13 -16
- package/test/a11y-help-link-with-support-href.js +2 -1
- package/test/a11y-prohibit-useless-sectioning-fragment.js +7 -7
- package/test/a11y-trigger-has-button.js +8 -7
- package/test/best-practice-for-button-element.js +0 -3
- package/test/best-practice-for-data-test-attribute.js +9 -8
- package/test/best-practice-for-remote-trigger-dialog.js +3 -9
- package/test/best-practice-for-tailwind-prohibit-root-margin.js +16 -7
- package/test/design-system-guideline-prohibit-double-icons.js +1 -3
- package/test/require-i18n-text.js +170 -0
- package/test/trim-props.js +15 -4
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const rule = require('../rules/require-i18n-text')
|
|
2
|
+
const RuleTester = require('eslint').RuleTester
|
|
3
|
+
|
|
4
|
+
const ruleTester = new RuleTester({
|
|
5
|
+
languageOptions: {
|
|
6
|
+
parserOptions: {
|
|
7
|
+
ecmaFeatures: {
|
|
8
|
+
jsx: true,
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const attributeError = (element, attr) =>
|
|
15
|
+
`${element}の${attr}属性に文字列リテラルが指定されています。多言語化対応のため、翻訳関数を使用してください`
|
|
16
|
+
const childTextError = '子要素に文字列リテラルが指定されています。多言語化対応のため、翻訳関数を使用してください'
|
|
17
|
+
|
|
18
|
+
const options = [
|
|
19
|
+
{
|
|
20
|
+
elements: {
|
|
21
|
+
img: ['alt', 'title'],
|
|
22
|
+
div: ['title'],
|
|
23
|
+
Button: ['label'],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
ruleTester.run('require-i18n-text', rule, {
|
|
29
|
+
valid: [
|
|
30
|
+
// 翻訳関数を使用している場合
|
|
31
|
+
{ code: `<img alt={t('profile_picture')} />`, options },
|
|
32
|
+
{ code: `<div>{t('hello')}</div>`, options },
|
|
33
|
+
|
|
34
|
+
// 検査対象外の属性
|
|
35
|
+
{ code: `<img src="test.png" />`, options },
|
|
36
|
+
|
|
37
|
+
// 検査対象外の要素
|
|
38
|
+
{ code: `<Input label="test" />`, options },
|
|
39
|
+
|
|
40
|
+
// 数値リテラル(検査対象外)
|
|
41
|
+
{ code: `<div>{123}</div>`, options },
|
|
42
|
+
|
|
43
|
+
// 真偽値(検査対象外)
|
|
44
|
+
{ code: `<Button disabled={true} />`, options },
|
|
45
|
+
|
|
46
|
+
// 空文字列(検査対象外)
|
|
47
|
+
{ code: `<img alt="" />`, options },
|
|
48
|
+
|
|
49
|
+
// 空白のみのテキスト(検査対象外)
|
|
50
|
+
{ code: `<div> </div>`, options },
|
|
51
|
+
|
|
52
|
+
// デフォルト設定対象外の属性
|
|
53
|
+
{ code: `<img src="image.png" />` },
|
|
54
|
+
{ code: `<div data-testid="test" />` },
|
|
55
|
+
|
|
56
|
+
// ワイルドカード - 空配列で除外
|
|
57
|
+
{
|
|
58
|
+
code: `<Icon label="Icon text" />`,
|
|
59
|
+
options: [
|
|
60
|
+
{
|
|
61
|
+
elements: {
|
|
62
|
+
'*': ['label'],
|
|
63
|
+
Icon: [],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
// デフォルト設定の上書き
|
|
70
|
+
{
|
|
71
|
+
code: `<img alt="text" />`,
|
|
72
|
+
options: [
|
|
73
|
+
{
|
|
74
|
+
elements: {
|
|
75
|
+
'*': ['data-tooltip'],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
invalid: [
|
|
82
|
+
// 属性エラー: デフォルト設定
|
|
83
|
+
{
|
|
84
|
+
code: `<img alt="Profile picture" />`,
|
|
85
|
+
errors: [{ message: attributeError('img', 'alt') }],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
code: `<CustomComponent aria-label="Label" />`,
|
|
89
|
+
errors: [{ message: attributeError('CustomComponent', 'aria-label') }],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
code: `<DefinitionListItem term="Label" />`,
|
|
93
|
+
errors: [{ message: attributeError('DefinitionListItem', 'term') }],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
code: `<button title="Click me" />`,
|
|
97
|
+
errors: [{ message: attributeError('button', 'title') }],
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
// 属性エラー: カスタムオプション
|
|
101
|
+
{
|
|
102
|
+
code: `<img alt="Profile picture" />`,
|
|
103
|
+
options,
|
|
104
|
+
errors: [{ message: attributeError('img', 'alt') }],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
code: `<img alt={'Profile'} />`,
|
|
108
|
+
options,
|
|
109
|
+
errors: [{ message: attributeError('img', 'alt') }],
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
// 属性エラー: 同一要素の複数属性
|
|
113
|
+
{
|
|
114
|
+
code: `<img alt="Profile" title="User profile" />`,
|
|
115
|
+
options,
|
|
116
|
+
errors: [{ message: attributeError('img', 'alt') }, { message: attributeError('img', 'title') }],
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
// 属性エラー: ワイルドカード
|
|
120
|
+
{
|
|
121
|
+
code: `<CustomComponent label="Text" />`,
|
|
122
|
+
options: [
|
|
123
|
+
{
|
|
124
|
+
elements: {
|
|
125
|
+
'*': ['label'],
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
errors: [{ message: attributeError('CustomComponent', 'label') }],
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
// 属性エラー: 個別設定がワイルドカードより優先
|
|
133
|
+
{
|
|
134
|
+
code: `<Button label="Submit" helperText="Help" />`,
|
|
135
|
+
options: [
|
|
136
|
+
{
|
|
137
|
+
elements: {
|
|
138
|
+
'*': ['label'],
|
|
139
|
+
Button: ['label', 'helperText'],
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
errors: [{ message: attributeError('Button', 'label') }, { message: attributeError('Button', 'helperText') }],
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
// 子要素エラー(オプション未設定時でもチェックされる)
|
|
147
|
+
{
|
|
148
|
+
code: `<div>Hello World</div>`,
|
|
149
|
+
errors: [{ message: childTextError }],
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// 複合エラー: 属性と子要素
|
|
153
|
+
{
|
|
154
|
+
code: `<Button label="Submit">Click here</Button>`,
|
|
155
|
+
options,
|
|
156
|
+
errors: [{ message: attributeError('Button', 'label') }, { message: childTextError }],
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
// 複合エラー: 入れ子構造
|
|
160
|
+
{
|
|
161
|
+
code: `<div title="Parent"><Button label="Child">Grandchild text</Button></div>`,
|
|
162
|
+
options,
|
|
163
|
+
errors: [
|
|
164
|
+
{ message: attributeError('div', 'title') },
|
|
165
|
+
{ message: attributeError('Button', 'label') },
|
|
166
|
+
{ message: childTextError },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
})
|
package/test/trim-props.js
CHANGED
|
@@ -16,8 +16,9 @@ ruleTester.run('trim-props', rule, {
|
|
|
16
16
|
{ code: '<a href="https://www.google.com">google</a>' },
|
|
17
17
|
{ code: '<a href={"https://www.google.com"}>google</a>' },
|
|
18
18
|
{ code: '<img src="/sample.jpg" alt="sample" />' },
|
|
19
|
-
{ code:
|
|
19
|
+
{ code: `<img src={'/sample.jpg'} alt={'sample'} />` },
|
|
20
20
|
{ code: '<div data-spec="info-area">....</div>' },
|
|
21
|
+
{ code: '<div data-spec={`a${b} c`}>....</div>' },
|
|
21
22
|
],
|
|
22
23
|
invalid: [
|
|
23
24
|
{
|
|
@@ -59,8 +60,8 @@ ruleTester.run('trim-props', rule, {
|
|
|
59
60
|
],
|
|
60
61
|
},
|
|
61
62
|
{
|
|
62
|
-
code:
|
|
63
|
-
output:
|
|
63
|
+
code: `<img src={' /sample.jpg'} alt={'sample '} />`,
|
|
64
|
+
output: `<img src={'/sample.jpg'} alt={'sample'} />`,
|
|
64
65
|
errors: [
|
|
65
66
|
{ message: '属性に設定している文字列から先頭、末尾の空白文字を削除してください' },
|
|
66
67
|
{ message: '属性に設定している文字列から先頭、末尾の空白文字を削除してください' },
|
|
@@ -76,5 +77,15 @@ ruleTester.run('trim-props', rule, {
|
|
|
76
77
|
output: '<div data-spec={"info-area"}>....</div>',
|
|
77
78
|
errors: [{ message: '属性に設定している文字列から先頭、末尾の空白文字を削除してください' }],
|
|
78
79
|
},
|
|
80
|
+
{
|
|
81
|
+
code: '<div data-spec={` ab c `}>....</div>',
|
|
82
|
+
output: '<div data-spec={`ab c`}>....</div>',
|
|
83
|
+
errors: [{ message: '属性に設定している文字列から先頭、末尾の空白文字を削除してください' }],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
code: '<div data-spec={` a${b} c `}>....</div>',
|
|
87
|
+
output: '<div data-spec={`a${b} c`}>....</div>',
|
|
88
|
+
errors: [{ message: '属性に設定している文字列から先頭、末尾の空白文字を削除してください' }],
|
|
89
|
+
},
|
|
79
90
|
],
|
|
80
|
-
})
|
|
91
|
+
})
|