@@ -4467,8 +4467,10 @@ val suffix_rei : string
44674467val suffix_d : string
44684468val suffix_js : string
44694469val suffix_mjs : string
4470+ val suffix_cjs : string
44704471val suffix_bs_js : string
44714472val suffix_bs_mjs : string
4473+ val suffix_bs_cjs : string
44724474(* val suffix_re_js : string *)
44734475val suffix_gen_js : string
44744476val suffix_gen_tsx: string
@@ -4606,10 +4608,13 @@ let suffix_reast = ".reast"
46064608let suffix_reiast = ".reiast"
46074609let suffix_mliast_simple = ".mliast_simple"
46084610let suffix_d = ".d"
4611+ 
46094612let suffix_js = ".js"
46104613let suffix_mjs = ".mjs"
4614+ let suffix_cjs = ".cjs"
46114615let suffix_bs_js = ".bs.js"
46124616let suffix_bs_mjs = ".bs.mjs"
4617+ let suffix_bs_cjs = ".bs.cjs"
46134618(* let suffix_re_js = ".re.js" *)
46144619let suffix_gen_js = ".gen.js"
46154620let suffix_gen_tsx = ".gen.tsx"
@@ -7072,15 +7077,27 @@ let prefix_of_format (x : format) =
70727077
70737078
70747079let bad_suffix_message_warn suffix =
7080+   let open Literals in
70757081  Bsb_log.warn
7076-     "@{<warning>UNSUPPORTED@}: package-specs: extension `%s` is unsupported@;\
7077-      ;  consider one of: %s, %s, %s,  or %s@." suffix Literals. suffix_js
7078-     Literals.suffix_mjs Literals. suffix_bs_js Literals. suffix_bs_mjs
7082+     "@{<warning>UNSUPPORTED@}: package-specs: extension `%s` is unsupported; @;\
7083+      consider one of: %s, %s, %s; %s, %s,  or %s@." suffix suffix_js suffix_mjs 
7084+     suffix_cjs  suffix_bs_js suffix_bs_mjs suffix_bs_cjs 
70797085
70807086
70817087let supported_suffix (x : string) =
7082-   if not (List.mem x Literals.[ suffix_js; suffix_mjs; suffix_bs_js; suffix_bs_mjs ]) then
7083-     bad_suffix_message_warn x;
7088+   if
7089+     not
7090+       (List.mem x
7091+          Literals.
7092+            [
7093+              suffix_js;
7094+              suffix_mjs;
7095+              suffix_cjs;
7096+              suffix_bs_js;
7097+              suffix_bs_mjs;
7098+              suffix_bs_cjs;
7099+            ])
7100+   then bad_suffix_message_warn x;
70847101  x
70857102
70867103
@@ -7096,7 +7113,9 @@ let default_suffix format in_source =
70967113
70977114module SS = Set.Make (String)
70987115
7099- let supported_bs_suffixes = Literals.[ suffix_bs_js; suffix_bs_mjs ]
7116+ let supported_bs_suffixes =
7117+   Literals.[ suffix_bs_js; suffix_bs_mjs; suffix_bs_cjs ]
7118+ 
71007119
71017120(** Produces a [list] of supported, bs-prefixed file-suffixes used in
71027121    [in-source] package-specs. *)
@@ -7111,21 +7130,23 @@ let extract_in_source_bs_suffixes (package_specs : Spec_set.t) =
71117130
71127131
71137132let rec from_array (arr : Ext_json_types.t array) : Spec_set.t =
7114-   let spec = ref Spec_set.empty in
7115-   let has_in_source = ref false in
7133+   let specs = ref Spec_set.empty in
71167134  Ext_array.iter arr (fun x ->
7117-       let result = from_json_single x in
7118-       if result.in_source then
7119-         if not !has_in_source then has_in_source := true
7120-         else
7121-           Bsb_exception.errorf ~loc:(Ext_json.loc_of x)
7122-             "package-specs: we've detected two module formats that are both \
7123-              configured to be in-source.";
7124-       spec := Spec_set.add result !spec);
7125-   !spec
7126- 
7127- 
7128- (* TODO: FIXME: better API without mutating *)
7135+       let spec = from_json_single x in
7136+       if
7137+         Spec_set.exists
7138+           (fun o -> spec.in_source == o.in_source && String.equal spec.suffix o.suffix)
7139+           !specs
7140+       then
7141+         Bsb_exception.errorf ~loc:(Ext_json.loc_of x)
7142+           "package-specs: two conflicting module formats with the extension \
7143+            `%s` are both configured to be in-source."
7144+           spec.suffix
7145+       else specs := Spec_set.add spec !specs);
7146+   !specs
7147+ 
7148+ 
7149+ (* FIXME: better API without mutating *)
71297150and from_json_single (x : Ext_json_types.t) : spec =
71307151  match x with
71317152  | Str { str = format; loc } ->
@@ -7187,8 +7208,7 @@ let package_flag ({ format; in_source; suffix } : spec) dir =
71877208       Ext_string.single_colon suffix)
71887209
71897210
7190- let flags_of_package_specs (package_specs : t) (dirname : string) :
7191-     string =
7211+ let flags_of_package_specs (package_specs : t) (dirname : string) : string =
71927212  Spec_set.fold
71937213    (fun format acc -> Ext_string.inter2 acc (package_flag format dirname))
71947214    package_specs Ext_string.empty
@@ -10511,7 +10531,7 @@ let classify_suffix (x : string) : suffix_kind =
1051110531        if i >= 0 then Cmti i else Not_any
1051210532
1051310533
10514- (** Attempt to delete any [.bs.m ?js] files for a given artifact. *)
10534+ (** Attempt to delete any [.bs.[cm] ?js] files for a given artifact. *)
1051510535let unlink_bs_suffixes context artifact =
1051610536  List.iter
1051710537    (fun suffix -> try_unlink (Filename.concat context.cwd (artifact ^ suffix)))
0 commit comments