Skip to content

Commit c159844

Browse files
authored
fix: don't record signatures of local hooks, fixes #1412 (#1413)
1 parent 9ab2571 commit c159844

File tree

3 files changed

+225
-0
lines changed

3 files changed

+225
-0
lines changed

src/fresh/babel.js

+1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ export default function (babel) {
211211
key: fnHookCalls.map(call => call.name + '{' + call.key + '}').join('\n'),
212212
customHooks: fnHookCalls
213213
.filter(call => !isBuiltinHook(call.name))
214+
.filter(call => scope.parent.hasBinding(call.name))
214215
.map(call => t.cloneDeep(call.callee)),
215216
};
216217
}
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {useState} from "react";
2+
3+
function Component1() {
4+
function useRippleHandler() {}
5+
useRippleHandler();
6+
useRippleHandler();
7+
}
8+
9+
function Component2() {
10+
const useRippleHandler = () => {};
11+
useRippleHandler();
12+
useRippleHandler();
13+
}
14+
15+
function Component3() {
16+
const useRippleHandler = function () {};
17+
useRippleHandler();
18+
useRippleHandler();
19+
}
20+
21+
const useInnerHook = ({useHookFromProps}) => {
22+
const useHookBase = () => useState();
23+
const useHook = () => useState(useHookFromProps(useHookBase()));
24+
useHookFromProps();
25+
{
26+
// sub scope
27+
useHook();
28+
}
29+
};
30+
31+
const OnlyThisOneUsesExternalHook = () => {
32+
useInnerHook();
33+
useState();
34+
};
35+
36+
// check for "return ["

test/__snapshots__/babel.test.js.snap

+188
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,105 @@ function spread() {
13421342
})();"
13431343
`;
13441344

1345+
exports[`babel Targetting "es2015" tags potential React components local hooks.js 1`] = `
1346+
"\\"use strict\\";
1347+
1348+
var _react = require(\\"react\\");
1349+
1350+
(function () {
1351+
var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
1352+
enterModule && enterModule(module);
1353+
})();
1354+
1355+
var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
1356+
return a;
1357+
};
1358+
1359+
function Component1() {
1360+
function useRippleHandler() {}
1361+
useRippleHandler();
1362+
useRippleHandler();
1363+
}
1364+
1365+
__signature__(Component1, \\"useRippleHandler{}\\\\nuseRippleHandler{}\\");
1366+
1367+
function Component2() {
1368+
var useRippleHandler = function useRippleHandler() {};
1369+
useRippleHandler();
1370+
useRippleHandler();
1371+
}
1372+
1373+
__signature__(Component2, \\"useRippleHandler{}\\\\nuseRippleHandler{}\\");
1374+
1375+
function Component3() {
1376+
var useRippleHandler = function useRippleHandler() {};
1377+
useRippleHandler();
1378+
useRippleHandler();
1379+
}
1380+
1381+
__signature__(Component3, \\"useRippleHandler{}\\\\nuseRippleHandler{}\\");
1382+
1383+
var useInnerHook = function useInnerHook(_ref) {
1384+
var useHookFromProps = _ref.useHookFromProps;
1385+
1386+
var useHookBase = function useHookBase() {
1387+
return (0, _react.useState)();
1388+
};
1389+
1390+
__signature__(useHookBase, \\"useState{}\\");
1391+
1392+
var useHook = function useHook() {
1393+
return (0, _react.useState)(useHookFromProps(useHookBase()));
1394+
};
1395+
1396+
__signature__(useHook, \\"useState{(useHookFromProps(useHookBase()))}\\\\nuseHookFromProps{}\\\\nuseHookBase{}\\", function () {
1397+
return [useHookFromProps, useHookBase];
1398+
});
1399+
1400+
useHookFromProps();
1401+
{
1402+
// sub scope
1403+
useHook();
1404+
}
1405+
};
1406+
1407+
__signature__(useInnerHook, \\"useHookFromProps{}\\\\nuseHook{}\\");
1408+
1409+
var OnlyThisOneUsesExternalHook = function OnlyThisOneUsesExternalHook() {
1410+
useInnerHook();
1411+
(0, _react.useState)();
1412+
};
1413+
1414+
// check for \\"return [\\"
1415+
1416+
__signature__(OnlyThisOneUsesExternalHook, \\"useInnerHook{}\\\\nuseState{}\\", function () {
1417+
return [useInnerHook];
1418+
});
1419+
1420+
;
1421+
1422+
(function () {
1423+
var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
1424+
1425+
if (!reactHotLoader) {
1426+
return;
1427+
}
1428+
1429+
reactHotLoader.register(Component1, \\"Component1\\", __FILENAME__);
1430+
reactHotLoader.register(Component2, \\"Component2\\", __FILENAME__);
1431+
reactHotLoader.register(Component3, \\"Component3\\", __FILENAME__);
1432+
reactHotLoader.register(useInnerHook, \\"useInnerHook\\", __FILENAME__);
1433+
reactHotLoader.register(OnlyThisOneUsesExternalHook, \\"OnlyThisOneUsesExternalHook\\", __FILENAME__);
1434+
})();
1435+
1436+
;
1437+
1438+
(function () {
1439+
var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
1440+
leaveModule && leaveModule(module);
1441+
})();"
1442+
`;
1443+
13451444
exports[`babel Targetting "es2015" tags potential React components name clash.js 1`] = `
13461445
"\\"use strict\\";
13471446
@@ -2442,6 +2541,95 @@ function spread(...args) {
24422541
})();"
24432542
`;
24442543
2544+
exports[`babel Targetting "modern" tags potential React components local hooks.js 1`] = `
2545+
"\\"use strict\\";
2546+
2547+
var _react = require(\\"react\\");
2548+
2549+
(function () {
2550+
var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
2551+
enterModule && enterModule(module);
2552+
})();
2553+
2554+
var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
2555+
return a;
2556+
};
2557+
2558+
function Component1() {
2559+
function useRippleHandler() {}
2560+
useRippleHandler();
2561+
useRippleHandler();
2562+
}
2563+
2564+
__signature__(Component1, \\"useRippleHandler{}\\\\nuseRippleHandler{}\\");
2565+
2566+
function Component2() {
2567+
const useRippleHandler = () => {};
2568+
useRippleHandler();
2569+
useRippleHandler();
2570+
}
2571+
2572+
__signature__(Component2, \\"useRippleHandler{}\\\\nuseRippleHandler{}\\");
2573+
2574+
function Component3() {
2575+
const useRippleHandler = function () {};
2576+
useRippleHandler();
2577+
useRippleHandler();
2578+
}
2579+
2580+
__signature__(Component3, \\"useRippleHandler{}\\\\nuseRippleHandler{}\\");
2581+
2582+
const useInnerHook = ({ useHookFromProps }) => {
2583+
const useHookBase = () => (0, _react.useState)();
2584+
2585+
__signature__(useHookBase, \\"useState{}\\");
2586+
2587+
const useHook = () => (0, _react.useState)(useHookFromProps(useHookBase()));
2588+
2589+
__signature__(useHook, \\"useState{(useHookFromProps(useHookBase()))}\\\\nuseHookFromProps{}\\\\nuseHookBase{}\\", () => [useHookFromProps, useHookBase]);
2590+
2591+
useHookFromProps();
2592+
{
2593+
// sub scope
2594+
useHook();
2595+
}
2596+
};
2597+
2598+
__signature__(useInnerHook, \\"useHookFromProps{}\\\\nuseHook{}\\");
2599+
2600+
const OnlyThisOneUsesExternalHook = () => {
2601+
useInnerHook();
2602+
(0, _react.useState)();
2603+
};
2604+
2605+
// check for \\"return [\\"
2606+
2607+
__signature__(OnlyThisOneUsesExternalHook, \\"useInnerHook{}\\\\nuseState{}\\", () => [useInnerHook]);
2608+
2609+
;
2610+
2611+
(function () {
2612+
var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
2613+
2614+
if (!reactHotLoader) {
2615+
return;
2616+
}
2617+
2618+
reactHotLoader.register(Component1, \\"Component1\\", __FILENAME__);
2619+
reactHotLoader.register(Component2, \\"Component2\\", __FILENAME__);
2620+
reactHotLoader.register(Component3, \\"Component3\\", __FILENAME__);
2621+
reactHotLoader.register(useInnerHook, \\"useInnerHook\\", __FILENAME__);
2622+
reactHotLoader.register(OnlyThisOneUsesExternalHook, \\"OnlyThisOneUsesExternalHook\\", __FILENAME__);
2623+
})();
2624+
2625+
;
2626+
2627+
(function () {
2628+
var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
2629+
leaveModule && leaveModule(module);
2630+
})();"
2631+
`;
2632+
24452633
exports[`babel Targetting "modern" tags potential React components name clash.js 1`] = `
24462634
"\\"use strict\\";
24472635

0 commit comments

Comments
 (0)