@@ -583,6 +583,7 @@ <h1><a href="https://github.com/bloomberg/bucklescript">BuckleScript</a> User Ma
583583</ li >
584584</ ul >
585585</ li >
586+ < li > < a href ="#_js_module "> Js module</ a > </ li >
586587< li > < a href ="#_extended_compiler_options "> Extended compiler options</ a >
587588< ul class ="sectlevel2 ">
588589< li > < a href ="#__bs_main_single_directory_build "> -bs-main (single directory build)</ a > </ li >
@@ -2901,6 +2902,128 @@ <h4 id="_a_simple_example_binding_to_mocha_unit_test_library"><a class="anchor"
29012902</ div >
29022903</ div >
29032904< div class ="sect1 ">
2905+ < h2 id ="_js_module "> < a class ="anchor " href ="#_js_module "> </ a > Js module</ h2 >
2906+ < div class ="sectionbody ">
2907+ < div class ="paragraph ">
2908+ < p > Js module is shipped with BuckleScript, both the namespace < code > Js</ code > and < code > Node</ code > are preserved.</ p >
2909+ </ div >
2910+ < div class ="listingblock ">
2911+ < div class ="title "> Js Public types</ div >
2912+ < div class ="content ">
2913+ < pre class ="pygments highlight "> < code data-lang ="ocaml "> < span class ="tok-k "> type</ span > < span class ="tok-o "> +</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> t</ span >
2914+ < span class ="tok-c "> (** Js object type *)</ span >
2915+ < span class ="tok-k "> type</ span > < span class ="tok-o "> +</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> null</ span >
2916+ < span class ="tok-c "> (** nullable, value of this type can be either [null] or ['a]</ span >
2917+ < span class ="tok-c "> this type is the same as {!Js.Null.t} *)</ span >
2918+ < span class ="tok-k "> type</ span > < span class ="tok-o "> +</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> undefined</ span >
2919+ < span class ="tok-c "> (** value of this type can be either [undefined] or ['a]</ span >
2920+ < span class ="tok-c "> this type is the same as {!Js.Undefined.t} *)</ span >
2921+ < span class ="tok-k "> type</ span > < span class ="tok-o "> +</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> null_undefined</ span >
2922+ < span class ="tok-c "> (** value of this type can be [undefined], [null] or ['a]</ span >
2923+ < span class ="tok-c "> this type is the same as {!Js.Null_undefined.t}*)</ span >
2924+ < span class ="tok-k "> type</ span > < span class ="tok-n "> boolean</ span > </ code > </ pre >
2925+ </ div >
2926+ </ div >
2927+ < div class ="listingblock ">
2928+ < div class ="title "> Js Nested modules</ div >
2929+ < div class ="content ">
2930+ < pre class ="pygments highlight "> < code data-lang ="ocaml "> < span class ="tok-c "> (** {3 nested modules}*)</ span >
2931+ < span class ="tok-k "> module</ span > < span class ="tok-nc "> Null</ span > < span class ="tok-o "> =</ span > < span class ="tok-nc "> Js_null</ span >
2932+ < span class ="tok-k "> module</ span > < span class ="tok-nc "> Undefined</ span > < span class ="tok-o "> =</ span > < span class ="tok-nc "> Js_undefined</ span >
2933+ < span class ="tok-k "> module</ span > < span class ="tok-nc "> Null_undefined</ span > < span class ="tok-o "> =</ span > < span class ="tok-nc "> Js_null_undefined</ span >
2934+ < span class ="tok-k "> module</ span > < span class ="tok-nc "> Types</ span > < span class ="tok-o "> =</ span > < span class ="tok-nc "> Js_types</ span > </ code > </ pre >
2935+ </ div >
2936+ </ div >
2937+ < div class ="paragraph ">
2938+ < p > Note that < code > Null</ code > , < code > Undefined</ code > and < code > Null_undefined</ code > have similar interfaces, for example:</ p >
2939+ </ div >
2940+ < div class ="listingblock ">
2941+ < div class ="title "> Js.Null module</ div >
2942+ < div class ="content ">
2943+ < pre class ="pygments highlight "> < code data-lang ="ocaml "> < span class ="tok-k "> type</ span > < span class ="tok-o "> +</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> =</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-nn "> Js</ span > < span class ="tok-p "> .</ span > < span class ="tok-n "> null</ span >
2944+ < span class ="tok-k "> external</ span > < span class ="tok-n "> to_opt</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> option</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_from_nullable"</ span >
2945+ < span class ="tok-k "> external</ span > < span class ="tok-n "> return</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "%identity"</ span >
2946+ < span class ="tok-k "> external</ span > < span class ="tok-n "> test</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> -></ span > < span class ="tok-kt "> bool</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_is_nil"</ span >
2947+ < span class ="tok-k "> external</ span > < span class ="tok-n "> empty</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "null"</ span > < span class ="tok-o "> [@@</ span > < span class ="tok-n "> bs</ span > < span class ="tok-o "> .</ span > < span class ="tok-k "> val</ span > < span class ="tok-o "> ]</ span > </ code > </ pre >
2948+ </ div >
2949+ </ div >
2950+ < div class ="paragraph ">
2951+ < p > The interface for < code > Js.Types</ code > is as below</ p >
2952+ </ div >
2953+ < div class ="listingblock ">
2954+ < div class ="title "> Js.Types module</ div >
2955+ < div class ="content ">
2956+ < pre class ="pygments highlight "> < code data-lang ="ocaml "> < span class ="tok-k "> type</ span > < span class ="tok-n "> symbol</ span >
2957+ < span class ="tok-c "> (**Js symbol type only available in ES6 *)</ span >
2958+
2959+ < span class ="tok-k "> type</ span > < span class ="tok-n "> obj_val</ span >
2960+ < span class ="tok-k "> type</ span > < span class ="tok-n "> undefined_val</ span >
2961+ < span class ="tok-c "> (** This type has only one value [undefined] *)</ span >
2962+ < span class ="tok-k "> type</ span > < span class ="tok-n "> null_val</ span >
2963+ < span class ="tok-c "> (** This type has only one value [null] *)</ span >
2964+ < span class ="tok-k "> type</ span > < span class ="tok-n "> function_val</ span >
2965+
2966+ < span class ="tok-k "> type</ span > < span class ="tok-o "> _</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> =</ span >
2967+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Undefined</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> undefined_val</ span > < span class ="tok-n "> t</ span >
2968+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Null</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> null_val</ span > < span class ="tok-n "> t</ span >
2969+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Boolean</ span > < span class ="tok-o "> :</ span > < span class ="tok-nn "> Js</ span > < span class ="tok-p "> .</ span > < span class ="tok-n "> boolean</ span > < span class ="tok-n "> t</ span >
2970+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Number</ span > < span class ="tok-o "> :</ span > < span class ="tok-kt "> float</ span > < span class ="tok-n "> t</ span >
2971+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> String</ span > < span class ="tok-o "> :</ span > < span class ="tok-kt "> string</ span > < span class ="tok-n "> t</ span >
2972+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Function</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> function_val</ span > < span class ="tok-n "> t</ span >
2973+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Object</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> obj_val</ span > < span class ="tok-n "> t</ span >
2974+ < span class ="tok-o "> |</ span > < span class ="tok-nc "> Symbol</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> symbol</ span > < span class ="tok-n "> t</ span >
2975+
2976+ < span class ="tok-k "> val</ span > < span class ="tok-n "> reify_type</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> b</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> *</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> b</ span >
2977+ < span class ="tok-c "> (** given any value it returns its type and the same value.</ span >
2978+ < span class ="tok-c "> Note that since ['b t] is GADT, the type system will reify its type automatically,</ span >
2979+ < span class ="tok-c "> for example</ span >
2980+ < span class ="tok-c "> {[</ span >
2981+ < span class ="tok-c "> match reify_type "3" with</ span >
2982+ < span class ="tok-c "> | String, v -> v ^ " this type safe control flow analysis will infer v as string"</ span >
2983+ < span class ="tok-c "> | _ -> assert false</ span >
2984+ < span class ="tok-c "> ]}</ span >
2985+ < span class ="tok-c "> *)</ span >
2986+ < span class ="tok-k "> val</ span > < span class ="tok-n "> test</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> b</ span > < span class ="tok-n "> t</ span > < span class ="tok-o "> -></ span > < span class ="tok-kt "> bool</ span >
2987+ < span class ="tok-c "> (** {[</ span >
2988+ < span class ="tok-c "> test "x" String = true</ span >
2989+ < span class ="tok-c "> ]}*)</ span > </ code > </ pre >
2990+ </ div >
2991+ </ div >
2992+ < div class ="listingblock ">
2993+ < div class ="title "> Js Utility functions</ div >
2994+ < div class ="content ">
2995+ < pre class ="pygments highlight "> < code data-lang ="ocaml "> < span class ="tok-k "> external</ span > < span class ="tok-n "> to_bool</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> -></ span > < span class ="tok-kt "> bool</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_boolean_to_bool"</ span >
2996+ < span class ="tok-c "> (** convert Js boolean to OCaml bool *)</ span >
2997+ < span class ="tok-k "> external</ span > < span class ="tok-n "> typeof</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-kt "> string</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_typeof"</ span >
2998+ < span class ="tok-c "> (** [typeof x] will be compiled as [typeof x] in JS *)</ span >
2999+ < span class ="tok-k "> external</ span > < span class ="tok-n "> log</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-kt "> unit</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_dump"</ span >
3000+ < span class ="tok-c "> (** A convenience function to log *)</ span >
3001+
3002+ < span class ="tok-c "> (** {4 operators }*)</ span >
3003+ < span class ="tok-k "> external</ span > < span class ="tok-n "> unsafe_lt</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_unsafe_lt"</ span >
3004+ < span class ="tok-c "> (** [unsafe_lt a b] will be compiled as [a < b] *)</ span >
3005+ < span class ="tok-k "> external</ span > < span class ="tok-n "> unsafe_le</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_unsafe_le"</ span >
3006+ < span class ="tok-c "> (** [unsafe_le a b] will be compiled as [a <= b] *)</ span >
3007+ < span class ="tok-k "> external</ span > < span class ="tok-n "> unsafe_gt</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_unsafe_gt"</ span >
3008+ < span class ="tok-c "> (** [unsafe_gt a b] will be compiled as [a > b] *)</ span >
3009+ < span class ="tok-k "> external</ span > < span class ="tok-n "> unsafe_ge</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-o "> -></ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "js_unsafe_ge"</ span >
3010+ < span class ="tok-c "> (** [unsafe_ge a b] will be compiled as [a >= b] *)</ span > </ code > </ pre >
3011+ </ div >
3012+ </ div >
3013+ < div class ="listingblock ">
3014+ < div class ="title "> Js Predefined JS values</ div >
3015+ < div class ="content ">
3016+ < pre class ="pygments highlight "> < code data-lang ="ocaml "> < span class ="tok-k "> external</ span > < span class ="tok-bp "> true</ span > < span class ="tok-o "> _</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "true"</ span > < span class ="tok-o "> [@@</ span > < span class ="tok-n "> bs</ span > < span class ="tok-o "> .</ span > < span class ="tok-k "> val</ span > < span class ="tok-o "> ]</ span >
3017+ < span class ="tok-k "> external</ span > < span class ="tok-bp "> false</ span > < span class ="tok-o "> _</ span > < span class ="tok-o "> :</ span > < span class ="tok-n "> boolean</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> "false"</ span > < span class ="tok-o "> [@@</ span > < span class ="tok-n "> bs</ span > < span class ="tok-o "> .</ span > < span class ="tok-k "> val</ span > < span class ="tok-o "> ]</ span >
3018+ < span class ="tok-k "> external</ span > < span class ="tok-n "> null</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> null</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> ""</ span >
3019+ < span class ="tok-o "> [@@</ span > < span class ="tok-n "> bs</ span > < span class ="tok-o "> .</ span > < span class ="tok-k "> val</ span > < span class ="tok-o "> ]</ span > < span class ="tok-c "> (* The same as {!Js.Null.empty} will be compiled as [null]*)</ span >
3020+ < span class ="tok-k "> external</ span > < span class ="tok-n "> undefined</ span > < span class ="tok-o "> :</ span > < span class ="tok-k "> '</ span > < span class ="tok-n "> a</ span > < span class ="tok-n "> undefined</ span > < span class ="tok-o "> =</ span > < span class ="tok-s2 "> ""</ span >
3021+ < span class ="tok-o "> [@@</ span > < span class ="tok-n "> bs</ span > < span class ="tok-o "> .</ span > < span class ="tok-k "> val</ span > < span class ="tok-o "> ]</ span > < span class ="tok-c "> (* The same as {!Js.Undefined.empty} will be compiled as [undefined]*)</ span > </ code > </ pre >
3022+ </ div >
3023+ </ div >
3024+ </ div >
3025+ </ div >
3026+ < div class ="sect1 ">
29043027< h2 id ="_extended_compiler_options "> < a class ="anchor " href ="#_extended_compiler_options "> </ a > Extended compiler options</ h2 >
29053028< div class ="sectionbody ">
29063029< div class ="paragraph ">
0 commit comments