@@ -6677,6 +6677,9 @@ module Bs_pkg : sig
6677
6677
val resolve_bs_package :
6678
6678
cwd :string -> string -> string option
6679
6679
6680
+
6681
+ val resolve_npm_package_file :
6682
+ cwd :string -> string -> string option
6680
6683
end = struct
6681
6684
#1 " bs_pkg.ml"
6682
6685
@@ -6691,13 +6694,13 @@ let resolve_bs_package
6691
6694
name =
6692
6695
let marker = Literals. bsconfig_json in
6693
6696
let sub_path = name // marker in
6694
- let rec aux origin cwd name =
6697
+ let rec aux cwd =
6695
6698
let abs_marker = cwd // Literals. node_modules // sub_path in
6696
6699
if Sys. file_exists abs_marker then Some (Filename. dirname abs_marker)
6697
6700
else
6698
- let cwd' = Filename. dirname cwd in
6701
+ let cwd' = Filename. dirname cwd in (* TODO: may non-terminating when see symlinks *)
6699
6702
if String. length cwd' < String. length cwd then
6700
- aux origin cwd' name
6703
+ aux cwd'
6701
6704
else
6702
6705
try
6703
6706
let abs_marker =
@@ -6711,8 +6714,38 @@ let resolve_bs_package
6711
6714
Not_found -> None
6712
6715
(* Bs_exception.error (Bs_package_not_found name) *)
6713
6716
in
6714
- aux cwd cwd name
6717
+ aux cwd
6718
+
6715
6719
6720
+ (* * The package does not need to be a bspackage
6721
+ example:
6722
+ {[
6723
+ resolve_npm_package_file ~cwd "reason/refmt"
6724
+ ]}
6725
+ It also returns the path name
6726
+ *)
6727
+ let resolve_npm_package_file ~cwd sub_path =
6728
+ let rec aux cwd =
6729
+ let abs_marker = cwd // Literals. node_modules // sub_path in
6730
+ if Sys. file_exists abs_marker then Some abs_marker
6731
+ else
6732
+ let cwd' = Filename. dirname cwd in
6733
+ if String. length cwd' < String. length cwd then
6734
+ aux cwd'
6735
+ else
6736
+ try
6737
+ let abs_marker =
6738
+ Sys. getenv " npm_config_prefix"
6739
+ // " lib" // Literals. node_modules // sub_path in
6740
+ if Sys. file_exists abs_marker
6741
+ then Some abs_marker
6742
+ else None
6743
+ (* Bs_exception.error (Bs_package_not_found name) *)
6744
+ with
6745
+ Not_found -> None
6746
+ (* Bs_exception.error (Bs_package_not_found name) *)
6747
+ in
6748
+ aux cwd
6716
6749
end
6717
6750
module Bsb_default : sig
6718
6751
#1 " bsb_default.mli"
@@ -6832,11 +6865,10 @@ let resolve_bsb_magic_file ~cwd ~desc p =
6832
6865
else if Filename. is_relative p &&
6833
6866
p_len > 0 &&
6834
6867
String. unsafe_get p 0 <> '.' then
6835
- let name = String. sub p 0 (String. index p '/' ) in
6836
- let package = (Bs_pkg. resolve_bs_package ~cwd name) in
6837
- match package with
6838
- | None -> failwith (name ^ " not found when resolving " ^ desc)
6839
- | Some package -> Bsb_build_util. convert_and_resolve_path (Filename. dirname package // p)
6868
+ let p = if Ext_sys. is_windows_or_cygwin then Ext_string. replace_slash_backward p else p in
6869
+ match Bs_pkg. resolve_npm_package_file ~cwd p with
6870
+ | None -> failwith (p ^ " not found when resolving " ^ desc)
6871
+ | Some v -> v
6840
6872
else
6841
6873
Bsb_build_util. convert_and_resolve_path p
6842
6874
0 commit comments