From 7cbbb0c2b9ee6fa2e1126f1e34db1e19b1725728 Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Mon, 29 May 2017 18:49:54 +0200 Subject: [PATCH 1/7] Add capability to execute command on successful interactive builds --- README.md | 6 ++++-- src/cli/opts.js | 2 +- src/main.js | 26 +++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ed18492..a215856 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ $ ez-build --help --no-copy disable copying of non-code files to lib --no-debug disable source map generation --log log output format [normal] - --interactive watch for and recompile on changes (implies -O 0) + --interactive [cmd] watch for and recompile on changes, optionally executing cmd on successful builds (implies -O 0) --production enable production options (implies -O 1) --flags toggle build flags @ read options from the file at (relative to cwd) @@ -126,10 +126,12 @@ By default ez-build will generate source maps and other debugging information fo Determines the output format of ez-build's log. This is generally not used, but setting it to `json` provides additional detail and can sometimes help in debugging issues. -### `--interactive` +### `--interactive [cmd]` Runs ez-build in interactive mode, meaning it will run continuously and watch for changes to input files and directories. This is very useful for rapid development, since it's much faster to rebuild only what changed than the entire project. Setting this flag implies `-O 0` which disables all optimizations. +Optionally, this mode can execute a command on successful builds. For example, this might be used to run a test suite whenever a build passes. Commands that include spaces *must* be properly quoted with double quotes. + This flag is ignored entirely if combined with `--production`. If `NODE_ENV=production` is set when invoking ez-build with `--interactive`, it will still enter interactive mode, but will *not* change the value of `NODE_ENV`. diff --git a/src/cli/opts.js b/src/cli/opts.js index 776e70f..3b31a26 100644 --- a/src/cli/opts.js +++ b/src/cli/opts.js @@ -47,7 +47,7 @@ export default async function parse(pkg, argv) { .option('--no-copy', `disable copying of non-code files to ${defaults.lib}`, Boolean, !defaults.copy) .option('--no-debug', 'disable source map generation', Boolean, !defaults.debug) .option('--log ', `log output format [${defaults.log}]`, /^(json|normal)$/i, defaults.log) - .option('--interactive', `watch for and recompile on changes (implies -O 0)`) + .option('--interactive [cmd]', `watch for and recompile on changes (implies -O 0)`) .option('--production', `enable production options (implies -O 1)`) .option('--target-browsers ', `define target browser environments: [${defaults.targetBrowsers}]`, concatFlags, []) .option('--target-node ', `define target node environment: [${defaults.targetNode}]`, defaults.targetNode) diff --git a/src/main.js b/src/main.js index 0f75bb6..59d4f13 100644 --- a/src/main.js +++ b/src/main.js @@ -12,6 +12,7 @@ import { watch } from 'chokidar' import { timed } from './util/performance' import './util/cli' import { default as parseOpts } from './cli/opts' +import { execSync } from 'child_process' const keys = Object.keys const all = Promise.all.bind(Promise) @@ -76,9 +77,28 @@ async function main() { .on('add', build) .on('change', build) + let cmd = typeof opts.interactive === 'string'? opts.interactive : false + async function build(file) { - let result = await execute(type, pipeline[type], file) - await status(type, ...result) + let results = await execute(type, pipeline[type], file) + await status(type, ...results) + + if (cmd) { + let success = true + + for (let result of results) { + let { input, messages, files, error } = await result + + if (error) { + success = false + break + } + } + + if (success) { + execSync(cmd, { stdio: 'inherit' }) + } + } } }) console.info('Watching source files for changes...') @@ -235,4 +255,4 @@ Comments on the detected babel configuration: } return !!babelrc -} \ No newline at end of file +} From df5a549857841ab1186cb4073dffcaf97c4f3e50 Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Mon, 29 May 2017 18:50:19 +0200 Subject: [PATCH 2/7] Add tests for executing commands on successful interactive builds --- ..._should_build_files_when_they_are_added--1 | 3 + ...ld_rebuild_files_when_they_are_modified--1 | 2 + ..._--interactive__should_wait_for_changes--1 | 1 + ..._should_build_files_when_they_are_added--1 | 5 ++ ...ly_execute_command_on_successful_builds--1 | 12 ++++ ...ld_rebuild_files_when_they_are_modified--1 | 3 + ...echo_success____should_wait_for_changes--1 | 1 + test/cli/interactive-exec.bats | 58 +++++++++++++++++++ test/cli/interactive.bats | 37 +++++------- test/cli/test-util.bash | 4 +- test/unit/cli/opts.test.js | 27 ++++++++- 11 files changed, 125 insertions(+), 28 deletions(-) create mode 100644 test/cli/expected/interactive--_ez-build_--interactive__should_build_files_when_they_are_added--1 create mode 100644 test/cli/expected/interactive--_ez-build_--interactive__should_rebuild_files_when_they_are_modified--1 create mode 100644 test/cli/expected/interactive--_ez-build_--interactive__should_wait_for_changes--1 create mode 100644 test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_build_files_when_they_are_added--1 create mode 100644 test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 create mode 100644 test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_rebuild_files_when_they_are_modified--1 create mode 100644 test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_wait_for_changes--1 create mode 100644 test/cli/interactive-exec.bats diff --git a/test/cli/expected/interactive--_ez-build_--interactive__should_build_files_when_they_are_added--1 b/test/cli/expected/interactive--_ez-build_--interactive__should_build_files_when_they_are_added--1 new file mode 100644 index 0000000..5eec1e0 --- /dev/null +++ b/test/cli/expected/interactive--_ez-build_--interactive__should_build_files_when_they_are_added--1 @@ -0,0 +1,3 @@ +Watching source files for changes... +js – src/a.js -> lib/a.js,lib/a.js.map +js – src/added.js -> lib/added.js,lib/added.js.map diff --git a/test/cli/expected/interactive--_ez-build_--interactive__should_rebuild_files_when_they_are_modified--1 b/test/cli/expected/interactive--_ez-build_--interactive__should_rebuild_files_when_they_are_modified--1 new file mode 100644 index 0000000..d0075b8 --- /dev/null +++ b/test/cli/expected/interactive--_ez-build_--interactive__should_rebuild_files_when_they_are_modified--1 @@ -0,0 +1,2 @@ +Watching source files for changes... +js – src/a.js -> lib/a.js,lib/a.js.map diff --git a/test/cli/expected/interactive--_ez-build_--interactive__should_wait_for_changes--1 b/test/cli/expected/interactive--_ez-build_--interactive__should_wait_for_changes--1 new file mode 100644 index 0000000..ec2439f --- /dev/null +++ b/test/cli/expected/interactive--_ez-build_--interactive__should_wait_for_changes--1 @@ -0,0 +1 @@ +Watching source files for changes... diff --git a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_build_files_when_they_are_added--1 b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_build_files_when_they_are_added--1 new file mode 100644 index 0000000..305d433 --- /dev/null +++ b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_build_files_when_they_are_added--1 @@ -0,0 +1,5 @@ +Watching source files for changes... +js – src/a.js -> lib/a.js,lib/a.js.map +success! +js – src/added.js -> lib/added.js,lib/added.js.map +success! diff --git a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 new file mode 100644 index 0000000..6b11aba --- /dev/null +++ b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 @@ -0,0 +1,12 @@ +Watching source files for changes... +js – src/a.js -> lib/a.js,lib/a.js.map +success! +js – src/added.js -> lib/added.js,lib/added.js.map +success! +js – src/b.js: Unexpected token, expected { (8:7) + 6 | } + 7 | +> 8 | export all from foo + | ^ + 9 | export default 'b' + 10 |  diff --git a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_rebuild_files_when_they_are_modified--1 b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_rebuild_files_when_they_are_modified--1 new file mode 100644 index 0000000..7b1402c --- /dev/null +++ b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_rebuild_files_when_they_are_modified--1 @@ -0,0 +1,3 @@ +Watching source files for changes... +js – src/a.js -> lib/a.js,lib/a.js.map +success! diff --git a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_wait_for_changes--1 b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_wait_for_changes--1 new file mode 100644 index 0000000..ec2439f --- /dev/null +++ b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_wait_for_changes--1 @@ -0,0 +1 @@ +Watching source files for changes... diff --git a/test/cli/interactive-exec.bats b/test/cli/interactive-exec.bats new file mode 100644 index 0000000..ceda701 --- /dev/null +++ b/test/cli/interactive-exec.bats @@ -0,0 +1,58 @@ +#!/usr/bin/env bats +load test-util + +setup() { + load_fixture typical-project + + if [[ "${BATS_TEST_NUMBER}" -eq 1 ]]; then + { + kill $(cat ez-build.pid) && wait $(cat ez-build.pid) + } 2>/dev/null + + ${EZ_BUILD_BIN} --interactive "echo success!" > build.log 2>&1 & + EZPID=$! + disown ${EZPID} + echo ${EZPID} > ez-build.pid + fi +} + +teardown() { + if [[ "$BATS_TEST_NUMBER" -eq "${#BATS_TEST_NAMES[@]}" ]]; then + { + kill $(cat ez-build.pid) && wait $(cat ez-build.pid) + } 2>/dev/null + rm *.{pid,log} + fi + + unload_fixture typical-project +} + +eventually() { + sleep 3 +} + +@test "'ez-build --interactive \"echo success!\"' should wait for changes" { + eventually + assert_expected "$(cat build.log)" +} + +@test "'ez-build --interactive \"echo success!\"' should rebuild files when they are modified" { + touch src/a.js + eventually + assert_expected "$(cat build.log)" +} + +@test "'ez-build --interactive \"echo success!\"' should build files when they are added" { + refute_exists src/added.js + touch src/added.js + eventually + assert_exists lib/added.js + assert_exists lib/added.js.map + assert_expected "$(cat build.log)" +} + +@test "'ez-build --interactive \"echo success!\"' should only execute command on successful builds" { + touch src/b.js + eventually + assert_expected "$(cat build.log)" +} diff --git a/test/cli/interactive.bats b/test/cli/interactive.bats index 9fcf179..3faa2ba 100644 --- a/test/cli/interactive.bats +++ b/test/cli/interactive.bats @@ -1,23 +1,6 @@ #!/usr/bin/env bats load test-util -eventually() { - for try in $(seq 1 30); do - set +e - output="$(eval ${@})" - status=$? - set -e - - if [[ ${status} == 0 ]]; then - return 0 - fi - sleep 1 - done - - echo "${output}" - return ${status} -} - setup() { load_fixture typical-project @@ -26,7 +9,7 @@ setup() { kill $(cat ez-build.pid) && wait $(cat ez-build.pid) } 2>/dev/null - ${EZ_BUILD_BIN} --interactive 2>&1 > build.log & + ${EZ_BUILD_BIN} --interactive > build.log 2>&1 & EZPID=$! disown ${EZPID} echo ${EZPID} > ez-build.pid @@ -44,18 +27,26 @@ teardown() { unload_fixture typical-project } +eventually() { + sleep 3 +} + @test "'ez-build --interactive' should wait for changes" { - eventually 'assert_equal "Watching source files for changes..." "$(tail -1 build.log)"' + eventually + assert_expected "$(cat build.log)" } @test "'ez-build --interactive' should rebuild files when they are modified" { touch src/a.js - eventually 'assert_equal "js – src/a.js -> lib/a.js,lib/a.js.map" "$(tail -1 build.log)"' + eventually + assert_expected "$(cat build.log)" } @test "'ez-build --interactive' should build files when they are added" { refute_exists src/added.js touch src/added.js - eventually 'assert_exists lib/added.js' - eventually 'assert_exists lib/added.js.map' -} \ No newline at end of file + eventually + assert_exists lib/added.js + assert_exists lib/added.js.map + assert_expected "$(cat build.log)" +} diff --git a/test/cli/test-util.bash b/test/cli/test-util.bash index 46d11dc..45bb4f8 100644 --- a/test/cli/test-util.bash +++ b/test/cli/test-util.bash @@ -69,7 +69,7 @@ assert_equal() { expected="${1}" actual="${2}" fi - + diff=$(echo ${expected[@]} ${actual[@]} | tr ' ' '\n' | sort | uniq -u) if [[ -z "${diff}" ]]; then @@ -188,4 +188,4 @@ unload_fixture() { echo "unknown fixture: ${fixture}" return 1 fi -} \ No newline at end of file +} diff --git a/test/unit/cli/opts.test.js b/test/unit/cli/opts.test.js index 2bc4e12..dc112d7 100644 --- a/test/unit/cli/opts.test.js +++ b/test/unit/cli/opts.test.js @@ -8,7 +8,7 @@ import } from 'js-combinatorics' test('Options', async t => { - t.plan(57) + t.plan(65) const barePkg = await readFixture('bare-project') , typicalPkg = await readFixture('typical-project') @@ -72,7 +72,7 @@ test('Options', async t => { }, {}) ).map(async ({ input, expected }) => { let actual = await parseOpts(barePkg, argv('--flags', `${input}`)) - + if (!deepEqual(actual.flags, defaultFlags)) { t.deepEqual(actual.flags, defaultFlags, `--flags ${input}`) } @@ -149,6 +149,27 @@ test('Options', async t => { t.ok(opts.interactive, 'enables interactive mode') t.notOk(opts.production, 'leaves production mode disabled') + t.comment('Options > --interactive foo') + opts = await parseOpts(barePkg, argv('--interactive', 'foo')) + t.equal(opts.optimize, 0, 'implies -O 0') + t.ok(opts.interactive, 'enables interactive mode') + t.equal(opts.interactive, 'foo', 'Command equals `foo`') + t.notOk(opts.production, 'leaves production mode disabled') + + t.comment('Options > --interactive foo bar') + opts = await parseOpts(barePkg, argv('--interactive', 'foo', 'bar')) + t.equal(opts.optimize, 0, 'implies -O 0') + t.ok(opts.interactive, 'enables interactive mode') + t.equal(opts.interactive, 'foo', 'Command equals `foo`') + t.notOk(opts.production, 'leaves production mode disabled') + + t.comment('Options > --interactive "foo bar"') + opts = await parseOpts(barePkg, argv('--interactive', 'foo bar')) + t.equal(opts.optimize, 0, 'implies -O 0') + t.ok(opts.interactive, 'enables interactive mode') + t.equal(opts.interactive, 'foo bar', 'Command equals `foo bar`') + t.notOk(opts.production, 'leaves production mode disabled') + t.comment('Options > --src and --lib directories') opts = await parseOpts(typicalPkg, argv()) t.equal(opts.src, typicalPkg.relative(typicalPkg.directories.src), 'should pick up src path from package.directories.src if --src is not specified') @@ -226,4 +247,4 @@ function generateCombinations(flags) { }, { input: [], expected: {} }) )) }, []) -} \ No newline at end of file +} From 211f909ca2e359326753a772cc8d48c9cc8078d3 Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Mon, 29 May 2017 20:26:46 +0200 Subject: [PATCH 3/7] Updated expected result for interactive-exec failure test --- ...hould_only_execute_command_on_successful_builds--1 | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 index 6b11aba..1a9b7d1 100644 --- a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 +++ b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 @@ -4,9 +4,8 @@ success! js – src/added.js -> lib/added.js,lib/added.js.map success! js – src/b.js: Unexpected token, expected { (8:7) - 6 | } - 7 | -> 8 | export all from foo - | ^ - 9 | export default 'b' - 10 |  + 6 | } + 7 | +> 8 | export all from foo + | ^ + 9 | export default 'b' From 9a9b659ce9ff38768c0afa9ff2c59bc37792dfaf Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Mon, 29 May 2017 22:57:09 +0200 Subject: [PATCH 4/7] Bring back `eventually` in interactive tests The interactive tests seem to fail under node 4 because it's much slower and the timeouts we were using are too short. This makes the tests retry for 30s until they hopefully pass. If need be this limit can be extended, but hopefully it's not necessary. --- test/cli/interactive-exec.bats | 20 ++++++-------------- test/cli/interactive.bats | 17 +++++------------ test/cli/test-util.bash | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/test/cli/interactive-exec.bats b/test/cli/interactive-exec.bats index ceda701..afe8039 100644 --- a/test/cli/interactive-exec.bats +++ b/test/cli/interactive-exec.bats @@ -27,32 +27,24 @@ teardown() { unload_fixture typical-project } -eventually() { - sleep 3 -} - @test "'ez-build --interactive \"echo success!\"' should wait for changes" { - eventually - assert_expected "$(cat build.log)" + eventually 'assert_expected "$(cat build.log)"' } @test "'ez-build --interactive \"echo success!\"' should rebuild files when they are modified" { touch src/a.js - eventually - assert_expected "$(cat build.log)" + eventually 'assert_expected "$(cat build.log)"' } @test "'ez-build --interactive \"echo success!\"' should build files when they are added" { refute_exists src/added.js touch src/added.js - eventually - assert_exists lib/added.js - assert_exists lib/added.js.map - assert_expected "$(cat build.log)" + eventually 'assert_exists lib/added.js' + eventually 'assert_exists lib/added.js.map' + eventually 'assert_expected "$(cat build.log)"' } @test "'ez-build --interactive \"echo success!\"' should only execute command on successful builds" { touch src/b.js - eventually - assert_expected "$(cat build.log)" + eventually 'assert_expected "$(cat build.log)"' } diff --git a/test/cli/interactive.bats b/test/cli/interactive.bats index 3faa2ba..7fc10b3 100644 --- a/test/cli/interactive.bats +++ b/test/cli/interactive.bats @@ -27,26 +27,19 @@ teardown() { unload_fixture typical-project } -eventually() { - sleep 3 -} - @test "'ez-build --interactive' should wait for changes" { - eventually - assert_expected "$(cat build.log)" + eventually 'assert_expected "$(cat build.log)"' } @test "'ez-build --interactive' should rebuild files when they are modified" { touch src/a.js - eventually - assert_expected "$(cat build.log)" + eventually 'assert_expected "$(cat build.log)"' } @test "'ez-build --interactive' should build files when they are added" { refute_exists src/added.js touch src/added.js - eventually - assert_exists lib/added.js - assert_exists lib/added.js.map - assert_expected "$(cat build.log)" + eventually 'assert_exists lib/added.js' + eventually 'assert_exists lib/added.js.map' + eventually 'assert_expected "$(cat build.log)"' } diff --git a/test/cli/test-util.bash b/test/cli/test-util.bash index 45bb4f8..e93362d 100644 --- a/test/cli/test-util.bash +++ b/test/cli/test-util.bash @@ -189,3 +189,20 @@ unload_fixture() { return 1 fi } + +eventually() { + for try in $(seq 1 30); do + set +e + output="$(eval ${@})" + status=$? + set -e + + if [[ ${status} == 0 ]]; then + return 0 + fi + sleep 1 + done + + echo "${output}" + return ${status} +} From aa56ed77fccecde3531346cbf8964535b5208775 Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Thu, 1 Mar 2018 01:42:45 +0100 Subject: [PATCH 5/7] Fix test plan count after rebase over master --- test/unit/cli/opts.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/cli/opts.test.js b/test/unit/cli/opts.test.js index dc112d7..efabd90 100644 --- a/test/unit/cli/opts.test.js +++ b/test/unit/cli/opts.test.js @@ -8,7 +8,7 @@ import } from 'js-combinatorics' test('Options', async t => { - t.plan(65) + t.plan(69) const barePkg = await readFixture('bare-project') , typicalPkg = await readFixture('typical-project') From 7ddb54c79b240fe6686d26df9abbf3426226ff93 Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Thu, 1 Mar 2018 02:20:51 +0100 Subject: [PATCH 6/7] Fix failing interactive exec test Due to a change of the typical-project fixture, a test of the interactive exec feature started failing. Arguably, this test was bad to begin with, relying on the frailty of the typical-project fixture to simulate a failing build. Instead, we simply change some of the code in the typical-project fixture in the test, to provoka a build failure and thus create the context for the interactive exec test. --- ...ould_only_execute_command_on_successful_builds--1 | 12 +++++++----- test/cli/interactive-exec.bats | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 index 1a9b7d1..62bdef6 100644 --- a/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 +++ b/test/cli/expected/interactive-exec--_ez-build_--interactive__echo_success____should_only_execute_command_on_successful_builds--1 @@ -3,9 +3,11 @@ js – src/a.js -> lib/a.js,lib/a.js.map success! js – src/added.js -> lib/added.js,lib/added.js.map success! -js – src/b.js: Unexpected token, expected { (8:7) +js – src/added.js -> lib/added.js,lib/added.js.map +success! +js – src/b.js: Unexpected token, expected ; (8:18) 6 | } - 7 | -> 8 | export all from foo - | ^ - 9 | export default 'b' + 7 | +> 8 | export default 'b'export all from foo + | ^ + 9 |  diff --git a/test/cli/interactive-exec.bats b/test/cli/interactive-exec.bats index afe8039..f6ebaa0 100644 --- a/test/cli/interactive-exec.bats +++ b/test/cli/interactive-exec.bats @@ -24,6 +24,7 @@ teardown() { rm *.{pid,log} fi + git checkout . unload_fixture typical-project } @@ -45,6 +46,6 @@ teardown() { } @test "'ez-build --interactive \"echo success!\"' should only execute command on successful builds" { - touch src/b.js + echo "export all from foo" >> src/b.js eventually 'assert_expected "$(cat build.log)"' } From e97439d3326236bf3db96bf8c5a822496df7587d Mon Sep 17 00:00:00 2001 From: Marcus Stade Date: Thu, 1 Mar 2018 02:42:00 +0100 Subject: [PATCH 7/7] 0.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 72c04d6..75913d9 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "bin": { "ez-build": "bin/ez-build.js" }, - "version": "0.7.4", + "version": "0.8.0", "description": "The Zambezi build process", "devDependencies": { "babel-cli": "6.26.0",