Last active
August 17, 2022 01:52
-
-
Save noyobo/227ea71b052d73db6f304c807baccc66 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const globby = require('globby'); | |
const path = require('path'); | |
const { detectiveModuleAndRequire } = require('detective-module'); | |
const fse = require('fs-extra'); | |
const isBuiltinModule = require('is-builtin-module'); | |
const log = require('npmlog'); | |
require('colors'); | |
function unique(arr) { | |
return Array.from(new Set(arr)); | |
} | |
async function checkDeps(packagePath, sourceDir, lernaVersion) { | |
delete require.cache[packagePath]; | |
const pkgData = require(packagePath); | |
const files = await globby( | |
['src/**/*.{ts,js}', 'bin/**/*.js', '!**/__tests__/**/*.*', '!**/*.test.{ts,js}', '!**/*.spec.{ts,js}'], | |
{ | |
cwd: sourceDir, | |
absolute: true, | |
} | |
); | |
let deps = []; | |
files.forEach((file) => { | |
const context = fse.readFileSync(file).toString(); | |
const dependencies = detectiveModuleAndRequire(context) | |
.map((d) => d.name) | |
.filter(Boolean) | |
.filter((n) => !n.startsWith('.')) | |
.map((n) => { | |
return n; | |
}) | |
.filter((n) => !isBuiltinModule(n)); | |
deps.push(...dependencies); | |
}); | |
deps = unique(deps).sort(); | |
const { dependencies = {}, devDependencies = {} } = pkgData; | |
let hasError = false; | |
deps = deps.filter((dep) => { | |
return !(dep in dependencies || dep in devDependencies); | |
}); | |
if (deps.length > 0) { | |
log.info('[deps]', pkgData.name.red, deps.join(' ').yellow); | |
log.info('[deps]', `yarn workspace ${pkgData.name} add ${deps.join(' ')}`.cyan.underline); | |
hasError = true; | |
} | |
return hasError; | |
} | |
async function run() { | |
const cwd = path.join(__dirname, '../packages'); | |
const packages = await globby('*/package.json', { cwd, absolute: true }); | |
const version = fse.readJSONSync(path.join(__dirname, '../lerna.json')).version; | |
let hasError = false; | |
for (let i = 0; i < packages.length; i++) { | |
const packagePath = packages[i]; | |
const packageSourceDir = path.dirname(packagePath); | |
hasError += await checkDeps(packagePath, packageSourceDir, version); | |
} | |
if (hasError) { | |
process.exit(1); | |
} else { | |
log.info('[deps]', '依赖正确!'.green); | |
} | |
} | |
run().catch((e) => { | |
console.log(e); | |
process.exit(1); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment