First try to download a prebuilt PureScript binary, then build from a source if the prebuilt one is unavailable
npm install download-or-build-purescript


First try to download a prebuilt PureScript binary, then build from a source if the prebuilt one is unavailable
``javascript
const {readdir} = require('fs').promise;
const {execFile} = require('child_process');
const downloadOrBuildPurescript = require('download-or-build-purescript');
downloadOrBuildPurescript({version: '0.12.3'}).subscribe({
next(event) {
if (event.id === 'head:complete') {
console.log('✓ Prebuilt binary exists.');
return;
}
if (event.id === 'download-binary:complete') {
console.log('✓ Binary downloaded.');
return;
}
if (event.id === 'check-binary:complete') {
console.log('✓ Binary works correctly.');
return;
}
}
async complete() {
await readdirSync('.').includes('purs'); //=> true
execFile('./purs', ['--version'], (err, stdout) => {
stdout.toString(); //=> '0.12.3\n'
});
}
});
`
``
npm install download-or-build-purescript
`javascript`
const downloadOrBuildPurescript = require('download-or-build-purescript');
options: Object Observable
Return: (Kevin Smith's implementation)
When the Observable is subscribed,
1. it downloads a prebuilt PureScript binary from the PureScript release page
2. if a prebuilt binary is not available, it downloads the PureScript source code and builds a binary form it
3. it puts the binary at the current working directory
while successively sending events to its Observer.
#### Events
Each event object has id property with one of these values:
* head
* head:fail
* head:complete
* download-binary
* download-binary:fail
* download-binary:complete
* check-binary
* check-binary:fail
* check-binary:complete
* check-stack
* check-stack:complete
* download-source
* download-source:complete
* setup
* setup:complete
* build
* build:complete
``
head ------------ x -+- check-stack ----- x -+
| | | |
o | o |
| | | |
download-binary - x -+ download-source - x -+
| | | |
o | o |
| | | |
check-binary ---- x -+ setup ----------- x -+
| | |
| o |
| | |
| build ----------- x -+
| | |
o o |
| | |
^^^^^^^
Downloaded a Built a binary Error
prebuilt binary from the source ^^^^^^^
##### head
Fires when it starts to check if a prebuilt binary is provided for the current platform.
`javascript`
{
id: 'head'
}
##### head:fail
Fires when it cannot start downloading the binary, for example no prebuilt ones are provided for the current platform.
`javascript`
{
id: 'head:fail',
error:
}
##### head:complete
Fires when it confirms that a prebuilt binary is provided for the current platform.
`javascript`
{
id: 'head:complete'
}
##### download-binary
Fires many times while downloading and extracting the prebuilt binary.
entry and response properties are derived from dl-tar.
`javascript`
{
id: 'download-binary',
entry:
response: {
bytes:
headers:
##### download-binary:fail
Fires when it fails to download the binary somehow.
`javascript`
{
id: 'download-binary:fail',
error:
}
##### download-binary:complete
Fires when the prebuilt binary is successfully downloaded.
`javascript`
{
id: 'download-binary:complete'
}
##### check-binary
Fires when it starts to verify the downloaded prebuilt binary works correctly, by running purs --version.
`javascript`
{
id: 'check-binary'
}
##### check-binary:fail
Fires when the downloaded binary doesn't work correctly.
`javascript`
{
id: 'check-binary:fail',
error:
}
##### check-binary:complete
Fires when it verifies the downloaded binary works correctly.
`javascript`
{
id: 'check-binary:complete'
}
##### check-stack
Fires after one of these events: head:fail download-binary:fail check-binary:fail.
path property is the absolute path of the stack command, and version property is its version.
`javascript`
{
id: 'check-stack',
path:
version:
}
##### check-stack:complete
Fires after making sure the stack command is installed in your $PATH.
`javascript`
{
id: 'check-binary:complete'
}
##### download-source
Fires many times while downloading and extracting the PureScript source code.
entry and response properties are derived from dl-tar.
`javascript`
{
id: 'download-source',
entry:
response: {
bytes:
headers:
##### download-source:complete
Fires when the source code is successfully downloaded.
`javascript`
{
id: 'download-source'
}
##### setup setup:complete build build:complete
Inherited from build-purescript.
#### Errors
Every error passed to the Observer has id property that indicates which step the error occurred at.
`javascriptstack
// When the command is not installedstack
downloadOrBuildPureScript().subscribe({
error(err) {
err.message; //=> ' command is not found in your PATH ...'
err.id; //=> 'check-stack'
}
});
// When your machine lose the internet connection while downloading the source
downloadOrBuildPureScript().subscribe({
error(err) {
err.message; //=> 'socket hang up'
err.id; //=> 'download-source'
}
});
`
#### Options
Options are directly passed to download-purescript and build-purescript. Note that,
* filter option is not supported.revision
* option is not supported. Use version option instead.
Additionally, you can use the following:
##### rename
Type: Function v => v
Default:
Receives the original binary name (purs on POSIX, purs.exe on Windows) and modifies the binary name to its return value.
`javascript
const {extname} = require('path');
downloadOrBuildPurescript('./dest', {
rename(originalName) {
const ext = extname(originalName); //=> '' on POSIX, '.exe' on Windows
return foo${ext};``
}
}).subscribe({
complete() {
// Creates a binary to './dest/foo' on POSIX, './dest/foo.exe' on Windows
}
});
ISC License © 2017 - 2019 Shinnosuke Watanabe