experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

docs(mobile): add comprehensive iOS build system documentation

Add detailed documentation for iOS build system learned through debugging:

- custom-protocol Cargo feature explanation (CRITICAL for production builds)
- Debug vs Release build separation (targets, caches, libraries)
- Why cargo build --lib instead of cargo tauri build (Swift FFI symbols)
- iOS cache system at repo root for workspace sharing
- Build scripts reference and workflows
- App Group containers and UUID lifecycle (when data persists vs lost)
- Troubleshooting guides: localhost error, builds not updating, wrong architecture

Also documents:
- Native WKWebView integration
- Pull-to-refresh with hold gesture
- In-app icon button styling
- Per-profile database files
- Cross-reference to docs/profiles.md

chore: remove accidentally committed backup and cache files

- Remove device-backup-20260204-143925/ directory (backup is in ~/sync/peek-backups/)
- Add device-backup-*/ to .gitignore to prevent future accidents
- Removes ~140 binary WebKit cache files that were accidentally committed

+953 -449
+3
.gitignore
··· 47 47 # Xcode app container exports 48 48 *.xcappdata/ 49 49 50 + # Device backups (use ~/sync/peek-backups/ instead) 51 + device-backup-*/ 52 + 50 53 # Experimental/unused files 51 54 babel.config.json 52 55 webpack.config.js
+103
DEVELOPMENT.md
··· 395 395 - **Multiple xcodeproj files exist** - With agent workspaces, there may be many copies at `~/misc/mpeek/*/backend/tauri-mobile/src-tauri/gen/apple/peek-save.xcodeproj`. Verify you're opening the correct one (check Xcode window title or File → Project Settings). 396 396 - **disableInputAccessoryView not in Tauri 2.9.x** - The config option to hide iOS keyboard accessory bar is documented in the schema but not implemented in stable Tauri 2.9. Requires newer version or native Swift workaround. 397 397 398 + ### iOS Build System Architecture 399 + 400 + **⚠️ CRITICAL: The `custom-protocol` Cargo feature is REQUIRED for production builds.** 401 + 402 + Without this feature, the app tries to connect to `localhost` instead of using bundled assets, causing a "failed to request tauri://localhost" error and iOS local network permission prompts. 403 + 404 + ```toml 405 + # backend/tauri-mobile/src-tauri/Cargo.toml 406 + tauri = { version = "2", features = ["custom-protocol"] } 407 + ``` 408 + 409 + **Why this happens:** Tauri's build system sets `cargo:dev=true` or `cargo:dev=false` based on the `custom-protocol` feature: 410 + - **With** `custom-protocol` → `dev=false` → uses bundled assets (production) 411 + - **Without** `custom-protocol` → `dev=true` → tries to connect to localhost (dev mode) 412 + 413 + When using `cargo build` directly (instead of `cargo tauri build`), you MUST have this feature enabled, otherwise the app defaults to dev mode. 414 + 415 + ### Debug vs Release Build Separation 416 + 417 + The build system maintains strict separation between debug (simulator) and release (device) builds: 418 + 419 + | Aspect | Debug (Simulator) | Release (Device) | 420 + |--------|-------------------|------------------| 421 + | Target | `aarch64-apple-ios-sim` | `aarch64-apple-ios` | 422 + | Profile | `dev` (unoptimized) | `release` (optimized) | 423 + | Cache | `ios-cache/debug/` | `ios-cache/release/` | 424 + | Xcode Externals | `Externals/arm64/Debug/` | `Externals/arm64/Release/` | 425 + | Build script | `build-ios.sh` | `build-release.sh` | 426 + | yarn command | `yarn mobile:ios:build` | `yarn mobile:ios:build:release` | 427 + 428 + **Cache location:** Caches are stored at the git repo root level (`~/misc/mpeek/tmp/ios-cache/`) and shared across agent workspaces. Each cache contains: 429 + - `libapp.a` - The compiled Rust library 430 + - `checksum.txt` - Hash of source files for cache invalidation 431 + 432 + **Cache invalidation:** The cache hash includes: 433 + - `Cargo.toml`, `Cargo.lock` - Dependencies 434 + - `tauri.conf.json` - Tauri configuration 435 + - `build.rs` - Build script 436 + - `src/*.rs` - All Rust source files 437 + 438 + ### Build Commands (from repo root) 439 + 440 + ```bash 441 + # Debug for simulator 442 + yarn mobile:ios:build # Build Rust library 443 + yarn mobile:ios:xcodebuild # Build Xcode project 444 + yarn mobile:ios:xcodebuild:install # Install on simulator 445 + yarn mobile:ios:sim:launch # Launch app 446 + 447 + # Release for device 448 + yarn mobile:ios:build:release # Build Rust library 449 + yarn mobile:ios:xcodebuild:device # Build Xcode project 450 + yarn mobile:ios:device:run # Install and launch on device 451 + 452 + # Full flows 453 + yarn mobile:ios:xcodebuild:full # Debug: build + xcode + install 454 + yarn mobile:ios:xcodebuild:device:full # Release: build + xcode + install 455 + ``` 456 + 457 + ### Troubleshooting: "localhost" Error on Device 458 + 459 + If the app shows "failed to request tauri://localhost" or asks for local network permissions: 460 + 461 + 1. **Verify `custom-protocol` feature** is in `Cargo.toml`: 462 + ```bash 463 + grep custom-protocol backend/tauri-mobile/src-tauri/Cargo.toml 464 + ``` 465 + 466 + 2. **Clear ALL caches** (shared cache is at repo root, not workspace): 467 + ```bash 468 + rm -rf ~/misc/mpeek/tmp/ios-cache/release 469 + rm -rf backend/tauri-mobile/src-tauri/target/aarch64-apple-ios/release 470 + ``` 471 + 472 + 3. **Rebuild from scratch:** 473 + ```bash 474 + yarn mobile:ios:build:release 475 + ``` 476 + 477 + 4. **Copy to Debug location** (Xcode looks in Debug/ even for release builds): 478 + ```bash 479 + cp backend/tauri-mobile/src-tauri/gen/apple/Externals/arm64/Release/libapp.a \ 480 + backend/tauri-mobile/src-tauri/gen/apple/Externals/arm64/Debug/libapp.a 481 + ``` 482 + 483 + 5. **Rebuild Xcode and install:** 484 + ```bash 485 + yarn mobile:ios:xcodebuild:device 486 + yarn mobile:ios:device:run 487 + ``` 488 + 489 + ### Why We Use `cargo build --lib` Instead of `cargo tauri build` 490 + 491 + The standard `cargo tauri build` command fails on iOS because of Swift FFI symbols (`webview_plugin_open`, `webview_plugin_close`) that are defined in Swift code and only available at Xcode's final link stage. 492 + 493 + Our workaround: 494 + 1. Build only the lib target: `cargo build --lib --target aarch64-apple-ios` 495 + 2. Copy the library to Xcode's expected location 496 + 3. Copy frontend assets manually (normally done by `cargo tauri build`) 497 + 4. Let Xcode do the final linking with Swift code 498 + 499 + This requires the `custom-protocol` feature since we're bypassing Tauri's build orchestration. 500 + 398 501 ## Server Backend (Webhook API) 399 502 400 503 The server backend (`backend/server/`) is a remote HTTP API for syncing data from the mobile app. It's separate from the desktop backends - it doesn't implement the Peek API, it's a standalone Node.js server.
backend/tauri-mobile/.yarn/install-state.gz

This is a binary file and will not be displayed.

+15 -2
backend/tauri-mobile/build-ios.sh
··· 51 51 touch src/lib.rs 52 52 fi 53 53 54 + # Build frontend first (normally done by cargo tauri build's beforeBuildCommand) 55 + echo "Building frontend..." 56 + cd "$SCRIPT_DIR" 57 + npm run build 58 + cd "$TAURI_DIR" 59 + 54 60 echo "Building Rust for iOS simulator (debug)..." 55 - cargo tauri build --target aarch64-apple-ios-sim --debug 61 + # Build only the lib target - the bin target would fail to link because 62 + # Swift FFI symbols (webview_plugin_*) are provided by Xcode at final link time 63 + cargo build --lib --target aarch64-apple-ios-sim 56 64 57 65 # Copy to Xcode location 58 66 mkdir -p "$DEST_DIR" 59 - cp target/aarch64-apple-ios-sim/debug/deps/libpeek_save_lib.a "$DEST_PATH" 67 + cp target/aarch64-apple-ios-sim/debug/libpeek_save_lib.a "$DEST_PATH" 68 + 69 + # Copy frontend assets to Xcode location (normally done by cargo tauri build) 70 + echo "Copying frontend assets..." 71 + rm -rf "$TAURI_DIR/gen/apple/assets" 72 + cp -R "$SCRIPT_DIR/dist" "$TAURI_DIR/gen/apple/assets" 60 73 61 74 # Update cache 62 75 if [ "$NO_CACHE" = false ]; then
+10 -2
backend/tauri-mobile/build-release.sh
··· 57 57 fi 58 58 59 59 echo "Building Rust for iOS device (release)..." 60 - cargo tauri build --target aarch64-apple-ios 60 + # Build only the lib target - the bin target would fail to link because 61 + # Swift FFI symbols (webview_plugin_*) are provided by Xcode at final link time 62 + # Use custom-protocol feature for bundled assets (not dev server) 63 + cargo build --lib --release --features custom-protocol --target aarch64-apple-ios 61 64 62 65 echo "Copying library to Xcode location..." 63 66 mkdir -p "$DEST_DIR" 64 67 # Remove any existing symlink (macOS case-insensitive: release vs Release conflict) 65 68 rm -f "$DEST_PATH" 66 - cp target/aarch64-apple-ios/release/deps/libpeek_save_lib.a "$DEST_PATH" 69 + cp target/aarch64-apple-ios/release/libpeek_save_lib.a "$DEST_PATH" 70 + 71 + # Copy frontend assets to Xcode location (normally done by cargo tauri build) 72 + echo "Copying frontend assets..." 73 + rm -rf "$TAURI_DIR/gen/apple/assets" 74 + cp -R "$SCRIPT_DIR/dist" "$TAURI_DIR/gen/apple/assets" 67 75 68 76 # Update cache 69 77 if [ "$NO_CACHE" = false ]; then
+4 -4
backend/tauri-mobile/package-lock.json
··· 8 8 "name": "peek", 9 9 "version": "0.1.0", 10 10 "dependencies": { 11 - "@tauri-apps/api": "^2", 11 + "@tauri-apps/api": "2.9.1", 12 12 "@tauri-apps/plugin-opener": "^2", 13 13 "@tauri-apps/plugin-store": "^2.4.1", 14 14 "react": "^19.1.0", ··· 1113 1113 ] 1114 1114 }, 1115 1115 "node_modules/@tauri-apps/api": { 1116 - "version": "2.9.0", 1117 - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.0.tgz", 1118 - "integrity": "sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==", 1116 + "version": "2.9.1", 1117 + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.1.tgz", 1118 + "integrity": "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==", 1119 1119 "license": "Apache-2.0 OR MIT", 1120 1120 "funding": { 1121 1121 "type": "opencollective",
+28
backend/tauri-mobile/src-tauri/AppGroupBridge.m
··· 82 82 NSLog(@"[AppGroupBridge] Documents path: %@", documentsPath); 83 83 return strdup([documentsPath UTF8String]); 84 84 } 85 + 86 + // Returns the path to iCloud Documents directory, or NULL if iCloud is not available 87 + // Requires iCloud capability enabled in Xcode with proper container identifier 88 + const char* get_icloud_documents_path() { 89 + // Use nil to get the default ubiquity container (first one in entitlements) 90 + NSURL *containerURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 91 + 92 + if (containerURL == nil) { 93 + NSLog(@"[AppGroupBridge] iCloud not available - user may not be signed in or capability not enabled"); 94 + return NULL; 95 + } 96 + 97 + // iCloud Documents folder is inside the container 98 + NSURL *documentsURL = [containerURL URLByAppendingPathComponent:@"Documents"]; 99 + 100 + // Create the Documents directory if it doesn't exist 101 + NSError *error = nil; 102 + if (![[NSFileManager defaultManager] createDirectoryAtURL:documentsURL 103 + withIntermediateDirectories:YES 104 + attributes:nil 105 + error:&error]) { 106 + NSLog(@"[AppGroupBridge] Failed to create iCloud Documents directory: %@", error); 107 + return NULL; 108 + } 109 + 110 + NSLog(@"[AppGroupBridge] iCloud Documents path: %@", documentsURL.path); 111 + return strdup([documentsURL.path UTF8String]); 112 + }
-12
backend/tauri-mobile/src-tauri/Cargo.lock
··· 2538 2538 "tauri", 2539 2539 "tauri-build", 2540 2540 "tauri-plugin-opener", 2541 - "tauri-plugin-webview", 2542 2541 "url", 2543 2542 "uuid", 2544 2543 ] ··· 3959 3958 "url", 3960 3959 "windows", 3961 3960 "zbus", 3962 - ] 3963 - 3964 - [[package]] 3965 - name = "tauri-plugin-webview" 3966 - version = "0.1.0" 3967 - dependencies = [ 3968 - "serde", 3969 - "serde_json", 3970 - "tauri", 3971 - "tauri-plugin", 3972 - "thiserror 1.0.69", 3973 3961 ] 3974 3962 3975 3963 [[package]]
+6 -2
backend/tauri-mobile/src-tauri/Cargo.toml
··· 12 12 # to make the lib name unique and wouldn't conflict with the bin name. 13 13 # This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 14 14 name = "peek_save_lib" 15 - crate-type = ["staticlib", "cdylib", "rlib"] 15 + crate-type = ["staticlib", "rlib"] 16 16 17 17 [build-dependencies] 18 18 tauri-build = { version = "2", features = [] } 19 19 cc = "1.0" 20 20 21 21 [dependencies] 22 - tauri = { version = "2", features = [] } 22 + tauri = { version = "2", features = ["custom-protocol"] } 23 23 tauri-plugin-opener = "2" 24 24 serde = { version = "1", features = ["derive"] } 25 25 serde_json = "1" ··· 32 32 regex = "1" 33 33 base64 = "0.22" 34 34 35 + [features] 36 + # custom-protocol: use bundled assets instead of dev server (for release builds) 37 + custom-protocol = ["tauri/custom-protocol"] 38 +
+1 -2
backend/tauri-mobile/src-tauri/capabilities/default.json
··· 5 5 "windows": ["main"], 6 6 "permissions": [ 7 7 "core:default", 8 - "opener:default", 9 - "webview:default" 8 + "opener:default" 10 9 ] 11 10 }
+12
backend/tauri-mobile/src-tauri/gen/apple/peek-save_iOS/peek-save_iOS.entitlements
··· 6 6 <array> 7 7 <string>group.com.dietrich.peek-mobile</string> 8 8 </array> 9 + <key>com.apple.developer.icloud-container-identifiers</key> 10 + <array> 11 + <string>iCloud.com.dietrich.peek-mobile</string> 12 + </array> 13 + <key>com.apple.developer.icloud-services</key> 14 + <array> 15 + <string>CloudDocuments</string> 16 + </array> 17 + <key>com.apple.developer.ubiquity-container-identifiers</key> 18 + <array> 19 + <string>iCloud.com.dietrich.peek-mobile</string> 20 + </array> 9 21 </dict> 10 22 </plist>
+42 -7
backend/tauri-mobile/src-tauri/src/lib.rs
··· 16 16 } 17 17 18 18 // FFI declarations for native webview on iOS 19 + // These symbols are provided by Swift code (WebviewPlugin.swift) at Xcode link time. 19 20 #[cfg(target_os = "ios")] 20 21 extern "C" { 21 22 fn webview_plugin_open(url: *const std::ffi::c_char, item_id: *const std::ffi::c_char) -> bool; ··· 193 194 extern "C" { 194 195 fn get_app_group_container_path() -> *const c_char; 195 196 fn get_documents_path() -> *const c_char; 197 + fn get_icloud_documents_path() -> *const c_char; 196 198 fn get_system_is_dark_mode() -> i32; 197 199 fn is_app_store_build() -> i32; 198 200 } ··· 274 276 } 275 277 let path_str = CStr::from_ptr(c_str).to_string_lossy().to_string(); 276 278 libc::free(c_str as *mut libc::c_void); 279 + Some(PathBuf::from(path_str)) 280 + } 281 + } 282 + 283 + /// Get the iCloud Documents directory path (synced across devices) 284 + /// Returns None if iCloud is not available (user not signed in or capability not enabled) 285 + fn get_icloud_path() -> Option<PathBuf> { 286 + unsafe { 287 + let c_str = get_icloud_documents_path(); 288 + if c_str.is_null() { 289 + ios_log("iCloud not available"); 290 + return None; 291 + } 292 + let path_str = CStr::from_ptr(c_str).to_string_lossy().to_string(); 293 + libc::free(c_str as *mut libc::c_void); 294 + ios_log(&format!("iCloud path: {}", path_str)); 277 295 Some(PathBuf::from(path_str)) 278 296 } 279 297 } ··· 2166 2184 let db_path = get_db_path().ok_or("Failed to get database path")?; 2167 2185 let data = std::fs::read(&db_path).map_err(|e| format!("Failed to read database: {}", e))?; 2168 2186 2169 - // Get app's data directory (accessible via Download Container) 2187 + use base64::{Engine as _, engine::general_purpose::STANDARD}; 2188 + let encoded = STANDARD.encode(&data); 2189 + 2190 + let mut export_locations = Vec::new(); 2191 + 2192 + // Try iCloud first (syncs across devices automatically) 2193 + if let Some(icloud_path) = get_icloud_path() { 2194 + let icloud_db = icloud_path.join("peek-export.db"); 2195 + let icloud_b64 = icloud_path.join("peek-export.b64"); 2196 + 2197 + if let Err(e) = std::fs::write(&icloud_db, &data) { 2198 + ios_log(&format!("Failed to write to iCloud: {}", e)); 2199 + } else { 2200 + let _ = std::fs::write(&icloud_b64, &encoded); 2201 + export_locations.push("iCloud".to_string()); 2202 + ios_log(&format!("Exported to iCloud: {}", icloud_db.display())); 2203 + } 2204 + } 2205 + 2206 + // Always export to app data as backup (accessible via Finder File Sharing) 2170 2207 let app_data = app.path().app_data_dir() 2171 2208 .map_err(|e| format!("Failed to get app data dir: {}", e))?; 2172 2209 std::fs::create_dir_all(&app_data) 2173 2210 .map_err(|e| format!("Failed to create app data dir: {}", e))?; 2174 2211 2175 - // Copy raw database 2176 2212 let export_db = app_data.join("peek-export.db"); 2177 2213 std::fs::write(&export_db, &data) 2178 2214 .map_err(|e| format!("Failed to write database: {}", e))?; 2179 2215 2180 - // Also create base64 version 2181 - use base64::{Engine as _, engine::general_purpose::STANDARD}; 2182 - let encoded = STANDARD.encode(&data); 2183 2216 let export_b64 = app_data.join("peek-export.b64"); 2184 2217 std::fs::write(&export_b64, &encoded) 2185 2218 .map_err(|e| format!("Failed to write base64: {}", e))?; 2186 2219 2187 - Ok(format!("Exported {} bytes to app data dir", data.len())) 2220 + export_locations.push("app data".to_string()); 2221 + 2222 + let locations = export_locations.join(" + "); 2223 + Ok(format!("Exported {} bytes to {}", data.len(), locations)) 2188 2224 } 2189 2225 2190 2226 #[tauri::command] ··· 4709 4745 4710 4746 tauri::Builder::default() 4711 4747 .plugin(tauri_plugin_opener::init()) 4712 - .plugin(tauri_plugin_webview::init()) 4713 4748 .setup(move |_app| { 4714 4749 if auto_sync_on_launch { 4715 4750 println!("[Rust] PEEK_AUTO_SYNC enabled - triggering sync on launch");
-2
backend/tauri-mobile/src-tauri/tauri.conf.json
··· 4 4 "version": "0.1.0", 5 5 "identifier": "com.dietrich.peek-mobile", 6 6 "build": { 7 - "beforeDevCommand": "npm run dev", 8 - "devUrl": "http://localhost:1420", 9 7 "beforeBuildCommand": "npm run build", 10 8 "frontendDist": "../dist" 11 9 },
+29
backend/tauri-mobile/src/App.css
··· 426 426 color: #ff3b30; 427 427 } 428 428 429 + .card-action-btn { 430 + -webkit-appearance: none; 431 + appearance: none; 432 + flex-shrink: 0; 433 + background: transparent; 434 + border: none; 435 + padding: 0.25rem; 436 + color: #999; 437 + cursor: pointer; 438 + display: flex; 439 + align-items: center; 440 + justify-content: center; 441 + border-radius: 6px; 442 + } 443 + 444 + .card-action-btn:active { 445 + background: rgba(0, 122, 255, 0.1); 446 + color: #007aff; 447 + } 448 + 429 449 .card-actions { 430 450 display: flex; 431 451 gap: 0.15rem; ··· 927 947 body.dark .card-delete-btn:active { 928 948 background: rgba(255, 69, 58, 0.2); 929 949 color: #ff453a; 950 + } 951 + 952 + body.dark .card-action-btn { 953 + color: #666; 954 + } 955 + 956 + body.dark .card-action-btn:active { 957 + background: rgba(10, 132, 255, 0.2); 958 + color: #0a84ff; 930 959 } 931 960 932 961 body.dark .saved-url-tag {
+1 -1
backend/tauri-mobile/src/App.tsx
··· 3065 3065 }} 3066 3066 style={{ cursor: "pointer" }} 3067 3067 > 3068 - Peek <span style={{ fontSize: '0.5em', opacity: 0.5 }}>v458</span> 3068 + Peek <span style={{ fontSize: '0.5em', opacity: 0.5 }}>v459</span> 3069 3069 </h1> 3070 3070 <div className="filter-icons"> 3071 3071 <button
+375 -412
backend/tauri-mobile/yarn.lock
··· 5 5 version: 8 6 6 cacheKey: 10c0 7 7 8 - "@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": 9 - version: 7.29.0 10 - resolution: "@babel/code-frame@npm:7.29.0" 8 + "@babel/code-frame@npm:^7.27.1": 9 + version: 7.27.1 10 + resolution: "@babel/code-frame@npm:7.27.1" 11 11 dependencies: 12 - "@babel/helper-validator-identifier": "npm:^7.28.5" 12 + "@babel/helper-validator-identifier": "npm:^7.27.1" 13 13 js-tokens: "npm:^4.0.0" 14 14 picocolors: "npm:^1.1.1" 15 - checksum: 10c0/d34cc504e7765dfb576a663d97067afb614525806b5cad1a5cc1a7183b916fec8ff57fa233585e3926fd5a9e6b31aae6df91aa81ae9775fb7a28f658d3346f0d 15 + checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 16 16 languageName: node 17 17 linkType: hard 18 18 19 - "@babel/compat-data@npm:^7.28.6": 20 - version: 7.29.0 21 - resolution: "@babel/compat-data@npm:7.29.0" 22 - checksum: 10c0/08f348554989d23aa801bf1405aa34b15e841c0d52d79da7e524285c77a5f9d298e70e11d91cc578d8e2c9542efc586d50c5f5cf8e1915b254a9dcf786913a94 19 + "@babel/compat-data@npm:^7.27.2": 20 + version: 7.28.5 21 + resolution: "@babel/compat-data@npm:7.28.5" 22 + checksum: 10c0/702a25de73087b0eba325c1d10979eed7c9b6662677386ba7b5aa6eace0fc0676f78343bae080a0176ae26f58bd5535d73b9d0fbb547fef377692e8b249353a7 23 23 languageName: node 24 24 linkType: hard 25 25 26 26 "@babel/core@npm:^7.28.0": 27 - version: 7.29.0 28 - resolution: "@babel/core@npm:7.29.0" 27 + version: 7.28.5 28 + resolution: "@babel/core@npm:7.28.5" 29 29 dependencies: 30 - "@babel/code-frame": "npm:^7.29.0" 31 - "@babel/generator": "npm:^7.29.0" 32 - "@babel/helper-compilation-targets": "npm:^7.28.6" 33 - "@babel/helper-module-transforms": "npm:^7.28.6" 34 - "@babel/helpers": "npm:^7.28.6" 35 - "@babel/parser": "npm:^7.29.0" 36 - "@babel/template": "npm:^7.28.6" 37 - "@babel/traverse": "npm:^7.29.0" 38 - "@babel/types": "npm:^7.29.0" 30 + "@babel/code-frame": "npm:^7.27.1" 31 + "@babel/generator": "npm:^7.28.5" 32 + "@babel/helper-compilation-targets": "npm:^7.27.2" 33 + "@babel/helper-module-transforms": "npm:^7.28.3" 34 + "@babel/helpers": "npm:^7.28.4" 35 + "@babel/parser": "npm:^7.28.5" 36 + "@babel/template": "npm:^7.27.2" 37 + "@babel/traverse": "npm:^7.28.5" 38 + "@babel/types": "npm:^7.28.5" 39 39 "@jridgewell/remapping": "npm:^2.3.5" 40 40 convert-source-map: "npm:^2.0.0" 41 41 debug: "npm:^4.1.0" 42 42 gensync: "npm:^1.0.0-beta.2" 43 43 json5: "npm:^2.2.3" 44 44 semver: "npm:^6.3.1" 45 - checksum: 10c0/5127d2e8e842ae409e11bcbb5c2dff9874abf5415e8026925af7308e903f4f43397341467a130490d1a39884f461bc2b67f3063bce0be44340db89687fd852aa 45 + checksum: 10c0/535f82238027621da6bdffbdbe896ebad3558b311d6f8abc680637a9859b96edbf929ab010757055381570b29cf66c4a295b5618318d27a4273c0e2033925e72 46 46 languageName: node 47 47 linkType: hard 48 48 49 - "@babel/generator@npm:^7.29.0": 50 - version: 7.29.0 51 - resolution: "@babel/generator@npm:7.29.0" 49 + "@babel/generator@npm:^7.28.5": 50 + version: 7.28.5 51 + resolution: "@babel/generator@npm:7.28.5" 52 52 dependencies: 53 - "@babel/parser": "npm:^7.29.0" 54 - "@babel/types": "npm:^7.29.0" 53 + "@babel/parser": "npm:^7.28.5" 54 + "@babel/types": "npm:^7.28.5" 55 55 "@jridgewell/gen-mapping": "npm:^0.3.12" 56 56 "@jridgewell/trace-mapping": "npm:^0.3.28" 57 57 jsesc: "npm:^3.0.2" 58 - checksum: 10c0/5c3df8f2475bfd5f97ad0211c52171aff630088b148e7b89d056b39d69855179bc9f2d1ee200263c76c2398a49e4fdbb38b9709ebc4f043cc04d9ee09a66668a 58 + checksum: 10c0/9f219fe1d5431b6919f1a5c60db8d5d34fe546c0d8f5a8511b32f847569234ffc8032beb9e7404649a143f54e15224ecb53a3d11b6bb85c3203e573d91fca752 59 59 languageName: node 60 60 linkType: hard 61 61 62 - "@babel/helper-compilation-targets@npm:^7.28.6": 63 - version: 7.28.6 64 - resolution: "@babel/helper-compilation-targets@npm:7.28.6" 62 + "@babel/helper-compilation-targets@npm:^7.27.2": 63 + version: 7.27.2 64 + resolution: "@babel/helper-compilation-targets@npm:7.27.2" 65 65 dependencies: 66 - "@babel/compat-data": "npm:^7.28.6" 66 + "@babel/compat-data": "npm:^7.27.2" 67 67 "@babel/helper-validator-option": "npm:^7.27.1" 68 68 browserslist: "npm:^4.24.0" 69 69 lru-cache: "npm:^5.1.1" 70 70 semver: "npm:^6.3.1" 71 - checksum: 10c0/3fcdf3b1b857a1578e99d20508859dbd3f22f3c87b8a0f3dc540627b4be539bae7f6e61e49d931542fe5b557545347272bbdacd7f58a5c77025a18b745593a50 71 + checksum: 10c0/f338fa00dcfea931804a7c55d1a1c81b6f0a09787e528ec580d5c21b3ecb3913f6cb0f361368973ce953b824d910d3ac3e8a8ee15192710d3563826447193ad1 72 72 languageName: node 73 73 linkType: hard 74 74 ··· 79 79 languageName: node 80 80 linkType: hard 81 81 82 - "@babel/helper-module-imports@npm:^7.28.6": 83 - version: 7.28.6 84 - resolution: "@babel/helper-module-imports@npm:7.28.6" 82 + "@babel/helper-module-imports@npm:^7.27.1": 83 + version: 7.27.1 84 + resolution: "@babel/helper-module-imports@npm:7.27.1" 85 85 dependencies: 86 - "@babel/traverse": "npm:^7.28.6" 87 - "@babel/types": "npm:^7.28.6" 88 - checksum: 10c0/b49d8d8f204d9dbfd5ac70c54e533e5269afb3cea966a9d976722b13e9922cc773a653405f53c89acb247d5aebdae4681d631a3ae3df77ec046b58da76eda2ac 86 + "@babel/traverse": "npm:^7.27.1" 87 + "@babel/types": "npm:^7.27.1" 88 + checksum: 10c0/e00aace096e4e29290ff8648455c2bc4ed982f0d61dbf2db1b5e750b9b98f318bf5788d75a4f974c151bd318fd549e81dbcab595f46b14b81c12eda3023f51e8 89 89 languageName: node 90 90 linkType: hard 91 91 92 - "@babel/helper-module-transforms@npm:^7.28.6": 93 - version: 7.28.6 94 - resolution: "@babel/helper-module-transforms@npm:7.28.6" 92 + "@babel/helper-module-transforms@npm:^7.28.3": 93 + version: 7.28.3 94 + resolution: "@babel/helper-module-transforms@npm:7.28.3" 95 95 dependencies: 96 - "@babel/helper-module-imports": "npm:^7.28.6" 97 - "@babel/helper-validator-identifier": "npm:^7.28.5" 98 - "@babel/traverse": "npm:^7.28.6" 96 + "@babel/helper-module-imports": "npm:^7.27.1" 97 + "@babel/helper-validator-identifier": "npm:^7.27.1" 98 + "@babel/traverse": "npm:^7.28.3" 99 99 peerDependencies: 100 100 "@babel/core": ^7.0.0 101 - checksum: 10c0/6f03e14fc30b287ce0b839474b5f271e72837d0cafe6b172d759184d998fbee3903a035e81e07c2c596449e504f453463d58baa65b6f40a37ded5bec74620b2b 101 + checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb 102 102 languageName: node 103 103 linkType: hard 104 104 105 105 "@babel/helper-plugin-utils@npm:^7.27.1": 106 - version: 7.28.6 107 - resolution: "@babel/helper-plugin-utils@npm:7.28.6" 108 - checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d 106 + version: 7.27.1 107 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" 108 + checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b 109 109 languageName: node 110 110 linkType: hard 111 111 ··· 116 116 languageName: node 117 117 linkType: hard 118 118 119 - "@babel/helper-validator-identifier@npm:^7.28.5": 119 + "@babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": 120 120 version: 7.28.5 121 121 resolution: "@babel/helper-validator-identifier@npm:7.28.5" 122 122 checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 ··· 130 130 languageName: node 131 131 linkType: hard 132 132 133 - "@babel/helpers@npm:^7.28.6": 134 - version: 7.28.6 135 - resolution: "@babel/helpers@npm:7.28.6" 133 + "@babel/helpers@npm:^7.28.4": 134 + version: 7.28.4 135 + resolution: "@babel/helpers@npm:7.28.4" 136 136 dependencies: 137 - "@babel/template": "npm:^7.28.6" 138 - "@babel/types": "npm:^7.28.6" 139 - checksum: 10c0/c4a779c66396bb0cf619402d92f1610601ff3832db2d3b86b9c9dd10983bf79502270e97ac6d5280cea1b1a37de2f06ecbac561bd2271545270407fbe64027cb 137 + "@babel/template": "npm:^7.27.2" 138 + "@babel/types": "npm:^7.28.4" 139 + checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 140 140 languageName: node 141 141 linkType: hard 142 142 143 - "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": 144 - version: 7.29.0 145 - resolution: "@babel/parser@npm:7.29.0" 143 + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5": 144 + version: 7.28.5 145 + resolution: "@babel/parser@npm:7.28.5" 146 146 dependencies: 147 - "@babel/types": "npm:^7.29.0" 147 + "@babel/types": "npm:^7.28.5" 148 148 bin: 149 149 parser: ./bin/babel-parser.js 150 - checksum: 10c0/333b2aa761264b91577a74bee86141ef733f9f9f6d4fc52548e4847dc35dfbf821f58c46832c637bfa761a6d9909d6a68f7d1ed59e17e4ffbb958dc510c17b62 150 + checksum: 10c0/5bbe48bf2c79594ac02b490a41ffde7ef5aa22a9a88ad6bcc78432a6ba8a9d638d531d868bd1f104633f1f6bba9905746e15185b8276a3756c42b765d131b1ef 151 151 languageName: node 152 152 linkType: hard 153 153 ··· 173 173 languageName: node 174 174 linkType: hard 175 175 176 - "@babel/template@npm:^7.28.6": 177 - version: 7.28.6 178 - resolution: "@babel/template@npm:7.28.6" 176 + "@babel/template@npm:^7.27.2": 177 + version: 7.27.2 178 + resolution: "@babel/template@npm:7.27.2" 179 179 dependencies: 180 - "@babel/code-frame": "npm:^7.28.6" 181 - "@babel/parser": "npm:^7.28.6" 182 - "@babel/types": "npm:^7.28.6" 183 - checksum: 10c0/66d87225ed0bc77f888181ae2d97845021838c619944877f7c4398c6748bcf611f216dfd6be74d39016af502bca876e6ce6873db3c49e4ac354c56d34d57e9f5 180 + "@babel/code-frame": "npm:^7.27.1" 181 + "@babel/parser": "npm:^7.27.2" 182 + "@babel/types": "npm:^7.27.1" 183 + checksum: 10c0/ed9e9022651e463cc5f2cc21942f0e74544f1754d231add6348ff1b472985a3b3502041c0be62dc99ed2d12cfae0c51394bf827452b98a2f8769c03b87aadc81 184 184 languageName: node 185 185 linkType: hard 186 186 187 - "@babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": 188 - version: 7.29.0 189 - resolution: "@babel/traverse@npm:7.29.0" 187 + "@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.5": 188 + version: 7.28.5 189 + resolution: "@babel/traverse@npm:7.28.5" 190 190 dependencies: 191 - "@babel/code-frame": "npm:^7.29.0" 192 - "@babel/generator": "npm:^7.29.0" 191 + "@babel/code-frame": "npm:^7.27.1" 192 + "@babel/generator": "npm:^7.28.5" 193 193 "@babel/helper-globals": "npm:^7.28.0" 194 - "@babel/parser": "npm:^7.29.0" 195 - "@babel/template": "npm:^7.28.6" 196 - "@babel/types": "npm:^7.29.0" 194 + "@babel/parser": "npm:^7.28.5" 195 + "@babel/template": "npm:^7.27.2" 196 + "@babel/types": "npm:^7.28.5" 197 197 debug: "npm:^4.3.1" 198 - checksum: 10c0/f63ef6e58d02a9fbf3c0e2e5f1c877da3e0bc57f91a19d2223d53e356a76859cbaf51171c9211c71816d94a0e69efa2732fd27ffc0e1bbc84b636e60932333eb 198 + checksum: 10c0/f6c4a595993ae2b73f2d4cd9c062f2e232174d293edd4abe1d715bd6281da8d99e47c65857e8d0917d9384c65972f4acdebc6749a7c40a8fcc38b3c7fb3e706f 199 199 languageName: node 200 200 linkType: hard 201 201 202 - "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": 203 - version: 7.29.0 204 - resolution: "@babel/types@npm:7.29.0" 202 + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5": 203 + version: 7.28.5 204 + resolution: "@babel/types@npm:7.28.5" 205 205 dependencies: 206 206 "@babel/helper-string-parser": "npm:^7.27.1" 207 207 "@babel/helper-validator-identifier": "npm:^7.28.5" 208 - checksum: 10c0/23cc3466e83bcbfab8b9bd0edaafdb5d4efdb88b82b3be6728bbade5ba2f0996f84f63b1c5f7a8c0d67efded28300898a5f930b171bb40b311bca2029c4e9b4f 208 + checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a 209 209 languageName: node 210 210 linkType: hard 211 211 212 - "@esbuild/aix-ppc64@npm:0.27.2": 213 - version: 0.27.2 214 - resolution: "@esbuild/aix-ppc64@npm:0.27.2" 212 + "@esbuild/aix-ppc64@npm:0.25.12": 213 + version: 0.25.12 214 + resolution: "@esbuild/aix-ppc64@npm:0.25.12" 215 215 conditions: os=aix & cpu=ppc64 216 216 languageName: node 217 217 linkType: hard 218 218 219 - "@esbuild/android-arm64@npm:0.27.2": 220 - version: 0.27.2 221 - resolution: "@esbuild/android-arm64@npm:0.27.2" 219 + "@esbuild/android-arm64@npm:0.25.12": 220 + version: 0.25.12 221 + resolution: "@esbuild/android-arm64@npm:0.25.12" 222 222 conditions: os=android & cpu=arm64 223 223 languageName: node 224 224 linkType: hard 225 225 226 - "@esbuild/android-arm@npm:0.27.2": 227 - version: 0.27.2 228 - resolution: "@esbuild/android-arm@npm:0.27.2" 226 + "@esbuild/android-arm@npm:0.25.12": 227 + version: 0.25.12 228 + resolution: "@esbuild/android-arm@npm:0.25.12" 229 229 conditions: os=android & cpu=arm 230 230 languageName: node 231 231 linkType: hard 232 232 233 - "@esbuild/android-x64@npm:0.27.2": 234 - version: 0.27.2 235 - resolution: "@esbuild/android-x64@npm:0.27.2" 233 + "@esbuild/android-x64@npm:0.25.12": 234 + version: 0.25.12 235 + resolution: "@esbuild/android-x64@npm:0.25.12" 236 236 conditions: os=android & cpu=x64 237 237 languageName: node 238 238 linkType: hard 239 239 240 - "@esbuild/darwin-arm64@npm:0.27.2": 241 - version: 0.27.2 242 - resolution: "@esbuild/darwin-arm64@npm:0.27.2" 240 + "@esbuild/darwin-arm64@npm:0.25.12": 241 + version: 0.25.12 242 + resolution: "@esbuild/darwin-arm64@npm:0.25.12" 243 243 conditions: os=darwin & cpu=arm64 244 244 languageName: node 245 245 linkType: hard 246 246 247 - "@esbuild/darwin-x64@npm:0.27.2": 248 - version: 0.27.2 249 - resolution: "@esbuild/darwin-x64@npm:0.27.2" 247 + "@esbuild/darwin-x64@npm:0.25.12": 248 + version: 0.25.12 249 + resolution: "@esbuild/darwin-x64@npm:0.25.12" 250 250 conditions: os=darwin & cpu=x64 251 251 languageName: node 252 252 linkType: hard 253 253 254 - "@esbuild/freebsd-arm64@npm:0.27.2": 255 - version: 0.27.2 256 - resolution: "@esbuild/freebsd-arm64@npm:0.27.2" 254 + "@esbuild/freebsd-arm64@npm:0.25.12": 255 + version: 0.25.12 256 + resolution: "@esbuild/freebsd-arm64@npm:0.25.12" 257 257 conditions: os=freebsd & cpu=arm64 258 258 languageName: node 259 259 linkType: hard 260 260 261 - "@esbuild/freebsd-x64@npm:0.27.2": 262 - version: 0.27.2 263 - resolution: "@esbuild/freebsd-x64@npm:0.27.2" 261 + "@esbuild/freebsd-x64@npm:0.25.12": 262 + version: 0.25.12 263 + resolution: "@esbuild/freebsd-x64@npm:0.25.12" 264 264 conditions: os=freebsd & cpu=x64 265 265 languageName: node 266 266 linkType: hard 267 267 268 - "@esbuild/linux-arm64@npm:0.27.2": 269 - version: 0.27.2 270 - resolution: "@esbuild/linux-arm64@npm:0.27.2" 268 + "@esbuild/linux-arm64@npm:0.25.12": 269 + version: 0.25.12 270 + resolution: "@esbuild/linux-arm64@npm:0.25.12" 271 271 conditions: os=linux & cpu=arm64 272 272 languageName: node 273 273 linkType: hard 274 274 275 - "@esbuild/linux-arm@npm:0.27.2": 276 - version: 0.27.2 277 - resolution: "@esbuild/linux-arm@npm:0.27.2" 275 + "@esbuild/linux-arm@npm:0.25.12": 276 + version: 0.25.12 277 + resolution: "@esbuild/linux-arm@npm:0.25.12" 278 278 conditions: os=linux & cpu=arm 279 279 languageName: node 280 280 linkType: hard 281 281 282 - "@esbuild/linux-ia32@npm:0.27.2": 283 - version: 0.27.2 284 - resolution: "@esbuild/linux-ia32@npm:0.27.2" 282 + "@esbuild/linux-ia32@npm:0.25.12": 283 + version: 0.25.12 284 + resolution: "@esbuild/linux-ia32@npm:0.25.12" 285 285 conditions: os=linux & cpu=ia32 286 286 languageName: node 287 287 linkType: hard 288 288 289 - "@esbuild/linux-loong64@npm:0.27.2": 290 - version: 0.27.2 291 - resolution: "@esbuild/linux-loong64@npm:0.27.2" 289 + "@esbuild/linux-loong64@npm:0.25.12": 290 + version: 0.25.12 291 + resolution: "@esbuild/linux-loong64@npm:0.25.12" 292 292 conditions: os=linux & cpu=loong64 293 293 languageName: node 294 294 linkType: hard 295 295 296 - "@esbuild/linux-mips64el@npm:0.27.2": 297 - version: 0.27.2 298 - resolution: "@esbuild/linux-mips64el@npm:0.27.2" 296 + "@esbuild/linux-mips64el@npm:0.25.12": 297 + version: 0.25.12 298 + resolution: "@esbuild/linux-mips64el@npm:0.25.12" 299 299 conditions: os=linux & cpu=mips64el 300 300 languageName: node 301 301 linkType: hard 302 302 303 - "@esbuild/linux-ppc64@npm:0.27.2": 304 - version: 0.27.2 305 - resolution: "@esbuild/linux-ppc64@npm:0.27.2" 303 + "@esbuild/linux-ppc64@npm:0.25.12": 304 + version: 0.25.12 305 + resolution: "@esbuild/linux-ppc64@npm:0.25.12" 306 306 conditions: os=linux & cpu=ppc64 307 307 languageName: node 308 308 linkType: hard 309 309 310 - "@esbuild/linux-riscv64@npm:0.27.2": 311 - version: 0.27.2 312 - resolution: "@esbuild/linux-riscv64@npm:0.27.2" 310 + "@esbuild/linux-riscv64@npm:0.25.12": 311 + version: 0.25.12 312 + resolution: "@esbuild/linux-riscv64@npm:0.25.12" 313 313 conditions: os=linux & cpu=riscv64 314 314 languageName: node 315 315 linkType: hard 316 316 317 - "@esbuild/linux-s390x@npm:0.27.2": 318 - version: 0.27.2 319 - resolution: "@esbuild/linux-s390x@npm:0.27.2" 317 + "@esbuild/linux-s390x@npm:0.25.12": 318 + version: 0.25.12 319 + resolution: "@esbuild/linux-s390x@npm:0.25.12" 320 320 conditions: os=linux & cpu=s390x 321 321 languageName: node 322 322 linkType: hard 323 323 324 - "@esbuild/linux-x64@npm:0.27.2": 325 - version: 0.27.2 326 - resolution: "@esbuild/linux-x64@npm:0.27.2" 324 + "@esbuild/linux-x64@npm:0.25.12": 325 + version: 0.25.12 326 + resolution: "@esbuild/linux-x64@npm:0.25.12" 327 327 conditions: os=linux & cpu=x64 328 328 languageName: node 329 329 linkType: hard 330 330 331 - "@esbuild/netbsd-arm64@npm:0.27.2": 332 - version: 0.27.2 333 - resolution: "@esbuild/netbsd-arm64@npm:0.27.2" 331 + "@esbuild/netbsd-arm64@npm:0.25.12": 332 + version: 0.25.12 333 + resolution: "@esbuild/netbsd-arm64@npm:0.25.12" 334 334 conditions: os=netbsd & cpu=arm64 335 335 languageName: node 336 336 linkType: hard 337 337 338 - "@esbuild/netbsd-x64@npm:0.27.2": 339 - version: 0.27.2 340 - resolution: "@esbuild/netbsd-x64@npm:0.27.2" 338 + "@esbuild/netbsd-x64@npm:0.25.12": 339 + version: 0.25.12 340 + resolution: "@esbuild/netbsd-x64@npm:0.25.12" 341 341 conditions: os=netbsd & cpu=x64 342 342 languageName: node 343 343 linkType: hard 344 344 345 - "@esbuild/openbsd-arm64@npm:0.27.2": 346 - version: 0.27.2 347 - resolution: "@esbuild/openbsd-arm64@npm:0.27.2" 345 + "@esbuild/openbsd-arm64@npm:0.25.12": 346 + version: 0.25.12 347 + resolution: "@esbuild/openbsd-arm64@npm:0.25.12" 348 348 conditions: os=openbsd & cpu=arm64 349 349 languageName: node 350 350 linkType: hard 351 351 352 - "@esbuild/openbsd-x64@npm:0.27.2": 353 - version: 0.27.2 354 - resolution: "@esbuild/openbsd-x64@npm:0.27.2" 352 + "@esbuild/openbsd-x64@npm:0.25.12": 353 + version: 0.25.12 354 + resolution: "@esbuild/openbsd-x64@npm:0.25.12" 355 355 conditions: os=openbsd & cpu=x64 356 356 languageName: node 357 357 linkType: hard 358 358 359 - "@esbuild/openharmony-arm64@npm:0.27.2": 360 - version: 0.27.2 361 - resolution: "@esbuild/openharmony-arm64@npm:0.27.2" 359 + "@esbuild/openharmony-arm64@npm:0.25.12": 360 + version: 0.25.12 361 + resolution: "@esbuild/openharmony-arm64@npm:0.25.12" 362 362 conditions: os=openharmony & cpu=arm64 363 363 languageName: node 364 364 linkType: hard 365 365 366 - "@esbuild/sunos-x64@npm:0.27.2": 367 - version: 0.27.2 368 - resolution: "@esbuild/sunos-x64@npm:0.27.2" 366 + "@esbuild/sunos-x64@npm:0.25.12": 367 + version: 0.25.12 368 + resolution: "@esbuild/sunos-x64@npm:0.25.12" 369 369 conditions: os=sunos & cpu=x64 370 370 languageName: node 371 371 linkType: hard 372 372 373 - "@esbuild/win32-arm64@npm:0.27.2": 374 - version: 0.27.2 375 - resolution: "@esbuild/win32-arm64@npm:0.27.2" 373 + "@esbuild/win32-arm64@npm:0.25.12": 374 + version: 0.25.12 375 + resolution: "@esbuild/win32-arm64@npm:0.25.12" 376 376 conditions: os=win32 & cpu=arm64 377 377 languageName: node 378 378 linkType: hard 379 379 380 - "@esbuild/win32-ia32@npm:0.27.2": 381 - version: 0.27.2 382 - resolution: "@esbuild/win32-ia32@npm:0.27.2" 380 + "@esbuild/win32-ia32@npm:0.25.12": 381 + version: 0.25.12 382 + resolution: "@esbuild/win32-ia32@npm:0.25.12" 383 383 conditions: os=win32 & cpu=ia32 384 384 languageName: node 385 385 linkType: hard 386 386 387 - "@esbuild/win32-x64@npm:0.27.2": 388 - version: 0.27.2 389 - resolution: "@esbuild/win32-x64@npm:0.27.2" 387 + "@esbuild/win32-x64@npm:0.25.12": 388 + version: 0.25.12 389 + resolution: "@esbuild/win32-x64@npm:0.25.12" 390 390 conditions: os=win32 & cpu=x64 391 391 languageName: node 392 392 linkType: hard ··· 489 489 languageName: node 490 490 linkType: hard 491 491 492 - "@rollup/rollup-android-arm-eabi@npm:4.57.1": 493 - version: 4.57.1 494 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.57.1" 492 + "@rollup/rollup-android-arm-eabi@npm:4.53.2": 493 + version: 4.53.2 494 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.53.2" 495 495 conditions: os=android & cpu=arm 496 496 languageName: node 497 497 linkType: hard 498 498 499 - "@rollup/rollup-android-arm64@npm:4.57.1": 500 - version: 4.57.1 501 - resolution: "@rollup/rollup-android-arm64@npm:4.57.1" 499 + "@rollup/rollup-android-arm64@npm:4.53.2": 500 + version: 4.53.2 501 + resolution: "@rollup/rollup-android-arm64@npm:4.53.2" 502 502 conditions: os=android & cpu=arm64 503 503 languageName: node 504 504 linkType: hard 505 505 506 - "@rollup/rollup-darwin-arm64@npm:4.57.1": 507 - version: 4.57.1 508 - resolution: "@rollup/rollup-darwin-arm64@npm:4.57.1" 506 + "@rollup/rollup-darwin-arm64@npm:4.53.2": 507 + version: 4.53.2 508 + resolution: "@rollup/rollup-darwin-arm64@npm:4.53.2" 509 509 conditions: os=darwin & cpu=arm64 510 510 languageName: node 511 511 linkType: hard 512 512 513 - "@rollup/rollup-darwin-x64@npm:4.57.1": 514 - version: 4.57.1 515 - resolution: "@rollup/rollup-darwin-x64@npm:4.57.1" 513 + "@rollup/rollup-darwin-x64@npm:4.53.2": 514 + version: 4.53.2 515 + resolution: "@rollup/rollup-darwin-x64@npm:4.53.2" 516 516 conditions: os=darwin & cpu=x64 517 517 languageName: node 518 518 linkType: hard 519 519 520 - "@rollup/rollup-freebsd-arm64@npm:4.57.1": 521 - version: 4.57.1 522 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.57.1" 520 + "@rollup/rollup-freebsd-arm64@npm:4.53.2": 521 + version: 4.53.2 522 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.53.2" 523 523 conditions: os=freebsd & cpu=arm64 524 524 languageName: node 525 525 linkType: hard 526 526 527 - "@rollup/rollup-freebsd-x64@npm:4.57.1": 528 - version: 4.57.1 529 - resolution: "@rollup/rollup-freebsd-x64@npm:4.57.1" 527 + "@rollup/rollup-freebsd-x64@npm:4.53.2": 528 + version: 4.53.2 529 + resolution: "@rollup/rollup-freebsd-x64@npm:4.53.2" 530 530 conditions: os=freebsd & cpu=x64 531 531 languageName: node 532 532 linkType: hard 533 533 534 - "@rollup/rollup-linux-arm-gnueabihf@npm:4.57.1": 535 - version: 4.57.1 536 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.57.1" 534 + "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2": 535 + version: 4.53.2 536 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.2" 537 537 conditions: os=linux & cpu=arm & libc=glibc 538 538 languageName: node 539 539 linkType: hard 540 540 541 - "@rollup/rollup-linux-arm-musleabihf@npm:4.57.1": 542 - version: 4.57.1 543 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.57.1" 541 + "@rollup/rollup-linux-arm-musleabihf@npm:4.53.2": 542 + version: 4.53.2 543 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.53.2" 544 544 conditions: os=linux & cpu=arm & libc=musl 545 545 languageName: node 546 546 linkType: hard 547 547 548 - "@rollup/rollup-linux-arm64-gnu@npm:4.57.1": 549 - version: 4.57.1 550 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.57.1" 548 + "@rollup/rollup-linux-arm64-gnu@npm:4.53.2": 549 + version: 4.53.2 550 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.53.2" 551 551 conditions: os=linux & cpu=arm64 & libc=glibc 552 552 languageName: node 553 553 linkType: hard 554 554 555 - "@rollup/rollup-linux-arm64-musl@npm:4.57.1": 556 - version: 4.57.1 557 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.57.1" 555 + "@rollup/rollup-linux-arm64-musl@npm:4.53.2": 556 + version: 4.53.2 557 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.53.2" 558 558 conditions: os=linux & cpu=arm64 & libc=musl 559 559 languageName: node 560 560 linkType: hard 561 561 562 - "@rollup/rollup-linux-loong64-gnu@npm:4.57.1": 563 - version: 4.57.1 564 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.57.1" 562 + "@rollup/rollup-linux-loong64-gnu@npm:4.53.2": 563 + version: 4.53.2 564 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.53.2" 565 565 conditions: os=linux & cpu=loong64 & libc=glibc 566 566 languageName: node 567 567 linkType: hard 568 568 569 - "@rollup/rollup-linux-loong64-musl@npm:4.57.1": 570 - version: 4.57.1 571 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.57.1" 572 - conditions: os=linux & cpu=loong64 & libc=musl 573 - languageName: node 574 - linkType: hard 575 - 576 - "@rollup/rollup-linux-ppc64-gnu@npm:4.57.1": 577 - version: 4.57.1 578 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.57.1" 569 + "@rollup/rollup-linux-ppc64-gnu@npm:4.53.2": 570 + version: 4.53.2 571 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.53.2" 579 572 conditions: os=linux & cpu=ppc64 & libc=glibc 580 573 languageName: node 581 574 linkType: hard 582 575 583 - "@rollup/rollup-linux-ppc64-musl@npm:4.57.1": 584 - version: 4.57.1 585 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.57.1" 586 - conditions: os=linux & cpu=ppc64 & libc=musl 587 - languageName: node 588 - linkType: hard 589 - 590 - "@rollup/rollup-linux-riscv64-gnu@npm:4.57.1": 591 - version: 4.57.1 592 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.57.1" 576 + "@rollup/rollup-linux-riscv64-gnu@npm:4.53.2": 577 + version: 4.53.2 578 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.53.2" 593 579 conditions: os=linux & cpu=riscv64 & libc=glibc 594 580 languageName: node 595 581 linkType: hard 596 582 597 - "@rollup/rollup-linux-riscv64-musl@npm:4.57.1": 598 - version: 4.57.1 599 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.57.1" 583 + "@rollup/rollup-linux-riscv64-musl@npm:4.53.2": 584 + version: 4.53.2 585 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.53.2" 600 586 conditions: os=linux & cpu=riscv64 & libc=musl 601 587 languageName: node 602 588 linkType: hard 603 589 604 - "@rollup/rollup-linux-s390x-gnu@npm:4.57.1": 605 - version: 4.57.1 606 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.57.1" 590 + "@rollup/rollup-linux-s390x-gnu@npm:4.53.2": 591 + version: 4.53.2 592 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.53.2" 607 593 conditions: os=linux & cpu=s390x & libc=glibc 608 594 languageName: node 609 595 linkType: hard 610 596 611 - "@rollup/rollup-linux-x64-gnu@npm:4.57.1": 612 - version: 4.57.1 613 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.57.1" 597 + "@rollup/rollup-linux-x64-gnu@npm:4.53.2": 598 + version: 4.53.2 599 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.53.2" 614 600 conditions: os=linux & cpu=x64 & libc=glibc 615 601 languageName: node 616 602 linkType: hard 617 603 618 - "@rollup/rollup-linux-x64-musl@npm:4.57.1": 619 - version: 4.57.1 620 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.57.1" 604 + "@rollup/rollup-linux-x64-musl@npm:4.53.2": 605 + version: 4.53.2 606 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.53.2" 621 607 conditions: os=linux & cpu=x64 & libc=musl 622 608 languageName: node 623 609 linkType: hard 624 610 625 - "@rollup/rollup-openbsd-x64@npm:4.57.1": 626 - version: 4.57.1 627 - resolution: "@rollup/rollup-openbsd-x64@npm:4.57.1" 628 - conditions: os=openbsd & cpu=x64 629 - languageName: node 630 - linkType: hard 631 - 632 - "@rollup/rollup-openharmony-arm64@npm:4.57.1": 633 - version: 4.57.1 634 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.57.1" 611 + "@rollup/rollup-openharmony-arm64@npm:4.53.2": 612 + version: 4.53.2 613 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.53.2" 635 614 conditions: os=openharmony & cpu=arm64 636 615 languageName: node 637 616 linkType: hard 638 617 639 - "@rollup/rollup-win32-arm64-msvc@npm:4.57.1": 640 - version: 4.57.1 641 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.57.1" 618 + "@rollup/rollup-win32-arm64-msvc@npm:4.53.2": 619 + version: 4.53.2 620 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.53.2" 642 621 conditions: os=win32 & cpu=arm64 643 622 languageName: node 644 623 linkType: hard 645 624 646 - "@rollup/rollup-win32-ia32-msvc@npm:4.57.1": 647 - version: 4.57.1 648 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.57.1" 625 + "@rollup/rollup-win32-ia32-msvc@npm:4.53.2": 626 + version: 4.53.2 627 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.53.2" 649 628 conditions: os=win32 & cpu=ia32 650 629 languageName: node 651 630 linkType: hard 652 631 653 - "@rollup/rollup-win32-x64-gnu@npm:4.57.1": 654 - version: 4.57.1 655 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.57.1" 632 + "@rollup/rollup-win32-x64-gnu@npm:4.53.2": 633 + version: 4.53.2 634 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.53.2" 656 635 conditions: os=win32 & cpu=x64 657 636 languageName: node 658 637 linkType: hard 659 638 660 - "@rollup/rollup-win32-x64-msvc@npm:4.57.1": 661 - version: 4.57.1 662 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.57.1" 639 + "@rollup/rollup-win32-x64-msvc@npm:4.53.2": 640 + version: 4.53.2 641 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.53.2" 663 642 conditions: os=win32 & cpu=x64 664 643 languageName: node 665 644 linkType: hard 666 645 667 - "@tauri-apps/api@npm:2.9.1": 646 + "@tauri-apps/api@npm:2.9.1, @tauri-apps/api@npm:^2.8.0": 668 647 version: 2.9.1 669 648 resolution: "@tauri-apps/api@npm:2.9.1" 670 649 checksum: 10c0/18c76ec58b579860bfde5cd5b5ea6c3b13019d356c17d436bf395cafdf15dd1f277364cacd24cc94e5d4aa3816f39698f231773d2a18625e98702295ab0c2c8f 671 650 languageName: node 672 651 linkType: hard 673 652 674 - "@tauri-apps/api@npm:^2.8.0": 675 - version: 2.10.1 676 - resolution: "@tauri-apps/api@npm:2.10.1" 677 - checksum: 10c0/f3c0b2ba67a0b887440a7faa1e0589e847760ee30ec29b964f22573a46b817cb3af2199d6f5f7dfdda54d65b465ebaaa280454c610a5c53d808a0911fa15e45d 678 - languageName: node 679 - linkType: hard 680 - 681 - "@tauri-apps/cli-darwin-arm64@npm:2.10.0": 682 - version: 2.10.0 683 - resolution: "@tauri-apps/cli-darwin-arm64@npm:2.10.0" 653 + "@tauri-apps/cli-darwin-arm64@npm:2.9.4": 654 + version: 2.9.4 655 + resolution: "@tauri-apps/cli-darwin-arm64@npm:2.9.4" 684 656 conditions: os=darwin & cpu=arm64 685 657 languageName: node 686 658 linkType: hard 687 659 688 - "@tauri-apps/cli-darwin-x64@npm:2.10.0": 689 - version: 2.10.0 690 - resolution: "@tauri-apps/cli-darwin-x64@npm:2.10.0" 660 + "@tauri-apps/cli-darwin-x64@npm:2.9.4": 661 + version: 2.9.4 662 + resolution: "@tauri-apps/cli-darwin-x64@npm:2.9.4" 691 663 conditions: os=darwin & cpu=x64 692 664 languageName: node 693 665 linkType: hard 694 666 695 - "@tauri-apps/cli-linux-arm-gnueabihf@npm:2.10.0": 696 - version: 2.10.0 697 - resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:2.10.0" 667 + "@tauri-apps/cli-linux-arm-gnueabihf@npm:2.9.4": 668 + version: 2.9.4 669 + resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:2.9.4" 698 670 conditions: os=linux & cpu=arm 699 671 languageName: node 700 672 linkType: hard 701 673 702 - "@tauri-apps/cli-linux-arm64-gnu@npm:2.10.0": 703 - version: 2.10.0 704 - resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:2.10.0" 674 + "@tauri-apps/cli-linux-arm64-gnu@npm:2.9.4": 675 + version: 2.9.4 676 + resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:2.9.4" 705 677 conditions: os=linux & cpu=arm64 & libc=glibc 706 678 languageName: node 707 679 linkType: hard 708 680 709 - "@tauri-apps/cli-linux-arm64-musl@npm:2.10.0": 710 - version: 2.10.0 711 - resolution: "@tauri-apps/cli-linux-arm64-musl@npm:2.10.0" 681 + "@tauri-apps/cli-linux-arm64-musl@npm:2.9.4": 682 + version: 2.9.4 683 + resolution: "@tauri-apps/cli-linux-arm64-musl@npm:2.9.4" 712 684 conditions: os=linux & cpu=arm64 & libc=musl 713 685 languageName: node 714 686 linkType: hard 715 687 716 - "@tauri-apps/cli-linux-riscv64-gnu@npm:2.10.0": 717 - version: 2.10.0 718 - resolution: "@tauri-apps/cli-linux-riscv64-gnu@npm:2.10.0" 688 + "@tauri-apps/cli-linux-riscv64-gnu@npm:2.9.4": 689 + version: 2.9.4 690 + resolution: "@tauri-apps/cli-linux-riscv64-gnu@npm:2.9.4" 719 691 conditions: os=linux & cpu=riscv64 & libc=glibc 720 692 languageName: node 721 693 linkType: hard 722 694 723 - "@tauri-apps/cli-linux-x64-gnu@npm:2.10.0": 724 - version: 2.10.0 725 - resolution: "@tauri-apps/cli-linux-x64-gnu@npm:2.10.0" 695 + "@tauri-apps/cli-linux-x64-gnu@npm:2.9.4": 696 + version: 2.9.4 697 + resolution: "@tauri-apps/cli-linux-x64-gnu@npm:2.9.4" 726 698 conditions: os=linux & cpu=x64 & libc=glibc 727 699 languageName: node 728 700 linkType: hard 729 701 730 - "@tauri-apps/cli-linux-x64-musl@npm:2.10.0": 731 - version: 2.10.0 732 - resolution: "@tauri-apps/cli-linux-x64-musl@npm:2.10.0" 702 + "@tauri-apps/cli-linux-x64-musl@npm:2.9.4": 703 + version: 2.9.4 704 + resolution: "@tauri-apps/cli-linux-x64-musl@npm:2.9.4" 733 705 conditions: os=linux & cpu=x64 & libc=musl 734 706 languageName: node 735 707 linkType: hard 736 708 737 - "@tauri-apps/cli-win32-arm64-msvc@npm:2.10.0": 738 - version: 2.10.0 739 - resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:2.10.0" 709 + "@tauri-apps/cli-win32-arm64-msvc@npm:2.9.4": 710 + version: 2.9.4 711 + resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:2.9.4" 740 712 conditions: os=win32 & cpu=arm64 741 713 languageName: node 742 714 linkType: hard 743 715 744 - "@tauri-apps/cli-win32-ia32-msvc@npm:2.10.0": 745 - version: 2.10.0 746 - resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:2.10.0" 716 + "@tauri-apps/cli-win32-ia32-msvc@npm:2.9.4": 717 + version: 2.9.4 718 + resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:2.9.4" 747 719 conditions: os=win32 & cpu=ia32 748 720 languageName: node 749 721 linkType: hard 750 722 751 - "@tauri-apps/cli-win32-x64-msvc@npm:2.10.0": 752 - version: 2.10.0 753 - resolution: "@tauri-apps/cli-win32-x64-msvc@npm:2.10.0" 723 + "@tauri-apps/cli-win32-x64-msvc@npm:2.9.4": 724 + version: 2.9.4 725 + resolution: "@tauri-apps/cli-win32-x64-msvc@npm:2.9.4" 754 726 conditions: os=win32 & cpu=x64 755 727 languageName: node 756 728 linkType: hard 757 729 758 730 "@tauri-apps/cli@npm:^2": 759 - version: 2.10.0 760 - resolution: "@tauri-apps/cli@npm:2.10.0" 731 + version: 2.9.4 732 + resolution: "@tauri-apps/cli@npm:2.9.4" 761 733 dependencies: 762 - "@tauri-apps/cli-darwin-arm64": "npm:2.10.0" 763 - "@tauri-apps/cli-darwin-x64": "npm:2.10.0" 764 - "@tauri-apps/cli-linux-arm-gnueabihf": "npm:2.10.0" 765 - "@tauri-apps/cli-linux-arm64-gnu": "npm:2.10.0" 766 - "@tauri-apps/cli-linux-arm64-musl": "npm:2.10.0" 767 - "@tauri-apps/cli-linux-riscv64-gnu": "npm:2.10.0" 768 - "@tauri-apps/cli-linux-x64-gnu": "npm:2.10.0" 769 - "@tauri-apps/cli-linux-x64-musl": "npm:2.10.0" 770 - "@tauri-apps/cli-win32-arm64-msvc": "npm:2.10.0" 771 - "@tauri-apps/cli-win32-ia32-msvc": "npm:2.10.0" 772 - "@tauri-apps/cli-win32-x64-msvc": "npm:2.10.0" 734 + "@tauri-apps/cli-darwin-arm64": "npm:2.9.4" 735 + "@tauri-apps/cli-darwin-x64": "npm:2.9.4" 736 + "@tauri-apps/cli-linux-arm-gnueabihf": "npm:2.9.4" 737 + "@tauri-apps/cli-linux-arm64-gnu": "npm:2.9.4" 738 + "@tauri-apps/cli-linux-arm64-musl": "npm:2.9.4" 739 + "@tauri-apps/cli-linux-riscv64-gnu": "npm:2.9.4" 740 + "@tauri-apps/cli-linux-x64-gnu": "npm:2.9.4" 741 + "@tauri-apps/cli-linux-x64-musl": "npm:2.9.4" 742 + "@tauri-apps/cli-win32-arm64-msvc": "npm:2.9.4" 743 + "@tauri-apps/cli-win32-ia32-msvc": "npm:2.9.4" 744 + "@tauri-apps/cli-win32-x64-msvc": "npm:2.9.4" 773 745 dependenciesMeta: 774 746 "@tauri-apps/cli-darwin-arm64": 775 747 optional: true ··· 795 767 optional: true 796 768 bin: 797 769 tauri: tauri.js 798 - checksum: 10c0/23b41ee1fe635a8b60f2a3011d50f3ca10aa8f86f885e9345acce899b0062833c139a26e0c41667a515888363de9ea5bfd29aea0721eeb61a75b45a125296f55 770 + checksum: 10c0/242480c9aa73ec5950d5da93409f768ce6a789366d240c4e450febc69f02b557b90eafd9d8fdee5f3b7b7138fcf9d35e6d2b197646f1bc002ed01cf8085442c9 799 771 languageName: node 800 772 linkType: hard 801 773 802 774 "@tauri-apps/plugin-opener@npm:^2": 803 - version: 2.5.3 804 - resolution: "@tauri-apps/plugin-opener@npm:2.5.3" 775 + version: 2.5.2 776 + resolution: "@tauri-apps/plugin-opener@npm:2.5.2" 805 777 dependencies: 806 778 "@tauri-apps/api": "npm:^2.8.0" 807 - checksum: 10c0/9ef2fae01e03f3bb16d8e55bfd921cf7c1d284e6459bd5b45777806304eb70ab0b50cbf03be76fc05e64ef70a37493e0cd90b0acc16eaee4a4fc2cfff7e43b71 779 + checksum: 10c0/b10c39063c59ca71e5a5c43bb93da34387a7e707d1baf65a53110141f1a973ce2b73f19be9f63d9312c030760ba2b876ad3069b9a123abb4883e025059a15c3f 808 780 languageName: node 809 781 linkType: hard 810 782 811 783 "@tauri-apps/plugin-store@npm:^2.4.1": 812 - version: 2.4.2 813 - resolution: "@tauri-apps/plugin-store@npm:2.4.2" 784 + version: 2.4.1 785 + resolution: "@tauri-apps/plugin-store@npm:2.4.1" 814 786 dependencies: 815 787 "@tauri-apps/api": "npm:^2.8.0" 816 - checksum: 10c0/6892417dbd3e97c4a70e00ca437a196a65499831e7b3a5dc5b71646596a16c4030f23dedfa124ed853c73999a5b8e48de129fb0369e7af7c987142e060b58127 788 + checksum: 10c0/69af5e6f6ee81b86525b5510aff2f4f5a3ec3dff26b028f191bd5ecdf1d838721cac0942fb9838ec4c293687bfc2238e2c71493f500a5781dbe7c14001fb5660 817 789 languageName: node 818 790 linkType: hard 819 791 ··· 875 847 linkType: hard 876 848 877 849 "@types/react@npm:^19.1.8": 878 - version: 19.2.10 879 - resolution: "@types/react@npm:19.2.10" 850 + version: 19.2.5 851 + resolution: "@types/react@npm:19.2.5" 880 852 dependencies: 881 - csstype: "npm:^3.2.2" 882 - checksum: 10c0/17b96203a79ad3fa3cee8f1f1f324b93f005bc125755e29ac149402807275feaf3f00a4e65b8405f633923ac993da5737fd9800d27ee49911f3ed51dc27478f9 853 + csstype: "npm:^3.0.2" 854 + checksum: 10c0/1f9a92c73a5ea5b167f59cd0b5b9460fde65bd22b63b6d23bfaace8ad38537df127c97657418b4912a7a03a66e6451e82a41b84718d638ec1c8e4f0515d94793 883 855 languageName: node 884 856 linkType: hard 885 857 ··· 913 885 languageName: node 914 886 linkType: hard 915 887 916 - "baseline-browser-mapping@npm:^2.9.0": 917 - version: 2.9.19 918 - resolution: "baseline-browser-mapping@npm:2.9.19" 888 + "baseline-browser-mapping@npm:^2.8.25": 889 + version: 2.8.28 890 + resolution: "baseline-browser-mapping@npm:2.8.28" 919 891 bin: 920 892 baseline-browser-mapping: dist/cli.js 921 - checksum: 10c0/569928db78bcd081953d7db79e4243a59a579a34b4ae1806b9b42d3b7f84e5bc40e6e82ae4fa06e7bef8291bf747b33b3f9ef5d3c6e1e420cb129d9295536129 893 + checksum: 10c0/d157d73de33bff69cf3413983dc1b2421063cd1c895e9edabc22dcb6667f7e17762b46ebeee5eee7496271351754c12750867c6ea5cb432f1bbe33dc5c62d1e6 922 894 languageName: node 923 895 linkType: hard 924 896 925 897 "browserslist@npm:^4.24.0": 926 - version: 4.28.1 927 - resolution: "browserslist@npm:4.28.1" 898 + version: 4.28.0 899 + resolution: "browserslist@npm:4.28.0" 928 900 dependencies: 929 - baseline-browser-mapping: "npm:^2.9.0" 930 - caniuse-lite: "npm:^1.0.30001759" 931 - electron-to-chromium: "npm:^1.5.263" 901 + baseline-browser-mapping: "npm:^2.8.25" 902 + caniuse-lite: "npm:^1.0.30001754" 903 + electron-to-chromium: "npm:^1.5.249" 932 904 node-releases: "npm:^2.0.27" 933 - update-browserslist-db: "npm:^1.2.0" 905 + update-browserslist-db: "npm:^1.1.4" 934 906 bin: 935 907 browserslist: cli.js 936 - checksum: 10c0/545a5fa9d7234e3777a7177ec1e9134bb2ba60a69e6b95683f6982b1473aad347c77c1264ccf2ac5dea609a9731fbfbda6b85782bdca70f80f86e28a402504bd 908 + checksum: 10c0/4284fd568f7d40a496963083860d488cb2a89fb055b6affd316bebc59441fec938e090b3e62c0ee065eb0bc88cd1bc145f4300a16c75f3f565621c5823715ae1 937 909 languageName: node 938 910 linkType: hard 939 911 ··· 956 928 languageName: node 957 929 linkType: hard 958 930 959 - "caniuse-lite@npm:^1.0.30001759": 960 - version: 1.0.30001767 961 - resolution: "caniuse-lite@npm:1.0.30001767" 962 - checksum: 10c0/37067c6d2b26623f81494a1f206adbff2b80baed3318ba430684e428bd7d81be889f39db8ef081501d1db5f7dd5d15972892f173eb59c9f3bb780e0b38e6610a 931 + "caniuse-lite@npm:^1.0.30001754": 932 + version: 1.0.30001755 933 + resolution: "caniuse-lite@npm:1.0.30001755" 934 + checksum: 10c0/7b8e32a4ec307b50f557d30176651cf69f20a0ea4de6f5f34149ea65a1f0cfcc0677b403484aea3661c7469ab11f2df6528027b9ec2d0265635ede9d5b517380 963 935 languageName: node 964 936 linkType: hard 965 937 ··· 977 949 languageName: node 978 950 linkType: hard 979 951 980 - "csstype@npm:^3.2.2": 981 - version: 3.2.3 982 - resolution: "csstype@npm:3.2.3" 983 - checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce 952 + "csstype@npm:^3.0.2": 953 + version: 3.2.2 954 + resolution: "csstype@npm:3.2.2" 955 + checksum: 10c0/ec45114093760c9944c84514615fe4080189276ee4980f52359426a4db5e4fdf0a60affac2c033b978d6c0fed275f37820952682aefa85aeec041d00fecff64d 984 956 languageName: node 985 957 linkType: hard 986 958 ··· 996 968 languageName: node 997 969 linkType: hard 998 970 999 - "electron-to-chromium@npm:^1.5.263": 1000 - version: 1.5.286 1001 - resolution: "electron-to-chromium@npm:1.5.286" 1002 - checksum: 10c0/5384510f9682d7e46f98fa48b874c3901d9639de96e9e387afce1fe010fbac31376df0534524edc15f66e9902bfacee54037a5e598004e9c6a617884e379926d 971 + "electron-to-chromium@npm:^1.5.249": 972 + version: 1.5.254 973 + resolution: "electron-to-chromium@npm:1.5.254" 974 + checksum: 10c0/a4db4124f7d1a44d13db14ea5b1137a50f21074694ca9463b4f541a0e8540ba8b619fdad1846b3ab4e53031bcfdea07618df8fe357c121a68d60fd44ffddd2ec 1003 975 languageName: node 1004 976 linkType: hard 1005 977 ··· 1026 998 languageName: node 1027 999 linkType: hard 1028 1000 1029 - "esbuild@npm:^0.27.0": 1030 - version: 0.27.2 1031 - resolution: "esbuild@npm:0.27.2" 1001 + "esbuild@npm:^0.25.0": 1002 + version: 0.25.12 1003 + resolution: "esbuild@npm:0.25.12" 1032 1004 dependencies: 1033 - "@esbuild/aix-ppc64": "npm:0.27.2" 1034 - "@esbuild/android-arm": "npm:0.27.2" 1035 - "@esbuild/android-arm64": "npm:0.27.2" 1036 - "@esbuild/android-x64": "npm:0.27.2" 1037 - "@esbuild/darwin-arm64": "npm:0.27.2" 1038 - "@esbuild/darwin-x64": "npm:0.27.2" 1039 - "@esbuild/freebsd-arm64": "npm:0.27.2" 1040 - "@esbuild/freebsd-x64": "npm:0.27.2" 1041 - "@esbuild/linux-arm": "npm:0.27.2" 1042 - "@esbuild/linux-arm64": "npm:0.27.2" 1043 - "@esbuild/linux-ia32": "npm:0.27.2" 1044 - "@esbuild/linux-loong64": "npm:0.27.2" 1045 - "@esbuild/linux-mips64el": "npm:0.27.2" 1046 - "@esbuild/linux-ppc64": "npm:0.27.2" 1047 - "@esbuild/linux-riscv64": "npm:0.27.2" 1048 - "@esbuild/linux-s390x": "npm:0.27.2" 1049 - "@esbuild/linux-x64": "npm:0.27.2" 1050 - "@esbuild/netbsd-arm64": "npm:0.27.2" 1051 - "@esbuild/netbsd-x64": "npm:0.27.2" 1052 - "@esbuild/openbsd-arm64": "npm:0.27.2" 1053 - "@esbuild/openbsd-x64": "npm:0.27.2" 1054 - "@esbuild/openharmony-arm64": "npm:0.27.2" 1055 - "@esbuild/sunos-x64": "npm:0.27.2" 1056 - "@esbuild/win32-arm64": "npm:0.27.2" 1057 - "@esbuild/win32-ia32": "npm:0.27.2" 1058 - "@esbuild/win32-x64": "npm:0.27.2" 1005 + "@esbuild/aix-ppc64": "npm:0.25.12" 1006 + "@esbuild/android-arm": "npm:0.25.12" 1007 + "@esbuild/android-arm64": "npm:0.25.12" 1008 + "@esbuild/android-x64": "npm:0.25.12" 1009 + "@esbuild/darwin-arm64": "npm:0.25.12" 1010 + "@esbuild/darwin-x64": "npm:0.25.12" 1011 + "@esbuild/freebsd-arm64": "npm:0.25.12" 1012 + "@esbuild/freebsd-x64": "npm:0.25.12" 1013 + "@esbuild/linux-arm": "npm:0.25.12" 1014 + "@esbuild/linux-arm64": "npm:0.25.12" 1015 + "@esbuild/linux-ia32": "npm:0.25.12" 1016 + "@esbuild/linux-loong64": "npm:0.25.12" 1017 + "@esbuild/linux-mips64el": "npm:0.25.12" 1018 + "@esbuild/linux-ppc64": "npm:0.25.12" 1019 + "@esbuild/linux-riscv64": "npm:0.25.12" 1020 + "@esbuild/linux-s390x": "npm:0.25.12" 1021 + "@esbuild/linux-x64": "npm:0.25.12" 1022 + "@esbuild/netbsd-arm64": "npm:0.25.12" 1023 + "@esbuild/netbsd-x64": "npm:0.25.12" 1024 + "@esbuild/openbsd-arm64": "npm:0.25.12" 1025 + "@esbuild/openbsd-x64": "npm:0.25.12" 1026 + "@esbuild/openharmony-arm64": "npm:0.25.12" 1027 + "@esbuild/sunos-x64": "npm:0.25.12" 1028 + "@esbuild/win32-arm64": "npm:0.25.12" 1029 + "@esbuild/win32-ia32": "npm:0.25.12" 1030 + "@esbuild/win32-x64": "npm:0.25.12" 1059 1031 dependenciesMeta: 1060 1032 "@esbuild/aix-ppc64": 1061 1033 optional: true ··· 1111 1083 optional: true 1112 1084 bin: 1113 1085 esbuild: bin/esbuild 1114 - checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd 1086 + checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b 1115 1087 languageName: node 1116 1088 linkType: hard 1117 1089 ··· 1535 1507 linkType: hard 1536 1508 1537 1509 "react-dom@npm:^19.1.0": 1538 - version: 19.2.4 1539 - resolution: "react-dom@npm:19.2.4" 1510 + version: 19.2.0 1511 + resolution: "react-dom@npm:19.2.0" 1540 1512 dependencies: 1541 1513 scheduler: "npm:^0.27.0" 1542 1514 peerDependencies: 1543 - react: ^19.2.4 1544 - checksum: 10c0/f0c63f1794dedb154136d4d0f59af00b41907f4859571c155940296808f4b94bf9c0c20633db75b5b2112ec13d8d7dd4f9bf57362ed48782f317b11d05a44f35 1515 + react: ^19.2.0 1516 + checksum: 10c0/fa2cae05248d01288e91523b590ce4e7635b1e13f1344e225f850d722a8da037bf0782f63b1c1d46353334e0c696909b82e582f8cad607948fde6f7646cc18d9 1545 1517 languageName: node 1546 1518 linkType: hard 1547 1519 ··· 1553 1525 linkType: hard 1554 1526 1555 1527 "react@npm:^19.1.0": 1556 - version: 19.2.4 1557 - resolution: "react@npm:19.2.4" 1558 - checksum: 10c0/cd2c9ff67a720799cc3b38a516009986f7fc4cb8d3e15716c6211cf098d1357ee3e348ab05ad0600042bbb0fd888530ba92e329198c92eafa0994f5213396596 1528 + version: 19.2.0 1529 + resolution: "react@npm:19.2.0" 1530 + checksum: 10c0/1b6d64eacb9324725bfe1e7860cb7a6b8a34bc89a482920765ebff5c10578eb487e6b46b2f0df263bd27a25edbdae2c45e5ea5d81ae61404301c1a7192c38330 1559 1531 languageName: node 1560 1532 linkType: hard 1561 1533 ··· 1567 1539 linkType: hard 1568 1540 1569 1541 "rollup@npm:^4.43.0": 1570 - version: 4.57.1 1571 - resolution: "rollup@npm:4.57.1" 1542 + version: 4.53.2 1543 + resolution: "rollup@npm:4.53.2" 1572 1544 dependencies: 1573 - "@rollup/rollup-android-arm-eabi": "npm:4.57.1" 1574 - "@rollup/rollup-android-arm64": "npm:4.57.1" 1575 - "@rollup/rollup-darwin-arm64": "npm:4.57.1" 1576 - "@rollup/rollup-darwin-x64": "npm:4.57.1" 1577 - "@rollup/rollup-freebsd-arm64": "npm:4.57.1" 1578 - "@rollup/rollup-freebsd-x64": "npm:4.57.1" 1579 - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.57.1" 1580 - "@rollup/rollup-linux-arm-musleabihf": "npm:4.57.1" 1581 - "@rollup/rollup-linux-arm64-gnu": "npm:4.57.1" 1582 - "@rollup/rollup-linux-arm64-musl": "npm:4.57.1" 1583 - "@rollup/rollup-linux-loong64-gnu": "npm:4.57.1" 1584 - "@rollup/rollup-linux-loong64-musl": "npm:4.57.1" 1585 - "@rollup/rollup-linux-ppc64-gnu": "npm:4.57.1" 1586 - "@rollup/rollup-linux-ppc64-musl": "npm:4.57.1" 1587 - "@rollup/rollup-linux-riscv64-gnu": "npm:4.57.1" 1588 - "@rollup/rollup-linux-riscv64-musl": "npm:4.57.1" 1589 - "@rollup/rollup-linux-s390x-gnu": "npm:4.57.1" 1590 - "@rollup/rollup-linux-x64-gnu": "npm:4.57.1" 1591 - "@rollup/rollup-linux-x64-musl": "npm:4.57.1" 1592 - "@rollup/rollup-openbsd-x64": "npm:4.57.1" 1593 - "@rollup/rollup-openharmony-arm64": "npm:4.57.1" 1594 - "@rollup/rollup-win32-arm64-msvc": "npm:4.57.1" 1595 - "@rollup/rollup-win32-ia32-msvc": "npm:4.57.1" 1596 - "@rollup/rollup-win32-x64-gnu": "npm:4.57.1" 1597 - "@rollup/rollup-win32-x64-msvc": "npm:4.57.1" 1545 + "@rollup/rollup-android-arm-eabi": "npm:4.53.2" 1546 + "@rollup/rollup-android-arm64": "npm:4.53.2" 1547 + "@rollup/rollup-darwin-arm64": "npm:4.53.2" 1548 + "@rollup/rollup-darwin-x64": "npm:4.53.2" 1549 + "@rollup/rollup-freebsd-arm64": "npm:4.53.2" 1550 + "@rollup/rollup-freebsd-x64": "npm:4.53.2" 1551 + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.53.2" 1552 + "@rollup/rollup-linux-arm-musleabihf": "npm:4.53.2" 1553 + "@rollup/rollup-linux-arm64-gnu": "npm:4.53.2" 1554 + "@rollup/rollup-linux-arm64-musl": "npm:4.53.2" 1555 + "@rollup/rollup-linux-loong64-gnu": "npm:4.53.2" 1556 + "@rollup/rollup-linux-ppc64-gnu": "npm:4.53.2" 1557 + "@rollup/rollup-linux-riscv64-gnu": "npm:4.53.2" 1558 + "@rollup/rollup-linux-riscv64-musl": "npm:4.53.2" 1559 + "@rollup/rollup-linux-s390x-gnu": "npm:4.53.2" 1560 + "@rollup/rollup-linux-x64-gnu": "npm:4.53.2" 1561 + "@rollup/rollup-linux-x64-musl": "npm:4.53.2" 1562 + "@rollup/rollup-openharmony-arm64": "npm:4.53.2" 1563 + "@rollup/rollup-win32-arm64-msvc": "npm:4.53.2" 1564 + "@rollup/rollup-win32-ia32-msvc": "npm:4.53.2" 1565 + "@rollup/rollup-win32-x64-gnu": "npm:4.53.2" 1566 + "@rollup/rollup-win32-x64-msvc": "npm:4.53.2" 1598 1567 "@types/estree": "npm:1.0.8" 1599 1568 fsevents: "npm:~2.3.2" 1600 1569 dependenciesMeta: ··· 1619 1588 "@rollup/rollup-linux-arm64-musl": 1620 1589 optional: true 1621 1590 "@rollup/rollup-linux-loong64-gnu": 1622 - optional: true 1623 - "@rollup/rollup-linux-loong64-musl": 1624 1591 optional: true 1625 1592 "@rollup/rollup-linux-ppc64-gnu": 1626 1593 optional: true 1627 - "@rollup/rollup-linux-ppc64-musl": 1628 - optional: true 1629 1594 "@rollup/rollup-linux-riscv64-gnu": 1630 1595 optional: true 1631 1596 "@rollup/rollup-linux-riscv64-musl": ··· 1635 1600 "@rollup/rollup-linux-x64-gnu": 1636 1601 optional: true 1637 1602 "@rollup/rollup-linux-x64-musl": 1638 - optional: true 1639 - "@rollup/rollup-openbsd-x64": 1640 1603 optional: true 1641 1604 "@rollup/rollup-openharmony-arm64": 1642 1605 optional: true ··· 1652 1615 optional: true 1653 1616 bin: 1654 1617 rollup: dist/bin/rollup 1655 - checksum: 10c0/a90aaf1166fc495920e44e52dced0b12283aaceb0924abd6f863102128dd428bbcbf85970f792c06bc63d2a2168e7f073b73e05f6f8d76fdae17b7ac6cacba06 1618 + checksum: 10c0/427216da71c1ce7fefb0bef75f94c301afd858ac27e35898e098c2da5977325fa54c2edda867caf9675c8abfa8d8d94efa99c482fa04f5cd91f3a740112d4f4f 1656 1619 languageName: node 1657 1620 linkType: hard 1658 1621 ··· 1793 1756 languageName: node 1794 1757 linkType: hard 1795 1758 1796 - "update-browserslist-db@npm:^1.2.0": 1797 - version: 1.2.3 1798 - resolution: "update-browserslist-db@npm:1.2.3" 1759 + "update-browserslist-db@npm:^1.1.4": 1760 + version: 1.1.4 1761 + resolution: "update-browserslist-db@npm:1.1.4" 1799 1762 dependencies: 1800 1763 escalade: "npm:^3.2.0" 1801 1764 picocolors: "npm:^1.1.1" ··· 1803 1766 browserslist: ">= 4.21.0" 1804 1767 bin: 1805 1768 update-browserslist-db: cli.js 1806 - checksum: 10c0/13a00355ea822388f68af57410ce3255941d5fb9b7c49342c4709a07c9f230bbef7f7499ae0ca7e0de532e79a82cc0c4edbd125f1a323a1845bf914efddf8bec 1769 + checksum: 10c0/db0c9aaecf1258a6acda5e937fc27a7996ccca7a7580a1b4aa8bba6a9b0e283e5e65c49ebbd74ec29288ef083f1b88d4da13e3d4d326c1e5fc55bf72d7390702 1807 1770 languageName: node 1808 1771 linkType: hard 1809 1772 1810 1773 "vite@npm:^7.0.4": 1811 - version: 7.3.1 1812 - resolution: "vite@npm:7.3.1" 1774 + version: 7.2.2 1775 + resolution: "vite@npm:7.2.2" 1813 1776 dependencies: 1814 - esbuild: "npm:^0.27.0" 1777 + esbuild: "npm:^0.25.0" 1815 1778 fdir: "npm:^6.5.0" 1816 1779 fsevents: "npm:~2.3.3" 1817 1780 picomatch: "npm:^4.0.3" ··· 1858 1821 optional: true 1859 1822 bin: 1860 1823 vite: bin/vite.js 1861 - checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 1824 + checksum: 10c0/9c76ee441f8dbec645ddaecc28d1f9cf35670ffa91cff69af7b1d5081545331603f0b1289d437b2fa8dc43cdc77b4d96b5bd9c9aed66310f490cb1a06f9c814c 1862 1825 languageName: node 1863 1826 linkType: hard 1864 1827
+317 -1
docs/mobile.md
··· 54 54 - Status display showing existing tags for already-saved items 55 55 - Support for both URLs and plain text content 56 56 57 + ### Native WKWebView (In-App Browser) 58 + 59 + Each URL card has a "webview" button that opens the URL in a native WKWebView overlay, allowing users to view content without leaving the app. 60 + 61 + **Implementation:** 62 + - **Swift plugin:** `src-tauri/gen/apple/tauri-app_iOS/tauri-app_iOS/WebViewPlugin.swift` 63 + - **FFI bridge:** `src-tauri/webview-plugin/` - Rust crate exposing C functions 64 + - **React integration:** `App.tsx` calls `window.__TAURI_INVOKE__("plugin:webview|open", { url })` 65 + 66 + **Features:** 67 + - Full-screen overlay with navigation bar 68 + - Native "Done" button to close 69 + - Tracks visited URLs (stores visit timestamp) 70 + - Reader mode available (future) 71 + 72 + ### Pull-to-Refresh 73 + 74 + The main list supports pull-to-refresh with a **hold gesture** to prevent accidental triggers during scroll. 75 + 76 + **Behavior:** 77 + 1. Pull down to reveal refresh indicator 78 + 2. **Hold** for 300ms to trigger refresh 79 + 3. Release before 300ms → cancels (bounce back) 80 + 4. Visual feedback shows progress ring filling 81 + 82 + **Implementation:** `src/App.tsx` - search for `pullToRefresh` state 83 + 57 84 ### Frecency Algorithm 58 85 59 86 Tags are scored using frecency (frequency + recency): ··· 110 137 } 111 138 ``` 112 139 140 + ### Profiles 141 + 142 + Mobile profiles provide dev/production data isolation. See `docs/profiles.md` for full details. 143 + 144 + **Quick summary:** 145 + - **Auto-detection:** Xcode builds use `dev` profile, TestFlight/App Store use `default` 146 + - **Separate databases:** Each profile has its own SQLite file (`peek-{profile-uuid}.db`) 147 + - **Sync isolation:** All sync requests include `?profile={slug}` 148 + 113 149 ### Data Storage 114 150 115 - Data is stored in a SQLite database (`peek.db`) within the iOS App Groups container (`group.com.dietrich.peek-mobile`). This enables sharing between the main app and share extension with proper concurrent access via WAL mode. 151 + Data is stored in SQLite databases within the iOS App Groups container (`group.com.dietrich.peek-mobile`). This enables sharing between the main app and share extension with proper concurrent access via WAL mode. 152 + 153 + **Per-profile database files:** 154 + ``` 155 + App Group Container/ 156 + ├── profiles.json # Profile metadata and sync config 157 + ├── peek-{uuid1}.db # Default profile database 158 + ├── peek-{uuid2}.db # Development profile database 159 + └── peek-{uuid3}.db # Additional profiles... 160 + ``` 116 161 117 162 **Database Location:** 118 163 ``` ··· 316 361 - Xcode generates all required icon sizes during build 317 362 - Do NOT recreate `Assets.xcassets/AppIcon.appiconset/` - that's Tauri's default icons 318 363 364 + ### In-App Icons (URL Action Buttons) 365 + 366 + The URL cards have action buttons (Safari, WKWebView, copy, edit, delete) that use inline SVG icons. 367 + 368 + **Location:** `backend/tauri-mobile/src/App.tsx` - search for `SvgIcon` components 369 + 370 + **Styling:** The `.card-action-btn` class in `App.css` controls button appearance: 371 + ```css 372 + .card-action-btn { 373 + -webkit-appearance: none; 374 + appearance: none; 375 + background: transparent; 376 + border: none; 377 + /* ... */ 378 + } 379 + ``` 380 + 381 + **Important:** iOS Safari/WebKit requires explicit `-webkit-appearance: none` and `background: transparent` to prevent default button styling that shows as gray backgrounds. 382 + 319 383 ### Building 320 384 321 385 **Build Rust library for iOS:** ··· 397 461 4. Copy `ShareViewController-full-ui.swift.example` to `src-tauri/gen/apple/Peek/ShareViewController.swift` 398 462 5. Ensure entitlements include App Groups 399 463 464 + ## iOS Build System Architecture 465 + 466 + This section documents the critical details of building Tauri iOS apps. **Read this before doing any iOS builds.** 467 + 468 + ### The `custom-protocol` Feature (CRITICAL) 469 + 470 + **⚠️ The `custom-protocol` Cargo feature is REQUIRED for production builds.** 471 + 472 + Without this feature, the app tries to connect to `localhost:1420` instead of using bundled assets, causing: 473 + - "failed to request tauri://localhost" error 474 + - iOS local network permission prompt 475 + - Blank white screen 476 + 477 + ```toml 478 + # backend/tauri-mobile/src-tauri/Cargo.toml 479 + [dependencies] 480 + tauri = { version = "2", features = ["custom-protocol"] } 481 + 482 + [features] 483 + custom-protocol = ["tauri/custom-protocol"] 484 + ``` 485 + 486 + **How it works:** Tauri's build system sets `cargo:dev=true` or `cargo:dev=false` based on this feature: 487 + - **With** `custom-protocol` → `dev=false` → uses bundled assets (production) 488 + - **Without** `custom-protocol` → `dev=true` → tries to connect to localhost (dev mode) 489 + 490 + **For hot reload development**, the feature is still present but we use `cargo tauri dev` which starts a dev server and connects to it. 491 + 492 + ### Debug vs Release Build Separation 493 + 494 + Debug and release builds are completely separated to prevent cross-contamination: 495 + 496 + | Aspect | Debug (Simulator) | Release (Device) | 497 + |--------|-------------------|------------------| 498 + | Target | `aarch64-apple-ios-sim` | `aarch64-apple-ios` | 499 + | Library path | `Externals/arm64/Debug/libapp.a` | `Externals/arm64/Release/libapp.a` | 500 + | Xcode scheme | Debug | Release | 501 + | Cache directory | `tmp/ios-cache/debug/` | `tmp/ios-cache/release/` | 502 + | Cargo flags | (none) | `--release --features custom-protocol` | 503 + | Asset source | Bundled or localhost:1420 | Bundled (custom-protocol) | 504 + 505 + **The iOS cache system** is at the repo root (`~/misc/mpeek/tmp/ios-cache/`) so it's shared across workspaces. This prevents duplicate Rust compilations. 506 + 507 + ### Why `cargo build --lib` Instead of `cargo tauri build` 508 + 509 + The standard `cargo tauri build` fails on iOS due to Swift FFI symbols (`webview_plugin_open`, `webview_plugin_close`) that are defined in Swift code and only available at Xcode's final link stage. 510 + 511 + **Workaround:** 512 + 1. Build only the lib target: `cargo build --lib --target aarch64-apple-ios --release --features custom-protocol` 513 + 2. Copy the library to Xcode's expected location 514 + 3. Let Xcode handle the final linking with Swift code 515 + 516 + This is why the build scripts use `cargo build --lib` and why the `custom-protocol` feature must be explicitly specified. 517 + 518 + ### Build Scripts Reference 519 + 520 + **From repo root (package.json):** 521 + 522 + | Script | Description | 523 + |--------|-------------| 524 + | `yarn mobile:ios:cargo:debug` | Build Rust lib for simulator | 525 + | `yarn mobile:ios:cargo:release` | Build Rust lib for device (with custom-protocol) | 526 + | `yarn mobile:ios:xcodebuild` | Build app with xcodebuild for simulator | 527 + | `yarn mobile:ios:xcodebuild:device` | Build app with xcodebuild for device | 528 + | `yarn mobile:ios:xcodebuild:install` | Install built app on simulator | 529 + | `yarn mobile:ios:xcodebuild:install:device` | Install built app on device | 530 + | `yarn mobile:ios:xcodebuild:full` | Full pipeline: cargo + xcodebuild + install (simulator) | 531 + | `yarn mobile:ios:xcodebuild:device:full` | Full pipeline: cargo + xcodebuild + install (device) | 532 + | `yarn mobile:ios:assets` | Rebuild frontend assets only | 533 + 534 + **From backend/tauri-mobile (package.json):** 535 + 536 + | Script | Description | 537 + |--------|-------------| 538 + | `yarn build:ios` | Build for simulator with bundled assets | 539 + | `yarn build:ios:release` | Build for device | 540 + | `yarn dev:ios:sim` | Hot reload development | 541 + | `yarn xcode` | Open Xcode project | 542 + 543 + ### Build Workflow: Simulator Debug 544 + 545 + ```bash 546 + # Full rebuild from scratch 547 + yarn mobile:ios:xcodebuild:full 548 + 549 + # Or step by step: 550 + yarn mobile:ios:cargo:debug # 1. Build Rust library 551 + yarn mobile:ios:xcodebuild # 2. Build with xcodebuild (clean build) 552 + yarn mobile:ios:xcodebuild:install # 3. Install on simulator 553 + yarn mobile:ios:sim:launch # 4. Launch app 554 + ``` 555 + 556 + ### Build Workflow: Device Release 557 + 558 + ```bash 559 + # Full rebuild from scratch 560 + yarn mobile:ios:xcodebuild:device:full 561 + 562 + # Or step by step: 563 + yarn mobile:ios:cargo:release # 1. Build Rust library with custom-protocol 564 + yarn mobile:ios:xcodebuild:device # 2. Build with xcodebuild 565 + yarn mobile:ios:xcodebuild:install:device # 3. Install on device 566 + yarn mobile:ios:device:launch # 4. Launch app 567 + ``` 568 + 569 + ### Frontend-Only Changes 570 + 571 + If you only changed CSS/JS/HTML and Rust is unchanged: 572 + 573 + ```bash 574 + yarn mobile:ios:assets # Rebuild frontend, copy to Xcode 575 + yarn mobile:ios:xcodebuild # Rebuild app (clean build required!) 576 + yarn mobile:ios:xcodebuild:install # Install 577 + ``` 578 + 579 + **Warning:** Xcode aggressively caches assets. Always use `clean build` (the scripts do this automatically) or changes won't appear. 580 + 581 + --- 582 + 583 + ## iOS App Group Containers & Data Persistence 584 + 585 + Understanding iOS container lifecycle is critical to avoid data loss. 586 + 587 + ### What Is an App Group Container? 588 + 589 + iOS apps store data in sandboxed containers. An **App Group container** is a shared container that multiple apps can access (main app + share extension). Our app uses: 590 + - **App Group ID:** `group.com.dietrich.peek-mobile` 591 + - **Container path:** `~/Library/Developer/CoreSimulator/Devices/<DEVICE_ID>/data/Containers/Shared/AppGroup/<UUID>/` 592 + 593 + The `<UUID>` is assigned by iOS when the app is first installed. 594 + 595 + ### When Container UUIDs Change (Data Loss Scenarios) 596 + 597 + | Action | Container UUID | Data | 598 + |--------|---------------|------| 599 + | `xcrun simctl install` (app update) | **Preserved** | **Preserved** ✓ | 600 + | `xcrun simctl uninstall` then reinstall | **New UUID** | **LOST** ✗ | 601 + | Manual delete from Home screen | **New UUID** | **LOST** ✗ | 602 + | Simulator "Erase All Content and Settings" | **New UUID** | **LOST** ✗ | 603 + | Code changes (any) | **Preserved** | **Preserved** ✓ | 604 + | Xcode clean build | **Preserved** | **Preserved** ✓ | 605 + | Bundle ID change | **New UUID** | Old data orphaned | 606 + | App Group ID change | **New UUID** | Old data orphaned | 607 + 608 + **Key insight:** Normal app updates preserve data. Only **uninstalling** the app deletes the container. 609 + 610 + ### Finding Your Container 611 + 612 + **Simulator:** 613 + ```bash 614 + # Find the peek database 615 + find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Shared/AppGroup -name "peek-*.db" 2>/dev/null 616 + 617 + # Or find profiles.json 618 + find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Shared/AppGroup -name "profiles.json" 2>/dev/null 619 + ``` 620 + 621 + **Device:** Use the backup scripts (see below). 622 + 623 + ### Backing Up Data 624 + 625 + **Device backup (recommended before any device work):** 626 + ```bash 627 + yarn mobile:device:backup 628 + # Creates timestamped backup in ~/sync/peek-backups/ 629 + ``` 630 + 631 + **What gets backed up:** 632 + - `appGroupContainer/` - All databases and profiles.json 633 + - `appDataContainer/Documents/Backups/` - In-app backups 634 + 635 + ### Container Locations 636 + 637 + **Simulator (per profile):** 638 + ``` 639 + ~/Library/Developer/CoreSimulator/Devices/<DEVICE_ID>/data/Containers/Shared/AppGroup/<UUID>/ 640 + ├── profiles.json 641 + ├── peek-<profile-uuid>.db 642 + ├── peek-<profile-uuid>.db-wal 643 + └── peek-<profile-uuid>.db-shm 644 + ``` 645 + 646 + **Device:** 647 + - Accessed via `ios-deploy` or Xcode's device file browser 648 + - Same structure as simulator 649 + 650 + --- 651 + 400 652 ## Troubleshooting 653 + 654 + ### localhost Error (Most Common) 655 + 656 + **Symptom:** App shows "failed to request tauri://localhost", asks for local network permission, shows blank white screen. 657 + 658 + **Cause:** Missing `custom-protocol` Cargo feature. 659 + 660 + **Fix:** 661 + ```bash 662 + # 1. Verify feature is in Cargo.toml 663 + grep -A5 "\[features\]" backend/tauri-mobile/src-tauri/Cargo.toml 664 + # Should show: custom-protocol = ["tauri/custom-protocol"] 665 + 666 + # 2. Clean and rebuild with feature 667 + rm -rf backend/tauri-mobile/src-tauri/target/aarch64-apple-ios*/release 668 + yarn mobile:ios:cargo:release # For device 669 + # or 670 + yarn mobile:ios:cargo:debug # For simulator (if you want bundled assets) 671 + 672 + # 3. Clean xcodebuild and reinstall 673 + yarn mobile:ios:xcodebuild:device:full # For device 674 + ``` 675 + 676 + ### Builds Not Updating (Version Stuck) 677 + 678 + **Symptom:** You changed code but the app still shows old version. 679 + 680 + **Cause:** Xcode caches assets aggressively. A `build` without `clean` reuses cached assets. 681 + 682 + **Fix:** The yarn scripts use `clean build`. If using Xcode GUI: 683 + 1. Product → Clean Build Folder (Cmd+Shift+K) 684 + 2. Delete DerivedData: `rm -rf /tmp/peek-xcodebuild` 685 + 3. Rebuild 686 + 687 + ### Wrong Library Architecture 688 + 689 + **Symptom:** Build fails with architecture mismatch errors. 690 + 691 + **Cause:** Debug library in Release folder or vice versa. 692 + 693 + **Fix:** 694 + ```bash 695 + # Clear both caches 696 + rm -rf ~/misc/mpeek/tmp/ios-cache/debug 697 + rm -rf ~/misc/mpeek/tmp/ios-cache/release 698 + 699 + # Rebuild the correct one 700 + yarn mobile:ios:cargo:debug # For simulator 701 + yarn mobile:ios:cargo:release # For device 702 + ``` 703 + 704 + ### Share Extension Not Saving 705 + 706 + **Symptom:** Share extension appears but items don't save. 707 + 708 + **Cause:** App Group mismatch or database path issue. 709 + 710 + **Fix:** 711 + 1. Verify all three IDs match: 712 + - Main app: `com.dietrich.peek-mobile` 713 + - Extension: `com.dietrich.peek-mobile.share` 714 + - App Group: `group.com.dietrich.peek-mobile` 715 + 2. Check entitlements files in Xcode 716 + 3. Rebuild both targets 401 717 402 718 ### Stale Build Cache 403 719
+4 -1
package.json
··· 56 56 "build:tauri:check": "./scripts/timed.sh sh -c 'cd backend/tauri/src-tauri && cargo check'", 57 57 "//-- Tauri Mobile (peek-save app in backend/tauri-mobile) --//": "", 58 58 "mobile:build": "cd backend/tauri-mobile && npm run build", 59 + "mobile:ios:assets": "cd backend/tauri-mobile && npm run build && rm -rf src-tauri/gen/apple/assets && cp -R dist src-tauri/gen/apple/assets", 59 60 "mobile:ios:dev": "cd backend/tauri-mobile/src-tauri && cargo tauri ios dev", 60 61 "mobile:ios:build": "cd backend/tauri-mobile && ./build-ios.sh", 61 62 "mobile:ios:build:release": "cd backend/tauri-mobile && ./build-release.sh", 62 63 "mobile:ios:xcode": "open backend/tauri-mobile/src-tauri/gen/apple/peek-save.xcodeproj", 63 64 "mobile:ios:xcodebuild:list": "xcodebuild -project backend/tauri-mobile/src-tauri/gen/apple/peek-save.xcodeproj -list", 64 - "mobile:ios:xcodebuild": "cd backend/tauri-mobile/src-tauri/gen/apple && xcodebuild -scheme peek-save_iOS -configuration Debug -sdk iphonesimulator -derivedDataPath /tmp/peek-xcodebuild -destination 'platform=iOS Simulator,name=iPhone 17 Pro' build", 65 + "mobile:ios:xcodebuild": "rm -rf /tmp/peek-xcodebuild && cd backend/tauri-mobile/src-tauri/gen/apple && xcodebuild -scheme peek-save_iOS -configuration Debug -sdk iphonesimulator -derivedDataPath /tmp/peek-xcodebuild -destination 'platform=iOS Simulator,name=iPhone 17 Pro' clean build", 65 66 "mobile:ios:xcodebuild:release": "rm -rf /tmp/peek-xcodebuild && mkdir -p backend/tauri-mobile/src-tauri/gen/apple/Externals/arm64/release && ln -sf ../Debug/libapp.a backend/tauri-mobile/src-tauri/gen/apple/Externals/arm64/release/libapp.a && cd backend/tauri-mobile/src-tauri/gen/apple && xcodebuild -scheme peek-save_iOS -configuration release -sdk iphonesimulator -derivedDataPath /tmp/peek-xcodebuild -destination 'platform=iOS Simulator,name=iPhone 17 Pro' clean build", 66 67 "mobile:ios:xcodebuild:install": "xcrun simctl install booted '/tmp/peek-xcodebuild/Build/Products/debug-iphonesimulator/Peek Save.app'", 67 68 "mobile:ios:xcodebuild:install:release": "xcrun simctl install booted '/tmp/peek-xcodebuild/Build/Products/release-iphonesimulator/Peek Save.app'", ··· 72 73 "mobile:ios:xcodebuild:device:install": "DEVICE_ID=$(xcrun devicectl list devices 2>/dev/null | grep 'iPhone' | awk '{for(i=1;i<=NF;i++)if($i~/^[0-9A-F-]{36}$/)print $i}' | head -1) && echo \"Installing to device: $DEVICE_ID\" && xcrun devicectl device install app --device \"$DEVICE_ID\" '/tmp/peek-xcodebuild/Build/Products/release-iphoneos/Peek Save.app'", 73 74 "mobile:ios:xcodebuild:device:full": "yarn mobile:ios:build:release && yarn mobile:ios:xcodebuild:device && yarn mobile:ios:xcodebuild:device:install", 74 75 "mobile:ios:device:launch": "DEVICE_ID=$(xcrun devicectl list devices 2>/dev/null | grep 'iPhone' | awk '{for(i=1;i<=NF;i++)if($i~/^[0-9A-F-]{36}$/)print $i}' | head -1) && xcrun devicectl device process launch --device \"$DEVICE_ID\" com.dietrich.peek-mobile", 76 + "mobile:ios:device:terminate": "DEVICE_ID=$(xcrun devicectl list devices 2>/dev/null | grep 'iPhone' | awk '{for(i=1;i<=NF;i++)if($i~/^[0-9A-F-]{36}$/)print $i}' | head -1) && xcrun devicectl device process terminate --device \"$DEVICE_ID\" --bundle-id com.dietrich.peek-mobile 2>/dev/null || echo 'App not running'", 77 + "mobile:ios:device:run": "yarn mobile:ios:device:terminate; yarn mobile:ios:xcodebuild:device:install && yarn mobile:ios:device:launch", 75 78 "mobile:ios:sim:boot": "xcrun simctl boot 'iPhone 17 Pro' 2>/dev/null || echo 'Simulator already booted or not found'", 76 79 "mobile:ios:sim:open": "open -a Simulator", 77 80 "mobile:ios:sim:launch": "xcrun simctl launch booted com.dietrich.peek-mobile",
+3 -1
scripts/ios-cache.sh
··· 20 20 return 1 21 21 fi 22 22 23 - # Hash Cargo files and all Rust source files 23 + # Hash Cargo files, Tauri config, build script, and all Rust source files 24 24 cat "$tauri_dir/Cargo.toml" \ 25 25 "$tauri_dir/Cargo.lock" \ 26 + "$tauri_dir/tauri.conf.json" \ 27 + "$tauri_dir/build.rs" \ 26 28 "$tauri_dir/src"/*.rs 2>/dev/null | shasum -a 256 | cut -d' ' -f1 27 29 } 28 30