fsWriteJson.mjs

import fs from 'fs'
import get from 'lodash-es/get.js'
import isobj from './isobj.mjs'
import isarr from './isarr.mjs'
import isbol from './isbol.mjs'
import fsWriteTextCore from './fsWriteTextCore.mjs'


/**
 * 後端nodejs將物件或陣列轉成JSON格式文字再儲存至檔案
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsWriteJson.test.mjs Github}
 * @memberOf wsemi
 * @param {String} fp 輸入檔案名稱
 * @param {Object|Array} inp 輸入物件或陣列數據
 * @example
 * need test in nodejs.
 *
 * let test = () => {
 *
 *     let ms = []
 *
 *     let fdt = './_test_fsWriteJson'
 *     fsCreateFolder(fdt) //創建臨時任務資料夾
 *
 *     let inp = { str: '測試中文', val: 123.45, int: 5 }
 *
 *     let fn1 = 't1.json'
 *     let fp1 = `${fdt}/${fn1}`
 *
 *     let r1 = fsWriteJson(fp1, inp)
 *     console.log('fsWriteJson', r1)
 *     ms.push({ 'fsWriteJson': r1 })
 *
 *     let c1 = fs.readFileSync(fp1, 'utf8')
 *     console.log('readFileSync', c1)
 *     ms.push({ 'readFileSync': c1 })
 *
 *     let fn2 = 't2.json'
 *     let fp2 = `${fdt}/${fn2}`
 *
 *     let r2 = fsWriteJson(fp2, inp, { useFormat: true })
 *     console.log('fsWriteJson', r2)
 *     ms.push({ 'fsWriteJson': r2 })
 *
 *     let c2 = fs.readFileSync(fp2, 'utf8')
 *     console.log('readFileSync', c2)
 *     ms.push({ 'readFileSync': c2 })
 *
 *     fsDeleteFolder(fdt) //刪除臨時任務資料夾
 *
 *     console.log('ms', ms)
 *     return ms
 * }
 * test()
 * // fsWriteJson { success: './_test_fsWriteJson/t1.json' }
 * // readFileSync {"str":"測試中文","val":123.45,"int":5}
 * // fsWriteJson { success: './_test_fsWriteJson/t2.json' }
 * // readFileSync {
 * //   "str": "測試中文",
 * //   "val": 123.45,
 * //   "int": 5
 * // }
 * // ms [
 * //   { fsWriteJson: { success: './_test_fsWriteJson/t1.json' } },
 * //   { readFileSync: '{"str":"測試中文","val":123.45,"int":5}' },
 * //   { fsWriteJson: { success: './_test_fsWriteJson/t2.json' } },
 * //   {
 * //     readFileSync: '{\n  "str": "測試中文",\n  "val": 123.45,\n  "int": 5\n}'
 * //   }
 * // ]
 *
 */
function fsWriteJson(fp, inp, opt = {}) {
    let errTemp = null

    //check
    if (!isobj(inp) && !isarr(inp)) {
        return {
            error: `inp is not an object or array`,
        }
    }

    //useFormat
    let useFormat = get(opt, 'useFormat', null)
    if (!isbol(useFormat)) {
        useFormat = false
    }

    let j = ''
    try {
        if (useFormat) {
            j = JSON.stringify(inp, null, 2)
        }
        else {
            j = JSON.stringify(inp)
        }
    }
    catch (err) {
        // console.log(err)
        errTemp = err
    }

    if (errTemp !== null) {
        return {
            error: errTemp,
        }
    }

    //r
    let r = fsWriteTextCore(fp, j, { fs })

    return r
}


export default fsWriteJson