@@ -8,9 +8,8 @@ use crate::{
88} ;
99
1010use anyhow:: Context ;
11- use itertools:: Itertools ;
1211use tauri_utils_v1:: config:: Allowlist ;
13- use toml_edit:: { Document , Entry , Item , Table , TableLike , Value } ;
12+ use toml_edit:: { Document , Entry , Item , TableLike , Value } ;
1413
1514use std:: path:: Path ;
1615
@@ -30,23 +29,47 @@ pub fn migrate(tauri_dir: &Path) -> Result<()> {
3029fn migrate_manifest ( manifest : & mut Document ) -> Result < ( ) > {
3130 let version = dependency_version ( ) ;
3231
33- let dependencies = manifest
34- . as_table_mut ( )
35- . entry ( "dependencies" )
36- . or_insert ( Item :: Table ( Table :: new ( ) ) )
37- . as_table_mut ( )
38- . context ( "manifest dependencies isn't a table" ) ?;
39-
40- migrate_dependency ( dependencies, "tauri" , & version, & features_to_remove ( ) ) ;
41-
42- let build_dependencies = manifest
43- . as_table_mut ( )
44- . entry ( "build-dependencies" )
45- . or_insert ( Item :: Table ( Table :: new ( ) ) )
46- . as_table_mut ( )
47- . context ( "manifest build-dependencies isn't a table" ) ?;
48-
49- migrate_dependency ( build_dependencies, "tauri-build" , & version, & [ ] ) ;
32+ let remove_features = features_to_remove ( ) ;
33+ let rename_features = features_to_rename ( ) ;
34+ let rename_message = rename_features
35+ . iter ( )
36+ . map ( |( from, to) | format ! ( "{from} to {to}" ) )
37+ . collect :: < Vec < _ > > ( )
38+ . join ( ", " ) ;
39+
40+ for ( dependency, table) in [
41+ // normal deps
42+ ( "tauri" , "dependencies" ) ,
43+ ( "tauri-utils" , "dependencies" ) ,
44+ ( "tauri-runtime" , "dependencies" ) ,
45+ ( "tauri-codegen" , "dependencies" ) ,
46+ ( "tauri-macros" , "dependencies" ) ,
47+ ( "tauri-runtime-wry" , "dependencies" ) ,
48+ // dev
49+ ( "tauri" , "dev-dependencies" ) ,
50+ ( "tauri-utils" , "dev-dependencies" ) ,
51+ ( "tauri-runtime" , "dev-dependencies" ) ,
52+ ( "tauri-codegen" , "dev-dependencies" ) ,
53+ ( "tauri-macros" , "dev-dependencies" ) ,
54+ ( "tauri-runtime-wry" , "dev-dependencies" ) ,
55+ // build
56+ ( "tauri-build" , "build-dependencies" ) ,
57+ ] {
58+ let items = find_dependency ( manifest, dependency, table) ;
59+
60+ for item in items {
61+ // do not rewrite if dependency uses workspace inheritance
62+ if item
63+ . get ( "workspace" )
64+ . and_then ( |v| v. as_bool ( ) )
65+ . unwrap_or_default ( )
66+ {
67+ log:: warn!( "`{dependency}` dependency has workspace inheritance enabled. This migration must be manually migrated to v2 by changing its version to {version}, removing any of the {remove_features:?} and renaming [{}] Cargo features." , rename_message) ;
68+ } else {
69+ migrate_dependency ( item, & version, & remove_features, & rename_features) ;
70+ }
71+ }
72+ }
5073
5174 if let Some ( lib) = manifest
5275 . as_table_mut ( )
@@ -82,15 +105,66 @@ fn migrate_manifest(manifest: &mut Document) -> Result<()> {
82105 Ok ( ( ) )
83106}
84107
108+ fn find_dependency < ' a > (
109+ manifest : & ' a mut Document ,
110+ name : & ' a str ,
111+ table : & ' a str ,
112+ ) -> Vec < & ' a mut Item > {
113+ let m = manifest. as_table_mut ( ) ;
114+ for ( k, v) in m. iter_mut ( ) {
115+ if let Some ( t) = v. as_table_mut ( ) {
116+ if k == table {
117+ if let Some ( item) = t. get_mut ( name) {
118+ return vec ! [ item] ;
119+ }
120+ } else if k == "target" {
121+ let mut matching_deps = Vec :: new ( ) ;
122+ for ( _, target_value) in t. iter_mut ( ) {
123+ if let Some ( target_table) = target_value. as_table_mut ( ) {
124+ if let Some ( deps) = target_table. get_mut ( table) {
125+ if let Some ( item) = deps. as_table_mut ( ) . and_then ( |t| t. get_mut ( name) ) {
126+ matching_deps. push ( item) ;
127+ }
128+ }
129+ }
130+ }
131+ return matching_deps;
132+ }
133+ }
134+ }
135+
136+ Vec :: new ( )
137+ }
138+
139+ fn features_to_rename ( ) -> Vec < ( & ' static str , & ' static str ) > {
140+ vec ! [
141+ ( "window-data-url" , "webview-data-url" ) ,
142+ ( "reqwest-native-tls-vendored" , "native-tls-vendored" ) ,
143+ ( "system-tray" , "tray-icon" ) ,
144+ ( "icon-ico" , "image-ico" ) ,
145+ ( "icon-png" , "image-png" ) ,
146+ ]
147+ }
148+
85149fn features_to_remove ( ) -> Vec < & ' static str > {
86150 let mut features_to_remove = tauri_utils_v1:: config:: AllowlistConfig :: all_features ( ) ;
87- features_to_remove. push ( "reqwest-client" ) ;
88- features_to_remove. push ( "reqwest-native-tls-vendored" ) ;
89- features_to_remove. push ( "process-command-api" ) ;
90- features_to_remove. push ( "shell-open-api" ) ;
91- features_to_remove. push ( "windows7-compat" ) ;
92- features_to_remove. push ( "updater" ) ;
93- features_to_remove. push ( "system-tray" ) ;
151+ features_to_remove. extend ( & [
152+ "reqwest-client" ,
153+ "http-multipart" ,
154+ "process-command-api" ,
155+ "shell-open-api" ,
156+ "os-api" ,
157+ "global-shortcut" ,
158+ "clipboard" ,
159+ "dialog" ,
160+ "notification" ,
161+ "fs-extract-api" ,
162+ "windows7-compat" ,
163+ "updater" ,
164+ "cli" ,
165+ "linux-protocol-headers" ,
166+ "dox" ,
167+ ] ) ;
94168
95169 // this allowlist feature was not removed
96170 let index = features_to_remove
@@ -117,29 +191,22 @@ fn dependency_version() -> String {
117191 }
118192}
119193
120- fn migrate_dependency ( dependencies : & mut Table , name : & str , version : & str , remove : & [ & str ] ) {
121- let item = dependencies. entry ( name) . or_insert ( Item :: None ) ;
122-
123- // do not rewrite if dependency uses workspace inheritance
124- if item
125- . get ( "workspace" )
126- . and_then ( |v| v. as_bool ( ) )
127- . unwrap_or_default ( )
128- {
129- log:: info!( "`{name}` dependency has workspace inheritance enabled. The features array won't be automatically rewritten. Remove features: [{}]" , remove. iter( ) . join( ", " ) ) ;
130- return ;
131- }
132-
194+ fn migrate_dependency ( item : & mut Item , version : & str , remove : & [ & str ] , rename : & [ ( & str , & str ) ] ) {
133195 if let Some ( dep) = item. as_table_mut ( ) {
134- migrate_dependency_table ( dep, version, remove) ;
196+ migrate_dependency_table ( dep, version, remove, rename ) ;
135197 } else if let Some ( Value :: InlineTable ( table) ) = item. as_value_mut ( ) {
136- migrate_dependency_table ( table, version, remove) ;
198+ migrate_dependency_table ( table, version, remove, rename ) ;
137199 } else if item. as_str ( ) . is_some ( ) {
138200 * item = Item :: Value ( version. into ( ) ) ;
139201 }
140202}
141203
142- fn migrate_dependency_table < D : TableLike > ( dep : & mut D , version : & str , remove : & [ & str ] ) {
204+ fn migrate_dependency_table < D : TableLike > (
205+ dep : & mut D ,
206+ version : & str ,
207+ remove : & [ & str ] ,
208+ rename : & [ ( & str , & str ) ] ,
209+ ) {
143210 * dep. entry ( "version" ) . or_insert ( Item :: None ) = Item :: Value ( version. into ( ) ) ;
144211 let manifest_features = dep. entry ( "features" ) . or_insert ( Item :: None ) ;
145212 if let Some ( features_array) = manifest_features. as_array_mut ( ) {
@@ -150,19 +217,17 @@ fn migrate_dependency_table<D: TableLike>(dep: &mut D, version: &str, remove: &[
150217 let index = i - 1 ;
151218 if let Some ( f) = features_array. get ( index) . and_then ( |f| f. as_str ( ) ) {
152219 if remove. contains ( & f) {
153- let f = f. to_string ( ) ;
154220 features_array. remove ( index) ;
155- if f == "reqwest-native-tls-vendored" {
156- add_features. push ( "native-tls-vendored" ) ;
157- } else if f == "system-tray" {
158- add_features. push ( "tray-icon" ) ;
159- }
221+ } else if let Some ( ( _from, rename_to) ) = rename. iter ( ) . find ( |( from, _to) | * from == f) {
222+ features_array. remove ( index) ;
223+ add_features. push ( rename_to) ;
160224 }
161225 }
162226 i -= 1 ;
163227 }
228+
164229 for f in add_features {
165- features_array. push ( f) ;
230+ features_array. push ( f. to_string ( ) ) ;
166231 }
167232 }
168233}
0 commit comments