]> git.immae.eu Git - github/fretlink/purs-loader.git/blame - README.md
Version 3.0.0-beta.1
[github/fretlink/purs-loader.git] / README.md
CommitLineData
a42f24b8 1# purs-loader
2
08b34471 3> [PureScript](http://www.purescript.org) loader for [webpack](http://webpack.github.io)
a42f24b8 4
7de41f10
AM
5- Supports hot-reloading and rebuilding of single source files
6- Dead code elimination using the `bundle` option
7- Colorized build output using `purescript-psa` and the `psc: "psa"` option
8
a42f24b8 9## Install
10
63d6a244 11Install with [npm](https://npmjs.org/package/purs-loader).
12
a42f24b8 13```
1c12889c 14// For PureScript 0.11 and newer
a9a26a84 15npm install purs-loader --save-dev
2b2207bd 16
1c12889c 17// For PureScript 0.9 and 0.10
18npm install purs-loader@purescript-0.9 --save-dev
19
495b765e 20// For PureScript 0.8
689268da 21npm install purs-loader@purescript-0.8 --save-dev
a42f24b8 22```
23
a42f24b8 24## Example
25
7de41f10
AM
26```javascript
27const webpackConfig = {
28 // ...
29 loaders: [
30 // ...
31 {
32 test: /\.purs$/,
33 loader: 'purs-loader',
34 exclude: /node_modules/,
35 query: {
36 psc: 'psa',
2b2207bd 37 src: ['bower_components/purescript-*/src/**/*.purs', 'src/**/*.purs']
7de41f10
AM
38 }
39 }
40 // ...
41 ]
42 // ...
43}
44```
45
44eb153b 46Refer to the [purescript-webpack-example](https://github.com/ethul/purescript-webpack-example) for a more detailed example.
47
5163b5a2
AM
48### Options
49
7de41f10
AM
50Default options:
51
52```javascript
86e2b3d4 53const loaderConfig = {
f5643707 54 psc: null, // purs compile
7de41f10 55 pscArgs: {},
f5643707 56 pscBundle: null, // purs bundle
7de41f10 57 pscBundleArgs: {},
5163b5a2 58 pscIde: false, // instant rebuilds using psc-ide-server (experimental)
39d11a26 59 pscIdeArgs: {}, // for example, to use different psc-ide-server port: {port: 4088}
6ab1eca0 60 pscIdeServerArgs: {}, // for example, to change the port { port: 4088 }
7de41f10 61 pscIdeColors: false, // defaults to true if psc === 'psa'
86e2b3d4 62 pscPackage: false,
7de41f10
AM
63 bundleOutput: 'output/bundle.js',
64 bundleNamespace: 'PS',
65 bundle: false,
66 warnings: true,
cbb75795 67 watch: false, // indicates if webpack is in watch mode
7de41f10
AM
68 output: 'output',
69 src: [
70 path.join('src', '**', '*.purs'),
86e2b3d4 71 // if pscPackage = false
7de41f10 72 path.join('bower_components', 'purescript-*', 'src', '**', '*.purs')
495b765e 73 // if pscPackage = true
74 // source paths reported by `psc-package sources`
2b2207bd 75 ]
7de41f10
AM
76}
77```
5163b5a2 78
495b765e 79### `psc-ide` support (experimental)
5163b5a2
AM
80
81Experimental support for instant rebuilds using `psc-ide-server` can be enabled
82via the `pscIde: true` option.
4343e0eb
MK
83You can use an already running `psc-ide-server` instance by specifying the port in `pscIdeArgs`,
84if there is no server running this loader will start one for you.
85
03f52cb3 86### `psc-package` support (experimental)
87
88Set `pscPackage` query parameter to `true` to enable `psc-package` support. The `psc-package`-supplied source paths
89will be appended to `src` parameter.
90
91### Troubleshooting
4343e0eb 92
03f52cb3 93#### Slower webpack startup after enabling psc-ide support?
4343e0eb
MK
94
95By default, the psc-ide-server will be passed the globs from query.src, this is
96helpful for other tools using psc-ide-server (for example IDE plugins), however
97it might result in a slower initial webpack startup time (rebuilds are not
98affected). To override the default behaviour, add:
99`pscIdeServerArgs: { "_": ['your/*globs/here'] }` to the loader config
100
03f52cb3 101#### Errors not being displayed in watch mode?
4343e0eb 102
03f52cb3 103When the `watch` option is set to `true`, psc errors are appended to
104webpack's compilation instance errors array and not passed back as an
105error to the loader's callback. This may result in the error not being
106reported by webpack. To display errors, the following plugin may be added
107to the webpack config.
108
109```javascript
110const webpackConfig = {
111 // ...
112 plugins: [
113 function(){
114 this.plugin('done', function(stats){
115 process.stderr.write(stats.toString('errors-only'));
116 });
117 }
118 ]
119 // ...
120}
121```
ab944285 122
123#### Error `spawn ENOENT`
124
125This is caused when the loader tries to spawn a binary that does not exists
126(`file or directory not found`). If you call webpack like `webpack` or
be05a055 127`webpack --watch`, then ensure that all required binaries that the
ab944285 128loader depends on are available in your `$PATH`.
129
be05a055 130If you run webpack through an npm script (e.g., npm run or npm start) on NixOS,
131then it will first attempt to find binaries in `node_packages/.bin`.
132If you have the compiler installed through `npm` and it finds it there, this will
133cause `ENOENT`on Nix, because [the binary needs to be patched first, but npm will
134install the binary that is linked with /lib64/ld-linux-x86-64.so.2 - a file that
135will not exist at that path in NixOS](https://github.com/ethul/purescript-webpack-example/issues/5#issuecomment-282492131).
ab944285 136The solution is to simply use the compiler from `haskellPackages.purescript` and
137make sure that it's available in `$PATH`. For more information about how to make
138it work on Nix, see [Purescript Webpack Example](https://github.com/ethul/purescript-webpack-example#using-globally-installed-binaries)