diffBaselineSnapshots.mjs

/**
 * 比對兩次snapshotBaselines之結果,列出新增、刪除、內容改變、內容相同但被重寫(mtime改變)之檔案
 *
 * touched(內容相同但mtime改變)亦視為「被重寫」:已審過之圖被重產等於換掉真理,即使內容相同,
 * 故「零標準圖變動」須added、removed、changed、touched皆為空(unchanged為true)
 *
 * @param {Object} before 輸入先前之快照物件
 * @param {Object} after 輸入之後之快照物件
 * @returns {Object} 回傳物件{added,removed,changed,touched,unchanged},前四者為相對路徑陣列(已排序),unchanged為四者皆空之布林值
 * @example
 *
 * import snapshotBaselines from 'w-package-tools-e2e/src/snapshotBaselines.mjs'
 * import diffBaselineSnapshots from 'w-package-tools-e2e/src/diffBaselineSnapshots.mjs'
 *
 * let before = snapshotBaselines('./test/pics')
 * //...
 * let r = diffBaselineSnapshots(before, snapshotBaselines('./test/pics'))
 * if (!r.unchanged) throw new Error(`標準圖被改動: ${JSON.stringify(r)}`)
 *
 */
function diffBaselineSnapshots(before, after) {
    let b = before || {}
    let a = after || {}
    let added = []
    let removed = []
    let changed = []
    let touched = []
    for (let k of Object.keys(a)) {
        if (!(k in b)) {
            added.push(k)
            continue
        }
        if (a[k].sha256 !== b[k].sha256) {
            changed.push(k)
        }
        else if (a[k].mtimeMs !== b[k].mtimeMs) {
            touched.push(k)
        }
    }
    for (let k of Object.keys(b)) {
        if (!(k in a)) {
            removed.push(k)
        }
    }
    added.sort()
    removed.sort()
    changed.sort()
    touched.sort()
    let unchanged = added.length === 0 && removed.length === 0 && changed.length === 0 && touched.length === 0
    return { added, removed, changed, touched, unchanged }
}


export default diffBaselineSnapshots