curtis
17小時前 0756bf12d10cf1b7f78c571de0a9ad69cbaeb7ca
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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()