@elastic/eslint-plugin-eui 3.0.0 → 3.1.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/README.md +64 -1
- package/lib/cjs/index.js +3 -0
- package/lib/cjs/rules/a11y/no_nested_interactive_element.d.ts +3 -0
- package/lib/cjs/rules/a11y/no_nested_interactive_element.d.ts.map +1 -0
- package/lib/cjs/rules/a11y/no_nested_interactive_element.js +202 -0
- package/lib/cjs/rules/a11y/tooltip_no_interactive_content.d.ts.map +1 -1
- package/lib/cjs/rules/a11y/tooltip_no_interactive_content.js +32 -13
- package/lib/cjs/utils/constants.d.ts +42 -5
- package/lib/cjs/utils/constants.d.ts.map +1 -1
- package/lib/cjs/utils/constants.js +60 -7
- package/lib/cjs/utils/is_interactive_element.d.ts +23 -0
- package/lib/cjs/utils/is_interactive_element.d.ts.map +1 -0
- package/lib/cjs/utils/is_interactive_element.js +71 -0
- package/lib/cjs/utils/walk_jsx_children.d.ts +5 -0
- package/lib/cjs/utils/walk_jsx_children.d.ts.map +1 -1
- package/lib/cjs/utils/walk_jsx_children.js +8 -4
- package/lib/esm/index.js +3 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/rules/a11y/no_nested_interactive_element.d.ts +2 -0
- package/lib/esm/rules/a11y/no_nested_interactive_element.js +225 -0
- package/lib/esm/rules/a11y/no_nested_interactive_element.js.map +1 -0
- package/lib/esm/rules/a11y/tooltip_no_interactive_content.js +33 -22
- package/lib/esm/rules/a11y/tooltip_no_interactive_content.js.map +1 -1
- package/lib/esm/utils/constants.d.ts +42 -5
- package/lib/esm/utils/constants.js +75 -10
- package/lib/esm/utils/constants.js.map +1 -1
- package/lib/esm/utils/is_interactive_element.d.ts +22 -0
- package/lib/esm/utils/is_interactive_element.js +71 -0
- package/lib/esm/utils/is_interactive_element.js.map +1 -0
- package/lib/esm/utils/walk_jsx_children.d.ts +5 -0
- package/lib/esm/utils/walk_jsx_children.js +8 -4
- package/lib/esm/utils/walk_jsx_children.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Side Public License, v 1.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.I18N_TEXT_COMPONENTS = exports.CALLOUT_LAYOUT_CONTAINERS = exports.HTML_ACTION_ELEMENTS = exports.EUI_TEXT_COMPONENTS = exports.HTML_TEXT_ELEMENTS = exports.CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS = exports.INTERACTIVE_EUI_COMPONENTS = exports.NON_INTERACTIVE_HTML_TAGS = void 0;
|
|
10
|
+
exports.LEAF_INTERACTIVE_EUI_COMPONENTS = exports.I18N_TEXT_COMPONENTS = exports.CALLOUT_LAYOUT_CONTAINERS = exports.INTERACTIVE_HTML_ELEMENTS = exports.HTML_ACTION_ELEMENTS = exports.EUI_TEXT_COMPONENTS = exports.HTML_TEXT_ELEMENTS = exports.PRESENCE_INTERACTIVE_PROPS = exports.CONDITIONALLY_INTERACTIVE_HTML_ELEMENTS = exports.CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS = exports.INTERACTIVE_EUI_COMPONENTS = exports.NON_INTERACTIVE_HTML_TAGS = void 0;
|
|
11
11
|
/**
|
|
12
12
|
* A list of standard HTML tags that are considered **non-interactive** elements.
|
|
13
13
|
*
|
|
@@ -122,16 +122,46 @@ exports.INTERACTIVE_EUI_COMPONENTS = [
|
|
|
122
122
|
'EuiTreeView'
|
|
123
123
|
];
|
|
124
124
|
/**
|
|
125
|
-
* EUI components that
|
|
126
|
-
* Without
|
|
127
|
-
* so rules that need
|
|
128
|
-
*
|
|
125
|
+
* EUI components that render a focusable element only when given one of the
|
|
126
|
+
* listed props. Without them they render plain, non-focusable markup — a
|
|
127
|
+
* `<span>`, `<div>`, or `<li>` — so rules that need an unconditionally
|
|
128
|
+
* interactive element must check the props rather than the name alone.
|
|
129
|
+
*
|
|
130
|
+
* - `EuiBadge` / `EuiBetaBadge` render a `<span>` unless clickable.
|
|
131
|
+
* - `EuiCard` renders a plain panel; `selectable` also makes it clickable by
|
|
132
|
+
* rendering an `EuiCardSelect` button.
|
|
133
|
+
* - `EuiContextMenuItem` renders a `<div>` unless it has an action, and is a
|
|
134
|
+
* `<button>` when given `toolTipContent`.
|
|
135
|
+
* - `EuiHeaderLogo` renders an `<a>` without an `href` attribute, which is not
|
|
136
|
+
* focusable.
|
|
137
|
+
* - `EuiListGroupItem` renders an `<li>` unless it has an action.
|
|
129
138
|
*/
|
|
130
|
-
exports.CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS =
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
]
|
|
139
|
+
exports.CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS = {
|
|
140
|
+
EuiBadge: ['iconOnClick', 'onClick', 'href'],
|
|
141
|
+
EuiBetaBadge: ['tooltipContent', 'onClick', 'href'],
|
|
142
|
+
EuiCard: ['onClick', 'href', 'selectable'],
|
|
143
|
+
EuiContextMenuItem: ['onClick', 'href', 'toolTipContent'],
|
|
144
|
+
EuiHeaderLogo: ['href'],
|
|
145
|
+
EuiListGroupItem: ['onClick', 'href'],
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Native HTML elements that are focusable only when given one of the listed
|
|
149
|
+
* attributes. An `<a>` without `href` is not a link and is not focusable.
|
|
150
|
+
*/
|
|
151
|
+
exports.CONDITIONALLY_INTERACTIVE_HTML_ELEMENTS = {
|
|
152
|
+
a: ['href'],
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Conditional interactive props whose presence alone is enough to make the
|
|
156
|
+
* rendered element focusable, even when the statically-known value is `""`.
|
|
157
|
+
*
|
|
158
|
+
* Native anchors and `EuiHeaderLogo` both forward `href=""` to the DOM, which
|
|
159
|
+
* still creates a focusable same-document link.
|
|
160
|
+
*/
|
|
161
|
+
exports.PRESENCE_INTERACTIVE_PROPS = {
|
|
162
|
+
a: ['href'],
|
|
163
|
+
EuiHeaderLogo: ['href'],
|
|
164
|
+
};
|
|
135
165
|
exports.HTML_TEXT_ELEMENTS = new Set([
|
|
136
166
|
'p',
|
|
137
167
|
'span',
|
|
@@ -151,6 +181,14 @@ exports.EUI_TEXT_COMPONENTS = new Set([
|
|
|
151
181
|
'EuiHighlight',
|
|
152
182
|
]);
|
|
153
183
|
exports.HTML_ACTION_ELEMENTS = new Set(['button', 'a']);
|
|
184
|
+
/** Native HTML elements that are focusable and respond to user input. */
|
|
185
|
+
exports.INTERACTIVE_HTML_ELEMENTS = [
|
|
186
|
+
'a',
|
|
187
|
+
'button',
|
|
188
|
+
'input',
|
|
189
|
+
'select',
|
|
190
|
+
'textarea',
|
|
191
|
+
];
|
|
154
192
|
/**
|
|
155
193
|
* Transparent layout wrappers inside `EuiCallOut` children that the rule should
|
|
156
194
|
* traverse rather than treat as opaque custom components.
|
|
@@ -168,4 +206,31 @@ exports.CALLOUT_LAYOUT_CONTAINERS = new Set([
|
|
|
168
206
|
* Rules treat these the same as `HTML_TEXT_ELEMENTS` / `EUI_TEXT_COMPONENTS`.
|
|
169
207
|
*/
|
|
170
208
|
exports.I18N_TEXT_COMPONENTS = new Set(['FormattedMessage']);
|
|
209
|
+
/**
|
|
210
|
+
* EUI components that render their content **inside** a single focusable
|
|
211
|
+
* `<button>` or `<a>`.
|
|
212
|
+
*
|
|
213
|
+
* Nesting another interactive element in their content produces invalid HTML
|
|
214
|
+
* (e.g. `<button>` inside `<button>`) and leaves the inner control unreachable
|
|
215
|
+
* or ambiguous for keyboard and screen-reader users.
|
|
216
|
+
*
|
|
217
|
+
* This is deliberately narrower than `INTERACTIVE_EUI_COMPONENTS`, which also
|
|
218
|
+
* contains composite components (`EuiBasicTable`, `EuiSelectable`, `EuiSideNav`,
|
|
219
|
+
* …) whose entire purpose is to host controls.
|
|
220
|
+
*/
|
|
221
|
+
exports.LEAF_INTERACTIVE_EUI_COMPONENTS = [
|
|
222
|
+
'EuiButton',
|
|
223
|
+
'EuiButtonEmpty',
|
|
224
|
+
'EuiButtonIcon',
|
|
225
|
+
'EuiContextMenuItem',
|
|
226
|
+
'EuiFacetButton',
|
|
227
|
+
'EuiFilterButton',
|
|
228
|
+
'EuiHeaderLink',
|
|
229
|
+
'EuiHeaderSectionItemButton',
|
|
230
|
+
'EuiKeyPadMenuItem',
|
|
231
|
+
'EuiLink',
|
|
232
|
+
'EuiListGroupItem',
|
|
233
|
+
'EuiStepHorizontal',
|
|
234
|
+
'EuiTab',
|
|
235
|
+
];
|
|
171
236
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH;;;;;;;;;;;;GAYG;AACU,QAAA,yBAAyB,GAAG;IACvC,KAAK;IACL,MAAM;IACN,GAAG;IACH,SAAS;IACT,OAAO;IACP,YAAY;IACZ,IAAI;IACJ,SAAS;IACT,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,YAAY;IACZ,QAAQ;IACR,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,KAAK;IACL,IAAI;IACJ,KAAK;IACL,SAAS;IACT,OAAO;IACP,QAAQ;IACR,KAAK;IACL,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,IAAI;CACL,CAAC;AAEF;;;;;;;;;;GAUG;AACU,QAAA,0BAA0B,GAAG;IACxC,UAAU;IACV,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,oBAAoB;IACpB,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,qBAAqB;IACrB,qBAAqB;IACrB,eAAe;IACf,eAAe;IACf,4BAA4B;IAC5B,kBAAkB;IAClB,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,eAAe;IACf,sBAAsB;IACtB,UAAU;IACV,UAAU;IACV,WAAW;IACX,eAAe;IACf,YAAY;IACZ,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;CACd,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TSESTree } from '@typescript-eslint/utils';
|
|
2
|
+
/**
|
|
3
|
+
* Whether any of `propNames` is present on the element with a statically
|
|
4
|
+
* non-empty value. Dynamic values (`prop={maybe}`) count as present, since
|
|
5
|
+
* their runtime value is unknown.
|
|
6
|
+
*/
|
|
7
|
+
export declare function hasAnyProp(openingElement: TSESTree.JSXOpeningElement, propNames: string[], presenceOnlyProps?: Set<string>): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Whether an element has a prop that makes it respond to user input
|
|
10
|
+
* (`onClick` or `href`).
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasInteractivityProp(openingElement: TSESTree.JSXOpeningElement): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether a JSX element renders a focusable control.
|
|
15
|
+
*
|
|
16
|
+
* Native interactive HTML elements and unconditionally interactive EUI
|
|
17
|
+
* components always qualify. Everything in
|
|
18
|
+
* `CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS` and
|
|
19
|
+
* `CONDITIONALLY_INTERACTIVE_HTML_ELEMENTS` — `EuiBadge`, `EuiListGroupItem`,
|
|
20
|
+
* a bare `<a>`, … — qualifies only when given a prop that makes it focusable.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isInteractiveElement(element: TSESTree.JSXElement): boolean;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
4
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
5
|
+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
|
6
|
+
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
|
7
|
+
* Side Public License, v 1.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.hasAnyProp = hasAnyProp;
|
|
11
|
+
exports.hasInteractivityProp = hasInteractivityProp;
|
|
12
|
+
exports.isInteractiveElement = isInteractiveElement;
|
|
13
|
+
const constants_1 = require("./constants");
|
|
14
|
+
const get_element_name_1 = require("./get_element_name");
|
|
15
|
+
const has_meaningful_attr_1 = require("./has_meaningful_attr");
|
|
16
|
+
/** Elements focusable only when given one of the listed props. */
|
|
17
|
+
const CONDITIONALLY_INTERACTIVE = {
|
|
18
|
+
...constants_1.CONDITIONALLY_INTERACTIVE_HTML_ELEMENTS,
|
|
19
|
+
...constants_1.CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS,
|
|
20
|
+
};
|
|
21
|
+
/** Elements that are focusable regardless of the props they receive. */
|
|
22
|
+
const ALWAYS_INTERACTIVE = new Set([...constants_1.INTERACTIVE_HTML_ELEMENTS, ...constants_1.INTERACTIVE_EUI_COMPONENTS].filter((name) => !CONDITIONALLY_INTERACTIVE[name]));
|
|
23
|
+
/** Props that make an element respond to user input. */
|
|
24
|
+
const INTERACTIVITY_PROPS = ['onClick', 'href'];
|
|
25
|
+
/**
|
|
26
|
+
* Whether any of `propNames` is present on the element with a statically
|
|
27
|
+
* non-empty value. Dynamic values (`prop={maybe}`) count as present, since
|
|
28
|
+
* their runtime value is unknown.
|
|
29
|
+
*/
|
|
30
|
+
function hasAnyProp(openingElement, propNames, presenceOnlyProps = new Set()) {
|
|
31
|
+
return propNames.some((prop) => {
|
|
32
|
+
const attr = openingElement.attributes.find((attr) => attr.type === 'JSXAttribute' &&
|
|
33
|
+
attr.name.type === 'JSXIdentifier' &&
|
|
34
|
+
attr.name.name === prop);
|
|
35
|
+
if (!attr)
|
|
36
|
+
return false;
|
|
37
|
+
return ((0, has_meaningful_attr_1.hasMeaningfulAttr)(openingElement, prop) ||
|
|
38
|
+
(attr.value?.type === 'Literal' && attr.value.value === '') ||
|
|
39
|
+
(attr.value?.type === 'JSXExpressionContainer' &&
|
|
40
|
+
attr.value.expression.type === 'Literal' &&
|
|
41
|
+
attr.value.expression.value === ''));
|
|
42
|
+
return (0, has_meaningful_attr_1.hasMeaningfulAttr)(openingElement, prop);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether an element has a prop that makes it respond to user input
|
|
47
|
+
* (`onClick` or `href`).
|
|
48
|
+
*/
|
|
49
|
+
function hasInteractivityProp(openingElement) {
|
|
50
|
+
return hasAnyProp(openingElement, INTERACTIVITY_PROPS);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether a JSX element renders a focusable control.
|
|
54
|
+
*
|
|
55
|
+
* Native interactive HTML elements and unconditionally interactive EUI
|
|
56
|
+
* components always qualify. Everything in
|
|
57
|
+
* `CONDITIONALLY_INTERACTIVE_EUI_COMPONENTS` and
|
|
58
|
+
* `CONDITIONALLY_INTERACTIVE_HTML_ELEMENTS` — `EuiBadge`, `EuiListGroupItem`,
|
|
59
|
+
* a bare `<a>`, … — qualifies only when given a prop that makes it focusable.
|
|
60
|
+
*/
|
|
61
|
+
function isInteractiveElement(element) {
|
|
62
|
+
const name = (0, get_element_name_1.getElementName)(element.openingElement);
|
|
63
|
+
if (!name)
|
|
64
|
+
return false;
|
|
65
|
+
const conditionalProps = CONDITIONALLY_INTERACTIVE[name];
|
|
66
|
+
if (conditionalProps) {
|
|
67
|
+
return hasAnyProp(element.openingElement, conditionalProps, new Set(constants_1.PRESENCE_INTERACTIVE_PROPS[name] ?? []));
|
|
68
|
+
}
|
|
69
|
+
return ALWAYS_INTERACTIVE.has(name);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=is_interactive_element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is_interactive_element.js","sourceRoot":"","sources":["../../../src/utils/is_interactive_element.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAkCH,gCAuBC;AAMD,oDAIC;AAWD,oDAgBC;AA3FD,2CAMqB;AACrB,yDAAoD;AACpD,+DAA0D;AAE1D,kEAAkE;AAClE,MAAM,yBAAyB,GAA6B;IAC1D,GAAG,mDAAuC;IAC1C,GAAG,oDAAwC;CAC5C,CAAC;AAEF,wEAAwE;AACxE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,CAAC,GAAG,qCAAyB,EAAE,GAAG,sCAA0B,CAAC,CAAC,MAAM,CAClE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAC3C,CACF,CAAC;AAEF,wDAAwD;AACxD,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEhD;;;;GAIG;AACH,SAAgB,UAAU,CACxB,cAA0C,EAC1C,SAAmB,EACnB,oBAAoB,IAAI,GAAG,EAAU;IAErC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CACzC,CAAC,IAAI,EAAiC,EAAE,CACtC,IAAI,CAAC,IAAI,KAAK,cAAc;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe;YAClC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAC1B,CAAC;QACF,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,CACL,IAAA,uCAAiB,EAAC,cAAc,EAAE,IAAI,CAAC;YACvC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3D,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,wBAAwB;gBAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS;gBACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC,CACtC,CAAC;QAEJ,OAAO,IAAA,uCAAiB,EAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAClC,cAA0C;IAE1C,OAAO,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,OAA4B;IAC/D,MAAM,IAAI,GAAG,IAAA,iCAAc,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAEzD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,UAAU,CACf,OAAO,CAAC,cAAc,EACtB,gBAAgB,EAChB,IAAI,GAAG,CAAC,sCAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAChD,CAAC;IACJ,CAAC;IAED,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -20,10 +20,15 @@ import { type TSESTree, type TSESLint } from '@typescript-eslint/utils';
|
|
|
20
20
|
* element itself and recurses into its children instead. Use this to make
|
|
21
21
|
* layout wrappers or non-interactive shells transparent to the visitor.
|
|
22
22
|
*
|
|
23
|
+
* `options.getChildren` - when provided, returns the rendered content roots to
|
|
24
|
+
* recurse into for JSX elements skipped by `shouldSkip`. Defaults to
|
|
25
|
+
* `node.children`.
|
|
26
|
+
*
|
|
23
27
|
* `visit` is called for leaf nodes: JSXElement, JSXText, Literal,
|
|
24
28
|
* TemplateLiteral, MemberExpression.
|
|
25
29
|
*/
|
|
26
30
|
export declare function walkJsxChildren(node: TSESTree.Node, visit: (node: TSESTree.Node) => void, options?: {
|
|
27
31
|
sourceCode?: TSESLint.SourceCode;
|
|
28
32
|
shouldSkip?: (el: TSESTree.JSXElement) => boolean;
|
|
33
|
+
getChildren?: (el: TSESTree.JSXElement) => TSESTree.Node[] | undefined;
|
|
29
34
|
}): void;
|
|
@@ -91,8 +91,8 @@ function resolveLocalComponent(sourceCode, name, refNode) {
|
|
|
91
91
|
}
|
|
92
92
|
return null;
|
|
93
93
|
}
|
|
94
|
-
function walkJsxChild(node, visit, sourceCode, visited, shouldSkip) {
|
|
95
|
-
const walk = (n) => walkJsxChild(n, visit, sourceCode, visited, shouldSkip);
|
|
94
|
+
function walkJsxChild(node, visit, sourceCode, visited, shouldSkip, getChildren) {
|
|
95
|
+
const walk = (n) => walkJsxChild(n, visit, sourceCode, visited, shouldSkip, getChildren);
|
|
96
96
|
switch (node.type) {
|
|
97
97
|
case 'JSXElement': {
|
|
98
98
|
if ((0, is_fragment_1.isFragment)(node.openingElement)) {
|
|
@@ -112,7 +112,7 @@ function walkJsxChild(node, visit, sourceCode, visited, shouldSkip) {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
if (shouldSkip?.(node)) {
|
|
115
|
-
node.children.forEach(walk);
|
|
115
|
+
(getChildren?.(node) ?? node.children).forEach(walk);
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
118
|
visit(node);
|
|
@@ -204,10 +204,14 @@ function walkJsxChild(node, visit, sourceCode, visited, shouldSkip) {
|
|
|
204
204
|
* element itself and recurses into its children instead. Use this to make
|
|
205
205
|
* layout wrappers or non-interactive shells transparent to the visitor.
|
|
206
206
|
*
|
|
207
|
+
* `options.getChildren` - when provided, returns the rendered content roots to
|
|
208
|
+
* recurse into for JSX elements skipped by `shouldSkip`. Defaults to
|
|
209
|
+
* `node.children`.
|
|
210
|
+
*
|
|
207
211
|
* `visit` is called for leaf nodes: JSXElement, JSXText, Literal,
|
|
208
212
|
* TemplateLiteral, MemberExpression.
|
|
209
213
|
*/
|
|
210
214
|
function walkJsxChildren(node, visit, options = {}) {
|
|
211
|
-
walkJsxChild(node, visit, options.sourceCode, new Set(), options.shouldSkip);
|
|
215
|
+
walkJsxChild(node, visit, options.sourceCode, new Set(), options.shouldSkip, options.getChildren);
|
|
212
216
|
}
|
|
213
217
|
//# sourceMappingURL=walk_jsx_children.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk_jsx_children.js","sourceRoot":"","sources":["../../../src/utils/walk_jsx_children.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"walk_jsx_children.js","sourceRoot":"","sources":["../../../src/utils/walk_jsx_children.ts"],"names":[],"mappings":"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"}
|