@hypersolid-dev/eslint-config 6.0.0 → 7.0.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 +24 -0
- package/README.md +20 -20
- package/dist/base.js +6 -6
- package/dist/plugins/{hypersolid.d.ts → base/index.d.ts} +1 -0
- package/dist/plugins/base/index.js +15 -0
- package/dist/plugins/{rules → base/rules}/comment-style.js +2 -2
- package/dist/plugins/{rules → base/rules}/regex-pattern-const.js +1 -1
- package/dist/plugins/{rules → base/rules}/undefined-check.js +2 -2
- package/dist/plugins/react/index.d.ts +4 -0
- package/dist/plugins/react/index.js +23 -0
- package/dist/plugins/{rules → react/rules}/boolean-guard.js +2 -2
- package/dist/plugins/{rules → react/rules}/effect-takes-callback.js +1 -1
- package/dist/plugins/{rules → react/rules}/jsdoc-for-props.js +2 -2
- package/dist/plugins/{rules → react/rules}/no-callback-payload.js +2 -2
- package/dist/plugins/{rules → react/rules}/no-markup-variable.js +2 -2
- package/dist/plugins/{rules → react/rules}/no-unnecessary-use-callback.js +1 -1
- package/dist/plugins/react/rules/props-destructuring.d.ts +3 -0
- package/dist/plugins/{props-destructuring.js → react/rules/props-destructuring.js} +1 -5
- package/dist/plugins/{react-native-a11y → react-native/a11y}/index.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-actions-need-handler.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-hint.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-label.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-role.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-value-needs-range.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/adjustable-needs-value.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/gate-announce-for-accessibility.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/input-purpose.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-aria-legacy-mix.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-deprecated-accessibility-focus.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-dropped-aria-on-text.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-font-scaling-disabled.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-ineffective-accessibility-props.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-invalid-accessibility-state.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-nested-focus-stops.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-press-in-activation.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-unnamed-interactive.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/require-invert-colors-opt-out.js +1 -1
- package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/require-modal-a11y-on-sheets.js +1 -1
- package/dist/plugins/{props-destructuring.d.ts → react-native/index.d.ts} +1 -0
- package/dist/plugins/react-native/index.js +17 -0
- package/dist/plugins/{rules → react-native/rules}/test-id-default.js +1 -1
- package/dist/plugins/{rules → react-native/rules}/test-id-format.js +2 -2
- package/dist/plugins/{rules → react-native/rules}/test-id-from-props.js +2 -2
- package/dist/plugins/{rules → react-native/rules}/webview-allow-list.js +2 -2
- package/dist/react-native.js +9 -8
- package/dist/shared.js +14 -14
- package/package.json +1 -1
- package/dist/plugins/hypersolid.js +0 -38
- package/dist/plugins/react-native-a11y/utils/create-rule.js +0 -3
- package/dist/plugins/utils/create-rule.d.ts +0 -5
- /package/dist/plugins/{rules → base/rules}/comment-style.d.ts +0 -0
- /package/dist/plugins/{rules → base/rules}/regex-pattern-const.d.ts +0 -0
- /package/dist/plugins/{rules → base/rules}/undefined-check.d.ts +0 -0
- /package/dist/plugins/{rules → react/rules}/boolean-guard.d.ts +0 -0
- /package/dist/plugins/{rules → react/rules}/effect-takes-callback.d.ts +0 -0
- /package/dist/plugins/{rules → react/rules}/jsdoc-for-props.d.ts +0 -0
- /package/dist/plugins/{rules → react/rules}/no-callback-payload.d.ts +0 -0
- /package/dist/plugins/{rules → react/rules}/no-markup-variable.d.ts +0 -0
- /package/dist/plugins/{rules → react/rules}/no-unnecessary-use-callback.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-props.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-props.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-state.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-state.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/interactive.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/interactive.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/react-native-components.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/react-native-components.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/schema-properties.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/schema-properties.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/index.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/models/optional-options.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/models/optional-options.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-actions-need-handler.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-hint.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-label.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-role.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-value-needs-range.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/adjustable-needs-value.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/gate-announce-for-accessibility.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/input-purpose.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-aria-legacy-mix.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-deprecated-accessibility-focus.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-dropped-aria-on-text.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-font-scaling-disabled.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-ineffective-accessibility-props.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-invalid-accessibility-state.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-nested-focus-stops.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-press-in-activation.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-unnamed-interactive.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/require-invert-colors-opt-out.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/require-modal-a11y-on-sheets.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-amount-of-text-children.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-amount-of-text-children.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-components.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-components.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-element-name.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-element-name.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-jsx-descendants.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-jsx-descendants.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-property-value.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-property-value.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-text-child.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-text-child.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-property.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-property.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-accessible-name.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-accessible-name.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-property.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-property.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-spread-props.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-spread-props.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-definitely-grouped.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-definitely-grouped.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-hidden-from-accessibility.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-hidden-from-accessibility.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-inside-focus-stop.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-inside-focus-stop.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-interactive.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-interactive.js +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-not-a-focus-stop.d.ts +0 -0
- /package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-not-a-focus-stop.js +0 -0
- /package/dist/plugins/{rules → react-native/rules}/test-id-default.d.ts +0 -0
- /package/dist/plugins/{rules → react-native/rules}/test-id-format.d.ts +0 -0
- /package/dist/plugins/{rules → react-native/rules}/test-id-from-props.d.ts +0 -0
- /package/dist/plugins/{rules → react-native/rules}/webview-allow-list.d.ts +0 -0
- /package/dist/plugins/{utils → shared}/comments.d.ts +0 -0
- /package/dist/plugins/{utils → shared}/comments.js +0 -0
- /package/dist/plugins/{utils → shared}/component-name.d.ts +0 -0
- /package/dist/plugins/{utils → shared}/component-name.js +0 -0
- /package/dist/plugins/{react-native-a11y/utils → shared}/create-rule.d.ts +0 -0
- /package/dist/plugins/{utils → shared}/create-rule.js +0 -0
- /package/dist/plugins/{utils → shared}/expressions.d.ts +0 -0
- /package/dist/plugins/{utils → shared}/expressions.js +0 -0
- /package/dist/plugins/{utils → shared}/types.d.ts +0 -0
- /package/dist/plugins/{utils → shared}/types.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
## [7.0.0](https://dev.azure.com/wearetriple/Triple%20-%20Webteam/_git/eslint-config-hypersolid/branchCompare?baseVersion=GTv6.0.0&targetVersion=GTv7.0.0) (2026-11-10)
|
|
2
|
+
|
|
3
|
+
### ⚠ BREAKING CHANGES
|
|
4
|
+
|
|
5
|
+
* **plugins:** the base-preset rules are @hypersolid-dev/base/<rule>
|
|
6
|
+
(comment-style, regex-pattern-const, undefined-check), not
|
|
7
|
+
@hypersolid-dev/core/<rule> as the previous commit stated.
|
|
8
|
+
* **plugins:** every in-house rule ID gains its domain. Update
|
|
9
|
+
eslint-disable comments and rule overrides:
|
|
10
|
+
- @hypersolid-dev/{comment-style,regex-pattern-const,undefined-check}
|
|
11
|
+
-> @hypersolid-dev/core/<rule>
|
|
12
|
+
- @hypersolid-dev/{boolean-guard,effect-takes-callback,jsdoc-for-props,
|
|
13
|
+
no-callback-payload,no-markup-variable,no-unnecessary-use-callback,
|
|
14
|
+
props-destructuring} -> @hypersolid-dev/react/<rule>
|
|
15
|
+
- @hypersolid-dev/{test-id-default,test-id-format,test-id-from-props,
|
|
16
|
+
webview-allow-list} -> @hypersolid-dev/react-native/<rule>
|
|
17
|
+
- @hypersolid-dev/react-native-a11y/<rule>
|
|
18
|
+
-> @hypersolid-dev/react-native/a11y/<rule>
|
|
19
|
+
|
|
20
|
+
### Code Refactoring
|
|
21
|
+
|
|
22
|
+
* **plugins:** group in-house rules by domain with prefixed rule IDs ([5c4917c](https://dev.azure.com/wearetriple/Triple%20-%20Webteam/_git/eslint-config-hypersolid/commit/5c4917c3714a51aeea907ad4e453300ee689d722)), closes [AB#5181](https://dev.azure.com/wearetriple/Triple%20-%20Webteam/_workitems/edit/5181)
|
|
23
|
+
* **plugins:** rename the core rule domain to base ([f13bfc4](https://dev.azure.com/wearetriple/Triple%20-%20Webteam/_git/eslint-config-hypersolid/commit/f13bfc492fa035c7034b4bcfc0a2839b41fcd1f4)), closes [AB#5181](https://dev.azure.com/wearetriple/Triple%20-%20Webteam/_workitems/edit/5181)
|
|
24
|
+
|
|
1
25
|
## [6.0.0](https://dev.azure.com/wearetriple/Triple%20-%20Webteam/_git/eslint-config-hypersolid/branchCompare?baseVersion=GTv5.0.0&targetVersion=GTv6.0.0) (2026-11-10)
|
|
2
26
|
|
|
3
27
|
### ⚠ BREAKING CHANGES
|
package/README.md
CHANGED
|
@@ -72,13 +72,13 @@ export default [...base({ tsconfigRootDir: import.meta.dirname }), ...reactNativ
|
|
|
72
72
|
|
|
73
73
|
`react-native` bans browser globals that don't exist on React Native (`document`, `localStorage`, …), and ignores `.expo`, `android`, `ios` and `expo-env.d.ts`.
|
|
74
74
|
|
|
75
|
-
It also enables the bundled `@hypersolid-dev/react-native
|
|
75
|
+
It also enables the bundled `@hypersolid-dev/react-native/a11y` rules, each citing the WCAG criterion it enforces ([rule docs](src/plugins/react-native/a11y/docs)). Custom components are matched by name, so tell a rule about your wrappers with `additionalComponents`. `require-modal-a11y-on-sheets` has no defaults and stays off until you list your sheet components:
|
|
76
76
|
|
|
77
77
|
```js
|
|
78
78
|
{
|
|
79
79
|
rules: {
|
|
80
|
-
'@hypersolid-dev/react-native
|
|
81
|
-
'@hypersolid-dev/react-native
|
|
80
|
+
'@hypersolid-dev/react-native/a11y/accessibility-label': ['error', { additionalComponents: ['IconButton'] }],
|
|
81
|
+
'@hypersolid-dev/react-native/a11y/require-modal-a11y-on-sheets': ['error', { additionalComponents: ['BottomSheet'] }],
|
|
82
82
|
},
|
|
83
83
|
}
|
|
84
84
|
```
|
|
@@ -111,20 +111,20 @@ This package ships its own plugin, namespaced `@hypersolid-dev`. The preset colu
|
|
|
111
111
|
|
|
112
112
|
| Rule | Preset | Enforces |
|
|
113
113
|
| --- | --- | --- |
|
|
114
|
-
| `@hypersolid-dev/props-destructuring` | react | A component destructures its props in the signature, so its props are readable there. Replaces `react/destructuring-assignment` (`always`, `destructureInSignature: always`), as `eslint-plugin-react` doesn't support ESLint 10. Checks PascalCase functions that return JSX, including those wrapped in `memo` and `forwardRef`. Bad: `const Card = (props: Props) => <h1>{props.title}</h1>`, or `const { title } = props` in the body. Good: `const Card = ({ title }: Props) => …`. When the props type is a union, such as a discriminated union, `props` may stay whole, because destructuring breaks narrowing (`if (props.kind === 'a') props.a`). |
|
|
115
|
-
| `@hypersolid-dev/undefined-check` | base | No `x !== undefined` (or `=== undefined`) where `undefined` is the type's only falsy value, so truthiness already decides. Bad: `if (user !== undefined)` with `user: User \| undefined`. Good: `if (user)`. Needs type information. |
|
|
116
|
-
| `@hypersolid-dev/regex-pattern-const` | base | A regex is a module-level `const <NAME>_PATTERN`, so it's read by its name. Bad: `/^\d+$/.test(id)` in a function. Off in tests. |
|
|
117
|
-
| `@hypersolid-dev/comment-style` | base | `//` and `/* */` comments are one row; longer prose is a `/** */` JSDoc block. Directive-only runs (`eslint-disable…`, `@ts-…`) are fine. Option `maxLength` caps each row (unset by default). |
|
|
118
|
-
| `@hypersolid-dev/jsdoc-for-props` | react | A comment on a type member is JSDoc, the form editors show at the call site. Bad: `// The title` above `title: string`. |
|
|
119
|
-
| `@hypersolid-dev/boolean-guard` | react | A JSX `&&` guard can't leak `0` or `''`, which React renders (and which crashes React Native outside `<Text>`). Bad: `{count && <Badge />}`. Good: `{count > 0 && <Badge />}`. Needs type information. Off in tests. |
|
|
120
|
-
| `@hypersolid-dev/no-markup-variable` | react | Styled JSX isn't stored in a variable in a component body; it's its own component, or written where it renders. Off in tests. |
|
|
121
|
-
| `@hypersolid-dev/effect-takes-callback` | react | A `use*Effect` hook takes the callback it runs as its first parameter, like `useEffect`. Off in tests. |
|
|
122
|
-
| `@hypersolid-dev/no-unnecessary-use-callback` | react | A `useCallback` with empty deps that captures nothing from render is a module-level function. Off in tests. |
|
|
123
|
-
| `@hypersolid-dev/no-callback-payload` | react | A component passes a callback prop straight through instead of calling it with a payload built from its own props; the caller binds the payload. Bad: `onPress={() => onSelect(id)}` where `id` is a prop. Off in tests. |
|
|
124
|
-
| `@hypersolid-dev/test-id-format` | react-native | A `testID` is lowercase kebab-case. Bad: `testID="Header.Title"`. |
|
|
125
|
-
| `@hypersolid-dev/test-id-from-props` | react-native | In `**/components/**/*.tsx`, a `testID` comes from the `testID` prop (suffixed for inner nodes), never a fixed string. Off in screens and tests. |
|
|
126
|
-
| `@hypersolid-dev/test-id-default` | react-native | In `**/components/**/*.tsx`, a `testID` prop defaults to the component's kebab-case name. Bad: `({ testID }: Props)` in `Card`. Good: `({ testID = 'card' }: Props)`. |
|
|
127
|
-
| `@hypersolid-dev/webview-allow-list` | react-native | A `react-native-webview` WebView sets `originWhitelist={['*']}` and filters every navigation in an always-present `onShouldStartLoadWithRequest`. |
|
|
114
|
+
| `@hypersolid-dev/react/props-destructuring` | react | A component destructures its props in the signature, so its props are readable there. Replaces `react/destructuring-assignment` (`always`, `destructureInSignature: always`), as `eslint-plugin-react` doesn't support ESLint 10. Checks PascalCase functions that return JSX, including those wrapped in `memo` and `forwardRef`. Bad: `const Card = (props: Props) => <h1>{props.title}</h1>`, or `const { title } = props` in the body. Good: `const Card = ({ title }: Props) => …`. When the props type is a union, such as a discriminated union, `props` may stay whole, because destructuring breaks narrowing (`if (props.kind === 'a') props.a`). |
|
|
115
|
+
| `@hypersolid-dev/base/undefined-check` | base | No `x !== undefined` (or `=== undefined`) where `undefined` is the type's only falsy value, so truthiness already decides. Bad: `if (user !== undefined)` with `user: User \| undefined`. Good: `if (user)`. Needs type information. |
|
|
116
|
+
| `@hypersolid-dev/base/regex-pattern-const` | base | A regex is a module-level `const <NAME>_PATTERN`, so it's read by its name. Bad: `/^\d+$/.test(id)` in a function. Off in tests. |
|
|
117
|
+
| `@hypersolid-dev/base/comment-style` | base | `//` and `/* */` comments are one row; longer prose is a `/** */` JSDoc block. Directive-only runs (`eslint-disable…`, `@ts-…`) are fine. Option `maxLength` caps each row (unset by default). |
|
|
118
|
+
| `@hypersolid-dev/react/jsdoc-for-props` | react | A comment on a type member is JSDoc, the form editors show at the call site. Bad: `// The title` above `title: string`. |
|
|
119
|
+
| `@hypersolid-dev/react/boolean-guard` | react | A JSX `&&` guard can't leak `0` or `''`, which React renders (and which crashes React Native outside `<Text>`). Bad: `{count && <Badge />}`. Good: `{count > 0 && <Badge />}`. Needs type information. Off in tests. |
|
|
120
|
+
| `@hypersolid-dev/react/no-markup-variable` | react | Styled JSX isn't stored in a variable in a component body; it's its own component, or written where it renders. Off in tests. |
|
|
121
|
+
| `@hypersolid-dev/react/effect-takes-callback` | react | A `use*Effect` hook takes the callback it runs as its first parameter, like `useEffect`. Off in tests. |
|
|
122
|
+
| `@hypersolid-dev/react/no-unnecessary-use-callback` | react | A `useCallback` with empty deps that captures nothing from render is a module-level function. Off in tests. |
|
|
123
|
+
| `@hypersolid-dev/react/no-callback-payload` | react | A component passes a callback prop straight through instead of calling it with a payload built from its own props; the caller binds the payload. Bad: `onPress={() => onSelect(id)}` where `id` is a prop. Off in tests. |
|
|
124
|
+
| `@hypersolid-dev/react-native/test-id-format` | react-native | A `testID` is lowercase kebab-case. Bad: `testID="Header.Title"`. |
|
|
125
|
+
| `@hypersolid-dev/react-native/test-id-from-props` | react-native | In `**/components/**/*.tsx`, a `testID` comes from the `testID` prop (suffixed for inner nodes), never a fixed string. Off in screens and tests. |
|
|
126
|
+
| `@hypersolid-dev/react-native/test-id-default` | react-native | In `**/components/**/*.tsx`, a `testID` prop defaults to the component's kebab-case name. Bad: `({ testID }: Props)` in `Card`. Good: `({ testID = 'card' }: Props)`. |
|
|
127
|
+
| `@hypersolid-dev/react-native/webview-allow-list` | react-native | A `react-native-webview` WebView sets `originWhitelist={['*']}` and filters every navigation in an always-present `onShouldStartLoadWithRequest`. |
|
|
128
128
|
|
|
129
129
|
## Overriding rules
|
|
130
130
|
|
|
@@ -186,14 +186,14 @@ export default [...base({ tsconfigRootDir: import.meta.dirname }), { files: TEST
|
|
|
186
186
|
|
|
187
187
|
### Component folders
|
|
188
188
|
|
|
189
|
-
`@hypersolid-dev/no-callback-payload` applies to every component, and the `test-id-*` rules to `**/components/**/*.tsx`. If your components live elsewhere, scope them to your own folders:
|
|
189
|
+
`@hypersolid-dev/react/no-callback-payload` applies to every component, and the `test-id-*` rules to `**/components/**/*.tsx`. If your components live elsewhere, scope them to your own folders:
|
|
190
190
|
|
|
191
191
|
```js
|
|
192
192
|
export default [
|
|
193
193
|
...base({ tsconfigRootDir: import.meta.dirname }),
|
|
194
194
|
...reactNative(),
|
|
195
|
-
{ files: ['**/components/**/*.tsx'], rules: { '@hypersolid-dev/test-id-default': 'off' } },
|
|
196
|
-
{ files: ['src/ui/**/*.tsx'], rules: { '@hypersolid-dev/test-id-default': 'error' } },
|
|
195
|
+
{ files: ['**/components/**/*.tsx'], rules: { '@hypersolid-dev/react-native/test-id-default': 'off' } },
|
|
196
|
+
{ files: ['src/ui/**/*.tsx'], rules: { '@hypersolid-dev/react-native/test-id-default': 'error' } },
|
|
197
197
|
];
|
|
198
198
|
```
|
|
199
199
|
|
package/dist/base.js
CHANGED
|
@@ -7,7 +7,7 @@ import preferArrowFunctions from 'eslint-plugin-prefer-arrow-functions';
|
|
|
7
7
|
import sonarjs from 'eslint-plugin-sonarjs';
|
|
8
8
|
import unicorn from 'eslint-plugin-unicorn';
|
|
9
9
|
import { configs as tsConfigs } from 'typescript-eslint';
|
|
10
|
-
import
|
|
10
|
+
import basePlugin from './plugins/base/index.js';
|
|
11
11
|
import { BASE_RESTRICTED_SYNTAX, BOOLEAN_NAME_OPTIONS, CODE_FILES, NAMING_CONVENTION, NUMBER_GLOBAL_RESTRICTIONS, raiseWarnings, scopeToCode, TEST_FILES, } from './shared.js';
|
|
12
12
|
// The glob the presets relax test-only rules for; reuse it for your own test overrides.
|
|
13
13
|
export { TEST_FILES } from './shared.js';
|
|
@@ -47,7 +47,7 @@ export default function base(options) {
|
|
|
47
47
|
},
|
|
48
48
|
},
|
|
49
49
|
plugins: {
|
|
50
|
-
'@hypersolid-dev':
|
|
50
|
+
'@hypersolid-dev/base': basePlugin,
|
|
51
51
|
'no-secrets': noSecrets,
|
|
52
52
|
'prefer-arrow-functions': preferArrowFunctions,
|
|
53
53
|
sonarjs,
|
|
@@ -153,11 +153,11 @@ export default function base(options) {
|
|
|
153
153
|
// One escape style for `${` in template literals. Bad: `` `\${a} $\{b}` ``.
|
|
154
154
|
'unicorn/consistent-template-literal-escape': 'error',
|
|
155
155
|
// `x !== undefined` where truthiness already decides. Bad: `if (user !== undefined)` with `user: User | undefined`.
|
|
156
|
-
'@hypersolid-dev/undefined-check': 'error',
|
|
156
|
+
'@hypersolid-dev/base/undefined-check': 'error',
|
|
157
157
|
// A regex is a module-level `*_PATTERN` constant, named for what it matches. Bad: `if (/^\d+$/.test(id))` in a function.
|
|
158
|
-
'@hypersolid-dev/regex-pattern-const': 'error',
|
|
158
|
+
'@hypersolid-dev/base/regex-pattern-const': 'error',
|
|
159
159
|
// `//` and `/* */` comments stay one row; longer prose is a `/** */` block. Bad: three `//` lines in a row.
|
|
160
|
-
'@hypersolid-dev/comment-style': 'error',
|
|
160
|
+
'@hypersolid-dev/base/comment-style': 'error',
|
|
161
161
|
// `undefined` as an argument is often required by the callee's signature. Bad: `let value = undefined`.
|
|
162
162
|
'unicorn/no-useless-undefined': ['error', { checkArguments: false }],
|
|
163
163
|
// Off: `.then()` chains are fine. Bad: `fetchUser().then(render)` reported.
|
|
@@ -215,7 +215,7 @@ export default function base(options) {
|
|
|
215
215
|
// Off: helpers inside a `describe` keep each suite readable on its own. Bad: `const render = () => …` in a `describe` reported.
|
|
216
216
|
'unicorn/consistent-function-scoping': 'off',
|
|
217
217
|
// Off: a test keeps its inline `toMatch(/…/)` literal. Bad: `expect(id).toMatch(/^\d+$/)` reported.
|
|
218
|
-
'@hypersolid-dev/regex-pattern-const': 'off',
|
|
218
|
+
'@hypersolid-dev/base/regex-pattern-const': 'off',
|
|
219
219
|
},
|
|
220
220
|
},
|
|
221
221
|
{
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import commentStyle from './rules/comment-style.js';
|
|
2
|
+
import regexPatternConst from './rules/regex-pattern-const.js';
|
|
3
|
+
import undefinedCheck from './rules/undefined-check.js';
|
|
4
|
+
/** ESLint reads a scoped rule ID up to its last slash as the plugin name. */
|
|
5
|
+
// One object per plugin name: flat config rejects two different objects under the same name.
|
|
6
|
+
const plugin = {
|
|
7
|
+
meta: { name: '@hypersolid-dev/base' },
|
|
8
|
+
// typescript-eslint's `RuleModule` and ESLint's `Rule.RuleModule` type the same runtime object differently.
|
|
9
|
+
rules: {
|
|
10
|
+
'comment-style': commentStyle,
|
|
11
|
+
'regex-pattern-const': regexPatternConst,
|
|
12
|
+
'undefined-check': undefinedCheck,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
export default plugin;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, AST_TOKEN_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
3
|
-
import { DIRECTIVE_PATTERN, isJsdoc, isRowStart } from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
|
+
import { DIRECTIVE_PATTERN, isJsdoc, isRowStart } from "../../shared/comments.js";
|
|
4
4
|
const REASON_PATTERN = /\s--\s([\s\S]*)$/;
|
|
5
5
|
const LINK_PATTERN = /\S*https?:\/\/\S*/g;
|
|
6
6
|
const JSDOC_ROW_PATTERN = /^\s*\*?\s?/;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
3
|
const NAME_PATTERN = /^[A-Z][A-Z0-9_]*_PATTERN$/;
|
|
4
4
|
/** A string literal, or a template (plain or `String.raw`) with nothing interpolated. */
|
|
5
5
|
const isStatic = (node) => (node.type === AST_NODE_TYPES.Literal && typeof node.value === "string") ||
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
3
|
-
import { isSameAsBangBang, undefinedComparison } from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
|
+
import { isSameAsBangBang, undefinedComparison } from "../../shared/types.js";
|
|
4
4
|
/** The slots where a value is being asked whether it is there. */
|
|
5
5
|
const isCondition = (node) => {
|
|
6
6
|
const { parent } = node;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import booleanGuard from './rules/boolean-guard.js';
|
|
2
|
+
import effectTakesCallback from './rules/effect-takes-callback.js';
|
|
3
|
+
import jsdocForProps from './rules/jsdoc-for-props.js';
|
|
4
|
+
import noCallbackPayload from './rules/no-callback-payload.js';
|
|
5
|
+
import noMarkupVariable from './rules/no-markup-variable.js';
|
|
6
|
+
import noUnnecessaryUseCallback from './rules/no-unnecessary-use-callback.js';
|
|
7
|
+
import propsDestructuring from './rules/props-destructuring.js';
|
|
8
|
+
/** ESLint reads a scoped rule ID up to its last slash as the plugin name. */
|
|
9
|
+
// One object per plugin name: flat config rejects two different objects under the same name.
|
|
10
|
+
const plugin = {
|
|
11
|
+
meta: { name: '@hypersolid-dev/react' },
|
|
12
|
+
// typescript-eslint's `RuleModule` and ESLint's `Rule.RuleModule` type the same runtime object differently.
|
|
13
|
+
rules: {
|
|
14
|
+
'boolean-guard': booleanGuard,
|
|
15
|
+
'effect-takes-callback': effectTakesCallback,
|
|
16
|
+
'jsdoc-for-props': jsdocForProps,
|
|
17
|
+
'no-callback-payload': noCallbackPayload,
|
|
18
|
+
'no-markup-variable': noMarkupVariable,
|
|
19
|
+
'no-unnecessary-use-callback': noUnnecessaryUseCallback,
|
|
20
|
+
'props-destructuring': propsDestructuring,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export default plugin;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
2
2
|
import ts, { TypeFlags } from "typescript";
|
|
3
|
-
import createRule from "
|
|
4
|
-
import { isSameAsBangBang, undefinedComparison } from "
|
|
3
|
+
import createRule from "../../shared/create-rule.js";
|
|
4
|
+
import { isSameAsBangBang, undefinedComparison } from "../../shared/types.js";
|
|
5
5
|
/** React draws these; every other falsy value renders as nothing. */
|
|
6
6
|
const RENDERS_WHEN_FALSY = TypeFlags.NumberLike | TypeFlags.StringLike | TypeFlags.BigIntLike;
|
|
7
7
|
/** `any` and `unknown` could be anything, so they are treated as leaking. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
2
|
import ts, { TypeFlags } from "typescript";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../shared/create-rule.js";
|
|
4
4
|
const EFFECT_HOOK_PATTERN = /^use[A-Z]\w*Effect$/;
|
|
5
5
|
const NOTHING = TypeFlags.Undefined | TypeFlags.Null | TypeFlags.Void;
|
|
6
6
|
const ABSENT = new Set(["TSUndefinedKeyword", "TSNullKeyword", "TSVoidKeyword"]);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_TOKEN_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
3
|
-
import { DIRECTIVE_PATTERN, isJsdoc, isRowStart } from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
|
+
import { DIRECTIVE_PATTERN, isJsdoc, isRowStart } from "../../shared/comments.js";
|
|
4
4
|
/**
|
|
5
5
|
* A comment on a type member is a JSDoc block, the only form an editor shows when the member is hovered elsewhere.
|
|
6
6
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
3
|
-
import { componentName, isWrapperCall } from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
|
+
import { componentName, isWrapperCall } from "../../shared/component-name.js";
|
|
4
4
|
const CALLBACK_PATTERN = /^on[A-Z]/;
|
|
5
5
|
/** Adds each identifier an object pattern binds to `props`, and its rest binding to `objects` too. */
|
|
6
6
|
const addPatternBindings = (pattern, props, objects) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
3
|
-
import { componentName } from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
|
+
import { componentName } from "../../shared/component-name.js";
|
|
4
4
|
/** The JSX a declarator's value draws: itself, or a branch of a ternary or `&&`. */
|
|
5
5
|
const drawnJsx = (init) => {
|
|
6
6
|
if (!init)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, TSESLint } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../shared/create-rule.js";
|
|
3
3
|
const HAZARD_NAMES = new Set(["arguments", "eval"]);
|
|
4
4
|
/** The import specifier a name resolves to, when it is a value import from `react`. */
|
|
5
5
|
const reactImport = (sourceCode, identifier) => {
|
|
@@ -43,7 +43,7 @@ const rules = {
|
|
|
43
43
|
* before Triple became Hypersolid. Rule docs live in ./docs.
|
|
44
44
|
*/
|
|
45
45
|
const plugin = {
|
|
46
|
-
meta: { name: "@hypersolid-dev/react-native
|
|
46
|
+
meta: { name: "@hypersolid-dev/react-native/a11y" },
|
|
47
47
|
rules,
|
|
48
48
|
};
|
|
49
49
|
// typescript-eslint rule types are stricter than ESLint's `Plugin` type and not assignable to it; the runtime shape is the same.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
import getProperty from "../utils/get-property.js";
|
|
4
4
|
import hasSpreadProps from "../utils/has-spread-props.js";
|
|
5
5
|
/** Names the platforms already describe to the user. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TOUCHABLES } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getAmountOfTextChildren from "../utils/get-amount-of-text-children.js";
|
|
5
5
|
import getComponents from "../utils/get-components.js";
|
|
6
6
|
import getElementName from "../utils/get-element-name.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IMAGES, INPUTS, TOUCHABLES } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getAmountOfTextChildren from "../utils/get-amount-of-text-children.js";
|
|
5
5
|
import getComponents from "../utils/get-components.js";
|
|
6
6
|
import getElementName from "../utils/get-element-name.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IMAGES, TOUCHABLES } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getComponents from "../utils/get-components.js";
|
|
5
5
|
import getElementName from "../utils/get-element-name.js";
|
|
6
6
|
import hasProperty from "../utils/has-property.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
import getProperty from "../utils/get-property.js";
|
|
4
4
|
const keysOf = (expression) => expression.properties.flatMap((property) => property.type === AST_NODE_TYPES.Property &&
|
|
5
5
|
property.key.type === AST_NODE_TYPES.Identifier
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/adjustable-needs-value.js
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { VALUE_ALIAS_KEYS } from "../constants/accessibility-props.js";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
import getLiteralPropertyValue from "../utils/get-literal-property-value.js";
|
|
4
4
|
import hasProperty from "../utils/has-property.js";
|
|
5
5
|
import hasSpreadProps from "../utils/has-spread-props.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
import getProperty from "../utils/get-property.js";
|
|
4
4
|
const LIVE_REGION_PROPS = ["accessibilityLiveRegion", "aria-live"];
|
|
5
5
|
const FUNCTION_TYPES = new Set([
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TEXT_INPUTS } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getComponents from "../utils/get-components.js";
|
|
5
5
|
import getElementName from "../utils/get-element-name.js";
|
|
6
6
|
import getLiteralPropertyValue from "../utils/get-literal-property-value.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
2
|
import { ALIAS_TO_LEGACY, STATE_ALIAS_KEYS, VALUE_ALIAS_KEYS, } from "../constants/accessibility-props.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getProperty from "../utils/get-property.js";
|
|
5
5
|
/**
|
|
6
6
|
* Both spellings map to the same native behaviour and only one of them reaches
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
const noDeprecatedAccessibilityFocus = createRule({
|
|
4
4
|
name: "no-deprecated-accessibility-focus",
|
|
5
5
|
meta: {
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-dropped-aria-on-text.js
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ARIA_DROPPED_ON_TEXT } from "../constants/accessibility-props.js";
|
|
2
2
|
import { TEXTS } from "../constants/react-native-components.js";
|
|
3
3
|
import schemaProperties from "../constants/schema-properties.js";
|
|
4
|
-
import createRule from "
|
|
4
|
+
import createRule from "../../../shared/create-rule.js";
|
|
5
5
|
import getComponents from "../utils/get-components.js";
|
|
6
6
|
import getElementName from "../utils/get-element-name.js";
|
|
7
7
|
import getProperty from "../utils/get-property.js";
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-font-scaling-disabled.js
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import createRule from "
|
|
1
|
+
import createRule from "../../../shared/create-rule.js";
|
|
2
2
|
import getLiteralPropertyValue from "../utils/get-literal-property-value.js";
|
|
3
3
|
import getProperty from "../utils/get-property.js";
|
|
4
4
|
/** WCAG 1.4.4 asks for text to resize up to 200%. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IMAGES, VIEWS } from "../constants/react-native-components.js";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
import getElementName from "../utils/get-element-name.js";
|
|
4
4
|
import getLiteralPropertyValue from "../utils/get-literal-property-value.js";
|
|
5
5
|
import getProperty from "../utils/get-property.js";
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-invalid-accessibility-state.js
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ASTUtils, AST_NODE_TYPES, } from "@typescript-eslint/utils";
|
|
2
2
|
import { ACCESSIBILITY_STATE_KEYS } from "../constants/accessibility-state.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getProperty from "../utils/get-property.js";
|
|
5
5
|
/** `{ … } as const` and `{ … } satisfies T` are still that object. */
|
|
6
6
|
const unwrap = (node) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TOUCHABLES } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getComponents from "../utils/get-components.js";
|
|
5
5
|
import getElementName from "../utils/get-element-name.js";
|
|
6
6
|
import getJsxDescendants from "../utils/get-jsx-descendants.js";
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-press-in-activation.js
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TOUCHABLES } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getComponents from "../utils/get-components.js";
|
|
5
5
|
import getElementName from "../utils/get-element-name.js";
|
|
6
6
|
import getProperty from "../utils/get-property.js";
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-unnamed-interactive.js
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NAME_PROPS } from "../constants/interactive.js";
|
|
2
2
|
import { IMAGES, INPUTS, TEXTS, TOUCHABLES, } from "../constants/react-native-components.js";
|
|
3
3
|
import schemaProperties from "../constants/schema-properties.js";
|
|
4
|
-
import createRule from "
|
|
4
|
+
import createRule from "../../../shared/create-rule.js";
|
|
5
5
|
import getAmountOfTextChildren from "../utils/get-amount-of-text-children.js";
|
|
6
6
|
import getComponents from "../utils/get-components.js";
|
|
7
7
|
import getElementName from "../utils/get-element-name.js";
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/require-invert-colors-opt-out.js
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IMAGES } from "../constants/react-native-components.js";
|
|
2
2
|
import schemaProperties from "../constants/schema-properties.js";
|
|
3
|
-
import createRule from "
|
|
3
|
+
import createRule from "../../../shared/create-rule.js";
|
|
4
4
|
import getComponents from "../utils/get-components.js";
|
|
5
5
|
import getElementName from "../utils/get-element-name.js";
|
|
6
6
|
import hasProperty from "../utils/has-property.js";
|
package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/require-modal-a11y-on-sheets.js
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import schemaProperties from "../constants/schema-properties.js";
|
|
2
|
-
import createRule from "
|
|
2
|
+
import createRule from "../../../shared/create-rule.js";
|
|
3
3
|
import getComponents from "../utils/get-components.js";
|
|
4
4
|
import getElementName from "../utils/get-element-name.js";
|
|
5
5
|
import hasProperty from "../utils/has-property.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import testIdDefault from './rules/test-id-default.js';
|
|
2
|
+
import testIdFormat from './rules/test-id-format.js';
|
|
3
|
+
import testIdFromProps from './rules/test-id-from-props.js';
|
|
4
|
+
import webviewAllowList from './rules/webview-allow-list.js';
|
|
5
|
+
/** ESLint reads a scoped rule ID up to its last slash as the plugin name. */
|
|
6
|
+
// One object per plugin name: flat config rejects two different objects under the same name.
|
|
7
|
+
const plugin = {
|
|
8
|
+
meta: { name: '@hypersolid-dev/react-native' },
|
|
9
|
+
// typescript-eslint's `RuleModule` and ESLint's `Rule.RuleModule` type the same runtime object differently.
|
|
10
|
+
rules: {
|
|
11
|
+
'test-id-default': testIdDefault,
|
|
12
|
+
'test-id-format': testIdFormat,
|
|
13
|
+
'test-id-from-props': testIdFromProps,
|
|
14
|
+
'webview-allow-list': webviewAllowList,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export default plugin;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
3
|
-
import createRule from '
|
|
3
|
+
import createRule from '../../shared/create-rule.js';
|
|
4
4
|
/**
|
|
5
5
|
* A component's `testID` prop defaults to the component's own name, kebab-cased.
|
|
6
6
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
-
import createRule from '
|
|
3
|
-
import { leavesOf } from '
|
|
2
|
+
import createRule from '../../shared/create-rule.js';
|
|
3
|
+
import { leavesOf } from '../../shared/expressions.js';
|
|
4
4
|
/**
|
|
5
5
|
* A `testID` written out in full is lowercase kebab-case: `crest`,
|
|
6
6
|
* `vote-input`, `top-scorers-card-home-crest`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
-
import createRule from '
|
|
3
|
-
import { leavesOf } from '
|
|
2
|
+
import createRule from '../../shared/create-rule.js';
|
|
3
|
+
import { leavesOf } from '../../shared/expressions.js';
|
|
4
4
|
/**
|
|
5
5
|
* A component's `testID` comes from its props, never a string it writes itself.
|
|
6
6
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, TSESLint } from '@typescript-eslint/utils';
|
|
2
|
-
import createRule from '
|
|
3
|
-
import { unwrap } from '
|
|
2
|
+
import createRule from '../../shared/create-rule.js';
|
|
3
|
+
import { unwrap } from '../../shared/expressions.js';
|
|
4
4
|
/**
|
|
5
5
|
* A `react-native-webview` `WebView` sends every navigation through its
|
|
6
6
|
* `onShouldStartLoadWithRequest`, so that handler is the allow-list.
|
package/dist/react-native.js
CHANGED
|
@@ -4,9 +4,10 @@ import { createTypeScriptImportResolver } from 'eslint-import-resolver-typescrip
|
|
|
4
4
|
import { createNodeResolver } from 'eslint-plugin-import-x';
|
|
5
5
|
import globals from 'globals';
|
|
6
6
|
import noSecrets from 'eslint-plugin-no-secrets';
|
|
7
|
-
import reactNativeA11y from './plugins/react-native
|
|
7
|
+
import reactNativeA11y from './plugins/react-native/a11y/index.js';
|
|
8
|
+
import reactNativePlugin from './plugins/react-native/index.js';
|
|
8
9
|
import { CODE_FILES, NUMBER_GLOBAL_RESTRICTIONS, raiseWarnings, REACT_BOOLEAN_NAME_OPTIONS, REACT_RESTRICTED_SYNTAX, reactConfigs, TEST_FILES, } from './shared.js';
|
|
9
|
-
const A11Y = '@hypersolid-dev/react-native
|
|
10
|
+
const A11Y = '@hypersolid-dev/react-native/a11y';
|
|
10
11
|
/**
|
|
11
12
|
* Derived instead of hardcoded: the frozen `confusing-browser-globals` list (last released 2021) misses `document`,
|
|
12
13
|
* `localStorage` and `getComputedStyle`, and bans `self`, which React Native defines. `globals` is maintained,
|
|
@@ -45,7 +46,7 @@ export default function reactNative() {
|
|
|
45
46
|
name: '@hypersolid-dev/react-native',
|
|
46
47
|
files: CODE_FILES,
|
|
47
48
|
// eslint-plugin-expo is typed with typescript-eslint's RuleModule, which ESLint's Plugin type does not accept.
|
|
48
|
-
plugins: { expo: expo, 'no-secrets': noSecrets },
|
|
49
|
+
plugins: { '@hypersolid-dev/react-native': reactNativePlugin, expo: expo, 'no-secrets': noSecrets },
|
|
49
50
|
settings: {
|
|
50
51
|
'import-x/resolver-next': [
|
|
51
52
|
createTypeScriptImportResolver({ extensions: RESOLVE_EXTENSIONS }),
|
|
@@ -136,9 +137,9 @@ export default function reactNative() {
|
|
|
136
137
|
},
|
|
137
138
|
],
|
|
138
139
|
// `testID` is lowercase kebab-case, so test selectors match exactly. Bad: `testID="Header.Title"`.
|
|
139
|
-
'@hypersolid-dev/test-id-format': 'error',
|
|
140
|
+
'@hypersolid-dev/react-native/test-id-format': 'error',
|
|
140
141
|
// A WebView allows every origin and filters each navigation in `onShouldStartLoadWithRequest`. Bad: `<WebView source={{ uri }} />`.
|
|
141
|
-
'@hypersolid-dev/webview-allow-list': 'error',
|
|
142
|
+
'@hypersolid-dev/react-native/webview-allow-list': 'error',
|
|
142
143
|
},
|
|
143
144
|
},
|
|
144
145
|
{
|
|
@@ -148,9 +149,9 @@ export default function reactNative() {
|
|
|
148
149
|
ignores: TEST_FILES,
|
|
149
150
|
rules: {
|
|
150
151
|
// A component's `testID` comes from its props, so two instances stay apart. Bad: `<View testID="card" />` inside `Card`.
|
|
151
|
-
'@hypersolid-dev/test-id-from-props': 'error',
|
|
152
|
+
'@hypersolid-dev/react-native/test-id-from-props': 'error',
|
|
152
153
|
// The `testID` prop defaults to the component's kebab-case name. Bad: `({ testID }: Props)` in `Card` (use `testID = 'card'`).
|
|
153
|
-
'@hypersolid-dev/test-id-default': 'error',
|
|
154
|
+
'@hypersolid-dev/react-native/test-id-default': 'error',
|
|
154
155
|
},
|
|
155
156
|
},
|
|
156
157
|
{
|
|
@@ -198,7 +199,7 @@ export default function reactNative() {
|
|
|
198
199
|
},
|
|
199
200
|
},
|
|
200
201
|
{
|
|
201
|
-
// React Native accessibility, each rule citing its WCAG criterion. Docs: src/plugins/react-native
|
|
202
|
+
// React Native accessibility, each rule citing its WCAG criterion. Docs: src/plugins/react-native/a11y/docs.
|
|
202
203
|
name: '@hypersolid-dev/react-native/a11y',
|
|
203
204
|
files: CODE_FILES,
|
|
204
205
|
plugins: { [A11Y]: reactNativeA11y },
|
package/dist/shared.js
CHANGED
|
@@ -2,7 +2,7 @@ import eslintReact from '@eslint-react/eslint-plugin';
|
|
|
2
2
|
import reactDoctor from 'eslint-plugin-react-doctor';
|
|
3
3
|
import reactHooks from 'eslint-plugin-react-hooks';
|
|
4
4
|
import unicorn from 'eslint-plugin-unicorn';
|
|
5
|
-
import
|
|
5
|
+
import reactPlugin from './plugins/react/index.js';
|
|
6
6
|
export const CODE_FILES = ['**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}'];
|
|
7
7
|
// Tests, stories, mocks and test setup: each preset relaxes a few rules here that test doubles break by design.
|
|
8
8
|
export const TEST_FILES = [
|
|
@@ -79,7 +79,7 @@ export const reactConfigs = () => [
|
|
|
79
79
|
{
|
|
80
80
|
name: '@hypersolid-dev/react',
|
|
81
81
|
files: CODE_FILES,
|
|
82
|
-
plugins: { '@hypersolid-dev':
|
|
82
|
+
plugins: { '@hypersolid-dev/react': reactPlugin, unicorn },
|
|
83
83
|
languageOptions: { parserOptions: { ecmaFeatures: { jsx: true } } },
|
|
84
84
|
rules: {
|
|
85
85
|
// Off: react-hooks/exhaustive-deps reports it. Bad: `useEffect(() => log(id), [])` reported twice.
|
|
@@ -111,7 +111,7 @@ export const reactConfigs = () => [
|
|
|
111
111
|
// A new context value each render re-renders every consumer. Bad: `<Context value={{ user }}>`.
|
|
112
112
|
'@eslint-react/no-unstable-context-value': 'error',
|
|
113
113
|
// Props are readable from the component's signature; a union props type may keep `props`. Bad: `const Card = (props: Props) => <h1>{props.title}</h1>`.
|
|
114
|
-
'@hypersolid-dev/props-destructuring': 'error',
|
|
114
|
+
'@hypersolid-dev/react/props-destructuring': 'error',
|
|
115
115
|
// A boolean reads as a claim; hook and mock names are exempt. Bad: `const visible = true` (use `isVisible`).
|
|
116
116
|
'unicorn/consistent-boolean-name': ['error', REACT_BOOLEAN_NAME_OPTIONS],
|
|
117
117
|
// Base's empty catch and default specifiers, plus compiler opt-outs, hooks inside JSX and `React.useX`. Bad: `style={useAnimatedStyle(…)}`, `React.useState(0)`.
|
|
@@ -135,17 +135,17 @@ export const reactConfigs = () => [
|
|
|
135
135
|
// The same check for effects; plugin 7.1.1 ships it inert, so `environment` turns it on. Bad: `useEffect(() => log(id), [])`.
|
|
136
136
|
'react-hooks/exhaustive-effect-dependencies': ['error', { environment: { validateExhaustiveEffectDependencies: 'all' } }],
|
|
137
137
|
// `{count && <Badge />}` renders `0`, which crashes React Native outside `<Text>`. Bad: `{items.length && <List />}`.
|
|
138
|
-
'@hypersolid-dev/boolean-guard': 'error',
|
|
138
|
+
'@hypersolid-dev/react/boolean-guard': 'error',
|
|
139
139
|
// Styled JSX built in a component body is a component without a name. Bad: `const header = <View style={s.header}>…</View>`.
|
|
140
|
-
'@hypersolid-dev/no-markup-variable': 'error',
|
|
140
|
+
'@hypersolid-dev/react/no-markup-variable': 'error',
|
|
141
141
|
// A `use*Effect` hook takes its callback first, like `useEffect`. Bad: `useFocusEffect(deps, () => …)`.
|
|
142
|
-
'@hypersolid-dev/effect-takes-callback': 'error',
|
|
142
|
+
'@hypersolid-dev/react/effect-takes-callback': 'error',
|
|
143
143
|
// A `useCallback` with empty deps that captures nothing is a module-level function. Bad: `useCallback(() => track('open'), [])`.
|
|
144
|
-
'@hypersolid-dev/no-unnecessary-use-callback': 'error',
|
|
144
|
+
'@hypersolid-dev/react/no-unnecessary-use-callback': 'error',
|
|
145
145
|
// A component forwards the event; the caller builds the payload. Bad: `onPress={() => onSelect(item.id)}` inside `Row`.
|
|
146
|
-
'@hypersolid-dev/no-callback-payload': 'error',
|
|
146
|
+
'@hypersolid-dev/react/no-callback-payload': 'error',
|
|
147
147
|
// A comment on a type member is JSDoc, the form editors show. Bad: `// The title\ntitle: string` in a props type.
|
|
148
|
-
'@hypersolid-dev/jsdoc-for-props': 'error',
|
|
148
|
+
'@hypersolid-dev/react/jsdoc-for-props': 'error',
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
151
|
{
|
|
@@ -214,11 +214,11 @@ export const reactConfigs = () => [
|
|
|
214
214
|
files: TEST_FILES,
|
|
215
215
|
rules: {
|
|
216
216
|
// Off: tests build markup and callbacks inline by design. Bad: `const tree = <Row />` in a test reported.
|
|
217
|
-
'@hypersolid-dev/boolean-guard': 'off',
|
|
218
|
-
'@hypersolid-dev/no-markup-variable': 'off',
|
|
219
|
-
'@hypersolid-dev/effect-takes-callback': 'off',
|
|
220
|
-
'@hypersolid-dev/no-unnecessary-use-callback': 'off',
|
|
221
|
-
'@hypersolid-dev/no-callback-payload': 'off',
|
|
217
|
+
'@hypersolid-dev/react/boolean-guard': 'off',
|
|
218
|
+
'@hypersolid-dev/react/no-markup-variable': 'off',
|
|
219
|
+
'@hypersolid-dev/react/effect-takes-callback': 'off',
|
|
220
|
+
'@hypersolid-dev/react/no-unnecessary-use-callback': 'off',
|
|
221
|
+
'@hypersolid-dev/react/no-callback-payload': 'off',
|
|
222
222
|
// Off: a mocked hook keeps the `use` name of the hook it replaces. Bad: `const useUser = () => fakeUser` in a mock.
|
|
223
223
|
'@eslint-react/no-unnecessary-use-prefix': 'off',
|
|
224
224
|
},
|
package/package.json
CHANGED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import propsDestructuring from './props-destructuring.js';
|
|
2
|
-
import booleanGuard from './rules/boolean-guard.js';
|
|
3
|
-
import commentStyle from './rules/comment-style.js';
|
|
4
|
-
import effectTakesCallback from './rules/effect-takes-callback.js';
|
|
5
|
-
import jsdocForProps from './rules/jsdoc-for-props.js';
|
|
6
|
-
import noCallbackPayload from './rules/no-callback-payload.js';
|
|
7
|
-
import noMarkupVariable from './rules/no-markup-variable.js';
|
|
8
|
-
import noUnnecessaryUseCallback from './rules/no-unnecessary-use-callback.js';
|
|
9
|
-
import regexPatternConst from './rules/regex-pattern-const.js';
|
|
10
|
-
import testIdDefault from './rules/test-id-default.js';
|
|
11
|
-
import testIdFormat from './rules/test-id-format.js';
|
|
12
|
-
import testIdFromProps from './rules/test-id-from-props.js';
|
|
13
|
-
import undefinedCheck from './rules/undefined-check.js';
|
|
14
|
-
import webviewAllowList from './rules/webview-allow-list.js';
|
|
15
|
-
// One plugin object for every preset: flat config rejects two different objects under the same plugin name.
|
|
16
|
-
const plugin = {
|
|
17
|
-
meta: { name: '@hypersolid-dev/eslint-config' },
|
|
18
|
-
rules: {
|
|
19
|
-
...propsDestructuring.rules,
|
|
20
|
-
// typescript-eslint's `RuleModule` and ESLint's `Rule.RuleModule` type the same runtime object differently.
|
|
21
|
-
...Object.fromEntries(Object.entries({
|
|
22
|
-
'boolean-guard': booleanGuard,
|
|
23
|
-
'comment-style': commentStyle,
|
|
24
|
-
'effect-takes-callback': effectTakesCallback,
|
|
25
|
-
'jsdoc-for-props': jsdocForProps,
|
|
26
|
-
'no-callback-payload': noCallbackPayload,
|
|
27
|
-
'no-markup-variable': noMarkupVariable,
|
|
28
|
-
'no-unnecessary-use-callback': noUnnecessaryUseCallback,
|
|
29
|
-
'regex-pattern-const': regexPatternConst,
|
|
30
|
-
'test-id-default': testIdDefault,
|
|
31
|
-
'test-id-format': testIdFormat,
|
|
32
|
-
'test-id-from-props': testIdFromProps,
|
|
33
|
-
'undefined-check': undefinedCheck,
|
|
34
|
-
'webview-allow-list': webviewAllowList,
|
|
35
|
-
})),
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
export default plugin;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
-
declare const createRule: <Options extends readonly unknown[], MessageIds extends string>({ meta, name, ...rule }: Readonly<ESLintUtils.RuleWithMetaAndName<Options, MessageIds, unknown>>) => ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener> & {
|
|
3
|
-
name: string;
|
|
4
|
-
};
|
|
5
|
-
export default createRule;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-props.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-props.js
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-state.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/accessibility-state.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/react-native-components.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/react-native-components.js
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/schema-properties.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/constants/schema-properties.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/accessibility-label.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/adjustable-needs-value.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-dropped-aria-on-text.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-font-scaling-disabled.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-nested-focus-stops.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-press-in-activation.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/rules/no-unnamed-interactive.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-amount-of-text-children.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-amount-of-text-children.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-jsx-descendants.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-property-value.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-property-value.js
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-text-child.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/get-literal-text-child.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/has-accessible-name.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-definitely-grouped.d.ts
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-definitely-grouped.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-hidden-from-accessibility.js
RENAMED
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-inside-focus-stop.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/plugins/{react-native-a11y → react-native/a11y}/utils/is-not-a-focus-stop.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|