Skip to content

Commit 9f99fbc

Browse files
authored
more bindings to node, and provide type safe typeof (rescript-lang#691)
* more clean api (+3 squashed commits) Squashed commits: [f5f00dd] split js into js_types, provide Js.null and Js.undefined [b034aff] more docs and more tests [f479a48] more tests for type safe typeof (+2 squashed commits) Squashed commits: [17fe000] more ides [94f4314] more bindings for node and practical solution to get typesafe typeof * more docs
1 parent 6467f88 commit 9f99fbc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1191
-75386
lines changed

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ A JavaScript backend for [OCaml](https://ocaml.org/) focused on smooth integrati
1212
You can try BuckleScript directly [in your browser](http://bloomberg.github.io/bucklescript/js-demo/). Write OCaml in the left panel and
1313
watch as it instantly compiles to JavaScript shown in the right panel.
1414

15-
## Getting Help and Providing Feedback
16-
17-
If you need help or have a question, comment, or suggestion, please feel free to [open an
18-
issue](https://github.com/bloomberg/bucklescript/issues).
1915

2016
## Installing BuckleScript
2117
```
@@ -175,6 +171,10 @@ function test() {
175171
test();
176172
```
177173

174+
## Getting Help and Providing Feedback
175+
176+
If you need help or have a question, comment, or suggestion, please feel free to [open an
177+
issue](https://github.com/bloomberg/bucklescript/issues).
178178

179179
## Licensing
180180

docs/Manual.html

+123
Original file line numberDiff line numberDiff line change
@@ -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">&#39;</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">&#39;</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 [&#39;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">&#39;</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 [&#39;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">&#39;</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 [&#39;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">&#39;</span><span class="tok-n">a</span> <span class="tok-n">t</span> <span class="tok-o">=</span> <span class="tok-k">&#39;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-n">t</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-n">option</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_from_nullable&quot;</span>
2945+
<span class="tok-k">external</span> <span class="tok-n">return</span> <span class="tok-o">:</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-n">t</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;%identity&quot;</span>
2946+
<span class="tok-k">external</span> <span class="tok-n">test</span> <span class="tok-o">:</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-n">t</span> <span class="tok-o">-&gt;</span> <span class="tok-kt">bool</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_is_nil&quot;</span>
2947+
<span class="tok-k">external</span> <span class="tok-n">empty</span> <span class="tok-o">:</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-n">t</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;null&quot;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">b</span> <span class="tok-n">t</span> <span class="tok-o">*</span> <span class="tok-k">&#39;</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 [&#39;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 &quot;3&quot; with</span>
2982+
<span class="tok-c"> | String, v -&gt; v ^ &quot; this type safe control flow analysis will infer v as string&quot;</span>
2983+
<span class="tok-c"> | _ -&gt; 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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">b</span> <span class="tok-n">t</span> <span class="tok-o">-&gt;</span> <span class="tok-kt">bool</span>
2987+
<span class="tok-c">(** {[</span>
2988+
<span class="tok-c"> test &quot;x&quot; 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">-&gt;</span> <span class="tok-kt">bool</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_boolean_to_bool&quot;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-kt">string</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_typeof&quot;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-kt">unit</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_dump&quot;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-n">boolean</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_unsafe_lt&quot;</span>
3004+
<span class="tok-c">(** [unsafe_lt a b] will be compiled as [a &lt; 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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-n">boolean</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_unsafe_le&quot;</span>
3006+
<span class="tok-c">(** [unsafe_le a b] will be compiled as [a &lt;= 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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-n">boolean</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_unsafe_gt&quot;</span>
3008+
<span class="tok-c">(** [unsafe_gt a b] will be compiled as [a &gt; 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">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-k">&#39;</span><span class="tok-n">a</span> <span class="tok-o">-&gt;</span> <span class="tok-n">boolean</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;js_unsafe_ge&quot;</span>
3010+
<span class="tok-c">(** [unsafe_ge a b] will be compiled as [a &gt;= 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">&quot;true&quot;</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">&quot;false&quot;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-n">null</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;&quot;</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">&#39;</span><span class="tok-n">a</span> <span class="tok-n">undefined</span> <span class="tok-o">=</span> <span class="tok-s2">&quot;&quot;</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">

jscomp/bin/compiler.js

-75,101
This file was deleted.

jscomp/others/.depend

+25-20
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
1-
bs_node_path.cmj :
2-
bs_node_path.cmx :
3-
bs_node_fs.cmj :
4-
bs_node_fs.cmx :
5-
bs_node_process.cmj :
6-
bs_node_process.cmx :
7-
bs_dict.cmj :
8-
bs_dict.cmx :
9-
bs_node_module.cmj : bs_node.cmj bs_dict.cmj
10-
bs_node_module.cmx : bs_node.cmx bs_dict.cmx
1+
node_path.cmj :
2+
node_path.cmx :
3+
node_fs.cmj : node.cmj js_string.cmj
4+
node_fs.cmx : node.cmx js_string.cmx
5+
node_process.cmj :
6+
node_process.cmx :
7+
node_module.cmj : node.cmj js_dict.cmj
8+
node_module.cmx : node.cmx js_dict.cmx
119
js_array.cmj :
1210
js_array.cmx :
1311
js_string.cmj : js_re.cmi
1412
js_string.cmx : js_re.cmx
1513
js_re.cmj : js_re.cmi
1614
js_re.cmx : js_re.cmi
15+
node_buffer.cmj : node.cmj
16+
node_buffer.cmx : node.cmx
17+
js_types.cmj : js_types.cmi
18+
js_types.cmx : js_types.cmi
1719
js_re.cmi :
18-
bs_node_path.cmo :
19-
bs_node_path.cmj :
20-
bs_node_fs.cmo :
21-
bs_node_fs.cmj :
22-
bs_node_process.cmo :
23-
bs_node_process.cmj :
24-
bs_dict.cmo :
25-
bs_dict.cmj :
26-
bs_node_module.cmo : bs_node.cmo bs_dict.cmo
27-
bs_node_module.cmj : bs_node.cmj bs_dict.cmj
20+
js_types.cmi :
21+
node_path.cmo :
22+
node_path.cmj :
23+
node_fs.cmo : node.cmo js_string.cmo
24+
node_fs.cmj : node.cmj js_string.cmj
25+
node_process.cmo :
26+
node_process.cmj :
27+
node_module.cmo : node.cmo js_dict.cmo
28+
node_module.cmj : node.cmj js_dict.cmj
2829
js_array.cmo :
2930
js_array.cmj :
3031
js_string.cmo : js_re.cmi
3132
js_string.cmj : js_re.cmj
3233
js_re.cmo : js_re.cmi
3334
js_re.cmj : js_re.cmi
35+
node_buffer.cmo : node.cmo
36+
node_buffer.cmj : node.cmj
37+
js_types.cmo : js_types.cmi
38+
js_types.cmj : js_types.cmi

jscomp/others/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ include ../Makefile.shared
22

33
COMPILER=../bin/bsc
44

5-
MAP_FILES= bs_node
5+
MAP_FILES= node
66

7-
SOURCE_LIST= bs_node_path bs_node_fs bs_node_process bs_dict bs_node_module js_array js_string js_re
7+
SOURCE_LIST= node_path node_fs node_process dict node_module js_array js_string js_re node_buffer js_types
88

99
$(addsuffix .cmj, $(SOURCE_LIST)): $(addsuffix .cmj, $(MAP_FILES))
1010

File renamed without changes.

jscomp/others/js_string.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ external lastIndexOf_from : t -> int -> int = "lastIndexOf" [@@bs.send.pipe: t]
6161

6262
external localeCompare : t -> float = "" [@@bs.send.pipe: t]
6363

64-
external replace : Js_re.t -> t -> t = "" [@@bs.send.pipe: t]
65-
external replace_string : t -> t -> t = "replace" [@@bs.send.pipe: t]
64+
external replaceByReg : Js_re.t -> t -> t = "replace" [@@bs.send.pipe: t]
65+
external replace : t -> t -> t = "" [@@bs.send.pipe: t]
6666

6767
external search : Js_re.t -> int = "" [@@bs.send.pipe: t]
6868
external slice : int -> int -> t = "" [@@bs.send.pipe: t]

0 commit comments

Comments
 (0)