From 483f666ee063c3071c20c3be6c28d011822e4429 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Sun, 8 Feb 2026 19:25:25 +0000 Subject: [PATCH 1/4] feat(file-system-plugin): introduce file system plugin --- apps/playground/Gemfile.lock | 137 ++ .../ios/Playground.xcodeproj/project.pbxproj | 2 + .../ios/Playground/PrivacyInfo.xcprivacy | 10 + apps/playground/ios/Podfile.lock | 74 +- apps/playground/package.json | 2 + apps/playground/src/app/App.tsx | 9 + apps/playground/src/app/navigation/types.ts | 1 + .../src/app/screens/FileSystemTestScreen.tsx | 493 +++++++ .../src/app/screens/LandingScreen.tsx | 7 + apps/playground/src/assets/react.png | Bin 0 -> 349153 bytes apps/playground/tsconfig.app.json | 3 + commitlint.config.js | 1 + nx.json | 3 +- packages/file-system-plugin/package.json | 37 + packages/file-system-plugin/postcss.config.js | 6 + packages/file-system-plugin/react-native.ts | 528 +++++++ .../file-system-plugin/rozenite.config.ts | 8 + .../file-system-plugin/src/file-system.tsx | 1286 +++++++++++++++++ .../src/shared/optional-modules.d.ts | 56 + .../file-system-plugin/src/shared/path.ts | 88 ++ .../file-system-plugin/src/shared/protocol.ts | 64 + .../file-system-plugin/tailwind.config.ts | 94 ++ packages/file-system-plugin/tsconfig.json | 32 + packages/file-system-plugin/vite.config.ts | 20 + pnpm-lock.yaml | 360 +++-- 25 files changed, 3127 insertions(+), 194 deletions(-) create mode 100644 apps/playground/Gemfile.lock create mode 100644 apps/playground/src/app/screens/FileSystemTestScreen.tsx create mode 100644 apps/playground/src/assets/react.png create mode 100644 packages/file-system-plugin/package.json create mode 100644 packages/file-system-plugin/postcss.config.js create mode 100644 packages/file-system-plugin/react-native.ts create mode 100644 packages/file-system-plugin/rozenite.config.ts create mode 100644 packages/file-system-plugin/src/file-system.tsx create mode 100644 packages/file-system-plugin/src/shared/optional-modules.d.ts create mode 100644 packages/file-system-plugin/src/shared/path.ts create mode 100644 packages/file-system-plugin/src/shared/protocol.ts create mode 100644 packages/file-system-plugin/tailwind.config.ts create mode 100644 packages/file-system-plugin/tsconfig.json create mode 100644 packages/file-system-plugin/vite.config.ts diff --git a/apps/playground/Gemfile.lock b/apps/playground/Gemfile.lock new file mode 100644 index 00000000..c5e8a3d3 --- /dev/null +++ b/apps/playground/Gemfile.lock @@ -0,0 +1,137 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.8) + activesupport (7.2.3) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (4.0.1) + claide (1.1.0) + cocoapods (1.15.2) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.15.2) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) + drb (2.2.3) + escape (0.0.4) + ethon (0.15.0) + ffi (>= 1.15.0) + ffi (1.17.3) + ffi (1.17.3-aarch64-linux-gnu) + ffi (1.17.3-aarch64-linux-musl) + ffi (1.17.3-arm-linux-gnu) + ffi (1.17.3-arm-linux-musl) + ffi (1.17.3-arm64-darwin) + ffi (1.17.3-x86-linux-gnu) + ffi (1.17.3-x86-linux-musl) + ffi (1.17.3-x86_64-darwin) + ffi (1.17.3-x86_64-linux-gnu) + ffi (1.17.3-x86_64-linux-musl) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.9.0) + mutex_m + i18n (1.14.8) + concurrent-ruby (~> 1.0) + json (2.18.1) + logger (1.7.0) + minitest (6.0.1) + prism (~> 1.5) + molinillo (0.8.0) + mutex_m (0.3.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + prism (1.9.0) + public_suffix (4.0.7) + rexml (3.4.4) + ruby-macho (2.5.1) + securerandom (0.4.1) + typhoeus (1.5.0) + ethon (>= 0.9.0, < 0.16.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.25.1) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (>= 3.3.6, < 4.0) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin + ruby + x86-linux-gnu + x86-linux-musl + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + activesupport (>= 6.1.7.5, != 7.1.0) + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + xcodeproj (< 1.26.0) + +RUBY VERSION + ruby 3.3.4p94 + +BUNDLED WITH + 2.6.8 diff --git a/apps/playground/ios/Playground.xcodeproj/project.pbxproj b/apps/playground/ios/Playground.xcodeproj/project.pbxproj index 84ee3b30..c5791b07 100644 --- a/apps/playground/ios/Playground.xcodeproj/project.pbxproj +++ b/apps/playground/ios/Playground.xcodeproj/project.pbxproj @@ -470,6 +470,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 6B3J8SDXMN; ENABLE_BITCODE = NO; INFOPLIST_FILE = Playground/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -497,6 +498,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 6B3J8SDXMN; INFOPLIST_FILE = Playground/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/apps/playground/ios/Playground/PrivacyInfo.xcprivacy b/apps/playground/ios/Playground/PrivacyInfo.xcprivacy index 41b8317f..41da7af9 100644 --- a/apps/playground/ios/Playground/PrivacyInfo.xcprivacy +++ b/apps/playground/ios/Playground/PrivacyInfo.xcprivacy @@ -10,6 +10,7 @@ NSPrivacyAccessedAPITypeReasons C617.1 + 0A2A.1 @@ -20,6 +21,15 @@ CA92.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + 85F4.1 + E174.1 + + NSPrivacyAccessedAPIType NSPrivacyAccessedAPICategorySystemBootTime diff --git a/apps/playground/ios/Podfile.lock b/apps/playground/ios/Podfile.lock index 2fbdefbd..b5947efd 100644 --- a/apps/playground/ios/Podfile.lock +++ b/apps/playground/ios/Podfile.lock @@ -1619,6 +1619,27 @@ PODS: - React-logger (= 0.76.0) - React-perflogger (= 0.76.0) - React-utils (= 0.76.0) + - ReactNativeFs (2.36.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - RNScreens (4.4.0): - DoubleConversion - glog @@ -1664,6 +1685,49 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga + - RNSVG (15.8.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNSVG/common (= 15.8.0) + - Yoga + - RNSVG/common (15.8.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - SocketRocket (0.7.1) - Yoga (0.0.0) @@ -1736,7 +1800,9 @@ DEPENDENCIES: - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "ReactNativeFs (from `../node_modules/@dr.pogodin/react-native-fs`)" - RNScreens (from `../node_modules/react-native-screens`) + - RNSVG (from `../node_modules/react-native-svg`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -1877,8 +1943,12 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeFs: + :path: "../node_modules/@dr.pogodin/react-native-fs" RNScreens: :path: "../node_modules/react-native-screens" + RNSVG: + :path: "../node_modules/react-native-svg" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -1949,10 +2019,12 @@ SPEC CHECKSUMS: React-utils: e74516d5b9483c5530ec61e249e28b88729321d2 ReactCodegen: ff7512e124e3dc1363a4930a209d033354d2042a ReactCommon: cde69a75746e8d7131f61c27155ee9dc42117003 + ReactNativeFs: 0a5ad47d8f6086b07ffde582e75d902afebc57c9 RNScreens: 351f431ef2a042a1887d4d90e1c1024b8ae9d123 + RNSVG: 030717ff82ea8f2117347c2fcf52a2d1eafba9ba SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: f8ec45ce98bba1bc93dd28f2ee37215180e6d2b6 PODFILE CHECKSUM: 707ebfe14907d38253c9e6bcd81c22e8e8a158f2 -COCOAPODS: 1.16.2 +COCOAPODS: 1.15.2 diff --git a/apps/playground/package.json b/apps/playground/package.json index 17714970..f4defa10 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -5,12 +5,14 @@ "start": "react-native start" }, "dependencies": { + "@dr.pogodin/react-native-fs": "^2.36.2", "@react-navigation/bottom-tabs": "^7.4.7", "@react-navigation/elements": "^2.5.2", "@react-navigation/native": "^7.1.14", "@react-navigation/native-stack": "^7.3.21", "@reduxjs/toolkit": "^2.8.2", "@rozenite/expo-atlas-plugin": "workspace:*", + "@rozenite/file-system-plugin": "workspace:*", "@rozenite/mmkv-plugin": "workspace:*", "@rozenite/network-activity-plugin": "workspace:*", "@rozenite/overlay-plugin": "workspace:*", diff --git a/apps/playground/src/app/App.tsx b/apps/playground/src/app/App.tsx index ce65c9a0..980c580f 100644 --- a/apps/playground/src/app/App.tsx +++ b/apps/playground/src/app/App.tsx @@ -25,10 +25,13 @@ import { PerformanceMonitorScreen } from './screens/PerformanceMonitorScreen'; import { ReduxTestScreen } from './screens/ReduxTestScreen'; import { RequestBodyTestScreen } from './screens/RequestBodyTestScreen'; import { RequireProfilerTestScreen } from './screens/RequireProfilerTestScreen'; +import { FileSystemTestScreen } from './screens/FileSystemTestScreen'; import { store } from './store'; import { useRequireProfilerDevTools } from '@rozenite/require-profiler-plugin'; import { withOnBootNetworkActivityRecording } from '@rozenite/network-activity-plugin'; import { RozeniteOverlay } from '@rozenite/overlay-plugin'; +import { useFileSystemDevTools } from '@rozenite/file-system-plugin'; +import * as RNFS from '@dr.pogodin/react-native-fs'; withOnBootNetworkActivityRecording(); @@ -48,6 +51,7 @@ const Wrapper = () => { }); usePerformanceMonitorDevTools(); useRequireProfilerDevTools(); + useFileSystemDevTools({ rnfs: RNFS }); return ( { name="RequireProfilerTest" component={RequireProfilerTestScreen} /> + { + const locations = getSaveLocations(); + const [selectedLocation, setSelectedLocation] = useState( + locations[0]!, + ); + const [savedFiles, setSavedFiles] = useState([]); + const [loading, setLoading] = useState(false); + + const refreshFiles = useCallback(async () => { + try { + const dirPath = selectedLocation.path.endsWith('/') + ? selectedLocation.path.slice(0, -1) + : selectedLocation.path; + const items = await RNFS.readDir(dirPath); + const pngFiles = items + .filter((item: any) => item.isFile() && item.name.endsWith('.png')) + .map((item: any) => ({ + name: item.name, + path: item.path, + size: item.size, + })); + setSavedFiles(pngFiles); + } catch (error) { + console.error('Error reading directory:', error); + setSavedFiles([]); + } + }, [selectedLocation]); + + useEffect(() => { + refreshFiles(); + }, [refreshFiles]); + + const handleSave = useCallback(async () => { + setLoading(true); + try { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + const fileName = `react-logo-${timestamp}.png`; + const dirPath = selectedLocation.path.endsWith('/') + ? selectedLocation.path.slice(0, -1) + : selectedLocation.path; + const destPath = `${dirPath}/${fileName}`; + + // Resolve the bundled asset URI + const asset = Image.resolveAssetSource(reactLogoPng); + const uri = asset.uri; + + if (uri.startsWith('http://') || uri.startsWith('https://')) { + // Dev mode: Metro serves assets over HTTP + const result = await RNFS.downloadFile({ + fromUrl: uri, + toFile: destPath, + }).promise; + if (result.statusCode !== 200) { + throw new Error(`Download failed with status ${result.statusCode}`); + } + } else { + // Release mode: asset is a local file + const sourcePath = uri.startsWith('file://') ? uri.slice(7) : uri; + await RNFS.copyFile(sourcePath, destPath); + } + + Alert.alert('Saved', `File saved as ${fileName}`); + await refreshFiles(); + } catch (error) { + Alert.alert('Error', `Failed to save file: ${error}`); + } finally { + setLoading(false); + } + }, [selectedLocation, refreshFiles]); + + const handleRemove = useCallback( + async (file: SavedFile) => { + Alert.alert( + 'Confirm Delete', + `Are you sure you want to delete "${file.name}"?`, + [ + { text: 'Cancel', style: 'cancel' }, + { + text: 'Delete', + style: 'destructive', + onPress: async () => { + try { + await RNFS.unlink(file.path); + Alert.alert('Deleted', `${file.name} removed`); + await refreshFiles(); + } catch (error) { + Alert.alert('Error', `Failed to delete file: ${error}`); + } + }, + }, + ], + ); + }, + [refreshFiles], + ); + + const handleRemoveAll = useCallback(async () => { + if (savedFiles.length === 0) return; + + Alert.alert( + 'Confirm Delete All', + `Are you sure you want to delete all ${savedFiles.length} PNG files?`, + [ + { text: 'Cancel', style: 'cancel' }, + { + text: 'Delete All', + style: 'destructive', + onPress: async () => { + try { + await Promise.all(savedFiles.map((f) => RNFS.unlink(f.path))); + Alert.alert('Deleted', 'All PNG files removed'); + await refreshFiles(); + } catch (error) { + Alert.alert('Error', `Failed to delete files: ${error}`); + } + }, + }, + ], + ); + }, [savedFiles, refreshFiles]); + + const formatBytes = (bytes: number) => { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; + }; + + const renderFile = ({ item }: { item: SavedFile }) => ( + + + + {item.name} + + {formatBytes(item.size)} + + handleRemove(item)} + > + Remove + + + ); + + return ( + + + File System Plugin + + Save and manage files across device directories + + + + {/* Location selector */} + + Save Location + + {locations.map((loc) => ( + setSelectedLocation(loc)} + > + + {loc.label} + + + ))} + + + + {/* Actions */} + + + + {loading ? 'Saving...' : 'Save React Logo'} + + + + + + Remove All + + + + + {/* File list */} + + + + PNG Files ({savedFiles.length}) + + + Refresh + + + + {savedFiles.length === 0 ? ( + + No PNG files found + + Tap "Save React Logo" to write a file to the selected directory + + + ) : ( + item.path} + showsVerticalScrollIndicator={false} + contentContainerStyle={styles.listContainer} + ItemSeparatorComponent={() => } + /> + )} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#0a0a0a', + }, + header: { + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 40, + paddingTop: 60, + paddingBottom: 16, + }, + title: { + fontSize: 36, + fontWeight: 'bold', + color: '#ffffff', + textAlign: 'center', + marginBottom: 12, + letterSpacing: 1, + }, + subtitle: { + fontSize: 16, + color: '#a0a0a0', + textAlign: 'center', + lineHeight: 24, + }, + locationSection: { + paddingHorizontal: 20, + marginBottom: 16, + }, + sectionLabel: { + fontSize: 14, + fontWeight: '600', + color: '#a0a0a0', + marginBottom: 10, + textTransform: 'uppercase', + letterSpacing: 0.5, + }, + locationTabs: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 8, + }, + locationTab: { + backgroundColor: '#1a1a1a', + paddingVertical: 10, + paddingHorizontal: 14, + borderRadius: 8, + borderWidth: 1, + borderColor: '#333333', + alignItems: 'center', + }, + selectedLocationTab: { + backgroundColor: '#8232FF', + borderColor: '#8232FF', + }, + locationTabText: { + fontSize: 13, + fontWeight: '600', + color: '#ffffff', + }, + selectedLocationTabText: { + color: '#ffffff', + }, + actions: { + flexDirection: 'row', + paddingHorizontal: 20, + gap: 12, + marginBottom: 20, + }, + actionBtn: { + flex: 1, + paddingVertical: 16, + paddingHorizontal: 20, + borderRadius: 12, + alignItems: 'center', + }, + saveBtn: { + backgroundColor: '#8232FF', + shadowColor: '#8232FF', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.3, + shadowRadius: 8, + elevation: 8, + }, + removeAllBtn: { + backgroundColor: '#ff6b6b', + }, + disabledBtn: { + backgroundColor: '#333333', + shadowOpacity: 0, + elevation: 0, + }, + actionBtnText: { + color: '#ffffff', + fontSize: 16, + fontWeight: '600', + }, + disabledBtnText: { + color: '#666666', + }, + listSection: { + flex: 1, + paddingHorizontal: 20, + }, + listHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 16, + }, + listTitle: { + fontSize: 18, + fontWeight: 'bold', + color: '#ffffff', + }, + refreshBtn: { + backgroundColor: '#666666', + paddingHorizontal: 16, + paddingVertical: 8, + borderRadius: 6, + }, + refreshBtnText: { + color: '#ffffff', + fontSize: 14, + fontWeight: '600', + }, + listContainer: { + paddingVertical: 4, + }, + fileCard: { + backgroundColor: '#1a1a1a', + padding: 16, + borderRadius: 12, + borderWidth: 1, + borderColor: '#333333', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + fileInfo: { + flex: 1, + marginRight: 12, + }, + fileName: { + fontSize: 14, + fontWeight: '600', + color: '#ffffff', + fontFamily: 'monospace', + marginBottom: 4, + }, + fileSize: { + fontSize: 12, + color: '#a0a0a0', + }, + removeButton: { + backgroundColor: '#ff6b6b', + paddingVertical: 8, + paddingHorizontal: 16, + borderRadius: 6, + }, + removeButtonText: { + color: '#ffffff', + fontSize: 14, + fontWeight: '600', + }, + separator: { + height: 10, + }, + emptyState: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + paddingHorizontal: 40, + }, + emptyStateText: { + fontSize: 18, + color: '#a0a0a0', + textAlign: 'center', + marginBottom: 8, + }, + emptyStateSubtext: { + fontSize: 14, + color: '#666666', + textAlign: 'center', + }, +}); diff --git a/apps/playground/src/app/screens/LandingScreen.tsx b/apps/playground/src/app/screens/LandingScreen.tsx index 79cbb8d6..a965f375 100644 --- a/apps/playground/src/app/screens/LandingScreen.tsx +++ b/apps/playground/src/app/screens/LandingScreen.tsx @@ -60,6 +60,13 @@ export const LandingScreen = () => { Require Profiler Test + navigation.navigate('FileSystemTest' as never)} + > + File System + + navigation.navigate('BottomTabs' as never)} diff --git a/apps/playground/src/assets/react.png b/apps/playground/src/assets/react.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b6c43a65e304dea73571453a5bc20ad71a899f GIT binary patch literal 349153 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

gs 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⋙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 H~X{!&@V5VwU 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 F_P_h~7XAPL literal 0 HcmV?d00001 diff --git a/apps/playground/tsconfig.app.json b/apps/playground/tsconfig.app.json index 79f5506f..20784a77 100644 --- a/apps/playground/tsconfig.app.json +++ b/apps/playground/tsconfig.app.json @@ -28,6 +28,9 @@ ], "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.js", "src/**/*.jsx"], "references": [ + { + "path": "../../packages/file-system-plugin" + }, { "path": "../../packages/overlay-plugin" }, diff --git a/commitlint.config.js b/commitlint.config.js index 5a56beb4..d9f8b6cf 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -24,6 +24,7 @@ export default { 'react-navigation-plugin', 'require-profiler-plugin', 'overlay-plugin', + 'file-system-plugin', '', ], ], diff --git a/nx.json b/nx.json index c53750f3..af1f06f9 100644 --- a/nx.json +++ b/nx.json @@ -57,7 +57,8 @@ "packages/performance-monitor-plugin/**/*", "packages/react-navigation-plugin/**/*", "packages/require-profiler-plugin/**/*", - "packages/overlay-plugin/**/*" + "packages/overlay-plugin/**/*", + "packages/file-system-plugin/**/*" ] }, { diff --git a/packages/file-system-plugin/package.json b/packages/file-system-plugin/package.json new file mode 100644 index 00000000..76fe1ad5 --- /dev/null +++ b/packages/file-system-plugin/package.json @@ -0,0 +1,37 @@ +{ + "name": "@rozenite/file-system-plugin", + "version": "1.0.0", + "description": "File system plugin for Rozenite.", + "type": "module", + "main": "./dist/react-native.cjs", + "module": "./dist/react-native.js", + "types": "./dist/react-native.d.ts", + "scripts": { + "build": "rozenite build", + "dev": "rozenite dev" + }, + "dependencies": { + "@rozenite/plugin-bridge": "workspace:*" + }, + "devDependencies": { + "@rozenite/vite-plugin": "workspace:*", + "@types/react": "~18.3.12", + "autoprefixer": "^10.4.21", + "lucide-react": "^0.263.1", + "postcss": "^8.5.6", + "react": "18.3.1", + "react-dom": "18.3.0", + "react-native": "0.76.0", + "react-native-web": "0.21.0", + "rozenite": "workspace:*", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "^5.7.3", + "vite": "^6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "license": "MIT" +} diff --git a/packages/file-system-plugin/postcss.config.js b/packages/file-system-plugin/postcss.config.js new file mode 100644 index 00000000..2aa7205d --- /dev/null +++ b/packages/file-system-plugin/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/packages/file-system-plugin/react-native.ts b/packages/file-system-plugin/react-native.ts new file mode 100644 index 00000000..87d7dfae --- /dev/null +++ b/packages/file-system-plugin/react-native.ts @@ -0,0 +1,528 @@ +/** + * React Native DevTools Plugin Entry Point + * + * This file serves as the main entry point for your DevTools plugin in the React Native environment. + * You have full access to all React Native APIs and can integrate with your app's functionality. + * + * To communicate with the DevTools panel, use the `@rozenite/plugin-bridge` package + * which provides a reliable communication channel between your plugin and the DevTools interface. + */ + +import { useEffect, useRef } from 'react'; +import { + useRozeniteDevToolsClient, + type RozeniteDevToolsClient, +} from '@rozenite/plugin-bridge'; +import type { + FileSystemEventMap, + FileSystemProvider, + FsEntry, +} from './src/shared/protocol'; +import { PLUGIN_ID } from './src/shared/protocol'; +import { + joinPath, + mimeTypeFromName, + normalizeDirPath, +} from './src/shared/path'; + +type ProviderImpl = { + provider: Exclude; + getRoots: () => Promise< + Array<{ + id: string; + label: string; + path: string; + }> + >; + listDir: (path: string) => Promise; + readImageBase64: ( + path: string, + maxBytes: number, + ) => Promise<{ mime: string; base64: string }>; + readTextFile: (path: string, maxBytes: number) => Promise; +}; + +export type UseFileSystemDevToolsOptions = { + /** + * Pass Expo FileSystem module from the app (recommended, MMKV-style). + * This avoids any Metro/module-resolution edge cases inside the plugin bundle. + */ + expoFileSystem?: any; + /** + * Pass RNFS module from the app (recommended for bare RN). + * Supports `react-native-fs` or `@birdofpreyru/react-native-fs` (same surface). + */ + rnfs?: any; +}; + +async function detectProvider( + options?: UseFileSystemDevToolsOptions, +): Promise { + // MMKV-style: rely on explicit modules passed from the app. + if (!options?.expoFileSystem && !options?.rnfs) return null; + + if (options?.expoFileSystem) { + const FileSystem = + options.expoFileSystem?.default ?? options.expoFileSystem; + const expo: ProviderImpl = { + provider: 'expo', + async getRoots() { + const roots: Array<{ id: string; label: string; path: string }> = []; + if (FileSystem.documentDirectory) { + roots.push({ + id: 'expo.documentDirectory', + label: 'Document Directory', + path: normalizeDirPath(FileSystem.documentDirectory), + }); + } + if (FileSystem.cacheDirectory) { + roots.push({ + id: 'expo.cacheDirectory', + label: 'Cache Directory', + path: normalizeDirPath(FileSystem.cacheDirectory), + }); + } + if (FileSystem.bundleDirectory) { + roots.push({ + id: 'expo.bundleDirectory', + label: 'Bundle Directory', + path: normalizeDirPath(FileSystem.bundleDirectory), + }); + } + return roots; + }, + async listDir(path) { + const dir = normalizeDirPath(path); + const rawItems: string[] = await FileSystem.readDirectoryAsync(dir); + + // Cache directories can be huge; avoid timeouts by limiting work. + const MAX_ENTRIES = 400; + const CONCURRENCY = 12; + const limited = rawItems.slice(0, MAX_ENTRIES); + + const entries = await mapWithConcurrency( + limited, + CONCURRENCY, + async (raw: string) => { + const child = resolveExpoChildPath(dir, raw); + const info = await FileSystem.getInfoAsync(child, { size: true }); + const isDirectory = Boolean(info.isDirectory); + return { + name: basename(raw), + path: isDirectory ? normalizeDirPath(child) : child, + isDirectory, + size: info.size ?? null, + modifiedAtMs: + typeof info.modificationTime === 'number' + ? info.modificationTime * 1000 + : null, + mimeTypeHint: mimeTypeFromName(child), + } satisfies FsEntry; + }, + ); + + if (rawItems.length > MAX_ENTRIES) { + entries.push({ + name: `… (${rawItems.length - MAX_ENTRIES} more not shown)`, + path: joinPath(dir, `__ROZENITE_TRUNCATED__${Date.now()}`), + isDirectory: false, + size: null, + modifiedAtMs: null, + mimeTypeHint: null, + }); + } + entries.sort((a, b) => { + if (a.isDirectory !== b.isDirectory) return a.isDirectory ? -1 : 1; + return a.name.localeCompare(b.name); + }); + return entries; + }, + async readImageBase64(path, maxBytes) { + const info = await FileSystem.getInfoAsync(path, { size: true }); + const size = info.size ?? 0; + if (maxBytes > 0 && size > maxBytes) { + throw new Error( + `File is too large for preview (${size} bytes, limit ${maxBytes})`, + ); + } + const base64 = await FileSystem.readAsStringAsync(path, { + encoding: 'base64', + }); + const mime = mimeTypeFromName(path) ?? 'application/octet-stream'; + return { mime, base64 }; + }, + async readTextFile(path, maxBytes) { + const info = await FileSystem.getInfoAsync(path, { size: true }); + const size = info.size ?? 0; + if (maxBytes > 0 && size > maxBytes) { + throw new Error( + `File is too large for preview (${size} bytes, limit ${maxBytes})`, + ); + } + // Try UTF-8 first, fall back to base64 for binary files + try { + return await FileSystem.readAsStringAsync(path, { encoding: 'utf8' }); + } catch { + // File might be binary, try base64 + const base64 = await FileSystem.readAsStringAsync(path, { + encoding: 'base64', + }); + // Decode base64 to show raw bytes as hex + return ( + `[Binary file - ${size} bytes]\n\n` + formatBase64AsHex(base64) + ); + } + }, + }; + return expo; + } + + const RNFS = options!.rnfs; + const rnfs: ProviderImpl = { + provider: 'rnfs', + async getRoots() { + const roots: Array<{ id: string; label: string; path: string }> = []; + roots.push({ + id: 'rnfs.DocumentDirectoryPath', + label: 'Document Directory', + path: normalizeDirPath(RNFS.DocumentDirectoryPath), + }); + roots.push({ + id: 'rnfs.CachesDirectoryPath', + label: 'Caches Directory', + path: normalizeDirPath(RNFS.CachesDirectoryPath), + }); + roots.push({ + id: 'rnfs.TemporaryDirectoryPath', + label: 'Temporary Directory', + path: normalizeDirPath(RNFS.TemporaryDirectoryPath), + }); + roots.push({ + id: 'rnfs.LibraryDirectoryPath', + label: 'Library Directory', + path: normalizeDirPath(RNFS.LibraryDirectoryPath), + }); + if (RNFS.MainBundlePath) { + roots.push({ + id: 'rnfs.MainBundlePath', + label: 'Main Bundle', + path: normalizeDirPath(RNFS.MainBundlePath), + }); + } + return roots; + }, + async listDir(path) { + const normalized = normalizeDirPath(path); + const dir = + normalized.length > 1 && normalized.endsWith('/') + ? normalized.slice(0, -1) + : normalized; + const items = await RNFS.readDir(dir); + const entries: FsEntry[] = items.map((it: any) => { + const isDirectory = it.isDirectory(); + return { + name: it.name, + path: isDirectory ? normalizeDirPath(it.path) : it.path, + isDirectory, + size: it.isFile() ? it.size : null, + modifiedAtMs: it.mtime ? it.mtime.getTime() : null, + mimeTypeHint: mimeTypeFromName(it.path), + }; + }); + entries.sort((a, b) => { + if (a.isDirectory !== b.isDirectory) return a.isDirectory ? -1 : 1; + return a.name.localeCompare(b.name); + }); + return entries; + }, + async readImageBase64(path, maxBytes) { + const st = await RNFS.stat(path); + const size = st.size ?? 0; + if (maxBytes > 0 && size > maxBytes) { + throw new Error( + `File is too large for preview (${size} bytes, limit ${maxBytes})`, + ); + } + const base64 = await RNFS.readFile(path, 'base64'); + const mime = mimeTypeFromName(path) ?? 'application/octet-stream'; + return { mime, base64 }; + }, + async readTextFile(path, maxBytes) { + const st = await RNFS.stat(path); + const size = st.size ?? 0; + if (maxBytes > 0 && size > maxBytes) { + throw new Error( + `File is too large for preview (${size} bytes, limit ${maxBytes})`, + ); + } + // Try UTF-8 first, fall back to base64 for binary files + try { + return await RNFS.readFile(path, 'utf8'); + } catch { + // File might be binary, try base64 + const base64 = await RNFS.readFile(path, 'base64'); + return `[Binary file - ${size} bytes]\n\n` + formatBase64AsHex(base64); + } + }, + }; + return rnfs; +} + +function resolveExpoChildPath(dirUri: string, item: string): string { + // Legacy FS can return either leaf names or full URIs/paths. + if (!item) return dirUri; + if (item.startsWith('file://')) return item; + if (item.startsWith('/')) return item; + if (item.startsWith(dirUri)) return item; + return joinPath(dirUri, item); +} + +function basename(pathOrUri: string): string { + if (!pathOrUri) return ''; + // Strip query/hash for safety + const clean = pathOrUri.split('?')[0]!.split('#')[0]!; + const noTrailing = clean.endsWith('/') ? clean.slice(0, -1) : clean; + const idx = noTrailing.lastIndexOf('/'); + return idx >= 0 ? noTrailing.slice(idx + 1) : noTrailing; +} + +async function mapWithConcurrency( + items: TInput[], + concurrency: number, + worker: (item: TInput) => Promise, +): Promise { + const results: TOutput[] = new Array(items.length); + let idx = 0; + + const runners = new Array(Math.max(1, concurrency)).fill(0).map(async () => { + while (idx < items.length) { + const current = idx++; + results[current] = await worker(items[current]!); + } + }); + + await Promise.all(runners); + return results; +} + +function safeError(err: unknown): string { + if (err instanceof Error) return err.message; + try { + return JSON.stringify(err); + } catch { + return String(err); + } +} + +function formatBase64AsHex(base64: string): string { + // Decode base64 to bytes and format as hex dump + const chars = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + const bytes: number[] = []; + + // Remove padding and decode + const clean = base64.replace(/=/g, ''); + for (let i = 0; i < clean.length; i += 4) { + const a = chars.indexOf(clean[i] || 'A'); + const b = chars.indexOf(clean[i + 1] || 'A'); + const c = chars.indexOf(clean[i + 2] || 'A'); + const d = chars.indexOf(clean[i + 3] || 'A'); + + bytes.push((a << 2) | (b >> 4)); + if (i + 2 < clean.length) bytes.push(((b & 15) << 4) | (c >> 2)); + if (i + 3 < clean.length) bytes.push(((c & 3) << 6) | d); + } + + // Limit to first 512 bytes for preview + const limited = bytes.slice(0, 512); + const lines: string[] = []; + + for (let i = 0; i < limited.length; i += 16) { + const slice = limited.slice(i, i + 16); + const hex = slice.map((b) => b.toString(16).padStart(2, '0')).join(' '); + const ascii = slice + .map((b) => (b >= 32 && b < 127 ? String.fromCharCode(b) : '.')) + .join(''); + const offset = i.toString(16).padStart(8, '0'); + lines.push(`${offset} ${hex.padEnd(48)} ${ascii}`); + } + + if (bytes.length > 512) { + lines.push(`\n... (${bytes.length - 512} more bytes not shown)`); + } + + return lines.join('\n'); +} + +export const useFileSystemDevTools = ( + options?: UseFileSystemDevToolsOptions, +) => { + const client = useRozeniteDevToolsClient({ + pluginId: PLUGIN_ID, + }); + + const subsRef = useRef void }>>([]); + + useEffect(() => { + if (!client) return; + + // Notify the panel that the RN side is ready (handles app reload case) + client.send('fs:ready', { timestamp: Date.now() }); + + subsRef.current.push( + client.onMessage('fs:get-roots', async ({ requestId }) => { + try { + const provider = await detectProvider(options); + if (!provider) { + client.send('fs:get-roots:result', { + requestId, + provider: 'none', + roots: [], + error: + 'No filesystem provider detected. Pass `{ expoFileSystem: FileSystem }` (Expo) or `{ rnfs: RNFS }` (bare RN) to `useFileSystemDevTools()`.', + }); + return; + } + const roots = await provider.getRoots(); + client.send('fs:get-roots:result', { + requestId, + provider: provider.provider, + roots, + }); + } catch (e) { + client.send('fs:get-roots:result', { + requestId, + provider: 'none', + roots: [], + error: safeError(e), + }); + } + }), + ); + + subsRef.current.push( + client.onMessage('fs:list', async ({ requestId, path }) => { + try { + const provider = await detectProvider(options); + if (!provider) { + client.send('fs:list:result', { + requestId, + provider: 'none', + path, + entries: [], + error: + 'No filesystem provider detected. Pass `{ expoFileSystem: FileSystem }` (Expo) or `{ rnfs: RNFS }` (bare RN) to `useFileSystemDevTools()`.', + }); + return; + } + const entries = await provider.listDir(path); + client.send('fs:list:result', { + requestId, + provider: provider.provider, + path, + entries, + }); + } catch (e) { + const provider = await detectProvider(options); + client.send('fs:list:result', { + requestId, + provider: provider?.provider ?? 'none', + path, + entries: [], + error: safeError(e), + }); + } + }), + ); + + subsRef.current.push( + client.onMessage( + 'fs:read-image', + async ({ requestId, path, maxBytes }) => { + try { + const provider = await detectProvider(options); + if (!provider) { + client.send('fs:read-image:result', { + requestId, + provider: 'none', + path, + error: + 'No filesystem provider detected. Pass `{ expoFileSystem: FileSystem }` (Expo) or `{ rnfs: RNFS }` (bare RN) to `useFileSystemDevTools()`.', + }); + return; + } + + const { mime, base64 } = await provider.readImageBase64( + path, + typeof maxBytes === 'number' ? maxBytes : 10_000_000, + ); + + client.send('fs:read-image:result', { + requestId, + provider: provider.provider, + path, + dataUri: `data:${mime};base64,${base64}`, + }); + } catch (e) { + const provider = await detectProvider(options); + client.send('fs:read-image:result', { + requestId, + provider: provider?.provider ?? 'none', + path, + error: safeError(e), + }); + } + }, + ), + ); + + subsRef.current.push( + client.onMessage( + 'fs:read-file', + async ({ requestId, path, maxBytes }) => { + try { + const provider = await detectProvider(options); + if (!provider) { + client.send('fs:read-file:result', { + requestId, + provider: 'none', + path, + error: + 'No filesystem provider detected. Pass `{ expoFileSystem: FileSystem }` (Expo) or `{ rnfs: RNFS }` (bare RN) to `useFileSystemDevTools()`.', + }); + return; + } + + const content = await provider.readTextFile( + path, + typeof maxBytes === 'number' ? maxBytes : 10_000_000, + ); + + client.send('fs:read-file:result', { + requestId, + provider: provider.provider, + path, + content, + }); + } catch (e) { + const provider = await detectProvider(options); + client.send('fs:read-file:result', { + requestId, + provider: provider?.provider ?? 'none', + path, + error: safeError(e), + }); + } + }, + ), + ); + + return () => { + subsRef.current.forEach((s) => s.remove()); + subsRef.current = []; + }; + }, [client]); +}; + +// Backwards-compatible with the Rozenite template naming +export const useDevTools = useFileSystemDevTools; diff --git a/packages/file-system-plugin/rozenite.config.ts b/packages/file-system-plugin/rozenite.config.ts new file mode 100644 index 00000000..ea0ccf9e --- /dev/null +++ b/packages/file-system-plugin/rozenite.config.ts @@ -0,0 +1,8 @@ +export default { + panels: [ + { + name: 'File System', + source: './src/file-system.tsx', + }, + ], +}; diff --git a/packages/file-system-plugin/src/file-system.tsx b/packages/file-system-plugin/src/file-system.tsx new file mode 100644 index 00000000..f3861d74 --- /dev/null +++ b/packages/file-system-plugin/src/file-system.tsx @@ -0,0 +1,1286 @@ +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { + ActivityIndicator, + FlatList, + Image, + Pressable, + type PressableStateCallbackType, + SafeAreaView, + ScrollView, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native'; + +// Extended pressable state for react-native-web (includes hover) +type WebPressableState = PressableStateCallbackType & { hovered?: boolean }; +import { useRozeniteDevToolsClient } from '@rozenite/plugin-bridge'; +import type { + FileSystemEventMap, + FileSystemProvider, + FsEntry, + FsRoots, +} from './shared/protocol'; +import { PLUGIN_ID } from './shared/protocol'; +import { isLikelyImageFile, isLikelyTextFile, parentPath } from './shared/path'; + +function newRequestId(): string { + return `${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`; +} + +function formatBytes(bytes?: number | null): string { + if (bytes == null) return '—'; + if (bytes < 1024) return `${bytes} B`; + const kb = bytes / 1024; + if (kb < 1024) return `${kb.toFixed(1)} KB`; + const mb = kb / 1024; + if (mb < 1024) return `${mb.toFixed(1)} MB`; + const gb = mb / 1024; + return `${gb.toFixed(1)} GB`; +} + +function formatDate(ms?: number | null): string { + if (!ms) return '—'; + try { + return new Date(ms).toLocaleString(); + } catch { + return '—'; + } +} + +type PendingResolvers = { + roots: Map< + string, + (payload: FileSystemEventMap['fs:get-roots:result']) => void + >; + list: Map void>; + image: Map< + string, + (payload: FileSystemEventMap['fs:read-image:result']) => void + >; + file: Map< + string, + (payload: FileSystemEventMap['fs:read-file:result']) => void + >; +}; + +export default function FileSystemPanel() { + const client = useRozeniteDevToolsClient({ + pluginId: PLUGIN_ID, + }); + + const pendingRef = useRef({ + roots: new Map(), + list: new Map(), + image: new Map(), + file: new Map(), + }); + + const [provider, setProvider] = useState('none'); + const [roots, setRoots] = useState([]); + const [pathInput, setPathInput] = useState(''); + const [currentPath, setCurrentPath] = useState(''); + + const [entries, setEntries] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const [selected, setSelected] = useState(null); + const [imagePreviewUri, setImagePreviewUri] = useState(null); + const [imagePreviewError, setImagePreviewError] = useState( + null, + ); + const [imagePreviewLoading, setImagePreviewLoading] = useState(false); + + const [textPreview, setTextPreview] = useState(null); + const [textPreviewError, setTextPreviewError] = useState(null); + const [textPreviewLoading, setTextPreviewLoading] = useState(false); + + useEffect(() => { + if (!client) return; + + const subRoots = client.onMessage('fs:get-roots:result', (payload) => { + const resolve = pendingRef.current.roots.get(payload.requestId); + if (resolve) { + pendingRef.current.roots.delete(payload.requestId); + resolve(payload); + } + }); + + const subList = client.onMessage('fs:list:result', (payload) => { + const resolve = pendingRef.current.list.get(payload.requestId); + if (resolve) { + pendingRef.current.list.delete(payload.requestId); + resolve(payload); + } + }); + + const subImage = client.onMessage('fs:read-image:result', (payload) => { + const resolve = pendingRef.current.image.get(payload.requestId); + if (resolve) { + pendingRef.current.image.delete(payload.requestId); + resolve(payload); + } + }); + + const subFile = client.onMessage('fs:read-file:result', (payload) => { + const resolve = pendingRef.current.file.get(payload.requestId); + if (resolve) { + pendingRef.current.file.delete(payload.requestId); + resolve(payload); + } + }); + + return () => { + subRoots.remove(); + subList.remove(); + subImage.remove(); + subFile.remove(); + }; + }, [client]); + + const requestRoots = useCallback(async () => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise( + (resolve) => { + pendingRef.current.roots.set(requestId, resolve); + }, + ); + client.send('fs:get-roots', { requestId }); + return await withTimeout(p, 8000, 'Timeout fetching roots'); + }, [client]); + + const requestList = useCallback( + async (path: string) => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise((resolve) => { + pendingRef.current.list.set(requestId, resolve); + }); + client.send('fs:list', { requestId, path }); + return await withTimeout(p, 15000, 'Timeout listing directory'); + }, + [client], + ); + + const requestImagePreview = useCallback( + async (path: string, maxBytes = 10_000_000) => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise( + (resolve) => { + pendingRef.current.image.set(requestId, resolve); + }, + ); + client.send('fs:read-image', { requestId, path, maxBytes }); + return await withTimeout(p, 15000, 'Timeout reading image'); + }, + [client], + ); + + const requestTextPreview = useCallback( + async (path: string, maxBytes = 10_000_000) => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise( + (resolve) => { + pendingRef.current.file.set(requestId, resolve); + }, + ); + client.send('fs:read-file', { requestId, path, maxBytes }); + return await withTimeout(p, 15000, 'Timeout reading file'); + }, + [client], + ); + + const loadRootsAndMaybeInit = useCallback(async () => { + setError(null); + const res = await requestRoots(); + if (!res) return; + setProvider(res.provider); + if (res.error) { + setRoots([]); + setError(res.error); + return; + } + setRoots(res.roots); + + // Initialize path to first root only once + if (!currentPath && res.roots.length > 0) { + const first = res.roots[0]!.path; + setPathInput(first); + setCurrentPath(first); + } + }, [currentPath, requestRoots]); + + useEffect(() => { + if (!client) return; + loadRootsAndMaybeInit(); + }, [client, loadRootsAndMaybeInit]); + + const loadDir = useCallback( + async (path: string) => { + setLoading(true); + setError(null); + setSelected(null); + setImagePreviewUri(null); + setImagePreviewError(null); + setImagePreviewLoading(false); + setTextPreview(null); + setTextPreviewError(null); + setTextPreviewLoading(false); + + try { + const res = await requestList(path); + if (!res) return; + setProvider(res.provider); + setCurrentPath(res.path); + setPathInput(res.path); + if (res.error) { + setEntries([]); + setError(res.error); + return; + } + setEntries(res.entries); + } catch (e) { + setEntries([]); + setError(e instanceof Error ? e.message : String(e)); + } finally { + setLoading(false); + } + }, + [requestList], + ); + + useEffect(() => { + if (!client) return; + if (!currentPath) return; + loadDir(currentPath); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [client, currentPath]); + + // Handle RN app ready/reconnect - re-fetch data when RN side (re)initializes + useEffect(() => { + if (!client) return; + + const subReady = client.onMessage('fs:ready', async () => { + // Reset UI state on reconnect + setProvider('none'); + setRoots([]); + setEntries([]); + setSelected(null); + setImagePreviewUri(null); + setTextPreview(null); + setError(null); + + // Re-fetch roots + await loadRootsAndMaybeInit(); + + // If user was in a directory, reload it + if (currentPath) { + loadDir(currentPath); + } + }); + + return () => { + subReady.remove(); + }; + }, [client, currentPath, loadDir, loadRootsAndMaybeInit]); + + const onGo = useCallback(() => { + const next = pathInput.trim(); + if (!next) return; + setCurrentPath(next); + }, [pathInput]); + + // Check if we can go back (not at or above a root path) + const canGoBack = useMemo(() => { + if (!currentPath) return false; + // If current path is one of the roots, we can't go up + const isAtRoot = roots.some((r) => r.path === currentPath); + if (isAtRoot) return false; + // Check if parent path exists and we wouldn't go above a root + const parent = parentPath(currentPath); + if (!parent) return false; + // Ensure we're still within one of the root paths + return roots.some((r) => parent.startsWith(r.path) || parent === r.path); + }, [currentPath, roots]); + + const onBack = useCallback(() => { + if (!canGoBack) return; + const p = parentPath(currentPath); + if (!p) return; + setCurrentPath(p); + }, [currentPath, canGoBack]); + + const onReload = useCallback(() => { + if (!currentPath) return; + loadDir(currentPath); + }, [currentPath, loadDir]); + + const rootChips = useMemo(() => { + return roots.map((r) => { + const isActive = r.path === currentPath; + return ( + [ + styles.chip, + state.hovered && !isActive && styles.chipHovered, + isActive ? styles.chipActive : undefined, + ]} + onPress={() => setCurrentPath(r.path)} + > + + {r.label} + + + ); + }); + }, [currentPath, roots]); + + const onSelectEntry = useCallback( + async (entry: FsEntry) => { + setSelected(entry); + setImagePreviewUri(null); + setImagePreviewError(null); + setTextPreview(null); + setTextPreviewError(null); + + if (entry.isDirectory) { + setCurrentPath(entry.path); + return; + } + + // Handle image preview + if (isLikelyImageFile(entry.path)) { + setImagePreviewLoading(true); + try { + const res = await requestImagePreview(entry.path); + if (!res) return; + if (res.error || !res.dataUri) { + setImagePreviewError(res.error ?? 'No preview available'); + return; + } + setImagePreviewUri(res.dataUri); + } catch (e) { + setImagePreviewError(e instanceof Error ? e.message : String(e)); + } finally { + setImagePreviewLoading(false); + } + return; + } + + // Handle text/file preview for any non-image file + setTextPreviewLoading(true); + try { + const res = await requestTextPreview(entry.path); + if (!res) return; + if (res.error || !res.content) { + setTextPreviewError(res.error ?? 'No preview available'); + return; + } + setTextPreview(res.content); + } catch (e) { + setTextPreviewError(e instanceof Error ? e.message : String(e)); + } finally { + setTextPreviewLoading(false); + } + }, + [requestImagePreview, requestTextPreview], + ); + + const headerRight = useMemo(() => { + const status = + provider === 'none' + ? 'No provider' + : provider === 'expo' + ? 'Expo FileSystem' + : 'react-native-fs'; + return {status}; + }, [provider]); + + if (!client) { + return ( + + + + Connecting to React Native… + + + ); + } + + return ( + + + + File System + {headerRight} + + + + + [ + styles.iconButton, + state.hovered && canGoBack && styles.iconButtonHovered, + !canGoBack ? styles.buttonDisabled : null, + ]} + onPress={onBack} + disabled={!canGoBack} + > + + + + [ + styles.iconButton, + state.hovered && !!currentPath && styles.iconButtonHovered, + !currentPath ? styles.buttonDisabled : null, + ]} + onPress={onReload} + disabled={!currentPath} + > + + + + + + + + [ + styles.primaryButton, + state.hovered && styles.primaryButtonHovered, + ]} + onPress={onGo} + > + Go + + + + {rootChips} + + + + + + + {currentPath ? ( + + ) : ( + + )} + {loading ? : null} + + + {error ? ( + + Error + {error} + + ) : null} + + item.path} + contentContainerStyle={styles.listContent} + renderItem={({ item }) => { + const isSelected = selected?.path === item.path; + return ( + onSelectEntry(item)} + style={(state: WebPressableState) => [ + styles.row, + state.hovered && !isSelected && styles.rowHovered, + isSelected ? styles.rowSelected : undefined, + ]} + > + + {item.isDirectory + ? '📁' + : isLikelyImageFile(item.path) + ? '🖼️' + : isLikelyTextFile(item.path) + ? '📝' + : '📄'} + + + + {item.name} + + + {item.isDirectory + ? 'Directory' + : `${formatBytes(item.size)} • ${formatDate( + item.modifiedAtMs, + )}`} + + + + {item.isDirectory ? '›' : ''} + + + ); + }} + /> + + + + Details + {!selected ? ( + Select a file or directory. + ) : ( + + + {selected.name} + + + + + + + + + {!selected.isDirectory && isLikelyImageFile(selected.path) ? ( + + Image preview + {imagePreviewLoading ? ( + + + + Loading preview… + + + ) : imagePreviewError ? ( + {imagePreviewError} + ) : imagePreviewUri ? ( + + ) : ( + + Tap the file again to re-fetch preview (limited size). + + )} + + ) : null} + + {!selected.isDirectory && !isLikelyImageFile(selected.path) ? ( + + File preview + {textPreviewLoading ? ( + + + + Loading preview… + + + ) : textPreviewError ? ( + {textPreviewError} + ) : textPreview ? ( + + + {formatTextPreview(textPreview)} + + + ) : ( + + Tap the file again to re-fetch preview (limited size). + + )} + + ) : null} + + )} + + + + ); +} + +function DetailLine({ label, value }: { label: string; value: string }) { + return ( + + {label} + + {value} + + + ); +} + +type CopyState = 'idle' | 'copied' | 'error'; + +// Helper to copy text to clipboard (works in web views) +function copyToClipboard(text: string): boolean { + try { + // Use the textarea fallback approach which is most reliable + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.top = '0'; + textArea.style.left = '-9999px'; + textArea.style.opacity = '0'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + const success = document.execCommand('copy'); + document.body.removeChild(textArea); + return success; + } catch { + return false; + } +} + +function PathDisplay({ path, label }: { path: string; label?: string }) { + const [copyState, setCopyState] = useState('idle'); + + const handleCopy = useCallback(() => { + const success = copyToClipboard(path); + if (success) { + setCopyState('copied'); + } else { + setCopyState('error'); + } + setTimeout(() => setCopyState('idle'), 2000); + }, [path]); + + const copyIcon = + copyState === 'copied' ? '✓' : copyState === 'error' ? '✕' : '⧉'; + const copyLabel = + copyState === 'copied' + ? 'Copied!' + : copyState === 'error' + ? 'Failed' + : 'Copy'; + + return ( + + {label ? {label} : null} + + + + {path} + + + + [ + styles.pathActionButton, + state.hovered && styles.pathActionButtonHovered, + copyState === 'copied' && styles.pathActionButtonSuccess, + copyState === 'error' && styles.pathActionButtonError, + ]} + onPress={handleCopy} + > + + {copyIcon} + + + {copyLabel} + + + + + + ); +} + +// ============================================================================ +// Content Formatters +// Add new formatters here to support pretty-printing additional formats. +// Each formatter returns { success: true, formatted: string } or { success: false } +// ============================================================================ + +type FormatResult = { success: true; formatted: string } | { success: false }; + +type ContentFormatter = (content: string) => FormatResult; + +const formatters: ContentFormatter[] = [ + // JSON formatter + (content: string): FormatResult => { + try { + const parsed = JSON.parse(content); + return { success: true, formatted: JSON.stringify(parsed, null, 2) }; + } catch { + return { success: false }; + } + }, + + // PLIST / XML formatter + (content: string): FormatResult => { + // Remove BOM if present and trim + const cleaned = content.replace(/^\uFEFF/, '').trim(); + + // Check if it looks like XML/PLIST (handle various XML starts) + const looksLikeXml = + cleaned.startsWith('\s+<') // Remove whitespace between tags + .replace(//g, '>\n') // Add newline after each closing tag + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0); + + for (const token of normalized) { + // Handle closing tags - decrease indent first + if (token.startsWith('') || + token.startsWith('value + if (token.startsWith('<') && token.includes('( + p: Promise, + ms: number, + message: string, +): Promise { + let timeout: ReturnType | null = null; + try { + return await Promise.race([ + p, + new Promise((_, reject) => { + timeout = setTimeout(() => reject(new Error(message)), ms); + }), + ]); + } finally { + if (timeout) clearTimeout(timeout); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#0b0b0f', + }, + center: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + gap: 12, + }, + centerText: { + color: '#d6d6d6', + fontSize: 14, + }, + + topBar: { + paddingHorizontal: 16, + paddingTop: 12, + paddingBottom: 10, + borderBottomWidth: 1, + borderBottomColor: '#1c1c24', + backgroundColor: '#0f1016', + }, + topBarLeft: { + flexDirection: 'row', + alignItems: 'baseline', + justifyContent: 'space-between', + marginBottom: 10, + }, + title: { + fontSize: 18, + fontWeight: '700', + color: '#f2f2f2', + }, + statusText: { + fontSize: 12, + color: '#9a9aa7', + }, + + controls: { + gap: 10, + }, + controlsRow: { + flexDirection: 'row', + gap: 8, + alignItems: 'center', + }, + chipsRow: { + flexDirection: 'row', + gap: 8, + flexWrap: 'wrap', + }, + + button: { + paddingHorizontal: 10, + paddingVertical: 8, + borderRadius: 8, + backgroundColor: '#1b1c25', + borderWidth: 1, + borderColor: '#2a2b37', + }, + iconButton: { + width: 36, + height: 36, + borderRadius: 8, + backgroundColor: '#1b1c25', + borderWidth: 1, + borderColor: '#2a2b37', + alignItems: 'center', + justifyContent: 'center', + }, + iconButtonHovered: { + backgroundColor: '#252633', + }, + iconButtonText: { + color: '#e9e9ee', + fontSize: 16, + fontWeight: '600', + }, + buttonDisabled: { + opacity: 0.4, + }, + buttonText: { + color: '#e9e9ee', + fontSize: 12, + fontWeight: '600', + }, + primaryButton: { + paddingHorizontal: 12, + paddingVertical: 8, + borderRadius: 8, + backgroundColor: '#8232ff', + }, + primaryButtonHovered: { + backgroundColor: '#9550ff', + }, + primaryButtonText: { + color: '#ffffff', + fontSize: 12, + fontWeight: '700', + }, + + pathInputWrap: { + flex: 1, + minWidth: 240, + }, + pathInput: { + paddingHorizontal: 10, + paddingVertical: 8, + borderRadius: 8, + borderWidth: 1, + borderColor: '#2a2b37', + backgroundColor: '#0b0b0f', + color: '#f2f2f2', + fontSize: 12, + }, + + chip: { + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#161723', + borderWidth: 1, + borderColor: '#2a2b37', + maxWidth: 220, + }, + chipHovered: { + backgroundColor: '#1e1f2e', + borderColor: '#3a3b4a', + }, + chipActive: { + borderColor: '#8232ff', + backgroundColor: 'rgba(130, 50, 255, 0.14)', + }, + chipText: { + color: '#cfcfe0', + fontSize: 12, + fontWeight: '600', + }, + chipTextActive: { + color: '#efe7ff', + }, + + body: { + flex: 1, + flexDirection: 'row', + }, + listPane: { + flex: 1.2, + borderRightWidth: 1, + borderRightColor: '#1c1c24', + }, + detailPane: { + flex: 1, + padding: 16, + }, + + listHeader: { + paddingHorizontal: 12, + paddingVertical: 8, + borderBottomWidth: 1, + borderBottomColor: '#1c1c24', + flexDirection: 'row', + alignItems: 'center', + gap: 10, + }, + listHeaderTitle: { + flex: 1, + color: '#eaeaf2', + fontSize: 12, + fontFamily: 'Menlo', + }, + listContent: { + paddingVertical: 6, + }, + + row: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + paddingHorizontal: 16, + paddingVertical: 10, + }, + rowHovered: { + backgroundColor: 'rgba(255, 255, 255, 0.04)', + }, + rowSelected: { + backgroundColor: 'rgba(130, 50, 255, 0.12)', + }, + rowIcon: { + width: 24, + textAlign: 'center', + fontSize: 16, + }, + rowMain: { + flex: 1, + gap: 2, + }, + rowName: { + color: '#f2f2f2', + fontSize: 13, + fontWeight: '600', + }, + rowMeta: { + color: '#9a9aa7', + fontSize: 11, + }, + rowChevron: { + color: '#6f6f7e', + fontSize: 18, + paddingLeft: 6, + }, + + errorBox: { + margin: 16, + padding: 12, + borderRadius: 10, + borderWidth: 1, + borderColor: 'rgba(255, 99, 132, 0.4)', + backgroundColor: 'rgba(255, 99, 132, 0.08)', + gap: 6, + }, + errorTitle: { + color: '#ffb3c1', + fontWeight: '700', + }, + errorText: { + color: '#ffb3c1', + fontSize: 12, + }, + + detailTitle: { + color: '#f2f2f2', + fontSize: 14, + fontWeight: '700', + marginBottom: 10, + }, + detailEmpty: { + color: '#9a9aa7', + fontSize: 12, + }, + detailCard: { + borderWidth: 1, + borderColor: '#1c1c24', + borderRadius: 12, + padding: 12, + backgroundColor: '#0f1016', + gap: 10, + }, + detailName: { + color: '#f2f2f2', + fontSize: 13, + fontWeight: '700', + }, + detailPath: { + color: '#9a9aa7', + fontSize: 11, + fontFamily: 'Menlo', + }, + detailGrid: { + gap: 8, + }, + detailLine: { + flexDirection: 'row', + justifyContent: 'space-between', + gap: 10, + }, + detailLabel: { + color: '#9a9aa7', + fontSize: 11, + }, + detailValue: { + color: '#eaeaf2', + fontSize: 11, + fontWeight: '600', + maxWidth: '70%', + textAlign: 'right', + }, + + previewBox: { + marginTop: 6, + borderTopWidth: 1, + borderTopColor: '#1c1c24', + paddingTop: 10, + gap: 8, + }, + previewTitle: { + color: '#eaeaf2', + fontSize: 12, + fontWeight: '700', + }, + previewHint: { + color: '#9a9aa7', + fontSize: 12, + }, + previewError: { + color: '#ffb3c1', + fontSize: 12, + }, + previewLoading: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + }, + previewLoadingText: { + color: '#cfcfe0', + fontSize: 12, + }, + previewImage: { + width: '100%', + height: 240, + backgroundColor: '#0b0b0f', + borderRadius: 10, + }, + textPreviewScroll: { + maxHeight: 300, + backgroundColor: '#0b0b0f', + borderRadius: 10, + padding: 12, + borderWidth: 1, + borderColor: '#1c1c24', + }, + textPreviewContent: { + color: '#d6d6d6', + fontSize: 11, + fontFamily: 'Menlo', + lineHeight: 16, + }, + + // PathDisplay styles + pathDisplayContainer: { + flex: 1, + gap: 6, + }, + pathDisplayLabel: { + color: '#9a9aa7', + fontSize: 11, + fontWeight: '600', + }, + pathDisplayRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + backgroundColor: '#0b0b0f', + borderRadius: 8, + borderWidth: 1, + borderColor: '#1c1c24', + paddingLeft: 10, + paddingVertical: 2, + overflow: 'hidden', + }, + pathDisplayScroll: { + flex: 1, + maxHeight: 32, + }, + pathDisplayScrollContent: { + alignItems: 'center', + paddingVertical: 6, + }, + pathDisplayText: { + color: '#b8b8c8', + fontSize: 11, + fontFamily: 'Menlo', + }, + pathDisplayActions: { + flexDirection: 'row', + alignItems: 'center', + }, + pathActionButton: { + flexDirection: 'row', + alignItems: 'center', + gap: 4, + paddingHorizontal: 10, + paddingVertical: 8, + borderLeftWidth: 1, + borderLeftColor: '#2a2b37', + }, + pathActionButtonHovered: { + backgroundColor: 'rgba(255, 255, 255, 0.06)', + }, + pathActionButtonSuccess: { + backgroundColor: 'rgba(74, 222, 128, 0.1)', + }, + pathActionButtonError: { + backgroundColor: 'rgba(255, 99, 132, 0.1)', + }, + pathActionIcon: { + color: '#9a9aa7', + fontSize: 12, + }, + pathActionIconSuccess: { + color: '#4ade80', + }, + pathActionIconError: { + color: '#ff6384', + }, + pathActionLabel: { + color: '#9a9aa7', + fontSize: 10, + fontWeight: '600', + }, + pathActionLabelSuccess: { + color: '#4ade80', + }, + pathActionLabelError: { + color: '#ff6384', + }, +}); diff --git a/packages/file-system-plugin/src/shared/optional-modules.d.ts b/packages/file-system-plugin/src/shared/optional-modules.d.ts new file mode 100644 index 00000000..efa5d277 --- /dev/null +++ b/packages/file-system-plugin/src/shared/optional-modules.d.ts @@ -0,0 +1,56 @@ +declare module "expo-file-system" { + export type FileInfo = { + exists: boolean; + isDirectory?: boolean; + size?: number; + modificationTime?: number; // seconds + uri: string; + }; + + export const cacheDirectory: string | null; + export const documentDirectory: string | null; + export const bundleDirectory: string | null; + + export function readDirectoryAsync(uri: string): Promise; + export function getInfoAsync( + uri: string, + options?: { size?: boolean; md5?: boolean } + ): Promise; + export function readAsStringAsync( + uri: string, + options?: { encoding?: "base64" | "utf8" } + ): Promise; +} + +declare module "react-native-fs" { + export type ReadDirItem = { + name: string; + path: string; + size: number; + mtime?: Date; + isFile: () => boolean; + isDirectory: () => boolean; + }; + + export const MainBundlePath: string | undefined; + export const CachesDirectoryPath: string; + export const DocumentDirectoryPath: string; + export const TemporaryDirectoryPath: string; + export const LibraryDirectoryPath: string; + + export function readDir(path: string): Promise; + export function stat(path: string): Promise<{ + size: number; + mtime?: Date; + isFile: () => boolean; + isDirectory: () => boolean; + }>; + export function readFile( + path: string, + encoding: "base64" | "utf8" + ): Promise; +} + +declare module "@birdofpreyru/react-native-fs" { + export * from "react-native-fs"; +} diff --git a/packages/file-system-plugin/src/shared/path.ts b/packages/file-system-plugin/src/shared/path.ts new file mode 100644 index 00000000..89581db7 --- /dev/null +++ b/packages/file-system-plugin/src/shared/path.ts @@ -0,0 +1,88 @@ +/** + * Path helpers that work with: + * - Bare RN paths: `/data/user/0/...` + * - Expo FileSystem URIs: `file:///data/user/0/...` + */ + +export function normalizeDirPath(path: string): string { + if (!path) return path; + // Keep "file://" URIs intact; just ensure directories end with a trailing slash + const isFileUri = path.startsWith("file://"); + if (isFileUri) { + return path.endsWith("/") ? path : `${path}/`; + } + return path.endsWith("/") ? path : `${path}/`; +} + +export function joinPath(dir: string, name: string): string { + if (!dir) return name; + if (!name) return dir; + const d = dir.endsWith("/") ? dir : `${dir}/`; + return `${d}${name}`; +} + +export function parentPath(path: string): string | null { + if (!path) return null; + const normalized = path.endsWith("/") ? path.slice(0, -1) : path; + const idx = normalized.lastIndexOf("/"); + if (idx <= 0) { + // `file:///` or `/` + if (normalized.startsWith("file://")) return "file:///"; + return "/"; + } + return normalized.slice(0, idx + 1); +} + +export function isLikelyImageFile(nameOrPath: string): boolean { + const lower = nameOrPath.toLowerCase(); + return ( + lower.endsWith(".png") || + lower.endsWith(".jpg") || + lower.endsWith(".jpeg") || + lower.endsWith(".gif") || + lower.endsWith(".webp") || + lower.endsWith(".heic") || + lower.endsWith(".heif") + ); +} + +export function isJsonFile(nameOrPath: string): boolean { + return nameOrPath.toLowerCase().endsWith(".json"); +} + +export function isLikelyTextFile(nameOrPath: string): boolean { + const lower = nameOrPath.toLowerCase(); + return ( + lower.endsWith(".txt") || + lower.endsWith(".json") || + lower.endsWith(".xml") || + lower.endsWith(".log") || + lower.endsWith(".md") || + lower.endsWith(".yaml") || + lower.endsWith(".yml") || + lower.endsWith(".csv") || + lower.endsWith(".html") || + lower.endsWith(".css") || + lower.endsWith(".js") || + lower.endsWith(".ts") || + lower.endsWith(".jsx") || + lower.endsWith(".tsx") || + lower.endsWith(".sh") || + lower.endsWith(".env") || + lower.endsWith(".gitignore") || + lower.endsWith(".config") || + lower.endsWith(".ini") || + lower.endsWith(".plist") + ); +} + +export function mimeTypeFromName(nameOrPath: string): string | null { + const lower = nameOrPath.toLowerCase(); + if (lower.endsWith(".png")) return "image/png"; + if (lower.endsWith(".jpg") || lower.endsWith(".jpeg")) return "image/jpeg"; + if (lower.endsWith(".gif")) return "image/gif"; + if (lower.endsWith(".webp")) return "image/webp"; + if (lower.endsWith(".heic")) return "image/heic"; + if (lower.endsWith(".heif")) return "image/heif"; + return null; +} diff --git a/packages/file-system-plugin/src/shared/protocol.ts b/packages/file-system-plugin/src/shared/protocol.ts new file mode 100644 index 00000000..1d57cbdd --- /dev/null +++ b/packages/file-system-plugin/src/shared/protocol.ts @@ -0,0 +1,64 @@ +export const PLUGIN_ID = "file-system"; + +export type FileSystemProvider = "expo" | "rnfs" | "none"; + +export type FsEntry = { + name: string; + path: string; + isDirectory: boolean; + size?: number | null; + modifiedAtMs?: number | null; + mimeTypeHint?: string | null; +}; + +export type FsRoots = { + provider: FileSystemProvider; + roots: Array<{ + id: string; + label: string; + path: string; + }>; +}; + +export type FileSystemEventMap = { + // Sent by RN side when it initializes/reconnects - panel should re-fetch data + "fs:ready": { timestamp: number }; + + "fs:get-roots": { requestId: string }; + "fs:get-roots:result": { requestId: string } & FsRoots & { error?: string }; + + "fs:list": { requestId: string; path: string }; + "fs:list:result": { + requestId: string; + provider: FileSystemProvider; + path: string; + entries: FsEntry[]; + error?: string; + }; + + "fs:read-image": { + requestId: string; + path: string; + maxBytes?: number; + }; + "fs:read-image:result": { + requestId: string; + provider: FileSystemProvider; + path: string; + dataUri?: string; + error?: string; + }; + + "fs:read-file": { + requestId: string; + path: string; + maxBytes?: number; + }; + "fs:read-file:result": { + requestId: string; + provider: FileSystemProvider; + path: string; + content?: string; + error?: string; + }; +}; diff --git a/packages/file-system-plugin/tailwind.config.ts b/packages/file-system-plugin/tailwind.config.ts new file mode 100644 index 00000000..d756b75a --- /dev/null +++ b/packages/file-system-plugin/tailwind.config.ts @@ -0,0 +1,94 @@ +import type { Config } from 'tailwindcss'; + +const config: Config = { + darkMode: ['class'], + content: ['./src/ui/**/*.{js,ts,jsx,tsx,mdx}'], + theme: { + extend: { + translate: { + '0.75': '0.1875rem', + }, + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))', + }, + sidebar: { + DEFAULT: 'hsl(var(--sidebar-background))', + foreground: 'hsl(var(--sidebar-foreground))', + primary: 'hsl(var(--sidebar-primary))', + 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', + accent: 'hsl(var(--sidebar-accent))', + 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', + border: 'hsl(var(--sidebar-border))', + ring: 'hsl(var(--sidebar-ring))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { + height: '0', + }, + to: { + height: 'var(--radix-accordion-content-height)', + }, + }, + 'accordion-up': { + from: { + height: 'var(--radix-accordion-content-height)', + }, + to: { + height: '0', + }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [require('tailwindcss-animate')], +}; +export default config; diff --git a/packages/file-system-plugin/tsconfig.json b/packages/file-system-plugin/tsconfig.json new file mode 100644 index 00000000..a9ea94bd --- /dev/null +++ b/packages/file-system-plugin/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "ESNext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src/**/*", "react-native.ts", "rozenite.config.ts"], + "exclude": ["node_modules", "dist", "build"], + "references": [ + { + "path": "../plugin-bridge" + }, + { + "path": "../cli" + }, + { + "path": "../vite-plugin" + } + ] +} diff --git a/packages/file-system-plugin/vite.config.ts b/packages/file-system-plugin/vite.config.ts new file mode 100644 index 00000000..7db548c7 --- /dev/null +++ b/packages/file-system-plugin/vite.config.ts @@ -0,0 +1,20 @@ +/// +import { defineConfig } from 'vite'; +import { rozenitePlugin } from '@rozenite/vite-plugin'; + +export default defineConfig({ + root: __dirname, + plugins: [rozenitePlugin()], + base: './', + build: { + outDir: './dist', + emptyOutDir: false, + reportCompressedSize: false, + minify: true, + sourcemap: false, + }, + server: { + port: 3000, + open: true, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b009c259..8909b4ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,6 +178,9 @@ importers: apps/playground: dependencies: + '@dr.pogodin/react-native-fs': + specifier: ^2.36.2 + version: 2.36.2(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) '@react-navigation/bottom-tabs': specifier: ^7.4.7 version: 7.4.7(@react-navigation/native@7.1.14(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-safe-area-context@5.5.2(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-screens@4.4.0(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) @@ -196,6 +199,9 @@ importers: '@rozenite/expo-atlas-plugin': specifier: workspace:* version: link:../../packages/expo-atlas-plugin + '@rozenite/file-system-plugin': + specifier: workspace:* + version: link:../../packages/file-system-plugin '@rozenite/mmkv-plugin': specifier: workspace:* version: link:../../packages/mmkv-plugin @@ -353,6 +359,55 @@ importers: specifier: ^6.0.0 version: 6.3.5(@types/node@22.17.0)(jiti@2.6.1)(terser@5.43.1)(yaml@2.8.1) + packages/file-system-plugin: + dependencies: + '@rozenite/plugin-bridge': + specifier: workspace:* + version: link:../plugin-bridge + devDependencies: + '@rozenite/vite-plugin': + specifier: workspace:* + version: link:../vite-plugin + '@types/react': + specifier: ~18.3.12 + version: 18.3.23 + autoprefixer: + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.6) + lucide-react: + specifier: ^0.263.1 + version: 0.263.1(react@18.3.1) + postcss: + specifier: ^8.5.6 + version: 8.5.6 + react: + specifier: 18.3.1 + version: 18.3.1 + react-dom: + specifier: 18.3.0 + version: 18.3.0(react@18.3.1) + react-native: + specifier: 0.76.0 + version: 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1) + react-native-web: + specifier: 0.21.0 + version: 0.21.0(encoding@0.1.13)(react-dom@18.3.0(react@18.3.1))(react@18.3.1) + rozenite: + specifier: workspace:* + version: link:../cli + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + typescript: + specifier: ^5.7.3 + version: 5.8.3 + vite: + specifier: ^6.0.0 + version: 6.3.5(@types/node@22.17.0)(jiti@2.6.1)(terser@5.43.1)(yaml@2.8.1) + packages/metro: dependencies: '@rozenite/middleware': @@ -481,31 +536,31 @@ importers: devDependencies: '@floating-ui/react': specifier: ^0.26.0 - version: 0.26.28(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.15 - version: 2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': specifier: ^1.2.9 - version: 1.2.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 1.2.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.1.7 - version: 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.2.3 version: 1.2.3(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-tabs': specifier: ^1.1.12 - version: 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@rozenite/vite-plugin': specifier: workspace:* version: link:../vite-plugin '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': specifier: ^3.0.0 - version: 3.13.12(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + version: 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': specifier: ~18.3.23 version: 18.3.23 @@ -813,7 +868,7 @@ importers: devDependencies: '@callstack/repack': specifier: ^5.2 - version: 5.2.0(@babel/core@7.28.0)(@module-federation/enhanced@0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))))(@rspack/core@1.5.8(@swc/helpers@0.5.17))(@swc/core@1.5.29(@swc/helpers@0.5.17))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1))(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))) + version: 5.2.0(@babel/core@7.28.0)(@module-federation/enhanced@0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))))(@rspack/core@1.5.8(@swc/helpers@0.5.17))(@swc/core@1.5.29(@swc/helpers@0.5.17))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))) '@types/semver': specifier: ^7.7.0 version: 7.7.0 @@ -1024,7 +1079,7 @@ packages: '@apollo/server@4.12.2': resolution: {integrity: sha512-jKRlf+sBMMdKYrjMoiWKne42Eb6paBfDOr08KJnUaeaiyWFj+/040FjVPQI7YGLfdwnYIsl1NUUqS2UdgezJDg==} engines: {node: '>=14.16.0'} - deprecated: Apollo Server v4 is deprecated and will transition to end-of-life on January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v5 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details. + deprecated: Apollo Server v4 is end-of-life since January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v5 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details. peerDependencies: graphql: ^16.6.0 @@ -1991,6 +2046,12 @@ packages: peerDependencies: react: '>=16.8.0' + '@dr.pogodin/react-native-fs@2.36.2': + resolution: {integrity: sha512-n3V3G7L7BNbKC2bUfRLIdT0H283Q8SxsKhly+5BrCdVDtdgem2XJxYOBjClUuJSpDN6zivjTkHIrj/LUMJ4WDQ==} + peerDependencies: + react: '*' + react-native: 0.76.0 + '@electron/get@2.0.3': resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} @@ -3626,8 +3687,6 @@ packages: '@react-native/babel-preset@0.76.0': resolution: {integrity: sha512-HgQt4MyuWLcnrIglXn7GNPPVwtzZ4ffX+SUisdhmPtJCHuP8AOU3HsgOKLhqVfEGWTBlE4kbWoTmmLU87IJaOw==} engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' '@react-native/babel-preset@0.76.9': resolution: {integrity: sha512-TbSeCplCM6WhL3hR2MjC/E1a9cRnMLz7i767T7mP90oWkklEjyPxWl+0GGoVGnJ8FC/jLUupg/HvREKjjif6lw==} @@ -3679,8 +3738,6 @@ packages: '@react-native/metro-babel-transformer@0.76.0': resolution: {integrity: sha512-aq0MrjaOxDitSqQbttBcOt+5tjemCabhEX2gGthy8cNeZokBa2raoHQInDo9iBBN1ePKDCwKGypyC8zKA5dksQ==} engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' '@react-native/metro-babel-transformer@0.76.9': resolution: {integrity: sha512-HGq11347UHNiO/NvVbAO35hQCmH8YZRs7in7nVq7SL99pnpZK4WXwLdAXmSuwz5uYqOuwnKYDlpadz8fkE94Mg==} @@ -5558,6 +5615,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -7139,15 +7199,16 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.1.4: resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -7363,6 +7424,9 @@ packages: engines: {node: '>=12'} hasBin: true + http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} @@ -11125,6 +11189,7 @@ packages: whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -12449,7 +12514,7 @@ snapshots: - supports-color - utf-8-validate - '@callstack/repack@5.2.0(@babel/core@7.28.0)(@module-federation/enhanced@0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))))(@rspack/core@1.5.8(@swc/helpers@0.5.17))(@swc/core@1.5.29(@swc/helpers@0.5.17))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1))(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17)))': + '@callstack/repack@5.2.0(@babel/core@7.28.0)(@module-federation/enhanced@0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))))(@rspack/core@1.5.8(@swc/helpers@0.5.17))(@swc/core@1.5.29(@swc/helpers@0.5.17))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17)))': dependencies: '@callstack/repack-dev-server': 5.2.0 '@discoveryjs/json-ext': 0.5.7 @@ -12468,7 +12533,7 @@ snapshots: memfs: 4.24.0 mime-types: 2.1.35 pretty-format: 26.6.2 - react-native: 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1) + react-native: 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1) react-refresh: 0.14.2 schema-utils: 4.3.2 semver: 7.7.2 @@ -12478,7 +12543,7 @@ snapshots: throttleit: 2.1.0 webpack-merge: 6.0.1 optionalDependencies: - '@module-federation/enhanced': 0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))) + '@module-federation/enhanced': 0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17))) '@rspack/core': 1.5.8(@swc/helpers@0.5.17) webpack: 5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17)) transitivePeerDependencies: @@ -12692,6 +12757,13 @@ snapshots: react: 18.3.1 tslib: 2.8.1 + '@dr.pogodin/react-native-fs@2.36.2(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)': + dependencies: + buffer: 6.0.3 + http-status-codes: 2.3.0 + react: 18.3.1 + react-native: 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1) + '@electron/get@2.0.3': dependencies: debug: 4.4.1(supports-color@5.5.0) @@ -12985,18 +13057,18 @@ snapshots: react: 18.3.1 react-dom: 18.3.0(react@18.3.1) - '@floating-ui/react-dom@2.1.4(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/dom': 1.7.2 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) - '@floating-ui/react@0.26.28(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 2.1.4(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@floating-ui/utils': 0.2.10 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) tabbable: 6.2.0 '@floating-ui/utils@0.2.10': {} @@ -13397,15 +13469,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@module-federation/data-prefetch@0.20.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@module-federation/runtime': 0.20.0 - '@module-federation/sdk': 0.20.0 - fs-extra: 9.1.0 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - optional: true - '@module-federation/data-prefetch@0.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@module-federation/runtime': 0.9.1 @@ -13492,35 +13555,6 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17)))': - dependencies: - '@module-federation/bridge-react-webpack-plugin': 0.20.0 - '@module-federation/cli': 0.20.0(typescript@5.8.3) - '@module-federation/data-prefetch': 0.20.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@module-federation/dts-plugin': 0.20.0(typescript@5.8.3) - '@module-federation/error-codes': 0.20.0 - '@module-federation/inject-external-runtime-core-plugin': 0.20.0(@module-federation/runtime-tools@0.20.0) - '@module-federation/managers': 0.20.0 - '@module-federation/manifest': 0.20.0(typescript@5.8.3) - '@module-federation/rspack': 0.20.0(@rspack/core@1.5.8(@swc/helpers@0.5.17))(typescript@5.8.3) - '@module-federation/runtime-tools': 0.20.0 - '@module-federation/sdk': 0.20.0 - btoa: 1.2.1 - schema-utils: 4.3.2 - upath: 2.0.1 - optionalDependencies: - typescript: 5.8.3 - webpack: 5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17)) - transitivePeerDependencies: - - '@rspack/core' - - bufferutil - - debug - - react - - react-dom - - supports-color - - utf-8-validate - optional: true - '@module-federation/enhanced@0.9.1(@rspack/core@1.5.8(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.5.29(@swc/helpers@0.5.17)))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 @@ -14201,11 +14235,11 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14276,14 +14310,14 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14355,15 +14389,15 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14383,17 +14417,17 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-menu': 2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-menu': 2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14415,13 +14449,13 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14503,27 +14537,27 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-menu@2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1) aria-hidden: 1.2.6 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.7.1(@types/react@18.3.23)(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 @@ -14646,20 +14680,20 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-popper@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 2.1.4(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/rect': 1.1.1 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14674,12 +14708,12 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14694,12 +14728,12 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14713,11 +14747,11 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14767,19 +14801,19 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14801,19 +14835,19 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-scroll-area@1.2.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.2.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14856,11 +14890,11 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-separator@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -14922,18 +14956,18 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-tabs@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.1.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1) react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) @@ -15250,7 +15284,7 @@ snapshots: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))': + '@react-native/babel-preset@0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.0) @@ -15380,10 +15414,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(encoding@0.1.13)': + '@react-native/community-cli-plugin@0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(encoding@0.1.13)': dependencies: '@react-native/dev-middleware': 0.76.0 - '@react-native/metro-babel-transformer': 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0)) + '@react-native/metro-babel-transformer': 0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0)) chalk: 4.1.2 execa: 5.1.1 invariant: 2.2.4 @@ -15395,7 +15429,6 @@ snapshots: optionalDependencies: '@react-native-community/cli-server-api': 15.0.1 transitivePeerDependencies: - - '@babel/core' - '@babel/preset-env' - bufferutil - encoding @@ -15428,10 +15461,10 @@ snapshots: '@react-native/js-polyfills@0.76.9': {} - '@react-native/metro-babel-transformer@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))': + '@react-native/metro-babel-transformer@0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0))': dependencies: '@babel/core': 7.28.0 - '@react-native/babel-preset': 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0)) + '@react-native/babel-preset': 0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0)) hermes-parser: 0.23.1 nullthrows: 1.1.1 transitivePeerDependencies: @@ -15457,7 +15490,9 @@ snapshots: transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' + - bufferutil - supports-color + - utf-8-validate '@react-native/normalize-colors@0.74.89': {} @@ -15472,15 +15507,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.23 - '@react-native/virtualized-lists@0.76.0(@types/react@18.3.23)(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1))(react@19.1.1)': - dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react: 19.1.1 - react-native: 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1) - optionalDependencies: - '@types/react': 18.3.23 - '@react-navigation/bottom-tabs@7.4.7(@react-navigation/native@7.1.14(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-safe-area-context@5.5.2(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-screens@4.4.0(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)': dependencies: '@react-navigation/elements': 2.6.4(@react-navigation/native@7.1.14(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-safe-area-context@5.5.2(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) @@ -16682,17 +16708,17 @@ snapshots: react: 18.3.1 react-dom: 18.3.0(react@18.3.1) - '@tanstack/react-table@8.21.3(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/table-core': 8.21.3 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-virtual@3.13.12(react-dom@19.1.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.13.12 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) '@tanstack/table-core@8.21.3': {} @@ -17964,6 +17990,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 @@ -20058,6 +20089,8 @@ snapshots: - debug - supports-color + http-status-codes@2.3.0: {} + http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 @@ -23091,11 +23124,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-dom@19.1.1(react@18.3.1): - dependencies: - react: 18.3.1 - scheduler: 0.26.0 - react-dom@19.1.1(react@19.1.1): dependencies: react: 19.1.1 @@ -23234,7 +23262,7 @@ snapshots: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.76.0 '@react-native/codegen': 0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0)) - '@react-native/community-cli-plugin': 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(encoding@0.1.13) + '@react-native/community-cli-plugin': 0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(encoding@0.1.13) '@react-native/gradle-plugin': 0.76.0 '@react-native/js-polyfills': 0.76.0 '@react-native/normalize-colors': 0.76.0 @@ -23281,58 +23309,6 @@ snapshots: - supports-color - utf-8-validate - react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1): - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native/assets-registry': 0.76.0 - '@react-native/codegen': 0.76.0(@babel/preset-env@7.28.3(@babel/core@7.28.0)) - '@react-native/community-cli-plugin': 0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(encoding@0.1.13) - '@react-native/gradle-plugin': 0.76.0 - '@react-native/js-polyfills': 0.76.0 - '@react-native/normalize-colors': 0.76.0 - '@react-native/virtualized-lists': 0.76.0(@types/react@18.3.23)(react-native@0.76.0(@babel/core@7.28.0)(@babel/preset-env@7.28.3(@babel/core@7.28.0))(@react-native-community/cli-server-api@15.0.1)(@types/react@18.3.23)(encoding@0.1.13)(react@19.1.1))(react@19.1.1) - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.28.0) - babel-plugin-syntax-hermes-parser: 0.23.1 - base64-js: 1.5.1 - chalk: 4.1.2 - commander: 12.1.0 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.6 - glob: 7.2.3 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.81.5 - metro-source-map: 0.81.5 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 29.7.0 - promise: 8.3.0 - react: 19.1.1 - react-devtools-core: 5.3.2 - react-refresh: 0.14.2 - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - semver: 7.7.2 - stacktrace-parser: 0.1.11 - whatwg-fetch: 3.6.20 - ws: 6.2.3 - yargs: 17.7.2 - optionalDependencies: - '@types/react': 18.3.23 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - '@react-native-community/cli-server-api' - - bufferutil - - encoding - - supports-color - - utf-8-validate - react-redux@9.2.0(@types/react@18.3.23)(react@18.3.1)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 From 563c2d94220a08032f7f7f699aec52325be0f176 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Mon, 9 Feb 2026 14:07:38 +0000 Subject: [PATCH 2/4] fix(playground): landing page content out of the viewport --- .../src/app/screens/LandingScreen.tsx | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/playground/src/app/screens/LandingScreen.tsx b/apps/playground/src/app/screens/LandingScreen.tsx index a965f375..461a430f 100644 --- a/apps/playground/src/app/screens/LandingScreen.tsx +++ b/apps/playground/src/app/screens/LandingScreen.tsx @@ -4,17 +4,26 @@ import { StyleSheet, TouchableOpacity, Dimensions, + ScrollView, } from 'react-native'; import { useNavigation } from '@react-navigation/native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; const { width } = Dimensions.get('window'); export const LandingScreen = () => { const navigation = useNavigation(); + const insets = useSafeAreaInsets(); return ( - + Rozenite @@ -87,9 +96,8 @@ export const LandingScreen = () => { communication between DevTools and React Native - - - + + ); }; @@ -101,9 +109,11 @@ const styles = StyleSheet.create({ backgroundGradient: { flex: 1, backgroundColor: '#0a0a0a', + }, + scrollContent: { + flexGrow: 1, justifyContent: 'center', alignItems: 'center', - position: 'relative', }, content: { alignItems: 'center', From 8d96f28442fcdf4ecf86f883d778e157650c4870 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Mon, 9 Feb 2026 14:27:07 +0000 Subject: [PATCH 3/4] chore: manual cleanup --- packages/file-system-plugin/react-native.ts | 22 ++++++------------- .../file-system-plugin/src/file-system.tsx | 1 - 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/packages/file-system-plugin/react-native.ts b/packages/file-system-plugin/react-native.ts index 87d7dfae..c0684c28 100644 --- a/packages/file-system-plugin/react-native.ts +++ b/packages/file-system-plugin/react-native.ts @@ -9,10 +9,7 @@ */ import { useEffect, useRef } from 'react'; -import { - useRozeniteDevToolsClient, - type RozeniteDevToolsClient, -} from '@rozenite/plugin-bridge'; +import { useRozeniteDevToolsClient } from '@rozenite/plugin-bridge'; import type { FileSystemEventMap, FileSystemProvider, @@ -44,13 +41,12 @@ type ProviderImpl = { export type UseFileSystemDevToolsOptions = { /** - * Pass Expo FileSystem module from the app (recommended, MMKV-style). - * This avoids any Metro/module-resolution edge cases inside the plugin bundle. + * Pass Expo FileSystem module from the host app. */ expoFileSystem?: any; /** - * Pass RNFS module from the app (recommended for bare RN). - * Supports `react-native-fs` or `@birdofpreyru/react-native-fs` (same surface). + * Pass RNFS module from the host app. + * Supports `react-native-fs` or `@dr.pogodin/react-native-fs` (same surface). */ rnfs?: any; }; @@ -58,7 +54,6 @@ export type UseFileSystemDevToolsOptions = { async function detectProvider( options?: UseFileSystemDevToolsOptions, ): Promise { - // MMKV-style: rely on explicit modules passed from the app. if (!options?.expoFileSystem && !options?.rnfs) return null; if (options?.expoFileSystem) { @@ -177,7 +172,7 @@ async function detectProvider( return expo; } - const RNFS = options!.rnfs; + const RNFS = options.rnfs; const rnfs: ProviderImpl = { provider: 'rnfs', async getRoots() { @@ -280,7 +275,7 @@ function resolveExpoChildPath(dirUri: string, item: string): string { function basename(pathOrUri: string): string { if (!pathOrUri) return ''; // Strip query/hash for safety - const clean = pathOrUri.split('?')[0]!.split('#')[0]!; + const clean = pathOrUri.split('?')[0].split('#')[0]; const noTrailing = clean.endsWith('/') ? clean.slice(0, -1) : clean; const idx = noTrailing.lastIndexOf('/'); return idx >= 0 ? noTrailing.slice(idx + 1) : noTrailing; @@ -297,7 +292,7 @@ async function mapWithConcurrency( const runners = new Array(Math.max(1, concurrency)).fill(0).map(async () => { while (idx < items.length) { const current = idx++; - results[current] = await worker(items[current]!); + results[current] = await worker(items[current]); } }); @@ -523,6 +518,3 @@ export const useFileSystemDevTools = ( }; }, [client]); }; - -// Backwards-compatible with the Rozenite template naming -export const useDevTools = useFileSystemDevTools; diff --git a/packages/file-system-plugin/src/file-system.tsx b/packages/file-system-plugin/src/file-system.tsx index f3861d74..26fefb44 100644 --- a/packages/file-system-plugin/src/file-system.tsx +++ b/packages/file-system-plugin/src/file-system.tsx @@ -264,7 +264,6 @@ export default function FileSystemPanel() { if (!client) return; if (!currentPath) return; loadDir(currentPath); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [client, currentPath]); // Handle RN app ready/reconnect - re-fetch data when RN side (re)initializes From 69287aeb75289eda1f0eb6a479f2a6513494739f Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Mon, 9 Feb 2026 14:55:53 +0000 Subject: [PATCH 4/4] fix(file-system-plugin): refactor to best practices using skills --- packages/file-system-plugin/react-native.ts | 10 - .../file-system-plugin/src/file-system.tsx | 1234 +---------------- packages/file-system-plugin/src/formatters.ts | 115 ++ .../src/shared/optional-modules.d.ts | 17 +- packages/file-system-plugin/src/types.ts | 6 + .../src/ui/ConnectingScreen.tsx | 36 + .../file-system-plugin/src/ui/DetailLine.tsx | 37 + .../file-system-plugin/src/ui/DetailPanel.tsx | 269 ++++ .../src/ui/FileEntryRow.tsx | 86 ++ .../file-system-plugin/src/ui/PathDisplay.tsx | 162 +++ packages/file-system-plugin/src/ui/TopBar.tsx | 244 ++++ .../src/use-file-system-navigation.ts | 156 +++ .../src/use-file-system-requests.ts | 131 ++ packages/file-system-plugin/src/utils.ts | 62 + 14 files changed, 1371 insertions(+), 1194 deletions(-) create mode 100644 packages/file-system-plugin/src/formatters.ts create mode 100644 packages/file-system-plugin/src/types.ts create mode 100644 packages/file-system-plugin/src/ui/ConnectingScreen.tsx create mode 100644 packages/file-system-plugin/src/ui/DetailLine.tsx create mode 100644 packages/file-system-plugin/src/ui/DetailPanel.tsx create mode 100644 packages/file-system-plugin/src/ui/FileEntryRow.tsx create mode 100644 packages/file-system-plugin/src/ui/PathDisplay.tsx create mode 100644 packages/file-system-plugin/src/ui/TopBar.tsx create mode 100644 packages/file-system-plugin/src/use-file-system-navigation.ts create mode 100644 packages/file-system-plugin/src/use-file-system-requests.ts create mode 100644 packages/file-system-plugin/src/utils.ts diff --git a/packages/file-system-plugin/react-native.ts b/packages/file-system-plugin/react-native.ts index c0684c28..e55b933b 100644 --- a/packages/file-system-plugin/react-native.ts +++ b/packages/file-system-plugin/react-native.ts @@ -1,13 +1,3 @@ -/** - * React Native DevTools Plugin Entry Point - * - * This file serves as the main entry point for your DevTools plugin in the React Native environment. - * You have full access to all React Native APIs and can integrate with your app's functionality. - * - * To communicate with the DevTools panel, use the `@rozenite/plugin-bridge` package - * which provides a reliable communication channel between your plugin and the DevTools interface. - */ - import { useEffect, useRef } from 'react'; import { useRozeniteDevToolsClient } from '@rozenite/plugin-bridge'; import type { diff --git a/packages/file-system-plugin/src/file-system.tsx b/packages/file-system-plugin/src/file-system.tsx index 26fefb44..da33721d 100644 --- a/packages/file-system-plugin/src/file-system.tsx +++ b/packages/file-system-plugin/src/file-system.tsx @@ -1,1023 +1,123 @@ -import React, { - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { ActivityIndicator, FlatList, - Image, - Pressable, - type PressableStateCallbackType, SafeAreaView, - ScrollView, StyleSheet, Text, - TextInput, View, } from 'react-native'; - -// Extended pressable state for react-native-web (includes hover) -type WebPressableState = PressableStateCallbackType & { hovered?: boolean }; import { useRozeniteDevToolsClient } from '@rozenite/plugin-bridge'; -import type { - FileSystemEventMap, - FileSystemProvider, - FsEntry, - FsRoots, -} from './shared/protocol'; +import type { FileSystemEventMap, FsEntry } from './shared/protocol'; import { PLUGIN_ID } from './shared/protocol'; -import { isLikelyImageFile, isLikelyTextFile, parentPath } from './shared/path'; - -function newRequestId(): string { - return `${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`; -} - -function formatBytes(bytes?: number | null): string { - if (bytes == null) return '—'; - if (bytes < 1024) return `${bytes} B`; - const kb = bytes / 1024; - if (kb < 1024) return `${kb.toFixed(1)} KB`; - const mb = kb / 1024; - if (mb < 1024) return `${mb.toFixed(1)} MB`; - const gb = mb / 1024; - return `${gb.toFixed(1)} GB`; -} - -function formatDate(ms?: number | null): string { - if (!ms) return '—'; - try { - return new Date(ms).toLocaleString(); - } catch { - return '—'; - } -} - -type PendingResolvers = { - roots: Map< - string, - (payload: FileSystemEventMap['fs:get-roots:result']) => void - >; - list: Map void>; - image: Map< - string, - (payload: FileSystemEventMap['fs:read-image:result']) => void - >; - file: Map< - string, - (payload: FileSystemEventMap['fs:read-file:result']) => void - >; -}; +import { useFileSystemRequests } from './use-file-system-requests'; +import { useFileSystemNavigation } from './use-file-system-navigation'; +import { ConnectingScreen } from './ui/ConnectingScreen'; +import { TopBar } from './ui/TopBar'; +import { FileEntryRow } from './ui/FileEntryRow'; +import { DetailPanel } from './ui/DetailPanel'; +import { PathDisplay } from './ui/PathDisplay'; export default function FileSystemPanel() { const client = useRozeniteDevToolsClient({ pluginId: PLUGIN_ID, }); - const pendingRef = useRef({ - roots: new Map(), - list: new Map(), - image: new Map(), - file: new Map(), - }); - - const [provider, setProvider] = useState('none'); - const [roots, setRoots] = useState([]); - const [pathInput, setPathInput] = useState(''); - const [currentPath, setCurrentPath] = useState(''); - - const [entries, setEntries] = useState([]); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); + const requests = useFileSystemRequests(client); + const nav = useFileSystemNavigation(client, requests); const [selected, setSelected] = useState(null); - const [imagePreviewUri, setImagePreviewUri] = useState(null); - const [imagePreviewError, setImagePreviewError] = useState( - null, - ); - const [imagePreviewLoading, setImagePreviewLoading] = useState(false); - - const [textPreview, setTextPreview] = useState(null); - const [textPreviewError, setTextPreviewError] = useState(null); - const [textPreviewLoading, setTextPreviewLoading] = useState(false); + // Clear selection when the directory changes (preserves original loadDir behavior) useEffect(() => { - if (!client) return; - - const subRoots = client.onMessage('fs:get-roots:result', (payload) => { - const resolve = pendingRef.current.roots.get(payload.requestId); - if (resolve) { - pendingRef.current.roots.delete(payload.requestId); - resolve(payload); - } - }); - - const subList = client.onMessage('fs:list:result', (payload) => { - const resolve = pendingRef.current.list.get(payload.requestId); - if (resolve) { - pendingRef.current.list.delete(payload.requestId); - resolve(payload); - } - }); - - const subImage = client.onMessage('fs:read-image:result', (payload) => { - const resolve = pendingRef.current.image.get(payload.requestId); - if (resolve) { - pendingRef.current.image.delete(payload.requestId); - resolve(payload); - } - }); - - const subFile = client.onMessage('fs:read-file:result', (payload) => { - const resolve = pendingRef.current.file.get(payload.requestId); - if (resolve) { - pendingRef.current.file.delete(payload.requestId); - resolve(payload); - } - }); - - return () => { - subRoots.remove(); - subList.remove(); - subImage.remove(); - subFile.remove(); - }; - }, [client]); - - const requestRoots = useCallback(async () => { - if (!client) return null; - const requestId = newRequestId(); - const p = new Promise( - (resolve) => { - pendingRef.current.roots.set(requestId, resolve); - }, - ); - client.send('fs:get-roots', { requestId }); - return await withTimeout(p, 8000, 'Timeout fetching roots'); - }, [client]); - - const requestList = useCallback( - async (path: string) => { - if (!client) return null; - const requestId = newRequestId(); - const p = new Promise((resolve) => { - pendingRef.current.list.set(requestId, resolve); - }); - client.send('fs:list', { requestId, path }); - return await withTimeout(p, 15000, 'Timeout listing directory'); - }, - [client], - ); - - const requestImagePreview = useCallback( - async (path: string, maxBytes = 10_000_000) => { - if (!client) return null; - const requestId = newRequestId(); - const p = new Promise( - (resolve) => { - pendingRef.current.image.set(requestId, resolve); - }, - ); - client.send('fs:read-image', { requestId, path, maxBytes }); - return await withTimeout(p, 15000, 'Timeout reading image'); - }, - [client], - ); - - const requestTextPreview = useCallback( - async (path: string, maxBytes = 10_000_000) => { - if (!client) return null; - const requestId = newRequestId(); - const p = new Promise( - (resolve) => { - pendingRef.current.file.set(requestId, resolve); - }, - ); - client.send('fs:read-file', { requestId, path, maxBytes }); - return await withTimeout(p, 15000, 'Timeout reading file'); - }, - [client], - ); - - const loadRootsAndMaybeInit = useCallback(async () => { - setError(null); - const res = await requestRoots(); - if (!res) return; - setProvider(res.provider); - if (res.error) { - setRoots([]); - setError(res.error); - return; - } - setRoots(res.roots); - - // Initialize path to first root only once - if (!currentPath && res.roots.length > 0) { - const first = res.roots[0]!.path; - setPathInput(first); - setCurrentPath(first); - } - }, [currentPath, requestRoots]); - - useEffect(() => { - if (!client) return; - loadRootsAndMaybeInit(); - }, [client, loadRootsAndMaybeInit]); - - const loadDir = useCallback( - async (path: string) => { - setLoading(true); - setError(null); - setSelected(null); - setImagePreviewUri(null); - setImagePreviewError(null); - setImagePreviewLoading(false); - setTextPreview(null); - setTextPreviewError(null); - setTextPreviewLoading(false); - - try { - const res = await requestList(path); - if (!res) return; - setProvider(res.provider); - setCurrentPath(res.path); - setPathInput(res.path); - if (res.error) { - setEntries([]); - setError(res.error); - return; - } - setEntries(res.entries); - } catch (e) { - setEntries([]); - setError(e instanceof Error ? e.message : String(e)); - } finally { - setLoading(false); - } - }, - [requestList], - ); - - useEffect(() => { - if (!client) return; - if (!currentPath) return; - loadDir(currentPath); - }, [client, currentPath]); - - // Handle RN app ready/reconnect - re-fetch data when RN side (re)initializes - useEffect(() => { - if (!client) return; - - const subReady = client.onMessage('fs:ready', async () => { - // Reset UI state on reconnect - setProvider('none'); - setRoots([]); - setEntries([]); - setSelected(null); - setImagePreviewUri(null); - setTextPreview(null); - setError(null); - - // Re-fetch roots - await loadRootsAndMaybeInit(); - - // If user was in a directory, reload it - if (currentPath) { - loadDir(currentPath); - } - }); - - return () => { - subReady.remove(); - }; - }, [client, currentPath, loadDir, loadRootsAndMaybeInit]); - - const onGo = useCallback(() => { - const next = pathInput.trim(); - if (!next) return; - setCurrentPath(next); - }, [pathInput]); - - // Check if we can go back (not at or above a root path) - const canGoBack = useMemo(() => { - if (!currentPath) return false; - // If current path is one of the roots, we can't go up - const isAtRoot = roots.some((r) => r.path === currentPath); - if (isAtRoot) return false; - // Check if parent path exists and we wouldn't go above a root - const parent = parentPath(currentPath); - if (!parent) return false; - // Ensure we're still within one of the root paths - return roots.some((r) => parent.startsWith(r.path) || parent === r.path); - }, [currentPath, roots]); - - const onBack = useCallback(() => { - if (!canGoBack) return; - const p = parentPath(currentPath); - if (!p) return; - setCurrentPath(p); - }, [currentPath, canGoBack]); - - const onReload = useCallback(() => { - if (!currentPath) return; - loadDir(currentPath); - }, [currentPath, loadDir]); - - const rootChips = useMemo(() => { - return roots.map((r) => { - const isActive = r.path === currentPath; - return ( - [ - styles.chip, - state.hovered && !isActive && styles.chipHovered, - isActive ? styles.chipActive : undefined, - ]} - onPress={() => setCurrentPath(r.path)} - > - - {r.label} - - - ); - }); - }, [currentPath, roots]); + setSelected(null); + }, [nav.currentPath]); const onSelectEntry = useCallback( - async (entry: FsEntry) => { - setSelected(entry); - setImagePreviewUri(null); - setImagePreviewError(null); - setTextPreview(null); - setTextPreviewError(null); - + (entry: FsEntry) => { if (entry.isDirectory) { - setCurrentPath(entry.path); + setSelected(null); + nav.setCurrentPath(entry.path); return; } - - // Handle image preview - if (isLikelyImageFile(entry.path)) { - setImagePreviewLoading(true); - try { - const res = await requestImagePreview(entry.path); - if (!res) return; - if (res.error || !res.dataUri) { - setImagePreviewError(res.error ?? 'No preview available'); - return; - } - setImagePreviewUri(res.dataUri); - } catch (e) { - setImagePreviewError(e instanceof Error ? e.message : String(e)); - } finally { - setImagePreviewLoading(false); - } - return; - } - - // Handle text/file preview for any non-image file - setTextPreviewLoading(true); - try { - const res = await requestTextPreview(entry.path); - if (!res) return; - if (res.error || !res.content) { - setTextPreviewError(res.error ?? 'No preview available'); - return; - } - setTextPreview(res.content); - } catch (e) { - setTextPreviewError(e instanceof Error ? e.message : String(e)); - } finally { - setTextPreviewLoading(false); - } + setSelected(entry); }, - [requestImagePreview, requestTextPreview], + [nav.setCurrentPath], + ); + + const renderItem = useCallback( + ({ item }: { item: FsEntry }) => ( + + ), + [selected?.path, onSelectEntry], ); - const headerRight = useMemo(() => { - const status = - provider === 'none' - ? 'No provider' - : provider === 'expo' - ? 'Expo FileSystem' - : 'react-native-fs'; - return {status}; - }, [provider]); + const keyExtractor = useCallback((item: FsEntry) => item.path, []); if (!client) { - return ( - - - - Connecting to React Native… - - - ); + return ; } return ( - - - File System - {headerRight} - - - - - [ - styles.iconButton, - state.hovered && canGoBack && styles.iconButtonHovered, - !canGoBack ? styles.buttonDisabled : null, - ]} - onPress={onBack} - disabled={!canGoBack} - > - - - - [ - styles.iconButton, - state.hovered && !!currentPath && styles.iconButtonHovered, - !currentPath ? styles.buttonDisabled : null, - ]} - onPress={onReload} - disabled={!currentPath} - > - - - - - - - - [ - styles.primaryButton, - state.hovered && styles.primaryButtonHovered, - ]} - onPress={onGo} - > - Go - - - - {rootChips} - - + - {currentPath ? ( - + {nav.currentPath ? ( + ) : ( )} - {loading ? : null} + {nav.loading ? : null} - {error ? ( + {nav.error ? ( Error - {error} + {nav.error} ) : null} item.path} + data={nav.entries} + keyExtractor={keyExtractor} contentContainerStyle={styles.listContent} - renderItem={({ item }) => { - const isSelected = selected?.path === item.path; - return ( - onSelectEntry(item)} - style={(state: WebPressableState) => [ - styles.row, - state.hovered && !isSelected && styles.rowHovered, - isSelected ? styles.rowSelected : undefined, - ]} - > - - {item.isDirectory - ? '📁' - : isLikelyImageFile(item.path) - ? '🖼️' - : isLikelyTextFile(item.path) - ? '📝' - : '📄'} - - - - {item.name} - - - {item.isDirectory - ? 'Directory' - : `${formatBytes(item.size)} • ${formatDate( - item.modifiedAtMs, - )}`} - - - - {item.isDirectory ? '›' : ''} - - - ); - }} + renderItem={renderItem} /> - - Details - {!selected ? ( - Select a file or directory. - ) : ( - - - {selected.name} - - - - - - - - - {!selected.isDirectory && isLikelyImageFile(selected.path) ? ( - - Image preview - {imagePreviewLoading ? ( - - - - Loading preview… - - - ) : imagePreviewError ? ( - {imagePreviewError} - ) : imagePreviewUri ? ( - - ) : ( - - Tap the file again to re-fetch preview (limited size). - - )} - - ) : null} - - {!selected.isDirectory && !isLikelyImageFile(selected.path) ? ( - - File preview - {textPreviewLoading ? ( - - - - Loading preview… - - - ) : textPreviewError ? ( - {textPreviewError} - ) : textPreview ? ( - - - {formatTextPreview(textPreview)} - - - ) : ( - - Tap the file again to re-fetch preview (limited size). - - )} - - ) : null} - - )} - + ); } -function DetailLine({ label, value }: { label: string; value: string }) { - return ( - - {label} - - {value} - - - ); -} - -type CopyState = 'idle' | 'copied' | 'error'; - -// Helper to copy text to clipboard (works in web views) -function copyToClipboard(text: string): boolean { - try { - // Use the textarea fallback approach which is most reliable - const textArea = document.createElement('textarea'); - textArea.value = text; - textArea.style.position = 'fixed'; - textArea.style.top = '0'; - textArea.style.left = '-9999px'; - textArea.style.opacity = '0'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - const success = document.execCommand('copy'); - document.body.removeChild(textArea); - return success; - } catch { - return false; - } -} - -function PathDisplay({ path, label }: { path: string; label?: string }) { - const [copyState, setCopyState] = useState('idle'); - - const handleCopy = useCallback(() => { - const success = copyToClipboard(path); - if (success) { - setCopyState('copied'); - } else { - setCopyState('error'); - } - setTimeout(() => setCopyState('idle'), 2000); - }, [path]); - - const copyIcon = - copyState === 'copied' ? '✓' : copyState === 'error' ? '✕' : '⧉'; - const copyLabel = - copyState === 'copied' - ? 'Copied!' - : copyState === 'error' - ? 'Failed' - : 'Copy'; - - return ( - - {label ? {label} : null} - - - - {path} - - - - [ - styles.pathActionButton, - state.hovered && styles.pathActionButtonHovered, - copyState === 'copied' && styles.pathActionButtonSuccess, - copyState === 'error' && styles.pathActionButtonError, - ]} - onPress={handleCopy} - > - - {copyIcon} - - - {copyLabel} - - - - - - ); -} - -// ============================================================================ -// Content Formatters -// Add new formatters here to support pretty-printing additional formats. -// Each formatter returns { success: true, formatted: string } or { success: false } -// ============================================================================ - -type FormatResult = { success: true; formatted: string } | { success: false }; - -type ContentFormatter = (content: string) => FormatResult; - -const formatters: ContentFormatter[] = [ - // JSON formatter - (content: string): FormatResult => { - try { - const parsed = JSON.parse(content); - return { success: true, formatted: JSON.stringify(parsed, null, 2) }; - } catch { - return { success: false }; - } - }, - - // PLIST / XML formatter - (content: string): FormatResult => { - // Remove BOM if present and trim - const cleaned = content.replace(/^\uFEFF/, '').trim(); - - // Check if it looks like XML/PLIST (handle various XML starts) - const looksLikeXml = - cleaned.startsWith('\s+<') // Remove whitespace between tags - .replace(//g, '>\n') // Add newline after each closing tag - .split('\n') - .map((line) => line.trim()) - .filter((line) => line.length > 0); - - for (const token of normalized) { - // Handle closing tags - decrease indent first - if (token.startsWith('') || - token.startsWith('value - if (token.startsWith('<') && token.includes('( - p: Promise, - ms: number, - message: string, -): Promise { - let timeout: ReturnType | null = null; - try { - return await Promise.race([ - p, - new Promise((_, reject) => { - timeout = setTimeout(() => reject(new Error(message)), ms); - }), - ]); - } finally { - if (timeout) clearTimeout(timeout); - } -} - const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#0b0b0f', }, - center: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - gap: 12, - }, - centerText: { - color: '#d6d6d6', - fontSize: 14, - }, - - topBar: { - paddingHorizontal: 16, - paddingTop: 12, - paddingBottom: 10, - borderBottomWidth: 1, - borderBottomColor: '#1c1c24', - backgroundColor: '#0f1016', - }, - topBarLeft: { - flexDirection: 'row', - alignItems: 'baseline', - justifyContent: 'space-between', - marginBottom: 10, - }, - title: { - fontSize: 18, - fontWeight: '700', - color: '#f2f2f2', - }, - statusText: { - fontSize: 12, - color: '#9a9aa7', - }, - - controls: { - gap: 10, - }, - controlsRow: { - flexDirection: 'row', - gap: 8, - alignItems: 'center', - }, - chipsRow: { - flexDirection: 'row', - gap: 8, - flexWrap: 'wrap', - }, - - button: { - paddingHorizontal: 10, - paddingVertical: 8, - borderRadius: 8, - backgroundColor: '#1b1c25', - borderWidth: 1, - borderColor: '#2a2b37', - }, - iconButton: { - width: 36, - height: 36, - borderRadius: 8, - backgroundColor: '#1b1c25', - borderWidth: 1, - borderColor: '#2a2b37', - alignItems: 'center', - justifyContent: 'center', - }, - iconButtonHovered: { - backgroundColor: '#252633', - }, - iconButtonText: { - color: '#e9e9ee', - fontSize: 16, - fontWeight: '600', - }, - buttonDisabled: { - opacity: 0.4, - }, - buttonText: { - color: '#e9e9ee', - fontSize: 12, - fontWeight: '600', - }, - primaryButton: { - paddingHorizontal: 12, - paddingVertical: 8, - borderRadius: 8, - backgroundColor: '#8232ff', - }, - primaryButtonHovered: { - backgroundColor: '#9550ff', - }, - primaryButtonText: { - color: '#ffffff', - fontSize: 12, - fontWeight: '700', - }, - - pathInputWrap: { - flex: 1, - minWidth: 240, - }, - pathInput: { - paddingHorizontal: 10, - paddingVertical: 8, - borderRadius: 8, - borderWidth: 1, - borderColor: '#2a2b37', - backgroundColor: '#0b0b0f', - color: '#f2f2f2', - fontSize: 12, - }, - - chip: { - paddingHorizontal: 10, - paddingVertical: 6, - borderRadius: 999, - backgroundColor: '#161723', - borderWidth: 1, - borderColor: '#2a2b37', - maxWidth: 220, - }, - chipHovered: { - backgroundColor: '#1e1f2e', - borderColor: '#3a3b4a', - }, - chipActive: { - borderColor: '#8232ff', - backgroundColor: 'rgba(130, 50, 255, 0.14)', - }, - chipText: { - color: '#cfcfe0', - fontSize: 12, - fontWeight: '600', - }, - chipTextActive: { - color: '#efe7ff', - }, - body: { flex: 1, flexDirection: 'row', @@ -1027,11 +127,6 @@ const styles = StyleSheet.create({ borderRightWidth: 1, borderRightColor: '#1c1c24', }, - detailPane: { - flex: 1, - padding: 16, - }, - listHeader: { paddingHorizontal: 12, paddingVertical: 8, @@ -1050,44 +145,6 @@ const styles = StyleSheet.create({ listContent: { paddingVertical: 6, }, - - row: { - flexDirection: 'row', - alignItems: 'center', - gap: 10, - paddingHorizontal: 16, - paddingVertical: 10, - }, - rowHovered: { - backgroundColor: 'rgba(255, 255, 255, 0.04)', - }, - rowSelected: { - backgroundColor: 'rgba(130, 50, 255, 0.12)', - }, - rowIcon: { - width: 24, - textAlign: 'center', - fontSize: 16, - }, - rowMain: { - flex: 1, - gap: 2, - }, - rowName: { - color: '#f2f2f2', - fontSize: 13, - fontWeight: '600', - }, - rowMeta: { - color: '#9a9aa7', - fontSize: 11, - }, - rowChevron: { - color: '#6f6f7e', - fontSize: 18, - paddingLeft: 6, - }, - errorBox: { margin: 16, padding: 12, @@ -1105,181 +162,4 @@ const styles = StyleSheet.create({ color: '#ffb3c1', fontSize: 12, }, - - detailTitle: { - color: '#f2f2f2', - fontSize: 14, - fontWeight: '700', - marginBottom: 10, - }, - detailEmpty: { - color: '#9a9aa7', - fontSize: 12, - }, - detailCard: { - borderWidth: 1, - borderColor: '#1c1c24', - borderRadius: 12, - padding: 12, - backgroundColor: '#0f1016', - gap: 10, - }, - detailName: { - color: '#f2f2f2', - fontSize: 13, - fontWeight: '700', - }, - detailPath: { - color: '#9a9aa7', - fontSize: 11, - fontFamily: 'Menlo', - }, - detailGrid: { - gap: 8, - }, - detailLine: { - flexDirection: 'row', - justifyContent: 'space-between', - gap: 10, - }, - detailLabel: { - color: '#9a9aa7', - fontSize: 11, - }, - detailValue: { - color: '#eaeaf2', - fontSize: 11, - fontWeight: '600', - maxWidth: '70%', - textAlign: 'right', - }, - - previewBox: { - marginTop: 6, - borderTopWidth: 1, - borderTopColor: '#1c1c24', - paddingTop: 10, - gap: 8, - }, - previewTitle: { - color: '#eaeaf2', - fontSize: 12, - fontWeight: '700', - }, - previewHint: { - color: '#9a9aa7', - fontSize: 12, - }, - previewError: { - color: '#ffb3c1', - fontSize: 12, - }, - previewLoading: { - flexDirection: 'row', - alignItems: 'center', - gap: 10, - }, - previewLoadingText: { - color: '#cfcfe0', - fontSize: 12, - }, - previewImage: { - width: '100%', - height: 240, - backgroundColor: '#0b0b0f', - borderRadius: 10, - }, - textPreviewScroll: { - maxHeight: 300, - backgroundColor: '#0b0b0f', - borderRadius: 10, - padding: 12, - borderWidth: 1, - borderColor: '#1c1c24', - }, - textPreviewContent: { - color: '#d6d6d6', - fontSize: 11, - fontFamily: 'Menlo', - lineHeight: 16, - }, - - // PathDisplay styles - pathDisplayContainer: { - flex: 1, - gap: 6, - }, - pathDisplayLabel: { - color: '#9a9aa7', - fontSize: 11, - fontWeight: '600', - }, - pathDisplayRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - backgroundColor: '#0b0b0f', - borderRadius: 8, - borderWidth: 1, - borderColor: '#1c1c24', - paddingLeft: 10, - paddingVertical: 2, - overflow: 'hidden', - }, - pathDisplayScroll: { - flex: 1, - maxHeight: 32, - }, - pathDisplayScrollContent: { - alignItems: 'center', - paddingVertical: 6, - }, - pathDisplayText: { - color: '#b8b8c8', - fontSize: 11, - fontFamily: 'Menlo', - }, - pathDisplayActions: { - flexDirection: 'row', - alignItems: 'center', - }, - pathActionButton: { - flexDirection: 'row', - alignItems: 'center', - gap: 4, - paddingHorizontal: 10, - paddingVertical: 8, - borderLeftWidth: 1, - borderLeftColor: '#2a2b37', - }, - pathActionButtonHovered: { - backgroundColor: 'rgba(255, 255, 255, 0.06)', - }, - pathActionButtonSuccess: { - backgroundColor: 'rgba(74, 222, 128, 0.1)', - }, - pathActionButtonError: { - backgroundColor: 'rgba(255, 99, 132, 0.1)', - }, - pathActionIcon: { - color: '#9a9aa7', - fontSize: 12, - }, - pathActionIconSuccess: { - color: '#4ade80', - }, - pathActionIconError: { - color: '#ff6384', - }, - pathActionLabel: { - color: '#9a9aa7', - fontSize: 10, - fontWeight: '600', - }, - pathActionLabelSuccess: { - color: '#4ade80', - }, - pathActionLabelError: { - color: '#ff6384', - }, }); diff --git a/packages/file-system-plugin/src/formatters.ts b/packages/file-system-plugin/src/formatters.ts new file mode 100644 index 00000000..64c3ab9a --- /dev/null +++ b/packages/file-system-plugin/src/formatters.ts @@ -0,0 +1,115 @@ +// ============================================================================ +// Content Formatters +// Add new formatters here to support pretty-printing additional formats. +// Each formatter returns { success: true, formatted: string } or { success: false } +// ============================================================================ + +type FormatResult = { success: true; formatted: string } | { success: false }; + +type ContentFormatter = (content: string) => FormatResult; + +const formatters: ContentFormatter[] = [ + // JSON formatter + (content: string): FormatResult => { + try { + const parsed = JSON.parse(content); + return { success: true, formatted: JSON.stringify(parsed, null, 2) }; + } catch { + return { success: false }; + } + }, + + // PLIST / XML formatter + (content: string): FormatResult => { + // Remove BOM if present and trim + const cleaned = content.replace(/^\uFEFF/, '').trim(); + + // Check if it looks like XML/PLIST (handle various XML starts) + const looksLikeXml = + cleaned.startsWith('\s+<') // Remove whitespace between tags + .replace(//g, '>\n') // Add newline after each closing tag + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0); + + for (const token of normalized) { + // Handle closing tags - decrease indent first + if (token.startsWith('') || + token.startsWith('value + if (token.startsWith('<') && token.includes('; export function getInfoAsync( uri: string, - options?: { size?: boolean; md5?: boolean } + options?: { size?: boolean; md5?: boolean }, ): Promise; export function readAsStringAsync( uri: string, - options?: { encoding?: "base64" | "utf8" } + options?: { encoding?: 'base64' | 'utf8' }, ): Promise; } -declare module "react-native-fs" { +declare module 'react-native-fs' { export type ReadDirItem = { name: string; path: string; @@ -47,10 +47,13 @@ declare module "react-native-fs" { }>; export function readFile( path: string, - encoding: "base64" | "utf8" + encoding: 'base64' | 'utf8', ): Promise; } -declare module "@birdofpreyru/react-native-fs" { - export * from "react-native-fs"; +declare module '@birdofpreyru/react-native-fs' { + export * from 'react-native-fs'; +} +declare module '@dr.pogodin/react-native-fs' { + export * from 'react-native-fs'; } diff --git a/packages/file-system-plugin/src/types.ts b/packages/file-system-plugin/src/types.ts new file mode 100644 index 00000000..5efee8e3 --- /dev/null +++ b/packages/file-system-plugin/src/types.ts @@ -0,0 +1,6 @@ +import type { PressableStateCallbackType } from 'react-native'; + +// Extended pressable state for react-native-web (includes hover) +export type WebPressableState = PressableStateCallbackType & { + hovered?: boolean; +}; diff --git a/packages/file-system-plugin/src/ui/ConnectingScreen.tsx b/packages/file-system-plugin/src/ui/ConnectingScreen.tsx new file mode 100644 index 00000000..0b09dcec --- /dev/null +++ b/packages/file-system-plugin/src/ui/ConnectingScreen.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { + ActivityIndicator, + SafeAreaView, + StyleSheet, + Text, + View, +} from 'react-native'; + +export function ConnectingScreen() { + return ( + + + + Connecting to React Native… + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#0b0b0f', + }, + center: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + gap: 12, + }, + centerText: { + color: '#d6d6d6', + fontSize: 14, + }, +}); diff --git a/packages/file-system-plugin/src/ui/DetailLine.tsx b/packages/file-system-plugin/src/ui/DetailLine.tsx new file mode 100644 index 00000000..003a3dd4 --- /dev/null +++ b/packages/file-system-plugin/src/ui/DetailLine.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { StyleSheet, Text, View } from 'react-native'; + +type DetailLineProps = { + label: string; + value: string; +}; + +export function DetailLine({ label, value }: DetailLineProps) { + return ( + + {label} + + {value} + + + ); +} + +const styles = StyleSheet.create({ + detailLine: { + flexDirection: 'row', + justifyContent: 'space-between', + gap: 10, + }, + detailLabel: { + color: '#9a9aa7', + fontSize: 11, + }, + detailValue: { + color: '#eaeaf2', + fontSize: 11, + fontWeight: '600', + maxWidth: '70%', + textAlign: 'right', + }, +}); diff --git a/packages/file-system-plugin/src/ui/DetailPanel.tsx b/packages/file-system-plugin/src/ui/DetailPanel.tsx new file mode 100644 index 00000000..15c5cf2a --- /dev/null +++ b/packages/file-system-plugin/src/ui/DetailPanel.tsx @@ -0,0 +1,269 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { + ActivityIndicator, + Image, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native'; +import type { FsEntry } from '../shared/protocol'; +import { isLikelyImageFile } from '../shared/path'; +import { formatBytes, formatDate } from '../utils'; +import { formatTextPreview } from '../formatters'; +import { DetailLine } from './DetailLine'; +import { PathDisplay } from './PathDisplay'; +import type { useFileSystemRequests } from '../use-file-system-requests'; + +type FileSystemRequests = ReturnType; + +type DetailPanelProps = { + selected: FsEntry | null; + requestImagePreview: FileSystemRequests['requestImagePreview']; + requestTextPreview: FileSystemRequests['requestTextPreview']; +}; + +export function DetailPanel({ + selected, + requestImagePreview, + requestTextPreview, +}: DetailPanelProps) { + const [imagePreviewUri, setImagePreviewUri] = useState(null); + const [imagePreviewError, setImagePreviewError] = useState( + null, + ); + const [imagePreviewLoading, setImagePreviewLoading] = useState(false); + + const [textPreview, setTextPreview] = useState(null); + const [textPreviewError, setTextPreviewError] = useState(null); + const [textPreviewLoading, setTextPreviewLoading] = useState(false); + + // Load preview when selected file changes + const loadPreview = useCallback( + async (entry: FsEntry) => { + // Reset preview state + setImagePreviewUri(null); + setImagePreviewError(null); + setImagePreviewLoading(false); + setTextPreview(null); + setTextPreviewError(null); + setTextPreviewLoading(false); + + if (entry.isDirectory) return; + + // Handle image preview + if (isLikelyImageFile(entry.path)) { + setImagePreviewLoading(true); + try { + const res = await requestImagePreview(entry.path); + if (!res) return; + if (res.error || !res.dataUri) { + setImagePreviewError(res.error ?? 'No preview available'); + return; + } + setImagePreviewUri(res.dataUri); + } catch (e) { + setImagePreviewError(e instanceof Error ? e.message : String(e)); + } finally { + setImagePreviewLoading(false); + } + return; + } + + // Handle text/file preview for any non-image file + setTextPreviewLoading(true); + try { + const res = await requestTextPreview(entry.path); + if (!res) return; + if (res.error || !res.content) { + setTextPreviewError(res.error ?? 'No preview available'); + return; + } + setTextPreview(res.content); + } catch (e) { + setTextPreviewError(e instanceof Error ? e.message : String(e)); + } finally { + setTextPreviewLoading(false); + } + }, + [requestImagePreview, requestTextPreview], + ); + + useEffect(() => { + if (!selected || selected.isDirectory) { + // Reset previews when deselected or directory selected + setImagePreviewUri(null); + setImagePreviewError(null); + setImagePreviewLoading(false); + setTextPreview(null); + setTextPreviewError(null); + setTextPreviewLoading(false); + return; + } + loadPreview(selected); + }, [selected, loadPreview]); + + return ( + + Details + {!selected ? ( + Select a file or directory. + ) : ( + + + {selected.name} + + + + + + + + + {!selected.isDirectory && isLikelyImageFile(selected.path) ? ( + + Image preview + {imagePreviewLoading ? ( + + + + Loading preview… + + + ) : imagePreviewError ? ( + {imagePreviewError} + ) : imagePreviewUri ? ( + + ) : ( + + Tap the file again to re-fetch preview (limited size). + + )} + + ) : null} + + {!selected.isDirectory && !isLikelyImageFile(selected.path) ? ( + + File preview + {textPreviewLoading ? ( + + + + Loading preview… + + + ) : textPreviewError ? ( + {textPreviewError} + ) : textPreview ? ( + + + {formatTextPreview(textPreview)} + + + ) : ( + + Tap the file again to re-fetch preview (limited size). + + )} + + ) : null} + + )} + + ); +} + +const styles = StyleSheet.create({ + detailPane: { + flex: 1, + padding: 16, + }, + detailTitle: { + color: '#f2f2f2', + fontSize: 14, + fontWeight: '700', + marginBottom: 10, + }, + detailEmpty: { + color: '#9a9aa7', + fontSize: 12, + }, + detailCard: { + borderWidth: 1, + borderColor: '#1c1c24', + borderRadius: 12, + padding: 12, + backgroundColor: '#0f1016', + gap: 10, + }, + detailName: { + color: '#f2f2f2', + fontSize: 13, + fontWeight: '700', + }, + detailGrid: { + gap: 8, + }, + previewBox: { + marginTop: 6, + borderTopWidth: 1, + borderTopColor: '#1c1c24', + paddingTop: 10, + gap: 8, + }, + previewTitle: { + color: '#eaeaf2', + fontSize: 12, + fontWeight: '700', + }, + previewHint: { + color: '#9a9aa7', + fontSize: 12, + }, + previewError: { + color: '#ffb3c1', + fontSize: 12, + }, + previewLoading: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + }, + previewLoadingText: { + color: '#cfcfe0', + fontSize: 12, + }, + previewImage: { + width: '100%', + height: 240, + backgroundColor: '#0b0b0f', + borderRadius: 10, + }, + textPreviewScroll: { + maxHeight: 300, + backgroundColor: '#0b0b0f', + borderRadius: 10, + padding: 12, + borderWidth: 1, + borderColor: '#1c1c24', + }, + textPreviewContent: { + color: '#d6d6d6', + fontSize: 11, + fontFamily: 'Menlo', + lineHeight: 16, + }, +}); diff --git a/packages/file-system-plugin/src/ui/FileEntryRow.tsx b/packages/file-system-plugin/src/ui/FileEntryRow.tsx new file mode 100644 index 00000000..facddf55 --- /dev/null +++ b/packages/file-system-plugin/src/ui/FileEntryRow.tsx @@ -0,0 +1,86 @@ +import React from 'react'; +import { Pressable, StyleSheet, Text, View } from 'react-native'; +import type { FsEntry } from '../shared/protocol'; +import { isLikelyImageFile, isLikelyTextFile } from '../shared/path'; +import { formatBytes, formatDate } from '../utils'; +import type { WebPressableState } from '../types'; + +type FileEntryRowProps = { + entry: FsEntry; + isSelected: boolean; + onPress: (entry: FsEntry) => void; +}; + +function getFileIcon(entry: FsEntry): string { + if (entry.isDirectory) return '📁'; + if (isLikelyImageFile(entry.path)) return '🖼️'; + if (isLikelyTextFile(entry.path)) return '📝'; + return '📄'; +} + +function FileEntryRowInner({ entry, isSelected, onPress }: FileEntryRowProps) { + return ( + onPress(entry)} + style={(state: WebPressableState) => [ + styles.row, + state.hovered && !isSelected && styles.rowHovered, + isSelected ? styles.rowSelected : undefined, + ]} + > + {getFileIcon(entry)} + + + {entry.name} + + + {entry.isDirectory + ? 'Directory' + : `${formatBytes(entry.size)} • ${formatDate(entry.modifiedAtMs)}`} + + + {entry.isDirectory ? '›' : ''} + + ); +} + +export const FileEntryRow = React.memo(FileEntryRowInner); + +const styles = StyleSheet.create({ + row: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + paddingHorizontal: 16, + paddingVertical: 10, + }, + rowHovered: { + backgroundColor: 'rgba(255, 255, 255, 0.04)', + }, + rowSelected: { + backgroundColor: 'rgba(130, 50, 255, 0.12)', + }, + rowIcon: { + width: 24, + textAlign: 'center', + fontSize: 16, + }, + rowMain: { + flex: 1, + gap: 2, + }, + rowName: { + color: '#f2f2f2', + fontSize: 13, + fontWeight: '600', + }, + rowMeta: { + color: '#9a9aa7', + fontSize: 11, + }, + rowChevron: { + color: '#6f6f7e', + fontSize: 18, + paddingLeft: 6, + }, +}); diff --git a/packages/file-system-plugin/src/ui/PathDisplay.tsx b/packages/file-system-plugin/src/ui/PathDisplay.tsx new file mode 100644 index 00000000..f137e5ce --- /dev/null +++ b/packages/file-system-plugin/src/ui/PathDisplay.tsx @@ -0,0 +1,162 @@ +import React, { useCallback, useState } from 'react'; +import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; +import type { WebPressableState } from '../types'; +import { copyToClipboard } from '../utils'; + +type CopyState = 'idle' | 'copied' | 'error'; + +type PathDisplayProps = { + path: string; + label?: string; +}; + +export function PathDisplay({ path, label }: PathDisplayProps) { + const [copyState, setCopyState] = useState('idle'); + + const handleCopy = useCallback(() => { + const success = copyToClipboard(path); + if (success) { + setCopyState('copied'); + } else { + setCopyState('error'); + } + setTimeout(() => setCopyState('idle'), 2000); + }, [path]); + + const copyIcon = + copyState === 'copied' ? '✓' : copyState === 'error' ? '✕' : '⧉'; + const copyLabel = + copyState === 'copied' + ? 'Copied!' + : copyState === 'error' + ? 'Failed' + : 'Copy'; + + return ( + + {label ? {label} : null} + + + + {path} + + + + [ + styles.pathActionButton, + state.hovered && styles.pathActionButtonHovered, + copyState === 'copied' && styles.pathActionButtonSuccess, + copyState === 'error' && styles.pathActionButtonError, + ]} + onPress={handleCopy} + > + + {copyIcon} + + + {copyLabel} + + + + + + ); +} + +const styles = StyleSheet.create({ + pathDisplayContainer: { + flex: 1, + gap: 6, + }, + pathDisplayLabel: { + color: '#9a9aa7', + fontSize: 11, + fontWeight: '600', + }, + pathDisplayRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + backgroundColor: '#0b0b0f', + borderRadius: 8, + borderWidth: 1, + borderColor: '#1c1c24', + paddingLeft: 10, + paddingVertical: 2, + overflow: 'hidden', + }, + pathDisplayScroll: { + flex: 1, + maxHeight: 32, + }, + pathDisplayScrollContent: { + alignItems: 'center', + paddingVertical: 6, + }, + pathDisplayText: { + color: '#b8b8c8', + fontSize: 11, + fontFamily: 'Menlo', + }, + pathDisplayActions: { + flexDirection: 'row', + alignItems: 'center', + }, + pathActionButton: { + flexDirection: 'row', + alignItems: 'center', + gap: 4, + paddingHorizontal: 10, + paddingVertical: 8, + borderLeftWidth: 1, + borderLeftColor: '#2a2b37', + }, + pathActionButtonHovered: { + backgroundColor: 'rgba(255, 255, 255, 0.06)', + }, + pathActionButtonSuccess: { + backgroundColor: 'rgba(74, 222, 128, 0.1)', + }, + pathActionButtonError: { + backgroundColor: 'rgba(255, 99, 132, 0.1)', + }, + pathActionIcon: { + color: '#9a9aa7', + fontSize: 12, + }, + pathActionIconSuccess: { + color: '#4ade80', + }, + pathActionIconError: { + color: '#ff6384', + }, + pathActionLabel: { + color: '#9a9aa7', + fontSize: 10, + fontWeight: '600', + }, + pathActionLabelSuccess: { + color: '#4ade80', + }, + pathActionLabelError: { + color: '#ff6384', + }, +}); diff --git a/packages/file-system-plugin/src/ui/TopBar.tsx b/packages/file-system-plugin/src/ui/TopBar.tsx new file mode 100644 index 00000000..8612bacf --- /dev/null +++ b/packages/file-system-plugin/src/ui/TopBar.tsx @@ -0,0 +1,244 @@ +import React, { useMemo } from 'react'; +import { + Pressable, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native'; +import type { FileSystemProvider, FsRoots } from '../shared/protocol'; +import type { WebPressableState } from '../types'; + +type TopBarProps = { + provider: FileSystemProvider; + roots: FsRoots['roots']; + pathInput: string; + setPathInput: (value: string) => void; + currentPath: string; + setCurrentPath: (path: string) => void; + canGoBack: boolean; + onGo: () => void; + onBack: () => void; + onReload: () => void; +}; + +function getProviderLabel(provider: FileSystemProvider): string { + if (provider === 'expo') return 'Expo FileSystem'; + if (provider === 'rnfs') return 'react-native-fs'; + return 'No provider'; +} + +export function TopBar({ + provider, + roots, + pathInput, + setPathInput, + currentPath, + setCurrentPath, + canGoBack, + onGo, + onBack, + onReload, +}: TopBarProps) { + const rootChips = useMemo(() => { + return roots.map((r) => { + const isActive = r.path === currentPath; + return ( + [ + styles.chip, + state.hovered && !isActive && styles.chipHovered, + isActive ? styles.chipActive : undefined, + ]} + onPress={() => setCurrentPath(r.path)} + > + + {r.label} + + + ); + }); + }, [currentPath, roots, setCurrentPath]); + + return ( + + + File System + {getProviderLabel(provider)} + + + + + [ + styles.iconButton, + state.hovered && canGoBack && styles.iconButtonHovered, + !canGoBack ? styles.buttonDisabled : null, + ]} + onPress={onBack} + disabled={!canGoBack} + > + + + + [ + styles.iconButton, + state.hovered && !!currentPath && styles.iconButtonHovered, + !currentPath ? styles.buttonDisabled : null, + ]} + onPress={onReload} + disabled={!currentPath} + > + + + + + + + + [ + styles.primaryButton, + state.hovered && styles.primaryButtonHovered, + ]} + onPress={onGo} + > + Go + + + + {rootChips} + + + ); +} + +const styles = StyleSheet.create({ + topBar: { + paddingHorizontal: 16, + paddingTop: 12, + paddingBottom: 10, + borderBottomWidth: 1, + borderBottomColor: '#1c1c24', + backgroundColor: '#0f1016', + }, + topBarLeft: { + flexDirection: 'row', + alignItems: 'baseline', + justifyContent: 'space-between', + marginBottom: 10, + }, + title: { + fontSize: 18, + fontWeight: '700', + color: '#f2f2f2', + }, + statusText: { + fontSize: 12, + color: '#9a9aa7', + }, + controls: { + gap: 10, + }, + controlsRow: { + flexDirection: 'row', + gap: 8, + alignItems: 'center', + }, + chipsRow: { + flexDirection: 'row', + gap: 8, + flexWrap: 'wrap', + }, + iconButton: { + width: 36, + height: 36, + borderRadius: 8, + backgroundColor: '#1b1c25', + borderWidth: 1, + borderColor: '#2a2b37', + alignItems: 'center', + justifyContent: 'center', + }, + iconButtonHovered: { + backgroundColor: '#252633', + }, + iconButtonText: { + color: '#e9e9ee', + fontSize: 16, + fontWeight: '600', + }, + buttonDisabled: { + opacity: 0.4, + }, + primaryButton: { + paddingHorizontal: 12, + paddingVertical: 8, + borderRadius: 8, + backgroundColor: '#8232ff', + }, + primaryButtonHovered: { + backgroundColor: '#9550ff', + }, + primaryButtonText: { + color: '#ffffff', + fontSize: 12, + fontWeight: '700', + }, + pathInputWrap: { + flex: 1, + minWidth: 240, + }, + pathInput: { + paddingHorizontal: 10, + paddingVertical: 8, + borderRadius: 8, + borderWidth: 1, + borderColor: '#2a2b37', + backgroundColor: '#0b0b0f', + color: '#f2f2f2', + fontSize: 12, + }, + chip: { + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#161723', + borderWidth: 1, + borderColor: '#2a2b37', + maxWidth: 220, + }, + chipHovered: { + backgroundColor: '#1e1f2e', + borderColor: '#3a3b4a', + }, + chipActive: { + borderColor: '#8232ff', + backgroundColor: 'rgba(130, 50, 255, 0.14)', + }, + chipText: { + color: '#cfcfe0', + fontSize: 12, + fontWeight: '600', + }, + chipTextActive: { + color: '#efe7ff', + }, +}); diff --git a/packages/file-system-plugin/src/use-file-system-navigation.ts b/packages/file-system-plugin/src/use-file-system-navigation.ts new file mode 100644 index 00000000..7c9c4d65 --- /dev/null +++ b/packages/file-system-plugin/src/use-file-system-navigation.ts @@ -0,0 +1,156 @@ +import { useCallback, useEffect, useMemo, useState } from 'react'; +import type { RozeniteDevToolsClient } from '@rozenite/plugin-bridge'; +import type { + FileSystemEventMap, + FileSystemProvider, + FsEntry, + FsRoots, +} from './shared/protocol'; +import { parentPath } from './shared/path'; +import type { useFileSystemRequests } from './use-file-system-requests'; + +type FileSystemRequests = ReturnType; + +export function useFileSystemNavigation( + client: RozeniteDevToolsClient | null, + requests: FileSystemRequests, +) { + const [provider, setProvider] = useState('none'); + const [roots, setRoots] = useState([]); + const [pathInput, setPathInput] = useState(''); + const [currentPath, setCurrentPath] = useState(''); + + const [entries, setEntries] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const loadRootsAndMaybeInit = useCallback(async () => { + setError(null); + const res = await requests.requestRoots(); + if (!res) return; + setProvider(res.provider); + if (res.error) { + setRoots([]); + setError(res.error); + return; + } + setRoots(res.roots); + + // Initialize path to first root only once + if (!currentPath && res.roots.length > 0) { + const first = res.roots[0]!.path; + setPathInput(first); + setCurrentPath(first); + } + }, [currentPath, requests.requestRoots]); + + useEffect(() => { + if (!client) return; + loadRootsAndMaybeInit(); + }, [client, loadRootsAndMaybeInit]); + + const loadDir = useCallback( + async (path: string) => { + setLoading(true); + setError(null); + + try { + const res = await requests.requestList(path); + if (!res) return; + setProvider(res.provider); + setCurrentPath(res.path); + setPathInput(res.path); + if (res.error) { + setEntries([]); + setError(res.error); + return; + } + setEntries(res.entries); + } catch (e) { + setEntries([]); + setError(e instanceof Error ? e.message : String(e)); + } finally { + setLoading(false); + } + }, + [requests.requestList], + ); + + useEffect(() => { + if (!client) return; + if (!currentPath) return; + loadDir(currentPath); + }, [client, currentPath]); + + // Handle RN app ready/reconnect - re-fetch data when RN side (re)initializes + useEffect(() => { + if (!client) return; + + const subReady = client.onMessage('fs:ready', async () => { + // Reset UI state on reconnect + setProvider('none'); + setRoots([]); + setEntries([]); + setError(null); + + // Re-fetch roots + await loadRootsAndMaybeInit(); + + // If user was in a directory, reload it + if (currentPath) { + loadDir(currentPath); + } + }); + + return () => { + subReady.remove(); + }; + }, [client, currentPath, loadDir, loadRootsAndMaybeInit]); + + const onGo = useCallback(() => { + const next = pathInput.trim(); + if (!next) return; + setCurrentPath(next); + }, [pathInput]); + + // Check if we can go back (not at or above a root path) + const canGoBack = useMemo(() => { + if (!currentPath) return false; + // If current path is one of the roots, we can't go up + const isAtRoot = roots.some((r) => r.path === currentPath); + if (isAtRoot) return false; + // Check if parent path exists and we wouldn't go above a root + const parent = parentPath(currentPath); + if (!parent) return false; + // Ensure we're still within one of the root paths + return roots.some((r) => parent.startsWith(r.path) || parent === r.path); + }, [currentPath, roots]); + + const onBack = useCallback(() => { + if (!canGoBack) return; + const p = parentPath(currentPath); + if (!p) return; + setCurrentPath(p); + }, [currentPath, canGoBack]); + + const onReload = useCallback(() => { + if (!currentPath) return; + loadDir(currentPath); + }, [currentPath, loadDir]); + + return { + provider, + roots, + pathInput, + setPathInput, + currentPath, + setCurrentPath, + entries, + loading, + error, + canGoBack, + onGo, + onBack, + onReload, + }; +} diff --git a/packages/file-system-plugin/src/use-file-system-requests.ts b/packages/file-system-plugin/src/use-file-system-requests.ts new file mode 100644 index 00000000..01513320 --- /dev/null +++ b/packages/file-system-plugin/src/use-file-system-requests.ts @@ -0,0 +1,131 @@ +import { useCallback, useEffect, useRef } from 'react'; +import type { RozeniteDevToolsClient } from '@rozenite/plugin-bridge'; +import type { FileSystemEventMap } from './shared/protocol'; +import { newRequestId, withTimeout } from './utils'; + +type PendingResolvers = { + roots: Map< + string, + (payload: FileSystemEventMap['fs:get-roots:result']) => void + >; + list: Map void>; + image: Map< + string, + (payload: FileSystemEventMap['fs:read-image:result']) => void + >; + file: Map< + string, + (payload: FileSystemEventMap['fs:read-file:result']) => void + >; +}; + +export function useFileSystemRequests( + client: RozeniteDevToolsClient | null, +) { + const pendingRef = useRef({ + roots: new Map(), + list: new Map(), + image: new Map(), + file: new Map(), + }); + + useEffect(() => { + if (!client) return; + + const subRoots = client.onMessage('fs:get-roots:result', (payload) => { + const resolve = pendingRef.current.roots.get(payload.requestId); + if (resolve) { + pendingRef.current.roots.delete(payload.requestId); + resolve(payload); + } + }); + + const subList = client.onMessage('fs:list:result', (payload) => { + const resolve = pendingRef.current.list.get(payload.requestId); + if (resolve) { + pendingRef.current.list.delete(payload.requestId); + resolve(payload); + } + }); + + const subImage = client.onMessage('fs:read-image:result', (payload) => { + const resolve = pendingRef.current.image.get(payload.requestId); + if (resolve) { + pendingRef.current.image.delete(payload.requestId); + resolve(payload); + } + }); + + const subFile = client.onMessage('fs:read-file:result', (payload) => { + const resolve = pendingRef.current.file.get(payload.requestId); + if (resolve) { + pendingRef.current.file.delete(payload.requestId); + resolve(payload); + } + }); + + return () => { + subRoots.remove(); + subList.remove(); + subImage.remove(); + subFile.remove(); + }; + }, [client]); + + const requestRoots = useCallback(async () => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise( + (resolve) => { + pendingRef.current.roots.set(requestId, resolve); + }, + ); + client.send('fs:get-roots', { requestId }); + return await withTimeout(p, 8000, 'Timeout fetching roots'); + }, [client]); + + const requestList = useCallback( + async (path: string) => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise((resolve) => { + pendingRef.current.list.set(requestId, resolve); + }); + client.send('fs:list', { requestId, path }); + return await withTimeout(p, 15000, 'Timeout listing directory'); + }, + [client], + ); + + const requestImagePreview = useCallback( + async (path: string, maxBytes = 10_000_000) => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise( + (resolve) => { + pendingRef.current.image.set(requestId, resolve); + }, + ); + client.send('fs:read-image', { requestId, path, maxBytes }); + return await withTimeout(p, 15000, 'Timeout reading image'); + }, + [client], + ); + + const requestTextPreview = useCallback( + async (path: string, maxBytes = 10_000_000) => { + if (!client) return null; + const requestId = newRequestId(); + const p = new Promise( + (resolve) => { + pendingRef.current.file.set(requestId, resolve); + }, + ); + client.send('fs:read-file', { requestId, path, maxBytes }); + return await withTimeout(p, 15000, 'Timeout reading file'); + }, + [client], + ); + + return { requestRoots, requestList, requestImagePreview, requestTextPreview }; +} diff --git a/packages/file-system-plugin/src/utils.ts b/packages/file-system-plugin/src/utils.ts new file mode 100644 index 00000000..57c521ef --- /dev/null +++ b/packages/file-system-plugin/src/utils.ts @@ -0,0 +1,62 @@ +export function newRequestId(): string { + return `${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`; +} + +export function formatBytes(bytes?: number | null): string { + if (bytes == null) return '—'; + if (bytes < 1024) return `${bytes} B`; + const kb = bytes / 1024; + if (kb < 1024) return `${kb.toFixed(1)} KB`; + const mb = kb / 1024; + if (mb < 1024) return `${mb.toFixed(1)} MB`; + const gb = mb / 1024; + return `${gb.toFixed(1)} GB`; +} + +export function formatDate(ms?: number | null): string { + if (!ms) return '—'; + try { + return new Date(ms).toLocaleString(); + } catch { + return '—'; + } +} + +export async function withTimeout( + p: Promise, + ms: number, + message: string, +): Promise { + let timeout: ReturnType | null = null; + try { + return await Promise.race([ + p, + new Promise((_, reject) => { + timeout = setTimeout(() => reject(new Error(message)), ms); + }), + ]); + } finally { + if (timeout) clearTimeout(timeout); + } +} + +// Helper to copy text to clipboard (works in web views) +export function copyToClipboard(text: string): boolean { + try { + // Use the textarea fallback approach which is most reliable + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.top = '0'; + textArea.style.left = '-9999px'; + textArea.style.opacity = '0'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + const success = document.execCommand('copy'); + document.body.removeChild(textArea); + return success; + } catch { + return false; + } +}