├── .gitattributes ├── .gitignore ├── .editorconfig ├── .github ├── dependabot.yaml └── workflows │ └── main.yml ├── lib ├── notifier-options.js └── error-notifier.js ├── .eslintrc.json ├── test ├── error-notifier.js ├── notifier-options.js └── cli.js ├── license ├── package.json ├── cli.js ├── readme.md └── CHANGELOG.md /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.js text eol=lf 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | yarn.lock 3 | .nyc_output 4 | .eslintcache 5 | coverage 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.yml] 11 | indent_style = space 12 | indent_size = 2 13 | -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "monthly" 7 | versioning-strategy: increase 8 | reviewers: 9 | - mischah 10 | 11 | - package-ecosystem: "github-actions" 12 | directory: "/" 13 | schedule: 14 | interval: "monthly" 15 | reviewers: 16 | - mischah 17 | -------------------------------------------------------------------------------- /lib/notifier-options.js: -------------------------------------------------------------------------------- 1 | const notifierOptions = (options) => { 2 | const notifierOptions = { 3 | title: options.t || options.title || 'An error has occured', 4 | message: 5 | options.m || options.message || 'Check the terminal for more information', 6 | icon: options.i || options.icon || '', 7 | sound: options.s || options.sound || true, 8 | }; 9 | notifierOptions.sound = /mute/i.test(notifierOptions.sound) 10 | ? false 11 | : notifierOptions.sound; 12 | 13 | return notifierOptions; 14 | }; 15 | 16 | export default notifierOptions; 17 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | - push 4 | - pull_request 5 | jobs: 6 | test: 7 | name: Node.js ${{ matrix.node-version }} 8 | runs-on: ubuntu-latest 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | node-version: 13 | - 18 14 | - 16 15 | - 14 16 | steps: 17 | - uses: actions/checkout@v3 18 | - uses: actions/setup-node@v3 19 | with: 20 | node-version: ${{ matrix.node-version }} 21 | cache: npm 22 | - run: npm ci 23 | - run: npm test 24 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "xo", 4 | "plugin:unicorn/recommended" 5 | ], 6 | "plugins": [ 7 | "security", 8 | "filenames", 9 | "unicorn" 10 | ], 11 | "rules": { 12 | "padded-blocks": ["off"], 13 | "operator-assignment": ["off"], 14 | "eqeqeq": ["error", "allow-null"], 15 | "no-eq-null": ["off"], 16 | "quote-props": ["error", "as-needed"], 17 | "capitalized-comments": ["warn"], 18 | "curly": ["error", "multi-line"], 19 | "arrow-parens": ["off"], 20 | "no-debugger": ["warn"], 21 | "filenames/match-exported": [2, "kebab"] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/error-notifier.js: -------------------------------------------------------------------------------- 1 | import {execa} from 'execa'; 2 | import nodeNotifier from 'node-notifier'; 3 | import notifierOptions from './notifier-options.js'; 4 | 5 | const errorNotifier = (command, options) => { 6 | options = options || {}; 7 | 8 | return new Promise((resolve, reject) => { 9 | const execaPending = execa(command, { 10 | shell: true, 11 | env: {FORCE_COLOR: true}, 12 | }); 13 | execaPending.stdout.pipe(process.stdout); 14 | execaPending.stderr.pipe(process.stderr); 15 | execaPending 16 | .then((result) => resolve(result)) 17 | .catch((error) => 18 | nodeNotifier.notify(notifierOptions(options), () => reject(error)), 19 | ); 20 | }); 21 | }; 22 | 23 | export default errorNotifier; 24 | -------------------------------------------------------------------------------- /test/error-notifier.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import errorNotifier from '../lib/error-notifier.js'; 3 | 4 | test('"Unknown command"', async t => { 5 | const result = await t.throwsAsync(errorNotifier('Hej')); 6 | t.is(result.stdout, ''); 7 | t.is(result.exitCode, 127); 8 | t.regex(result.stderr, /Hej:.+not found/); 9 | }); 10 | 11 | test('"Command which fails with an exit code other than 0"', async t => { 12 | const result = await t.throwsAsync(errorNotifier('tar')); 13 | t.is(result.stdout, ''); 14 | t.not(result.code, 0); 15 | t.regex(result.stderr, /tar:.+must specify one of/i); 16 | }); 17 | 18 | test('"Command which exits properly with exit code 0"', async t => { 19 | await t.notThrowsAsync(errorNotifier('echo Hej')); 20 | const result = await errorNotifier('echo Hej'); 21 | t.is(result.stdout, 'Hej'); 22 | t.is(result.exitCode, 0); 23 | t.is(result.stderr, ''); 24 | }); 25 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Michael Kühnel (micromata.de) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | of the Software, and to permit persons to whom the Software is furnished to do 10 | so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/notifier-options.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import notifierOptions from '../lib/notifier-options.js'; 3 | 4 | test('"Default options"', (t) => { 5 | const options = notifierOptions({}); 6 | t.is(options.title, 'An error has occured'); 7 | t.is(options.message, 'Check the terminal for more information'); 8 | t.is(options.icon, ''); 9 | t.true(options.sound); 10 | }); 11 | 12 | test('"Flags are returned as notifier options"', (t) => { 13 | const options = notifierOptions({ 14 | title: 'Title', 15 | message: 'Message', 16 | icon: 'Icon', 17 | sound: 'Sound', 18 | }); 19 | t.is(options.title, 'Title'); 20 | t.is(options.message, 'Message'); 21 | t.is(options.icon, 'Icon'); 22 | t.is(options.sound, 'Sound'); 23 | }); 24 | 25 | test('"Aliases are returned as notifier options"', (t) => { 26 | const options = notifierOptions({ 27 | t: 'Title', 28 | m: 'Message', 29 | i: 'Icon', 30 | s: 'Sound', 31 | }); 32 | t.is(options.title, 'Title'); 33 | t.is(options.message, 'Message'); 34 | t.is(options.icon, 'Icon'); 35 | t.is(options.sound, 'Sound'); 36 | }); 37 | 38 | test('"Mute sound with lowercase value"', (t) => { 39 | const options = notifierOptions({sound: 'mute'}); 40 | t.false(options.sound); 41 | }); 42 | 43 | test('"Mute sound with uppercase value"', (t) => { 44 | const options = notifierOptions({sound: 'Mute'}); 45 | t.false(options.sound); 46 | }); 47 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cli-error-notifier", 3 | "version": "3.0.2", 4 | "description": "Sends native desktop notifications if CLI apps fail", 5 | "license": "MIT", 6 | "repository": "micromata/cli-error-notifier", 7 | "author": { 8 | "name": "Michael Kühnel", 9 | "email": "m.kuehnel@micromata.de", 10 | "url": "https://micromata.de" 11 | }, 12 | "bin": { 13 | "onerror": "cli.js" 14 | }, 15 | "engines": { 16 | "node": "^14.16 || >=16.0.0" 17 | }, 18 | "type": "module", 19 | "scripts": { 20 | "test": "npm run lint && c8 ava", 21 | "lint": "eslint --cache --ignore-path .gitignore .", 22 | "lint:fix": "npm run lint --silent -- --fix", 23 | "release": "standard-version --tag-prefix", 24 | "release:patch": "npm run release --silent -- --release-as patch", 25 | "release:minor": "npm run release --silent -- --release-as minor", 26 | "release:major": "npm run release --silent -- --release-as major" 27 | }, 28 | "files": [ 29 | "lib", 30 | "cli.js" 31 | ], 32 | "keywords": [ 33 | "cli-app", 34 | "cli", 35 | "error", 36 | "error-handling", 37 | "notifications", 38 | "notify" 39 | ], 40 | "dependencies": { 41 | "execa": "^6.1.0", 42 | "log-symbols": "^5.1.0", 43 | "meow": "^10.1.3", 44 | "node-notifier": "^10.0.1", 45 | "update-notifier": "^6.0.2" 46 | }, 47 | "devDependencies": { 48 | "ava": "^4.3.3", 49 | "c8": "^7.12.0", 50 | "codecov": "^3.8.2", 51 | "eslint": "^8.37.0", 52 | "eslint-config-xo": "^0.42.0", 53 | "eslint-plugin-filenames": "^1.3.2", 54 | "eslint-plugin-security": "^1.5.0", 55 | "eslint-plugin-unicorn": "^46.0.0", 56 | "is-semver": "^1.0.11", 57 | "standard-version": "^9.5.0" 58 | }, 59 | "nyc": { 60 | "reporter": [ 61 | "lcov", 62 | "text" 63 | ] 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import meow from 'meow'; 4 | import logSymbols from 'log-symbols'; 5 | import updateNotifier from 'update-notifier'; 6 | 7 | import errorNotifier from './lib/error-notifier.js'; 8 | 9 | const cli = meow( 10 | ` 11 | Usage 12 | $ onerror [options] 13 | 14 | Options 15 | --title, -t Sets the title of the notification. 16 | Default: "An error has occured" 17 | --message, -m Sets the message body of the notification. 18 | Default: "Check the terminal for more information" 19 | --icon, -i Sets an icon. Can be any absolute path. 20 | --sound, -s Defines which sound to use. 21 | Use "mute" to disable default sound notification. 22 | Options: Mute, Basso, Blow, Bottle, Frog, Funk, Glass, Hero, 23 | Morse, Ping, Pop, Purr, Sosumi, Submarine, Tink 24 | Default: Bottle 25 | --version -v Displays the version number. 26 | --help -h Displays the help. 27 | 28 | Examples 29 | $ onerror "wget unknown-host.xyz" 30 | $ onerror "wget unknown-host.xyz" -s mute 31 | $ onerror "wget unknown-host.xyz" -t Error -m "My error message" 32 | $ onerror "wget unknown-host.xyz" -s Glass -i https://cdn.rawgit.com/npm/logos/31945b5c/npm%20square/n-64.png 33 | `, 34 | { 35 | importMeta: import.meta, 36 | alias: { 37 | h: 'help', 38 | v: 'version', 39 | }, 40 | flags: { 41 | title: { 42 | type: 'string', 43 | alias: 't', 44 | }, 45 | message: { 46 | type: 'string', 47 | alias: 'm', 48 | }, 49 | icon: { 50 | type: 'string', 51 | alias: 'i', 52 | }, 53 | sound: { 54 | type: 'string', 55 | alias: 's', 56 | }, 57 | }, 58 | }, 59 | ); 60 | 61 | updateNotifier({pkg: cli.pkg}).notify(); 62 | 63 | if (cli.input.length === 0 && cli.flags.v === true) { 64 | cli.showVersion(); 65 | } 66 | 67 | if (cli.input.length === 0 && cli.flags.h === true) { 68 | cli.showHelp(0); 69 | } 70 | 71 | if (cli.input.length !== 1) { 72 | console.log( 73 | `\n${logSymbols.error} Invalid input. Please check the help below:`, 74 | ); 75 | cli.showHelp(); 76 | } 77 | 78 | if ( 79 | Object.keys(cli.flags) 80 | .map((key) => typeof cli.flags[key]) 81 | .includes('boolean') 82 | ) { 83 | console.log( 84 | `\n${logSymbols.error} Wrong option(s) provided. Please check the help below:`, 85 | ); 86 | cli.showHelp(); 87 | } 88 | 89 | try { 90 | await errorNotifier(cli.input[0], cli.flags); 91 | } catch (error) { 92 | process.exit(error.exitCode); 93 | } 94 | -------------------------------------------------------------------------------- /test/cli.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import {execa} from 'execa'; 3 | import isSemver from 'is-semver'; 4 | 5 | test('"Unknown command"', async t => { 6 | const result = await t.throwsAsync(execa('./cli.js', ['Hej'])); 7 | t.is(result.exitCode, 127); 8 | t.regex(result.stderr, /Hej:.+not found/); 9 | }); 10 | 11 | test('"Command which fails with an exit code other than 0"', async t => { 12 | const result = await t.throwsAsync(execa('./cli.js', ['tar'])); 13 | t.is(result.stdout, ''); 14 | t.not(result.exitCode, 0); 15 | t.regex(result.stderr, /tar:.+must specify one of/i); 16 | }); 17 | 18 | test('"Command which exits properly with exit code 0"', async t => { 19 | await t.notThrowsAsync(execa('./cli.js', ['echo Hej'])); 20 | const result = await execa('./cli.js', ['echo Hej']); 21 | t.is(result.stdout, 'Hej'); 22 | t.is(result.exitCode, 0); 23 | t.is(result.stderr, ''); 24 | }); 25 | 26 | test('"No input given"', async t => { 27 | const result = await t.throwsAsync(execa('./cli.js', [])); 28 | t.is(result.exitCode, 2); 29 | t.regex(result.stdout, /Invalid input. Please check the help below:/); 30 | t.regex(result.stdout, /Usage/); 31 | }); 32 | 33 | test('"To much input"', async t => { 34 | const result = await t.throwsAsync(execa('./cli.js', ['Hu', 'Ha'])); 35 | t.is(result.exitCode, 2); 36 | t.regex(result.stdout, /Invalid input. Please check the help below:/); 37 | t.regex(result.stdout, /Usage/); 38 | }); 39 | 40 | test('"wrong options"', async t => { 41 | const result = await t.throwsAsync(execa('./cli.js', ['echo Hej', '-p'])); 42 | t.is(result.exitCode, 2); 43 | t.regex(result.stdout, /Wrong option\(s\) provided. Please check the help below:/); 44 | t.regex(result.stdout, /Usage/); 45 | }); 46 | 47 | test('"Show version number via flag"', async t => { 48 | await t.notThrowsAsync(execa('./cli.js', ['--version'])); 49 | const result = await execa('./cli.js', ['--version']); 50 | t.true(isSemver(result.stdout)); 51 | t.is(result.exitCode, 0); 52 | t.is(result.stderr, ''); 53 | }); 54 | 55 | test('"Show version number via alias"', async t => { 56 | await t.notThrowsAsync(execa('./cli.js', ['-v'])); 57 | const result = await execa('./cli.js', ['-v']); 58 | t.true(isSemver(result.stdout)); 59 | t.is(result.exitCode, 0); 60 | t.is(result.stderr, ''); 61 | }); 62 | 63 | test('"Show help via flag"', async t => { 64 | await t.notThrowsAsync(execa('./cli.js', ['--help'])); 65 | const result = await execa('./cli.js', ['--help']); 66 | t.regex(result.stdout, /^\n {2}Sends native desktop notifications/m); 67 | t.is(result.exitCode, 0); 68 | t.is(result.stderr, ''); 69 | }); 70 | 71 | test('"Show help via alias"', async t => { 72 | await t.notThrowsAsync(execa('./cli.js', ['-h'])); 73 | const result = await execa('./cli.js', ['-h']); 74 | t.regex(result.stdout, /^\n {2}Sends native desktop notifications/m); 75 | t.is(result.exitCode, 0); 76 | t.is(result.stderr, ''); 77 | }); 78 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | [![npm version](https://img.shields.io/npm/v/cli-error-notifier.svg?style=flat)](https://www.npmjs.org/package/cli-error-notifier) 2 | [![Coverage](https://codecov.io/gh/micromata/cli-error-notifier/badge.svg?branch=master)](https://codecov.io/gh/micromata/cli-error-notifier?branch=master) 3 | 4 | # cli-error-notifier 5 | 6 | > Sends native desktop notifications if CLI apps fail 7 | 8 | *Technically: if a command exits with an exit code other than `0`* 9 | 10 | ## Install 11 | 12 | To use it in your project: 13 | ``` 14 | $ npm install --save-dev cli-error-notifier 15 | ``` 16 | 17 | To use it globally: 18 | ``` 19 | $ npm install --global cli-error-notifier 20 | ``` 21 | 22 | *It requires Node.js (v4 or greater).* 23 | 24 | ## General usage 25 | 26 | ``` 27 | $ onerror --help 28 | 29 | Sends native desktop notifications if CLI apps fail 30 | 31 | Usage 32 | $ onerror [options] 33 | 34 | Options 35 | --title, -t Sets the title of the notification. 36 | Default: "An error has occured" 37 | --message, -m Sets the message body of the notification. 38 | Default: "Check the terminal for more information" 39 | --icon, -i Sets an icon. Can be any absolute path. 40 | --sound, -s Defines which sound to use. 41 | Use "mute" to disable default sound notification. 42 | Options: Mute, Basso, Blow, Bottle, Frog, Funk, Glass, Hero, 43 | Morse, Ping, Pop, Purr, Sosumi, Submarine, Tink 44 | Default: Bottle 45 | --version -v Displays the version number. 46 | --help -h Displays the help. 47 | 48 | Examples 49 | $ onerror "wget unknown-host.xyz" 50 | $ onerror "wget unknown-host.xyz" -s mute 51 | $ onerror "wget unknown-host.xyz" -t Error -m "My error message" 52 | $ onerror "wget unknown-host.xyz" -s Glass -i https://cdn.rawgit.com/npm/logos/31945b5c/npm%20square/n-64.png 53 | ``` 54 | 55 | ## Usage with npm scripts 56 | 57 | This little CLI comes in handy when writing build scripts. 58 | 59 | Let’s imagine you have setup the following npm script for linting your JavaScript files: 60 | 61 | ```json 62 | { 63 | "scripts": { 64 | "eslint": "eslint src", 65 | } 66 | } 67 | ``` 68 | 69 | With using cli-error-notifier a desktop notification can be generated at the moment the linting fails: 70 | 71 | ```json 72 | { 73 | "scripts": { 74 | "eslint": "onerror \"eslint src\"", 75 | } 76 | } 77 | ``` 78 | 79 | This is especially useful for watching files while developing. You could use it in conjunction with [onchange](https://github.com/Qard/onchange) like in the following example: 80 | 81 | ```json 82 | { 83 | "scripts": { 84 | "eslint": "eslint src", 85 | "eslint:fix": "npm run eslint --silent -- --fix", 86 | "eslint:watch": "onchange \"src/**/*.js\" -- onerror \"npm run eslint --silent\"" 87 | } 88 | } 89 | ``` 90 | 91 | It also works flawlessly together with [npm-run-all](https://github.com/mysticatea/npm-run-all). 92 | 93 | ## Cross platform compatibility 94 | cli-error-notifier uses the brilliant [node-notifier](https://github.com/mikaelbr/node-notifier) and therefore should work with Notification Center for macOS, notify-osd/libnotify-bin for Linux, Toasters for Windows 8/10, or taskbar Balloons for earlier Windows versions. Growl is used if none of these requirements are met. 95 | 96 | ## Related 97 | 98 | * [onchange](https://github.com/Qard/onchange) - Watch files and folders and run a command when anything is changed. 99 | * [npm-run-all](https://github.com/mysticatea/npm-run-all) - CLI tool to run multiple npm-scripts in parallel or serial. 100 | 101 | 102 | ## License 103 | 104 | MIT © [Michael Kühnel](https://micromata.de) 105 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ### 3.0.2 (2023-04-03) 6 | 7 | * Dependency updates 8 | * CI updates 9 | * dependabot config 10 | 11 | [See all changes](https://github.com/micromata/cli-error-notifier/compare/3.0.1...3.0.2) 12 | 13 | ### 3.0.1 (2022-09-15) 14 | 15 | ### Bug Fixes 16 | 17 | * Broken updateNotifier ([aacbdc1](https://github.com/micromata/cli-error-notifier/commit/aacbdc1bead1a91ca4e46dab435aec191be0f462)) 18 | 19 | ## 3.0.0 (2022-09-14) 20 | 21 | 22 | ### ⚠ BREAKING CHANGES 23 | 24 | * Minimum needed Node.js version is 14.16 25 | 26 | ### Features 27 | 28 | * CommonJS to ESM 📦 ([82f74ea](https://github.com/micromata/cli-error-notifier/commit/82f74ea77eedcbbc5d35177d6b767da44e0e7ca2)) 29 | 30 | ### Chores 31 | 32 | * Remove broken badges in Readme ([bc3506c2](https://github.com/micromata/cli-error-notifier/commit/bc3506c296a652bc63483ced06570a3174aeee53)) 33 | * Fix coverage report ([49fdb54f](https://github.com/micromata/cli-error-notifier/commit/49fdb54f67930083a52a20055b39e870929be63a)) 34 | * Move from Travis to GitHub actions to run tests ([074f63a3](https://github.com/micromata/cli-error-notifier/commit/074f63a39ef2bf4af97376c0ff0e77118dbe8f57)) 35 | * Fix ESLint config and errors ([218c8f60](https://github.com/micromata/cli-error-notifier/commit/218c8f60294af3c5cb111b14ae8a647f6071f907)) 36 | * Update dependencies ([49a7f88a](https://github.com/micromata/cli-error-notifier/commit/49a7f88a0d5b86d890bcd8f83fee27ff089a8e50)) 37 | 38 | 39 | 40 | # [2.1.0](https://github.com/micromata/cli-error-notifier/compare/2.0.1...2.1.0) (2019-02-11) 41 | 42 | 43 | ### Bug Fixes 44 | 45 | * Update dependencies ([d1527cd](https://github.com/micromata/cli-error-notifier/commit/d1527cd)) 46 | 47 | 48 | ### Features 49 | 50 | * Stream output ([65569d7](https://github.com/micromata/cli-error-notifier/commit/65569d7)), closes [#9](https://github.com/micromata/cli-error-notifier/issues/9) 51 | 52 | 53 | 54 | 55 | ## [2.0.1](https://github.com/micromata/cli-error-notifier/compare/2.0.0...2.0.1) (2018-05-31) 56 | 57 | 58 | 59 | 60 | # [2.0.0](https://github.com/micromata/cli-error-notifier/compare/1.0.9...2.0.0) (2018-05-17) 61 | 62 | 63 | ### Chores 64 | 65 | * **package:** update dependencies ([af47e45](https://github.com/micromata/cli-error-notifier/commit/af47e45)) 66 | 67 | 68 | ### BREAKING CHANGES 69 | 70 | * **package:** Removed support for Node.js 4. 71 | Minimum needed Node.js version is 6. 72 | 73 | 74 | 75 | 76 | ## [1.0.9](https://github.com/micromata/cli-error-notifier/compare/1.0.8...1.0.9) (2018-03-25) 77 | 78 | 79 | 80 | 81 | ## [1.0.8](https://github.com/micromata/cli-error-notifier/compare/1.0.7...1.0.8) (2018-03-10) 82 | 83 | 84 | ### Bug Fixes 85 | 86 | * fix output of -v and -h flags ([bc2e8e5](https://github.com/micromata/cli-error-notifier/commit/bc2e8e5)), closes [#5](https://github.com/micromata/cli-error-notifier/issues/5) 87 | 88 | 89 | 90 | 91 | ## [1.0.7](https://github.com/micromata/cli-error-notifier/compare/1.0.6...1.0.7) (2018-02-22) 92 | 93 | 94 | ### Bug Fixes 95 | 96 | * update dev dependencies ([9743ac3](https://github.com/micromata/cli-error-notifier/commit/9743ac3)) 97 | * update dev dependencies ([7a9658c](https://github.com/micromata/cli-error-notifier/commit/7a9658c)) 98 | 99 | 100 | 101 | 102 | ## [1.0.6](https://github.com/micromata/cli-error-notifier/compare/1.0.5...1.0.6) (2018-02-06) 103 | 104 | 105 | 106 | 107 | ## [1.0.5](https://github.com/micromata/cli-error-notifier/compare/1.0.4...1.0.5) (2018-01-29) 108 | 109 | 110 | ### Bug Fixes 111 | 112 | * fix typo in help ([20e8956](https://github.com/micromata/cli-error-notifier/commit/20e8956)) 113 | 114 | 115 | 116 | 117 | ## [1.0.4](https://github.com/micromata/cli-error-notifier/compare/1.0.3...1.0.4) (2018-01-28) 118 | 119 | 120 | ### Bug Fixes 121 | 122 | * keep stderr output from spawned process as stderr ([e9d9231](https://github.com/micromata/cli-error-notifier/commit/e9d9231)) 123 | 124 | 125 | 126 | 127 | ## [1.0.3](https://github.com/micromata/cli-error-notifier/compare/1.0.2...1.0.3) (2018-01-27) 128 | 129 | 130 | ### Bug Fixes 131 | 132 | * fix windows compatibility ([da3abef](https://github.com/micromata/cli-error-notifier/commit/da3abef)), closes [#1](https://github.com/micromata/cli-error-notifier/issues/1) 133 | 134 | 135 | 136 | 137 | ## [1.0.2](https://github.com/micromata/cli-error-notifier/compare/1.0.1...1.0.2) (2018-01-27) 138 | 139 | 140 | ### Bug Fixes 141 | 142 | * publish the correct files to npm ([040a46b](https://github.com/micromata/cli-error-notifier/commit/040a46b)) 143 | 144 | 145 | 146 | 147 | ## [1.0.1](https://github.com/micromata/cli-error-notifier/compare/1.0.0...1.0.1) (2018-01-26) 148 | 149 | 150 | 151 | 152 | # 1.0.0 (2018-01-26) 153 | 154 | Initial release 🎉 155 | --------------------------------------------------------------------------------