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
* Add all relevant changes from previous 2020 bundle API
For reference on the previous work in 2020, refer to rescript-lang#4518
* Add ninja rule for building jsoo_refmt_main
* Fix formatting edge-cases when formatting ReScript -> ReScript
Configure the parser to pass forPrinter:true when parsing / printing ReScript.
This fixes issues where e.g. Some((1, 2)) get misprinted to Some(1,2) etc.
Relevant bug reports:
- rescript-lang/syntax#274
- rescript-lang/syntax#265
* Introduce initial type hints in playground bundle results
* Adapt playground to newest internal syntax apis
* Make jsoo_refmt_main work again by removing refmt
* Rename jsoo_refmt_main to jsoo_playground_main
* Move jsoo_playground_main to jscomp/main
* Remove irrelevant code
* Remove Refmt_api
* Make repl.js more reliable with missing .mli files
* repl.js: Log target compiler file, set js_playground_main as default
* Update CONTRIBUTING to align with the renamed playground jsoo entrypoint
Co-authored-by: Patrick Stapfer <ryyppy@users.noreply.github.com>
Copy file name to clipboardexpand all lines: CONTRIBUTING.md
+25-34
Original file line number
Diff line number
Diff line change
@@ -209,43 +209,38 @@ This is usually the file you want to create to test certain compile behavior wit
209
209
- 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.
210
210
- Eventually check in other relevant files changed during the rebuild (depends on your compiler changes).
211
211
212
-
## Contribute to the BS Playground Bundle
212
+
## Contribute to the ReScript Playground Bundle
213
213
214
214
> Note: These instructions are designed for building the 4.06 based version of ReScript (ReScript v6).
215
215
216
-
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.
216
+
The "Playground bundle" is a JS version of the ReScript compiler; including all necessary dependency files (stdlib / belt etc). It is useful for building tools where you want to compile and execute arbitrary ReScript code in the browser.
217
217
218
-
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):
218
+
The ReScript source code is compiled with a tool called [JSOO (js_of_ocaml)](https://ocsigen.org/js_of_ocaml/4.0.0/manual/overview), which uses OCaml bytecode to compile to JavaScript and is part of the bigger OCaml ecosystem.
219
219
220
-
```sh
221
-
# Create the right switch, if not created yet (first install)
222
-
opam switch create 4.06.1
223
-
224
-
# Makes sure to be on the right switch
225
-
opam switch 4.06.1
226
-
eval`opam config env`
220
+
Install `jsoo` via `opam`:
227
221
228
-
opam install js_of_ocaml.3.5.1
222
+
```sh
223
+
opam install js_of_ocaml.4.0.0
229
224
```
230
225
231
-
### Build the Bundle
226
+
### Building the Bundle
232
227
233
-
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:
228
+
The entry point of the JSOO bundle is located in `jscomp/main/jsoo_playground_main.ml`, the code for packing the compiler into a single compiler file is located in `jscomp/snapshot.ninja`, and the script for running JSOO can be found in `scripts/repl.js`. A full clean build can be done like this:
234
229
235
230
```
236
231
# We create a target directory for storing the bundle / stdlib files
237
232
mkdir playground && mkdir playground/stdlib
238
233
239
-
# We build the ReScript source code and also the bytecode for jsoo_main.ml
234
+
# We build the ReScript source code and also the bytecode for the JSOO entrypoint
# Now we run the repl.js script pointing to our playground directory (note how it needs to be relative to the repl.js file)
243
-
BS_PLAYGROUND=../playground node scripts/repl.js
238
+
PLAYGROUND=../playground node scripts/repl.js
244
239
```
245
240
246
241
_Troubleshooting: if ninja build step failed with `Error: cannot find file '+runtime.js'`, make sure `ocamlfind` is installed with `opam install ocamlfind`._
247
242
248
-
**You should now find following files:**
243
+
After a successful compilation, you will find following files in your project:
249
244
250
245
-`playground/exports.js` -> This is the ReScript compiler, which binds the ReScript API to the `window` object.
251
246
-`playground/stdlib/*.js` -> All the ReScript runtime files.
@@ -255,44 +250,40 @@ You can now use the `exports.js` file either directly by using a `<script src="/
255
250
```
256
251
$ node
257
252
> require("./exports.js");
258
-
undefined
259
-
> let compile_result = ocaml.compile(`Js.log Sys.ocaml_version`); // You can change the code here
260
-
undefined
261
-
> eval(compile_result);
253
+
> let compiler = rescript_compiler.make()
254
+
> let result = compiler.rescript.compile(`Js.log(Sys.ocaml_version)`);
255
+
> eval(result.js_code);
262
256
4.06.2+BS
263
-
undefined
264
257
```
265
258
266
259
### Playground JS bundle API
267
260
268
-
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)):
261
+
As soon as the bundle is loaded, you will get access to the functions exposed in [`jsoo_playground_main.ml`](jscomp/main/jsoo_playground_main.ml). Best way to check out the API is by inspecting a compiler instance it either in node, or in the browser:
269
262
270
-
-`window.ocaml`:
271
-
-`compile(code: string)`: Compiles given code
272
-
-`shake_compile(code: string)`: Compiles given code with tree-shaking
273
-
-`compile_super_errors(code: string)`: Compiles given code and outputs `super_errors` related messages on `console.error`
274
-
-`compile_super_errors_ppx_v2(code: string)`: Compiles given code with the React v2 syntax
275
-
-`compile_super_errors_ppx_v3(code: string)`: Compiles given code with the React v3 syntax
276
-
-`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)
263
+
```
264
+
$ node
265
+
require('./exports.js')
277
266
278
-
For each compile every successful operation will return `{js_code: string}`. On compile errors, the returned object will be `{js_error_msg: string}`.
267
+
> let compiler = rescript_compiler.make()
268
+
> console.log(compiler)
269
+
```
279
270
280
271
### Working on the Playground JS API
281
272
282
-
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.
273
+
Whenever you are modifying any files in the ReScript compiler, or in the `jsoo_playground_main.ml` file, you'll need to rebuild the source and recreate the JS bundle.
A `.cmj` file contains compile information and JS package information of ReScript build artifacts (your `.re / .ml` modules) and are generated on build (`scripts/ninja.js build`).
282
+
A `.cmj` file contains compile information and JS package information of ReScript build artifacts (your `.res / .ml` modules) and are generated on build (`scripts/ninja.js build`).
292
283
293
284
A `.cmi` file is an [OCaml originated file extension](https://waleedkhan.name/blog/ocaml-file-extensions/) and contains all interface information of a certain module without any implementation.
294
285
295
-
In this repo, these files usually sit right next to each compiled `.ml` / `.re` file. The structure of a `.cmj` file is defined in [js_cmj_format.ml](jscomp/core/js_cmj_format.ml). You can run a tool called `./jscomp/bin/cmjdump.exe [some-file.cmj]` to inspect the contents of given `.cmj` file.
286
+
In this repo, these files usually sit right next to each compiled `.ml` / `.res` file. The structure of a `.cmj` file is defined in [js_cmj_format.ml](jscomp/core/js_cmj_format.ml). You can run a tool called `./jscomp/bin/cmjdump.exe [some-file.cmj]` to inspect the contents of given `.cmj` file.
296
287
297
288
`.cmj` files are required for making ReScript compile modules (this includes modules like ReasonReact). ReScript includes a subset of modules by default, which can be found in `jscomp/stdlib-406` and `jscomp/others`. You can also find those modules listed in the `jsoo` call in `scripts/repl.js`. As you probably noticed, the generated `playground` files are all plain `.js`, so how are the `cmj` / `cmi` files embedded?
0 commit comments