I’m writing a CLI program in ReScript. I want to let users define a ReScript module that would change some behaviour of my program.
In JavaScript, I would let users set an option that defines a Node module, which I would then load with require() or dynamic import.
In ReScript I can load the code by writing custom bindings for require() / import() (if I figure out how to find/create the compiled .bs.js), but I wont be able to use it as a ReScript module.
Any ideas on how to make this work?
How about using a first-class module? You can dynamically switch behaviour at runtime by picking among different first-class modules.
1 Like
The problem is that the code of the module has to come from the user. From the user perspective it should look something like this:
$ node my-program.bs.js --config config.res
Or:
$ node my-program.bs.js --config CustomConfig
(Where CustomConfig is implemented in a file that was not available during compilation of my-program.bs.js)
I’ll probably go with config.js instead, but maybe there’s a way to make .res work?
Not that I can think of, since ReScript is statically compiled. You can of course bind to the import() function and load the module as a promise at runtime, provided you give it a fixed module type. In other words the config has to have a specific shape.
3 Likes