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 @@
-