yangpei
4 years ago
6 changed files with 116 additions and 13 deletions
@ -0,0 +1,49 @@ |
|||||
|
import axios from 'axios'; |
||||
|
import { safeGet } from './index'; |
||||
|
|
||||
|
const regex = /import\s([\s\S]*?)\sfrom\s(?:('[@\.\/\-\w]+')|("[@\.\/\-\w]+"))/mg; |
||||
|
|
||||
|
const extractPkgs = (code: string, excludePkgs?: string[]): string[] => { |
||||
|
let matchRet = null; |
||||
|
const pkgNames: string[] = []; |
||||
|
while ((matchRet = regex.exec(code)) != null) { |
||||
|
let pkgName = (matchRet[2] || matchRet[3]); |
||||
|
pkgName = pkgName.slice(1, pkgName.length - 1); |
||||
|
// NOTE: ignore relative path (./ and ../) and excludePkgs
|
||||
|
if ( |
||||
|
pkgName.indexOf('./') === -1 && |
||||
|
pkgName.indexOf('../') === -1 && |
||||
|
excludePkgs?.indexOf(pkgName) === -1 |
||||
|
) { |
||||
|
pkgNames.push(pkgName); |
||||
|
} |
||||
|
} |
||||
|
return pkgNames; |
||||
|
}; |
||||
|
|
||||
|
const getPkgLatestVersion = (pkg: string): Promise<string[]> => { |
||||
|
return axios.get(`https://registry.npm.taobao.org/${pkg}`) |
||||
|
.then(res => { |
||||
|
return [pkg, safeGet(res, 'data.dist-tags.latest', '*')]; |
||||
|
}).catch(err => { |
||||
|
console.log(`get package ${pkg} info failed, the error is:`, err); |
||||
|
return [pkg, '*']; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
const analyzeDeps = (code: string, excludePkgs?: string[]): Promise<{ [pkgName: string]: string }> => { |
||||
|
const pkgs = extractPkgs(code, excludePkgs); |
||||
|
return Promise |
||||
|
.all(pkgs.map(pkg => getPkgLatestVersion(pkg))) |
||||
|
.then(pkgResults => { |
||||
|
const map: any = {}; |
||||
|
pkgResults.forEach(([pkg, version]) => { |
||||
|
map[pkg] = version; |
||||
|
}); |
||||
|
return map; |
||||
|
}).catch(err => { |
||||
|
console.log('analyze deps failed, the error is:', err); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
export default analyzeDeps; |
Loading…
Reference in new issue