@@ -36,34 +36,30 @@ type json_map = Ext_json_types.t Map_string.t
3636
3737(* Key is the path *)
3838let ( |? ) m (key , cb ) = m |> Ext_json. test key cb
39-
4039let ( .?() ) = Map_string. find_opt
4140
4241(* TODO: it is a little mess that [cwd] and [project dir] are shared*)
4342
44- let extract_package_name_and_namespace (map : json_map ) : string * string option
45- =
46- let package_name =
47- match map.?(Bsb_build_schemas. name) with
48- | Some (Str { str = "_" } as config ) ->
49- Bsb_exception. config_error config " _ is a reserved package name"
50- | Some (Str { str = name } ) -> name
51- | Some config ->
52- Bsb_exception. config_error config " name expect a string field"
53- | None -> Bsb_exception. invalid_spec " field name is required"
54- in
55- let namespace =
56- match map.?(Bsb_build_schemas. namespace) with
57- | None | Some (False _ ) -> None
58- | Some (True _ ) ->
59- Some (Ext_namespace. namespace_of_package_name package_name)
60- | Some (Str { str } ) ->
61- (* TODO : check the validity of namespace *)
62- Some (Ext_namespace. namespace_of_package_name str)
63- | Some x ->
64- Bsb_exception. config_error x " namespace field expects string or boolean"
65- in
66- (package_name, namespace)
43+ let extract_package_name (map : json_map ) =
44+ match map.?(Bsb_build_schemas. name) with
45+ | Some (Str { str = "_" } as config ) ->
46+ Bsb_exception. package_json_config_error config
47+ " _ is a reserved package name"
48+ | Some (Str { str = name } ) -> name
49+ | Some config ->
50+ Bsb_exception. package_json_config_error config
51+ " name expect a string field"
52+ | None -> Bsb_exception. invalid_package_json_spec " field name is required"
53+
54+ let extract_namespace (map : json_map ) package_name =
55+ match map.?(Bsb_build_schemas. namespace) with
56+ | None | Some (False _ ) -> None
57+ | Some (True _ ) -> Some (Ext_namespace. namespace_of_package_name package_name)
58+ | Some (Str { str } ) ->
59+ (* TODO : check the validity of namespace *)
60+ Some (Ext_namespace. namespace_of_package_name str)
61+ | Some x ->
62+ Bsb_exception. config_error x " namespace field expects string or boolean"
6763
6864(* *
6965 There are two things to check:
@@ -190,14 +186,24 @@ let extract_generators (map : json_map) =
190186 (Bsb_build_schemas. generators ^ " expect an array field" ));
191187 ! generators
192188
193- let extract_dependencies (map : json_map ) cwd (field : string ) :
194- Bsb_config_types. dependencies =
189+ let extract_dependencies_from_package_json (map : json_map ) cwd (field : string )
190+ : Bsb_config_types.dependencies =
195191 match map.?(field) with
196192 | None -> []
197- | Some (Arr { content = s } ) ->
198- Ext_list. map (Bsb_build_util. get_list_string s) (fun s ->
199- resolve_package cwd (Bsb_pkg_types. string_as_package s))
200- | Some config -> Bsb_exception. config_error config (field ^ " expect an array" )
193+ | Some (Obj { map = dependencies } ) ->
194+ let bsb_deps =
195+ Map_string. keys dependencies
196+ |> List. filter (fun dep ->
197+ let bsconfig =
198+ Bsb_pkg. resolve_bs_package ~cwd
199+ (Bsb_pkg_types. string_as_package dep)
200+ in
201+ Sys. file_exists bsconfig)
202+ in
203+ Ext_list. map bsb_deps (fun dep ->
204+ resolve_package cwd (Bsb_pkg_types. string_as_package dep))
205+ | Some config ->
206+ Bsb_exception. package_json_config_error config (field ^ " expect a object" )
201207
202208(* return an empty array if not found *)
203209let extract_string_list (map : json_map ) (field : string ) : string list =
@@ -251,6 +257,11 @@ let extract_js_post_build (map : json_map) cwd : string option =
251257 |> ignore;
252258 ! js_post_build_cmd
253259
260+ let read_packge_json cwd =
261+ match Ext_json_parse. parse_json_from_file (cwd // Literals. package_json) with
262+ | Obj { map } -> map
263+ | _ -> Bsb_exception. invalid_package_json_spec " expect a json object {}"
264+
254265(* * ATT: make sure such function is re-entrant.
255266 With a given [cwd] it works anywhere*)
256267let interpret_json ~(package_kind : Bsb_package_kind.t ) ~(per_proj_dir : string )
@@ -273,7 +284,11 @@ let interpret_json ~(package_kind : Bsb_package_kind.t) ~(per_proj_dir : string)
273284 Ext_json_parse. parse_json_from_file (per_proj_dir // Literals. bsconfig_json)
274285 with
275286 | Obj { map } -> (
276- let package_name, namespace = extract_package_name_and_namespace map in
287+ let map_json = read_packge_json per_proj_dir in
288+
289+ let package_name = extract_package_name map_json in
290+ let namespace = extract_namespace map package_name in
291+
277292 let gentype_config = extract_gentype_config map per_proj_dir in
278293
279294 (* This line has to be before any calls to Bsb_global_backend.backend, because it'll read the entries
@@ -294,13 +309,14 @@ let interpret_json ~(package_kind : Bsb_package_kind.t) ~(per_proj_dir : string)
294309 in
295310 let reason_react_jsx = extract_reason_react_jsx map in
296311 let bs_dependencies =
297- extract_dependencies map per_proj_dir Bsb_build_schemas. bs_dependencies
312+ extract_dependencies_from_package_json map_json per_proj_dir
313+ Bsb_build_schemas.PackageJson. dependencies
298314 in
299315 let bs_dev_dependencies =
300316 match package_kind with
301317 | Toplevel | Pinned_dependency _ ->
302- extract_dependencies map per_proj_dir
303- Bsb_build_schemas. bs_dev_dependencies
318+ extract_dependencies_from_package_json map_json per_proj_dir
319+ Bsb_build_schemas.PackageJson. devDependencies
304320 | Dependency _ -> []
305321 in
306322 let pinned_dependencies = extract_pinned_dependencies map in
0 commit comments