117 lines
2.8 KiB
JavaScript
117 lines
2.8 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
const path = require('path')
|
||
|
const FileUtils = require('../utils/file-utils')
|
||
|
|
||
|
function quote (value) {
|
||
|
return `'${value}'`
|
||
|
}
|
||
|
|
||
|
function formatLine (items) {
|
||
|
return items.map(quote).join(', ')
|
||
|
}
|
||
|
|
||
|
function formatMultiLines (items) {
|
||
|
return items
|
||
|
.map((file) => '\n ' + file)
|
||
|
.join(',')
|
||
|
}
|
||
|
|
||
|
function formatFiles (includedFiles, onlyServedFiles) {
|
||
|
const lines = []
|
||
|
.concat(includedFiles.map(quote))
|
||
|
.concat(onlyServedFiles.map((file) => `{ pattern: ${quote(file)}, included: false }`))
|
||
|
|
||
|
return formatMultiLines(lines)
|
||
|
}
|
||
|
|
||
|
function formatPreprocessors (preprocessors) {
|
||
|
const lines = Object.keys(preprocessors)
|
||
|
.map((pattern) => `${quote(pattern)}: [${formatLine(preprocessors[pattern])}]`)
|
||
|
|
||
|
return formatMultiLines(lines)
|
||
|
}
|
||
|
|
||
|
function getConfigPath (file) {
|
||
|
return path.join(__dirname, `/../../${file}`)
|
||
|
}
|
||
|
|
||
|
class JavaScriptFormatter {
|
||
|
constructor () {
|
||
|
this.TEMPLATE_FILE_PATH = getConfigPath('config.tpl.js')
|
||
|
this.REQUIREJS_TEMPLATE_FILE = getConfigPath('requirejs.config.tpl.js')
|
||
|
}
|
||
|
|
||
|
generateConfigFile (answers) {
|
||
|
const replacements = this.formatAnswers(answers)
|
||
|
|
||
|
return FileUtils
|
||
|
.readFile(this.TEMPLATE_FILE_PATH)
|
||
|
.replace(/%(.*)%/g, (a, key) => replacements[key])
|
||
|
}
|
||
|
|
||
|
writeConfigFile (path, answers) {
|
||
|
FileUtils.saveFile(path, this.generateConfigFile(answers))
|
||
|
}
|
||
|
|
||
|
writeRequirejsConfigFile (path) {
|
||
|
FileUtils.copyFile(this.REQUIREJS_TEMPLATE_FILE, path)
|
||
|
}
|
||
|
|
||
|
formatAnswers (answers) {
|
||
|
return {
|
||
|
DATE: new Date(),
|
||
|
BASE_PATH: answers.basePath,
|
||
|
FRAMEWORKS: formatLine(answers.frameworks),
|
||
|
FILES: formatFiles(answers.files, answers.onlyServedFiles),
|
||
|
EXCLUDE: formatFiles(answers.exclude, []),
|
||
|
AUTO_WATCH: answers.autoWatch ? 'true' : 'false',
|
||
|
BROWSERS: formatLine(answers.browsers),
|
||
|
PREPROCESSORS: formatPreprocessors(answers.preprocessors)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class CoffeeFormatter extends JavaScriptFormatter {
|
||
|
constructor () {
|
||
|
super()
|
||
|
this.TEMPLATE_FILE_PATH = getConfigPath('config.tpl.coffee')
|
||
|
this.REQUIREJS_TEMPLATE_FILE = getConfigPath('requirejs.config.tpl.coffee')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class LiveFormatter extends JavaScriptFormatter {
|
||
|
constructor () {
|
||
|
super()
|
||
|
this.TEMPLATE_FILE_PATH = getConfigPath('config.tpl.ls')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class TypeFormatter extends JavaScriptFormatter {
|
||
|
constructor () {
|
||
|
super()
|
||
|
this.TEMPLATE_FILE_PATH = getConfigPath('config.tpl.ts')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exports.JavaScript = JavaScriptFormatter
|
||
|
exports.Coffee = CoffeeFormatter
|
||
|
exports.Live = LiveFormatter
|
||
|
exports.Type = TypeFormatter
|
||
|
|
||
|
exports.createForPath = function (path) {
|
||
|
if (/\.coffee$/.test(path)) {
|
||
|
return new CoffeeFormatter()
|
||
|
}
|
||
|
|
||
|
if (/\.ls$/.test(path)) {
|
||
|
return new LiveFormatter()
|
||
|
}
|
||
|
|
||
|
if (/\.ts$/.test(path)) {
|
||
|
return new TypeFormatter()
|
||
|
}
|
||
|
|
||
|
return new JavaScriptFormatter()
|
||
|
}
|