You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+30-22Lines changed: 30 additions & 22 deletions
Original file line number
Diff line number
Diff line change
@@ -145,13 +145,17 @@ This is usually the file you want to create to test certain compile behavior wit
145
145
- Verify the output, check in the `jscomp/test/my_file_test.ml` and `jscomp/test/my_file_test.js` to version control. The checked in `.js` file is essential for verifying regressions later on.
146
146
- Eventually check in other relevant files changed during the rebuild (depends on your compiler changes).
147
147
148
-
## Contribute to the BS Playground Bundle
148
+
## Contribute to the ReScript Playground Bundle
149
149
150
150
> Note: These instructions are designed for building the 4.06 based version of ReScript (ReScript v6).
151
151
152
152
The "Playground bundle" is the BS compiler compiled to JavaScript, including all necessary dependency files (stdlib / belt etc). It is useful for building tools where you want to compile and execute arbitrary Reason / OCaml in the browser.
153
153
154
-
The ReScript source code is compiled with a tool called [JSOO (js_of_ocaml)](https://ocsigen.org/js_of_ocaml/3.5.1/manual/overview), which uses OCaml bytecode to compile to JavaScript and is part of the bigger OCaml ecosystem. Before we can compile anything, we need to install the required tools (requires [`opam`](https://opam.ocaml.org/doc/Install.html) to be installed):
154
+
The ReScript source code is compiled with a tool called [JSOO (js_of_ocaml)](https://ocsigen.org/js_of_ocaml/3.6.0/manual/overview), which uses OCaml bytecode to compile to JavaScript and is part of the bigger OCaml ecosystem.
155
+
156
+
We actually ship a bytecode version of `js_of_ocaml`, so you actually don't need to install any third party dependencies. This is usually for basic usage if you don't care about the compilation speed or a fast feedback loop (e.g. CI).
157
+
158
+
For faster compilation times, we recommend to install a proper `jsoo` executable:
155
159
156
160
```sh
157
161
# Create the right switch, if not created yet (first install)
@@ -161,18 +165,25 @@ opam switch create 4.06.1
161
165
opam switch 4.06.1
162
166
eval`opam config env`
163
167
164
-
opam install js_of_ocaml.3.5.1
168
+
opam install js_of_ocaml.3.6.0
169
+
```
170
+
171
+
Additionally, make sure to adapt the `scripts/repl.js` file to use the `js_of_ocaml` binary instead (otherwise you'll continue using the slower bytecode version):
The entry point of the JSOO bundle is located in `jscomp/main/jsoo_main.ml` and the script for running JSOO can be found in `scripts/repl.js`. A full clean build can be done like this:
180
+
The entry point of the JSOO bundle is located in `jscomp/main/jsoo_refmt_main.ml` and the script for running JSOO can be found in `scripts/repl.js`. A full clean build can be done like this:
170
181
171
182
```
172
183
# We create a target directory for storing the bundle / stdlib files
173
184
mkdir playground && mkdir playground/stdlib
174
185
175
-
# We build the ReScript source code and also the bytecode for jsoo_main.ml
186
+
# We build the ReScript source code and also the bytecode for jsoo_refmt_main.ml
_Troubleshooting: if ninja build step failed with `Error: cannot find file '+runtime.js'`, make sure `ocamlfind` is installed with `opam install ocamlfind`._
183
194
184
-
**You should now find following files:**
195
+
After a successful compilation, you will find following files in your project:
185
196
186
197
-`playground/exports.js` -> This is the ReScript compiler, which binds the ReScript API to the `window` object.
187
198
-`playground/stdlib/*.js` -> All the ReScript runtime files.
@@ -191,31 +202,28 @@ You can now use the `exports.js` file either directly by using a `<script src="/
191
202
```
192
203
$ node
193
204
> require("./exports.js");
194
-
undefined
195
-
> let compile_result = ocaml.compile(`Js.log Sys.ocaml_version`); // You can change the code here
196
-
undefined
197
-
> eval(compile_result);
205
+
> let compiler = rescript_compiler.make()
206
+
> let result = compiler.rescript.compile(`Js.log(Sys.ocaml_version)`);
207
+
> eval(result);
198
208
4.06.2+BS
199
-
undefined
200
209
```
201
210
202
211
### Playground JS bundle API
203
212
204
-
As soon as the bundle is loaded, you will get access to following functions (as seen in [`jsoo_main.ml`](jscomp/main/jsoo_main.ml)):
213
+
As soon as the bundle is loaded, you will get access to the functions exposed in [`jsoo_refmt_main.ml`](jscomp/refmt/jsoo_refmt_main.ml). Best way to check out the API is by inspecting a compiler instance it either in node, or in the browser:
205
214
206
-
-`window.ocaml`:
207
-
-`compile(code: string)`: Compiles given code
208
-
-`shake_compile(code: string)`: Compiles given code with tree-shaking
209
-
-`compile_super_errors(code: string)`: Compiles given code and outputs `super_errors` related messages on `console.error`
210
-
-`compile_super_errors_ppx_v2(code: string)`: Compiles given code with the React v2 syntax
211
-
-`compile_super_errors_ppx_v3(code: string)`: Compiles given code with the React v3 syntax
212
-
-`load_module(cmi_path: string, cmi_content: string, cmj_name: string, cmj_content: string)`: Loads a module into the compiler (see notes on `cmj` / `cmi` below)
215
+
```
216
+
$ node
217
+
require('./exports.js')
218
+
219
+
> let compiler = rescript_compiler.make()
220
+
> console.log(compiler)
221
+
```
213
222
214
-
For each compile every successful operation will return `{js_code: string}`. On compile errors, the returned object will be `{js_error_msg: string}`.
215
223
216
224
### Working on the Playground JS API
217
225
218
-
Whenever you are modifying any files in the ReScript compiler, or in the `jsoo_main.ml` file, you'll need to rebuild the source and recreate the JS bundle.
226
+
Whenever you are modifying any files in the ReScript compiler, or in the `jsoo_refmt_main.ml` file, you'll need to rebuild the source and recreate the JS bundle.
0 commit comments