const path = require('path') const fs = require('fs') const { sortDependencies, installDependencies, runLintFix, printMessage, } = require('./utils') const pkg = require('./package.json') const templateVersion = pkg.version const { addTestAnswers } = require('./scenarios') module.exports = { metalsmith: { // When running tests for the template, this adds answers for the selected scenario before: addTestAnswers }, helpers: { if_or(v1, v2, options) { if (v1 || v2) { return options.fn(this) } return options.inverse(this) }, template_version() { return templateVersion }, }, prompts: { name: { when: 'isNotTest', type: 'string', required: true, message: 'Project name', }, description: { when: 'isNotTest', type: 'string', required: false, message: 'Project description', default: 'A Vue.js project', }, author: { when: 'isNotTest', type: 'string', message: 'Author', }, build: { when: 'isNotTest', type: 'list', message: 'Vue build', choices: [ { name: 'Runtime + Compiler: recommended for most users', value: 'standalone', short: 'standalone', }, { name: 'Runtime-only: about 6KB lighter min+gzip, but templates (or any Vue-specific HTML) are ONLY allowed in .vue files - render functions are required elsewhere', value: 'runtime', short: 'runtime', }, ], }, router: { when: 'isNotTest', type: 'confirm', message: 'Install vue-router?', }, lint: { when: 'isNotTest', type: 'confirm', message: 'Use ESLint to lint your code?', }, lintConfig: { when: 'isNotTest && lint', type: 'list', message: 'Pick an ESLint preset', choices: [ { name: 'Standard (https://github.com/standard/standard)', value: 'standard', short: 'Standard', }, { name: 'Airbnb (https://github.com/airbnb/javascript)', value: 'airbnb', short: 'Airbnb', }, { name: 'none (configure it yourself)', value: 'none', short: 'none', }, ], }, unit: { when: 'isNotTest', type: 'confirm', message: 'Set up unit tests', }, runner: { when: 'isNotTest && unit', type: 'list', message: 'Pick a test runner', choices: [ { name: 'Jest', value: 'jest', short: 'jest', }, { name: 'Karma and Mocha', value: 'karma', short: 'karma', }, { name: 'none (configure it yourself)', value: 'noTest', short: 'noTest', }, ], }, e2e: { when: 'isNotTest', type: 'confirm', message: 'Setup e2e tests with Nightwatch?', }, autoInstall: { when: 'isNotTest', type: 'list', message: 'Should we run `npm install` for you after the project has been created? (recommended)', choices: [ { name: 'Yes, use NPM', value: 'npm', short: 'npm', }, { name: 'Yes, use Yarn', value: 'yarn', short: 'yarn', }, { name: 'No, I will handle that myself', value: false, short: 'no', }, ], }, }, filters: { '.eslintrc.js': 'lint', '.eslintignore': 'lint', 'config/test.env.js': 'unit || e2e', 'build/webpack.test.conf.js': "unit && runner === 'karma'", 'test/unit/**/*': 'unit', 'test/unit/index.js': "unit && runner === 'karma'", 'test/unit/jest.conf.js': "unit && runner === 'jest'", 'test/unit/karma.conf.js': "unit && runner === 'karma'", 'test/unit/specs/index.js': "unit && runner === 'karma'", 'test/unit/setup.js': "unit && runner === 'jest'", 'test/e2e/**/*': 'e2e', 'src/router/**/*': 'router', }, complete: function(data, { chalk }) { const green = chalk.green sortDependencies(data, green) const cwd = path.join(process.cwd(), data.inPlace ? '' : data.destDirName) if (data.autoInstall) { installDependencies(cwd, data.autoInstall, green) .then(() => { return runLintFix(cwd, data, green) }) .then(() => { printMessage(data, green) }) .catch(e => { console.log(chalk.red('Error:'), e) }) } else { printMessage(data, chalk) } }, }