@buoy-gg/route-events 7.0.35 → 7.0.36
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/lib/commonjs/sync/routeEventsSyncAdapter.js +34 -8
- package/lib/commonjs/useNavigationStack.js +52 -14
- package/lib/module/sync/routeEventsSyncAdapter.js +34 -8
- package/lib/module/useNavigationStack.js +52 -15
- package/lib/typescript/sync/routeEventsSyncAdapter.d.ts +9 -0
- package/lib/typescript/sync/routeEventsSyncAdapter.d.ts.map +1 -1
- package/lib/typescript/useNavigationStack.d.ts +8 -0
- package/lib/typescript/useNavigationStack.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -131,7 +131,21 @@ const routeEventsSyncAdapter = exports.routeEventsSyncAdapter = {
|
|
|
131
131
|
// BaseEventStore is newest-FIRST, and the store only captures while
|
|
132
132
|
// something is subscribed.
|
|
133
133
|
const latest = _routeEventStore.routeEventStore.getEvents()[0];
|
|
134
|
-
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* A RECORDED event only wins while the recorder is running.
|
|
137
|
+
*
|
|
138
|
+
* The store starts capturing when its first subscriber arrives and stops
|
|
139
|
+
* with the last one, so an app with Ask Buoy on the phone and no
|
|
140
|
+
* dashboard attached has NO route events at all — the stack fallback
|
|
141
|
+
* below is its normal path, not the fresh-launch edge case this code was
|
|
142
|
+
* written for. Worse, events left over from a closed capture window are
|
|
143
|
+
* stale the moment the user navigates again: a live QA session read
|
|
144
|
+
* `/(tabs)/menu` from an event six scenarios after the app had moved to
|
|
145
|
+
* `/cart`. The live stack cannot be stale, so it wins whenever nothing
|
|
146
|
+
* is recording.
|
|
147
|
+
*/
|
|
148
|
+
if (latest && _routeEventStore.routeEventStore.isCapturing()) {
|
|
135
149
|
return {
|
|
136
150
|
path: latest.pathname,
|
|
137
151
|
params: toWireParams(latest.params),
|
|
@@ -139,13 +153,12 @@ const routeEventsSyncAdapter = exports.routeEventsSyncAdapter = {
|
|
|
139
153
|
source: "event"
|
|
140
154
|
};
|
|
141
155
|
}
|
|
142
|
-
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const focused = _navigationStackStore.navigationStackStore.getStack().find(item => item.isFocused) ?? _navigationStackStore.navigationStackStore.getStack().slice(-1)[0];
|
|
156
|
+
|
|
157
|
+
// The live stack knows even when the history is empty, which is the
|
|
158
|
+
// difference between a macro that can run from anywhere and one that
|
|
159
|
+
// only works if you happen to be on the screen it was recorded from.
|
|
160
|
+
const stack = _navigationStackStore.navigationStackStore.getStack();
|
|
161
|
+
const focused = stack.find(item => item.isFocused) ?? stack[stack.length - 1];
|
|
149
162
|
if (focused?.pathname) {
|
|
150
163
|
return {
|
|
151
164
|
path: focused.pathname,
|
|
@@ -154,6 +167,19 @@ const routeEventsSyncAdapter = exports.routeEventsSyncAdapter = {
|
|
|
154
167
|
source: "stack"
|
|
155
168
|
};
|
|
156
169
|
}
|
|
170
|
+
|
|
171
|
+
// No live stack (no <RouteTracker/>) and the recorder is off: an old
|
|
172
|
+
// event is all there is. Say that it may be stale rather than passing it
|
|
173
|
+
// off as where the app is.
|
|
174
|
+
if (latest) {
|
|
175
|
+
return {
|
|
176
|
+
path: latest.pathname,
|
|
177
|
+
params: toWireParams(latest.params),
|
|
178
|
+
at: latest.timestamp,
|
|
179
|
+
source: "event",
|
|
180
|
+
stale: true
|
|
181
|
+
};
|
|
182
|
+
}
|
|
157
183
|
return {
|
|
158
184
|
path: null,
|
|
159
185
|
params: {},
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.buildStack = buildStack;
|
|
6
7
|
exports.useNavigationStack = useNavigationStack;
|
|
7
8
|
var _react = require("react");
|
|
8
9
|
var _safeReactNavigation = require("./utils/safeReactNavigation");
|
|
@@ -85,14 +86,39 @@ function buildNestedNavigateAction(path) {
|
|
|
85
86
|
// ============================================================================
|
|
86
87
|
|
|
87
88
|
/**
|
|
88
|
-
* Recursively collect
|
|
89
|
+
* Recursively collect the routes from the navigation state tree.
|
|
90
|
+
*
|
|
91
|
+
* FOCUS COMES FROM `state.index`, NEVER FROM POSITION. React Navigation names
|
|
92
|
+
* the focused route by index within `routes`; the array's order is declaration
|
|
93
|
+
* order. `buildStack` used to equate the two — "the last route in the collected
|
|
94
|
+
* list is the focused one" — and a hidden tab declared last (`href: null` on an
|
|
95
|
+
* expo-router `Tabs.Screen`) then became the reported current screen for the
|
|
96
|
+
* whole session. Measured on a real app: Home and Rewards both reported as a
|
|
97
|
+
* hidden Menu tab, in every turn of a 55-scenario QA run, because `menu` was
|
|
98
|
+
* declared last.
|
|
99
|
+
*
|
|
100
|
+
* TAB AND DRAWER SIBLINGS ARE NOT A STACK. They are alternative destinations
|
|
101
|
+
* that happen to be mounted at the same time; `canPop` and `popToIndex` never
|
|
102
|
+
* meant anything for them. Only the focused branch of a tab/drawer is
|
|
103
|
+
* collected, so what comes back is the stack you could actually pop.
|
|
89
104
|
*/
|
|
90
|
-
function collectRoutesFromState(state, depth = 0, parentPath = "") {
|
|
91
|
-
if (!state || !state.routes)
|
|
105
|
+
function collectRoutesFromState(state, depth = 0, parentPath = "", onFocusedChain = true) {
|
|
106
|
+
if (!state || !Array.isArray(state.routes) || state.routes.length === 0) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
92
109
|
const routes = [];
|
|
110
|
+
|
|
111
|
+
// An absent or out-of-range `index` is incomplete state (mid-rehydration, a
|
|
112
|
+
// partially built child). Fall back to the last route — a stack's top — and
|
|
113
|
+
// never to an arbitrary sibling.
|
|
114
|
+
const declaredIndex = typeof state.index === "number" ? state.index : NaN;
|
|
115
|
+
const focusedIndex = Number.isInteger(declaredIndex) && declaredIndex >= 0 && declaredIndex < state.routes.length ? declaredIndex : state.routes.length - 1;
|
|
116
|
+
const navigatorType = typeof state.type === "string" ? state.type : undefined;
|
|
117
|
+
const siblingsAreStack = navigatorType !== "tab" && navigatorType !== "drawer";
|
|
93
118
|
for (let i = 0; i < state.routes.length; i++) {
|
|
119
|
+
if (!siblingsAreStack && i !== focusedIndex) continue;
|
|
94
120
|
const route = state.routes[i];
|
|
95
|
-
const isFocused = i ===
|
|
121
|
+
const isFocused = i === focusedIndex;
|
|
96
122
|
|
|
97
123
|
// Build the path
|
|
98
124
|
let pathname = route.name;
|
|
@@ -116,25 +142,30 @@ function collectRoutesFromState(state, depth = 0, parentPath = "") {
|
|
|
116
142
|
});
|
|
117
143
|
}
|
|
118
144
|
}
|
|
145
|
+
|
|
146
|
+
// Descend the focused branch first: whatever it yields owns the focus, and
|
|
147
|
+
// this route only keeps it when nothing deeper claimed it.
|
|
148
|
+
const onChain = onFocusedChain && isFocused;
|
|
149
|
+
const nestedRoutes = onChain && route.state ? collectRoutesFromState(route.state, depth + 1, pathname, true) : [];
|
|
119
150
|
routes.push({
|
|
120
151
|
key: route.key,
|
|
121
152
|
name: route.name,
|
|
122
153
|
path: pathname,
|
|
123
154
|
params: route.params || {},
|
|
124
|
-
state: route.state
|
|
155
|
+
state: route.state,
|
|
156
|
+
isFocused: onChain && nestedRoutes.length === 0
|
|
125
157
|
});
|
|
126
|
-
|
|
127
|
-
// If this route has nested state and is focused, recurse
|
|
128
|
-
if (isFocused && route.state) {
|
|
129
|
-
const nestedRoutes = collectRoutesFromState(route.state, depth + 1, pathname);
|
|
130
|
-
routes.push(...nestedRoutes);
|
|
131
|
-
}
|
|
158
|
+
routes.push(...nestedRoutes);
|
|
132
159
|
}
|
|
133
160
|
return routes;
|
|
134
161
|
}
|
|
135
162
|
|
|
136
163
|
/**
|
|
137
|
-
* Transform raw navigation state into display items
|
|
164
|
+
* Transform raw navigation state into display items.
|
|
165
|
+
*
|
|
166
|
+
* Exported for tests: the focus rule below is the one thing every route answer
|
|
167
|
+
* in the product rests on, and it was previously only reachable by extracting
|
|
168
|
+
* the function from source with the TypeScript AST.
|
|
138
169
|
*/
|
|
139
170
|
function buildStack(navigationState, isExpo) {
|
|
140
171
|
if (!navigationState) return [];
|
|
@@ -153,7 +184,14 @@ function buildStack(navigationState, isExpo) {
|
|
|
153
184
|
// If we filtered everything out, just keep the last route
|
|
154
185
|
const finalRoutes = filteredRoutes.length > 0 ? filteredRoutes : routes.slice(-1);
|
|
155
186
|
|
|
156
|
-
|
|
187
|
+
/**
|
|
188
|
+
* Focus survives filtering. It is decided in `collectRoutesFromState` from
|
|
189
|
+
* `state.index`; the only case that falls back to the last item is one
|
|
190
|
+
* where the filter dropped the focused route itself (an internal expo
|
|
191
|
+
* layout), which is the one situation the old rule was ever right for.
|
|
192
|
+
*/
|
|
193
|
+
const collectedFocus = finalRoutes.findIndex(route => route.isFocused);
|
|
194
|
+
const focusIndex = collectedFocus >= 0 ? collectedFocus : finalRoutes.length - 1;
|
|
157
195
|
return finalRoutes.map((route, index) => {
|
|
158
196
|
let cleanPath = route.path || `/${route.name}`;
|
|
159
197
|
// Clean up Expo Router internal /__root prefix
|
|
@@ -169,7 +207,7 @@ function buildStack(navigationState, isExpo) {
|
|
|
169
207
|
name: route.name,
|
|
170
208
|
pathname: cleanPath,
|
|
171
209
|
params: route.params || {},
|
|
172
|
-
isFocused: index ===
|
|
210
|
+
isFocused: index === focusIndex,
|
|
173
211
|
index,
|
|
174
212
|
canPop: index > 0
|
|
175
213
|
};
|
|
@@ -129,7 +129,21 @@ export const routeEventsSyncAdapter = {
|
|
|
129
129
|
// BaseEventStore is newest-FIRST, and the store only captures while
|
|
130
130
|
// something is subscribed.
|
|
131
131
|
const latest = routeEventStore.getEvents()[0];
|
|
132
|
-
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* A RECORDED event only wins while the recorder is running.
|
|
135
|
+
*
|
|
136
|
+
* The store starts capturing when its first subscriber arrives and stops
|
|
137
|
+
* with the last one, so an app with Ask Buoy on the phone and no
|
|
138
|
+
* dashboard attached has NO route events at all — the stack fallback
|
|
139
|
+
* below is its normal path, not the fresh-launch edge case this code was
|
|
140
|
+
* written for. Worse, events left over from a closed capture window are
|
|
141
|
+
* stale the moment the user navigates again: a live QA session read
|
|
142
|
+
* `/(tabs)/menu` from an event six scenarios after the app had moved to
|
|
143
|
+
* `/cart`. The live stack cannot be stale, so it wins whenever nothing
|
|
144
|
+
* is recording.
|
|
145
|
+
*/
|
|
146
|
+
if (latest && routeEventStore.isCapturing()) {
|
|
133
147
|
return {
|
|
134
148
|
path: latest.pathname,
|
|
135
149
|
params: toWireParams(latest.params),
|
|
@@ -137,13 +151,12 @@ export const routeEventsSyncAdapter = {
|
|
|
137
151
|
source: "event"
|
|
138
152
|
};
|
|
139
153
|
}
|
|
140
|
-
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const focused = navigationStackStore.getStack().find(item => item.isFocused) ?? navigationStackStore.getStack().slice(-1)[0];
|
|
154
|
+
|
|
155
|
+
// The live stack knows even when the history is empty, which is the
|
|
156
|
+
// difference between a macro that can run from anywhere and one that
|
|
157
|
+
// only works if you happen to be on the screen it was recorded from.
|
|
158
|
+
const stack = navigationStackStore.getStack();
|
|
159
|
+
const focused = stack.find(item => item.isFocused) ?? stack[stack.length - 1];
|
|
147
160
|
if (focused?.pathname) {
|
|
148
161
|
return {
|
|
149
162
|
path: focused.pathname,
|
|
@@ -152,6 +165,19 @@ export const routeEventsSyncAdapter = {
|
|
|
152
165
|
source: "stack"
|
|
153
166
|
};
|
|
154
167
|
}
|
|
168
|
+
|
|
169
|
+
// No live stack (no <RouteTracker/>) and the recorder is off: an old
|
|
170
|
+
// event is all there is. Say that it may be stale rather than passing it
|
|
171
|
+
// off as where the app is.
|
|
172
|
+
if (latest) {
|
|
173
|
+
return {
|
|
174
|
+
path: latest.pathname,
|
|
175
|
+
params: toWireParams(latest.params),
|
|
176
|
+
at: latest.timestamp,
|
|
177
|
+
source: "event",
|
|
178
|
+
stale: true
|
|
179
|
+
};
|
|
180
|
+
}
|
|
155
181
|
return {
|
|
156
182
|
path: null,
|
|
157
183
|
params: {},
|
|
@@ -82,14 +82,39 @@ function buildNestedNavigateAction(path) {
|
|
|
82
82
|
// ============================================================================
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
|
-
* Recursively collect
|
|
85
|
+
* Recursively collect the routes from the navigation state tree.
|
|
86
|
+
*
|
|
87
|
+
* FOCUS COMES FROM `state.index`, NEVER FROM POSITION. React Navigation names
|
|
88
|
+
* the focused route by index within `routes`; the array's order is declaration
|
|
89
|
+
* order. `buildStack` used to equate the two — "the last route in the collected
|
|
90
|
+
* list is the focused one" — and a hidden tab declared last (`href: null` on an
|
|
91
|
+
* expo-router `Tabs.Screen`) then became the reported current screen for the
|
|
92
|
+
* whole session. Measured on a real app: Home and Rewards both reported as a
|
|
93
|
+
* hidden Menu tab, in every turn of a 55-scenario QA run, because `menu` was
|
|
94
|
+
* declared last.
|
|
95
|
+
*
|
|
96
|
+
* TAB AND DRAWER SIBLINGS ARE NOT A STACK. They are alternative destinations
|
|
97
|
+
* that happen to be mounted at the same time; `canPop` and `popToIndex` never
|
|
98
|
+
* meant anything for them. Only the focused branch of a tab/drawer is
|
|
99
|
+
* collected, so what comes back is the stack you could actually pop.
|
|
86
100
|
*/
|
|
87
|
-
function collectRoutesFromState(state, depth = 0, parentPath = "") {
|
|
88
|
-
if (!state || !state.routes)
|
|
101
|
+
function collectRoutesFromState(state, depth = 0, parentPath = "", onFocusedChain = true) {
|
|
102
|
+
if (!state || !Array.isArray(state.routes) || state.routes.length === 0) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
89
105
|
const routes = [];
|
|
106
|
+
|
|
107
|
+
// An absent or out-of-range `index` is incomplete state (mid-rehydration, a
|
|
108
|
+
// partially built child). Fall back to the last route — a stack's top — and
|
|
109
|
+
// never to an arbitrary sibling.
|
|
110
|
+
const declaredIndex = typeof state.index === "number" ? state.index : NaN;
|
|
111
|
+
const focusedIndex = Number.isInteger(declaredIndex) && declaredIndex >= 0 && declaredIndex < state.routes.length ? declaredIndex : state.routes.length - 1;
|
|
112
|
+
const navigatorType = typeof state.type === "string" ? state.type : undefined;
|
|
113
|
+
const siblingsAreStack = navigatorType !== "tab" && navigatorType !== "drawer";
|
|
90
114
|
for (let i = 0; i < state.routes.length; i++) {
|
|
115
|
+
if (!siblingsAreStack && i !== focusedIndex) continue;
|
|
91
116
|
const route = state.routes[i];
|
|
92
|
-
const isFocused = i ===
|
|
117
|
+
const isFocused = i === focusedIndex;
|
|
93
118
|
|
|
94
119
|
// Build the path
|
|
95
120
|
let pathname = route.name;
|
|
@@ -113,27 +138,32 @@ function collectRoutesFromState(state, depth = 0, parentPath = "") {
|
|
|
113
138
|
});
|
|
114
139
|
}
|
|
115
140
|
}
|
|
141
|
+
|
|
142
|
+
// Descend the focused branch first: whatever it yields owns the focus, and
|
|
143
|
+
// this route only keeps it when nothing deeper claimed it.
|
|
144
|
+
const onChain = onFocusedChain && isFocused;
|
|
145
|
+
const nestedRoutes = onChain && route.state ? collectRoutesFromState(route.state, depth + 1, pathname, true) : [];
|
|
116
146
|
routes.push({
|
|
117
147
|
key: route.key,
|
|
118
148
|
name: route.name,
|
|
119
149
|
path: pathname,
|
|
120
150
|
params: route.params || {},
|
|
121
|
-
state: route.state
|
|
151
|
+
state: route.state,
|
|
152
|
+
isFocused: onChain && nestedRoutes.length === 0
|
|
122
153
|
});
|
|
123
|
-
|
|
124
|
-
// If this route has nested state and is focused, recurse
|
|
125
|
-
if (isFocused && route.state) {
|
|
126
|
-
const nestedRoutes = collectRoutesFromState(route.state, depth + 1, pathname);
|
|
127
|
-
routes.push(...nestedRoutes);
|
|
128
|
-
}
|
|
154
|
+
routes.push(...nestedRoutes);
|
|
129
155
|
}
|
|
130
156
|
return routes;
|
|
131
157
|
}
|
|
132
158
|
|
|
133
159
|
/**
|
|
134
|
-
* Transform raw navigation state into display items
|
|
160
|
+
* Transform raw navigation state into display items.
|
|
161
|
+
*
|
|
162
|
+
* Exported for tests: the focus rule below is the one thing every route answer
|
|
163
|
+
* in the product rests on, and it was previously only reachable by extracting
|
|
164
|
+
* the function from source with the TypeScript AST.
|
|
135
165
|
*/
|
|
136
|
-
function buildStack(navigationState, isExpo) {
|
|
166
|
+
export function buildStack(navigationState, isExpo) {
|
|
137
167
|
if (!navigationState) return [];
|
|
138
168
|
try {
|
|
139
169
|
const routes = collectRoutesFromState(navigationState);
|
|
@@ -150,7 +180,14 @@ function buildStack(navigationState, isExpo) {
|
|
|
150
180
|
// If we filtered everything out, just keep the last route
|
|
151
181
|
const finalRoutes = filteredRoutes.length > 0 ? filteredRoutes : routes.slice(-1);
|
|
152
182
|
|
|
153
|
-
|
|
183
|
+
/**
|
|
184
|
+
* Focus survives filtering. It is decided in `collectRoutesFromState` from
|
|
185
|
+
* `state.index`; the only case that falls back to the last item is one
|
|
186
|
+
* where the filter dropped the focused route itself (an internal expo
|
|
187
|
+
* layout), which is the one situation the old rule was ever right for.
|
|
188
|
+
*/
|
|
189
|
+
const collectedFocus = finalRoutes.findIndex(route => route.isFocused);
|
|
190
|
+
const focusIndex = collectedFocus >= 0 ? collectedFocus : finalRoutes.length - 1;
|
|
154
191
|
return finalRoutes.map((route, index) => {
|
|
155
192
|
let cleanPath = route.path || `/${route.name}`;
|
|
156
193
|
// Clean up Expo Router internal /__root prefix
|
|
@@ -166,7 +203,7 @@ function buildStack(navigationState, isExpo) {
|
|
|
166
203
|
name: route.name,
|
|
167
204
|
pathname: cleanPath,
|
|
168
205
|
params: route.params || {},
|
|
169
|
-
isFocused: index ===
|
|
206
|
+
isFocused: index === focusIndex,
|
|
170
207
|
index,
|
|
171
208
|
canPop: index > 0
|
|
172
209
|
};
|
|
@@ -66,16 +66,25 @@ export declare const routeEventsSyncAdapter: {
|
|
|
66
66
|
params: Record<string, string | string[]>;
|
|
67
67
|
at: number;
|
|
68
68
|
source: "event";
|
|
69
|
+
stale?: undefined;
|
|
69
70
|
} | {
|
|
70
71
|
path: string;
|
|
71
72
|
params: Record<string, any>;
|
|
72
73
|
at: null;
|
|
73
74
|
source: "stack";
|
|
75
|
+
stale?: undefined;
|
|
76
|
+
} | {
|
|
77
|
+
path: string;
|
|
78
|
+
params: Record<string, string | string[]>;
|
|
79
|
+
at: number;
|
|
80
|
+
source: "event";
|
|
81
|
+
stale: true;
|
|
74
82
|
} | {
|
|
75
83
|
path: null;
|
|
76
84
|
params: {};
|
|
77
85
|
at: null;
|
|
78
86
|
source: null;
|
|
87
|
+
stale?: undefined;
|
|
79
88
|
};
|
|
80
89
|
/**
|
|
81
90
|
* Navigate the device to a concrete path. The dashboard resolves any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeEventsSyncAdapter.d.ts","sourceRoot":"","sources":["../../../src/sync/routeEventsSyncAdapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,QAAY,CAAC;AA4BrD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;IAC/B,6EAA6E;IAC7E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAWD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB;;uBAEhB,sBAAsB;0BAKjB,MAAM,IAAI;;;QAkC9B;;;;;;;;WAQG
|
|
1
|
+
{"version":3,"file":"routeEventsSyncAdapter.d.ts","sourceRoot":"","sources":["../../../src/sync/routeEventsSyncAdapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,QAAY,CAAC;AA4BrD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;IAC/B,6EAA6E;IAC7E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAWD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB;;uBAEhB,sBAAsB;0BAKjB,MAAM,IAAI;;;QAkC9B;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;;;;;;;;;QAyDH;;;WAGG;4BACiB,OAAO;;;;;;;;;wCAsCK,OAAO;;;mCAUZ,OAAO;;;;;;;;;;CAuBrC,CAAC"}
|
|
@@ -38,6 +38,14 @@ export interface UseNavigationStackResult {
|
|
|
38
38
|
goBack: () => void;
|
|
39
39
|
popToTop: () => void;
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Transform raw navigation state into display items.
|
|
43
|
+
*
|
|
44
|
+
* Exported for tests: the focus rule below is the one thing every route answer
|
|
45
|
+
* in the product rests on, and it was previously only reachable by extracting
|
|
46
|
+
* the function from source with the TypeScript AST.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildStack(navigationState: any, isExpo: boolean): StackDisplayItem[];
|
|
41
49
|
/**
|
|
42
50
|
* Access the current navigation stack.
|
|
43
51
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigationStack.d.ts","sourceRoot":"","sources":["../../src/useNavigationStack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"useNavigationStack.d.ts","sourceRoot":"","sources":["../../src/useNavigationStack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiCH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IAEvC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAGlB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAGpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC;;;;;OAKG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5D,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAqJD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAwDpF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,IAAI,wBAAwB,CAiM7D"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/route-events",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.36",
|
|
4
4
|
"description": "Navigation devtool for React Native — live stack, full sitemap, jump to any screen. Expo Router & React Navigation. Part of Buoy devtools.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@buoy-gg/
|
|
30
|
-
"@buoy-gg/
|
|
29
|
+
"@buoy-gg/shared-ui": "^7.0.36",
|
|
30
|
+
"@buoy-gg/floating-tools-core": "^7.0.36"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@buoy-gg/license": "7.0.
|
|
33
|
+
"@buoy-gg/license": "7.0.36",
|
|
34
34
|
"@react-native-async-storage/async-storage": "^2.0.0 || ^3.1.0",
|
|
35
35
|
"@react-navigation/native": "*",
|
|
36
36
|
"expo-router": "*",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@types/react-native": "^0.73.0",
|
|
53
53
|
"expo-router": "~5.0.7",
|
|
54
54
|
"typescript": "~5.8.3",
|
|
55
|
-
"@buoy-gg/license": "^7.0.
|
|
55
|
+
"@buoy-gg/license": "^7.0.36"
|
|
56
56
|
},
|
|
57
57
|
"react-native-builder-bob": {
|
|
58
58
|
"source": "src",
|