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.
- package/CHANGELOG.md +20 -0
- package/package.json +2 -2
- package/rules/a11y-anchor-has-href-attribute/index.js +1 -0
- package/rules/a11y-clickable-element-has-text/index.js +1 -0
- package/rules/a11y-delegate-element-has-role-presentation/index.js +2 -0
- package/rules/a11y-form-control-in-form/index.js +1 -0
- package/rules/a11y-heading-in-sectioning-content/README.md +16 -1
- package/rules/a11y-heading-in-sectioning-content/index.js +7 -2
- package/rules/a11y-help-link-with-support-href/index.js +2 -1
- package/rules/a11y-image-has-alt-attribute/index.js +2 -0
- package/rules/a11y-input-has-name-attribute/index.js +6 -3
- package/rules/a11y-input-in-form-control/index.js +11 -4
- package/rules/a11y-numbered-text-within-ol/index.js +5 -0
- package/rules/a11y-prohibit-checkbox-or-radio-in-table-cell/index.js +5 -23
- package/rules/a11y-prohibit-input-maxlength-attribute/index.js +5 -4
- package/rules/a11y-prohibit-input-placeholder/index.js +7 -3
- package/rules/a11y-prohibit-sectioning-content-in-form/index.js +2 -0
- package/rules/a11y-prohibit-useless-sectioning-fragment/index.js +2 -1
- package/rules/a11y-trigger-has-button/index.js +4 -2
- package/rules/best-practice-for-async-current-target/index.js +2 -2
- package/rules/best-practice-for-button-element/index.js +1 -0
- package/rules/best-practice-for-data-test-attribute/index.js +1 -0
- package/rules/best-practice-for-date/index.js +2 -0
- package/rules/best-practice-for-layouts/index.js +22 -10
- package/rules/best-practice-for-nested-attributes-array-index/index.js +1 -0
- package/rules/best-practice-for-remote-trigger-dialog/index.js +2 -1
- package/rules/best-practice-for-tailwind-prohibit-root-margin/index.js +2 -1
- package/rules/best-practice-for-tailwind-variants/index.js +6 -3
- package/rules/component-name/README.md +11 -3
- package/rules/component-name/index.js +135 -2
- package/rules/design-system-guideline-prohibit-double-icons/index.js +1 -0
- package/rules/format-import-path/index.js +2 -1
- package/rules/jsx-start-with-spread-attributes/index.js +2 -1
- package/rules/no-import-other-domain/index.js +2 -1
- package/rules/prohibit-export-array-type/index.js +1 -0
- package/rules/prohibit-file-name/index.js +2 -1
- package/rules/prohibit-import/index.js +4 -2
- package/rules/prohibit-path-within-template-literal/index.js +2 -1
- package/rules/require-barrel-import/index.js +2 -1
- package/rules/require-declaration/index.js +4 -2
- package/rules/require-export/index.js +2 -1
- package/rules/require-i18n-text/index.js +4 -2
- package/rules/require-import/index.js +2 -1
- package/rules/trim-props/index.js +24 -12
- package/test/a11y-anchor-has-href-attribute.js +1 -0
- package/test/a11y-clickable-element-has-text.js +1 -0
- package/test/a11y-delegate-element-has-role-presentation.js +2 -0
- package/test/a11y-form-control-in-form.js +1 -0
- package/test/a11y-heading-in-sectioning-content.js +7 -2
- package/test/a11y-help-link-with-support-href.js +2 -1
- package/test/a11y-image-has-alt-attribute.js +2 -0
- package/test/a11y-input-has-name-attribute.js +30 -15
- package/test/a11y-input-in-form-control.js +15 -1
- package/test/a11y-numbered-text-within-ol.js +29 -0
- package/test/a11y-prohhibit-input-placeholder.js +19 -9
- package/test/a11y-prohibit-checkbox-or-radio-in-table-cell.js +35 -15
- package/test/a11y-prohibit-input-maxlength-attribute.js +5 -4
- package/test/a11y-prohibit-useless-sectioning-fragment.js +2 -1
- package/test/a11y-trigger-has-button.js +12 -6
- package/test/best-practice-for-async-current-target.js +2 -2
- package/test/best-practice-for-button-element.js +2 -0
- package/test/best-practice-for-data-test-attribute.js +1 -0
- package/test/best-practice-for-date.js +2 -0
- package/test/best-practice-for-layouts.js +26 -12
- package/test/best-practice-for-nested-attributes-array-index.js +1 -0
- package/test/best-practice-for-remote-trigger-dialog.js +6 -3
- package/test/best-practice-for-tailwind-prohibit-root-margin.js +2 -2
- package/test/best-practice-for-tailwind-variants.js +8 -4
- package/test/component-name.js +11 -2
- package/test/design-system-guideline-prohibit-double-icons.js +1 -0
- package/test/prohibit-file-name.js +4 -2
- package/test/prohibit-import.js +14 -7
- package/test/prohibit-path-within-template-literal.js +4 -2
- package/test/require-declaration.js +11 -5
- package/test/require-export.js +6 -3
- package/test/require-i18n-text.js +4 -3
- package/test/require-import.js +13 -7
- package/test/trim-props.js +23 -14
- 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 }
|