Upgrade Guide to v7
If you have been using BuckleScript for the last couple of years, you probably noticed that upgrading to the newest version has always been a seamless experience without any breaking changes or performance loss. That's because the BuckleScript team puts a lot of effort in making sure users can upgrade as soon as possible without any changes in their workflow.
That said, this time with the v7 release, there have been some fundamental compiler changes, which means that upgrades will involve a few more installation steps than usual (depending on your project setup). Luckily, the upgrade should still be straight forward and easy to do.
This guide will highlight some of the changes and give you a list of instructions to upgrade your BuckleScript projects.
Note: You probably noticed that the version number jumped from v5 to v7. The v6 version was used for the transition phase, so if you are using v6 right now, just upgrade to
bs-platform@7and you are good to go.
A Quick Look under the Hood
BuckleScript v7 (and v6) changed the underlying OCaml version from 4.02.3 (BS
v5) to 4.06.1. Usually this shouldn't impact any existing codebases, unless
they are using PPXes or other meta programming facilities. Simply explained,
PPXes rely on the data representation of the OCaml / Reason syntax (AST), so if
you are using a tool such as graphql_ppx (which has usually been compiled
natively with a 4.02.3 OCaml version) you will get a compatibility error when
used with BuckleScript v7.
Luckily during the transition phase between v5 and v7 (which has been an ongoing process for for several months), the community has been coordinating efforts to upgrade and release commonly used tools to BS v7 compatible compile artifacts. You will find all installation instructions in this guide as well.
BS Version Overview / Features
BS 5.x and below: based on OCaml 4.02.3
BS 6.x and above: based on OCaml 4.06.1 (transition version: if in use, upgrade to v7 now)
BS 7.x and above: based on OCaml 4.06.1 (stops 4.02.3 support)
Adds
Inline Recordssupport (introduced with4.03)Adds the
Records-as-Objectsfeature, which makes BS compile record type values into JS objects instead of nested arrays (see blog post 1 and post 2)Ships with
refmtversion3.5.1with greatly improved syntax error messages (codenamereerror)
The biggest upside of upgrading to BS v7, beside enjoying newer language
features, is that we will finally be able to deprecate underlying OCaml
4.02.3 code, which will make maintenance way easier (lots of code / processes
can be removed and simplified). Also the OCaml community will greatly benefit
from this change, since a lot of OCaml libraries still have to support a minimum
OCaml version of 4.02.3 just for BuckleScript <= v5 compatibility.
We recommend upgrading to BS v7 as soon as possible. Your Reason code will still work as expected, you'll only need to upgrade your native tools to make everything behave correctly.
Please support us moving forward and help us by providing bug reports in case you have any issues.
How to upgrade to v7
Dependencies
Note: During the migration phase, some projects / repositories have changed owners or Github organizations to make it easier for us to upgrade build artifacts in the future. If you are using a PPX we are not aware of, please let us know in this issue.
Upgrade your bs-platform dependency:
npm install bs-platform@7 --dev
Upgrade any PPX dependencies you're using:
graphql_ppx ->
graphql_ppx_re:
Remove the deprecated
graphql_ppx(by mhallin):npm remove graphql_ppxAdd the new one:
npm install @baransu/graphql_ppx_re --save-devUpdate your
ppx-flags:"ppx-flags": ["@baransu/graphql_ppx_re/ppx6"]
npm install gentype@3 --save-dev
npm install decco@1 --save-dev
npm install --save-dev bs-letUpdate your
ppx-flags:"ppx-flags": ["bs-let/ppx"]
npm install bs-emotion-ppx@1 --save-devUpdate your
ppx-flags:"ppx-flags": ["@ahrefs/bs-emotion-ppx/bin/bs-emotion-ppx"]
Currently WIP and not done yet
No upgrade activity yet, please let us know if you are using it!
Clean & Rebuild your project:
npx bsb -clean-worldnpx bsb -make-worldYour project should now be built and working correctly
Fix specific warnings:
BuckleScript warning: isWebUri : the external name is inferred from val name is unsafe from refactoring when changing value nameThis means that you have
externalbindings ending with= "";(which will automatically take the name of the binding itself), you now need to be explicit with the name. Example:RE/* Before (warning) */ [@bs.module "valid-url"] external isWebUri: string => option(string) = ""; /* After (fixed the warning) */ [@bs.module "valid-url"] external isWebUri: string => option(string) = "isWebUri";
Don't forget to rebuild your project again
Commit your changes:
Your
.bs.jsfiles will very likely change, make sure to commit everything to have a clean BS upgrade commit
Note: Since this upgrade will change the internal data representation of records to JS objects, make sure you are not having any Reason code relying on the previous record-as-array representation. This is a quick reminder that it is generally discouraged to rely on internal data structures.
Editor extensions
reason-vscode / reason-language-server: Should just work, especially when upgraded to the newest versionmerlin: Make sure yourocamlmerlinbinary is compiled for4.06.1and correctly set in your PATH, other than that it should just workreasonml-idea-plugin: Upgrade to versionv0.76or above
How to upgrade PPXes (for tool maintainers)
Step 1: Upgrade build dependencies
We recommend using esy for building your native project, so
all instructions are based on the esy workflows. Mostly it's about setting the
OCaml version to 4.06 and rebuild the project accordingly (e.g. in your package.json):
JSON"devDependencies": { "ocaml": "~4.6.1000", "@opam/dune": "*", }
If you are using migrate-parse-tree, you might want to drop any AST upgrades
from 4.02 -> 4.06 etc, making the native binary more lightweight.
Tip: If you still want to maintain a 4.02.3 based version (for legacy
reasons), you can alternatively create a esy.json / esy-406.json file and
use esy's sandboxing
feature.
We know that these instructions are very rough, many projects use different configurations. To give you some inspiration on how to tackle an upgrade, here is a list of migrations / project setups you might find useful:
bs-emotion-ppx: Full migration diff by anmonteirographql_ppx_re: package.json with 4.06 support // 402.json for esy sandboxdecco: package.json for 4.06
Step 2: Release artifacts and add a proper Note in the README
Make sure to release the newly built binary on npm and make clear which PPX versions are compatible with BS6 / BS5 etc.
For example, this is how gentype does it:
bs-platform 7.0.0 or higher: use genType 3.2.0 or higher. bs-platform 6.2.0 or higher: use genType 3.0.0 or higher. bs-platform 5.2.0 or higher: use genType 2.40.0 or higher. bs-platform 5.0.x and 5.1.x: use genType 2.17.0 or higher.
Conclusion
We are really excited for the upcoming future of BuckleScript. The v7 release will make JS interop considerably easier while being completely compatible with existing codebases.
If you are experiencing any installation / upgrade issues, please be sure to either check the BuckleScript issue tracker, or drop us a message in Discord.