You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.8 KiB
79 lines
1.8 KiB
const path = require('path')
|
|
const glob = require('glob')
|
|
const transformFile = require('./file-transformer')
|
|
|
|
function generateVueFile(input, out, options) {
|
|
try {
|
|
const [content, deps, wxsFiles] = transformFile(input, options)
|
|
return {
|
|
path: path.resolve(out, path.basename(input).replace(options.extname.template, '.vue')),
|
|
content,
|
|
deps,
|
|
wxsFiles
|
|
}
|
|
} catch (e) {
|
|
console.error(input)
|
|
throw e
|
|
}
|
|
}
|
|
|
|
function generateVueFolder(input, out, options) {
|
|
const extname = options.extname.template
|
|
const files = []
|
|
const assets = []
|
|
const deps = []
|
|
glob.sync('**/*', {
|
|
cwd: input,
|
|
nodir: true
|
|
}).map(file => {
|
|
if (path.extname(file) === extname) {
|
|
const vueFile = generateVueFile(
|
|
path.resolve(input, file),
|
|
path.dirname(path.resolve(out, file)),
|
|
options
|
|
)
|
|
files.push(vueFile)
|
|
deps.push(...vueFile.deps)
|
|
|
|
const dirname = path.dirname(file)
|
|
vueFile.wxsFiles.forEach(wxsFile => {
|
|
wxsFile.path = path.join(dirname, wxsFile.path)
|
|
assets.push(wxsFile)
|
|
})
|
|
} else {
|
|
assets.push(file)
|
|
}
|
|
})
|
|
return [files, assets.filter(asset => {
|
|
if (typeof asset === 'string') {
|
|
return !deps.includes(path.resolve(input, asset))
|
|
}
|
|
return true
|
|
})]
|
|
}
|
|
|
|
function generateVueApp(input, out, options) {
|
|
console.error(`暂不支持转换整个 App`)
|
|
return [
|
|
[],
|
|
[]
|
|
]
|
|
}
|
|
|
|
module.exports = function transform(input, out, options) {
|
|
switch (options.target) {
|
|
case 'file':
|
|
return [
|
|
[generateVueFile(input, out, options)],
|
|
[]
|
|
]
|
|
case 'folder':
|
|
return generateVueFolder(input, out, options)
|
|
case 'app':
|
|
return generateVueApp(input, out, options)
|
|
}
|
|
return [
|
|
[],
|
|
[]
|
|
]
|
|
}
|
|
|