@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.
@@ -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
- if (latest) {
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
- // Nothing has navigated yet — which is exactly the state a freshly
143
- // launched app is in, and exactly when a macro recorder needs to know
144
- // where it is starting from. The live stack knows even when the history
145
- // is empty, so falling back to it is the difference between a macro that
146
- // can run from anywhere and one that only works if you happen to be on
147
- // the screen it was recorded from.
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 all routes from the navigation state tree
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) return [];
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 === state.index;
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
- // The last route in the collected list is the focused one
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 === finalRoutes.length - 1,
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
- if (latest) {
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
- // Nothing has navigated yet — which is exactly the state a freshly
141
- // launched app is in, and exactly when a macro recorder needs to know
142
- // where it is starting from. The live stack knows even when the history
143
- // is empty, so falling back to it is the difference between a macro that
144
- // can run from anywhere and one that only works if you happen to be on
145
- // the screen it was recorded from.
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 all routes from the navigation state tree
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) return [];
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 === state.index;
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
- // The last route in the collected list is the focused one
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 === finalRoutes.length - 1,
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;;;;;;;;;;;;;;;;;QAgCH;;;WAGG;4BACiB,OAAO;;;;;;;;;wCAsCK,OAAO;;;mCAUZ,OAAO;;;;;;;;;;CAuBrC,CAAC"}
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;AA4BH,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;AAuKD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,IAAI,wBAAwB,CAiM7D"}
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.35",
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/floating-tools-core": "^7.0.35",
30
- "@buoy-gg/shared-ui": "^7.0.35"
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.35",
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.35"
55
+ "@buoy-gg/license": "^7.0.36"
56
56
  },
57
57
  "react-native-builder-bob": {
58
58
  "source": "src",