From c55185f65494f019b836c1bd0dbcd47f392c9552 Mon Sep 17 00:00:00 2001 From: eric thul Date: Mon, 30 Mar 2015 20:50:56 -0400 Subject: [PATCH 1/2] Use local purescript binaries The plugin first will check if local binaries are available and check for global binaries as a fallback. Resolves #19 --- index.js | 137 ++++++++++++++++++++++++++++++--------------------- package.json | 1 + 2 files changed, 81 insertions(+), 57 deletions(-) diff --git a/index.js b/index.js index 405b0ce..baa1971 100644 --- a/index.js +++ b/index.js @@ -20,9 +20,15 @@ var logalot = require('logalot'); var multipipe = require('multipipe'); +var resolveBin = require('resolve-bin'); + var options = require('./options'); -var pluginName = 'gulp-purescript'; +var packageJson = require('./package.json'); + +var pluginName = packageJson.name; + +var purescriptPackage = 'purescript'; var psciFilename = '.psci'; @@ -38,16 +44,24 @@ var PluginError = gutil.PluginError; var File = gutil.File; -function runCommand(cmd, args, k) { - var err = [ 'Failed to find ' + gutil.colors.magenta(cmd), 'in your path.' - , 'Please ensure that ' + gutil.colors.magenta(cmd) - , 'is available on your system.' ].join(' '); +function resolve(cmd, callback) { + var err = 'Failed to find ' + gutil.colors.cyan(cmd) + '. Please ensure it is available on your system.'; - var that = this; + resolveBin(purescriptPackage, {executable: cmd}, function(e, bin){ + if (!e) callback(null, bin); + else { + which(cmd, function(e){ + if (e) callback(err); + else callback(null, cmd); + }); + } + }); +} - which(cmd, function(e){ - if (e) that.emit('error', new PluginError(pluginName, err)); - else k(child_process.spawn(cmd, args)); +function execute(cmd, args, callback) { + resolve(cmd, function(e, bin){ + if (e) callback(new PluginError(pluginName, e)); + else callback(null, child_process.spawn(bin, args)); }); } @@ -102,21 +116,24 @@ function psc(opts) { var buffere = new Buffer(0); - runCommand.apply(this, [options.psc.cmd, args, function(cmd){ - cmd.stdout.on('data', function(stdout){buffero = Buffer.concat([buffero, new Buffer(stdout)]);}); - - cmd.stderr.on('data', function(stderr){buffere = Buffer.concat([buffere, new Buffer(stderr)]);}); - - cmd.on('close', function(code){ - if (code !== 0) callback(new PluginError(pluginName, buffere.toString())); - else { - callback(null, new File({ - path: output, - contents: buffero - })); - } - }); - }]); + execute(options.psc.cmd, args, function(e, cmd){ + if (e) callback(e); + else { + cmd.stdout.on('data', function(stdout){buffero = Buffer.concat([buffero, new Buffer(stdout)]);}); + + cmd.stderr.on('data', function(stderr){buffere = Buffer.concat([buffere, new Buffer(stderr)]);}); + + cmd.on('close', function(code){ + if (code !== 0) callback(new PluginError(pluginName, buffere.toString())); + else { + callback(null, new File({ + path: output, + contents: buffero + })); + } + }); + } + }); } return multipipe(collectPaths(), through2.obj(transform)); @@ -130,24 +147,27 @@ function pscMake(opts) { var buffere = new Buffer(0); - runCommand.apply(this, [options.pscMake.cmd, args, function(cmd){ - cmd.stdout.on('data', function(stdout){buffero = Buffer.concat([buffero, new Buffer(stdout)]);}); - - cmd.stderr.on('data', function(stderr){buffere = Buffer.concat([buffere, new Buffer(stderr)]);}); - - cmd.on('close', function(code){ - var message = - function() { return [ gutil.colors.cyan(options.pscMake.cmd) - , buffero.toString() - , buffere.toString() ].join('\n') }; - - if (code !== 0) callback(new PluginError(pluginName, message())); - else { - if (isVerbose) logalot.info(message()); - callback(); - } - }); - }]); + execute(options.pscMake.cmd, args, function(e, cmd){ + if (e) callback(e); + else { + cmd.stdout.on('data', function(stdout){buffero = Buffer.concat([buffero, new Buffer(stdout)]);}); + + cmd.stderr.on('data', function(stderr){buffere = Buffer.concat([buffere, new Buffer(stderr)]);}); + + cmd.on('close', function(code){ + var message = + function() { return [ gutil.colors.cyan(options.pscMake.cmd) + , buffero.toString() + , buffere.toString() ].join('\n') }; + + if (code !== 0) callback(new PluginError(pluginName, message())); + else { + if (isVerbose) logalot.info(message()); + callback(); + } + }); + } + }); }; return multipipe(collectPaths(), through2.obj(transform)); @@ -161,21 +181,24 @@ function pscDocs(opts) { var buffere = new Buffer(0); - runCommand.apply(this, [options.pscDocs.cmd, args, function(cmd){ - cmd.stdout.on('data', function(stdout){buffero = Buffer.concat([buffero, new Buffer(stdout)]);}); - - cmd.stderr.on('data', function(stderr){buffere = Buffer.concat([buffere, new Buffer(stderr)]);}); - - cmd.on('close', function(code){ - if (code !== 0) callback(new PluginError(pluginName, buffere.toString())); - else { - callback(null, new File({ - path: '.', - contents: buffero - })); - } - }); - }]); + execute(options.pscDocs.cmd, args, function(e, cmd){ + if (e) callback(e); + else { + cmd.stdout.on('data', function(stdout){buffero = Buffer.concat([buffero, new Buffer(stdout)]);}); + + cmd.stderr.on('data', function(stderr){buffere = Buffer.concat([buffere, new Buffer(stderr)]);}); + + cmd.on('close', function(code){ + if (code !== 0) callback(new PluginError(pluginName, buffere.toString())); + else { + callback(null, new File({ + path: '.', + contents: buffero + })); + } + }); + } + }); } return multipipe(collectPaths(), through2.obj(transform)); diff --git a/package.json b/package.json index 6aba085..bb8d98f 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "logalot": "^2.1.0", "minimist": "^1.1.1", "multipipe": "^0.1.2", + "resolve-bin": "^0.3.0", "through2": "^0.6.3", "which": "^1.0.9" }, From dd64b32dce4256583423f904afe674b5a5c37658 Mon Sep 17 00:00:00 2001 From: eric thul Date: Mon, 30 Mar 2015 23:41:46 -0400 Subject: [PATCH 2/2] Updating README --- README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6c2d343..e632307 100644 --- a/README.md +++ b/README.md @@ -10,24 +10,27 @@ Install with [npm](https://npmjs.org/package/gulp-purescript) npm install gulp-purescript --save-dev ``` +## Binaries + +This plugin requires that the PureScript binaries first be installed. The binaries may be installed using the [purescript](https://www.npmjs.com/package/purescript) NPM package or as described on the PureScript [installation](https://github.com/purescript/purescript/wiki/Language-Guide:-Getting-Started#installation) section of the GitHub wiki. + ## Example ```js -var gulp = require('gulp') - , purescript = require('gulp-purescript') -; +var gulp = require('gulp'); + +var purescript = require('gulp-purescript'); + gulp.task('purescript', function(){ - return ( - gulp.src('src/**/*.purs.hs'). - pipe(purescript.psc({noPrelude: true})). - pipe(gulp.dest('dist/')) - ); + return gulp.src('src/**/*.purs'). + pipe(purescript.psc({noPrelude: true})). + pipe(gulp.dest('build')); }); ``` ## API -Refer to the PureScript [usage](http://docs.purescript.org/en/latest/start.html#compiler-usage) section for additional details on the behaviour of each option below. +Refer to the PureScript [compiler usage](https://github.com/purescript/purescript/wiki/Language-Guide:-Getting-Started#compiler-usage) section of the Github wiki for additional details on the behaviour of each option below. ### purescript.psc(options)