Skip to content

Commit 03645af

Browse files
committed
[jsx-no-constructed-context-values] Update isJsxContext check to allow for JSXIdentifier ending with Provider
1 parent c8833f3 commit 03645af

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

lib/rules/jsx-no-constructed-context-values.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,15 @@ module.exports = {
143143
return {
144144
JSXOpeningElement(node) {
145145
const openingElementName = node.name;
146-
if (openingElementName.type !== 'JSXMemberExpression') {
147-
// Has no member
148-
return;
149-
}
150146

151-
const isJsxContext = openingElementName.property.name === 'Provider';
147+
// Consider an element a context provider if the name is either:
148+
// - identifier and ends with Provider (i.e. SomeContextProvider)
149+
// - member expression and has Provider as a property (i.e. SomeContext.Provider)
150+
const isJsxContext = (openingElementName.type === 'JSXMemberExpression'
151+
&& openingElementName.property.name === 'Provider')
152+
|| (openingElementName.type === 'JSXIdentifier'
153+
&& openingElementName.name.endsWith('Provider'));
154+
152155
if (!isJsxContext) {
153156
// Member is not Provider
154157
return;

tests/lib/rules/jsx-no-constructed-context-values.js

+17
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ ruleTester.run('react-no-constructed-context-values', rule, {
3333
{
3434
code: '<Context.Provider value={props}></Context.Provider>',
3535
},
36+
{
37+
code: '<ContextProvider value={props}></ContextProvider>',
38+
},
3639
{
3740
code: '<Context.Provider value={100}></Context.Provider>',
3841
},
@@ -155,6 +158,20 @@ ruleTester.run('react-no-constructed-context-values', rule, {
155158
},
156159
}],
157160
},
161+
{
162+
// Invalid because object construction creates a new identity
163+
// Duplicate of above test but using an identifier as the context provider name
164+
code: 'function Component() { const foo = {}; return (<ContextProvider value={foo}></ContextProvider>) }',
165+
errors: [{
166+
messageId: 'withIdentifierMsg',
167+
data: {
168+
variableName: 'foo',
169+
type: 'object',
170+
nodeLine: '1',
171+
usageLine: '1',
172+
},
173+
}],
174+
},
158175
{
159176
// Invalid because array construction creates a new identity
160177
code: 'function Component() { const foo = []; return (<Context.Provider value={foo}></Context.Provider>) }',

0 commit comments

Comments
 (0)