@aquaori/deplens
Version:
A precise dependency analysis tool for npm and pnpm projects
84 lines • 3.9 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.scan = scan;
const fs_1 = __importDefault(require("fs"));
const fast_glob_1 = __importDefault(require("fast-glob"));
const transpiler_1 = require("../utils/transpiler");
const minifier_1 = require("../utils/minifier");
const logQueue_1 = require("../utils/logQueue");
/**
* 扫描项目中的 JavaScript/TypeScript 文件
* @param path 项目路径
* @returns 文件内容列表
*/
async function scan(args) {
let ignoreList = [];
if (args['config'] !== "" || fs_1.default.existsSync(`${args.path}/deplens.config.json`)) {
const configPath = args['config'] || `${args.path}/deplens.config.json`;
const config = fs_1.default.readFileSync(configPath, 'utf8');
const configArray = JSON.parse(config);
const ignorePath = configArray.ignorePath || [];
const ignorePathPath = ignorePath.map((path) => "**" + path.trim() + "/**");
const ignoreFile = configArray.ignoreFile || [];
const ignoreFilePath = ignoreFile.map((file) => "**" + file.trim() + "/**");
ignoreList = [...ignoreList, ...ignorePathPath, ...ignoreFilePath];
}
// 处理命令行参数中指定的忽略依赖
if (args.ignoreDep !== "") {
const ignoreDep = args.ignoreDep.split(/[\s\,]+/).map(p => "**" + p.trim() + "/**");
ignoreList = [...ignoreList, ...ignoreDep];
}
if (args.ignorePath !== "") {
const ignorePath = args.ignorePath.split(/[\s\,]+/).map(p => "**" + p.trim() + "/**");
ignoreList = [...ignoreList, ...ignorePath];
}
if (args.ignoreFile !== "") {
const ignoreFiles = args.ignoreFile.split(/[\s\,]+/).map(f => "**" + f.trim() + "/**");
ignoreList = [...ignoreList, ...ignoreFiles];
}
// 解析 ignorePath 和 ignoreFile 为数组
// 使用 fast-glob 查找所有 JS/TS 文件,排除 node_modules 等目录
const files = await (0, fast_glob_1.default)(['**/*.{js,jsx,ts,tsx,mjs,cjs,vue}'], {
cwd: args.path,
ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/*.d.ts', ...ignoreList]
});
let fileList = [];
let errorCount = 0;
for (const file of files) {
const sep = process.platform === 'win32' ? '\\' : '/';
const fileExtension = file.split('.').pop();
const normalizedFile = file.replace(/\//g, sep);
const fullPath = `${args.path}${sep}${normalizedFile}`;
try {
let content = fs_1.default.readFileSync(fullPath, 'utf-8');
if (fileExtension === 'vue') {
// 提取 <script> 标签中的内容,忽略 template/style 等
const scriptMatch = content.match(/<script(?:\s+[^>]*)?>([\s\S]*?)<\/script>/i);
if (scriptMatch && scriptMatch[1]) {
content = scriptMatch[1];
}
else {
content = 'console.log(\'\')';
}
}
const standardJS = await (0, transpiler_1.transpileToStandardJS)(content, args.path, normalizedFile) ?? "";
const minifiedJS = await (0, minifier_1.minifyCode)(standardJS) ?? "";
fileList.push(minifiedJS);
}
catch (error) {
if (args.verbose) {
(0, logQueue_1.logInQueue)(` Error: Failed to read file ${normalizedFile}. Error: ${error}`, 'error');
}
else
errorCount++;
}
}
if (errorCount > 0 && !args.verbose) {
(0, logQueue_1.logInQueue)(` Warning: ${errorCount} files read failed. Try to use \`--verbose\` to see more details.`, 'warn');
}
return fileList;
}
//# sourceMappingURL=scanner.js.map