Skip to content

Instantly share code, notes, and snippets.

@noyobo
Last active August 17, 2022 01:52
Show Gist options
  • Save noyobo/227ea71b052d73db6f304c807baccc66 to your computer and use it in GitHub Desktop.
Save noyobo/227ea71b052d73db6f304c807baccc66 to your computer and use it in GitHub Desktop.
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