import path from 'path'
import fs from 'fs'
import crypto from 'crypto'
import fsTreeFolderWithHashCore from './fsTreeFolderWithHashCore.mjs'
/**
* 後端nodejs列舉指定資料夾下的全部檔案或資料夾,且計算各自HASH值
*
* Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsTreeFolderWithHash.test.mjs Github}
* @memberOf wsemi
* @param {String} fd 輸入欲列舉的資料夾字串
* @param {Integer} [levelLimit=1] 輸入列舉層數限制正整數,設定1為列舉資料夾下第一層的檔案或資料夾,設定null為無窮遍歷所有檔案與資料夾,預設1
* @param {Object} [opt={}] 輸入設定物件,預設{}
* @param {String} [opt.type='md5'] 輸入計算HASH方法字串,預設'md5'
* @param {Boolean} [opt.forFile=true] 輸入是否針對檔案計算HASH值,預設true
* @param {Boolean} [opt.forFolder=false] 輸入是否針對檔案計算HASH值,預設false
* @returns {Promise} 回傳Promise,resolve回傳檔案或資料夾陣列且含HASH值,reject代表回傳錯誤訊息
* @example
* //need test in nodejs
*
* let test = async () => {
*
* let ms = []
*
* let fdt = './_test_fsTreeFolderWithHash'
* fsCreateFolder(fdt) //創建臨時任務資料夾
*
* let fp
*
* fp = `${fdt}/t0.txt`
* fsWriteText(fp, 't0')
*
* fp = `${fdt}/abc/t1.txt`
* fsWriteText(fp, 'abc-t1')
*
* fp = `${fdt}/def/xyz/t2.txt`
* fsWriteText(fp, 'def-xyz-t2')
*
* let clns = (vfps) => {
* vfps = _.map(vfps, (v) => {
* delete v.path
* return v
* })
* return vfps
* }
*
* let vfps1 = await fsTreeFolderWithHash(fdt)
* vfps1 = clns(vfps1)
* console.log('fsTreeFolderWithHash(1,file,md5)', vfps1)
* ms.push({ 'fsTreeFolderWithHash(1,file,md5)': vfps1 })
*
* let vfps2 = await fsTreeFolderWithHash(fdt, null)
* vfps2 = clns(vfps2)
* console.log('fsTreeFolderWithHash(null,file,md5)', vfps2)
* ms.push({ 'fsTreeFolderWithHash(null,file,md5)': vfps2 })
*
* let vfps3 = await fsTreeFolderWithHash(fdt, 1, { type: 'sha256' })
* vfps3 = clns(vfps3)
* console.log('fsTreeFolderWithHash(1,file,sha256)', vfps3)
* ms.push({ 'fsTreeFolderWithHash(1,file,sha256)': vfps3 })
*
* let vfps4 = await fsTreeFolderWithHash(fdt, null, { forFile: true, forFolder: true })
* vfps4 = clns(vfps4)
* console.log('fsTreeFolderWithHash(null,file+folder,md5)', vfps4)
* ms.push({ 'fsTreeFolderWithHash(null,file+folder,md5)': vfps4 })
*
* fsDeleteFolder(fdt) //刪除臨時任務資料夾
*
* console.log('ms', JSON.stringify(ms, null, 2))
* return ms
* }
* await test()
* .catch((err) => {
* console.log(err)
* })
* // fsTreeFolderWithHash(1,file,md5) [
* // { isFolder: true, level: 1, name: 'abc', hash: '' },
* // { isFolder: true, level: 1, name: 'def', hash: '' },
* // {
* // isFolder: false,
* // level: 1,
* // name: 't0.txt',
* // hash: '809d4580aaed41565abc38d58f77f840'
* // }
* // ]
* // fsTreeFolderWithHash(null,file,md5) [
* // { isFolder: true, level: 1, name: 'abc', hash: '' },
* // {
* // isFolder: false,
* // level: 2,
* // name: 't1.txt',
* // hash: '45d11ad27b97bc3bb664260189ec0dcc'
* // },
* // { isFolder: true, level: 1, name: 'def', hash: '' },
* // { isFolder: true, level: 2, name: 'xyz', hash: '' },
* // {
* // isFolder: false,
* // level: 3,
* // name: 't2.txt',
* // hash: 'ac8cf7366d7adf0743d6561133d404b3'
* // },
* // {
* // isFolder: false,
* // level: 1,
* // name: 't0.txt',
* // hash: '809d4580aaed41565abc38d58f77f840'
* // }
* // ]
* // fsTreeFolderWithHash(1,file,sha256) [
* // { isFolder: true, level: 1, name: 'abc', hash: '' },
* // { isFolder: true, level: 1, name: 'def', hash: '' },
* // {
* // isFolder: false,
* // level: 1,
* // name: 't0.txt',
* // hash: '512f26ada3c3d634ac3c6b12b7b33cb50bb0963c3f6d9924241619c84ec78ff2'
* // }
* // ]
* // fsTreeFolderWithHash(null,file+folder,md5) [
* // {
* // isFolder: true,
* // level: 1,
* // name: 'abc',
* // hash: '45d11ad27b97bc3bb664260189ec0dcc'
* // },
* // {
* // isFolder: false,
* // level: 2,
* // name: 't1.txt',
* // hash: '45d11ad27b97bc3bb664260189ec0dcc'
* // },
* // {
* // isFolder: true,
* // level: 1,
* // name: 'def',
* // hash: 'ac8cf7366d7adf0743d6561133d404b3'
* // },
* // {
* // isFolder: true,
* // level: 2,
* // name: 'xyz',
* // hash: 'ac8cf7366d7adf0743d6561133d404b3'
* // },
* // {
* // isFolder: false,
* // level: 3,
* // name: 't2.txt',
* // hash: 'ac8cf7366d7adf0743d6561133d404b3'
* // },
* // {
* // isFolder: false,
* // level: 1,
* // name: 't0.txt',
* // hash: '809d4580aaed41565abc38d58f77f840'
* // }
* // ]
* // ms [
* // {
* // "fsTreeFolderWithHash(1,file,md5)": [
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "abc",
* // "hash": ""
* // },
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "def",
* // "hash": ""
* // },
* // {
* // "isFolder": false,
* // "level": 1,
* // "name": "t0.txt",
* // "hash": "809d4580aaed41565abc38d58f77f840"
* // }
* // ]
* // },
* // {
* // "fsTreeFolderWithHash(null,file,md5)": [
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "abc",
* // "hash": ""
* // },
* // {
* // "isFolder": false,
* // "level": 2,
* // "name": "t1.txt",
* // "hash": "45d11ad27b97bc3bb664260189ec0dcc"
* // },
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "def",
* // "hash": ""
* // },
* // {
* // "isFolder": true,
* // "level": 2,
* // "name": "xyz",
* // "hash": ""
* // },
* // {
* // "isFolder": false,
* // "level": 3,
* // "name": "t2.txt",
* // "hash": "ac8cf7366d7adf0743d6561133d404b3"
* // },
* // {
* // "isFolder": false,
* // "level": 1,
* // "name": "t0.txt",
* // "hash": "809d4580aaed41565abc38d58f77f840"
* // }
* // ]
* // },
* // {
* // "fsTreeFolderWithHash(1,file,sha256)": [
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "abc",
* // "hash": ""
* // },
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "def",
* // "hash": ""
* // },
* // {
* // "isFolder": false,
* // "level": 1,
* // "name": "t0.txt",
* // "hash": "512f26ada3c3d634ac3c6b12b7b33cb50bb0963c3f6d9924241619c84ec78ff2"
* // }
* // ]
* // },
* // {
* // "fsTreeFolderWithHash(null,file+folder,md5)": [
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "abc",
* // "hash": "45d11ad27b97bc3bb664260189ec0dcc"
* // },
* // {
* // "isFolder": false,
* // "level": 2,
* // "name": "t1.txt",
* // "hash": "45d11ad27b97bc3bb664260189ec0dcc"
* // },
* // {
* // "isFolder": true,
* // "level": 1,
* // "name": "def",
* // "hash": "ac8cf7366d7adf0743d6561133d404b3"
* // },
* // {
* // "isFolder": true,
* // "level": 2,
* // "name": "xyz",
* // "hash": "ac8cf7366d7adf0743d6561133d404b3"
* // },
* // {
* // "isFolder": false,
* // "level": 3,
* // "name": "t2.txt",
* // "hash": "ac8cf7366d7adf0743d6561133d404b3"
* // },
* // {
* // "isFolder": false,
* // "level": 1,
* // "name": "t0.txt",
* // "hash": "809d4580aaed41565abc38d58f77f840"
* // }
* // ]
* // }
* // ]
*
*/
function fsTreeFolderWithHash(fd, levelLimit = 1, opt = {}) {
return fsTreeFolderWithHashCore(fd, levelLimit, { path, fs, crypto, ...opt })
}
export default fsTreeFolderWithHash