diff --git a/meta.js b/meta.js index 0dc63e651b..5cc2ef84e0 100644 --- a/meta.js +++ b/meta.js @@ -1,29 +1,29 @@ -const path = require('path') -const fs = require('fs') +const path = require('path'); +const fs = require('fs'); const { sortDependencies, installDependencies, runLintFix, printMessage, -} = require('./utils') -const pkg = require('./package.json') +} = require('./utils'); +const pkg = require('./package.json'); -const templateVersion = pkg.version +const templateVersion = pkg.version; module.exports = { helpers: { if_or(v1, v2, options) { if (v1 || v2) { - return options.fn(this) + return options.fn(this); } - return options.inverse(this) + return options.inverse(this); }, template_version() { - return templateVersion + return templateVersion; }, }, - + prompts: { name: { type: 'string', @@ -57,16 +57,27 @@ module.exports = { }, ], }, + typescript: { + type: 'confirm', + message: 'Use TypeScript as default language?', + default: false, + }, router: { type: 'confirm', message: 'Install vue-router?', }, lint: { + when: '!typescript', type: 'confirm', message: 'Use ESLint to lint your code?', }, + tslint: { + when: 'typescript', + type: 'confirm', + message: 'Use TSLint to lint your code?', + }, lintConfig: { - when: 'lint', + when: '!typescript && lint', type: 'list', message: 'Pick an ESLint preset', choices: [ @@ -141,8 +152,8 @@ module.exports = { }, }, filters: { - '.eslintrc.js': 'lint', - '.eslintignore': 'lint', + '.eslintrc.js': '!typescript && lint', + '.eslintignore': '!typescript && lint', 'config/test.env.js': 'unit || e2e', 'build/webpack.test.conf.js': "unit && runner === 'karma'", 'test/unit/**/*': 'unit', @@ -153,27 +164,46 @@ module.exports = { 'test/unit/setup.js': "unit && runner === 'jest'", 'test/e2e/**/*': 'e2e', 'src/router/**/*': 'router', + 'tsconfig.json': 'typescript', + 'tslint.json': 'typescript && tslint', + 'src/sfc.d.ts': 'typescript', }, complete: function(data, { chalk }) { - const green = chalk.green + const green = chalk.green; - sortDependencies(data, green) + sortDependencies(data, green); - const cwd = path.join(process.cwd(), data.inPlace ? '' : data.destDirName) + const cwd = path.join(process.cwd(), data.inPlace ? '' : data.destDirName); if (data.autoInstall) { installDependencies(cwd, data.autoInstall, green) .then(() => { - return runLintFix(cwd, data, green) + return runLintFix(cwd, data, green); }) .then(() => { - printMessage(data, green) + printMessage(data, green); }) .catch(e => { - console.log(chalk.red('Error:'), e) - }) + console.log(chalk.red('Error:'), e); + }); } else { - printMessage(data, chalk) + printMessage(data, chalk); + } + }, + metalsmith: function(metalsmith, opts, helpers) { + function renameJsSourcesToTs(files, metalsmith, done) { + // If typescript is enabled rename any .js files in src/ folder to .ts extension + if (metalsmith.metadata().typescript) { + Object.keys(files).forEach(filename => { + if (/^(src|test\\unit\\specs).*\.js$/.test(filename)) { + const renamed = filename.replace(/\.js$/, '.ts'); + files[renamed] = files[filename]; + delete files[filename]; + } + }); + } + done(null, files); } + metalsmith.use(renameJsSourcesToTs); }, -} +}; diff --git a/template/build/vue-loader.conf.js b/template/build/vue-loader.conf.js index 33ed58bc0a..0952ac9665 100644 --- a/template/build/vue-loader.conf.js +++ b/template/build/vue-loader.conf.js @@ -7,10 +7,15 @@ const sourceMapEnabled = isProduction : config.dev.cssSourceMap module.exports = { - loaders: utils.cssLoaders({ - sourceMap: sourceMapEnabled, - extract: isProduction - }), + loaders: { + ...utils.cssLoaders({ + sourceMap: sourceMapEnabled, + extract: isProduction + }), + {{#typescript}} + ts: 'ts-loader{{#tslint}}!tslint-loader{{/tslint}}', + {{/typescript}} + }, cssSourceMap: sourceMapEnabled, cacheBusting: config.dev.cacheBusting, transformToRequire: { diff --git a/template/build/webpack.base.conf.js b/template/build/webpack.base.conf.js index 391160c571..cddd88bb7c 100644 --- a/template/build/webpack.base.conf.js +++ b/template/build/webpack.base.conf.js @@ -22,7 +22,7 @@ function resolve (dir) { module.exports = { context: path.resolve(__dirname, '../'), entry: { - app: './src/main.js' + app: './src/main.{{#typescript}}ts{{else}}js{{/typescript}}' }, output: { path: config.build.assetsRoot, @@ -32,7 +32,7 @@ module.exports = { : config.dev.assetsPublicPath }, resolve: { - extensions: ['.js', '.vue', '.json'], + extensions: ['.js', {{#typescript}}'.ts', {{/typescript}}'.vue', '.json'], alias: { {{#if_eq build "standalone"}} 'vue$': 'vue/dist/vue.esm.js', @@ -45,6 +45,28 @@ module.exports = { {{#lint}} ...(config.dev.useEslint ? [createLintingRule()] : []), {{/lint}} + {{#typescript}} + { + test: /\.ts$/, + loader: 'ts-loader', + exclude: /node_modules/, + options: { + appendTsSuffixTo: [/\.vue$/], + }, + }, + {{#tslint}} + { + test: /\.ts$/, + loader: 'tslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + configFile: 'tslint.json', + tsConfigFile: 'tsconfig.json', + typeCheck: true, + }, + }, + {{/tslint}}{{/typescript}} { test: /\.vue$/, loader: 'vue-loader', diff --git a/template/package.json b/template/package.json index db5f9564d2..31f2e95f39 100644 --- a/template/package.json +++ b/template/package.json @@ -82,6 +82,14 @@ "nightwatch": "^0.9.12", "selenium-server": "^3.0.1", {{/e2e}} + {{#typescript}} + {{#tslint}} + "tslint": "^5.8.0", + "tslint-loader": "^3.5.3", + {{/tslint}} + "ts-loader": "^3.2.0", + "typescript": "^2.6.2", + {{/typescript}} "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", "babel-helper-vue-jsx-merge-props": "^2.0.3", diff --git a/template/src/App.vue b/template/src/App.vue index 03d5e7247d..7999c93cb3 100644 --- a/template/src/App.vue +++ b/template/src/App.vue @@ -9,17 +9,18 @@ -