Skip to content

Commit 9b656cd

Browse files
committed
fix ppx file resolution, ppx does not need to come from packages of bucklescript
1 parent 74220c4 commit 9b656cd

File tree

6 files changed

+125
-25
lines changed

6 files changed

+125
-25
lines changed

jscomp/all.depend

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -651,9 +651,10 @@ bsb/bsb_build_util.cmx : ext/ext_sys.cmx ext/ext_string.cmx ext/ext_list.cmx \
651651
bsb/bsb_config.cmx bsb/bsb_build_util.cmi
652652
bsb/bsb_config.cmx : common/js_config.cmx ext/ext_filename.cmx \
653653
bsb/bsb_config.cmi
654-
bsb/bsb_default.cmx : ext/string_set.cmx ext/literals.cmx ext/ext_string.cmx \
655-
ext/ext_json.cmx ext/ext_filename.cmx bsb/bsb_build_util.cmx \
656-
bsb/bsb_build_schemas.cmx common/bs_pkg.cmx bsb/bsb_default.cmi
654+
bsb/bsb_default.cmx : ext/string_set.cmx ext/literals.cmx ext/ext_sys.cmx \
655+
ext/ext_string.cmx ext/ext_json.cmx ext/ext_filename.cmx \
656+
bsb/bsb_build_util.cmx bsb/bsb_build_schemas.cmx common/bs_pkg.cmx \
657+
bsb/bsb_default.cmi
657658
bsb/bsb_dep_infos.cmx : bsb/bsb_dep_infos.cmi
658659
bsb/bsb_dir.cmx : bsb/bsb_dir.cmi
659660
bsb/bsb_file.cmx : bsb/bsb_file.cmi

jscomp/bin/bsb.ml

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6677,6 +6677,9 @@ module Bs_pkg : sig
66776677
val resolve_bs_package :
66786678
cwd:string -> string -> string option
66796679

6680+
6681+
val resolve_npm_package_file :
6682+
cwd:string -> string -> string option
66806683
end = struct
66816684
#1 "bs_pkg.ml"
66826685

@@ -6691,13 +6694,13 @@ let resolve_bs_package
66916694
name =
66926695
let marker = Literals.bsconfig_json in
66936696
let sub_path = name // marker in
6694-
let rec aux origin cwd name =
6697+
let rec aux cwd =
66956698
let abs_marker = cwd // Literals.node_modules // sub_path in
66966699
if Sys.file_exists abs_marker then Some (Filename.dirname abs_marker)
66976700
else
6698-
let cwd' = Filename.dirname cwd in
6701+
let cwd' = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *)
66996702
if String.length cwd' < String.length cwd then
6700-
aux origin cwd' name
6703+
aux cwd'
67016704
else
67026705
try
67036706
let abs_marker =
@@ -6711,8 +6714,38 @@ let resolve_bs_package
67116714
Not_found -> None
67126715
(* Bs_exception.error (Bs_package_not_found name) *)
67136716
in
6714-
aux cwd cwd name
6717+
aux cwd
6718+
67156719

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
67166749
end
67176750
module Bsb_default : sig
67186751
#1 "bsb_default.mli"
@@ -6832,11 +6865,10 @@ let resolve_bsb_magic_file ~cwd ~desc p =
68326865
else if Filename.is_relative p &&
68336866
p_len > 0 &&
68346867
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
68406872
else
68416873
Bsb_build_util.convert_and_resolve_path p
68426874

jscomp/bin/whole_compiler.ml

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20205,6 +20205,9 @@ module Bs_pkg : sig
2020520205
val resolve_bs_package :
2020620206
cwd:string -> string -> string option
2020720207

20208+
20209+
val resolve_npm_package_file :
20210+
cwd:string -> string -> string option
2020820211
end = struct
2020920212
#1 "bs_pkg.ml"
2021020213

@@ -20219,13 +20222,13 @@ let resolve_bs_package
2021920222
name =
2022020223
let marker = Literals.bsconfig_json in
2022120224
let sub_path = name // marker in
20222-
let rec aux origin cwd name =
20225+
let rec aux cwd =
2022320226
let abs_marker = cwd // Literals.node_modules // sub_path in
2022420227
if Sys.file_exists abs_marker then Some (Filename.dirname abs_marker)
2022520228
else
20226-
let cwd' = Filename.dirname cwd in
20229+
let cwd' = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *)
2022720230
if String.length cwd' < String.length cwd then
20228-
aux origin cwd' name
20231+
aux cwd'
2022920232
else
2023020233
try
2023120234
let abs_marker =
@@ -20239,8 +20242,38 @@ let resolve_bs_package
2023920242
Not_found -> None
2024020243
(* Bs_exception.error (Bs_package_not_found name) *)
2024120244
in
20242-
aux cwd cwd name
20245+
aux cwd
20246+
2024320247

20248+
(** The package does not need to be a bspackage
20249+
example:
20250+
{[
20251+
resolve_npm_package_file ~cwd "reason/refmt"
20252+
]}
20253+
It also returns the path name
20254+
*)
20255+
let resolve_npm_package_file ~cwd sub_path =
20256+
let rec aux cwd =
20257+
let abs_marker = cwd // Literals.node_modules // sub_path in
20258+
if Sys.file_exists abs_marker then Some abs_marker
20259+
else
20260+
let cwd' = Filename.dirname cwd in
20261+
if String.length cwd' < String.length cwd then
20262+
aux cwd'
20263+
else
20264+
try
20265+
let abs_marker =
20266+
Sys.getenv "npm_config_prefix"
20267+
// "lib" // Literals.node_modules // sub_path in
20268+
if Sys.file_exists abs_marker
20269+
then Some abs_marker
20270+
else None
20271+
(* Bs_exception.error (Bs_package_not_found name) *)
20272+
with
20273+
Not_found -> None
20274+
(* Bs_exception.error (Bs_package_not_found name) *)
20275+
in
20276+
aux cwd
2024420277
end
2024520278
module Compenv : sig
2024620279
#1 "compenv.mli"

jscomp/bsb/bsb_default.ml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ let resolve_bsb_magic_file ~cwd ~desc p =
4242
else if Filename.is_relative p &&
4343
p_len > 0 &&
4444
String.unsafe_get p 0 <> '.' then
45-
let name = String.sub p 0 (String.index p '/') in
46-
let package = (Bs_pkg.resolve_bs_package ~cwd name) in
47-
match package with
48-
| None -> failwith (name ^ " not found when resolving " ^ desc)
49-
| Some package -> Bsb_build_util.convert_and_resolve_path (Filename.dirname package // p)
45+
let p = if Ext_sys.is_windows_or_cygwin then Ext_string.replace_slash_backward p else p in
46+
match Bs_pkg.resolve_npm_package_file ~cwd p with
47+
| None -> failwith (p ^ " not found when resolving " ^ desc)
48+
| Some v -> v
5049
else
5150
Bsb_build_util.convert_and_resolve_path p
5251

jscomp/common/bs_pkg.ml

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ let resolve_bs_package
1010
name =
1111
let marker = Literals.bsconfig_json in
1212
let sub_path = name // marker in
13-
let rec aux origin cwd name =
13+
let rec aux cwd =
1414
let abs_marker = cwd // Literals.node_modules // sub_path in
1515
if Sys.file_exists abs_marker then Some (Filename.dirname abs_marker)
1616
else
17-
let cwd' = Filename.dirname cwd in
17+
let cwd' = Filename.dirname cwd in (* TODO: may non-terminating when see symlinks *)
1818
if String.length cwd' < String.length cwd then
19-
aux origin cwd' name
19+
aux cwd'
2020
else
2121
try
2222
let abs_marker =
@@ -30,4 +30,35 @@ let resolve_bs_package
3030
Not_found -> None
3131
(* Bs_exception.error (Bs_package_not_found name) *)
3232
in
33-
aux cwd cwd name
33+
aux cwd
34+
35+
36+
(** The package does not need to be a bspackage
37+
example:
38+
{[
39+
resolve_npm_package_file ~cwd "reason/refmt"
40+
]}
41+
It also returns the path name
42+
*)
43+
let resolve_npm_package_file ~cwd sub_path =
44+
let rec aux cwd =
45+
let abs_marker = cwd // Literals.node_modules // sub_path in
46+
if Sys.file_exists abs_marker then Some abs_marker
47+
else
48+
let cwd' = Filename.dirname cwd in
49+
if String.length cwd' < String.length cwd then
50+
aux cwd'
51+
else
52+
try
53+
let abs_marker =
54+
Sys.getenv "npm_config_prefix"
55+
// "lib" // Literals.node_modules // sub_path in
56+
if Sys.file_exists abs_marker
57+
then Some abs_marker
58+
else None
59+
(* Bs_exception.error (Bs_package_not_found name) *)
60+
with
61+
Not_found -> None
62+
(* Bs_exception.error (Bs_package_not_found name) *)
63+
in
64+
aux cwd

jscomp/common/bs_pkg.mli

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@
3535

3636
val resolve_bs_package :
3737
cwd:string -> string -> string option
38+
39+
40+
val resolve_npm_package_file :
41+
cwd:string -> string -> string option

0 commit comments

Comments
 (0)