Skip to content

Commit c2556f1

Browse files
authored
Merge pull request #3690 from BuckleScript/fix_3530
fix #3530, creating lib/js, lib/amdjs ahead of time
2 parents 4715a0d + b47458a commit c2556f1

19 files changed

+375
-340
lines changed

jscomp/bsb/bsb_ninja_regen.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ let regenerate_ninja
6868
Bsb_merlin_gen.merlin_file_gen ~cwd
6969
(bsc_dir // bsppx_exe) config;
7070
Bsb_ninja_gen.output_ninja_and_namespace_map
71-
~cwd ~bsc_dir ~not_dev config ;
71+
~cwd ~bsc_dir ~not_dev config ;
72+
Bsb_package_specs.list_dirs_by config.package_specs
73+
(fun x -> Bsb_build_util.mkp (cwd // x));
7274
(* PR2184: we still need record empty dir
7375
since it may add files in the future *)
7476
Bsb_ninja_check.record ~cwd ~file:output_deps

jscomp/bsb/bsb_package_specs.ml

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@
2525

2626
let (//) = Ext_path.combine
2727

28-
let common_js_prefix p = Bsb_config.lib_js // p
29-
let es6_prefix p = Bsb_config.lib_es6 // p
30-
let es6_global_prefix p = Bsb_config.lib_es6_global // p
3128

3229

30+
(* TODO: sync up with {!Js_packages_info.module_system} *)
31+
type format =
32+
| NodeJS | Es6 | Es6_global
33+
3334
type spec = {
34-
format : string;
35+
format : format;
3536
in_source : bool
3637
}
3738

@@ -42,19 +43,30 @@ module Spec_set = Set.Make( struct type t = spec
4243
type t = Spec_set.t
4344

4445

45-
46-
let supported_format x =
47-
x = Literals.commonjs ||
48-
x = Literals.es6 ||
49-
x = Literals.es6_global
50-
5146
let bad_module_format_message_exn ~loc format =
5247
Bsb_exception.errorf ~loc "package-specs: `%s` isn't a valid output module format. It has to be one of: %s, %s or %s"
5348
format
5449
Literals.commonjs
5550
Literals.es6
5651
Literals.es6_global
5752

53+
let supported_format (x : string) loc =
54+
if x = Literals.commonjs then NodeJS
55+
else if x = Literals.es6 then Es6
56+
else if x = Literals.es6_global then Es6_global
57+
else bad_module_format_message_exn ~loc x
58+
59+
let string_of_format (x : format) =
60+
match x with
61+
| NodeJS -> Literals.commonjs
62+
| Es6 -> Literals.es6
63+
| Es6_global -> Literals.es6_global
64+
65+
let prefix_of_format (x : format) =
66+
(match x with
67+
| NodeJS -> Bsb_config.lib_js
68+
| Es6 -> Bsb_config.lib_es6
69+
| Es6_global -> Bsb_config.lib_es6_global )
5870

5971
let rec from_array (arr : Ext_json_types.t array) : Spec_set.t =
6072
let spec = ref Spec_set.empty in
@@ -77,11 +89,8 @@ let rec from_array (arr : Ext_json_types.t array) : Spec_set.t =
7789
(* TODO: FIXME: better API without mutating *)
7890
and from_json_single (x : Ext_json_types.t) : spec =
7991
match x with
80-
| Str {str = format; loc } ->
81-
if supported_format format then
82-
{format ; in_source = false }
83-
else
84-
(bad_module_format_message_exn ~loc format)
92+
| Str {str = format; loc } ->
93+
{format = supported_format format loc ; in_source = false }
8594
| Obj {map; loc} ->
8695
begin match String_map.find_exn map "module" with
8796
| Str {str = format} ->
@@ -90,11 +99,8 @@ and from_json_single (x : Ext_json_types.t) : spec =
9099
| Some (True _) -> true
91100
| Some _
92101
| None -> false
93-
in
94-
if supported_format format then
95-
{format ; in_source }
96-
else
97-
bad_module_format_message_exn ~loc format
102+
in
103+
{format = supported_format format loc ; in_source }
98104
| Arr _ ->
99105
Bsb_exception.errorf ~loc
100106
"package-specs: when the configuration is an object, `module` field should be a string, not an array. If you want to pass multiple module specs, try turning package-specs into an array of objects (or strings) instead."
@@ -123,16 +129,10 @@ let package_flag ({format; in_source } : spec) dir =
123129
Ext_string.inter2
124130
bs_package_output
125131
(Ext_string.concat3
126-
format
132+
(string_of_format format)
127133
Ext_string.single_colon
128134
(if in_source then dir else
129-
if format = Literals.commonjs then
130-
common_js_prefix dir
131-
else if format = Literals.es6 then
132-
es6_prefix dir
133-
else if format = Literals.es6_global then
134-
es6_global_prefix dir
135-
else assert false))
135+
prefix_of_format format // dir))
136136

137137
let package_flag_of_package_specs (package_specs : t)
138138
(dirname : string ) : string =
@@ -142,36 +142,36 @@ let package_flag_of_package_specs (package_specs : t)
142142

143143
let default_package_specs =
144144
Spec_set.singleton
145-
{ format = Literals.commonjs ; in_source = false }
146-
(** js output for each package *)
147-
let package_output ({format; in_source } : spec) output=
148-
149-
let prefix =
150-
if in_source then fun x -> x
151-
else
152-
(if format = Literals.commonjs then
153-
common_js_prefix
154-
else if format = Literals.es6 then
155-
es6_prefix
156-
else if format = Literals.es6_global then
157-
es6_global_prefix
158-
else assert false)
159-
in
160-
(Bsb_config.proj_rel @@ prefix output )
145+
{ format = NodeJS ; in_source = false }
146+
147+
161148

162149
(**
163150
[get_list_of_output_js specs "src/hi/hello"]
164151
165152
*)
166153
let get_list_of_output_js
167-
package_specs
168-
bs_suffix
169-
output_file_sans_extension =
154+
(package_specs : Spec_set.t)
155+
(bs_suffix : bool)
156+
(output_file_sans_extension : string)
157+
=
170158
Spec_set.fold
171-
(fun format acc ->
172-
package_output format
173-
( Ext_namespace.js_name_of_basename bs_suffix
174-
output_file_sans_extension)
159+
(fun (spec : spec) acc ->
160+
let basename = Ext_namespace.change_ext_ns_suffix
161+
output_file_sans_extension
162+
(if bs_suffix then Literals.suffix_bs_js else Literals.suffix_js)
163+
in
164+
(Bsb_config.proj_rel @@ (if spec.in_source then basename
165+
else prefix_of_format spec.format // basename))
175166
:: acc
176167
) package_specs []
177168

169+
170+
let list_dirs_by
171+
(package_specs : Spec_set.t)
172+
(f : string -> unit)
173+
=
174+
Spec_set.iter (fun (spec : spec) ->
175+
if not spec.in_source then
176+
f (prefix_of_format spec.format)
177+
) package_specs

jscomp/bsb/bsb_package_specs.mli

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,7 @@ val get_list_of_output_js :
3939
val package_flag_of_package_specs :
4040
t -> string -> string
4141

42+
val list_dirs_by :
43+
t ->
44+
(string -> unit) ->
45+
unit

jscomp/core/js_name_of_module_id.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ let get_runtime_module_path
5050
let current_info_query =
5151
Js_packages_info.query_package_infos current_package_info
5252
module_system in
53-
let js_file = Ext_namespace.js_name_of_modulename Little_js dep_module_id.id.name in
53+
let js_file = Ext_namespace.js_name_of_modulename dep_module_id.id.name Little_js in
5454
match current_info_query with
5555
| Package_not_found -> assert false
5656
| Package_script ->
@@ -116,7 +116,7 @@ let string_of_module_id
116116
| None ->
117117
Bs_exception.error (Missing_ml_dependency dep_module_id.id.name)
118118
| Some (cmj_path, dep_package_info, little) ->
119-
let js_file = Ext_namespace.js_name_of_modulename little dep_module_id.id.name in
119+
let js_file = Ext_namespace.js_name_of_modulename dep_module_id.id.name little in
120120
let dep_info_query =
121121
Js_packages_info.query_package_infos dep_package_info module_system
122122
in

jscomp/core/lam_compile_main.ml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,11 @@ let lambda_as_module
299299
let lambda_output =
300300
compile ~filename output_prefix finalenv lam in
301301
let basename =
302-
Ext_namespace.js_name_of_basename !Js_config.bs_suffix
302+
Ext_namespace.change_ext_ns_suffix
303303
(Filename.basename
304-
output_prefix) in
304+
output_prefix)
305+
(if !Js_config.bs_suffix then Literals.suffix_bs_js else Literals.suffix_js)
306+
in
305307
let package_info = Js_packages_state.get_packages_info () in
306308
if Js_packages_info.is_empty package_info then
307309
begin

jscomp/ext/ext_filename.mli

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@
3939
TODO : this short name will have to change upon renaming the file.
4040
*)
4141

42-
42+
val is_dir_sep :
43+
char -> bool
44+
4345
val maybe_quote:
4446
string ->
4547
string

jscomp/ext/ext_namespace.ml

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,19 @@ let ns_sep = "-"
3333
let make ~ns cunit =
3434
cunit ^ ns_sep ^ ns
3535

36-
let path_char = Filename.dir_sep.[0]
3736

3837
let rec rindex_rec s i =
3938
if i < 0 then i else
4039
let char = String.unsafe_get s i in
41-
if char = path_char then -1
40+
if Ext_filename.is_dir_sep char then -1
4241
else if char = ns_sep_char then i
4342
else
4443
rindex_rec s (i - 1)
4544

46-
let remove_ns_suffix name =
45+
let change_ext_ns_suffix name ext =
4746
let i = rindex_rec name (String.length name - 1) in
48-
if i < 0 then name
49-
else String.sub name 0 i
47+
if i < 0 then name ^ ext
48+
else String.sub name 0 i ^ ext (* FIXME: micro-optimizaiton*)
5049

5150
let try_split_module_name name =
5251
let len = String.length name in
@@ -61,26 +60,22 @@ type file_kind =
6160
| Little_js
6261
| Little_bs
6362

64-
let suffix_js = ".js"
65-
let bs_suffix_js = ".bs.js"
6663

67-
(* let ends_with_bs_suffix_then_chop s =
68-
Ext_string.ends_with_then_chop s bs_suffix_js *)
6964

70-
let js_name_of_basename bs_suffix s =
71-
remove_ns_suffix s ^
72-
(if bs_suffix then bs_suffix_js else suffix_js )
65+
(* let js_name_of_basename bs_suffix s =
66+
change_ext_ns_suffix s
67+
(if bs_suffix then Literals.suffix_bs_js else Literals.suffix_js ) *)
7368

74-
let js_name_of_modulename little s =
69+
let js_name_of_modulename s little =
7570
match little with
7671
| Little_js ->
77-
remove_ns_suffix (Ext_string.uncapitalize_ascii s) ^ suffix_js
72+
change_ext_ns_suffix (Ext_string.uncapitalize_ascii s) Literals.suffix_js
7873
| Little_bs ->
79-
remove_ns_suffix (Ext_string.uncapitalize_ascii s) ^ bs_suffix_js
74+
change_ext_ns_suffix (Ext_string.uncapitalize_ascii s) Literals.suffix_bs_js
8075
| Upper_js ->
81-
remove_ns_suffix s ^ suffix_js
76+
change_ext_ns_suffix s Literals.suffix_js
8277
| Upper_bs ->
83-
remove_ns_suffix s ^ bs_suffix_js
78+
change_ext_ns_suffix s Literals.suffix_bs_js
8479

8580
(* https://docs.npmjs.com/files/package.json
8681
Some rules:

jscomp/ext/ext_namespace.mli

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ val try_split_module_name :
4040
#1933 when removing ns suffix, don't pass the bound
4141
of basename
4242
*)
43-
val js_name_of_basename :
44-
bool ->
45-
string -> string
43+
val change_ext_ns_suffix :
44+
string ->
45+
string ->
46+
string
4647

4748
type file_kind =
4849
| Upper_js
@@ -51,7 +52,10 @@ type file_kind =
5152
| Little_bs
5253
(** [js_name_of_modulename ~little A-Ns]
5354
*)
54-
val js_name_of_modulename : file_kind -> string -> string
55+
val js_name_of_modulename :
56+
string ->
57+
file_kind ->
58+
string
5559

5660
(* TODO handle cases like
5761
'@angular/core'

jscomp/ounit_tests/ounit_string_tests.ml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -364,22 +364,22 @@ let suites =
364364
=~"ABb"
365365
end;
366366
__LOC__ >:: begin fun _ ->
367-
Ext_namespace.js_name_of_basename false "a-b"
367+
Ext_namespace.change_ext_ns_suffix "a-b" Literals.suffix_js
368368
=~ "a.js";
369-
Ext_namespace.js_name_of_basename false "a-"
369+
Ext_namespace.change_ext_ns_suffix "a-" Literals.suffix_js
370370
=~ "a.js";
371-
Ext_namespace.js_name_of_basename false "a--"
371+
Ext_namespace.change_ext_ns_suffix "a--" Literals.suffix_js
372372
=~ "a-.js";
373-
Ext_namespace.js_name_of_basename false "AA-b"
373+
Ext_namespace.change_ext_ns_suffix "AA-b" Literals.suffix_js
374374
=~ "AA.js";
375375
Ext_namespace.js_name_of_modulename
376-
Little_js "AA-b"
376+
"AA-b" Little_js
377377
=~ "aA.js";
378378
Ext_namespace.js_name_of_modulename
379-
Upper_js "AA-b"
379+
"AA-b" Upper_js
380380
=~ "AA.js";
381381
Ext_namespace.js_name_of_modulename
382-
Upper_bs "AA-b"
382+
"AA-b" Upper_bs
383383
=~ "AA.bs.js";
384384
end;
385385
__LOC__ >:: begin fun _ ->

0 commit comments

Comments
 (0)