losant-cli
Advanced tools
Comparing version 1.2.1 to 1.2.2
@@ -36,2 +36,8 @@ # Losant CLI Changelog | ||
* watch command now has a queueing process incase you have slow internet or a lot of changes at once. | ||
* watch command now has a queueing process incase you have slow internet or a lot of changes at once. | ||
## Losant CLI v1.2.2 | ||
### Fixed | ||
* sanitizing experience file names |
const path = require('path'); | ||
const sanitizeFilename = require('sanitize-filename'); | ||
const template = require('lodash-template'); | ||
module.exports = { | ||
@@ -7,4 +10,34 @@ experience: { | ||
localStatusParams: [ path.join(path.sep, '{components,layouts,pages}', '*.hbs') ], | ||
// eslint-disable-next-line no-template-curly-in-string | ||
remoteStatusParams: [ path.join('experience', '${viewType}s', '${name}.hbs'), 'body' ] | ||
remoteStatusParams: [ | ||
(resource, { newFilesSet = new Set(), currentFileMap }) => { | ||
let localStatus; | ||
for (const [ , value ] of currentFileMap) { | ||
if (value.id === resource.id && (!value.name || value.name === resource.name)) { | ||
localStatus = value; | ||
break; | ||
} | ||
} | ||
if (localStatus) { | ||
return localStatus.file; | ||
} | ||
const dir = path.join('experience', `${resource.viewType}s`); | ||
let filename = sanitizeFilename(resource.name); | ||
if (!filename) { | ||
filename = resource.id; | ||
} | ||
const filePath = path.join(dir, `${filename}.hbs`); | ||
if (!newFilesSet.has(filePath) && !currentFileMap.has(filePath)) { | ||
return filePath; | ||
} else { | ||
let counter = 1; | ||
let counterFilePath = path.join(dir, `${filename}-${counter}.hbs`); | ||
while (currentFileMap.get(counterFilePath) || newFilesSet.has(counterFilePath)) { | ||
counterFilePath = path.join(dir, `${filename}-${counter}.hbs`); | ||
counter++; | ||
} | ||
return counterFilePath; | ||
} | ||
}, | ||
'body' | ||
] | ||
}, | ||
@@ -15,4 +48,4 @@ files: { | ||
localStatusParams: [ path.join(path.sep, '**') ], | ||
// eslint-disable-next-line no-template-curly-in-string | ||
remoteStatusParams: [ 'files${parentDirectory}${name}', 's3etag', { skipMd5Creation: true } ] | ||
// files never need to be sanitized cause that is ensured in the model | ||
remoteStatusParams: [ template('files${parentDirectory}${name}'), 's3etag', { skipMd5Creation: true } ] // eslint-disable-line no-template-curly-in-string | ||
}, | ||
@@ -23,4 +56,6 @@ dataTables: { | ||
localStatusParams: [ path.join(path.sep, '*.csv' )], | ||
// eslint-disable-next-line no-template-curly-in-string | ||
remoteStatusParams: [ path.join('dataTables', '${name}-${id}.csv') ] | ||
remoteStatusParams: [ (resource) => { | ||
const sanitizedName = sanitizeFilename(resource.name); | ||
return path.join('dataTables', `${sanitizedName}-${resource.id}.csv`); | ||
} ] | ||
}, | ||
@@ -27,0 +62,0 @@ options: { |
@@ -9,3 +9,2 @@ const paginateRequest = require('./paginate-request'); | ||
saveLocalMeta, | ||
checksum, | ||
logResult, | ||
@@ -28,2 +27,3 @@ logProcessing, | ||
const { rollbarLog } = require('./rollbar'); | ||
const { buildMetaDataObj } = require('./meta-data-helpers'); | ||
@@ -71,5 +71,6 @@ const getDownloader = ({ | ||
const downloadResults = await allSettledSerial(async (remoteStatus) => { | ||
logProcessing(remoteStatus.file); | ||
const file = remoteStatus.file; | ||
logProcessing(file); | ||
const localStatus = localStatusByFile[file]; | ||
if (!command.force) { | ||
const localStatus = localStatusByFile[remoteStatus.file]; | ||
const { conflict } = getComparativeStatus(localStatus, remoteStatus); | ||
@@ -80,3 +81,3 @@ if (conflict) { | ||
type: 'list', | ||
message: `A conflict has been dected in ${remoteStatus.file}, how do you want to handle this?`, | ||
message: `A conflict has been detected in ${file}, how do you want to handle this?`, | ||
choices: [ | ||
@@ -89,3 +90,3 @@ { name: 'Do nothing, and resolve the conflict later.', value: null }, | ||
if (!handleConflict) { | ||
return logResult('conflict', remoteStatus.file, 'redBright'); | ||
return logResult('conflict', file, 'redBright'); | ||
} | ||
@@ -95,13 +96,7 @@ if (handleConflict === 'local') { | ||
// faking that the local status and the remote status match so there is no conflict when uploading | ||
meta[remoteStatus.file] = { | ||
file: remoteStatus.file, | ||
id: remoteStatus.id, | ||
md5: remoteStatus.remoteMd5, | ||
remoteTime: remoteStatus.remoteModTime, | ||
localTime: Date.now() | ||
}; | ||
return logResult('unmodified', remoteStatus.file); | ||
meta[file] = buildMetaDataObj({ remoteStatus }); | ||
return logResult('unmodified', file); | ||
} else { | ||
// e.g. make the local a "new" state, since the remote file was deleted. | ||
delete meta[remoteStatus.file]; | ||
delete meta[file]; | ||
return; // purposefully not printing anything out | ||
@@ -113,3 +108,4 @@ } | ||
if (remoteStatus.status === 'unmodified') { | ||
return logResult('unmodified', remoteStatus.file); | ||
meta[file] = buildMetaDataObj({ remoteStatus }); | ||
return logResult('unmodified', file); | ||
} | ||
@@ -119,14 +115,14 @@ if (remoteStatus.status === 'deleted') { | ||
try { | ||
if (await pathExists(remoteStatus.file)) { | ||
await remove(remoteStatus.file); | ||
if (await pathExists(file)) { | ||
await remove(file); | ||
} | ||
} catch (e) { | ||
return logError(`An Error occurred when trying to delete file ${remoteStatus.file} with the message ${e.message}`); | ||
return logError(`An Error occurred when trying to delete file ${file} with the message ${e.message}`); | ||
} | ||
delete meta[remoteStatus.file]; | ||
delete meta[file]; | ||
} | ||
return logResult('deleted', remoteStatus.file, 'yellow'); | ||
return logResult('deleted', file, 'yellow'); | ||
} | ||
if (!command.dryRun) { | ||
await ensureDir(path.dirname(remoteStatus.file)); | ||
await ensureDir(path.dirname(file)); | ||
let data; | ||
@@ -136,18 +132,12 @@ try { | ||
} catch (e) { | ||
return logError(`An Error occurred when trying to download data for file ${remoteStatus.file} with the message ${e.message}`); | ||
return logError(`An Error occurred when trying to download data for file ${file} with the message ${e.message}`); | ||
} | ||
try { | ||
await writeFile(remoteStatus.file, data); | ||
await writeFile(file, data); | ||
} catch (e) { | ||
return logError(`An Error occurred when trying to write the file ${remoteStatus.file} with the message ${e.message}`); | ||
return logError(`An Error occurred when trying to write the file ${file} with the message ${e.message}`); | ||
} | ||
meta[remoteStatus.file] = { | ||
file: remoteStatus.file, | ||
id: remoteStatus.id, // can probably remove | ||
md5: checksum(data), | ||
remoteTime: remoteStatus.remoteModTime, | ||
localTime: Date.now() | ||
}; | ||
meta[file] = buildMetaDataObj({ remoteStatus }); | ||
} | ||
logResult('downloaded', remoteStatus.file, 'green'); | ||
logResult('downloaded', file, 'green'); | ||
didDownload = true; | ||
@@ -154,0 +144,0 @@ }, values(remoteStatusByFile)); |
@@ -20,3 +20,2 @@ const paginateRequest = require('./paginate-request'); | ||
const { rollbarLog } = require('./rollbar'); | ||
const sanitize = require('sanitize-filename'); | ||
@@ -34,5 +33,2 @@ const getExporter = ({ | ||
items = await paginateRequest(api[apiType].get, { applicationId }); | ||
items.forEach((item) => { | ||
item.name = sanitize(item.name); | ||
}); | ||
} catch (e) { | ||
@@ -49,2 +45,3 @@ return logError(e); | ||
}); | ||
if (command.dryRun) { | ||
@@ -51,0 +48,0 @@ logResult('DRY RUN'); |
@@ -7,2 +7,3 @@ const path = require('path'); | ||
const { files, experience } = require('./constants'); | ||
const { buildMetaDataObj } = require('./meta-data-helpers'); | ||
@@ -37,10 +38,4 @@ const experienceParams = { | ||
}, | ||
postUpsertUpdateMeta: async (view, meta, item) => { | ||
const remoteTime = (new Date(view.lastUpdated)).getTime(); | ||
meta[item.file] = { | ||
id: view.id, | ||
md5: checksum(view.body), | ||
remoteTime, | ||
localTime: item.localModTime * 1000 | ||
}; | ||
postUpsertUpdateMeta: async (view, meta, localStatus) => { | ||
meta[localStatus.file] = buildMetaDataObj({ resource: view, md5: checksum(view.body), localStatus }); | ||
} | ||
@@ -82,4 +77,4 @@ }; | ||
}, | ||
postUpsertUpdateMeta: async (result, meta, item) => { | ||
const body = await readFile(item.file); | ||
postUpsertUpdateMeta: async (result, meta, localStatus) => { | ||
const body = await readFile(localStatus.file); | ||
let s3etag; | ||
@@ -103,10 +98,5 @@ try { | ||
} catch (e) { | ||
throw new Error(`An Error occurred when trying to upload ${item.name} to s3 with the message ${e.message}`); | ||
throw new Error(`An Error occurred when trying to upload ${localStatus.name} to s3 with the message ${e.message}`); | ||
} | ||
meta[item.file] = { | ||
id: result.id, | ||
md5: s3etag, | ||
remoteTime: new Date(result.lastUpdated).getTime(), | ||
localTime: item.localModTime * 1000 | ||
}; | ||
meta[localStatus.file] = buildMetaDataObj({ resource: result, md5: s3etag, localStatus }); | ||
} | ||
@@ -113,0 +103,0 @@ }; |
@@ -18,2 +18,3 @@ const paginateRequest = require('./paginate-request'); | ||
const { isEmpty, merge, values, keys } = require('omnibelt'); | ||
const { buildMetaDataObj } = require('./meta-data-helpers'); | ||
@@ -84,14 +85,10 @@ const getUploader = ({ | ||
} | ||
const remoteInfo = remoteStatusByFile[stat.file] || {}; | ||
const remoteStatus = remoteStatusByFile[stat.file] || {}; | ||
if ( | ||
(stat === 'added' && remoteInfo === 'added') || | ||
(stat === 'modified' && remoteInfo === 'modified') | ||
(stat === 'added' && remoteStatus === 'added') || | ||
(stat === 'modified' && remoteStatus === 'modified') | ||
) { | ||
if (stat.localMd5 === remoteInfo.remoteMd5) { | ||
meta[stat.file] = { | ||
id: remoteInfo.id, | ||
md5: remoteInfo.remoteMd5, | ||
remoteTime: remoteInfo.remoteModTime, | ||
localTime: stat.localModTime * 1000 | ||
}; | ||
if (stat.localMd5 === remoteStatus.remoteMd5) { | ||
meta[stat.file] = buildMetaDataObj({ remoteStatus, localStatus: stat }); | ||
return logResult('uploaded', stat.file, 'green'); | ||
@@ -98,0 +95,0 @@ } |
@@ -8,3 +8,2 @@ const getApi = require('./get-api'); | ||
const minimatch = require('minimatch'); | ||
const template = require('lodash-template'); | ||
const c = require('chalk'); | ||
@@ -282,7 +281,7 @@ const ssLog = require('single-line-log'); | ||
size: stats.size, | ||
name: path.basename(relFile, path.extname(globPattern)), | ||
name: meta[relFile] ? meta[relFile].name : path.basename(relFile, path.extname(globPattern)), | ||
origModTime: meta[relFile] ? Math.trunc(meta[relFile].localTime): undefined, | ||
localModTime: Math.trunc(stats.mtime.getTime()), | ||
origMd5: meta[relFile] ? meta[relFile].md5 : undefined, | ||
localMd5: utils.checksum(await readFile(file)) | ||
localMd5: utils.checksum(await readFile(relFile)) | ||
}; | ||
@@ -300,5 +299,5 @@ if (!statObj.id) { | ||
statusByFile[file] = { | ||
name: meta[file].name, | ||
id: meta[file].id, | ||
file: file, | ||
name: path.basename(file, path.extname(globPattern)), | ||
origModTime: Math.trunc(meta[file].localTime / 1000), | ||
@@ -314,14 +313,13 @@ localModTime: undefined, | ||
getShallowRemoteStatus: async (localFiles, resources, pathTemplate) => { | ||
getShallowRemoteStatus: async (localFiles, resources, getFilePath) => { | ||
if (!resources) { return {}; } | ||
const statusByFile = {}; | ||
const compiledTemplate = template(pathTemplate); | ||
resources.forEach((resource) => { | ||
const file = path.normalize(compiledTemplate(resource)); | ||
const statObj = { | ||
id: resource.id, | ||
file, | ||
name: resource.name, | ||
status: 'found' | ||
}; | ||
const file = path.normalize(getFilePath(resource, { currentFileMap: localFiles, skipIdCheck: true })); | ||
statObj.file = file; | ||
statusByFile[file] = statObj; | ||
@@ -340,15 +338,17 @@ localFiles.delete(file); | ||
getRemoteStatus: async (type, resources, pathTemplate, contentProperty, options = {}) => { | ||
getRemoteStatus: async (type, resources, getFilePath, contentProperty, options = {}) => { | ||
const statusByFile = {}; | ||
const meta = await utils.loadLocalMeta(type) || {}; | ||
const metaByFile = {}; | ||
const metaByFile = new Map(); | ||
const metaFiles = new Set(); | ||
keys(meta).forEach((file) => { | ||
const currentFiles = new Set(keys(meta)); | ||
currentFiles.forEach((file) => { | ||
const item = meta[file]; | ||
metaByFile[file] = Object.assign({}, item, { file: file }); | ||
metaByFile.set(file, Object.assign({}, item, { file: file })); | ||
metaFiles.add(file); | ||
}); | ||
const compiledTemplate = template(pathTemplate); | ||
const newFilesSet = new Set(); | ||
resources.forEach((resource) => { | ||
const file = path.normalize(compiledTemplate(resource)); | ||
const file = path.normalize(getFilePath(resource, { newFilesSet, currentFileMap: metaByFile })); | ||
metaFiles.delete(file); | ||
@@ -367,8 +367,9 @@ const mtime = new Date(resource.lastUpdated); | ||
name: resource.name, | ||
origModTime: metaByFile[file] ? metaByFile[file].remoteTime: undefined, | ||
origModTime: metaByFile.has(file) ? metaByFile.get(file).remoteTime: undefined, | ||
remoteModTime: mtime.getTime(), | ||
origMd5: metaByFile[file] ? metaByFile[file].md5 : undefined, | ||
origMd5: metaByFile.has(file) ? metaByFile.get(file).md5 : undefined, | ||
remoteMd5 | ||
}; | ||
if (!metaByFile[file]) { | ||
if (!metaByFile.has(file)) { | ||
newFilesSet.add(file); | ||
statObj.status = 'added'; | ||
@@ -382,11 +383,12 @@ } else if (statObj.remoteMd5 !== statObj.origMd5) { | ||
}); | ||
metaFiles.forEach((id) => { | ||
const file = metaByFile[id].file; | ||
statusByFile[metaByFile[id].file] = { | ||
id: id, | ||
// anything left over are existing files that where no longer found in the API | ||
metaFiles.forEach((file) => { | ||
const metaObj = metaByFile.get(file); | ||
statusByFile[file] = { | ||
id: metaObj.id, | ||
file, | ||
name: path.basename(metaByFile[id].file, type !== 'files' ? path.extname(metaByFile[id].file) : undefined), | ||
origModTime: Math.trunc(metaByFile[id].file.remoteTime / 1000), | ||
name: metaObj.name || path.basename(file, type !== 'files' ? path.extname(file) : undefined), | ||
origModTime: Math.trunc(metaObj.remoteTime / 1000), | ||
remoteModTime: undefined, | ||
origMd5: metaByFile[id].file.md5, | ||
origMd5: metaObj.md5, | ||
remoteMd5: undefined, | ||
@@ -428,6 +430,6 @@ status: 'deleted' | ||
}, | ||
// this function will not work for experiences...just a heads up | ||
getShallowStatus: async ({ items, remoteStatusParams, localStatusParams, dir, pattern }) => { | ||
const localFiles = await utils.getShallowLocalStatus(dir, ...localStatusParams); | ||
const remoteStatusByFile = await utils.getShallowRemoteStatus(new Map(localFiles), items, ...remoteStatusParams); | ||
const remoteStatusByFile = await utils.getShallowRemoteStatus(localFiles, items, ...remoteStatusParams); | ||
@@ -434,0 +436,0 @@ if (pattern) { |
{ | ||
"name": "losant-cli", | ||
"version": "1.2.1", | ||
"version": "1.2.2", | ||
"description": "Losant Command Line Interface", | ||
@@ -35,31 +35,31 @@ "license": "MIT", | ||
"dependencies": { | ||
"@rjhilgefort/export-dir": "^1.1.0", | ||
"@rjhilgefort/export-dir": "^1.1.3", | ||
"chalk": "^2.4.1", | ||
"chokidar": "^2.0.4", | ||
"cli-table3": "^0.5.1", | ||
"commander": "^2.19.0", | ||
"csv-stringify": "^5.3.0", | ||
"commander": "^2.20.3", | ||
"csv-stringify": "^5.5.0", | ||
"death": "^1.1.0", | ||
"error": "^7.0.2", | ||
"error": "^7.2.0", | ||
"find-file-up": "^2.0.1", | ||
"form-data": "^2.3.3", | ||
"fs-extra": "^7.0.1", | ||
"glob": "^7.1.3", | ||
"inquirer": "^6.2.0", | ||
"form-data": "^3.0.0", | ||
"fs-extra": "^8.1.0", | ||
"glob": "^7.1.6", | ||
"inquirer": "^7.1.0", | ||
"js-yaml": "^3.12.0", | ||
"jsonwebtoken": "^8.5.1", | ||
"lodash-template": "^1.0.0", | ||
"losant-rest": "2.3.7", | ||
"mime-types": "^2.1.21", | ||
"losant-rest": "2.5.1", | ||
"mime-types": "^2.1.27", | ||
"minimatch": "^3.0.4", | ||
"moment": "^2.22.2", | ||
"omnibelt": "^1.3.1", | ||
"pad": "^2.2.1", | ||
"proper-lockfile": "^3.0.2", | ||
"request": "^2.88.0", | ||
"request-promise": "^4.2.2", | ||
"rollbar": "^2.5.0", | ||
"moment": "^2.25.3", | ||
"omnibelt": "^1.3.3", | ||
"pad": "^3.2.0", | ||
"proper-lockfile": "^4.1.1", | ||
"request": "^2.88.2", | ||
"request-promise": "^4.2.5", | ||
"rollbar": "^2.15.2", | ||
"sanitize-filename": "^1.6.2", | ||
"single-line-log": "^1.1.2", | ||
"update-notifier": "^2.3.0" | ||
"update-notifier": "^4.1.0" | ||
}, | ||
@@ -69,8 +69,8 @@ "devDependencies": { | ||
"husky": "^1.1.4", | ||
"lint-staged": "^8.0.4", | ||
"lint-staged": "^8.2.1", | ||
"mocha": "^5.2.0", | ||
"nock": "^10.0.2", | ||
"rimraf": "^2.6.2", | ||
"rimraf": "^3.0.2", | ||
"should": "^13.2.3", | ||
"sinon": "^7.1.1" | ||
"sinon": "^9.0.2" | ||
}, | ||
@@ -77,0 +77,0 @@ "lint-staged": { |
89897
55
2196
+ Added@rollup/rollup-linux-x64-gnu@4.9.5(transitive)
+ Added@sindresorhus/is@0.14.0(transitive)
+ Added@szmarczak/http-timer@1.1.2(transitive)
+ Addedansi-align@3.0.1(transitive)
+ Addedansi-escapes@4.3.2(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@4.3.0(transitive)
+ Addedaxios@0.19.2(transitive)
+ Addedboxen@4.2.0(transitive)
+ Addedcacheable-request@6.1.0(transitive)
+ Addedcamelcase@5.3.1(transitive)
+ Addedchalk@3.0.04.1.2(transitive)
+ Addedci-info@2.0.0(transitive)
+ Addedcli-boxes@2.2.1(transitive)
+ Addedcli-cursor@3.1.0(transitive)
+ Addedcli-width@3.0.0(transitive)
+ Addedclone-response@1.0.3(transitive)
+ Addedcolor-convert@2.0.1(transitive)
+ Addedcolor-name@1.1.4(transitive)
+ Addedconfigstore@5.0.1(transitive)
+ Addedcrypto-random-string@2.0.0(transitive)
+ Addeddecompress-response@3.3.0(transitive)
+ Addeddefer-to-connect@1.1.3(transitive)
+ Addeddot-prop@5.3.0(transitive)
+ Addedemoji-regex@8.0.0(transitive)
+ Addedend-of-stream@1.4.4(transitive)
+ Addedescape-goat@2.1.1(transitive)
+ Addedfigures@3.2.0(transitive)
+ Addedform-data@3.0.2(transitive)
+ Addedfs-extra@8.1.0(transitive)
+ Addedget-stream@4.1.05.2.0(transitive)
+ Addedglobal-dirs@2.1.0(transitive)
+ Addedgot@9.6.0(transitive)
+ Addedhas-flag@4.0.0(transitive)
+ Addedhas-yarn@2.1.0(transitive)
+ Addedhttp-cache-semantics@4.1.1(transitive)
+ Addedini@1.3.7(transitive)
+ Addedinquirer@7.3.3(transitive)
+ Addedis-ci@2.0.0(transitive)
+ Addedis-fullwidth-code-point@3.0.0(transitive)
+ Addedis-installed-globally@0.3.2(transitive)
+ Addedis-npm@4.0.0(transitive)
+ Addedis-obj@2.0.0(transitive)
+ Addedis-path-inside@3.0.3(transitive)
+ Addedis-yarn-global@0.3.0(transitive)
+ Addedjson-buffer@3.0.0(transitive)
+ Addedkeyv@3.1.0(transitive)
+ Addedlatest-version@5.1.0(transitive)
+ Addedlosant-rest@2.5.1(transitive)
+ Addedlowercase-keys@2.0.0(transitive)
+ Addedmake-dir@3.1.0(transitive)
+ Addedmimic-fn@2.1.0(transitive)
+ Addedmimic-response@1.0.1(transitive)
+ Addedmute-stream@0.0.8(transitive)
+ Addednormalize-url@4.5.1(transitive)
+ Addedonetime@5.1.2(transitive)
+ Addedp-cancelable@1.1.0(transitive)
+ Addedpackage-json@6.5.0(transitive)
+ Addedpad@3.3.0(transitive)
+ Addedprepend-http@2.0.0(transitive)
+ Addedproper-lockfile@4.1.2(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedpupa@2.1.1(transitive)
+ Addedregistry-auth-token@4.2.2(transitive)
+ Addedregistry-url@5.1.0(transitive)
+ Addedresponselike@1.0.2(transitive)
+ Addedrestore-cursor@3.1.0(transitive)
+ Addedsemver@6.3.1(transitive)
+ Addedsemver-diff@3.1.1(transitive)
+ Addedstring-width@4.2.3(transitive)
+ Addedstrip-ansi@6.0.1(transitive)
+ Addedsupports-color@7.2.0(transitive)
+ Addedterm-size@2.2.1(transitive)
+ Addedto-readable-stream@1.0.0(transitive)
+ Addedtype-fest@0.21.30.8.1(transitive)
+ Addedtypedarray-to-buffer@3.1.5(transitive)
+ Addedunique-string@2.0.0(transitive)
+ Addedupdate-notifier@4.1.3(transitive)
+ Addedurl-parse-lax@3.0.0(transitive)
+ Addedwidest-line@3.1.0(transitive)
+ Addedwrite-file-atomic@3.0.3(transitive)
+ Addedxdg-basedir@4.0.0(transitive)
- Removedansi-align@2.0.0(transitive)
- Removedansi-escapes@3.2.0(transitive)
- Removedansi-regex@4.1.1(transitive)
- Removedaxios@0.18.1(transitive)
- Removedboxen@1.3.0(transitive)
- Removedcamelcase@4.1.0(transitive)
- Removedcapture-stack-trace@1.0.2(transitive)
- Removedci-info@1.6.0(transitive)
- Removedcli-boxes@1.0.0(transitive)
- Removedcli-cursor@2.1.0(transitive)
- Removedcli-width@2.2.1(transitive)
- Removedconfigstore@3.1.5(transitive)
- Removedcreate-error-class@3.0.2(transitive)
- Removedcross-spawn@5.1.0(transitive)
- Removedcrypto-random-string@1.0.0(transitive)
- Removeddot-prop@4.2.1(transitive)
- Removedexeca@0.7.0(transitive)
- Removedfigures@2.0.0(transitive)
- Removedfs-extra@7.0.1(transitive)
- Removedget-stream@3.0.0(transitive)
- Removedglobal-dirs@0.1.1(transitive)
- Removedgot@6.7.1(transitive)
- Removedinquirer@6.5.2(transitive)
- Removedis-buffer@2.0.5(transitive)
- Removedis-ci@1.2.1(transitive)
- Removedis-installed-globally@0.1.0(transitive)
- Removedis-npm@1.0.0(transitive)
- Removedis-path-inside@1.0.1(transitive)
- Removedis-redirect@1.0.0(transitive)
- Removedis-retry-allowed@1.2.0(transitive)
- Removedis-stream@1.1.0(transitive)
- Removedlatest-version@3.1.0(transitive)
- Removedlosant-rest@2.3.7(transitive)
- Removedlru-cache@4.1.5(transitive)
- Removedmake-dir@1.3.0(transitive)
- Removedmimic-fn@1.2.0(transitive)
- Removedmute-stream@0.0.7(transitive)
- Removednpm-run-path@2.0.2(transitive)
- Removedonetime@2.0.1(transitive)
- Removedp-finally@1.0.0(transitive)
- Removedpackage-json@4.0.1(transitive)
- Removedpad@2.3.0(transitive)
- Removedpath-is-inside@1.0.2(transitive)
- Removedpath-key@2.0.1(transitive)
- Removedpify@3.0.0(transitive)
- Removedprepend-http@1.0.4(transitive)
- Removedproper-lockfile@3.2.0(transitive)
- Removedpseudomap@1.0.2(transitive)
- Removedregistry-auth-token@3.4.0(transitive)
- Removedregistry-url@3.1.0(transitive)
- Removedrestore-cursor@2.0.0(transitive)
- Removedsemver-diff@2.1.0(transitive)
- Removedshebang-command@1.2.0(transitive)
- Removedshebang-regex@1.0.0(transitive)
- Removedstrip-ansi@5.2.0(transitive)
- Removedstrip-eof@1.0.0(transitive)
- Removedterm-size@1.2.0(transitive)
- Removedtimed-out@4.0.1(transitive)
- Removedunique-string@1.0.0(transitive)
- Removedunzip-response@2.0.1(transitive)
- Removedupdate-notifier@2.5.0(transitive)
- Removedurl-parse-lax@1.0.0(transitive)
- Removedwidest-line@2.0.1(transitive)
- Removedwrite-file-atomic@2.4.3(transitive)
- Removedxdg-basedir@3.0.0(transitive)
- Removedyallist@2.1.2(transitive)
Updatedcommander@^2.20.3
Updatedcsv-stringify@^5.5.0
Updatederror@^7.2.0
Updatedform-data@^3.0.0
Updatedfs-extra@^8.1.0
Updatedglob@^7.1.6
Updatedinquirer@^7.1.0
Updatedlosant-rest@2.5.1
Updatedmime-types@^2.1.27
Updatedmoment@^2.25.3
Updatedomnibelt@^1.3.3
Updatedpad@^3.2.0
Updatedproper-lockfile@^4.1.1
Updatedrequest@^2.88.2
Updatedrequest-promise@^4.2.5
Updatedrollbar@^2.15.2
Updatedupdate-notifier@^4.1.0