@react-navigation/devtools 7.0.61 → 7.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.
|
@@ -59,7 +59,7 @@ export function useDevToolsBase(ref, callback) {
|
|
|
59
59
|
// Ignore any errors from the last promise
|
|
60
60
|
}).then(async () => {
|
|
61
61
|
// eslint-disable-next-line promise/always-return
|
|
62
|
-
if (data.stack) {
|
|
62
|
+
if ('stack' in data && data.stack) {
|
|
63
63
|
let stack;
|
|
64
64
|
try {
|
|
65
65
|
stack = await symbolicate(data.stack);
|
|
@@ -79,6 +79,7 @@ export function useDevToolsBase(ref, callback) {
|
|
|
79
79
|
let timer;
|
|
80
80
|
let unsubscribeAction;
|
|
81
81
|
let unsubscribeState;
|
|
82
|
+
let unsubscribeEvent;
|
|
82
83
|
const initialize = async () => {
|
|
83
84
|
if (!ref.current) {
|
|
84
85
|
// If the navigation object isn't ready yet, wait for it
|
|
@@ -112,6 +113,12 @@ export function useDevToolsBase(ref, callback) {
|
|
|
112
113
|
lastActionRef.current = e.data;
|
|
113
114
|
}
|
|
114
115
|
});
|
|
116
|
+
unsubscribeEvent = navigation.addListener('__unsafe_event__', e => {
|
|
117
|
+
send({
|
|
118
|
+
type: 'event',
|
|
119
|
+
event: e.data
|
|
120
|
+
});
|
|
121
|
+
});
|
|
115
122
|
unsubscribeState = navigation.addListener('state', e => {
|
|
116
123
|
// Don't show the action in dev tools if the state is what we sent to reset earlier
|
|
117
124
|
if (lastResetRef.current && deepEqual(lastResetRef.current, e.data.state)) {
|
|
@@ -141,6 +148,7 @@ export function useDevToolsBase(ref, callback) {
|
|
|
141
148
|
initialize();
|
|
142
149
|
return () => {
|
|
143
150
|
unsubscribeAction?.();
|
|
151
|
+
unsubscribeEvent?.();
|
|
144
152
|
unsubscribeState?.();
|
|
145
153
|
clearTimeout(timer);
|
|
146
154
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["deepEqual","React","parseErrorStack","useDevToolsBase","ref","callback","lastStateRef","useRef","undefined","lastActionRef","callbackRef","lastResetRef","useEffect","current","symbolicate","stack","frames","slice","filter","frame","file","urlMatch","match","url","URL","result","fetch","protocol","host","method","body","JSON","stringify","then","res","json","it","collapse","map","methodName","lineNumber","column","join","err","lines","split","line","trim","startsWith","includes","push","pendingPromiseRef","Promise","resolve","send","useCallback","data","catch","timer","unsubscribeAction","unsubscribeState","initialize","setInterval","clearTimeout","state","getRootState","type","navigation","addListener","e","action","noop","lastState","lastChange","resetRoot"],"sourceRoot":"../../src","sources":["useDevToolsBase.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["deepEqual","React","parseErrorStack","useDevToolsBase","ref","callback","lastStateRef","useRef","undefined","lastActionRef","callbackRef","lastResetRef","useEffect","current","symbolicate","stack","frames","slice","filter","frame","file","urlMatch","match","url","URL","result","fetch","protocol","host","method","body","JSON","stringify","then","res","json","it","collapse","map","methodName","lineNumber","column","join","err","lines","split","line","trim","startsWith","includes","push","pendingPromiseRef","Promise","resolve","send","useCallback","data","catch","timer","unsubscribeAction","unsubscribeState","unsubscribeEvent","initialize","setInterval","clearTimeout","state","getRootState","type","navigation","addListener","e","action","noop","event","lastState","lastChange","resetRoot"],"sourceRoot":"../../src","sources":["useDevToolsBase.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NavigationAction, NavigationContainerRef, NavigationState } from '@react-navigation/core';
|
|
1
|
+
import type { NavigationAction, NavigationContainerEventMap, NavigationContainerRef, NavigationState } from '@react-navigation/core';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
type InitData = {
|
|
4
4
|
type: 'init';
|
|
@@ -10,7 +10,12 @@ type ActionData = {
|
|
|
10
10
|
state: NavigationState | undefined;
|
|
11
11
|
stack: string | undefined;
|
|
12
12
|
};
|
|
13
|
-
|
|
13
|
+
type EventData = {
|
|
14
|
+
type: 'event';
|
|
15
|
+
event: NavigationContainerEventMap['__unsafe_event__']['data'];
|
|
16
|
+
};
|
|
17
|
+
type ResultData = InitData | ActionData | EventData;
|
|
18
|
+
export declare function useDevToolsBase(ref: React.RefObject<NavigationContainerRef<any> | null>, callback: (result: ResultData) => void): {
|
|
14
19
|
resetRoot: (state: NavigationState) => void;
|
|
15
20
|
};
|
|
16
21
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDevToolsBase.d.ts","sourceRoot":"","sources":["../../../src/useDevToolsBase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAC7B,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EACxD,QAAQ,EAAE,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"useDevToolsBase.d.ts","sourceRoot":"","sources":["../../../src/useDevToolsBase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,sBAAsB,EACtB,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,2BAA2B,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;CAChE,CAAC;AAEF,KAAK,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EACxD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI;uBAwL5B,eAAe;EAU1B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-navigation/devtools",
|
|
3
3
|
"description": "Developer tools for React Navigation",
|
|
4
|
-
"version": "7.0
|
|
4
|
+
"version": "7.1.0",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
7
7
|
"react-native",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"stacktrace-parser": "^0.1.11"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@react-navigation/core": "^7.
|
|
49
|
+
"@react-navigation/core": "^7.21.0",
|
|
50
50
|
"@types/react": "~19.0.10",
|
|
51
51
|
"del-cli": "^6.0.0",
|
|
52
52
|
"react": "19.1.0",
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
]
|
|
75
75
|
]
|
|
76
76
|
},
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "c9ddec7335ac6c6009d005a81ea019e9027c2bee"
|
|
78
78
|
}
|
package/src/useDevToolsBase.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
NavigationAction,
|
|
3
|
+
NavigationContainerEventMap,
|
|
3
4
|
NavigationContainerRef,
|
|
4
5
|
NavigationState,
|
|
5
6
|
} from '@react-navigation/core';
|
|
@@ -35,9 +36,16 @@ type ActionData = {
|
|
|
35
36
|
stack: string | undefined;
|
|
36
37
|
};
|
|
37
38
|
|
|
39
|
+
type EventData = {
|
|
40
|
+
type: 'event';
|
|
41
|
+
event: NavigationContainerEventMap['__unsafe_event__']['data'];
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
type ResultData = InitData | ActionData | EventData;
|
|
45
|
+
|
|
38
46
|
export function useDevToolsBase(
|
|
39
47
|
ref: React.RefObject<NavigationContainerRef<any> | null>,
|
|
40
|
-
callback: (result:
|
|
48
|
+
callback: (result: ResultData) => void
|
|
41
49
|
) {
|
|
42
50
|
const lastStateRef = React.useRef<NavigationState | undefined>(undefined);
|
|
43
51
|
const lastActionRef = React.useRef<
|
|
@@ -106,7 +114,7 @@ export function useDevToolsBase(
|
|
|
106
114
|
|
|
107
115
|
const pendingPromiseRef = React.useRef<Promise<void>>(Promise.resolve());
|
|
108
116
|
|
|
109
|
-
const send = React.useCallback((data:
|
|
117
|
+
const send = React.useCallback((data: ResultData) => {
|
|
110
118
|
// We need to make sure that our callbacks executed in the same order
|
|
111
119
|
// So we add check if the last promise is settled before sending the next one
|
|
112
120
|
pendingPromiseRef.current = pendingPromiseRef.current
|
|
@@ -115,7 +123,7 @@ export function useDevToolsBase(
|
|
|
115
123
|
})
|
|
116
124
|
.then(async () => {
|
|
117
125
|
// eslint-disable-next-line promise/always-return
|
|
118
|
-
if (data.stack) {
|
|
126
|
+
if ('stack' in data && data.stack) {
|
|
119
127
|
let stack: string | undefined;
|
|
120
128
|
|
|
121
129
|
try {
|
|
@@ -135,6 +143,7 @@ export function useDevToolsBase(
|
|
|
135
143
|
let timer: any;
|
|
136
144
|
let unsubscribeAction: (() => void) | undefined;
|
|
137
145
|
let unsubscribeState: (() => void) | undefined;
|
|
146
|
+
let unsubscribeEvent: (() => void) | undefined;
|
|
138
147
|
|
|
139
148
|
const initialize = async () => {
|
|
140
149
|
if (!ref.current) {
|
|
@@ -171,6 +180,13 @@ export function useDevToolsBase(
|
|
|
171
180
|
}
|
|
172
181
|
});
|
|
173
182
|
|
|
183
|
+
unsubscribeEvent = navigation.addListener('__unsafe_event__', (e) => {
|
|
184
|
+
send({
|
|
185
|
+
type: 'event',
|
|
186
|
+
event: e.data,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
174
190
|
unsubscribeState = navigation.addListener('state', (e) => {
|
|
175
191
|
// Don't show the action in dev tools if the state is what we sent to reset earlier
|
|
176
192
|
if (
|
|
@@ -206,6 +222,7 @@ export function useDevToolsBase(
|
|
|
206
222
|
|
|
207
223
|
return () => {
|
|
208
224
|
unsubscribeAction?.();
|
|
225
|
+
unsubscribeEvent?.();
|
|
209
226
|
unsubscribeState?.();
|
|
210
227
|
clearTimeout(timer);
|
|
211
228
|
};
|