pake-cli 3.6.1 → 3.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,42 @@
1
+ {
2
+ "windows": [
3
+ {
4
+ "url": "https://twitter.com/",
5
+ "url_type": "web",
6
+ "hide_title_bar": false,
7
+ "fullscreen": false,
8
+ "width": 1200,
9
+ "height": 780,
10
+ "resizable": true,
11
+ "always_on_top": false,
12
+ "dark_mode": false,
13
+ "activation_shortcut": "",
14
+ "disabled_web_shortcuts": false,
15
+ "hide_on_close": true,
16
+ "incognito": false,
17
+ "enable_wasm": false,
18
+ "enable_drag_drop": false,
19
+ "maximize": false,
20
+ "start_to_tray": false,
21
+ "force_internal_navigation": false,
22
+ "zoom": 100,
23
+ "min_width": 0,
24
+ "min_height": 0,
25
+ "ignore_certificate_errors": false
26
+ }
27
+ ],
28
+ "user_agent": {
29
+ "macos": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15",
30
+ "linux": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
31
+ "windows": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
32
+ },
33
+ "system_tray": {
34
+ "macos": false,
35
+ "linux": true,
36
+ "windows": true
37
+ },
38
+ "system_tray_path": "png/icon_512.png",
39
+ "inject": [],
40
+ "proxy_url": "",
41
+ "multi_instance": false
42
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "productName": "twitter",
3
+ "identifier": "com.pake.4fd9c9",
4
+ "version": "1.0.0",
5
+ "app": {
6
+ "withGlobalTauri": true,
7
+ "security": {
8
+ "headers": {},
9
+ "csp": null
10
+ }
11
+ },
12
+ "build": {
13
+ "frontendDist": "../dist"
14
+ },
15
+ "bundle": {
16
+ "icon": [
17
+ "icons/icon.icns"
18
+ ],
19
+ "active": true,
20
+ "targets": [
21
+ "app"
22
+ ]
23
+ }
24
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "productName": "weekly",
3
+ "bundle": {
4
+ "icon": ["png/weekly_512.png"],
5
+ "active": true,
6
+ "linux": {
7
+ "deb": {
8
+ "depends": ["curl", "wget"]
9
+ }
10
+ },
11
+ "targets": ["deb", "appimage"]
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "bundle": {
3
+ "icon": [
4
+ "icons/icon.icns"
5
+ ],
6
+ "active": true,
7
+ "targets": [
8
+ "app"
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "bundle": {
3
+ "icon": ["png/weekly_256.ico", "png/weekly_32.ico"],
4
+ "active": true,
5
+ "resources": ["png/weekly_32.ico"],
6
+ "targets": ["msi"],
7
+ "windows": {
8
+ "digestAlgorithm": "sha256",
9
+ "wix": {
10
+ "language": ["en-US"],
11
+ "template": "assets/main.wxs"
12
+ }
13
+ }
14
+ }
15
+ }
@@ -2588,7 +2588,7 @@ dependencies = [
2588
2588
 
2589
2589
  [[package]]
2590
2590
  name = "pake"
2591
- version = "3.6.1"
2591
+ version = "3.6.3"
2592
2592
  dependencies = [
2593
2593
  "serde",
2594
2594
  "serde_json",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pake"
3
- version = "3.6.1"
3
+ version = "3.6.3"
4
4
  description = "🤱🏻 Turn any webpage into a desktop app with Rust."
5
5
  authors = ["Tw93"]
6
6
  license = "MIT"
@@ -21,7 +21,12 @@ tauri-build = { version = "2.5.3", features = [] }
21
21
  serde_json = "1.0.145"
22
22
  serde = { version = "1.0.228", features = ["derive"] }
23
23
  tokio = { version = "1.48.0", features = ["full"] }
24
- tauri = { version = "2.9.4", features = ["tray-icon", "image-ico", "image-png", "macos-proxy"] }
24
+ tauri = { version = "2.9.4", features = [
25
+ "tray-icon",
26
+ "image-ico",
27
+ "image-png",
28
+ "macos-proxy",
29
+ ] }
25
30
  tauri-plugin-window-state = "2.4.1"
26
31
  tauri-plugin-oauth = "2.0.0"
27
32
  tauri-plugin-http = "2.5.4"
Binary file
Binary file
@@ -32,29 +32,48 @@ pub struct NotificationParams {
32
32
 
33
33
  #[command]
34
34
  pub async fn download_file(app: AppHandle, params: DownloadFileParams) -> Result<(), String> {
35
- let window: WebviewWindow = app.get_webview_window("pake").unwrap();
35
+ let window: WebviewWindow = app.get_webview_window("pake").ok_or("Window not found")?;
36
+
36
37
  show_toast(
37
38
  &window,
38
39
  &get_download_message_with_lang(MessageType::Start, params.language.clone()),
39
40
  );
40
41
 
41
- let output_path = app.path().download_dir().unwrap().join(params.filename);
42
- let file_path = check_file_or_append(output_path.to_str().unwrap());
43
- let client = ClientBuilder::new().build().unwrap();
42
+ let download_dir = app
43
+ .path()
44
+ .download_dir()
45
+ .map_err(|e| format!("Failed to get download dir: {}", e))?;
46
+
47
+ let output_path = download_dir.join(&params.filename);
48
+
49
+ let path_str = output_path.to_str().ok_or("Invalid output path")?;
50
+
51
+ let file_path = check_file_or_append(path_str);
44
52
 
45
- let response = client
46
- .execute(Request::new(
47
- Method::GET,
48
- Url::from_str(&params.url).unwrap(),
49
- ))
50
- .await;
53
+ let client = ClientBuilder::new()
54
+ .build()
55
+ .map_err(|e| format!("Failed to build client: {}", e))?;
56
+
57
+ let url = Url::from_str(&params.url).map_err(|e| format!("Invalid URL: {}", e))?;
58
+
59
+ let request = Request::new(Method::GET, url);
60
+
61
+ let response = client.execute(request).await;
51
62
 
52
63
  match response {
53
- Ok(res) => {
54
- let bytes = res.bytes().await.unwrap();
64
+ Ok(mut res) => {
65
+ let mut file =
66
+ File::create(file_path).map_err(|e| format!("Failed to create file: {}", e))?;
67
+
68
+ while let Some(chunk) = res
69
+ .chunk()
70
+ .await
71
+ .map_err(|e| format!("Failed to get chunk: {}", e))?
72
+ {
73
+ file.write_all(&chunk)
74
+ .map_err(|e| format!("Failed to write chunk: {}", e))?;
75
+ }
55
76
 
56
- let mut file = File::create(file_path).unwrap();
57
- file.write_all(&bytes).unwrap();
58
77
  show_toast(
59
78
  &window,
60
79
  &get_download_message_with_lang(MessageType::Success, params.language.clone()),
@@ -76,15 +95,25 @@ pub async fn download_file_by_binary(
76
95
  app: AppHandle,
77
96
  params: BinaryDownloadParams,
78
97
  ) -> Result<(), String> {
79
- let window: WebviewWindow = app.get_webview_window("pake").unwrap();
98
+ let window: WebviewWindow = app.get_webview_window("pake").ok_or("Window not found")?;
99
+
80
100
  show_toast(
81
101
  &window,
82
102
  &get_download_message_with_lang(MessageType::Start, params.language.clone()),
83
103
  );
84
- let output_path = app.path().download_dir().unwrap().join(params.filename);
85
- let file_path = check_file_or_append(output_path.to_str().unwrap());
86
- let download_file_result = fs::write(file_path, &params.binary);
87
- match download_file_result {
104
+
105
+ let download_dir = app
106
+ .path()
107
+ .download_dir()
108
+ .map_err(|e| format!("Failed to get download dir: {}", e))?;
109
+
110
+ let output_path = download_dir.join(&params.filename);
111
+
112
+ let path_str = output_path.to_str().ok_or("Invalid output path")?;
113
+
114
+ let file_path = check_file_or_append(path_str);
115
+
116
+ match fs::write(file_path, &params.binary) {
88
117
  Ok(_) => {
89
118
  show_toast(
90
119
  &window,
@@ -111,7 +140,7 @@ pub fn send_notification(app: AppHandle, params: NotificationParams) -> Result<(
111
140
  .body(&params.body)
112
141
  .icon(&params.icon)
113
142
  .show()
114
- .unwrap();
143
+ .map_err(|e| format!("Failed to show notification: {}", e))?;
115
144
  Ok(())
116
145
  }
117
146
 
@@ -119,13 +148,14 @@ pub fn send_notification(app: AppHandle, params: NotificationParams) -> Result<(
119
148
  pub async fn update_theme_mode(app: AppHandle, mode: String) {
120
149
  #[cfg(target_os = "macos")]
121
150
  {
122
- let window = app.get_webview_window("pake").unwrap();
123
- let theme = if mode == "dark" {
124
- Theme::Dark
125
- } else {
126
- Theme::Light
127
- };
128
- let _ = window.set_theme(Some(theme));
151
+ if let Some(window) = app.get_webview_window("pake") {
152
+ let theme = if mode == "dark" {
153
+ Theme::Dark
154
+ } else {
155
+ Theme::Light
156
+ };
157
+ let _ = window.set_theme(Some(theme));
158
+ }
129
159
  }
130
160
  #[cfg(not(target_os = "macos"))]
131
161
  {
@@ -0,0 +1,244 @@
1
+ use tauri::menu::{AboutMetadata, Menu, MenuItem, PredefinedMenuItem, Submenu};
2
+ use tauri::{AppHandle, Manager, Wry};
3
+ use tauri_plugin_opener::OpenerExt;
4
+
5
+ pub fn get_menu(app: &AppHandle<Wry>) -> tauri::Result<Menu<Wry>> {
6
+ let pake_version = env!("CARGO_PKG_VERSION");
7
+ let pake_menu_item_title = format!("Built with Pake V{}", pake_version);
8
+
9
+ let menu = Menu::with_items(
10
+ app,
11
+ &[
12
+ &app_menu(app)?,
13
+ &file_menu(app)?,
14
+ &edit_menu(app)?,
15
+ &view_menu(app)?,
16
+ &navigation_menu(app)?,
17
+ &window_menu(app)?,
18
+ &help_menu(app, &pake_menu_item_title)?,
19
+ ],
20
+ )?;
21
+
22
+ Ok(menu)
23
+ }
24
+
25
+ fn app_menu(app: &AppHandle<Wry>) -> tauri::Result<Submenu<Wry>> {
26
+ let app_menu = Submenu::new(app, "Pake", true)?;
27
+ let about_metadata = AboutMetadata::default();
28
+ app_menu.append(&PredefinedMenuItem::about(
29
+ app,
30
+ Some("Pake"),
31
+ Some(about_metadata),
32
+ )?)?;
33
+ app_menu.append(&PredefinedMenuItem::separator(app)?)?;
34
+ app_menu.append(&PredefinedMenuItem::services(app, None)?)?;
35
+ app_menu.append(&PredefinedMenuItem::separator(app)?)?;
36
+ app_menu.append(&PredefinedMenuItem::hide(app, None)?)?;
37
+ app_menu.append(&PredefinedMenuItem::hide_others(app, None)?)?;
38
+ app_menu.append(&PredefinedMenuItem::show_all(app, None)?)?;
39
+ app_menu.append(&PredefinedMenuItem::separator(app)?)?;
40
+ app_menu.append(&PredefinedMenuItem::quit(app, None)?)?;
41
+ Ok(app_menu)
42
+ }
43
+
44
+ fn file_menu(app: &AppHandle<Wry>) -> tauri::Result<Submenu<Wry>> {
45
+ let file_menu = Submenu::new(app, "File", true)?;
46
+ file_menu.append(&PredefinedMenuItem::close_window(app, None)?)?;
47
+ file_menu.append(&PredefinedMenuItem::separator(app)?)?;
48
+ file_menu.append(&MenuItem::with_id(
49
+ app,
50
+ "clear_cache_restart",
51
+ "Clear Cache & Restart",
52
+ true,
53
+ Some("CmdOrCtrl+Shift+Backspace"),
54
+ )?)?;
55
+ Ok(file_menu)
56
+ }
57
+
58
+ fn edit_menu(app: &AppHandle<Wry>) -> tauri::Result<Submenu<Wry>> {
59
+ let edit_menu = Submenu::new(app, "Edit", true)?;
60
+ edit_menu.append(&PredefinedMenuItem::undo(app, None)?)?;
61
+ edit_menu.append(&PredefinedMenuItem::redo(app, None)?)?;
62
+ edit_menu.append(&PredefinedMenuItem::separator(app)?)?;
63
+ edit_menu.append(&PredefinedMenuItem::cut(app, None)?)?;
64
+ edit_menu.append(&PredefinedMenuItem::copy(app, None)?)?;
65
+ edit_menu.append(&PredefinedMenuItem::paste(app, None)?)?;
66
+ edit_menu.append(&PredefinedMenuItem::select_all(app, None)?)?;
67
+ edit_menu.append(&PredefinedMenuItem::separator(app)?)?;
68
+ edit_menu.append(&MenuItem::with_id(
69
+ app,
70
+ "copy_url",
71
+ "Copy URL",
72
+ true,
73
+ Some("CmdOrCtrl+L"),
74
+ )?)?;
75
+ Ok(edit_menu)
76
+ }
77
+
78
+ fn view_menu(app: &AppHandle<Wry>) -> tauri::Result<Submenu<Wry>> {
79
+ let view_menu = Submenu::new(app, "View", true)?;
80
+ view_menu.append(&MenuItem::with_id(
81
+ app,
82
+ "reload",
83
+ "Reload",
84
+ true,
85
+ Some("CmdOrCtrl+R"),
86
+ )?)?;
87
+ view_menu.append(&PredefinedMenuItem::separator(app)?)?;
88
+ view_menu.append(&MenuItem::with_id(
89
+ app,
90
+ "zoom_in",
91
+ "Zoom In",
92
+ true,
93
+ Some("CmdOrCtrl+="),
94
+ )?)?;
95
+ view_menu.append(&MenuItem::with_id(
96
+ app,
97
+ "zoom_out",
98
+ "Zoom Out",
99
+ true,
100
+ Some("CmdOrCtrl+-"),
101
+ )?)?;
102
+ view_menu.append(&MenuItem::with_id(
103
+ app,
104
+ "zoom_reset",
105
+ "Actual Size",
106
+ true,
107
+ Some("CmdOrCtrl+0"),
108
+ )?)?;
109
+ view_menu.append(&PredefinedMenuItem::separator(app)?)?;
110
+ view_menu.append(&PredefinedMenuItem::fullscreen(app, None)?)?;
111
+ view_menu.append(&PredefinedMenuItem::separator(app)?)?;
112
+ view_menu.append(&MenuItem::with_id(
113
+ app,
114
+ "toggle_devtools",
115
+ "Toggle Developer Tools",
116
+ cfg!(debug_assertions),
117
+ Some("CmdOrCtrl+Option+I"),
118
+ )?)?;
119
+ Ok(view_menu)
120
+ }
121
+
122
+ fn navigation_menu(app: &AppHandle<Wry>) -> tauri::Result<Submenu<Wry>> {
123
+ let navigation_menu = Submenu::new(app, "Navigation", true)?;
124
+ navigation_menu.append(&MenuItem::with_id(
125
+ app,
126
+ "go_back",
127
+ "Back",
128
+ true,
129
+ Some("CmdOrCtrl+["),
130
+ )?)?;
131
+ navigation_menu.append(&MenuItem::with_id(
132
+ app,
133
+ "go_forward",
134
+ "Forward",
135
+ true,
136
+ Some("CmdOrCtrl+]"),
137
+ )?)?;
138
+ navigation_menu.append(&MenuItem::with_id(
139
+ app,
140
+ "go_home",
141
+ "Go Home",
142
+ true,
143
+ Some("CmdOrCtrl+Shift+H"),
144
+ )?)?;
145
+ Ok(navigation_menu)
146
+ }
147
+
148
+ fn window_menu(app: &AppHandle<Wry>) -> tauri::Result<Submenu<Wry>> {
149
+ let window_menu = Submenu::new(app, "Window", true)?;
150
+ window_menu.append(&PredefinedMenuItem::minimize(app, None)?)?;
151
+ window_menu.append(&PredefinedMenuItem::maximize(app, None)?)?;
152
+ window_menu.append(&PredefinedMenuItem::separator(app)?)?;
153
+ window_menu.append(&MenuItem::with_id(
154
+ app,
155
+ "always_on_top",
156
+ "Toggle Always on Top",
157
+ true,
158
+ None::<&str>,
159
+ )?)?;
160
+ window_menu.append(&PredefinedMenuItem::separator(app)?)?;
161
+ window_menu.append(&PredefinedMenuItem::close_window(app, None)?)?;
162
+ Ok(window_menu)
163
+ }
164
+
165
+ fn help_menu(app: &AppHandle<Wry>, title: &str) -> tauri::Result<Submenu<Wry>> {
166
+ let help_menu = Submenu::new(app, "Help", true)?;
167
+ let github_item = MenuItem::with_id(app, "pake_github_link", title, true, None::<&str>)?;
168
+ help_menu.append(&github_item)?;
169
+ Ok(help_menu)
170
+ }
171
+
172
+ pub fn handle_menu_click(app_handle: &AppHandle, id: &str) {
173
+ match id {
174
+ "pake_github_link" => {
175
+ let _ = app_handle
176
+ .opener()
177
+ .open_url("https://github.com/tw93/Pake", None::<&str>);
178
+ }
179
+ "reload" => {
180
+ if let Some(window) = app_handle.get_webview_window("pake") {
181
+ let _ = window.eval("window.location.reload()");
182
+ }
183
+ }
184
+ "toggle_devtools" => {
185
+ #[cfg(debug_assertions)] // Only allow in debug builds
186
+ if let Some(window) = app_handle.get_webview_window("pake") {
187
+ if window.is_devtools_open() {
188
+ window.close_devtools();
189
+ } else {
190
+ window.open_devtools();
191
+ }
192
+ }
193
+ }
194
+ "zoom_in" => {
195
+ if let Some(window) = app_handle.get_webview_window("pake") {
196
+ let _ = window.eval("zoomIn()");
197
+ }
198
+ }
199
+ "zoom_out" => {
200
+ if let Some(window) = app_handle.get_webview_window("pake") {
201
+ let _ = window.eval("zoomOut()");
202
+ }
203
+ }
204
+ "zoom_reset" => {
205
+ if let Some(window) = app_handle.get_webview_window("pake") {
206
+ let _ = window.eval("setZoom('100%')");
207
+ }
208
+ }
209
+ "go_back" => {
210
+ if let Some(window) = app_handle.get_webview_window("pake") {
211
+ let _ = window.eval("window.history.back()");
212
+ }
213
+ }
214
+ "go_forward" => {
215
+ if let Some(window) = app_handle.get_webview_window("pake") {
216
+ let _ = window.eval("window.history.forward()");
217
+ }
218
+ }
219
+ "go_home" => {
220
+ if let Some(window) = app_handle.get_webview_window("pake") {
221
+ let _ = window.eval("window.location.href = window.pakeConfig.url");
222
+ }
223
+ }
224
+ "copy_url" => {
225
+ if let Some(window) = app_handle.get_webview_window("pake") {
226
+ let _ = window.eval("navigator.clipboard.writeText(window.location.href)");
227
+ }
228
+ }
229
+ "clear_cache_restart" => {
230
+ if let Some(window) = app_handle.get_webview_window("pake") {
231
+ if let Ok(_) = window.clear_all_browsing_data() {
232
+ app_handle.restart();
233
+ }
234
+ }
235
+ }
236
+ "always_on_top" => {
237
+ if let Some(window) = app_handle.get_webview_window("pake") {
238
+ let is_on_top = window.is_always_on_top().unwrap_or(false);
239
+ let _ = window.set_always_on_top(!is_on_top);
240
+ }
241
+ }
242
+ _ => {}
243
+ }
244
+ }
@@ -1,4 +1,5 @@
1
1
  pub mod config;
2
2
  pub mod invoke;
3
+ pub mod menu;
3
4
  pub mod setup;
4
5
  pub mod window;