Comparing version 3.2.1 to 3.3.0
{ | ||
"name": "dlvr", | ||
"version": "3.2.1", | ||
"version": "3.3.0", | ||
"description": "DeLiVeR - Command Line Tool to automate releasing processes on GitHub/GitLab/npm", | ||
@@ -21,3 +21,5 @@ "bin": { | ||
"release": "npm test && npm run build && dlvr", | ||
"jasmine": "jasmine-node --test-dir ./tests" | ||
"jasmine": "jasmine-node --test-dir ./tests", | ||
"pkg:upgrade": "ncu -a -u && rm -rf node_modules && npm i", | ||
"pkg:test": "ncu && nsp check" | ||
}, | ||
@@ -36,32 +38,36 @@ "repository": { | ||
"dependencies": { | ||
"object-filter": "1.0.2", | ||
"argparse": "1.0.9", | ||
"chalk": "2.1.0", | ||
"chalk": "2.3.0", | ||
"dotenv": "^4.0.0", | ||
"irc": "0.5.2", | ||
"is-my-json-valid": "2.16.1", | ||
"mime": "2.0.3", | ||
"node-async-loop": "1.2.2", | ||
"octonode": "0.8.0", | ||
"node-notify": "^1.0.0", | ||
"object-filter": "1.0.2", | ||
"octonode": "0.9.1", | ||
"opn": "^5.1.0", | ||
"ora": "1.3.0", | ||
"prompt": "1.0.0", | ||
"request": "^2.81.0", | ||
"request": "^2.83.0", | ||
"semver": "5.4.1", | ||
"simple-git": "1.77.0", | ||
"simple-git": "1.80.1", | ||
"zip-local": "0.3.4" | ||
}, | ||
"devDependencies": { | ||
"eslint": "4.2.0", | ||
"eslint": "4.10.0", | ||
"eslint-config-standard": "10.2.1", | ||
"eslint-plugin-import": "2.7.0", | ||
"eslint-plugin-import": "2.8.0", | ||
"eslint-plugin-import-order": "2.1.4", | ||
"eslint-plugin-node": "5.1.0", | ||
"eslint-plugin-prettier": "^2.1.2", | ||
"eslint-plugin-promise": "3.5.0", | ||
"eslint-plugin-node": "5.2.1", | ||
"eslint-plugin-prettier": "^2.3.1", | ||
"eslint-plugin-promise": "3.6.0", | ||
"eslint-plugin-standard": "3.0.1", | ||
"istanbul": "^1.1.0-alpha.1", | ||
"jasmine-node": "1.14.5", | ||
"prettier": "^1.5.3", | ||
"proxyquire": "1.8.0" | ||
"prettier": "^1.7.4", | ||
"proxyquire": "1.8.0", | ||
"npm-check-updates": "*", | ||
"nsp": "*" | ||
} | ||
} |
@@ -24,3 +24,2 @@ # DLVR | ||
DLVR_GITHUB | ||
DLVR_SNYK | ||
DLVR_GITLAB | ||
@@ -65,3 +64,3 @@ DLVR_GITLAB_API | ||
"postRun": "rm -rf ./dist", | ||
"snyk": true, | ||
"notify": true, | ||
"compress": [ | ||
@@ -78,4 +77,11 @@ { | ||
"icon_emoji": ":shipit:", | ||
"username": "dlvr.bot" | ||
"username": "dlvr.bot", | ||
"reportfail": true | ||
}, | ||
"irc": { | ||
"channel": "#general", | ||
"server": "irc.myserver.com", | ||
"username": "dvlrbot", | ||
"reportfail": true | ||
}, | ||
"githost": { | ||
@@ -82,0 +88,0 @@ "provider": "github", |
@@ -16,8 +16,2 @@ var ArgumentParser = require('argparse').ArgumentParser; | ||
subparsers.addParser('release-ci', { | ||
addHelp: true, | ||
help: | ||
'Auto releases without prompt or exits process gracefully if current branch is not master' | ||
}); | ||
subparsers.addParser('secrets', { | ||
@@ -24,0 +18,0 @@ addHelp: true, |
const status = require('./status'); | ||
const parsedArgs = require('./argparse'); | ||
const release = require('./release'); | ||
const releaseCmd = require('./release'); | ||
module.exports = { | ||
status, | ||
releaseCmd: release.releaseCmd, | ||
releaseCiCmd: release.releaseCiCmd, | ||
releaseCmd, | ||
parsedArgs | ||
}; |
const semver = require('semver'); | ||
const git = require('simple-git'); | ||
const prompt = require('prompt'); | ||
@@ -49,15 +48,2 @@ const perform = require('../perform'); | ||
}; | ||
const releaseCiCmd = async => { | ||
git(process.cwd()).status((err, data) => { | ||
if (err) utils.fatal(err.message); | ||
data.current === 'master' || process.env.TRAVIS_BRANCH === 'master' | ||
? releaseCmd({VERSION: 'auto', force: true}) | ||
: utils.quit('DLVR: Not on master - skipping release'); | ||
}); | ||
}; | ||
module.exports = { | ||
releaseCmd, | ||
releaseCiCmd | ||
}; | ||
module.exports = releaseCmd; |
const path = require('path'); | ||
const NOTIFICATION_TITLE = 'dlvr'; | ||
const INTEGRITY_CHECK_SCHEMES = ['root', 'githost', 'compress', 'slack', 'irc']; | ||
const FILE_SECRETS = path.join(process.cwd(), '.env'); | ||
@@ -11,2 +14,4 @@ const FILE_PACKAGE = path.join(process.cwd(), 'package.json'); | ||
const IRC_RECONNECT = 5; | ||
module.exports = { | ||
@@ -18,3 +23,6 @@ FILE_SECRETS, | ||
AUTO_FILTER_MAJOR, | ||
AUTO_FILTER_MINOR | ||
AUTO_FILTER_MINOR, | ||
IRC_RECONNECT, | ||
NOTIFICATION_TITLE, | ||
INTEGRITY_CHECK_SCHEMES | ||
}; |
@@ -74,5 +74,5 @@ const githook = { | ||
const snyk = { | ||
name: 'snyk', | ||
description: 'Do you want to use Snyk.io ?', | ||
const irc = { | ||
name: 'irc', | ||
description: 'Do you want to use IRC notifier ?', | ||
type: 'string', | ||
@@ -85,2 +85,12 @@ pattern: /^(y|n)$/i, | ||
const notify = { | ||
name: 'notify', | ||
description: 'Do you want to enable OS notifies ?', | ||
type: 'string', | ||
pattern: /^(y|n)$/i, | ||
message: 'Only Y/y (yes) or N/n (no) is allowed', | ||
default: 'y', | ||
required: true | ||
}; | ||
const npmpublish = { | ||
@@ -109,2 +119,3 @@ name: 'npmpublish', | ||
slack, | ||
irc, | ||
repo, | ||
@@ -116,6 +127,6 @@ prerun, | ||
test, | ||
snyk, | ||
npmpublish, | ||
compress, | ||
githook | ||
githook, | ||
notify | ||
}; |
@@ -87,2 +87,3 @@ const fs = require('fs'); | ||
common.dotenv, | ||
common.notify, | ||
common.repo, | ||
@@ -94,3 +95,2 @@ common.prerun, | ||
common.test, | ||
common.snyk, | ||
common.npmpublish, | ||
@@ -100,3 +100,4 @@ github.draft, | ||
common.compress, | ||
common.slack | ||
common.slack, | ||
common.irc | ||
]; | ||
@@ -111,2 +112,3 @@ runSchema(schema, template); | ||
common.dotenv, | ||
common.notify, | ||
common.repo, | ||
@@ -118,7 +120,7 @@ common.prerun, | ||
common.test, | ||
common.snyk, | ||
common.npmpublish, | ||
github.assets, | ||
common.compress, | ||
common.slack | ||
common.slack, | ||
common.irc | ||
]; | ||
@@ -125,0 +127,0 @@ runSchema(schema, template); |
@@ -38,9 +38,2 @@ const prompt = require('prompt'); | ||
{ | ||
name: 'DLVR_SNYK', | ||
description: 'Your SNYK token (enter to skip)', | ||
type: 'string', | ||
hidden: true, | ||
replace: '*' | ||
}, | ||
{ | ||
name: 'DLVR_SLACK_WEBHOOK', | ||
@@ -47,0 +40,0 @@ description: 'Your Slack Webhook Url (enter to skip)', |
@@ -9,3 +9,3 @@ let template = { | ||
npmpublish: false, | ||
snyk: true, | ||
notify: true, | ||
compress: [ | ||
@@ -17,6 +17,13 @@ { | ||
], | ||
irc: { | ||
channel: '#general', | ||
server: 'irc.myserver.com', | ||
username: 'dvlrbot', | ||
reportfail: true | ||
}, | ||
slack: { | ||
channel: '#general', | ||
icon_emoji: ':shipit:', | ||
username: 'dlvr.bot' | ||
username: 'dlvr.bot', | ||
reportfail: true | ||
}, | ||
@@ -23,0 +30,0 @@ githost: { |
#! /usr/bin/env node | ||
const {status, parsedArgs, releaseCmd, releaseCiCmd} = require('./commands'); | ||
const {status, parsedArgs, releaseCmd} = require('./commands'); | ||
const generator = require('./generator'); | ||
@@ -8,3 +8,3 @@ const args = parsedArgs(); | ||
process.on('unhandledRejection', reason => { | ||
console.log('Reason: ' + reason); | ||
console.log('Unhandled Reject Reason: \n' + reason); | ||
}); | ||
@@ -28,6 +28,2 @@ | ||
break; | ||
case 'release-ci': | ||
releaseCiCmd(); | ||
break; | ||
} |
const fs = require('fs'); | ||
const validator = require('is-my-json-valid'); | ||
const {FILE_SECRETS, FILE_CONFIG, FILE_PACKAGE} = require('../constants'); | ||
const {INTEGRITY_CHECK_SCHEMES} = require('../constants'); | ||
const schemes = require('../schemes'); | ||
@@ -46,3 +47,3 @@ const utils = require('./utils'); | ||
var secrets = {}; | ||
['github', 'gitlab', 'snyk'].map(item => { | ||
['github', 'gitlab'].map(item => { | ||
if ( | ||
@@ -116,3 +117,3 @@ cfg.githost.provider === item && | ||
['root', 'githost', 'compress', 'slack'].map(item => { | ||
INTEGRITY_CHECK_SCHEMES.map(item => { | ||
var err = checkIntegrity(cfg, item); | ||
@@ -119,0 +120,0 @@ if (err) { |
@@ -26,3 +26,2 @@ const fs = require('fs'); | ||
console.log(msg); | ||
process.exit(1); | ||
} | ||
@@ -72,8 +71,3 @@ } | ||
} | ||
function isCI() { | ||
return Boolean( | ||
process.env.CI || process.env.TRAVIS || process.env.CONTINUOUS_INTEGRATION | ||
); | ||
} | ||
const cleanup = () => { | ||
function cleanup() { | ||
spinner.create('Remove Changelog file'); | ||
@@ -86,5 +80,4 @@ return new Promise((resolve, reject) => { | ||
}); | ||
}; | ||
} | ||
module.exports = { | ||
isCI, | ||
copyFile, | ||
@@ -91,0 +84,0 @@ cleanup, |
@@ -47,12 +47,17 @@ const git = require('simple-git'); | ||
const tagAndPush = ({version, cfg}) => { | ||
spinner.create('Tag Release'); | ||
const commitAndPush = ({version, cfg}) => { | ||
spinner.create('Commit, Tag and Push Release'); | ||
return new Promise((resolve, reject) => { | ||
git(GITPATH) | ||
.add('./*') | ||
.commit(`🎉 Release ${version}`) | ||
.addTag(version, (err, res) => { | ||
utils.catchError(err, err, reject); | ||
}) | ||
.pushTags(cfg.getRemote(), (err, res) => { | ||
.push([cfg.getRemote(), 'master'], (err, res) => { | ||
utils.catchError(err, err, reject); | ||
resolve('Tag created and pushed'); | ||
git(GITPATH).pushTags(cfg.getRemote(), (err, res) => { | ||
utils.catchError(err, err, reject); | ||
resolve(); | ||
}); | ||
}); | ||
@@ -62,14 +67,4 @@ }); | ||
const commitAndPush = ({version, cfg}) => { | ||
spinner.create('Commit and Push Release'); | ||
return new Promise((resolve, reject) => { | ||
git(GITPATH) | ||
.add('./*') | ||
.commit(`🎉 Release ${version}`) | ||
.push([cfg.getRemote(), 'master']); | ||
resolve(); | ||
}); | ||
}; | ||
const tagExist = ({version}) => { | ||
spinner.create('Check if Tag exists'); | ||
return new Promise((resolve, reject) => { | ||
@@ -138,3 +133,2 @@ git(GITPATH).tags((err, tags) => { | ||
generateChangelog, | ||
tagAndPush, | ||
commitAndPush, | ||
@@ -141,0 +135,0 @@ checkRepo, |
@@ -10,3 +10,2 @@ const fs = require('fs'); | ||
// TODO: write tests | ||
const uploadAssets = ({cfg, secrets}, projectId) => { | ||
@@ -13,0 +12,0 @@ return new Promise((resolve, reject) => { |
@@ -5,32 +5,69 @@ const request = require('request'); | ||
const send = ({cfg, version, secrets, changelog}) => { | ||
const send = ({cfg, version, secrets, changelog}, message) => { | ||
return new Promise((resolve, reject) => { | ||
if (cfg.has('slack')) { | ||
spinner.create(`Send Slackmessage to ${cfg.slack.channel}`); | ||
let slackbody = cfg.slack; | ||
let slackbody = cfg.slack; | ||
slackbody.text = message; | ||
slackbody.text = `<!channel> \n Just released *<${cfg.releaseUrl()}|${cfg.githost.repo}>* Version *${version}* :tada: \n ${changelog}`; //eslint-disable-line | ||
var opt = { | ||
url: secrets.get('slack-webhook'), | ||
json: true, | ||
body: slackbody | ||
}; | ||
var opt = { | ||
url: secrets.get('slack-webhook'), | ||
json: true, | ||
body: slackbody | ||
}; | ||
delete slackbody.webhook; | ||
delete slackbody.webhook; | ||
request.post(opt, (err, res, data) => { | ||
request.post(opt, (err, res, data) => { | ||
utils.catchError(err, err, reject); | ||
if (data === 'ok') { | ||
resolve(); | ||
} else { | ||
reject(data); | ||
} | ||
}); | ||
}); | ||
}; | ||
const checkHook = ({cfg, version, secrets, changelog}) => { | ||
return new Promise((resolve, reject) => { | ||
if (cfg.has('slack')) { | ||
spinner.create(`Check Slack Webhook`); | ||
request.get(secrets.get('slack-webhook'), (err, res, data) => { | ||
utils.catchError(err, err, reject); | ||
if (data === 'ok') { | ||
if (res.body === 'invalid_payload') { | ||
resolve(); | ||
} else { | ||
reject(data); | ||
spinner.fail('Slack Webhook invalid'); | ||
} | ||
}); | ||
} else { | ||
resolve(); | ||
return resolve(); | ||
} | ||
}); | ||
}; | ||
const fail = ({cfg, version, secrets, changelog}, failMessage) => { | ||
if (cfg.has('slack') && cfg.slack.reportfail) { | ||
const message = `<!channel> \n :warning: Release *${version}* for *<${cfg.releaseUrl()}|${cfg | ||
.githost.repo}>* Failed with Message: \n ${failMessage}`; | ||
return send({cfg, version, secrets, changelog}, message); | ||
} else { | ||
return Promise.resolve(); | ||
} | ||
}; | ||
const success = ({cfg, version, secrets, changelog}) => { | ||
if (cfg.has('slack')) { | ||
spinner.create(`Send Slack message to ${cfg.slack.channel}`); | ||
const message = `<!channel> \n :tada: Just released *<${cfg.releaseUrl()}|${cfg | ||
.githost.repo}>* Version *${version}* \n ${changelog}`; | ||
return send({cfg, version, secrets, changelog}, message); | ||
} else { | ||
return Promise.resolve(); | ||
} | ||
}; | ||
module.exports = { | ||
send | ||
success, | ||
fail, | ||
checkHook | ||
}; |
@@ -9,3 +9,2 @@ #! /usr/bin/env node | ||
const npm = require('./modules/npm'); | ||
const snyk = require('./modules/snyk'); | ||
const runner = require('./modules/runner'); | ||
@@ -16,12 +15,13 @@ const github = require('./modules/github'); | ||
const output = require('./lib/output'); | ||
const irc = require('./modules/irc'); | ||
const notify = require('./modules/notify'); | ||
const run = async configs => { | ||
try { | ||
if (!utils.isCI()) { | ||
await git.checkRepo(configs); | ||
} | ||
await git.checkRepo(configs); | ||
await git.tagExist(configs); | ||
await runner.preRun(configs); | ||
await runner.runTests(configs); | ||
await github.checkToken(configs); | ||
await slack.checkHook(configs); | ||
// NOTE: wrap them and return object ? | ||
@@ -32,5 +32,3 @@ const gitlabUser = await gitlab.getUser(configs); | ||
await npm.checkLogin(configs); | ||
await snyk.login(configs); | ||
await snyk.check(configs); | ||
await zip.compress(configs); | ||
@@ -40,3 +38,3 @@ await utils.saveVersion(configs); | ||
await git.commitAndPush(configs); | ||
await git.tagAndPush(configs); | ||
await npm.publish(configs); | ||
@@ -48,11 +46,16 @@ | ||
await github.uploadAssets(configs, releaseId); | ||
const releaseMarkdown = await gitlab.uploadAssets(configs, gitlabProject); | ||
await gitlab.release(configs, gitlabProject, releaseMarkdown); | ||
await gitlab.release(configs, gitlabProject, releaseMarkdown); | ||
await runner.postRun(configs); | ||
await slack.send(configs); | ||
await slack.success(configs); | ||
await irc.success(configs); | ||
await notify.success(configs); | ||
spinner.success(); | ||
output.successMessage(configs); | ||
} catch (err) { | ||
await slack.fail(configs, err.message); | ||
await irc.fail(configs, err.message); | ||
await notify.fail(configs, err.message); | ||
spinner.fail(err.message); | ||
@@ -59,0 +62,0 @@ } |
exports.slack = require('./slack').default; | ||
exports.irc = require('./irc').default; | ||
exports.githost = require('./githost').default; | ||
exports.compress = require('./compress').default; | ||
exports.root = require('./root').default; |
@@ -6,5 +6,2 @@ exports.default = { | ||
}, | ||
snyk: { | ||
type: 'boolean' | ||
}, | ||
npmpublish: { | ||
@@ -18,2 +15,5 @@ type: 'boolean' | ||
type: 'string' | ||
}, | ||
notify: { | ||
type: 'boolean' | ||
} | ||
@@ -20,0 +20,0 @@ }, |
exports.default = { | ||
properties: { | ||
reportfail: { | ||
required: false, | ||
type: 'boolean' | ||
}, | ||
channel: { | ||
@@ -4,0 +8,0 @@ required: true, |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 4 instances in 1 package
51004
36
1687
101
10
17
14
+ Addedirc@0.5.2
+ Addednode-notify@^1.0.0
+ Addedapplescript@0.2.1(transitive)
+ Addedchalk@2.3.0(transitive)
+ Addediconv@2.2.3(transitive)
+ Addedirc@0.5.2(transitive)
+ Addedirc-colors@1.5.0(transitive)
+ Addednan@2.22.2(transitive)
+ Addednode-icu-charset-detector@0.2.0(transitive)
+ Addednode-notify@1.0.0(transitive)
+ Addedoctonode@0.9.1(transitive)
+ Addedsimple-git@1.80.1(transitive)
- Removedchalk@2.1.0(transitive)
- Removedoctonode@0.8.0(transitive)
- Removedsimple-git@1.77.0(transitive)
Updatedchalk@2.3.0
Updatedoctonode@0.9.1
Updatedrequest@^2.83.0
Updatedsimple-git@1.80.1