'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() }