@@ -808,6 +808,7 @@ pub struct CliOptions {
808
808
maybe_node_modules_folder : Option < PathBuf > ,
809
809
npmrc : Arc < ResolvedNpmRc > ,
810
810
maybe_lockfile : Option < Arc < CliLockfile > > ,
811
+ maybe_external_import_map : Option < ( PathBuf , serde_json:: Value ) > ,
811
812
overrides : CliOptionOverrides ,
812
813
pub start_dir : Arc < WorkspaceDirectory > ,
813
814
pub deno_dir_provider : Arc < DenoDirProvider > ,
@@ -821,6 +822,7 @@ impl CliOptions {
821
822
npmrc : Arc < ResolvedNpmRc > ,
822
823
start_dir : Arc < WorkspaceDirectory > ,
823
824
force_global_cache : bool ,
825
+ maybe_external_import_map : Option < ( PathBuf , serde_json:: Value ) > ,
824
826
) -> Result < Self , AnyError > {
825
827
if let Some ( insecure_allowlist) =
826
828
flags. unsafely_ignore_certificate_errors . as_ref ( )
@@ -858,6 +860,7 @@ impl CliOptions {
858
860
maybe_node_modules_folder,
859
861
overrides : Default :: default ( ) ,
860
862
main_module_cell : std:: sync:: OnceLock :: new ( ) ,
863
+ maybe_external_import_map,
861
864
start_dir,
862
865
deno_dir_provider,
863
866
} )
@@ -933,7 +936,33 @@ impl CliOptions {
933
936
934
937
let ( npmrc, _) = discover_npmrc_from_workspace ( & start_dir. workspace ) ?;
935
938
936
- let maybe_lock_file = CliLockfile :: discover ( & flags, & start_dir. workspace ) ?;
939
+ fn load_external_import_map (
940
+ deno_json : & ConfigFile ,
941
+ ) -> Result < Option < ( PathBuf , serde_json:: Value ) > , AnyError > {
942
+ if !deno_json. is_an_import_map ( ) {
943
+ if let Some ( path) = deno_json. to_import_map_path ( ) ? {
944
+ let contents = std:: fs:: read_to_string ( & path) . with_context ( || {
945
+ format ! ( "Unable to read import map at '{}'" , path. display( ) )
946
+ } ) ?;
947
+ let map = serde_json:: from_str ( & contents) ?;
948
+ return Ok ( Some ( ( path, map) ) ) ;
949
+ }
950
+ }
951
+ Ok ( None )
952
+ }
953
+
954
+ let external_import_map =
955
+ if let Some ( deno_json) = start_dir. workspace . root_deno_json ( ) {
956
+ load_external_import_map ( deno_json) ?
957
+ } else {
958
+ None
959
+ } ;
960
+
961
+ let maybe_lock_file = CliLockfile :: discover (
962
+ & flags,
963
+ & start_dir. workspace ,
964
+ external_import_map. as_ref ( ) . map ( |( _, v) | v) ,
965
+ ) ?;
937
966
938
967
log:: debug!( "Finished config loading." ) ;
939
968
@@ -944,6 +973,7 @@ impl CliOptions {
944
973
npmrc,
945
974
Arc :: new ( start_dir) ,
946
975
false ,
976
+ external_import_map,
947
977
)
948
978
}
949
979
@@ -1064,7 +1094,7 @@ impl CliOptions {
1064
1094
file_fetcher : & FileFetcher ,
1065
1095
pkg_json_dep_resolution : PackageJsonDepResolution ,
1066
1096
) -> Result < WorkspaceResolver , AnyError > {
1067
- let overrode_no_import_map = self
1097
+ let overrode_no_import_map: bool = self
1068
1098
. overrides
1069
1099
. import_map_specifier
1070
1100
. as_ref ( )
@@ -1092,7 +1122,19 @@ impl CliOptions {
1092
1122
value,
1093
1123
} )
1094
1124
}
1095
- None => None ,
1125
+ None => {
1126
+ if let Some ( ( path, import_map) ) =
1127
+ self . maybe_external_import_map . as_ref ( )
1128
+ {
1129
+ let path_url = deno_path_util:: url_from_file_path ( path) ?;
1130
+ Some ( deno_config:: workspace:: SpecifiedImportMap {
1131
+ base_url : path_url,
1132
+ value : import_map. clone ( ) ,
1133
+ } )
1134
+ } else {
1135
+ None
1136
+ }
1137
+ }
1096
1138
}
1097
1139
} ;
1098
1140
Ok ( self . workspace ( ) . create_resolver (
0 commit comments