Skip to content

Commit 3be404e

Browse files
committed
Fix detection of ESM imports
1 parent 2262286 commit 3be404e

File tree

3 files changed

+51
-19
lines changed

3 files changed

+51
-19
lines changed

.changeset/young-carrots-sort.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'react-docgen': patch
3+
---
4+
5+
Fix detection of React.Children with ESM imports

packages/react-docgen/src/utils/__tests__/isReactChildrenElementCall-test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,42 @@ describe('isReactChildrenElementCall', () => {
2121

2222
expect(isReactChildrenElementCall(def)).toBe(true);
2323
});
24+
25+
test('React.Children.only without React', () => {
26+
const def = parse.expressionLast(`
27+
var Children = require("React").Children;
28+
Children.only(() => {});
29+
`);
30+
31+
expect(isReactChildrenElementCall(def)).toBe(true);
32+
});
33+
34+
test('React.Children.only with destructuring', () => {
35+
const def = parse.expressionLast(`
36+
var { Children } = require("React");
37+
Children.only(() => {});
38+
`);
39+
40+
expect(isReactChildrenElementCall(def)).toBe(true);
41+
});
42+
43+
test('React.Children.only with import', () => {
44+
const def = parse.expressionLast(`
45+
import React from 'react';
46+
React.Children.only(() => {});
47+
`);
48+
49+
expect(isReactChildrenElementCall(def)).toBe(true);
50+
});
51+
52+
test('React.Children.only with named import', () => {
53+
const def = parse.expressionLast(`
54+
import { Children } from 'react';
55+
Children.only(() => {});
56+
`);
57+
58+
expect(isReactChildrenElementCall(def)).toBe(true);
59+
});
2460
});
2561
describe('false', () => {
2662
test('not call expression', () => {
Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { NodePath } from '@babel/traverse';
2-
import isReactModuleName from './isReactModuleName.js';
3-
import resolveToModule from './resolveToModule.js';
42
import type { CallExpression } from '@babel/types';
3+
import isReactBuiltinReference from './isReactBuiltinReference.js';
54

65
/**
76
* Returns true if the expression is a function call of the form
@@ -16,24 +15,16 @@ export default function isReactChildrenElementCall(
1615

1716
const callee = path.get('callee');
1817

19-
if (
20-
!callee.isMemberExpression() ||
21-
(!callee.get('property').isIdentifier({ name: 'only' }) &&
22-
!callee.get('property').isIdentifier({ name: 'map' }))
23-
) {
24-
return false;
25-
}
26-
27-
const calleeObj = callee.get('object');
18+
if (callee.isMemberExpression()) {
19+
const calleeProperty = callee.get('property');
2820

29-
if (
30-
!calleeObj.isMemberExpression() ||
31-
!calleeObj.get('property').isIdentifier({ name: 'Children' })
32-
) {
33-
return false;
21+
if (
22+
calleeProperty.isIdentifier({ name: 'only' }) ||
23+
calleeProperty.isIdentifier({ name: 'map' })
24+
) {
25+
return isReactBuiltinReference(callee.get('object'), 'Children');
26+
}
3427
}
3528

36-
const module = resolveToModule(calleeObj);
37-
38-
return Boolean(module && isReactModuleName(module));
29+
return false;
3930
}

0 commit comments

Comments
 (0)