const img = require('./list_image_dependencies') const io = require('./list_io_dependencies') const scan = require('./list_scan_dependencies') const transp = require('./list_transport_dependencies') const fs = require("fs"); const path = require("path"); const baseDir = path.join(process.cwd(), 'scripts/dist'); const IMG_DEPS = img.listDependencies() const IO_DEPS = io.listDependencies() const SCAN_DEPS = scan.listDependencies() const TRANS_DEPS = transp.listDependencies() /** * 解析單行 CSV 字串,能正確處理被引號包覆且內部含有逗號的欄位。 * @param {string} line - 要解析的單行 CSV 字串。 * @returns {string[]} 解析後的欄位陣列。 */ function parseCsvLine(line) { const fields = []; let currentField = ''; let inQuotes = false; for (let i = 0; i < line.length; i++) { const char = line[i]; if (char === '"') { // 處理 CSV 中用兩個雙引號來代表一個雙引號的轉義規則 if (inQuotes && line[i + 1] === '"') { currentField += '"'; i++; // 跳過下一個引號 } else { inQuotes = !inQuotes; // 進入或離開引號模式 } } else if (char === ',' && !inQuotes) { // 當不在引號內且遇到逗號時,才視為一個欄位的結束 fields.push(currentField); currentField = ''; } else { // 一般字元,直接附加到當前欄位 currentField += char; } } // 將最後一個欄位加入陣列 fields.push(currentField); return fields; } // 您可以這樣使用它: // const [pick, methodName, fileName, lineno, deps, desc, source] = parseCsvLine(line); function flatten(arrOStr) { if (Array.isArray(arrOStr)) { return arrOStr.reduce((acc, cur)=>{ if (typeof cur === 'string') acc.push(cur) else acc.push(...flatten(cur)) return acc }, []) } return arrOStr } async function main() { const imgDeps = (await IMG_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n')) const ioDeps = (await IO_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n')) const scanDeps = (await SCAN_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n')) const transDeps = (await TRANS_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n')) const csvHeader = (await IMG_DEPS)[0].csvHeader const allCsvContent = flatten([ ...imgDeps, ...ioDeps, ...scanDeps, ...transDeps ]) const keep = {} const results = [] allCsvContent.forEach((line)=>{ const [pick, methodName, fileName, lineno, deps, desc, source] = parseCsvLine(line) const ident = `${fileName}-${methodName}` keep[ident] ??= {} if (keep[ident][deps]) return keep[ident][deps] ??= { source, lineno, desc } results.push({ pick, methodName, fileName, lineno, deps, desc, source }) }) const csvContent = results.map(r => `${r.pick},${r.methodName},${r.fileName},${r.lineno},${r.deps},${r.desc},${r.source}` ).join('\n'); const outputCsv = path.join(baseDir, `deps.all.csv`) fs.writeFileSync(outputCsv, csvHeader + csvContent, 'utf8'); } main()