init
This commit is contained in:
commit
1140c41f2a
14
.editorconfig
Normal file
14
.editorconfig
Normal file
@ -0,0 +1,14 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
tab_width = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
indent_size = 2
|
250
.eslintrc
Normal file
250
.eslintrc
Normal file
@ -0,0 +1,250 @@
|
||||
# https://github.com/eslint/eslint/tree/master/docs/rules
|
||||
|
||||
root: true
|
||||
|
||||
parserOptions:
|
||||
ecmaVersion: 2017
|
||||
|
||||
rules:
|
||||
accessor-pairs: [2]
|
||||
array-bracket-newline: [0]
|
||||
array-bracket-spacing: [2, never]
|
||||
array-callback-return: [0]
|
||||
array-element-newline: [0]
|
||||
arrow-body-style: [0]
|
||||
arrow-parens: [2, as-needed]
|
||||
arrow-spacing: [2, {before: true, after: true}]
|
||||
block-scoped-var: [2]
|
||||
brace-style: [2, 1tbs, {allowSingleLine: true}]
|
||||
camelcase: [2, {properties: never}]
|
||||
capitalized-comments: [0]
|
||||
class-methods-use-this: [2]
|
||||
comma-dangle: [0]
|
||||
comma-spacing: [2, {before: false, after: true}]
|
||||
comma-style: [2, last]
|
||||
complexity: [0]
|
||||
computed-property-spacing: [2, never]
|
||||
consistent-return: [0]
|
||||
constructor-super: [2]
|
||||
curly: [0]
|
||||
default-case: [0]
|
||||
dot-location: [2, property]
|
||||
dot-notation: [0]
|
||||
eol-last: [2]
|
||||
eqeqeq: [2]
|
||||
for-direction: [2]
|
||||
func-call-spacing: [2, never]
|
||||
func-name-matching: [2]
|
||||
func-names: [0]
|
||||
function-paren-newline: [0]
|
||||
generator-star-spacing: [2, before]
|
||||
global-require: [0]
|
||||
guard-for-in: [2]
|
||||
handle-callback-err: [2, ^(err|error)$]
|
||||
id-blacklist: [0]
|
||||
id-length: [0]
|
||||
id-match: [0]
|
||||
indent: [2, 2, {VariableDeclarator: 0}]
|
||||
jsx-quotes: [0]
|
||||
key-spacing: [0]
|
||||
keyword-spacing: [2]
|
||||
linebreak-style: [2, unix]
|
||||
lines-around-comment: [0]
|
||||
lines-around-directive: [0]
|
||||
lines-between-class-members: [2, never]
|
||||
max-len: [0]
|
||||
max-lines: [0]
|
||||
max-nested-callbacks: [0]
|
||||
max-params: [0]
|
||||
max-statements-per-line: [0]
|
||||
max-statements: [0]
|
||||
multiline-comment-style: [2, separate-lines]
|
||||
multiline-ternary: [0]
|
||||
new-cap: [0]
|
||||
new-parens: [2]
|
||||
newline-before-return: [0]
|
||||
newline-per-chained-call: [0]
|
||||
no-alert: [0]
|
||||
no-array-constructor: [0]
|
||||
no-await-in-loop: [2]
|
||||
no-bitwise: [2]
|
||||
no-buffer-constructor: [0] # enable for node 6
|
||||
no-caller: [2]
|
||||
no-case-declarations: [2]
|
||||
no-class-assign: [2]
|
||||
no-compare-neg-zero: [2]
|
||||
no-cond-assign: [2, except-parens]
|
||||
no-confusing-arrow: [0]
|
||||
no-const-assign: [2]
|
||||
no-constant-condition: [0]
|
||||
no-continue: [2]
|
||||
no-control-regex: [2]
|
||||
no-debugger: [2]
|
||||
no-delete-var: [2]
|
||||
no-div-regex: [0]
|
||||
no-dupe-args: [2]
|
||||
no-dupe-class-members: [2]
|
||||
no-dupe-keys: [2]
|
||||
no-duplicate-case: [2]
|
||||
no-duplicate-imports: [2]
|
||||
no-else-return: [0]
|
||||
no-empty-character-class: [2]
|
||||
no-empty-function: [0]
|
||||
no-empty-pattern: [2]
|
||||
no-empty: [2, {allowEmptyCatch: true}]
|
||||
no-eq-null: [2]
|
||||
no-eval: [2]
|
||||
no-ex-assign: [2]
|
||||
no-extend-native: [2]
|
||||
no-extra-bind: [2]
|
||||
no-extra-boolean-cast: [2]
|
||||
no-extra-label: [0]
|
||||
no-extra-parens: [0]
|
||||
no-extra-semi: [2]
|
||||
no-fallthrough: [2]
|
||||
no-floating-decimal: [0]
|
||||
no-func-assign: [2]
|
||||
no-global-assign: [2]
|
||||
no-implicit-coercion: [0]
|
||||
no-implicit-globals: [0]
|
||||
no-implied-eval: [2]
|
||||
no-inline-comments: [0]
|
||||
no-inner-declarations: [2]
|
||||
no-invalid-regexp: [2]
|
||||
no-invalid-this: [0]
|
||||
no-irregular-whitespace: [2]
|
||||
no-iterator: [2]
|
||||
no-label-var: [2]
|
||||
no-labels: [2]
|
||||
no-lone-blocks: [2]
|
||||
no-lonely-if: [0]
|
||||
no-loop-func: [0]
|
||||
no-magic-numbers: [0]
|
||||
no-mixed-operators: [0]
|
||||
no-mixed-requires: [2, true]
|
||||
no-mixed-spaces-and-tabs: [2]
|
||||
no-multi-spaces:
|
||||
- 2
|
||||
- ignoreEOLComments: true
|
||||
exceptions:
|
||||
VariableDeclarator: true
|
||||
ImportDeclaration: true
|
||||
Property: true
|
||||
no-multi-str: [2]
|
||||
no-multiple-empty-lines: [2, {max: 1, maxEOF: 0, maxBOF: 0}]
|
||||
no-native-reassign: [2]
|
||||
no-negated-condition: [0]
|
||||
no-negated-in-lhs: [2]
|
||||
no-nested-ternary: [0]
|
||||
no-new-func: [2]
|
||||
no-new-object: [2]
|
||||
no-new-require: [2]
|
||||
no-new-symbol: [2]
|
||||
no-new-wrappers: [2]
|
||||
no-new: [0]
|
||||
no-obj-calls: [2]
|
||||
no-octal-escape: [2]
|
||||
no-octal: [2]
|
||||
no-path-concat: [2]
|
||||
no-process-exit: [0]
|
||||
no-proto: [2]
|
||||
no-redeclare: [2]
|
||||
no-regex-spaces: [2]
|
||||
no-restricted-imports: [0]
|
||||
no-restricted-modules: [2, domain, freelist, smalloc, sys]
|
||||
no-restricted-syntax: [2, WithStatement]
|
||||
no-return-assign: [0]
|
||||
no-return-await: [2]
|
||||
no-script-url: [2]
|
||||
no-self-assign: [2, {props: true}]
|
||||
no-self-compare: [2]
|
||||
no-sequences: [2]
|
||||
no-shadow-restricted-names: [2]
|
||||
no-shadow: [0]
|
||||
no-spaced-func: [2]
|
||||
no-sparse-arrays: [2]
|
||||
no-tabs: [2]
|
||||
no-template-curly-in-string: [2]
|
||||
no-this-before-super: [2]
|
||||
no-throw-literal: [2]
|
||||
no-trailing-spaces: [2]
|
||||
no-undef-init: [2]
|
||||
no-undef: [2]
|
||||
no-undefined: [0]
|
||||
no-underscore-dangle: [0]
|
||||
no-unexpected-multiline: [2]
|
||||
no-unmodified-loop-condition: [2]
|
||||
no-unneeded-ternary: [2]
|
||||
no-unreachable: [2]
|
||||
no-unsafe-finally: [2]
|
||||
no-unsafe-negation: [2]
|
||||
no-unused-expressions: [2]
|
||||
no-unused-labels: [0]
|
||||
no-unused-vars: [2, {args: all, argsIgnorePattern: ^_, varsIgnorePattern: ^_}]
|
||||
no-use-before-define: [2, nofunc]
|
||||
no-useless-call: [2]
|
||||
no-useless-computed-key: [2]
|
||||
no-useless-concat: [2]
|
||||
no-useless-constructor: [2]
|
||||
no-useless-escape: [2]
|
||||
no-var: [2]
|
||||
no-warning-comments: [0]
|
||||
no-whitespace-before-property: [2]
|
||||
no-with: [2]
|
||||
nonblock-statement-body-position: [2]
|
||||
object-curly-newline: [0]
|
||||
object-curly-spacing: [2, never]
|
||||
object-shorthand: [0]
|
||||
one-var-declaration-per-line: [0]
|
||||
one-var: [0]
|
||||
operator-assignment: [2, always]
|
||||
operator-linebreak: [2, after]
|
||||
padded-blocks: [2, never]
|
||||
prefer-arrow-callback: [0] # enable for node 6
|
||||
prefer-const: [2]
|
||||
prefer-destructuring: [0] # enable for node 6
|
||||
prefer-numeric-literals: [2]
|
||||
prefer-promise-reject-errors: [2, {allowEmptyReject: false}]
|
||||
prefer-reflect: [0]
|
||||
prefer-rest-params: [0] # enable for node 6
|
||||
prefer-spread: [0] # enable for node 6
|
||||
prefer-template: [0] # enable for node 6
|
||||
quote-props: [0]
|
||||
quotes: [2, double, avoid-escape]
|
||||
radix: [2, as-needed]
|
||||
require-await: [2]
|
||||
require-jsdoc: [0]
|
||||
require-yield: [2]
|
||||
semi-spacing: [2, {before: false, after: true}]
|
||||
semi-style: [2, last]
|
||||
semi: [2, always]
|
||||
sort-imports: [0]
|
||||
sort-keys: [0]
|
||||
space-before-blocks: [2, always]
|
||||
space-before-function-paren: [2, never]
|
||||
space-in-parens: [2, never]
|
||||
space-infix-ops: [2]
|
||||
space-unary-ops: [2]
|
||||
spaced-comment: [2, always, {markers: ["!"]}]
|
||||
strict: [0]
|
||||
switch-colon-spacing: [2]
|
||||
symbol-description: [2]
|
||||
template-curly-spacing: [2, never]
|
||||
template-tag-spacing: [2, never]
|
||||
unicode-bom: [2, never]
|
||||
use-isnan: [2]
|
||||
valid-typeof: [2]
|
||||
wrap-iife: [2, inside]
|
||||
wrap-regex: [0]
|
||||
yield-star-spacing: [2, {before: true, after: false}]
|
||||
yoda: [2, never]
|
||||
|
||||
env:
|
||||
amd: true
|
||||
browser: true
|
||||
commonjs: true
|
||||
es6: true
|
||||
greasemonkey: true
|
||||
jquery: true
|
||||
mocha: true
|
||||
node: true
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
node_modules
|
||||
npm-debug.log*
|
||||
yarn-error.log
|
||||
yarn.lock
|
||||
package-lock.json
|
||||
.vscode/
|
3
.travis.yml
Normal file
3
.travis.yml
Normal file
@ -0,0 +1,3 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- node
|
29
Makefile
Normal file
29
Makefile
Normal file
@ -0,0 +1,29 @@
|
||||
lint:
|
||||
eslint --color --quiet *.js
|
||||
|
||||
test:
|
||||
node test.js
|
||||
|
||||
publish:
|
||||
git push -u --tags origin master
|
||||
npm publish
|
||||
|
||||
update:
|
||||
./updates.js -u
|
||||
rm -rf node_modules
|
||||
yarn
|
||||
|
||||
npm-patch:
|
||||
npm version patch
|
||||
|
||||
npm-minor:
|
||||
npm version minor
|
||||
|
||||
npm-major:
|
||||
npm version major
|
||||
|
||||
patch: lint test npm-patch publish
|
||||
minor: lint test npm-minor publish
|
||||
major: lint test npm-major publish
|
||||
|
||||
.PHONY: lint touch update patch minor major npm-patch npm-minor npm-major
|
13
README.md
Normal file
13
README.md
Normal file
@ -0,0 +1,13 @@
|
||||
# updates
|
||||
[![](https://img.shields.io/npm/v/updates.svg?style=flat)](https://www.npmjs.org/package/updates) [![](https://img.shields.io/npm/dm/updates.svg)](https://www.npmjs.org/package/updates) [![](https://api.travis-ci.org/silverwind/updates.svg?style=flat)](https://travis-ci.org/silverwind/updates)
|
||||
> Fast npm dependency update checking tool
|
||||
|
||||
`updates` is a lightweight tool that checks for npm package updates to your npm packages and optionally upgrades `package.json`.
|
||||
|
||||
## Example:
|
||||
```sh
|
||||
$ npm install $(updates)
|
||||
$ yarn install $(updates)
|
||||
```
|
||||
|
||||
© [silverwind](https://github.com/silverwind), distributed under BSD licence
|
40
package.json
Normal file
40
package.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "updates",
|
||||
"version": "0.0.0",
|
||||
"description": "Fast npm dependency update checking tool",
|
||||
"author": "silverwind",
|
||||
"repository": "silverwind/updates",
|
||||
"license": "BSD-2-Clause",
|
||||
"main": "updates.js",
|
||||
"preferGlobal": true,
|
||||
"bin": {
|
||||
"updates": "updates.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "make test"
|
||||
},
|
||||
"keywords": [
|
||||
"update",
|
||||
"npm",
|
||||
"yarn",
|
||||
"packages",
|
||||
"dependencies"
|
||||
],
|
||||
"files": [
|
||||
"updates.js"
|
||||
],
|
||||
"devDependencies": {
|
||||
"eslint": "^4.12.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"chalk": "^2.3.0",
|
||||
"columnify": "^1.5.4",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"got": "^8.0.1",
|
||||
"meow": "^4.0.0",
|
||||
"semver": "^5.4.1"
|
||||
}
|
||||
}
|
113
updates.js
Executable file
113
updates.js
Executable file
@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env node
|
||||
"use strict";
|
||||
|
||||
const cli = require("meow")(`
|
||||
Options:
|
||||
--upgrade, -u Also upgrade package.json
|
||||
|
||||
Examples:
|
||||
$ updates
|
||||
$ npm install $(updates)
|
||||
$ yarn add $(updates)
|
||||
`);
|
||||
|
||||
const fs = require("fs");
|
||||
const got = require("got");
|
||||
const path = require("path");
|
||||
const semver = require("semver");
|
||||
const columnify = require("columnify");
|
||||
const chalk = require("chalk");
|
||||
const esc = require("escape-string-regexp");
|
||||
|
||||
const pkgStr = fs.readFileSync(path.join(process.cwd(), "package.json"), "utf8");
|
||||
const pkg = JSON.parse(pkgStr);
|
||||
const url = "https://registry.npmjs.org/";
|
||||
const deps = [];
|
||||
|
||||
[
|
||||
"dependencies",
|
||||
"devDependencies",
|
||||
"peerDependencies",
|
||||
"bundledDependencies",
|
||||
"optionalDependencies"
|
||||
].forEach(function(key) {
|
||||
if (pkg[key]) {
|
||||
Object.keys(pkg[key]).forEach(function(name) {
|
||||
const range = pkg[key][name];
|
||||
if (isValidSemverRange(range)) {
|
||||
deps.push({name, range});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Promise.all(deps.map(dep => got(`${url}${dep.name}`))).then(function(responses) {
|
||||
return responses.map(function(response, i) {
|
||||
const dep = Object.keys(deps)[i];
|
||||
const name = deps[dep].name;
|
||||
const range = deps[dep].range;
|
||||
const newVersion = JSON.parse(response.body)["dist-tags"]["latest"];
|
||||
const newRange = updateRange(range, newVersion);
|
||||
return {name, range, newRange};
|
||||
});
|
||||
}).then(function(results) {
|
||||
const different = results.some(function(result) {
|
||||
return result.range !== result.newRange;
|
||||
});
|
||||
|
||||
if (!different) {
|
||||
console.info("All packages are up to date.");
|
||||
process.exit(0);
|
||||
} else if (!cli.flags.u && !cli.flags.upgrade) {
|
||||
console.info(formatResults(results));
|
||||
process.exit(0);
|
||||
}
|
||||
return results;
|
||||
}).then(function(results) {
|
||||
fs.writeFile("package.json", upgradePkg(results), "utf8", function(err) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
} else {
|
||||
console.info("package.json updated!");
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function formatResults(results) {
|
||||
return columnify(results.map(r => Object.assign({}, r)).map(function(output) {
|
||||
if (output.newRange !== output.range) {
|
||||
return {
|
||||
name: output.name,
|
||||
range: chalk.red(output.newRange),
|
||||
newRange: chalk.green(output.newRange),
|
||||
};
|
||||
}
|
||||
}).filter(result => Boolean(result)), {
|
||||
columnSplitter: " ",
|
||||
});
|
||||
}
|
||||
|
||||
function upgradePkg(results) {
|
||||
let newPkgStr = pkgStr;
|
||||
results.forEach(function(result) {
|
||||
const re = new RegExp(`"${esc(result.name)}": +"${esc(result.range)}"`, "g");
|
||||
newPkgStr = newPkgStr.replace(re, `"${result.name}": "${result.newRange}"`);
|
||||
});
|
||||
return newPkgStr;
|
||||
}
|
||||
|
||||
// naive regex replace
|
||||
function updateRange(range, version) {
|
||||
return range.replace(/[0-9]+\.[0-9]+\.[0-9](-.+)?/, version);
|
||||
}
|
||||
|
||||
function isValidSemverRange(range) {
|
||||
let valid = false;
|
||||
try {
|
||||
semver.Range(range);
|
||||
valid = true;
|
||||
} catch (err) {}
|
||||
return valid;
|
||||
}
|
Loading…
Reference in New Issue
Block a user