purs-loader
purs-loader copied to clipboard
Main entry point support
I notice in your example webpack config you have { entry: './src/entry' }
, which is a JS file that require
s any PureScript modules that you need.
In my case, I just want to call Main.main, so mine looks like this: require('./Main.purs').main();
It seems like it would be cleaner if you could just use { entry: './src/Main.purs' }
directly.
I believe the browserify/psc-bundle toolchain does something like this already. Would you consider adding it to purs-loader? I'm fairly new to PureScript, but happy to do the lifting with a bit of direction. (Though maybe #31 would make this irrelevant anyway.)
Thanks for checking out the purs-loader
. I agree it would be handy to use Main.purs
as the entry directly. I will have to look into whether webpack supports something like this.
This does in fact work. See: ethul/purescript-webpack-example@923f3c1d79cee40e6d6b488cd2f985f484e17af3
@ethul I just tried building https://github.com/ethul/purescript-webpack-example but it didn't work:
/*!************************!*\
!*** ./src/Entry.purs ***!
\************************/
/***/ function(module, exports, __webpack_require__) {
// Generated by psc version 0.10.1
"use strict";
var $foreign = __webpack_require__(/*! ./src/Entry.js */ 1);
var Prelude = __webpack_require__(/*! ./bower_components/purescript-prelude/src/Prelude.purs */ 2);
var Control_Monad_Eff = __webpack_require__(/*! ./bower_components/purescript-eff/src/Control/Monad/Eff.purs */ 43);
var Control_Monad_Eff_Unsafe = __webpack_require__(/*! ./bower_components/purescript-eff/src/Control/Monad/Eff/Unsafe.purs */ 45);
var Example_Test = __webpack_require__(/*! ./src/Example/Test.purs */ 47);
var Example_Foo = __webpack_require__(/*! ./src/Example/Foo.purs */ 49);
var Example_Foo_Baz = __webpack_require__(/*! ./src/Example/Foo/Baz.purs */ 53);
var result = Control_Monad_Eff_Unsafe.unsafePerformEff($foreign.hot);
module.exports = {
result: result,
hot: $foreign.hot
};
//# sourceMappingURL=index.js.map
Notice that it does not call anything, therefore it does nothing when running node bundle.js
The point of this issue is to automatically call the main
Eff from the Main
module, just like when using psc-bundle --main Main
Agreed. You're totally correct. I was too soon on closing this. I've been updating the example further. Please see: https://github.com/ethul/purescript-webpack-example/blob/30265626f89b605bf24be94a8f7fadd2610bcd23/src/Example.purs#L17-L25
@ethul With psc-bundle
, it is not necessary to use unsafePerformEff
, instead you simply return an Eff
from main
, which is idiomatic in PureScript.
I think purs-loader
should support a main
option, similar to psc-bundle
@ethul Hm, actually, I thought about it some more. Webpack supports multiple entry points, so you would really want to be able to specify a different main
per entry point. That complicates things a lot.
If you only have a single entry point, you can currently use the following to specify the main
:
module: {
loaders: [
{
test: /\.purs$/,
loader: "purs-loader",
exclude: /node_modules/,
query: {
bundle: true,
pscBundleArgs: {
main: "Main"
},
src: ["bower_components/purescript-*/src/**/*.purs", "src/**/*.purs"]
}
}
]
}
Right. So you can return an Eff
instead of performing the IO, but I am unsure how webpack would know to run this.
Maybe the loader could create a wrapper entry module that invokes this function. Supporting a main for each entry could maybe be done in a similar way if the loader was able to know which modules are "entry modules" then it can wrap each of the entries, and we'd need a configuration that we can lookup the right main function using the module name (as one idea).
E.g.,
{
moduleMainFunctions: {
'ExampleEntry1': 'example1',
'ExampleEntry2': 'example2'
}
}
@saevarb Thanks for your feedback.
Does your issue relate to #33 or are you describing a new issue?
If you are able to provide a little more explanation on how your issue fits into with #33, I'll be better able to investigate this.