Files
vue-cli/packages/@vue/cli/lib/Generator.js
2017-12-31 16:18:41 -05:00

59 lines
1.7 KiB
JavaScript

const ejs = require('ejs')
const path = require('path')
const debug = require('debug')
const resolve = require('resolve')
const GeneratorAPI = require('./GeneratorAPI')
const writeFileTree = require('./util/writeFileTree')
module.exports = class Generator {
constructor (context, options, creator) {
this.context = context
this.options = options
this.creator = creator
this.pkg = require(path.resolve(context, 'package.json'))
// for conflict resolution
this.depSources = {}
// virtual file tree
this.files = {}
this.fileMiddlewares = []
// apply generators from plugins
Object.keys(options.plugins).forEach(id => {
const generatorPath = resolve.sync(`${id}/generator`, { basedir: context })
const generator = require(generatorPath)
const generatorOptions = options.plugins[id]
generator(new GeneratorAPI(id, this, generatorOptions), generatorOptions)
})
}
async generate () {
// wait for file resolve
await this.resolveFiles()
// set package.json
this.resolvePkg()
this.files['package.json'] = JSON.stringify(this.pkg, null, 2)
// write file tree to disk
await writeFileTree(this.context, this.files)
}
resolvePkg () {
const sortDeps = deps => Object.keys(deps).sort().reduce((res, name) => {
res[name] = deps[name]
return res
}, {})
this.pkg.dependencies = sortDeps(this.pkg.dependencies)
this.pkg.devDependencies = sortDeps(this.pkg.devDependencies)
// TODO sort pkg keys
debug('vue:cli-pkg')(this.pkg)
}
async resolveFiles () {
for (const middleware of this.fileMiddlewares) {
await middleware(this.files, ejs.render)
}
debug('vue:cli-files')(this.files)
}
}