2016-09-06 15:21:25 +00:00
|
|
|
import * as plugins from './npmts.plugins'
|
|
|
|
import * as paths from './npmts.paths'
|
|
|
|
import { npmtsOra } from './npmts.promisechain'
|
2016-07-28 01:10:51 +00:00
|
|
|
|
2016-09-06 15:21:25 +00:00
|
|
|
import {ProjectinfoNpm} from 'projectinfo'
|
2016-09-02 12:10:09 +00:00
|
|
|
|
2016-09-06 15:21:25 +00:00
|
|
|
export let projectInfo: ProjectinfoNpm
|
2016-09-02 12:10:09 +00:00
|
|
|
|
2016-07-28 01:10:51 +00:00
|
|
|
let checkProjectTypings = (configArg) => {
|
2016-09-06 15:21:25 +00:00
|
|
|
let done = plugins.Q.defer()
|
|
|
|
projectInfo = new ProjectinfoNpm(paths.cwd)
|
|
|
|
if (typeof projectInfo.packageJson.typings === 'undefined') {
|
|
|
|
plugins.beautylog.error(`please add typings field to package.json`)
|
|
|
|
process.exit(1)
|
2016-07-28 01:45:14 +00:00
|
|
|
};
|
2016-09-06 15:21:25 +00:00
|
|
|
done.resolve(configArg)
|
|
|
|
return done.promise
|
|
|
|
}
|
2016-07-28 01:10:51 +00:00
|
|
|
|
2016-07-28 01:45:14 +00:00
|
|
|
const depcheckOptions = {
|
|
|
|
ignoreBinPackage: false, // ignore the packages with bin entry
|
|
|
|
parsers: { // the target parsers
|
2016-09-06 15:21:25 +00:00
|
|
|
'*.ts': plugins.depcheck.parser.typescript
|
2016-07-28 01:45:14 +00:00
|
|
|
},
|
|
|
|
detectors: [ // the target detectors
|
|
|
|
plugins.depcheck.detector.requireCallExpression,
|
|
|
|
plugins.depcheck.detector.importDeclaration
|
|
|
|
],
|
|
|
|
specials: [ // the target special parsers
|
|
|
|
plugins.depcheck.special.eslint,
|
|
|
|
plugins.depcheck.special.webpack
|
2016-09-06 15:21:25 +00:00
|
|
|
]
|
|
|
|
}
|
2016-07-28 01:45:14 +00:00
|
|
|
|
2016-07-28 01:10:51 +00:00
|
|
|
let checkDependencies = (configArg) => {
|
2016-09-06 15:21:25 +00:00
|
|
|
let done = plugins.Q.defer()
|
2016-07-28 01:45:14 +00:00
|
|
|
let depcheckOptionsMerged = plugins.lodashObject.merge(depcheckOptions, {
|
2016-07-28 01:10:51 +00:00
|
|
|
ignoreDirs: [ // folder with these names will be ignored
|
|
|
|
'test',
|
|
|
|
'dist',
|
|
|
|
'bower_components'
|
|
|
|
],
|
|
|
|
ignoreMatches: [ // ignore dependencies that matches these globs
|
2016-09-06 15:21:25 +00:00
|
|
|
'@types/*',
|
|
|
|
'babel-preset-*'
|
2016-07-28 01:45:14 +00:00
|
|
|
]
|
|
|
|
})
|
|
|
|
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => {
|
|
|
|
for (let item of unused.dependencies) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.warn(`Watch out: unused dependency ${item.red}`)
|
2016-07-28 01:10:51 +00:00
|
|
|
};
|
2016-07-28 01:45:14 +00:00
|
|
|
for (let item of unused.missing) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.error(`unused devDependency ${item.red}`)
|
2016-07-28 01:10:51 +00:00
|
|
|
};
|
2016-07-28 01:45:14 +00:00
|
|
|
if (unused.missing.length > 0) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.info('exiting due to missing dependencies in package.json')
|
|
|
|
process.exit(1)
|
2016-07-28 01:10:51 +00:00
|
|
|
}
|
2016-07-28 01:45:14 +00:00
|
|
|
for (let item of unused.invalidFiles) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.warn(`Watch out: could not parse file ${item.red}`)
|
2016-07-28 01:45:14 +00:00
|
|
|
};
|
|
|
|
for (let item of unused.invalidDirs) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.warn(`Watch out: could not parse directory ${item.red}`)
|
2016-07-28 01:45:14 +00:00
|
|
|
};
|
2016-09-06 15:21:25 +00:00
|
|
|
done.resolve(configArg)
|
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|
2016-07-28 01:45:14 +00:00
|
|
|
|
|
|
|
let checkDevDependencies = (configArg) => {
|
2016-09-06 15:21:25 +00:00
|
|
|
let done = plugins.Q.defer()
|
2016-07-28 01:45:14 +00:00
|
|
|
let depcheckOptionsMerged = plugins.lodashObject.merge(depcheckOptions, {
|
|
|
|
ignoreDirs: [ // folder with these names will be ignored
|
|
|
|
'ts',
|
|
|
|
'dist',
|
|
|
|
'bower_components'
|
|
|
|
],
|
|
|
|
ignoreMatches: [ // ignore dependencies that matches these globs
|
2016-09-06 15:21:25 +00:00
|
|
|
'@types/*',
|
|
|
|
'babel-preset-*'
|
2016-07-28 01:45:14 +00:00
|
|
|
]
|
|
|
|
})
|
|
|
|
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => {
|
|
|
|
for (let item of unused.devDependencies) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.log(`unused devDependency ${item.red}`)
|
2016-07-28 01:45:14 +00:00
|
|
|
};
|
2016-08-02 13:49:16 +00:00
|
|
|
for (let item of unused.missing) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.error(`unused devDependency ${item.red}`)
|
2016-07-28 01:10:51 +00:00
|
|
|
};
|
2016-08-02 13:49:16 +00:00
|
|
|
if (unused.missing.length > 0) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.info('exiting due to missing dependencies in package.json')
|
|
|
|
process.exit(1)
|
2016-08-02 13:49:16 +00:00
|
|
|
}
|
2016-07-28 01:45:14 +00:00
|
|
|
for (let item of unused.invalidFiles) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.warn(`Watch out: could not parse file ${item.red}`)
|
|
|
|
}
|
2016-07-28 01:45:14 +00:00
|
|
|
for (let item of unused.invalidDirs) {
|
2016-09-06 15:21:25 +00:00
|
|
|
plugins.beautylog.warn(`Watch out: could not parse directory ${item.red}`)
|
|
|
|
}
|
|
|
|
done.resolve(configArg)
|
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|
2016-07-28 01:10:51 +00:00
|
|
|
|
|
|
|
let checkNodeVersion = (configArg) => {
|
2016-09-06 15:21:25 +00:00
|
|
|
let done = plugins.Q.defer()
|
|
|
|
done.resolve(configArg)
|
|
|
|
return done.promise
|
2016-07-28 01:10:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export let run = (configArg) => {
|
2016-09-06 15:21:25 +00:00
|
|
|
let done = plugins.Q.defer()
|
|
|
|
npmtsOra.text('running project checks...')
|
|
|
|
checkProjectTypings(configArg)
|
|
|
|
.then(checkDependencies)
|
|
|
|
.then(checkDevDependencies)
|
|
|
|
.then(checkNodeVersion)
|
|
|
|
.then(done.resolve)
|
|
|
|
return done.promise
|
2016-07-28 01:10:51 +00:00
|
|
|
}
|