@pdg/react-hook 2.0.17 → 2.0.19
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/dist/changed/useChanged.d.ts +1 -1
- package/dist/changed/useFirstSkipChanged.d.ts +2 -0
- package/dist/effect/index.d.ts +2 -0
- package/dist/effect/useEventLayoutEffect.d.ts +2 -0
- package/dist/effect/useFirstSkipLayoutEffect.d.ts +2 -0
- package/dist/eslint-plugin.js +47 -33
- package/dist/index.esm.js +51 -22
- package/dist/index.js +50 -21
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { DependencyList } from 'react';
|
|
2
|
-
export declare const useChanged: (
|
|
2
|
+
export declare const useChanged: (callback: () => void, deps: DependencyList) => void;
|
package/dist/effect/index.d.ts
CHANGED
package/dist/eslint-plugin.js
CHANGED
|
@@ -6,53 +6,67 @@ const pluginRules = {
|
|
|
6
6
|
const originalRule = reactHooksPlugin.rules['exhaustive-deps'].create(context);
|
|
7
7
|
return Object.assign(Object.assign({}, originalRule), { CallExpression(node) {
|
|
8
8
|
const callbackName = node.callee.name;
|
|
9
|
-
/** useChanged */
|
|
10
|
-
if (
|
|
11
|
-
const
|
|
12
|
-
|
|
9
|
+
/** useChanged, useFirstSkipChanged */
|
|
10
|
+
if (['useChanged', 'useFirstSkipChanged'].includes(callbackName)) {
|
|
11
|
+
const callback = node.arguments[0];
|
|
12
|
+
const deps = node.arguments[1];
|
|
13
|
+
if (!deps || deps.type !== 'ArrayExpression') {
|
|
13
14
|
context.report({
|
|
14
|
-
node: node
|
|
15
|
-
message:
|
|
15
|
+
node: deps || node,
|
|
16
|
+
message: `${callbackName} 훅의 두 번째 인자는 반드시 배열 리터럴(예: [a, b]) 형태여야 합니다.`,
|
|
16
17
|
});
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
20
|
+
if (callback && (callback.type === 'ArrowFunctionExpression' || callback.type === 'FunctionExpression')) {
|
|
21
|
+
const visited = new Set();
|
|
22
|
+
const checkRefAccess = (targetNode) => {
|
|
23
|
+
if (!targetNode || typeof targetNode !== 'object' || visited.has(targetNode))
|
|
24
|
+
return;
|
|
25
|
+
visited.add(targetNode);
|
|
26
|
+
if (targetNode.type === 'MemberExpression' &&
|
|
27
|
+
targetNode.property &&
|
|
28
|
+
(targetNode.property.name === 'current' ||
|
|
29
|
+
(targetNode.property.type === 'Literal' && targetNode.property.value === 'current'))) {
|
|
30
|
+
context.report({
|
|
31
|
+
node: targetNode,
|
|
32
|
+
message: `${callbackName} 훅의 콜백에서는 ref를 참조할 수 없습니다. (Cannot access refs during render.)`,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
for (const key in targetNode) {
|
|
36
|
+
if (key === 'parent')
|
|
37
|
+
continue;
|
|
38
|
+
const child = targetNode[key];
|
|
39
|
+
if (Array.isArray(child)) {
|
|
40
|
+
child.forEach((c) => checkRefAccess(c));
|
|
41
|
+
}
|
|
42
|
+
else if (child && typeof child === 'object') {
|
|
43
|
+
checkRefAccess(child);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
checkRefAccess(callback.body);
|
|
48
|
+
}
|
|
49
|
+
return originalRule.CallExpression(node);
|
|
36
50
|
}
|
|
37
|
-
/**
|
|
38
|
-
if (
|
|
51
|
+
/** useEventEffect, useEventLayoutEffect */
|
|
52
|
+
if (['useEventEffect', 'useEventLayoutEffect'].includes(callbackName)) {
|
|
39
53
|
const deps = node.arguments[1];
|
|
40
|
-
if (
|
|
54
|
+
if (deps && deps.type !== 'ArrayExpression') {
|
|
41
55
|
context.report({
|
|
42
|
-
node: node
|
|
43
|
-
message:
|
|
56
|
+
node: deps || node,
|
|
57
|
+
message: `${callbackName} 훅의 두 번째 인자는 반드시 배열 리터럴(예: [a, b]) 형태여야 합니다.`,
|
|
44
58
|
});
|
|
45
59
|
return;
|
|
46
60
|
}
|
|
47
61
|
return originalRule.CallExpression(node);
|
|
48
62
|
}
|
|
49
|
-
/**
|
|
50
|
-
if (
|
|
63
|
+
/** useFirstSkipEffect, useFirstSkipLayoutEffect */
|
|
64
|
+
if (['useFirstSkipEffect', 'useFirstSkipLayoutEffect'].includes(callbackName)) {
|
|
51
65
|
const deps = node.arguments[1];
|
|
52
|
-
if (deps
|
|
66
|
+
if (!deps || deps.type !== 'ArrayExpression') {
|
|
53
67
|
context.report({
|
|
54
|
-
node: node
|
|
55
|
-
message:
|
|
68
|
+
node: deps || node,
|
|
69
|
+
message: `${callbackName} 훅의 두 번째 인자는 반드시 배열 리터럴(예: [a, b]) 형태여야 합니다.`,
|
|
56
70
|
});
|
|
57
71
|
return;
|
|
58
72
|
}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useState,useEffectEvent,useEffect,useRef,
|
|
1
|
+
import {useState,useEffectEvent,useEffect,useLayoutEffect,useRef,useImperativeHandle}from'react';import {c}from'react/compiler-runtime';function _arrayLikeToArray(r, a) {
|
|
2
2
|
(null == a || a > r.length) && (a = r.length);
|
|
3
3
|
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
4
4
|
return n;
|
|
@@ -42,32 +42,28 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
42
42
|
var t = {}.toString.call(r).slice(8, -1);
|
|
43
43
|
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
44
44
|
}
|
|
45
|
-
}var useChanged = function useChanged(
|
|
46
|
-
var
|
|
47
|
-
var _useState = useState(deps),
|
|
45
|
+
}var useChanged = function useChanged(callback, deps) {
|
|
46
|
+
var _useState = useState(),
|
|
48
47
|
_useState2 = _slicedToArray(_useState, 2),
|
|
49
48
|
prevValues = _useState2[0],
|
|
50
49
|
setPrevValues = _useState2[1];
|
|
51
|
-
var _useState3 = useState(true),
|
|
52
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
53
|
-
isFirst = _useState4[0],
|
|
54
|
-
setIsFirst = _useState4[1];
|
|
55
|
-
if (initial) {
|
|
56
|
-
if (isFirst) {
|
|
57
|
-
setIsFirst(false);
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
50
|
var changed = false;
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
return v !== prevValues[i];
|
|
65
|
-
})) {
|
|
66
|
-
changed = true;
|
|
67
|
-
}
|
|
51
|
+
if (prevValues === undefined) {
|
|
52
|
+
changed = true;
|
|
68
53
|
setPrevValues(deps);
|
|
54
|
+
} else {
|
|
55
|
+
if (deps !== prevValues) {
|
|
56
|
+
if (deps.length !== prevValues.length || deps.some(function (v, i) {
|
|
57
|
+
return v !== prevValues[i];
|
|
58
|
+
})) {
|
|
59
|
+
changed = true;
|
|
60
|
+
}
|
|
61
|
+
setPrevValues(deps);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (changed) {
|
|
65
|
+
callback();
|
|
69
66
|
}
|
|
70
|
-
return changed;
|
|
71
67
|
};var useEventEffect = function useEventEffect(effectEventCallback, deps) {
|
|
72
68
|
var $ = c(2);
|
|
73
69
|
var effectEvent = useEffectEvent(effectEventCallback);
|
|
@@ -82,6 +78,20 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
82
78
|
t0 = $[1];
|
|
83
79
|
}
|
|
84
80
|
useEffect(t0, deps);
|
|
81
|
+
};var useEventLayoutEffect = function useEventLayoutEffect(effectEventCallback, deps) {
|
|
82
|
+
var $ = c(2);
|
|
83
|
+
var effectEvent = useEffectEvent(effectEventCallback);
|
|
84
|
+
var t0;
|
|
85
|
+
if ($[0] !== effectEvent) {
|
|
86
|
+
t0 = function t0() {
|
|
87
|
+
return effectEvent();
|
|
88
|
+
};
|
|
89
|
+
$[0] = effectEvent;
|
|
90
|
+
$[1] = t0;
|
|
91
|
+
} else {
|
|
92
|
+
t0 = $[1];
|
|
93
|
+
}
|
|
94
|
+
useLayoutEffect(t0, deps);
|
|
85
95
|
};var useFirstSkipEffect = function useFirstSkipEffect(effectEventCallback, deps) {
|
|
86
96
|
var $ = c(2);
|
|
87
97
|
var effectEvent = useEffectEvent(effectEventCallback);
|
|
@@ -101,6 +111,25 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
101
111
|
t0 = $[1];
|
|
102
112
|
}
|
|
103
113
|
useEffect(t0, deps);
|
|
114
|
+
};var useFirstSkipLayoutEffect = function useFirstSkipLayoutEffect(effectEventCallback, deps) {
|
|
115
|
+
var $ = c(2);
|
|
116
|
+
var effectEvent = useEffectEvent(effectEventCallback);
|
|
117
|
+
var firstSkipRef = useRef(true);
|
|
118
|
+
var t0;
|
|
119
|
+
if ($[0] !== effectEvent) {
|
|
120
|
+
t0 = function t0() {
|
|
121
|
+
if (firstSkipRef.current) {
|
|
122
|
+
firstSkipRef.current = false;
|
|
123
|
+
} else {
|
|
124
|
+
return effectEvent();
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
$[0] = effectEvent;
|
|
128
|
+
$[1] = t0;
|
|
129
|
+
} else {
|
|
130
|
+
t0 = $[1];
|
|
131
|
+
}
|
|
132
|
+
useLayoutEffect(t0, deps);
|
|
104
133
|
};function useMountedRef(t0) {
|
|
105
134
|
var $ = c(2);
|
|
106
135
|
var initialValue = t0 === undefined ? true : t0;
|
|
@@ -261,4 +290,4 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
261
290
|
t3 = $[7];
|
|
262
291
|
}
|
|
263
292
|
useEffect(t2, t3);
|
|
264
|
-
}export{clearIntervalRef,clearTimeoutRef,useAutoUpdateRef,useChanged,useEventEffect,useFirstSkipEffect,useForwardRef,useIntervalRef,useMountedRef,useTimeoutRef};
|
|
293
|
+
}export{clearIntervalRef,clearTimeoutRef,useAutoUpdateRef,useChanged,useEventEffect,useEventLayoutEffect,useFirstSkipEffect,useFirstSkipLayoutEffect,useForwardRef,useIntervalRef,useMountedRef,useTimeoutRef};
|
package/dist/index.js
CHANGED
|
@@ -42,32 +42,28 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
42
42
|
var t = {}.toString.call(r).slice(8, -1);
|
|
43
43
|
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
44
44
|
}
|
|
45
|
-
}var useChanged = function useChanged(
|
|
46
|
-
var
|
|
47
|
-
var _useState = react.useState(deps),
|
|
45
|
+
}var useChanged = function useChanged(callback, deps) {
|
|
46
|
+
var _useState = react.useState(),
|
|
48
47
|
_useState2 = _slicedToArray(_useState, 2),
|
|
49
48
|
prevValues = _useState2[0],
|
|
50
49
|
setPrevValues = _useState2[1];
|
|
51
|
-
var _useState3 = react.useState(true),
|
|
52
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
53
|
-
isFirst = _useState4[0],
|
|
54
|
-
setIsFirst = _useState4[1];
|
|
55
|
-
if (initial) {
|
|
56
|
-
if (isFirst) {
|
|
57
|
-
setIsFirst(false);
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
50
|
var changed = false;
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
return v !== prevValues[i];
|
|
65
|
-
})) {
|
|
66
|
-
changed = true;
|
|
67
|
-
}
|
|
51
|
+
if (prevValues === undefined) {
|
|
52
|
+
changed = true;
|
|
68
53
|
setPrevValues(deps);
|
|
54
|
+
} else {
|
|
55
|
+
if (deps !== prevValues) {
|
|
56
|
+
if (deps.length !== prevValues.length || deps.some(function (v, i) {
|
|
57
|
+
return v !== prevValues[i];
|
|
58
|
+
})) {
|
|
59
|
+
changed = true;
|
|
60
|
+
}
|
|
61
|
+
setPrevValues(deps);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (changed) {
|
|
65
|
+
callback();
|
|
69
66
|
}
|
|
70
|
-
return changed;
|
|
71
67
|
};var useEventEffect = function useEventEffect(effectEventCallback, deps) {
|
|
72
68
|
var $ = compilerRuntime.c(2);
|
|
73
69
|
var effectEvent = react.useEffectEvent(effectEventCallback);
|
|
@@ -82,6 +78,20 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
82
78
|
t0 = $[1];
|
|
83
79
|
}
|
|
84
80
|
react.useEffect(t0, deps);
|
|
81
|
+
};var useEventLayoutEffect = function useEventLayoutEffect(effectEventCallback, deps) {
|
|
82
|
+
var $ = compilerRuntime.c(2);
|
|
83
|
+
var effectEvent = react.useEffectEvent(effectEventCallback);
|
|
84
|
+
var t0;
|
|
85
|
+
if ($[0] !== effectEvent) {
|
|
86
|
+
t0 = function t0() {
|
|
87
|
+
return effectEvent();
|
|
88
|
+
};
|
|
89
|
+
$[0] = effectEvent;
|
|
90
|
+
$[1] = t0;
|
|
91
|
+
} else {
|
|
92
|
+
t0 = $[1];
|
|
93
|
+
}
|
|
94
|
+
react.useLayoutEffect(t0, deps);
|
|
85
95
|
};var useFirstSkipEffect = function useFirstSkipEffect(effectEventCallback, deps) {
|
|
86
96
|
var $ = compilerRuntime.c(2);
|
|
87
97
|
var effectEvent = react.useEffectEvent(effectEventCallback);
|
|
@@ -101,6 +111,25 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
101
111
|
t0 = $[1];
|
|
102
112
|
}
|
|
103
113
|
react.useEffect(t0, deps);
|
|
114
|
+
};var useFirstSkipLayoutEffect = function useFirstSkipLayoutEffect(effectEventCallback, deps) {
|
|
115
|
+
var $ = compilerRuntime.c(2);
|
|
116
|
+
var effectEvent = react.useEffectEvent(effectEventCallback);
|
|
117
|
+
var firstSkipRef = react.useRef(true);
|
|
118
|
+
var t0;
|
|
119
|
+
if ($[0] !== effectEvent) {
|
|
120
|
+
t0 = function t0() {
|
|
121
|
+
if (firstSkipRef.current) {
|
|
122
|
+
firstSkipRef.current = false;
|
|
123
|
+
} else {
|
|
124
|
+
return effectEvent();
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
$[0] = effectEvent;
|
|
128
|
+
$[1] = t0;
|
|
129
|
+
} else {
|
|
130
|
+
t0 = $[1];
|
|
131
|
+
}
|
|
132
|
+
react.useLayoutEffect(t0, deps);
|
|
104
133
|
};function useMountedRef(t0) {
|
|
105
134
|
var $ = compilerRuntime.c(2);
|
|
106
135
|
var initialValue = t0 === undefined ? true : t0;
|
|
@@ -261,4 +290,4 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
261
290
|
t3 = $[7];
|
|
262
291
|
}
|
|
263
292
|
react.useEffect(t2, t3);
|
|
264
|
-
}exports.clearIntervalRef=clearIntervalRef;exports.clearTimeoutRef=clearTimeoutRef;exports.useAutoUpdateRef=useAutoUpdateRef;exports.useChanged=useChanged;exports.useEventEffect=useEventEffect;exports.useFirstSkipEffect=useFirstSkipEffect;exports.useForwardRef=useForwardRef;exports.useIntervalRef=useIntervalRef;exports.useMountedRef=useMountedRef;exports.useTimeoutRef=useTimeoutRef;
|
|
293
|
+
}exports.clearIntervalRef=clearIntervalRef;exports.clearTimeoutRef=clearTimeoutRef;exports.useAutoUpdateRef=useAutoUpdateRef;exports.useChanged=useChanged;exports.useEventEffect=useEventEffect;exports.useEventLayoutEffect=useEventLayoutEffect;exports.useFirstSkipEffect=useFirstSkipEffect;exports.useFirstSkipLayoutEffect=useFirstSkipLayoutEffect;exports.useForwardRef=useForwardRef;exports.useIntervalRef=useIntervalRef;exports.useMountedRef=useMountedRef;exports.useTimeoutRef=useTimeoutRef;
|
package/package.json
CHANGED