@novodip/expo-router-devtools 1.0.2 → 1.0.4

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/index.esm.js CHANGED
@@ -1,195 +1,8 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { usePathname, useGlobalSearchParams, useRouter } from 'expo-router';
3
- import { TurboModuleRegistry, View, Pressable, Text, ScrollView, StyleSheet, Platform } from 'react-native';
3
+ import * as SecureStore from 'expo-secure-store';
4
4
  import { useState, useEffect, useCallback } from 'react';
5
-
6
- // We default to an empty object shim wherever we don't have an environment-specific implementation
7
- /**
8
- * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.
9
- * Use `requireNativeModule` or `requireOptionalNativeModule` instead.
10
- */
11
- var NativeModulesProxy = {};
12
-
13
- function createTurboModuleToExpoProxy(turboModule, name) {
14
- return null;
15
- }
16
-
17
- /**
18
- * Imports the native module registered with given name. In the first place it tries to load
19
- * the module installed through the JSI host object and then falls back to the bridge proxy module.
20
- * Notice that the modules loaded from the proxy may not support some features like synchronous functions.
21
- *
22
- * @param moduleName Name of the requested native module.
23
- * @returns Object representing the native module.
24
- * @throws Error when there is no native module with given name.
25
- */
26
- function requireNativeModule(moduleName) {
27
- const nativeModule = requireOptionalNativeModule(moduleName);
28
- if (!nativeModule) {
29
- throw new Error(`Cannot find native module '${moduleName}'`);
30
- }
31
- return nativeModule;
32
- }
33
- /**
34
- * Imports the native module registered with the given name. The same as `requireNativeModule`,
35
- * but returns `null` when the module cannot be found instead of throwing an error.
36
- *
37
- * @param moduleName Name of the requested native module.
38
- * @returns Object representing the native module or `null` when it cannot be found.
39
- */
40
- function requireOptionalNativeModule(moduleName) {
41
- var _a, _b, _c, _d, _e;
42
- try {
43
- return ((_e = (_d = (_c = (_b = (_a = globalThis.expo) === null || _a === void 0 ? void 0 : _a.modules) === null || _b === void 0 ? void 0 : _b[moduleName]) !== null && _c !== void 0 ? _c : NativeModulesProxy[moduleName]) !== null && _d !== void 0 ? _d : createTurboModuleToExpoProxy(TurboModuleRegistry.get(moduleName), moduleName)) !== null && _e !== void 0 ? _e : null);
44
- }
45
- catch (e) {
46
- const error = e;
47
- console.warn(`An error occurred while requiring the '${moduleName}' module: ${error.message}`);
48
- return null;
49
- }
50
- }
51
-
52
- var ExpoSecureStore = requireNativeModule('ExpoSecureStore');
53
-
54
- const VALUE_BYTES_LIMIT = 2048;
55
- // note this probably could be JS-engine dependent
56
- // inspired by https://stackoverflow.com/a/39488643
57
- function byteCountOverLimit(value, limit) {
58
- let bytes = 0;
59
- for (let i = 0; i < value.length; i++) {
60
- const codePoint = value.charCodeAt(i);
61
- // Lone surrogates cannot be passed to encodeURI
62
- if (codePoint >= 0xd800 && codePoint < 0xe000) {
63
- if (codePoint < 0xdc00 && i + 1 < value.length) {
64
- const next = value.charCodeAt(i + 1);
65
- if (next >= 0xdc00 && next < 0xe000) {
66
- bytes += 4;
67
- if (bytes > limit) {
68
- return true;
69
- }
70
- i++;
71
- continue;
72
- }
73
- }
74
- }
75
- bytes += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : 3;
76
- if (bytes > limit) {
77
- return true;
78
- }
79
- }
80
- return bytes > limit;
81
- }
82
-
83
- // @needsAudit
84
- /**
85
- * The data in the keychain item cannot be accessed after a restart until the device has been
86
- * unlocked once by the user. This may be useful if you need to access the item when the phone
87
- * is locked.
88
- */
89
- ExpoSecureStore.AFTER_FIRST_UNLOCK;
90
- // @needsAudit
91
- /**
92
- * Similar to `AFTER_FIRST_UNLOCK`, except the entry is not migrated to a new device when restoring
93
- * from a backup.
94
- */
95
- ExpoSecureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY;
96
- // @needsAudit
97
- /**
98
- * The data in the keychain item can always be accessed regardless of whether the device is locked.
99
- * This is the least secure option.
100
- *
101
- * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK`.
102
- */
103
- ExpoSecureStore.ALWAYS;
104
- // @needsAudit
105
- /**
106
- * Similar to `WHEN_UNLOCKED_THIS_DEVICE_ONLY`, except the user must have set a passcode in order to
107
- * store an entry. If the user removes their passcode, the entry will be deleted.
108
- */
109
- ExpoSecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY;
110
- // @needsAudit
111
- /**
112
- * Similar to `ALWAYS`, except the entry is not migrated to a new device when restoring from a backup.
113
- *
114
- * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY`.
115
- */
116
- ExpoSecureStore.ALWAYS_THIS_DEVICE_ONLY;
117
- // @needsAudit
118
- /**
119
- * The data in the keychain item can be accessed only while the device is unlocked by the user.
120
- */
121
- ExpoSecureStore.WHEN_UNLOCKED;
122
- // @needsAudit
123
- /**
124
- * Similar to `WHEN_UNLOCKED`, except the entry is not migrated to a new device when restoring from
125
- * a backup.
126
- */
127
- ExpoSecureStore.WHEN_UNLOCKED_THIS_DEVICE_ONLY;
128
- // @needsAudit
129
- /**
130
- * Delete the value associated with the provided key.
131
- *
132
- * @param key The key that was used to store the associated value.
133
- * @param options An [`SecureStoreOptions`](#securestoreoptions) object.
134
- *
135
- * @return A promise that rejects if the value can't be deleted.
136
- */
137
- async function deleteItemAsync(key, options = {}) {
138
- ensureValidKey(key);
139
- await ExpoSecureStore.deleteValueWithKeyAsync(key, options);
140
- }
141
- // @needsAudit
142
- /**
143
- * Reads the stored value associated with the provided key.
144
- *
145
- * @param key The key that was used to store the associated value.
146
- * @param options An [`SecureStoreOptions`](#securestoreoptions) object.
147
- *
148
- * @return A promise that resolves to the previously stored value. It resolves with `null` if there is no entry
149
- * for the given key or if the key has been invalidated. It rejects if an error occurs while retrieving the value.
150
- *
151
- * > Keys are invalidated by the system when biometrics change, such as adding a new fingerprint or changing the face profile used for face recognition.
152
- * > After a key has been invalidated, it becomes impossible to read its value.
153
- * > This only applies to values stored with `requireAuthentication` set to `true`.
154
- */
155
- async function getItemAsync(key, options = {}) {
156
- ensureValidKey(key);
157
- return await ExpoSecureStore.getValueWithKeyAsync(key, options);
158
- }
159
- // @needsAudit
160
- /**
161
- * Stores a key–value pair.
162
- *
163
- * @param key The key to associate with the stored value. Keys may contain alphanumeric characters, `.`, `-`, and `_`.
164
- * @param value The value to store. Size limit is 2048 bytes.
165
- * @param options An [`SecureStoreOptions`](#securestoreoptions) object.
166
- *
167
- * @return A promise that rejects if value cannot be stored on the device.
168
- */
169
- async function setItemAsync(key, value, options = {}) {
170
- ensureValidKey(key);
171
- if (!isValidValue(value)) {
172
- throw new Error(`Invalid value provided to SecureStore. Values must be strings; consider JSON-encoding your values if they are serializable.`);
173
- }
174
- await ExpoSecureStore.setValueWithKeyAsync(value, key, options);
175
- }
176
- function ensureValidKey(key) {
177
- if (!isValidKey(key)) {
178
- throw new Error(`Invalid key provided to SecureStore. Keys must not be empty and contain only alphanumeric characters, ".", "-", and "_".`);
179
- }
180
- }
181
- function isValidKey(key) {
182
- return typeof key === 'string' && /^[\w.-]+$/.test(key);
183
- }
184
- function isValidValue(value) {
185
- if (typeof value !== 'string') {
186
- return false;
187
- }
188
- if (byteCountOverLimit(value, VALUE_BYTES_LIMIT)) {
189
- console.warn(`Value being stored in SecureStore is larger than ${VALUE_BYTES_LIMIT} bytes and it may not be stored successfully. In a future SDK version, this call may throw an error.`);
190
- }
191
- return true;
192
- }
5
+ import { View, Pressable, Text, ScrollView, StyleSheet, Platform } from 'react-native';
193
6
 
194
7
  const STORAGE_PREFIX = 'expo-router-devtools_';
195
8
  const MAX_HISTORY = 10;
@@ -220,12 +33,12 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
220
33
  useEffect(() => {
221
34
  const loadData = async () => {
222
35
  try {
223
- const savedRoutesData = await getItemAsync(SAVED_ROUTES_KEY);
36
+ const savedRoutesData = await SecureStore.getItemAsync(SAVED_ROUTES_KEY);
224
37
  if (savedRoutesData) {
225
38
  setSavedRoutes(JSON.parse(savedRoutesData));
226
39
  }
227
40
  if (enableHistory) {
228
- const historyData = await getItemAsync(HISTORY_KEY);
41
+ const historyData = await SecureStore.getItemAsync(HISTORY_KEY);
229
42
  if (historyData) {
230
43
  setRouteHistory(JSON.parse(historyData));
231
44
  }
@@ -245,7 +58,7 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
245
58
  try {
246
59
  const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory);
247
60
  setRouteHistory(newHistory);
248
- await setItemAsync(HISTORY_KEY, JSON.stringify(newHistory));
61
+ await SecureStore.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory));
249
62
  }
250
63
  catch (error) {
251
64
  console.error('[ExpoRouterDevTools] Error updating history:', error);
@@ -264,7 +77,7 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
264
77
  const updated = [...savedRoutes, newRoute];
265
78
  setSavedRoutes(updated);
266
79
  try {
267
- await setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
80
+ await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
268
81
  }
269
82
  catch (error) {
270
83
  console.error('[ExpoRouterDevTools] Error saving route:', error);
@@ -284,7 +97,7 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
284
97
  const updated = savedRoutes.filter((_, i) => i !== index);
285
98
  setSavedRoutes(updated);
286
99
  try {
287
- await setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
100
+ await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
288
101
  }
289
102
  catch (error) {
290
103
  console.error('[ExpoRouterDevTools] Error deleting route:', error);
@@ -295,8 +108,8 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
295
108
  setSavedRoutes([]);
296
109
  setRouteHistory([]);
297
110
  try {
298
- await deleteItemAsync(SAVED_ROUTES_KEY);
299
- await deleteItemAsync(HISTORY_KEY);
111
+ await SecureStore.deleteItemAsync(SAVED_ROUTES_KEY);
112
+ await SecureStore.deleteItemAsync(HISTORY_KEY);
300
113
  }
301
114
  catch (error) {
302
115
  console.error('[ExpoRouterDevTools] Error clearing data:', error);
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/expo-modules-core/src/NativeModulesProxy.ts","../node_modules/expo-modules-core/src/TurboModuleToExpoModuleProxy.ts","../node_modules/expo-modules-core/src/requireNativeModule.ts","../node_modules/expo-secure-store/build/ExpoSecureStore.js","../node_modules/expo-secure-store/build/byteCounter.js","../node_modules/expo-secure-store/build/SecureStore.js","../src/ExpoRouterDevTools.tsx"],"sourcesContent":["import type { ProxyNativeModule } from './NativeModulesProxy.types';\n\n// We default to an empty object shim wherever we don't have an environment-specific implementation\n\n/**\n * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.\n * Use `requireNativeModule` or `requireOptionalNativeModule` instead.\n */\nexport default {} as Record<string, ProxyNativeModule>;\n","// Copyright © 2024 650 Industries.\nimport type { TurboModule } from 'react-native';\n\nexport function createTurboModuleToExpoProxy(turboModule: TurboModule | null, name: string) {\n return null;\n}\n","import { TurboModuleRegistry } from 'react-native';\n\nimport NativeModulesProxy from './NativeModulesProxy';\nimport { createTurboModuleToExpoProxy } from './TurboModuleToExpoModuleProxy';\nimport { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';\n\n/**\n * Imports the native module registered with given name. In the first place it tries to load\n * the module installed through the JSI host object and then falls back to the bridge proxy module.\n * Notice that the modules loaded from the proxy may not support some features like synchronous functions.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module.\n * @throws Error when there is no native module with given name.\n */\nexport function requireNativeModule<ModuleType = any>(moduleName: string): ModuleType {\n const nativeModule = requireOptionalNativeModule<ModuleType>(moduleName);\n\n if (!nativeModule) {\n throw new Error(`Cannot find native module '${moduleName}'`);\n }\n return nativeModule;\n}\n\n/**\n * Imports the native module registered with the given name. The same as `requireNativeModule`,\n * but returns `null` when the module cannot be found instead of throwing an error.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module or `null` when it cannot be found.\n */\nexport function requireOptionalNativeModule<ModuleType = any>(\n moduleName: string\n): ModuleType | null {\n ensureNativeModulesAreInstalled();\n\n try {\n return (\n globalThis.expo?.modules?.[moduleName] ??\n NativeModulesProxy[moduleName] ??\n createTurboModuleToExpoProxy(TurboModuleRegistry.get(moduleName), moduleName) ??\n null\n );\n } catch (e) {\n const error = e as Error;\n console.warn(`An error occurred while requiring the '${moduleName}' module: ${error.message}`);\n return null;\n }\n}\n","import { requireNativeModule } from 'expo-modules-core';\nexport default requireNativeModule('ExpoSecureStore');\n//# sourceMappingURL=ExpoSecureStore.js.map","export const VALUE_BYTES_LIMIT = 2048;\n// note this probably could be JS-engine dependent\n// inspired by https://stackoverflow.com/a/39488643\nexport function byteCountOverLimit(value, limit) {\n let bytes = 0;\n for (let i = 0; i < value.length; i++) {\n const codePoint = value.charCodeAt(i);\n // Lone surrogates cannot be passed to encodeURI\n if (codePoint >= 0xd800 && codePoint < 0xe000) {\n if (codePoint < 0xdc00 && i + 1 < value.length) {\n const next = value.charCodeAt(i + 1);\n if (next >= 0xdc00 && next < 0xe000) {\n bytes += 4;\n if (bytes > limit) {\n return true;\n }\n i++;\n continue;\n }\n }\n }\n bytes += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : 3;\n if (bytes > limit) {\n return true;\n }\n }\n return bytes > limit;\n}\n//# sourceMappingURL=byteCounter.js.map","import ExpoSecureStore from './ExpoSecureStore';\nimport { byteCountOverLimit, VALUE_BYTES_LIMIT } from './byteCounter';\n// @needsAudit\n/**\n * The data in the keychain item cannot be accessed after a restart until the device has been\n * unlocked once by the user. This may be useful if you need to access the item when the phone\n * is locked.\n */\nexport const AFTER_FIRST_UNLOCK = ExpoSecureStore.AFTER_FIRST_UNLOCK;\n// @needsAudit\n/**\n * Similar to `AFTER_FIRST_UNLOCK`, except the entry is not migrated to a new device when restoring\n * from a backup.\n */\nexport const AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY = ExpoSecureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * The data in the keychain item can always be accessed regardless of whether the device is locked.\n * This is the least secure option.\n *\n * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK`.\n */\nexport const ALWAYS = ExpoSecureStore.ALWAYS;\n// @needsAudit\n/**\n * Similar to `WHEN_UNLOCKED_THIS_DEVICE_ONLY`, except the user must have set a passcode in order to\n * store an entry. If the user removes their passcode, the entry will be deleted.\n */\nexport const WHEN_PASSCODE_SET_THIS_DEVICE_ONLY = ExpoSecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * Similar to `ALWAYS`, except the entry is not migrated to a new device when restoring from a backup.\n *\n * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY`.\n */\nexport const ALWAYS_THIS_DEVICE_ONLY = ExpoSecureStore.ALWAYS_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * The data in the keychain item can be accessed only while the device is unlocked by the user.\n */\nexport const WHEN_UNLOCKED = ExpoSecureStore.WHEN_UNLOCKED;\n// @needsAudit\n/**\n * Similar to `WHEN_UNLOCKED`, except the entry is not migrated to a new device when restoring from\n * a backup.\n */\nexport const WHEN_UNLOCKED_THIS_DEVICE_ONLY = ExpoSecureStore.WHEN_UNLOCKED_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * Returns whether the SecureStore API is enabled on the current device. This does not check the app\n * permissions.\n *\n * @return Promise which fulfils with a `boolean`, indicating whether the SecureStore API is available\n * on the current device. Currently, this resolves `true` on Android and iOS only.\n */\nexport async function isAvailableAsync() {\n return !!ExpoSecureStore.getValueWithKeyAsync;\n}\n// @needsAudit\n/**\n * Delete the value associated with the provided key.\n *\n * @param key The key that was used to store the associated value.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return A promise that rejects if the value can't be deleted.\n */\nexport async function deleteItemAsync(key, options = {}) {\n ensureValidKey(key);\n await ExpoSecureStore.deleteValueWithKeyAsync(key, options);\n}\n// @needsAudit\n/**\n * Reads the stored value associated with the provided key.\n *\n * @param key The key that was used to store the associated value.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return A promise that resolves to the previously stored value. It resolves with `null` if there is no entry\n * for the given key or if the key has been invalidated. It rejects if an error occurs while retrieving the value.\n *\n * > Keys are invalidated by the system when biometrics change, such as adding a new fingerprint or changing the face profile used for face recognition.\n * > After a key has been invalidated, it becomes impossible to read its value.\n * > This only applies to values stored with `requireAuthentication` set to `true`.\n */\nexport async function getItemAsync(key, options = {}) {\n ensureValidKey(key);\n return await ExpoSecureStore.getValueWithKeyAsync(key, options);\n}\n// @needsAudit\n/**\n * Stores a key–value pair.\n *\n * @param key The key to associate with the stored value. Keys may contain alphanumeric characters, `.`, `-`, and `_`.\n * @param value The value to store. Size limit is 2048 bytes.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return A promise that rejects if value cannot be stored on the device.\n */\nexport async function setItemAsync(key, value, options = {}) {\n ensureValidKey(key);\n if (!isValidValue(value)) {\n throw new Error(`Invalid value provided to SecureStore. Values must be strings; consider JSON-encoding your values if they are serializable.`);\n }\n await ExpoSecureStore.setValueWithKeyAsync(value, key, options);\n}\n/**\n * Stores a key–value pair synchronously.\n * > **Note:** This function blocks the JavaScript thread, so the application may not be interactive when the `requireAuthentication` option is set to `true` until the user authenticates.\n *\n * @param key The key to associate with the stored value. Keys may contain alphanumeric characters, `.`, `-`, and `_`.\n * @param value The value to store. Size limit is 2048 bytes.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n */\nexport function setItem(key, value, options = {}) {\n ensureValidKey(key);\n if (!isValidValue(value)) {\n throw new Error(`Invalid value provided to SecureStore. Values must be strings; consider JSON-encoding your values if they are serializable.`);\n }\n return ExpoSecureStore.setValueWithKeySync(value, key, options);\n}\n/**\n * Synchronously reads the stored value associated with the provided key.\n * > **Note:** This function blocks the JavaScript thread, so the application may not be interactive when reading a value with `requireAuthentication`\n * > option set to `true` until the user authenticates.\n * @param key The key that was used to store the associated value.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return Previously stored value. It resolves with `null` if there is no entry\n * for the given key or if the key has been invalidated.\n */\nexport function getItem(key, options = {}) {\n ensureValidKey(key);\n return ExpoSecureStore.getValueWithKeySync(key, options);\n}\n/**\n * Checks if the value can be saved with `requireAuthentication` option enabled.\n * @return `true` if the device supports biometric authentication and the enrolled method is sufficiently secure. Otherwise, returns `false`. Always returns false on tvOS.\n * @platform android\n * @platform ios\n */\nexport function canUseBiometricAuthentication() {\n return ExpoSecureStore.canUseBiometricAuthentication();\n}\nfunction ensureValidKey(key) {\n if (!isValidKey(key)) {\n throw new Error(`Invalid key provided to SecureStore. Keys must not be empty and contain only alphanumeric characters, \".\", \"-\", and \"_\".`);\n }\n}\nfunction isValidKey(key) {\n return typeof key === 'string' && /^[\\w.-]+$/.test(key);\n}\nfunction isValidValue(value) {\n if (typeof value !== 'string') {\n return false;\n }\n if (byteCountOverLimit(value, VALUE_BYTES_LIMIT)) {\n console.warn(`Value being stored in SecureStore is larger than ${VALUE_BYTES_LIMIT} bytes and it may not be stored successfully. In a future SDK version, this call may throw an error.`);\n }\n return true;\n}\n//# sourceMappingURL=SecureStore.js.map","import { useGlobalSearchParams, usePathname, useRouter, type RelativePathString } from 'expo-router'\nimport * as SecureStore from 'expo-secure-store'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport { Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'\nimport { ExpoRouterDevToolsProps, SavedRoute } from './interfaces/base'\n\nconst STORAGE_PREFIX = 'expo-router-devtools_'\nconst MAX_HISTORY = 10\n\nconst ExpoRouterDevTools: React.FC<ExpoRouterDevToolsProps> = ({\n position = 'top',\n theme = 'light',\n hideInProduction = true,\n storageKeyPrefix = STORAGE_PREFIX,\n onRouteChange,\n enableHistory = true,\n maxHistory = MAX_HISTORY,\n maxNumOfLines = 3,\n}) => {\n const pathname = usePathname()\n const searchParams = useGlobalSearchParams()\n const router = useRouter()\n\n const [currentRoute, setCurrentRoute] = useState('')\n const [savedRoutes, setSavedRoutes] = useState<SavedRoute[]>([])\n const [routeHistory, setRouteHistory] = useState<string[]>([])\n const [isExpanded, setIsExpanded] = useState(false)\n const [showHistory, setShowHistory] = useState(false)\n\n const SAVED_ROUTES_KEY = `${storageKeyPrefix}saved-routes`\n const HISTORY_KEY = `${storageKeyPrefix}history`\n\n // Build current full route\n useEffect(() => {\n const query = Object.keys(searchParams).length\n ? '?' +\n Object.entries(searchParams)\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\n .join('&')\n : ''\n\n const fullRoute = `${pathname}${query}`\n setCurrentRoute(fullRoute)\n onRouteChange?.(fullRoute)\n }, [pathname, searchParams, onRouteChange])\n\n // Load saved routes and history\n useEffect(() => {\n const loadData = async () => {\n try {\n const savedRoutesData = await SecureStore.getItemAsync(SAVED_ROUTES_KEY)\n if (savedRoutesData) {\n setSavedRoutes(JSON.parse(savedRoutesData))\n }\n\n if (enableHistory) {\n const historyData = await SecureStore.getItemAsync(HISTORY_KEY)\n if (historyData) {\n setRouteHistory(JSON.parse(historyData))\n }\n }\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error loading data:', error)\n }\n }\n\n loadData()\n }, [SAVED_ROUTES_KEY, HISTORY_KEY, enableHistory])\n\n // Update history when route changes\n useEffect(() => {\n if (!enableHistory || !currentRoute) return\n\n const updateHistory = async () => {\n try {\n const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory)\n setRouteHistory(newHistory)\n await SecureStore.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error updating history:', error)\n }\n }\n\n updateHistory()\n }, [currentRoute, enableHistory, maxHistory, HISTORY_KEY])\n\n // Save current route\n const saveRoute = useCallback(async () => {\n const label = `Route ${savedRoutes.length + 1}`\n const newRoute: SavedRoute = {\n route: currentRoute,\n label,\n timestamp: Date.now(),\n }\n\n const updated = [...savedRoutes, newRoute]\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error saving route:', error)\n }\n }, [currentRoute, savedRoutes, SAVED_ROUTES_KEY])\n\n // Navigate to route\n const navigateToRoute = useCallback(\n (route: string) => {\n try {\n router.push(route as RelativePathString)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Navigation error:', error)\n }\n },\n [router]\n )\n\n // Delete saved route\n const deleteSavedRoute = useCallback(\n async (index: number) => {\n const updated = savedRoutes.filter((_, i) => i !== index)\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error deleting route:', error)\n }\n },\n [savedRoutes, SAVED_ROUTES_KEY]\n )\n\n // Clear all data\n const clearAll = useCallback(async () => {\n setSavedRoutes([])\n setRouteHistory([])\n\n try {\n await SecureStore.deleteItemAsync(SAVED_ROUTES_KEY)\n await SecureStore.deleteItemAsync(HISTORY_KEY)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error clearing data:', error)\n }\n }, [SAVED_ROUTES_KEY, HISTORY_KEY])\n\n const isDark = theme === 'dark'\n const styles = createStyles(isDark, position)\n\n // Check if we should render in production\n if (hideInProduction && !__DEV__) {\n return null\n }\n\n return (\n <View style={styles.container}>\n {/* Current route bar */}\n <Pressable onPress={() => setIsExpanded(!isExpanded)} style={styles.routeBar}>\n <Text style={styles.routeText} numberOfLines={maxNumOfLines}>\n 🛣️ {currentRoute || '/'}\n </Text>\n <Text style={styles.expandIcon}>{isExpanded ? '▼' : '▶'}</Text>\n </Pressable>\n\n {/* Expanded controls */}\n {isExpanded && (\n <View style={styles.controls}>\n {/* Action buttons */}\n <View style={styles.buttonRow}>\n <Pressable onPress={saveRoute} style={styles.button}>\n <Text style={styles.buttonText}>Save</Text>\n </Pressable>\n\n {enableHistory && (\n <Pressable onPress={() => setShowHistory(!showHistory)} style={styles.button}>\n <Text style={styles.buttonText}>History</Text>\n </Pressable>\n )}\n\n <Pressable onPress={clearAll} style={[styles.button, styles.dangerButton]}>\n <Text style={styles.buttonText}>Clear</Text>\n </Pressable>\n </View>\n\n {/* History section */}\n {showHistory && enableHistory && routeHistory.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Recent Routes</Text>\n <ScrollView style={styles.listContainer}>\n {routeHistory.map((route, index) => (\n <Pressable\n key={`${route}-${index}`}\n onPress={() => navigateToRoute(route)}\n style={({ pressed }) => [styles.listItem, route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <Text style={styles.listItemText} numberOfLines={1}>\n {route}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n\n {/* Saved routes section */}\n {savedRoutes.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Saved Routes</Text>\n <ScrollView style={styles.listContainer}>\n {savedRoutes.map((saved, index) => (\n <Pressable\n key={`${saved.route}-${index}`}\n onPress={() => navigateToRoute(saved.route)}\n style={({ pressed }) => [styles.savedItem, saved.route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <View style={styles.savedItemContent}>\n <Text style={styles.savedItemLabel}>{saved.label}</Text>\n <Text style={styles.listItemText} numberOfLines={1}>\n {saved.route}\n </Text>\n </View>\n <Pressable\n onPress={(e) => {\n e.stopPropagation?.()\n deleteSavedRoute(index)\n }}\n style={styles.deleteButton}\n >\n <Text style={styles.deleteButtonText}>✕</Text>\n </Pressable>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n </View>\n )}\n </View>\n )\n}\n\nconst createStyles = (isDark: boolean, position: 'top' | 'bottom') => {\n const bgColor = isDark ? '#1a1a1a' : '#ffffff'\n const textColor = isDark ? '#e0e0e0' : '#333333'\n const borderColor = isDark ? '#333333' : '#dddddd'\n const buttonBg = isDark ? '#2563eb' : '#2563eb'\n const secondaryBg = isDark ? '#262626' : '#f5f5f5'\n const pressedBg = isDark ? '#1e40af' : '#dbeafe'\n\n return StyleSheet.create({\n container: {\n backgroundColor: bgColor,\n borderTopWidth: position === 'bottom' ? 1 : 0,\n borderBottomWidth: position === 'top' ? 1 : 0,\n borderColor,\n ...Platform.select({\n ios: {\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n },\n android: {\n elevation: 4,\n },\n }),\n },\n selectedItem: {\n backgroundColor: pressedBg,\n borderWidth: 1,\n borderColor: '#2563eb',\n },\n\n routeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 12,\n paddingHorizontal: 16,\n },\n routeText: {\n flex: 1,\n fontSize: 12,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n expandIcon: {\n fontSize: 16,\n color: textColor,\n marginLeft: 8,\n },\n controls: {\n padding: 12,\n paddingTop: 0,\n },\n buttonRow: {\n flexDirection: 'row',\n gap: 8,\n marginBottom: 12,\n },\n button: {\n flex: 1,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: buttonBg,\n borderRadius: 6,\n alignItems: 'center',\n },\n dangerButton: {\n backgroundColor: '#dc2626',\n },\n buttonText: {\n color: '#ffffff',\n fontSize: 12,\n fontWeight: '600',\n },\n section: {\n marginTop: 12,\n },\n sectionTitle: {\n fontSize: 11,\n fontWeight: '600',\n color: textColor,\n marginBottom: 8,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n },\n listContainer: {\n maxHeight: 150,\n },\n listItem: {\n padding: 8,\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n },\n listItemPressed: {\n backgroundColor: pressedBg,\n },\n listItemText: {\n fontSize: 11,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n savedItem: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n overflow: 'hidden',\n },\n savedItemContent: {\n flex: 1,\n padding: 8,\n },\n savedItemLabel: {\n fontSize: 10,\n fontWeight: '600',\n color: buttonBg,\n marginBottom: 2,\n },\n deleteButton: {\n padding: 8,\n paddingHorizontal: 12,\n backgroundColor: '#dc2626',\n },\n deleteButtonText: {\n color: '#ffffff',\n fontSize: 14,\n fontWeight: 'bold',\n },\n })\n}\n\nexport default ExpoRouterDevTools\n"],"names":["SecureStore.getItemAsync","SecureStore.setItemAsync","SecureStore.deleteItemAsync","_jsxs","_jsx"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/ExpoRouterDevTools.tsx"],"sourcesContent":["import { useGlobalSearchParams, usePathname, useRouter, type RelativePathString } from 'expo-router'\nimport * as SecureStore from 'expo-secure-store'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport { Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'\nimport { ExpoRouterDevToolsProps, SavedRoute } from './interfaces/base'\n\nconst STORAGE_PREFIX = 'expo-router-devtools_'\nconst MAX_HISTORY = 10\n\nconst ExpoRouterDevTools: React.FC<ExpoRouterDevToolsProps> = ({\n position = 'top',\n theme = 'light',\n hideInProduction = true,\n storageKeyPrefix = STORAGE_PREFIX,\n onRouteChange,\n enableHistory = true,\n maxHistory = MAX_HISTORY,\n maxNumOfLines = 3,\n}) => {\n const pathname = usePathname()\n const searchParams = useGlobalSearchParams()\n const router = useRouter()\n\n const [currentRoute, setCurrentRoute] = useState('')\n const [savedRoutes, setSavedRoutes] = useState<SavedRoute[]>([])\n const [routeHistory, setRouteHistory] = useState<string[]>([])\n const [isExpanded, setIsExpanded] = useState(false)\n const [showHistory, setShowHistory] = useState(false)\n\n const SAVED_ROUTES_KEY = `${storageKeyPrefix}saved-routes`\n const HISTORY_KEY = `${storageKeyPrefix}history`\n\n // Build current full route\n useEffect(() => {\n const query = Object.keys(searchParams).length\n ? '?' +\n Object.entries(searchParams)\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\n .join('&')\n : ''\n\n const fullRoute = `${pathname}${query}`\n setCurrentRoute(fullRoute)\n onRouteChange?.(fullRoute)\n }, [pathname, searchParams, onRouteChange])\n\n // Load saved routes and history\n useEffect(() => {\n const loadData = async () => {\n try {\n const savedRoutesData = await SecureStore.getItemAsync(SAVED_ROUTES_KEY)\n if (savedRoutesData) {\n setSavedRoutes(JSON.parse(savedRoutesData))\n }\n\n if (enableHistory) {\n const historyData = await SecureStore.getItemAsync(HISTORY_KEY)\n if (historyData) {\n setRouteHistory(JSON.parse(historyData))\n }\n }\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error loading data:', error)\n }\n }\n\n loadData()\n }, [SAVED_ROUTES_KEY, HISTORY_KEY, enableHistory])\n\n // Update history when route changes\n useEffect(() => {\n if (!enableHistory || !currentRoute) return\n\n const updateHistory = async () => {\n try {\n const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory)\n setRouteHistory(newHistory)\n await SecureStore.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error updating history:', error)\n }\n }\n\n updateHistory()\n }, [currentRoute, enableHistory, maxHistory, HISTORY_KEY])\n\n // Save current route\n const saveRoute = useCallback(async () => {\n const label = `Route ${savedRoutes.length + 1}`\n const newRoute: SavedRoute = {\n route: currentRoute,\n label,\n timestamp: Date.now(),\n }\n\n const updated = [...savedRoutes, newRoute]\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error saving route:', error)\n }\n }, [currentRoute, savedRoutes, SAVED_ROUTES_KEY])\n\n // Navigate to route\n const navigateToRoute = useCallback(\n (route: string) => {\n try {\n router.push(route as RelativePathString)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Navigation error:', error)\n }\n },\n [router]\n )\n\n // Delete saved route\n const deleteSavedRoute = useCallback(\n async (index: number) => {\n const updated = savedRoutes.filter((_, i) => i !== index)\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error deleting route:', error)\n }\n },\n [savedRoutes, SAVED_ROUTES_KEY]\n )\n\n // Clear all data\n const clearAll = useCallback(async () => {\n setSavedRoutes([])\n setRouteHistory([])\n\n try {\n await SecureStore.deleteItemAsync(SAVED_ROUTES_KEY)\n await SecureStore.deleteItemAsync(HISTORY_KEY)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error clearing data:', error)\n }\n }, [SAVED_ROUTES_KEY, HISTORY_KEY])\n\n const isDark = theme === 'dark'\n const styles = createStyles(isDark, position)\n\n // Check if we should render in production\n if (hideInProduction && !__DEV__) {\n return null\n }\n\n return (\n <View style={styles.container}>\n {/* Current route bar */}\n <Pressable onPress={() => setIsExpanded(!isExpanded)} style={styles.routeBar}>\n <Text style={styles.routeText} numberOfLines={maxNumOfLines}>\n 🛣️ {currentRoute || '/'}\n </Text>\n <Text style={styles.expandIcon}>{isExpanded ? '▼' : '▶'}</Text>\n </Pressable>\n\n {/* Expanded controls */}\n {isExpanded && (\n <View style={styles.controls}>\n {/* Action buttons */}\n <View style={styles.buttonRow}>\n <Pressable onPress={saveRoute} style={styles.button}>\n <Text style={styles.buttonText}>Save</Text>\n </Pressable>\n\n {enableHistory && (\n <Pressable onPress={() => setShowHistory(!showHistory)} style={styles.button}>\n <Text style={styles.buttonText}>History</Text>\n </Pressable>\n )}\n\n <Pressable onPress={clearAll} style={[styles.button, styles.dangerButton]}>\n <Text style={styles.buttonText}>Clear</Text>\n </Pressable>\n </View>\n\n {/* History section */}\n {showHistory && enableHistory && routeHistory.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Recent Routes</Text>\n <ScrollView style={styles.listContainer}>\n {routeHistory.map((route, index) => (\n <Pressable\n key={`${route}-${index}`}\n onPress={() => navigateToRoute(route)}\n style={({ pressed }) => [styles.listItem, route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <Text style={styles.listItemText} numberOfLines={1}>\n {route}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n\n {/* Saved routes section */}\n {savedRoutes.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Saved Routes</Text>\n <ScrollView style={styles.listContainer}>\n {savedRoutes.map((saved, index) => (\n <Pressable\n key={`${saved.route}-${index}`}\n onPress={() => navigateToRoute(saved.route)}\n style={({ pressed }) => [styles.savedItem, saved.route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <View style={styles.savedItemContent}>\n <Text style={styles.savedItemLabel}>{saved.label}</Text>\n <Text style={styles.listItemText} numberOfLines={1}>\n {saved.route}\n </Text>\n </View>\n <Pressable\n onPress={(e) => {\n e.stopPropagation?.()\n deleteSavedRoute(index)\n }}\n style={styles.deleteButton}\n >\n <Text style={styles.deleteButtonText}>✕</Text>\n </Pressable>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n </View>\n )}\n </View>\n )\n}\n\nconst createStyles = (isDark: boolean, position: 'top' | 'bottom') => {\n const bgColor = isDark ? '#1a1a1a' : '#ffffff'\n const textColor = isDark ? '#e0e0e0' : '#333333'\n const borderColor = isDark ? '#333333' : '#dddddd'\n const buttonBg = isDark ? '#2563eb' : '#2563eb'\n const secondaryBg = isDark ? '#262626' : '#f5f5f5'\n const pressedBg = isDark ? '#1e40af' : '#dbeafe'\n\n return StyleSheet.create({\n container: {\n backgroundColor: bgColor,\n borderTopWidth: position === 'bottom' ? 1 : 0,\n borderBottomWidth: position === 'top' ? 1 : 0,\n borderColor,\n ...Platform.select({\n ios: {\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n },\n android: {\n elevation: 4,\n },\n }),\n },\n selectedItem: {\n backgroundColor: pressedBg,\n borderWidth: 1,\n borderColor: '#2563eb',\n },\n\n routeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 12,\n paddingHorizontal: 16,\n },\n routeText: {\n flex: 1,\n fontSize: 12,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n expandIcon: {\n fontSize: 16,\n color: textColor,\n marginLeft: 8,\n },\n controls: {\n padding: 12,\n paddingTop: 0,\n },\n buttonRow: {\n flexDirection: 'row',\n gap: 8,\n marginBottom: 12,\n },\n button: {\n flex: 1,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: buttonBg,\n borderRadius: 6,\n alignItems: 'center',\n },\n dangerButton: {\n backgroundColor: '#dc2626',\n },\n buttonText: {\n color: '#ffffff',\n fontSize: 12,\n fontWeight: '600',\n },\n section: {\n marginTop: 12,\n },\n sectionTitle: {\n fontSize: 11,\n fontWeight: '600',\n color: textColor,\n marginBottom: 8,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n },\n listContainer: {\n maxHeight: 150,\n },\n listItem: {\n padding: 8,\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n },\n listItemPressed: {\n backgroundColor: pressedBg,\n },\n listItemText: {\n fontSize: 11,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n savedItem: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n overflow: 'hidden',\n },\n savedItemContent: {\n flex: 1,\n padding: 8,\n },\n savedItemLabel: {\n fontSize: 10,\n fontWeight: '600',\n color: buttonBg,\n marginBottom: 2,\n },\n deleteButton: {\n padding: 8,\n paddingHorizontal: 12,\n backgroundColor: '#dc2626',\n },\n deleteButtonText: {\n color: '#ffffff',\n fontSize: 14,\n fontWeight: 'bold',\n },\n })\n}\n\nexport default ExpoRouterDevTools\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,196 +2,28 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var expoRouter = require('expo-router');
5
- var reactNative = require('react-native');
5
+ var SecureStore = require('expo-secure-store');
6
6
  var react = require('react');
7
+ var reactNative = require('react-native');
7
8
 
8
- // We default to an empty object shim wherever we don't have an environment-specific implementation
9
- /**
10
- * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.
11
- * Use `requireNativeModule` or `requireOptionalNativeModule` instead.
12
- */
13
- var NativeModulesProxy = {};
14
-
15
- function createTurboModuleToExpoProxy(turboModule, name) {
16
- return null;
17
- }
18
-
19
- /**
20
- * Imports the native module registered with given name. In the first place it tries to load
21
- * the module installed through the JSI host object and then falls back to the bridge proxy module.
22
- * Notice that the modules loaded from the proxy may not support some features like synchronous functions.
23
- *
24
- * @param moduleName Name of the requested native module.
25
- * @returns Object representing the native module.
26
- * @throws Error when there is no native module with given name.
27
- */
28
- function requireNativeModule(moduleName) {
29
- const nativeModule = requireOptionalNativeModule(moduleName);
30
- if (!nativeModule) {
31
- throw new Error(`Cannot find native module '${moduleName}'`);
32
- }
33
- return nativeModule;
34
- }
35
- /**
36
- * Imports the native module registered with the given name. The same as `requireNativeModule`,
37
- * but returns `null` when the module cannot be found instead of throwing an error.
38
- *
39
- * @param moduleName Name of the requested native module.
40
- * @returns Object representing the native module or `null` when it cannot be found.
41
- */
42
- function requireOptionalNativeModule(moduleName) {
43
- var _a, _b, _c, _d, _e;
44
- try {
45
- return ((_e = (_d = (_c = (_b = (_a = globalThis.expo) === null || _a === void 0 ? void 0 : _a.modules) === null || _b === void 0 ? void 0 : _b[moduleName]) !== null && _c !== void 0 ? _c : NativeModulesProxy[moduleName]) !== null && _d !== void 0 ? _d : createTurboModuleToExpoProxy(reactNative.TurboModuleRegistry.get(moduleName), moduleName)) !== null && _e !== void 0 ? _e : null);
46
- }
47
- catch (e) {
48
- const error = e;
49
- console.warn(`An error occurred while requiring the '${moduleName}' module: ${error.message}`);
50
- return null;
51
- }
52
- }
53
-
54
- var ExpoSecureStore = requireNativeModule('ExpoSecureStore');
55
-
56
- const VALUE_BYTES_LIMIT = 2048;
57
- // note this probably could be JS-engine dependent
58
- // inspired by https://stackoverflow.com/a/39488643
59
- function byteCountOverLimit(value, limit) {
60
- let bytes = 0;
61
- for (let i = 0; i < value.length; i++) {
62
- const codePoint = value.charCodeAt(i);
63
- // Lone surrogates cannot be passed to encodeURI
64
- if (codePoint >= 0xd800 && codePoint < 0xe000) {
65
- if (codePoint < 0xdc00 && i + 1 < value.length) {
66
- const next = value.charCodeAt(i + 1);
67
- if (next >= 0xdc00 && next < 0xe000) {
68
- bytes += 4;
69
- if (bytes > limit) {
70
- return true;
71
- }
72
- i++;
73
- continue;
74
- }
75
- }
76
- }
77
- bytes += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : 3;
78
- if (bytes > limit) {
79
- return true;
80
- }
81
- }
82
- return bytes > limit;
9
+ function _interopNamespaceDefault(e) {
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
83
24
  }
84
25
 
85
- // @needsAudit
86
- /**
87
- * The data in the keychain item cannot be accessed after a restart until the device has been
88
- * unlocked once by the user. This may be useful if you need to access the item when the phone
89
- * is locked.
90
- */
91
- ExpoSecureStore.AFTER_FIRST_UNLOCK;
92
- // @needsAudit
93
- /**
94
- * Similar to `AFTER_FIRST_UNLOCK`, except the entry is not migrated to a new device when restoring
95
- * from a backup.
96
- */
97
- ExpoSecureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY;
98
- // @needsAudit
99
- /**
100
- * The data in the keychain item can always be accessed regardless of whether the device is locked.
101
- * This is the least secure option.
102
- *
103
- * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK`.
104
- */
105
- ExpoSecureStore.ALWAYS;
106
- // @needsAudit
107
- /**
108
- * Similar to `WHEN_UNLOCKED_THIS_DEVICE_ONLY`, except the user must have set a passcode in order to
109
- * store an entry. If the user removes their passcode, the entry will be deleted.
110
- */
111
- ExpoSecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY;
112
- // @needsAudit
113
- /**
114
- * Similar to `ALWAYS`, except the entry is not migrated to a new device when restoring from a backup.
115
- *
116
- * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY`.
117
- */
118
- ExpoSecureStore.ALWAYS_THIS_DEVICE_ONLY;
119
- // @needsAudit
120
- /**
121
- * The data in the keychain item can be accessed only while the device is unlocked by the user.
122
- */
123
- ExpoSecureStore.WHEN_UNLOCKED;
124
- // @needsAudit
125
- /**
126
- * Similar to `WHEN_UNLOCKED`, except the entry is not migrated to a new device when restoring from
127
- * a backup.
128
- */
129
- ExpoSecureStore.WHEN_UNLOCKED_THIS_DEVICE_ONLY;
130
- // @needsAudit
131
- /**
132
- * Delete the value associated with the provided key.
133
- *
134
- * @param key The key that was used to store the associated value.
135
- * @param options An [`SecureStoreOptions`](#securestoreoptions) object.
136
- *
137
- * @return A promise that rejects if the value can't be deleted.
138
- */
139
- async function deleteItemAsync(key, options = {}) {
140
- ensureValidKey(key);
141
- await ExpoSecureStore.deleteValueWithKeyAsync(key, options);
142
- }
143
- // @needsAudit
144
- /**
145
- * Reads the stored value associated with the provided key.
146
- *
147
- * @param key The key that was used to store the associated value.
148
- * @param options An [`SecureStoreOptions`](#securestoreoptions) object.
149
- *
150
- * @return A promise that resolves to the previously stored value. It resolves with `null` if there is no entry
151
- * for the given key or if the key has been invalidated. It rejects if an error occurs while retrieving the value.
152
- *
153
- * > Keys are invalidated by the system when biometrics change, such as adding a new fingerprint or changing the face profile used for face recognition.
154
- * > After a key has been invalidated, it becomes impossible to read its value.
155
- * > This only applies to values stored with `requireAuthentication` set to `true`.
156
- */
157
- async function getItemAsync(key, options = {}) {
158
- ensureValidKey(key);
159
- return await ExpoSecureStore.getValueWithKeyAsync(key, options);
160
- }
161
- // @needsAudit
162
- /**
163
- * Stores a key–value pair.
164
- *
165
- * @param key The key to associate with the stored value. Keys may contain alphanumeric characters, `.`, `-`, and `_`.
166
- * @param value The value to store. Size limit is 2048 bytes.
167
- * @param options An [`SecureStoreOptions`](#securestoreoptions) object.
168
- *
169
- * @return A promise that rejects if value cannot be stored on the device.
170
- */
171
- async function setItemAsync(key, value, options = {}) {
172
- ensureValidKey(key);
173
- if (!isValidValue(value)) {
174
- throw new Error(`Invalid value provided to SecureStore. Values must be strings; consider JSON-encoding your values if they are serializable.`);
175
- }
176
- await ExpoSecureStore.setValueWithKeyAsync(value, key, options);
177
- }
178
- function ensureValidKey(key) {
179
- if (!isValidKey(key)) {
180
- throw new Error(`Invalid key provided to SecureStore. Keys must not be empty and contain only alphanumeric characters, ".", "-", and "_".`);
181
- }
182
- }
183
- function isValidKey(key) {
184
- return typeof key === 'string' && /^[\w.-]+$/.test(key);
185
- }
186
- function isValidValue(value) {
187
- if (typeof value !== 'string') {
188
- return false;
189
- }
190
- if (byteCountOverLimit(value, VALUE_BYTES_LIMIT)) {
191
- console.warn(`Value being stored in SecureStore is larger than ${VALUE_BYTES_LIMIT} bytes and it may not be stored successfully. In a future SDK version, this call may throw an error.`);
192
- }
193
- return true;
194
- }
26
+ var SecureStore__namespace = /*#__PURE__*/_interopNamespaceDefault(SecureStore);
195
27
 
196
28
  const STORAGE_PREFIX = 'expo-router-devtools_';
197
29
  const MAX_HISTORY = 10;
@@ -222,12 +54,12 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
222
54
  react.useEffect(() => {
223
55
  const loadData = async () => {
224
56
  try {
225
- const savedRoutesData = await getItemAsync(SAVED_ROUTES_KEY);
57
+ const savedRoutesData = await SecureStore__namespace.getItemAsync(SAVED_ROUTES_KEY);
226
58
  if (savedRoutesData) {
227
59
  setSavedRoutes(JSON.parse(savedRoutesData));
228
60
  }
229
61
  if (enableHistory) {
230
- const historyData = await getItemAsync(HISTORY_KEY);
62
+ const historyData = await SecureStore__namespace.getItemAsync(HISTORY_KEY);
231
63
  if (historyData) {
232
64
  setRouteHistory(JSON.parse(historyData));
233
65
  }
@@ -247,7 +79,7 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
247
79
  try {
248
80
  const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory);
249
81
  setRouteHistory(newHistory);
250
- await setItemAsync(HISTORY_KEY, JSON.stringify(newHistory));
82
+ await SecureStore__namespace.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory));
251
83
  }
252
84
  catch (error) {
253
85
  console.error('[ExpoRouterDevTools] Error updating history:', error);
@@ -266,7 +98,7 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
266
98
  const updated = [...savedRoutes, newRoute];
267
99
  setSavedRoutes(updated);
268
100
  try {
269
- await setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
101
+ await SecureStore__namespace.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
270
102
  }
271
103
  catch (error) {
272
104
  console.error('[ExpoRouterDevTools] Error saving route:', error);
@@ -286,7 +118,7 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
286
118
  const updated = savedRoutes.filter((_, i) => i !== index);
287
119
  setSavedRoutes(updated);
288
120
  try {
289
- await setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
121
+ await SecureStore__namespace.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
290
122
  }
291
123
  catch (error) {
292
124
  console.error('[ExpoRouterDevTools] Error deleting route:', error);
@@ -297,8 +129,8 @@ const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProductio
297
129
  setSavedRoutes([]);
298
130
  setRouteHistory([]);
299
131
  try {
300
- await deleteItemAsync(SAVED_ROUTES_KEY);
301
- await deleteItemAsync(HISTORY_KEY);
132
+ await SecureStore__namespace.deleteItemAsync(SAVED_ROUTES_KEY);
133
+ await SecureStore__namespace.deleteItemAsync(HISTORY_KEY);
302
134
  }
303
135
  catch (error) {
304
136
  console.error('[ExpoRouterDevTools] Error clearing data:', error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/expo-modules-core/src/NativeModulesProxy.ts","../node_modules/expo-modules-core/src/TurboModuleToExpoModuleProxy.ts","../node_modules/expo-modules-core/src/requireNativeModule.ts","../node_modules/expo-secure-store/build/ExpoSecureStore.js","../node_modules/expo-secure-store/build/byteCounter.js","../node_modules/expo-secure-store/build/SecureStore.js","../src/ExpoRouterDevTools.tsx"],"sourcesContent":["import type { ProxyNativeModule } from './NativeModulesProxy.types';\n\n// We default to an empty object shim wherever we don't have an environment-specific implementation\n\n/**\n * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.\n * Use `requireNativeModule` or `requireOptionalNativeModule` instead.\n */\nexport default {} as Record<string, ProxyNativeModule>;\n","// Copyright © 2024 650 Industries.\nimport type { TurboModule } from 'react-native';\n\nexport function createTurboModuleToExpoProxy(turboModule: TurboModule | null, name: string) {\n return null;\n}\n","import { TurboModuleRegistry } from 'react-native';\n\nimport NativeModulesProxy from './NativeModulesProxy';\nimport { createTurboModuleToExpoProxy } from './TurboModuleToExpoModuleProxy';\nimport { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';\n\n/**\n * Imports the native module registered with given name. In the first place it tries to load\n * the module installed through the JSI host object and then falls back to the bridge proxy module.\n * Notice that the modules loaded from the proxy may not support some features like synchronous functions.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module.\n * @throws Error when there is no native module with given name.\n */\nexport function requireNativeModule<ModuleType = any>(moduleName: string): ModuleType {\n const nativeModule = requireOptionalNativeModule<ModuleType>(moduleName);\n\n if (!nativeModule) {\n throw new Error(`Cannot find native module '${moduleName}'`);\n }\n return nativeModule;\n}\n\n/**\n * Imports the native module registered with the given name. The same as `requireNativeModule`,\n * but returns `null` when the module cannot be found instead of throwing an error.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module or `null` when it cannot be found.\n */\nexport function requireOptionalNativeModule<ModuleType = any>(\n moduleName: string\n): ModuleType | null {\n ensureNativeModulesAreInstalled();\n\n try {\n return (\n globalThis.expo?.modules?.[moduleName] ??\n NativeModulesProxy[moduleName] ??\n createTurboModuleToExpoProxy(TurboModuleRegistry.get(moduleName), moduleName) ??\n null\n );\n } catch (e) {\n const error = e as Error;\n console.warn(`An error occurred while requiring the '${moduleName}' module: ${error.message}`);\n return null;\n }\n}\n","import { requireNativeModule } from 'expo-modules-core';\nexport default requireNativeModule('ExpoSecureStore');\n//# sourceMappingURL=ExpoSecureStore.js.map","export const VALUE_BYTES_LIMIT = 2048;\n// note this probably could be JS-engine dependent\n// inspired by https://stackoverflow.com/a/39488643\nexport function byteCountOverLimit(value, limit) {\n let bytes = 0;\n for (let i = 0; i < value.length; i++) {\n const codePoint = value.charCodeAt(i);\n // Lone surrogates cannot be passed to encodeURI\n if (codePoint >= 0xd800 && codePoint < 0xe000) {\n if (codePoint < 0xdc00 && i + 1 < value.length) {\n const next = value.charCodeAt(i + 1);\n if (next >= 0xdc00 && next < 0xe000) {\n bytes += 4;\n if (bytes > limit) {\n return true;\n }\n i++;\n continue;\n }\n }\n }\n bytes += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : 3;\n if (bytes > limit) {\n return true;\n }\n }\n return bytes > limit;\n}\n//# sourceMappingURL=byteCounter.js.map","import ExpoSecureStore from './ExpoSecureStore';\nimport { byteCountOverLimit, VALUE_BYTES_LIMIT } from './byteCounter';\n// @needsAudit\n/**\n * The data in the keychain item cannot be accessed after a restart until the device has been\n * unlocked once by the user. This may be useful if you need to access the item when the phone\n * is locked.\n */\nexport const AFTER_FIRST_UNLOCK = ExpoSecureStore.AFTER_FIRST_UNLOCK;\n// @needsAudit\n/**\n * Similar to `AFTER_FIRST_UNLOCK`, except the entry is not migrated to a new device when restoring\n * from a backup.\n */\nexport const AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY = ExpoSecureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * The data in the keychain item can always be accessed regardless of whether the device is locked.\n * This is the least secure option.\n *\n * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK`.\n */\nexport const ALWAYS = ExpoSecureStore.ALWAYS;\n// @needsAudit\n/**\n * Similar to `WHEN_UNLOCKED_THIS_DEVICE_ONLY`, except the user must have set a passcode in order to\n * store an entry. If the user removes their passcode, the entry will be deleted.\n */\nexport const WHEN_PASSCODE_SET_THIS_DEVICE_ONLY = ExpoSecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * Similar to `ALWAYS`, except the entry is not migrated to a new device when restoring from a backup.\n *\n * @deprecated Use an accessibility level that provides some user protection, such as `AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY`.\n */\nexport const ALWAYS_THIS_DEVICE_ONLY = ExpoSecureStore.ALWAYS_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * The data in the keychain item can be accessed only while the device is unlocked by the user.\n */\nexport const WHEN_UNLOCKED = ExpoSecureStore.WHEN_UNLOCKED;\n// @needsAudit\n/**\n * Similar to `WHEN_UNLOCKED`, except the entry is not migrated to a new device when restoring from\n * a backup.\n */\nexport const WHEN_UNLOCKED_THIS_DEVICE_ONLY = ExpoSecureStore.WHEN_UNLOCKED_THIS_DEVICE_ONLY;\n// @needsAudit\n/**\n * Returns whether the SecureStore API is enabled on the current device. This does not check the app\n * permissions.\n *\n * @return Promise which fulfils with a `boolean`, indicating whether the SecureStore API is available\n * on the current device. Currently, this resolves `true` on Android and iOS only.\n */\nexport async function isAvailableAsync() {\n return !!ExpoSecureStore.getValueWithKeyAsync;\n}\n// @needsAudit\n/**\n * Delete the value associated with the provided key.\n *\n * @param key The key that was used to store the associated value.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return A promise that rejects if the value can't be deleted.\n */\nexport async function deleteItemAsync(key, options = {}) {\n ensureValidKey(key);\n await ExpoSecureStore.deleteValueWithKeyAsync(key, options);\n}\n// @needsAudit\n/**\n * Reads the stored value associated with the provided key.\n *\n * @param key The key that was used to store the associated value.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return A promise that resolves to the previously stored value. It resolves with `null` if there is no entry\n * for the given key or if the key has been invalidated. It rejects if an error occurs while retrieving the value.\n *\n * > Keys are invalidated by the system when biometrics change, such as adding a new fingerprint or changing the face profile used for face recognition.\n * > After a key has been invalidated, it becomes impossible to read its value.\n * > This only applies to values stored with `requireAuthentication` set to `true`.\n */\nexport async function getItemAsync(key, options = {}) {\n ensureValidKey(key);\n return await ExpoSecureStore.getValueWithKeyAsync(key, options);\n}\n// @needsAudit\n/**\n * Stores a key–value pair.\n *\n * @param key The key to associate with the stored value. Keys may contain alphanumeric characters, `.`, `-`, and `_`.\n * @param value The value to store. Size limit is 2048 bytes.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return A promise that rejects if value cannot be stored on the device.\n */\nexport async function setItemAsync(key, value, options = {}) {\n ensureValidKey(key);\n if (!isValidValue(value)) {\n throw new Error(`Invalid value provided to SecureStore. Values must be strings; consider JSON-encoding your values if they are serializable.`);\n }\n await ExpoSecureStore.setValueWithKeyAsync(value, key, options);\n}\n/**\n * Stores a key–value pair synchronously.\n * > **Note:** This function blocks the JavaScript thread, so the application may not be interactive when the `requireAuthentication` option is set to `true` until the user authenticates.\n *\n * @param key The key to associate with the stored value. Keys may contain alphanumeric characters, `.`, `-`, and `_`.\n * @param value The value to store. Size limit is 2048 bytes.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n */\nexport function setItem(key, value, options = {}) {\n ensureValidKey(key);\n if (!isValidValue(value)) {\n throw new Error(`Invalid value provided to SecureStore. Values must be strings; consider JSON-encoding your values if they are serializable.`);\n }\n return ExpoSecureStore.setValueWithKeySync(value, key, options);\n}\n/**\n * Synchronously reads the stored value associated with the provided key.\n * > **Note:** This function blocks the JavaScript thread, so the application may not be interactive when reading a value with `requireAuthentication`\n * > option set to `true` until the user authenticates.\n * @param key The key that was used to store the associated value.\n * @param options An [`SecureStoreOptions`](#securestoreoptions) object.\n *\n * @return Previously stored value. It resolves with `null` if there is no entry\n * for the given key or if the key has been invalidated.\n */\nexport function getItem(key, options = {}) {\n ensureValidKey(key);\n return ExpoSecureStore.getValueWithKeySync(key, options);\n}\n/**\n * Checks if the value can be saved with `requireAuthentication` option enabled.\n * @return `true` if the device supports biometric authentication and the enrolled method is sufficiently secure. Otherwise, returns `false`. Always returns false on tvOS.\n * @platform android\n * @platform ios\n */\nexport function canUseBiometricAuthentication() {\n return ExpoSecureStore.canUseBiometricAuthentication();\n}\nfunction ensureValidKey(key) {\n if (!isValidKey(key)) {\n throw new Error(`Invalid key provided to SecureStore. Keys must not be empty and contain only alphanumeric characters, \".\", \"-\", and \"_\".`);\n }\n}\nfunction isValidKey(key) {\n return typeof key === 'string' && /^[\\w.-]+$/.test(key);\n}\nfunction isValidValue(value) {\n if (typeof value !== 'string') {\n return false;\n }\n if (byteCountOverLimit(value, VALUE_BYTES_LIMIT)) {\n console.warn(`Value being stored in SecureStore is larger than ${VALUE_BYTES_LIMIT} bytes and it may not be stored successfully. In a future SDK version, this call may throw an error.`);\n }\n return true;\n}\n//# sourceMappingURL=SecureStore.js.map","import { useGlobalSearchParams, usePathname, useRouter, type RelativePathString } from 'expo-router'\nimport * as SecureStore from 'expo-secure-store'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport { Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'\nimport { ExpoRouterDevToolsProps, SavedRoute } from './interfaces/base'\n\nconst STORAGE_PREFIX = 'expo-router-devtools_'\nconst MAX_HISTORY = 10\n\nconst ExpoRouterDevTools: React.FC<ExpoRouterDevToolsProps> = ({\n position = 'top',\n theme = 'light',\n hideInProduction = true,\n storageKeyPrefix = STORAGE_PREFIX,\n onRouteChange,\n enableHistory = true,\n maxHistory = MAX_HISTORY,\n maxNumOfLines = 3,\n}) => {\n const pathname = usePathname()\n const searchParams = useGlobalSearchParams()\n const router = useRouter()\n\n const [currentRoute, setCurrentRoute] = useState('')\n const [savedRoutes, setSavedRoutes] = useState<SavedRoute[]>([])\n const [routeHistory, setRouteHistory] = useState<string[]>([])\n const [isExpanded, setIsExpanded] = useState(false)\n const [showHistory, setShowHistory] = useState(false)\n\n const SAVED_ROUTES_KEY = `${storageKeyPrefix}saved-routes`\n const HISTORY_KEY = `${storageKeyPrefix}history`\n\n // Build current full route\n useEffect(() => {\n const query = Object.keys(searchParams).length\n ? '?' +\n Object.entries(searchParams)\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\n .join('&')\n : ''\n\n const fullRoute = `${pathname}${query}`\n setCurrentRoute(fullRoute)\n onRouteChange?.(fullRoute)\n }, [pathname, searchParams, onRouteChange])\n\n // Load saved routes and history\n useEffect(() => {\n const loadData = async () => {\n try {\n const savedRoutesData = await SecureStore.getItemAsync(SAVED_ROUTES_KEY)\n if (savedRoutesData) {\n setSavedRoutes(JSON.parse(savedRoutesData))\n }\n\n if (enableHistory) {\n const historyData = await SecureStore.getItemAsync(HISTORY_KEY)\n if (historyData) {\n setRouteHistory(JSON.parse(historyData))\n }\n }\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error loading data:', error)\n }\n }\n\n loadData()\n }, [SAVED_ROUTES_KEY, HISTORY_KEY, enableHistory])\n\n // Update history when route changes\n useEffect(() => {\n if (!enableHistory || !currentRoute) return\n\n const updateHistory = async () => {\n try {\n const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory)\n setRouteHistory(newHistory)\n await SecureStore.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error updating history:', error)\n }\n }\n\n updateHistory()\n }, [currentRoute, enableHistory, maxHistory, HISTORY_KEY])\n\n // Save current route\n const saveRoute = useCallback(async () => {\n const label = `Route ${savedRoutes.length + 1}`\n const newRoute: SavedRoute = {\n route: currentRoute,\n label,\n timestamp: Date.now(),\n }\n\n const updated = [...savedRoutes, newRoute]\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error saving route:', error)\n }\n }, [currentRoute, savedRoutes, SAVED_ROUTES_KEY])\n\n // Navigate to route\n const navigateToRoute = useCallback(\n (route: string) => {\n try {\n router.push(route as RelativePathString)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Navigation error:', error)\n }\n },\n [router]\n )\n\n // Delete saved route\n const deleteSavedRoute = useCallback(\n async (index: number) => {\n const updated = savedRoutes.filter((_, i) => i !== index)\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error deleting route:', error)\n }\n },\n [savedRoutes, SAVED_ROUTES_KEY]\n )\n\n // Clear all data\n const clearAll = useCallback(async () => {\n setSavedRoutes([])\n setRouteHistory([])\n\n try {\n await SecureStore.deleteItemAsync(SAVED_ROUTES_KEY)\n await SecureStore.deleteItemAsync(HISTORY_KEY)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error clearing data:', error)\n }\n }, [SAVED_ROUTES_KEY, HISTORY_KEY])\n\n const isDark = theme === 'dark'\n const styles = createStyles(isDark, position)\n\n // Check if we should render in production\n if (hideInProduction && !__DEV__) {\n return null\n }\n\n return (\n <View style={styles.container}>\n {/* Current route bar */}\n <Pressable onPress={() => setIsExpanded(!isExpanded)} style={styles.routeBar}>\n <Text style={styles.routeText} numberOfLines={maxNumOfLines}>\n 🛣️ {currentRoute || '/'}\n </Text>\n <Text style={styles.expandIcon}>{isExpanded ? '▼' : '▶'}</Text>\n </Pressable>\n\n {/* Expanded controls */}\n {isExpanded && (\n <View style={styles.controls}>\n {/* Action buttons */}\n <View style={styles.buttonRow}>\n <Pressable onPress={saveRoute} style={styles.button}>\n <Text style={styles.buttonText}>Save</Text>\n </Pressable>\n\n {enableHistory && (\n <Pressable onPress={() => setShowHistory(!showHistory)} style={styles.button}>\n <Text style={styles.buttonText}>History</Text>\n </Pressable>\n )}\n\n <Pressable onPress={clearAll} style={[styles.button, styles.dangerButton]}>\n <Text style={styles.buttonText}>Clear</Text>\n </Pressable>\n </View>\n\n {/* History section */}\n {showHistory && enableHistory && routeHistory.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Recent Routes</Text>\n <ScrollView style={styles.listContainer}>\n {routeHistory.map((route, index) => (\n <Pressable\n key={`${route}-${index}`}\n onPress={() => navigateToRoute(route)}\n style={({ pressed }) => [styles.listItem, route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <Text style={styles.listItemText} numberOfLines={1}>\n {route}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n\n {/* Saved routes section */}\n {savedRoutes.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Saved Routes</Text>\n <ScrollView style={styles.listContainer}>\n {savedRoutes.map((saved, index) => (\n <Pressable\n key={`${saved.route}-${index}`}\n onPress={() => navigateToRoute(saved.route)}\n style={({ pressed }) => [styles.savedItem, saved.route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <View style={styles.savedItemContent}>\n <Text style={styles.savedItemLabel}>{saved.label}</Text>\n <Text style={styles.listItemText} numberOfLines={1}>\n {saved.route}\n </Text>\n </View>\n <Pressable\n onPress={(e) => {\n e.stopPropagation?.()\n deleteSavedRoute(index)\n }}\n style={styles.deleteButton}\n >\n <Text style={styles.deleteButtonText}>✕</Text>\n </Pressable>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n </View>\n )}\n </View>\n )\n}\n\nconst createStyles = (isDark: boolean, position: 'top' | 'bottom') => {\n const bgColor = isDark ? '#1a1a1a' : '#ffffff'\n const textColor = isDark ? '#e0e0e0' : '#333333'\n const borderColor = isDark ? '#333333' : '#dddddd'\n const buttonBg = isDark ? '#2563eb' : '#2563eb'\n const secondaryBg = isDark ? '#262626' : '#f5f5f5'\n const pressedBg = isDark ? '#1e40af' : '#dbeafe'\n\n return StyleSheet.create({\n container: {\n backgroundColor: bgColor,\n borderTopWidth: position === 'bottom' ? 1 : 0,\n borderBottomWidth: position === 'top' ? 1 : 0,\n borderColor,\n ...Platform.select({\n ios: {\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n },\n android: {\n elevation: 4,\n },\n }),\n },\n selectedItem: {\n backgroundColor: pressedBg,\n borderWidth: 1,\n borderColor: '#2563eb',\n },\n\n routeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 12,\n paddingHorizontal: 16,\n },\n routeText: {\n flex: 1,\n fontSize: 12,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n expandIcon: {\n fontSize: 16,\n color: textColor,\n marginLeft: 8,\n },\n controls: {\n padding: 12,\n paddingTop: 0,\n },\n buttonRow: {\n flexDirection: 'row',\n gap: 8,\n marginBottom: 12,\n },\n button: {\n flex: 1,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: buttonBg,\n borderRadius: 6,\n alignItems: 'center',\n },\n dangerButton: {\n backgroundColor: '#dc2626',\n },\n buttonText: {\n color: '#ffffff',\n fontSize: 12,\n fontWeight: '600',\n },\n section: {\n marginTop: 12,\n },\n sectionTitle: {\n fontSize: 11,\n fontWeight: '600',\n color: textColor,\n marginBottom: 8,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n },\n listContainer: {\n maxHeight: 150,\n },\n listItem: {\n padding: 8,\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n },\n listItemPressed: {\n backgroundColor: pressedBg,\n },\n listItemText: {\n fontSize: 11,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n savedItem: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n overflow: 'hidden',\n },\n savedItemContent: {\n flex: 1,\n padding: 8,\n },\n savedItemLabel: {\n fontSize: 10,\n fontWeight: '600',\n color: buttonBg,\n marginBottom: 2,\n },\n deleteButton: {\n padding: 8,\n paddingHorizontal: 12,\n backgroundColor: '#dc2626',\n },\n deleteButtonText: {\n color: '#ffffff',\n fontSize: 14,\n fontWeight: 'bold',\n },\n })\n}\n\nexport default ExpoRouterDevTools\n"],"names":["TurboModuleRegistry","usePathname","useGlobalSearchParams","useRouter","useState","useEffect","SecureStore.getItemAsync","SecureStore.setItemAsync","useCallback","SecureStore.deleteItemAsync","_jsxs","View","Pressable","Text","_jsx","ScrollView","StyleSheet","Platform"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
1
+ {"version":3,"file":"index.js","sources":["../src/ExpoRouterDevTools.tsx"],"sourcesContent":["import { useGlobalSearchParams, usePathname, useRouter, type RelativePathString } from 'expo-router'\nimport * as SecureStore from 'expo-secure-store'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport { Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'\nimport { ExpoRouterDevToolsProps, SavedRoute } from './interfaces/base'\n\nconst STORAGE_PREFIX = 'expo-router-devtools_'\nconst MAX_HISTORY = 10\n\nconst ExpoRouterDevTools: React.FC<ExpoRouterDevToolsProps> = ({\n position = 'top',\n theme = 'light',\n hideInProduction = true,\n storageKeyPrefix = STORAGE_PREFIX,\n onRouteChange,\n enableHistory = true,\n maxHistory = MAX_HISTORY,\n maxNumOfLines = 3,\n}) => {\n const pathname = usePathname()\n const searchParams = useGlobalSearchParams()\n const router = useRouter()\n\n const [currentRoute, setCurrentRoute] = useState('')\n const [savedRoutes, setSavedRoutes] = useState<SavedRoute[]>([])\n const [routeHistory, setRouteHistory] = useState<string[]>([])\n const [isExpanded, setIsExpanded] = useState(false)\n const [showHistory, setShowHistory] = useState(false)\n\n const SAVED_ROUTES_KEY = `${storageKeyPrefix}saved-routes`\n const HISTORY_KEY = `${storageKeyPrefix}history`\n\n // Build current full route\n useEffect(() => {\n const query = Object.keys(searchParams).length\n ? '?' +\n Object.entries(searchParams)\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\n .join('&')\n : ''\n\n const fullRoute = `${pathname}${query}`\n setCurrentRoute(fullRoute)\n onRouteChange?.(fullRoute)\n }, [pathname, searchParams, onRouteChange])\n\n // Load saved routes and history\n useEffect(() => {\n const loadData = async () => {\n try {\n const savedRoutesData = await SecureStore.getItemAsync(SAVED_ROUTES_KEY)\n if (savedRoutesData) {\n setSavedRoutes(JSON.parse(savedRoutesData))\n }\n\n if (enableHistory) {\n const historyData = await SecureStore.getItemAsync(HISTORY_KEY)\n if (historyData) {\n setRouteHistory(JSON.parse(historyData))\n }\n }\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error loading data:', error)\n }\n }\n\n loadData()\n }, [SAVED_ROUTES_KEY, HISTORY_KEY, enableHistory])\n\n // Update history when route changes\n useEffect(() => {\n if (!enableHistory || !currentRoute) return\n\n const updateHistory = async () => {\n try {\n const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory)\n setRouteHistory(newHistory)\n await SecureStore.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error updating history:', error)\n }\n }\n\n updateHistory()\n }, [currentRoute, enableHistory, maxHistory, HISTORY_KEY])\n\n // Save current route\n const saveRoute = useCallback(async () => {\n const label = `Route ${savedRoutes.length + 1}`\n const newRoute: SavedRoute = {\n route: currentRoute,\n label,\n timestamp: Date.now(),\n }\n\n const updated = [...savedRoutes, newRoute]\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error saving route:', error)\n }\n }, [currentRoute, savedRoutes, SAVED_ROUTES_KEY])\n\n // Navigate to route\n const navigateToRoute = useCallback(\n (route: string) => {\n try {\n router.push(route as RelativePathString)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Navigation error:', error)\n }\n },\n [router]\n )\n\n // Delete saved route\n const deleteSavedRoute = useCallback(\n async (index: number) => {\n const updated = savedRoutes.filter((_, i) => i !== index)\n setSavedRoutes(updated)\n\n try {\n await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated))\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error deleting route:', error)\n }\n },\n [savedRoutes, SAVED_ROUTES_KEY]\n )\n\n // Clear all data\n const clearAll = useCallback(async () => {\n setSavedRoutes([])\n setRouteHistory([])\n\n try {\n await SecureStore.deleteItemAsync(SAVED_ROUTES_KEY)\n await SecureStore.deleteItemAsync(HISTORY_KEY)\n } catch (error) {\n console.error('[ExpoRouterDevTools] Error clearing data:', error)\n }\n }, [SAVED_ROUTES_KEY, HISTORY_KEY])\n\n const isDark = theme === 'dark'\n const styles = createStyles(isDark, position)\n\n // Check if we should render in production\n if (hideInProduction && !__DEV__) {\n return null\n }\n\n return (\n <View style={styles.container}>\n {/* Current route bar */}\n <Pressable onPress={() => setIsExpanded(!isExpanded)} style={styles.routeBar}>\n <Text style={styles.routeText} numberOfLines={maxNumOfLines}>\n 🛣️ {currentRoute || '/'}\n </Text>\n <Text style={styles.expandIcon}>{isExpanded ? '▼' : '▶'}</Text>\n </Pressable>\n\n {/* Expanded controls */}\n {isExpanded && (\n <View style={styles.controls}>\n {/* Action buttons */}\n <View style={styles.buttonRow}>\n <Pressable onPress={saveRoute} style={styles.button}>\n <Text style={styles.buttonText}>Save</Text>\n </Pressable>\n\n {enableHistory && (\n <Pressable onPress={() => setShowHistory(!showHistory)} style={styles.button}>\n <Text style={styles.buttonText}>History</Text>\n </Pressable>\n )}\n\n <Pressable onPress={clearAll} style={[styles.button, styles.dangerButton]}>\n <Text style={styles.buttonText}>Clear</Text>\n </Pressable>\n </View>\n\n {/* History section */}\n {showHistory && enableHistory && routeHistory.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Recent Routes</Text>\n <ScrollView style={styles.listContainer}>\n {routeHistory.map((route, index) => (\n <Pressable\n key={`${route}-${index}`}\n onPress={() => navigateToRoute(route)}\n style={({ pressed }) => [styles.listItem, route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <Text style={styles.listItemText} numberOfLines={1}>\n {route}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n\n {/* Saved routes section */}\n {savedRoutes.length > 0 && (\n <View style={styles.section}>\n <Text style={styles.sectionTitle}>Saved Routes</Text>\n <ScrollView style={styles.listContainer}>\n {savedRoutes.map((saved, index) => (\n <Pressable\n key={`${saved.route}-${index}`}\n onPress={() => navigateToRoute(saved.route)}\n style={({ pressed }) => [styles.savedItem, saved.route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed]}\n >\n <View style={styles.savedItemContent}>\n <Text style={styles.savedItemLabel}>{saved.label}</Text>\n <Text style={styles.listItemText} numberOfLines={1}>\n {saved.route}\n </Text>\n </View>\n <Pressable\n onPress={(e) => {\n e.stopPropagation?.()\n deleteSavedRoute(index)\n }}\n style={styles.deleteButton}\n >\n <Text style={styles.deleteButtonText}>✕</Text>\n </Pressable>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n )}\n </View>\n )}\n </View>\n )\n}\n\nconst createStyles = (isDark: boolean, position: 'top' | 'bottom') => {\n const bgColor = isDark ? '#1a1a1a' : '#ffffff'\n const textColor = isDark ? '#e0e0e0' : '#333333'\n const borderColor = isDark ? '#333333' : '#dddddd'\n const buttonBg = isDark ? '#2563eb' : '#2563eb'\n const secondaryBg = isDark ? '#262626' : '#f5f5f5'\n const pressedBg = isDark ? '#1e40af' : '#dbeafe'\n\n return StyleSheet.create({\n container: {\n backgroundColor: bgColor,\n borderTopWidth: position === 'bottom' ? 1 : 0,\n borderBottomWidth: position === 'top' ? 1 : 0,\n borderColor,\n ...Platform.select({\n ios: {\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n },\n android: {\n elevation: 4,\n },\n }),\n },\n selectedItem: {\n backgroundColor: pressedBg,\n borderWidth: 1,\n borderColor: '#2563eb',\n },\n\n routeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 12,\n paddingHorizontal: 16,\n },\n routeText: {\n flex: 1,\n fontSize: 12,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n expandIcon: {\n fontSize: 16,\n color: textColor,\n marginLeft: 8,\n },\n controls: {\n padding: 12,\n paddingTop: 0,\n },\n buttonRow: {\n flexDirection: 'row',\n gap: 8,\n marginBottom: 12,\n },\n button: {\n flex: 1,\n paddingHorizontal: 12,\n paddingVertical: 8,\n backgroundColor: buttonBg,\n borderRadius: 6,\n alignItems: 'center',\n },\n dangerButton: {\n backgroundColor: '#dc2626',\n },\n buttonText: {\n color: '#ffffff',\n fontSize: 12,\n fontWeight: '600',\n },\n section: {\n marginTop: 12,\n },\n sectionTitle: {\n fontSize: 11,\n fontWeight: '600',\n color: textColor,\n marginBottom: 8,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n },\n listContainer: {\n maxHeight: 150,\n },\n listItem: {\n padding: 8,\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n },\n listItemPressed: {\n backgroundColor: pressedBg,\n },\n listItemText: {\n fontSize: 11,\n color: textColor,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n },\n savedItem: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: secondaryBg,\n borderRadius: 4,\n marginBottom: 4,\n overflow: 'hidden',\n },\n savedItemContent: {\n flex: 1,\n padding: 8,\n },\n savedItemLabel: {\n fontSize: 10,\n fontWeight: '600',\n color: buttonBg,\n marginBottom: 2,\n },\n deleteButton: {\n padding: 8,\n paddingHorizontal: 12,\n backgroundColor: '#dc2626',\n },\n deleteButtonText: {\n color: '#ffffff',\n fontSize: 14,\n fontWeight: 'bold',\n },\n })\n}\n\nexport default ExpoRouterDevTools\n"],"names":["usePathname","useGlobalSearchParams","useRouter","useState","useEffect","SecureStore","useCallback","_jsxs","View","Pressable","Text","_jsx","ScrollView","StyleSheet","Platform"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novodip/expo-router-devtools",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Development tools for Expo Router - visualize routes, save navigation states, and debug your app's navigation flow",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -39,7 +39,8 @@
39
39
  "peerDependencies": {
40
40
  "expo-router": ">=3.0.0",
41
41
  "react": ">=17.0.0",
42
- "react-native": ">=0.70.0"
42
+ "react-native": ">=0.70.0",
43
+ "expo-secure-store": ">=12.0.0"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@rollup/plugin-commonjs": "^29.0.0",
@@ -1,261 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useGlobalSearchParams, usePathname, useRouter } from 'expo-router';
3
- import * as SecureStore from 'expo-secure-store';
4
- import { useCallback, useEffect, useState } from 'react';
5
- import { Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
6
- const STORAGE_PREFIX = 'expo-router-devtools_';
7
- const MAX_HISTORY = 10;
8
- const ExpoRouterDevTools = ({ position = 'top', theme = 'light', hideInProduction = true, storageKeyPrefix = STORAGE_PREFIX, onRouteChange, enableHistory = true, maxHistory = MAX_HISTORY, maxNumOfLines = 3, }) => {
9
- const pathname = usePathname();
10
- const searchParams = useGlobalSearchParams();
11
- const router = useRouter();
12
- const [currentRoute, setCurrentRoute] = useState('');
13
- const [savedRoutes, setSavedRoutes] = useState([]);
14
- const [routeHistory, setRouteHistory] = useState([]);
15
- const [isExpanded, setIsExpanded] = useState(false);
16
- const [showHistory, setShowHistory] = useState(false);
17
- const SAVED_ROUTES_KEY = `${storageKeyPrefix}saved-routes`;
18
- const HISTORY_KEY = `${storageKeyPrefix}history`;
19
- // Build current full route
20
- useEffect(() => {
21
- const query = Object.keys(searchParams).length
22
- ? '?' +
23
- Object.entries(searchParams)
24
- .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)
25
- .join('&')
26
- : '';
27
- const fullRoute = `${pathname}${query}`;
28
- setCurrentRoute(fullRoute);
29
- onRouteChange === null || onRouteChange === void 0 ? void 0 : onRouteChange(fullRoute);
30
- }, [pathname, searchParams, onRouteChange]);
31
- // Load saved routes and history
32
- useEffect(() => {
33
- const loadData = async () => {
34
- try {
35
- const savedRoutesData = await SecureStore.getItemAsync(SAVED_ROUTES_KEY);
36
- if (savedRoutesData) {
37
- setSavedRoutes(JSON.parse(savedRoutesData));
38
- }
39
- if (enableHistory) {
40
- const historyData = await SecureStore.getItemAsync(HISTORY_KEY);
41
- if (historyData) {
42
- setRouteHistory(JSON.parse(historyData));
43
- }
44
- }
45
- }
46
- catch (error) {
47
- console.error('[ExpoRouterDevTools] Error loading data:', error);
48
- }
49
- };
50
- loadData();
51
- }, [SAVED_ROUTES_KEY, HISTORY_KEY, enableHistory]);
52
- // Update history when route changes
53
- useEffect(() => {
54
- if (!enableHistory || !currentRoute)
55
- return;
56
- const updateHistory = async () => {
57
- try {
58
- const newHistory = [currentRoute, ...routeHistory.filter((r) => r !== currentRoute)].slice(0, maxHistory);
59
- setRouteHistory(newHistory);
60
- await SecureStore.setItemAsync(HISTORY_KEY, JSON.stringify(newHistory));
61
- }
62
- catch (error) {
63
- console.error('[ExpoRouterDevTools] Error updating history:', error);
64
- }
65
- };
66
- updateHistory();
67
- }, [currentRoute, enableHistory, maxHistory, HISTORY_KEY]);
68
- // Save current route
69
- const saveRoute = useCallback(async () => {
70
- const label = `Route ${savedRoutes.length + 1}`;
71
- const newRoute = {
72
- route: currentRoute,
73
- label,
74
- timestamp: Date.now(),
75
- };
76
- const updated = [...savedRoutes, newRoute];
77
- setSavedRoutes(updated);
78
- try {
79
- await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
80
- }
81
- catch (error) {
82
- console.error('[ExpoRouterDevTools] Error saving route:', error);
83
- }
84
- }, [currentRoute, savedRoutes, SAVED_ROUTES_KEY]);
85
- // Navigate to route
86
- const navigateToRoute = useCallback((route) => {
87
- try {
88
- router.push(route);
89
- }
90
- catch (error) {
91
- console.error('[ExpoRouterDevTools] Navigation error:', error);
92
- }
93
- }, [router]);
94
- // Delete saved route
95
- const deleteSavedRoute = useCallback(async (index) => {
96
- const updated = savedRoutes.filter((_, i) => i !== index);
97
- setSavedRoutes(updated);
98
- try {
99
- await SecureStore.setItemAsync(SAVED_ROUTES_KEY, JSON.stringify(updated));
100
- }
101
- catch (error) {
102
- console.error('[ExpoRouterDevTools] Error deleting route:', error);
103
- }
104
- }, [savedRoutes, SAVED_ROUTES_KEY]);
105
- // Clear all data
106
- const clearAll = useCallback(async () => {
107
- setSavedRoutes([]);
108
- setRouteHistory([]);
109
- try {
110
- await SecureStore.deleteItemAsync(SAVED_ROUTES_KEY);
111
- await SecureStore.deleteItemAsync(HISTORY_KEY);
112
- }
113
- catch (error) {
114
- console.error('[ExpoRouterDevTools] Error clearing data:', error);
115
- }
116
- }, [SAVED_ROUTES_KEY, HISTORY_KEY]);
117
- const isDark = theme === 'dark';
118
- const styles = createStyles(isDark, position);
119
- // Check if we should render in production
120
- if (hideInProduction && !__DEV__) {
121
- return null;
122
- }
123
- return (_jsxs(View, { style: styles.container, children: [_jsxs(Pressable, { onPress: () => setIsExpanded(!isExpanded), style: styles.routeBar, children: [_jsxs(Text, { style: styles.routeText, numberOfLines: maxNumOfLines, children: ["\uD83D\uDEE3\uFE0F ", currentRoute || '/'] }), _jsx(Text, { style: styles.expandIcon, children: isExpanded ? '▼' : '▶' })] }), isExpanded && (_jsxs(View, { style: styles.controls, children: [_jsxs(View, { style: styles.buttonRow, children: [_jsx(Pressable, { onPress: saveRoute, style: styles.button, children: _jsx(Text, { style: styles.buttonText, children: "Save" }) }), enableHistory && (_jsx(Pressable, { onPress: () => setShowHistory(!showHistory), style: styles.button, children: _jsx(Text, { style: styles.buttonText, children: "History" }) })), _jsx(Pressable, { onPress: clearAll, style: [styles.button, styles.dangerButton], children: _jsx(Text, { style: styles.buttonText, children: "Clear" }) })] }), showHistory && enableHistory && routeHistory.length > 0 && (_jsxs(View, { style: styles.section, children: [_jsx(Text, { style: styles.sectionTitle, children: "Recent Routes" }), _jsx(ScrollView, { style: styles.listContainer, children: routeHistory.map((route, index) => (_jsx(Pressable, { onPress: () => navigateToRoute(route), style: ({ pressed }) => [styles.listItem, route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed], children: _jsx(Text, { style: styles.listItemText, numberOfLines: 1, children: route }) }, `${route}-${index}`))) })] })), savedRoutes.length > 0 && (_jsxs(View, { style: styles.section, children: [_jsx(Text, { style: styles.sectionTitle, children: "Saved Routes" }), _jsx(ScrollView, { style: styles.listContainer, children: savedRoutes.map((saved, index) => (_jsxs(Pressable, { onPress: () => navigateToRoute(saved.route), style: ({ pressed }) => [styles.savedItem, saved.route === currentRoute && styles.selectedItem, pressed && styles.listItemPressed], children: [_jsxs(View, { style: styles.savedItemContent, children: [_jsx(Text, { style: styles.savedItemLabel, children: saved.label }), _jsx(Text, { style: styles.listItemText, numberOfLines: 1, children: saved.route })] }), _jsx(Pressable, { onPress: (e) => {
124
- var _a;
125
- (_a = e.stopPropagation) === null || _a === void 0 ? void 0 : _a.call(e);
126
- deleteSavedRoute(index);
127
- }, style: styles.deleteButton, children: _jsx(Text, { style: styles.deleteButtonText, children: "\u2715" }) })] }, `${saved.route}-${index}`))) })] }))] }))] }));
128
- };
129
- const createStyles = (isDark, position) => {
130
- const bgColor = isDark ? '#1a1a1a' : '#ffffff';
131
- const textColor = isDark ? '#e0e0e0' : '#333333';
132
- const borderColor = isDark ? '#333333' : '#dddddd';
133
- const buttonBg = isDark ? '#2563eb' : '#2563eb';
134
- const secondaryBg = isDark ? '#262626' : '#f5f5f5';
135
- const pressedBg = isDark ? '#1e40af' : '#dbeafe';
136
- return StyleSheet.create({
137
- container: {
138
- backgroundColor: bgColor,
139
- borderTopWidth: position === 'bottom' ? 1 : 0,
140
- borderBottomWidth: position === 'top' ? 1 : 0,
141
- borderColor,
142
- ...Platform.select({
143
- ios: {
144
- shadowColor: '#000',
145
- shadowOffset: { width: 0, height: 2 },
146
- shadowOpacity: 0.1,
147
- shadowRadius: 4,
148
- },
149
- android: {
150
- elevation: 4,
151
- },
152
- }),
153
- },
154
- selectedItem: {
155
- backgroundColor: pressedBg,
156
- borderWidth: 1,
157
- borderColor: '#2563eb',
158
- },
159
- routeBar: {
160
- flexDirection: 'row',
161
- alignItems: 'center',
162
- justifyContent: 'space-between',
163
- padding: 12,
164
- paddingHorizontal: 16,
165
- },
166
- routeText: {
167
- flex: 1,
168
- fontSize: 12,
169
- color: textColor,
170
- fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',
171
- },
172
- expandIcon: {
173
- fontSize: 16,
174
- color: textColor,
175
- marginLeft: 8,
176
- },
177
- controls: {
178
- padding: 12,
179
- paddingTop: 0,
180
- },
181
- buttonRow: {
182
- flexDirection: 'row',
183
- gap: 8,
184
- marginBottom: 12,
185
- },
186
- button: {
187
- flex: 1,
188
- paddingHorizontal: 12,
189
- paddingVertical: 8,
190
- backgroundColor: buttonBg,
191
- borderRadius: 6,
192
- alignItems: 'center',
193
- },
194
- dangerButton: {
195
- backgroundColor: '#dc2626',
196
- },
197
- buttonText: {
198
- color: '#ffffff',
199
- fontSize: 12,
200
- fontWeight: '600',
201
- },
202
- section: {
203
- marginTop: 12,
204
- },
205
- sectionTitle: {
206
- fontSize: 11,
207
- fontWeight: '600',
208
- color: textColor,
209
- marginBottom: 8,
210
- textTransform: 'uppercase',
211
- letterSpacing: 0.5,
212
- },
213
- listContainer: {
214
- maxHeight: 150,
215
- },
216
- listItem: {
217
- padding: 8,
218
- backgroundColor: secondaryBg,
219
- borderRadius: 4,
220
- marginBottom: 4,
221
- },
222
- listItemPressed: {
223
- backgroundColor: pressedBg,
224
- },
225
- listItemText: {
226
- fontSize: 11,
227
- color: textColor,
228
- fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',
229
- },
230
- savedItem: {
231
- flexDirection: 'row',
232
- alignItems: 'center',
233
- backgroundColor: secondaryBg,
234
- borderRadius: 4,
235
- marginBottom: 4,
236
- overflow: 'hidden',
237
- },
238
- savedItemContent: {
239
- flex: 1,
240
- padding: 8,
241
- },
242
- savedItemLabel: {
243
- fontSize: 10,
244
- fontWeight: '600',
245
- color: buttonBg,
246
- marginBottom: 2,
247
- },
248
- deleteButton: {
249
- padding: 8,
250
- paddingHorizontal: 12,
251
- backgroundColor: '#dc2626',
252
- },
253
- deleteButtonText: {
254
- color: '#ffffff',
255
- fontSize: 14,
256
- fontWeight: 'bold',
257
- },
258
- });
259
- };
260
- export default ExpoRouterDevTools;
261
- //# sourceMappingURL=ExpoRouterDevTools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExpoRouterDevTools.js","sourceRoot":"","sources":["../../src/ExpoRouterDevTools.tsx"],"names":[],"mappings":"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"}
package/dist/lib/index.js DELETED
@@ -1,2 +0,0 @@
1
- export { default as ExpoRouterDevTools } from './ExpoRouterDevTools';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/interfaces/base.ts"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- import { ExpoRouterDevToolsProps } from './interfaces/base';
3
- declare const ExpoRouterDevTools: React.FC<ExpoRouterDevToolsProps>;
4
- export default ExpoRouterDevTools;
@@ -1,2 +0,0 @@
1
- export { default as ExpoRouterDevTools } from './ExpoRouterDevTools';
2
- export type { ExpoRouterDevToolsProps } from './interfaces/base';
@@ -1,23 +0,0 @@
1
- export interface ExpoRouterDevToolsProps {
2
- /** Position of the dev tools bar */
3
- position?: 'top' | 'bottom';
4
- /** Theme */
5
- theme?: 'light' | 'dark';
6
- /** Hide in production builds */
7
- hideInProduction?: boolean;
8
- /** Custom storage key prefix (alphanumeric, dots, dashes, and underscores only) */
9
- storageKeyPrefix?: string;
10
- /** Callback when route changes */
11
- onRouteChange?: (route: string) => void;
12
- /** Enable route history */
13
- enableHistory?: boolean;
14
- /** Maximum number of history items */
15
- maxHistory?: number;
16
- /** Maximum number of lines the route will show */
17
- maxNumOfLines?: number;
18
- }
19
- export interface SavedRoute {
20
- route: string;
21
- label: string;
22
- timestamp: number;
23
- }
@@ -1,23 +0,0 @@
1
- export interface ExpoRouterDevToolsProps {
2
- /** Position of the dev tools bar */
3
- position?: 'top' | 'bottom';
4
- /** Theme */
5
- theme?: 'light' | 'dark';
6
- /** Hide in production builds */
7
- hideInProduction?: boolean;
8
- /** Custom storage key prefix (alphanumeric, dots, dashes, and underscores only) */
9
- storageKeyPrefix?: string;
10
- /** Callback when route changes */
11
- onRouteChange?: (route: string) => void;
12
- /** Enable route history */
13
- enableHistory?: boolean;
14
- /** Maximum number of history items */
15
- maxHistory?: number;
16
- /** Maximum number of lines the route will show */
17
- maxNumOfLines?: number;
18
- }
19
- export interface SavedRoute {
20
- route: string;
21
- label: string;
22
- timestamp: number;
23
- }