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()
|