import path from 'path'
import fs from 'fs'
import get from 'lodash-es/get.js'
import map from 'lodash-es/map.js'
import join from 'lodash-es/join.js'
import isestr from 'wsemi/src/isestr.mjs'
import isbol from 'wsemi/src/isbol.mjs'
import fsTreeFolder from 'wsemi/src/fsTreeFolder.mjs'
import replace from 'wsemi/src/replace.mjs'
function genImports(ms) {
let rs = map(ms, (v) => {
let t = `import {name} from '{src}'`
t = replace(t, '{name}', v.name)
t = replace(t, '{src}', v.src)
return t
})
return join(rs, '\n')
}
function genNames(ms) {
let rs = map(ms, (v) => {
let t = ` {name},`
t = replace(t, '{name}', v.name)
return t
})
return join(rs, '\n')
}
/**
* 由各資料表定義*.mjs檔產生資料表收集物件ds
*
* @param {String} fdSrc 輸入各資料表定義*.mjs檔案所在資料夾
* @param {String} fdIndex 輸入產生index.mjs檔案需儲存至的資料夾,主要是跟各資料表定義*.mjs檔計算相對路徑供程式碼import用
* @param {Object} [opt={}] 輸入設定物件,預設{}
* @param {String} [opt.fpBuild='w-data-collector/src/build.mjs'] 輸入程式碼所需import之再處理資料表定義*.mjs檔的build函數,預設為'w-data-collector/src/build.mjs'
* @param {String} [opt.fnIndex='index.mjs'] 輸入產生ds所需程式碼index.mjs檔案的名稱,預設為'index.mjs',實際檔案儲存位置為fdIndex下fnIndex
* @example
*
* import genIndex from 'w-data-collector/src/genIndex.mjs'
*
* genIndex('./src/schema/tables', './src/schema', {})
* // => genIndex done
*
*/
function genIndex(fdSrc, fdIndex, opt = {}) {
//fpBuild
let fpBuild = get(opt, 'fpBuild')
if (!isestr(fpBuild)) {
fpBuild = 'w-data-collector/src/build.mjs'
}
//fnIndex
let fnIndex = get(opt, 'fnIndex')
if (!isestr(fnIndex)) {
fnIndex = 'index.mjs'
}
//useCreateStorage
let useCreateStorage = get(opt, 'useCreateStorage')
if (!isbol(useCreateStorage)) {
useCreateStorage = false //儲存至關聯資料庫例如mssql時需要createStorage
}
//fsTreeFolder
let fps = fsTreeFolder(fdSrc)
// console.log('fps', fps)
//ms
let ms = map(fps, (v) => {
let name = v.name
name = replace(name, '.mjs', '')
name = replace(name, '.js', '')
let src = path.relative(fdIndex, v.path)
src = src.replace(/\\/g, '/')
src = `./${src}`
return {
name,
src,
}
})
// console.log('ms', ms)
let t = `{cimps}
import build from '{fpBuild}'
let cs = {
{cnms}
}
//ds
let ds = {}
for (let k in cs) {
ds[k] = build(cs[k], { useCreateStorage: ${useCreateStorage} })
}
export default ds
`
//genImports
let cimps = genImports(ms)
//genNames
let cnms = genNames(ms)
//replace
t = replace(t, '{cimps}', cimps)
t = replace(t, '{cnms}', cnms)
t = replace(t, '{fpBuild}', fpBuild)
//fpIndex
let fpIndex = path.resolve(fdIndex, fnIndex)
//writeFileSync
fs.writeFileSync(fpIndex, t, 'utf8')
console.log('genIndex done')
}
export default genIndex