UNPKG

@aquaori/deplens

Version:

A precise dependency analysis tool for npm and pnpm projects

84 lines 3.9 kB
"use strict"; 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