53 lines
1.4 KiB
JavaScript
53 lines
1.4 KiB
JavaScript
const fs = require("fs")
|
|
const path = require("path")
|
|
const defaultsDeep = require("lodash.defaultsdeep")
|
|
const stringifyJS = require("~/js/stringify-js")
|
|
|
|
function getName(filename) {
|
|
return path.basename(filename, path.extname(filename))
|
|
}
|
|
|
|
const defaultOptions = {
|
|
pattern: /\.(js)$/,
|
|
loader: (filename) => {
|
|
const src = path.join(
|
|
path.dirname(filename),
|
|
path.basename(filename, path.extname(filename))
|
|
)
|
|
return `require("${src}")`
|
|
},
|
|
}
|
|
|
|
module.exports = function dirtree2static(filename, options = {}, rootDir) {
|
|
const isRoot = !rootDir
|
|
if (isRoot) {
|
|
defaultsDeep(options, defaultOptions)
|
|
rootDir = filename
|
|
}
|
|
const { pattern, loader } = options
|
|
const stats = fs.lstatSync(filename)
|
|
if (stats.isDirectory()) {
|
|
const files = fs.readdirSync(filename).filter((file) => {
|
|
const absPath = `${filename}/${file}`
|
|
const relPath = absPath.slice(rootDir.length)
|
|
return (
|
|
(typeof pattern === "function"
|
|
? pattern(relPath)
|
|
: relPath.match(pattern)) ||
|
|
fs.lstatSync(`${filename}/${file}`).isDirectory()
|
|
)
|
|
})
|
|
|
|
const results = {}
|
|
for (const file of files) {
|
|
const name = getName(file)
|
|
const result = dirtree2static(`${filename}/${file}`, options, rootDir)
|
|
results[name] = result
|
|
}
|
|
if (isRoot) {
|
|
return stringifyJS(results)
|
|
}
|
|
return results
|
|
}
|
|
return loader(filename)
|
|
}
|