Skip to content

Commit

Permalink
Require Node.js 8
Browse files Browse the repository at this point in the history
  • Loading branch information
sindresorhus committed Mar 28, 2019
1 parent 0d49f51 commit aafd8a0
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 100 deletions.
3 changes: 1 addition & 2 deletions .gitattributes
@@ -1,2 +1 @@
* text=auto
*.js text eol=lf
* text=auto eol=lf
4 changes: 2 additions & 2 deletions .travis.yml
@@ -1,4 +1,4 @@
language: node_js
node_js:
- '6'
- '4'
- '10'
- '8'
11 changes: 7 additions & 4 deletions check.js
Expand Up @@ -6,17 +6,20 @@ const options = JSON.parse(process.argv[2]);

updateNotifier = new updateNotifier.UpdateNotifier(options);

updateNotifier.checkNpm().then(update => {
(async () => {
const update = await updateNotifier.checkNpm();

// Only update the last update check time on success
updateNotifier.config.set('lastUpdateCheck', Date.now());

if (update.type && update.type !== 'latest') {
updateNotifier.config.set('update', update);
}

// Call process exit explicitly to terminate the child process
// Otherwise the child process will run forever, according to the Node.js docs
// Call process exit explicitly to terminate the child process,
// otherwise the child process will run forever, according to the Node.js docs
process.exit();
}).catch(() => {
})().catch(error => {
console.error(error);
process.exit(1);
});
67 changes: 39 additions & 28 deletions index.js
@@ -1,7 +1,7 @@
'use strict';
const spawn = require('child_process').spawn;
const {spawn} = require('child_process');
const path = require('path');
const format = require('util').format;
const {format} = require('util');
const importLazy = require('import-lazy')(require);

const configstore = importLazy('configstore');
Expand All @@ -13,11 +13,11 @@ const isInstalledGlobally = importLazy('is-installed-globally');
const boxen = importLazy('boxen');
const xdgBasedir = importLazy('xdg-basedir');
const isCi = importLazy('is-ci');

const ONE_DAY = 1000 * 60 * 60 * 24;

class UpdateNotifier {
constructor(options) {
options = options || {};
constructor(options = {}) {
this.options = options;
options.pkg = options.pkg || {};

Expand All @@ -38,7 +38,7 @@ class UpdateNotifier {
this.hasCallback = typeof options.callback === 'function';
this.callback = options.callback || (() => {});
this.disabled = 'NO_UPDATE_NOTIFIER' in process.env ||
process.argv.indexOf('--no-update-notifier') !== -1 ||
process.argv.includes('--no-update-notifier') ||
isCi();
this.shouldNotifyInNpmScript = options.shouldNotifyInNpmScript;

Expand All @@ -51,25 +51,31 @@ class UpdateNotifier {
// after the set interval, so not to bother users right away
lastUpdateCheck: Date.now()
});
} catch (err) {
} catch (error) {
// Expecting error code EACCES or EPERM
const msg =
const message =
chalk().yellow(format(' %s update check failed ', options.pkg.name)) +
format('\n Try running with %s or get access ', chalk().cyan('sudo')) +
'\n to the local update config store via \n' +
chalk().cyan(format(' sudo chown -R $USER:$(id -gn $USER) %s ', xdgBasedir().config));

process.on('exit', () => {
console.error('\n' + boxen()(msg, {align: 'center'}));
console.error('\n' + boxen()(message, {align: 'center'}));
});
}
}
}

check() {
if (this.hasCallback) {
this.checkNpm()
.then(update => this.callback(null, update))
.catch(err => this.callback(err));
(async () => {
try {
this.callback(null, await this.checkNpm());
} catch (error) {
this.callback(error);
}
})();

return;
}

Expand Down Expand Up @@ -98,38 +104,43 @@ class UpdateNotifier {
stdio: 'ignore'
}).unref();
}
checkNpm() {
return latestVersion()(this.packageName).then(latestVersion => {
return {
latest: latestVersion,
current: this.packageVersion,
type: semverDiff()(this.packageVersion, latestVersion) || 'latest',
name: this.packageName
};
});

async checkNpm() {
const latest = await latestVersion()(this.packageName);

return {
latest,
current: this.packageVersion,
type: semverDiff()(this.packageVersion, latest) || 'latest',
name: this.packageName
};
}
notify(opts) {
const suppressForNpm = !this.shouldNotifyInNpmScript && isNpm();

notify(options) {
const suppressForNpm = !this.shouldNotifyInNpmScript && isNpm().isNpm;
if (!process.stdout.isTTY || suppressForNpm || !this.update) {
return this;
}

opts = Object.assign({isGlobal: isInstalledGlobally()}, opts);
options = {
isGlobal: isInstalledGlobally(),
...options
};

opts.message = opts.message || 'Update available ' + chalk().dim(this.update.current) + chalk().reset(' → ') +
chalk().green(this.update.latest) + ' \nRun ' + chalk().cyan('npm i ' + (opts.isGlobal ? '-g ' : '') + this.packageName) + ' to update';
options.message = options.message || 'Update available ' + chalk().dim(this.update.current) + chalk().reset(' → ') +
chalk().green(this.update.latest) + ' \nRun ' + chalk().cyan('npm i ' + (options.isGlobal ? '-g ' : '') + this.packageName) + ' to update';

opts.boxenOpts = opts.boxenOpts || {
options.boxenOpts = options.boxenOpts || {
padding: 1,
margin: 1,
align: 'center',
borderColor: 'yellow',
borderStyle: 'round'
};

const message = '\n' + boxen()(opts.message, opts.boxenOpts);
const message = '\n' + boxen()(options.message, options.boxenOpts);

if (opts.defer === false) {
if (options.defer === false) {
console.error(message);
} else {
process.on('exit', () => {
Expand Down
106 changes: 53 additions & 53 deletions package.json
@@ -1,55 +1,55 @@
{
"name": "update-notifier",
"version": "2.5.0",
"description": "Update notifications for your CLI app",
"license": "BSD-2-Clause",
"repository": "yeoman/update-notifier",
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "https://sindresorhus.com"
},
"engines": {
"node": ">=4"
},
"scripts": {
"test": "xo && ava --timeout=20s"
},
"files": [
"index.js",
"check.js"
],
"keywords": [
"npm",
"update",
"updater",
"notify",
"notifier",
"check",
"checker",
"cli",
"module",
"package",
"version"
],
"dependencies": {
"boxen": "^1.2.1",
"chalk": "^2.0.1",
"configstore": "^3.0.0",
"import-lazy": "^2.1.0",
"is-ci": "^1.0.10",
"is-installed-globally": "^0.1.0",
"is-npm": "^1.0.0",
"latest-version": "^3.0.0",
"semver-diff": "^2.0.0",
"xdg-basedir": "^3.0.0"
},
"devDependencies": {
"ava": "*",
"clear-module": "^2.1.0",
"fixture-stdout": "^0.2.1",
"mock-require": "^2.0.2",
"strip-ansi": "^4.0.0",
"xo": "^0.18.2"
}
"name": "update-notifier",
"version": "2.5.0",
"description": "Update notifications for your CLI app",
"license": "BSD-2-Clause",
"repository": "yeoman/update-notifier",
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "https://sindresorhus.com"
},
"engines": {
"node": ">=8"
},
"scripts": {
"test": "xo && ava --timeout=20s"
},
"files": [
"index.js",
"check.js"
],
"keywords": [
"npm",
"update",
"updater",
"notify",
"notifier",
"check",
"checker",
"cli",
"module",
"package",
"version"
],
"dependencies": {
"boxen": "^3.0.0",
"chalk": "^2.0.1",
"configstore": "^4.0.0",
"import-lazy": "^2.1.0",
"is-ci": "^2.0.0",
"is-installed-globally": "^0.1.0",
"is-npm": "^3.0.0",
"latest-version": "^5.0.0",
"semver-diff": "^2.0.0",
"xdg-basedir": "^3.0.0"
},
"devDependencies": {
"ava": "^1.3.1",
"clear-module": "^3.1.0",
"fixture-stdout": "^0.2.1",
"mock-require": "^3.0.3",
"strip-ansi": "^5.2.0",
"xo": "^0.24.0"
}
}
4 changes: 2 additions & 2 deletions readme.md
Expand Up @@ -99,7 +99,7 @@ The first time the user runs your app, it will check for an update, and even if

### notifier = updateNotifier(options)

Checks if there is an available update. Accepts options defined below. Returns an instance with an `.update` property there is an available update, otherwise `undefined`.
Checks if there is an available update. Accepts options defined below. Returns an instance with an `.update` property if there is an available update, otherwise `undefined`.

### options

Expand Down Expand Up @@ -201,7 +201,7 @@ There are a bunch projects using it:
- [Pageres](https://github.com/sindresorhus/pageres) - Capture website screenshots
- [Node GH](http://nodegh.io) - GitHub command line tool

[And 1600+ more…](https://www.npmjs.org/browse/depended/update-notifier)
[And 2700+ more…](https://www.npmjs.org/browse/depended/update-notifier)


## Security
Expand Down
5 changes: 2 additions & 3 deletions test/fs-error.js
Expand Up @@ -4,9 +4,8 @@ import test from 'ava';
let updateNotifier;

test.before(() => {
['.', 'configstore', 'xdg-basedir'].forEach(clearModule);
// Set configstore.config to something
// that requires root access
['..', 'configstore', 'xdg-basedir'].forEach(clearModule);
// Set configstore.config to something that requires root access
process.env.XDG_CONFIG_HOME = '/usr';
updateNotifier = require('..');
});
Expand Down
6 changes: 3 additions & 3 deletions test/notify.js
Expand Up @@ -19,7 +19,7 @@ function Control(shouldNotifyInNpmScript) {
}

const setupTest = isNpmReturnValue => {
['.', 'is-npm'].forEach(clearModule);
['..', 'is-npm'].forEach(clearModule);
process.stdout.isTTY = true;
mock('is-npm', isNpmReturnValue || false);
const updateNotifier = require('..');
Expand Down Expand Up @@ -74,12 +74,12 @@ test('suppress output when running as npm script', t => {
setupTest(true);
const notifier = new Control();
notifier.notify({defer: false});
t.is(stripAnsi(errorLogs).indexOf('Update available'), -1);
t.false(stripAnsi(errorLogs).includes('Update available'));
});

test('should ouput if running as npm script and shouldNotifyInNpmScript option set', t => {
setupTest(true);
const notifier = new Control(true);
notifier.notify({defer: false});
t.not(stripAnsi(errorLogs).indexOf('Update available'), -1);
t.true(stripAnsi(errorLogs).includes('Update available'));
});
5 changes: 2 additions & 3 deletions test/update-notifier.js
Expand Up @@ -7,14 +7,13 @@ mockRequire('is-ci', false);
// eslint-disable-next-line import/first
import updateNotifier from '..';

const generateSettings = options => {
options = options || {};
const generateSettings = (options = {}) => {
return {
pkg: {
name: 'update-notifier-tester',
version: '0.0.2'
},
callback: options.callback || null
callback: options.callback
};
};

Expand Down

0 comments on commit aafd8a0

Please sign in to comment.