From 47e3ba0717d87b5045025c3a78f8b7c203c37028 Mon Sep 17 00:00:00 2001 From: Clark Du Date: Mon, 10 Jun 2019 14:19:10 +0100 Subject: [PATCH] refactor: improve choices output --- saofile.js | 69 +- test/index.test.js | 105 +- test/snapshots/index.test.js.md | 2539 +++++++++++++++++++++++++++-- test/snapshots/index.test.js.snap | Bin 2831 -> 6495 bytes 4 files changed, 2486 insertions(+), 227 deletions(-) diff --git a/saofile.js b/saofile.js index 0473a2435..1ed00a771 100644 --- a/saofile.js +++ b/saofile.js @@ -28,7 +28,10 @@ module.exports = { { name: 'pm', message: 'Choose a package manager', - choices: ['yarn', 'npm'], + choices: [ + { name: 'Yarn', value: 'yarn' }, + { name: 'Npm', value: 'npm' } + ], type: 'list', default: 'yarn' }, @@ -37,16 +40,16 @@ module.exports = { message: 'Use a custom UI framework', type: 'list', choices: [ - 'none', - 'bootstrap', - 'vuetify', - 'bulma', - 'tailwind', - 'element-ui', - 'buefy', - 'ant-design-vue', - 'iview', - 'tachyons' + { name: 'None', value: 'none' }, + { name: 'Ant Design Vue', value: 'ant-design-vue' }, + { name: 'Bootstrap Vue', value: 'bootstrap' }, + { name: 'Buefy', value: 'buefy' }, + { name: 'Bulma', value: 'bulma' }, + { name: 'Element', value: 'element-ui' }, + { name: 'iView', value: 'iview' }, + { name: 'Tachyons', value: 'tachyons' }, + { name: 'Tailwind CSS', value: 'tailwind' }, + { name: 'Vuetify.js', value: 'vuetify' } ], default: 'none' }, @@ -55,14 +58,14 @@ module.exports = { message: 'Use a custom server framework', type: 'list', choices: [ - 'none', - 'express', - 'koa', - 'adonis', - 'hapi', - 'feathers', - 'micro', - 'fastify' + { name: 'none', value: 'none' }, + { name: 'AdonisJs', value: 'adonis' }, + { name: 'Express', value: 'express' }, + { name: 'Fastify', value: 'fastify' }, + { name: 'Feathers', value: 'feathers' }, + { name: 'hapi', value: 'hapi' }, + { name: 'Koa', value: 'koa' }, + { name: 'Micro', value: 'micro' } ], default: 'none' }, @@ -71,22 +74,10 @@ module.exports = { message: 'Choose features to install', type: 'checkbox', choices: [ - { - name: 'Progressive Web App (PWA) Support', - value: 'pwa' - }, - { - name: 'Linter / Formatter', - value: 'linter' - }, - { - name: 'Prettier', - value: 'prettier' - }, - { - name: 'Axios', - value: 'axios' - } + { name: 'Axios', value: 'axios' }, + { name: 'ESLint', value: 'linter' }, + { name: 'Prettier', value: 'prettier' }, + { name: 'Progressive Web App (PWA) Support', value: 'pwa' }, ], default: [] }, @@ -95,9 +86,9 @@ module.exports = { message: 'Use a custom test framework', type: 'list', choices: [ - 'none', - 'jest', - 'ava' + { name: 'none', value: 'none' }, + { name: 'Jest', value: 'jest' }, + { name: 'AVA', value: 'ava' } ], default: 'none' }, @@ -106,7 +97,7 @@ module.exports = { message: 'Choose rendering mode', type: 'list', choices: [ - { name: 'Universal', value: 'universal' }, + { name: 'Universal (SSR)', value: 'universal' }, { name: 'Single Page App', value: 'spa' } ], default: 'universal' diff --git a/test/index.test.js b/test/index.test.js index cc2961590..2d8e555b1 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -1,6 +1,7 @@ import path from 'path' import test from 'ava' import sao from 'sao' +import saoConfig from '../saofile' const generator = path.join(__dirname, '..') @@ -17,88 +18,30 @@ const verifyPkg = async (t, answers) => { const stream = await sao.mock({ generator }, answers) const pkg = await stream.readFile('package.json') - t.snapshot(stream.fileList, 'Generated files') + t.snapshot(stream.fileList, 'Generated package.json') t.snapshot(getPkgFields(pkg), 'package.json') } -test('defaults', async (t) => { - await verifyPkg(t) -}) - -test('use express', async (t) => { - await verifyPkg(t, { - server: 'express' - }) -}) - -test('use koa', async (t) => { - await verifyPkg(t, { - server: 'koa' - }) -}) - -test('use hapi', async (t) => { - await verifyPkg(t, { - server: 'hapi' - }) -}) - -test('use feathers', async (t) => { - await verifyPkg(t, { - server: 'feathers' - }) -}) - -test('use micro', async (t) => { - await verifyPkg(t, { - server: 'micro' - }) -}) - -test('use fastify', async (t) => { - await verifyPkg(t, { - server: 'fastify' - }) -}) - -test('use axios', async (t) => { - await verifyPkg(t, { - features: ['axios'] - }) -}) - -test('use jest', async (t) => { - await verifyPkg(t, { - test: 'jest' - }) -}) - -test('use ava', async (t) => { - await verifyPkg(t, { - test: 'ava' - }) -}) - -test('use eslint', async (t) => { - await verifyPkg(t, { - features: ['linter'] - }) -}) - -test('use yarn', async (t) => { - await verifyPkg(t, { - pm: 'yarn' - }) -}) - -test('use prettier', async (t) => { - await verifyPkg(t, { - features: ['prettier'] - }) -}) +const verifyNuxtConfig = async (t, answers = {}) => { + const stream = await sao.mock({ generator }, answers) + const configFile = answers.server === 'adonis' ? 'config/nuxt.js' : 'nuxt.config.js' + const config = await stream.readFile(configFile) + t.snapshot(config, `Generated ${configFile}`) +} -test('use pwa', async (t) => { - await verifyPkg(t, { - features: ['pwa'] - }) -}) +test('verify default answers', async (t) => { + await verifyPkg(t) + await verifyNuxtConfig(t) +}) + +for (const prompt of saoConfig.prompts) { + if (Array.isArray(prompt.choices)) { + for (const choice of prompt.choices) { + test(`verify ${prompt.name}: ${choice.name}`, async (t) => { + const answer = { [prompt.name]: prompt.type === 'list' ? choice.value : [choice.value] } + await verifyPkg(t, answer) + await verifyNuxtConfig(t, answer) + }) + } + } +} diff --git a/test/snapshots/index.test.js.md b/test/snapshots/index.test.js.md index 28145e67d..6c87051b2 100644 --- a/test/snapshots/index.test.js.md +++ b/test/snapshots/index.test.js.md @@ -4,9 +4,9 @@ The actual snapshot is saved in `index.test.js.snap`. Generated by [AVA](https://ava.li). -## defaults +## verify default answers -> Generated files +> Generated package.json [ '.editorconfig', @@ -46,9 +46,1640 @@ Generated by [AVA](https://ava.li). }, } -## use ava +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify features: Axios + +> Generated package.json -> Generated files + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + '@nuxtjs/axios': '^5.3.6', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + // Doc: https://axios.nuxtjs.org/usage␊ + '@nuxtjs/axios',␊ + ],␊ + /*␊ + ** Axios module configuration␊ + ** See https://axios.nuxtjs.org/options␊ + */␊ + axios: {␊ + },␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify features: ESLint + +> Generated package.json + + [ + '.editorconfig', + '.eslintrc.js', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + '@nuxtjs/eslint-config': '^0.0.1', + '@nuxtjs/eslint-module': '^0.0.1', + 'babel-eslint': '^10.0.1', + eslint: '^5.15.1', + 'eslint-config-standard': '>=12.0.0', + 'eslint-plugin-import': '>=2.16.0', + 'eslint-plugin-jest': '>=22.3.0', + 'eslint-plugin-node': '>=8.0.1', + 'eslint-plugin-nuxt': '>=0.4.2', + 'eslint-plugin-promise': '>=4.0.1', + 'eslint-plugin-standard': '>=4.0.0', + 'eslint-plugin-vue': '^5.2.2', + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + lint: 'eslint --ext .js,.vue --ignore-path .gitignore .', + precommit: 'yarn lint', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + '@nuxtjs/eslint-module',␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify features: Prettier + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + '.prettierrc', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + 'eslint-config-prettier': '^4.1.0', + 'eslint-plugin-prettier': '^3.0.1', + nodemon: '^1.18.9', + prettier: '^1.16.4', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify features: Progressive Web App (PWA) Support + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'static/icon.png', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + '@nuxtjs/pwa': '^2.6.0', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + '@nuxtjs/pwa',␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify mode: Single Page App + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'spa',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify mode: Universal (SSR) + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify pm: Npm + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify pm: Yarn + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: AdonisJs + +> Generated package.json + + [ + '.editorconfig', + '.env', + '.gitignore', + 'README.md', + 'ace', + 'app/Commands/NuxtBuild.js', + 'app/Controllers/Http/NuxtController.js', + 'app/Models/Hooks/.gitkeep', + 'app/Models/Hooks/User.js', + 'app/Models/Token.js', + 'app/Models/User.js', + 'config/app.js', + 'config/auth.js', + 'config/bodyParser.js', + 'config/cors.js', + 'config/database.js', + 'config/nuxt.js', + 'config/session.js', + 'config/shield.js', + 'database/factory.js', + 'database/migrations/.gitkeep', + 'package.json', + 'providers/NuxtProvider.js', + 'resources/assets/README.md', + 'resources/components/Logo.vue', + 'resources/components/README.md', + 'resources/layouts/README.md', + 'resources/layouts/default.vue', + 'resources/middleware/README.md', + 'resources/pages/README.md', + 'resources/pages/index.vue', + 'resources/plugins/README.md', + 'resources/static/README.md', + 'resources/static/favicon.ico', + 'resources/store/README.md', + 'server.js', + 'start/app.js', + 'start/kernel.js', + 'start/routes.js', + ] + +> package.json + + { + dependencies: { + '@adonisjs/ace': '^4.0.7', + '@adonisjs/auth': '^2.0.10', + '@adonisjs/bodyparser': '^1.0.8', + '@adonisjs/cors': '^1.0.2', + '@adonisjs/fold': '^4.0.5', + '@adonisjs/framework': '^4.0.27', + '@adonisjs/ignitor': '^1.0.14', + '@adonisjs/lucid': '^4.0.22', + '@adonisjs/session': '^1.0.19', + '@adonisjs/shield': '^1.0.4', + 'cross-env': '^5.2.0', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'cross-env NODE_ENV=production node ./ace nuxtbuild', + dev: 'nodemon --watch app --watch bootstrap --watch config --watch .env -x node server.js', + 'serve:dev': 'yarn dev', + start: 'cross-env NODE_ENV=production node server.js', + }, + } + +> Generated config/nuxt.js + + `const { resolve } = require('path')␊ + ␊ + module.exports = {␊ + mode: 'universal',␊ + dev: process.env.NODE_ENV === 'development',␊ + srcDir: resolve(__dirname, '..', 'resources'),␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: Express + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'server/index.js', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + 'cross-env': '^5.2.0', + express: '^4.16.4', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + generate: 'nuxt generate', + start: 'cross-env NODE_ENV=production node server/index.js', + }, + } + +> Generated nuxt.config.js + + `␊ + module.exports = {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: Fastify + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'server/index.js', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + 'cross-env': '^5.2.0', + fastify: '^1.13.3', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + generate: 'nuxt generate', + start: 'cross-env NODE_ENV=production node server/index.js', + }, + } + +> Generated nuxt.config.js + + `␊ + module.exports = {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: Feathers + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'server/config/default.json', + 'server/config/production.json', + 'server/index.js', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + '@feathersjs/configuration': '^2.0.6', + '@feathersjs/express': '^1.3.1', + '@feathersjs/feathers': '^3.3.1', + 'cross-env': '^5.2.0', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + generate: 'nuxt generate', + start: 'cross-env NODE_ENV=production node server/index.js', + }, + } + +> Generated nuxt.config.js + + `␊ + module.exports = {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: Koa + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'server/index.js', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + 'cross-env': '^5.2.0', + koa: '^2.6.2', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + generate: 'nuxt generate', + start: 'cross-env NODE_ENV=production node server/index.js', + }, + } + +> Generated nuxt.config.js + + `␊ + module.exports = {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: Micro + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'server/index.js', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + 'cross-env': '^5.2.0', + micro: '^9.3.3', + 'micro-route': '^2.5.0', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + generate: 'nuxt generate', + start: 'cross-env NODE_ENV=production node server/index.js', + }, + } + +> Generated nuxt.config.js + + `␊ + module.exports = {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: hapi + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'server/index.js', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + '@hapi/hapi': '^18.3.1', + '@nuxtjs/hapi': '^2.2.1', + 'cross-env': '^5.2.0', + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + generate: 'nuxt generate', + start: 'cross-env NODE_ENV=production node server/index.js', + }, + } + +> Generated nuxt.config.js + + `␊ + module.exports = {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify server: none + +> Generated package.json + + [ + '.editorconfig', + '.gitignore', + 'README.md', + 'assets/README.md', + 'components/Logo.vue', + 'components/README.md', + 'layouts/README.md', + 'layouts/default.vue', + 'middleware/README.md', + 'nuxt.config.js', + 'package.json', + 'pages/README.md', + 'pages/index.vue', + 'plugins/README.md', + 'static/README.md', + 'static/favicon.ico', + 'store/README.md', + ] + +> package.json + + { + dependencies: { + nuxt: '^2.0.0', + }, + devDependencies: { + nodemon: '^1.18.9', + }, + private: true, + scripts: { + build: 'nuxt build', + dev: 'nuxt', + generate: 'nuxt generate', + start: 'nuxt start', + }, + } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify test: AVA + +> Generated package.json [ '.editorconfig', @@ -98,17 +1729,70 @@ Generated by [AVA](https://ava.li). }, } -## use axios - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify test: Jest + +> Generated package.json [ + '.babelrc', '.editorconfig', '.gitignore', 'README.md', 'assets/README.md', 'components/Logo.vue', 'components/README.md', + 'jest.config.js', 'layouts/README.md', 'layouts/default.vue', 'middleware/README.md', @@ -120,17 +1804,22 @@ Generated by [AVA](https://ava.li). 'static/README.md', 'static/favicon.ico', 'store/README.md', + 'test/Logo.spec.js', ] > package.json { dependencies: { - '@nuxtjs/axios': '^5.3.6', nuxt: '^2.0.0', }, devDependencies: { + '@vue/test-utils': '^1.0.0-beta.27', + 'babel-core': '7.0.0-bridge.0', + 'babel-jest': '^24.1.0', + jest: '^24.1.0', nodemon: '^1.18.9', + 'vue-jest': '^3.0.3', }, private: true, scripts: { @@ -138,16 +1827,67 @@ Generated by [AVA](https://ava.li). dev: 'nuxt', generate: 'nuxt generate', start: 'nuxt start', + test: 'jest', }, } -## use eslint - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify test: none + +> Generated package.json [ '.editorconfig', - '.eslintrc.js', '.gitignore', 'README.md', 'assets/README.md', @@ -173,18 +1913,6 @@ Generated by [AVA](https://ava.li). nuxt: '^2.0.0', }, devDependencies: { - '@nuxtjs/eslint-config': '^0.0.1', - '@nuxtjs/eslint-module': '^0.0.1', - 'babel-eslint': '^10.0.1', - eslint: '^5.15.1', - 'eslint-config-standard': '>=12.0.0', - 'eslint-plugin-import': '>=2.16.0', - 'eslint-plugin-jest': '>=22.3.0', - 'eslint-plugin-node': '>=8.0.1', - 'eslint-plugin-nuxt': '>=0.4.2', - 'eslint-plugin-promise': '>=4.0.1', - 'eslint-plugin-standard': '>=4.0.0', - 'eslint-plugin-vue': '^5.2.2', nodemon: '^1.18.9', }, private: true, @@ -192,15 +1920,64 @@ Generated by [AVA](https://ava.li). build: 'nuxt build', dev: 'nuxt', generate: 'nuxt generate', - lint: 'eslint --ext .js,.vue --ignore-path .gitignore .', - precommit: 'yarn lint', start: 'nuxt start', }, } -## use express - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Ant Design Vue + +> Generated package.json [ '.editorconfig', @@ -217,7 +1994,7 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', - 'server/index.js', + 'plugins/antd-ui.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -227,8 +2004,7 @@ Generated by [AVA](https://ava.li). { dependencies: { - 'cross-env': '^5.2.0', - express: '^4.16.4', + 'ant-design-vue': '^1.1.10', nuxt: '^2.0.0', }, devDependencies: { @@ -237,15 +2013,68 @@ Generated by [AVA](https://ava.li). private: true, scripts: { build: 'nuxt build', - dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + dev: 'nuxt', generate: 'nuxt generate', - start: 'cross-env NODE_ENV=production node server/index.js', + start: 'nuxt start', }, } -## use fastify - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + 'ant-design-vue/dist/antd.css'␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + '@/plugins/antd-ui'␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Bootstrap Vue + +> Generated package.json [ '.editorconfig', @@ -262,7 +2091,6 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', - 'server/index.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -272,8 +2100,8 @@ Generated by [AVA](https://ava.li). { dependencies: { - 'cross-env': '^5.2.0', - fastify: '^1.13.3', + bootstrap: '^4.1.3', + 'bootstrap-vue': '^2.0.0-rc.11', nuxt: '^2.0.0', }, devDependencies: { @@ -282,21 +2110,76 @@ Generated by [AVA](https://ava.li). private: true, scripts: { build: 'nuxt build', - dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + dev: 'nuxt', generate: 'nuxt generate', - start: 'cross-env NODE_ENV=production node server/index.js', + start: 'nuxt start', }, } -## use feathers - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + // Doc: https://bootstrap-vue.js.org/docs/␊ + 'bootstrap-vue/nuxt',␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Buefy + +> Generated package.json [ '.editorconfig', '.gitignore', 'README.md', 'assets/README.md', + 'assets/buefy.png', + 'components/Card.vue', 'components/Logo.vue', 'components/README.md', 'layouts/README.md', @@ -306,10 +2189,8 @@ Generated by [AVA](https://ava.li). 'package.json', 'pages/README.md', 'pages/index.vue', + 'pages/inspire.vue', 'plugins/README.md', - 'server/config/default.json', - 'server/config/production.json', - 'server/index.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -319,11 +2200,8 @@ Generated by [AVA](https://ava.li). { dependencies: { - '@feathersjs/configuration': '^2.0.6', - '@feathersjs/express': '^1.3.1', - '@feathersjs/feathers': '^3.3.1', - 'cross-env': '^5.2.0', nuxt: '^2.0.0', + 'nuxt-buefy': '^0.3.2', }, devDependencies: { nodemon: '^1.18.9', @@ -331,15 +2209,68 @@ Generated by [AVA](https://ava.li). private: true, scripts: { build: 'nuxt build', - dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + dev: 'nuxt', generate: 'nuxt generate', - start: 'cross-env NODE_ENV=production node server/index.js', + start: 'nuxt start', }, } -## use hapi - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + // Doc: https://buefy.github.io/#/documentation␊ + 'nuxt-buefy',␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Bulma + +> Generated package.json [ '.editorconfig', @@ -356,7 +2287,6 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', - 'server/index.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -366,9 +2296,7 @@ Generated by [AVA](https://ava.li). { dependencies: { - '@hapi/hapi': '^18.3.1', - '@nuxtjs/hapi': '^2.2.1', - 'cross-env': '^5.2.0', + '@nuxtjs/bulma': '^1.2.1', nuxt: '^2.0.0', }, devDependencies: { @@ -377,25 +2305,83 @@ Generated by [AVA](https://ava.li). private: true, scripts: { build: 'nuxt build', - dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + dev: 'nuxt', generate: 'nuxt generate', - start: 'cross-env NODE_ENV=production node server/index.js', + start: 'nuxt start', }, } -## use jest - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + // Doc:https://github.com/nuxt-community/modules/tree/master/packages/bulma␊ + '@nuxtjs/bulma',␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + postcss: {␊ + preset: {␊ + features: {␊ + customProperties: false␊ + }␊ + }␊ + },␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Element + +> Generated package.json [ - '.babelrc', '.editorconfig', '.gitignore', 'README.md', 'assets/README.md', 'components/Logo.vue', 'components/README.md', - 'jest.config.js', 'layouts/README.md', 'layouts/default.vue', 'middleware/README.md', @@ -404,25 +2390,21 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', + 'plugins/element-ui.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', - 'test/Logo.spec.js', ] > package.json { dependencies: { + 'element-ui': '^2.4.11', nuxt: '^2.0.0', }, devDependencies: { - '@vue/test-utils': '^1.0.0-beta.27', - 'babel-core': '7.0.0-bridge.0', - 'babel-jest': '^24.1.0', - jest: '^24.1.0', nodemon: '^1.18.9', - 'vue-jest': '^3.0.3', }, private: true, scripts: { @@ -430,13 +2412,66 @@ Generated by [AVA](https://ava.li). dev: 'nuxt', generate: 'nuxt generate', start: 'nuxt start', - test: 'jest', }, } -## use koa - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + 'element-ui/lib/theme-chalk/index.css'␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + '@/plugins/element-ui'␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + transpile: [/^element-ui/],␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: None + +> Generated package.json [ '.editorconfig', @@ -453,7 +2488,6 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', - 'server/index.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -463,8 +2497,6 @@ Generated by [AVA](https://ava.li). { dependencies: { - 'cross-env': '^5.2.0', - koa: '^2.6.2', nuxt: '^2.0.0', }, devDependencies: { @@ -473,15 +2505,66 @@ Generated by [AVA](https://ava.li). private: true, scripts: { build: 'nuxt build', - dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + dev: 'nuxt', generate: 'nuxt generate', - start: 'cross-env NODE_ENV=production node server/index.js', + start: 'nuxt start', }, } -## use micro - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Tachyons + +> Generated package.json [ '.editorconfig', @@ -498,7 +2581,6 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', - 'server/index.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -508,10 +2590,8 @@ Generated by [AVA](https://ava.li). { dependencies: { - 'cross-env': '^5.2.0', - micro: '^9.3.3', - 'micro-route': '^2.5.0', nuxt: '^2.0.0', + tachyons: '^4.11.1', }, devDependencies: { nodemon: '^1.18.9', @@ -519,22 +2599,74 @@ Generated by [AVA](https://ava.li). private: true, scripts: { build: 'nuxt build', - dev: 'cross-env NODE_ENV=development nodemon server/index.js --watch server', + dev: 'nuxt', generate: 'nuxt generate', - start: 'cross-env NODE_ENV=production node server/index.js', + start: 'nuxt start', }, } -## use prettier - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + 'tachyons/css/tachyons.css'␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Tailwind CSS + +> Generated package.json [ '.editorconfig', '.gitignore', - '.prettierrc', 'README.md', 'assets/README.md', + 'assets/css/tailwind.css', 'components/Logo.vue', 'components/README.md', 'layouts/README.md', @@ -548,6 +2680,7 @@ Generated by [AVA](https://ava.li). 'static/README.md', 'static/favicon.ico', 'store/README.md', + 'tailwind.config.js', ] > package.json @@ -557,10 +2690,8 @@ Generated by [AVA](https://ava.li). nuxt: '^2.0.0', }, devDependencies: { - 'eslint-config-prettier': '^4.1.0', - 'eslint-plugin-prettier': '^3.0.1', nodemon: '^1.18.9', - prettier: '^1.16.4', + tailwindcss: '^1.0.0', }, private: true, scripts: { @@ -571,28 +2702,90 @@ Generated by [AVA](https://ava.li). }, } -## use pwa - -> Generated files +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + '~/assets/css/tailwind.css'␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + postcss: {␊ + plugins: {␊ + tailwindcss: './tailwind.config.js'␊ + }␊ + },␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: Vuetify.js + +> Generated package.json [ '.editorconfig', '.gitignore', 'README.md', 'assets/README.md', + 'assets/style/app.styl', + 'assets/style/variables.styl', 'components/Logo.vue', 'components/README.md', + 'components/VuetifyLogo.vue', 'layouts/README.md', 'layouts/default.vue', + 'layouts/error.vue', 'middleware/README.md', 'nuxt.config.js', 'package.json', 'pages/README.md', 'pages/index.vue', + 'pages/inspire.vue', 'plugins/README.md', 'static/README.md', 'static/favicon.ico', - 'static/icon.png', + 'static/v.png', 'store/README.md', ] @@ -600,11 +2793,13 @@ Generated by [AVA](https://ava.li). { dependencies: { - '@nuxtjs/pwa': '^2.6.0', + '@nuxtjs/vuetify': '0.5.5', nuxt: '^2.0.0', }, devDependencies: { nodemon: '^1.18.9', + stylus: '^0.54.5', + 'stylus-loader': '^3.0.2', }, private: true, scripts: { @@ -615,9 +2810,84 @@ Generated by [AVA](https://ava.li). }, } -## use yarn - -> Generated files +> Generated nuxt.config.js + + `import colors from 'vuetify/es5/util/colors'␊ + ␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + titleTemplate: '%s - ' + process.env.npm_package_name,␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ,␊ + {␊ + rel: 'stylesheet',␊ + href:␊ + 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons'␊ + }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + '@nuxtjs/vuetify',␊ + ],␊ + /*␊ + ** vuetify module configuration␊ + ** https://github.com/nuxt-community/vuetify-module␊ + */␊ + vuetify: {␊ + theme: {␊ + primary: colors.blue.darken2,␊ + accent: colors.grey.darken3,␊ + secondary: colors.amber.darken3,␊ + info: colors.teal.lighten1,␊ + warning: colors.amber.base,␊ + error: colors.deepOrange.accent4,␊ + success: colors.green.accent3␊ + }␊ + },␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` + +## verify ui: iView + +> Generated package.json [ '.editorconfig', @@ -634,6 +2904,7 @@ Generated by [AVA](https://ava.li). 'pages/README.md', 'pages/index.vue', 'plugins/README.md', + 'plugins/iview.js', 'static/README.md', 'static/favicon.ico', 'store/README.md', @@ -643,6 +2914,7 @@ Generated by [AVA](https://ava.li). { dependencies: { + iview: '3.1.5', nuxt: '^2.0.0', }, devDependencies: { @@ -656,3 +2928,56 @@ Generated by [AVA](https://ava.li). start: 'nuxt start', }, } + +> Generated nuxt.config.js + + `␊ + export default {␊ + mode: 'universal',␊ + /*␊ + ** Headers of the page␊ + */␊ + head: {␊ + title: process.env.npm_package_name || '',␊ + meta: [␊ + { charset: 'utf-8' },␊ + { name: 'viewport', content: 'width=device-width, initial-scale=1' },␊ + { hid: 'description', name: 'description', content: process.env.npm_package_description || '' }␊ + ],␊ + link: [␊ + { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }␊ + ]␊ + },␊ + /*␊ + ** Customize the progress-bar color␊ + */␊ + loading: { color: '#fff' },␊ + /*␊ + ** Global CSS␊ + */␊ + css: [␊ + 'iview/dist/styles/iview.css'␊ + ],␊ + /*␊ + ** Plugins to load before mounting the App␊ + */␊ + plugins: [␊ + '@/plugins/iview'␊ + ],␊ + /*␊ + ** Nuxt.js modules␊ + */␊ + modules: [␊ + ],␊ + /*␊ + ** Build configuration␊ + */␊ + build: {␊ + /*␊ + ** You can extend webpack config here␊ + */␊ + extend(config, ctx) {␊ + }␊ + }␊ + }␊ + ` diff --git a/test/snapshots/index.test.js.snap b/test/snapshots/index.test.js.snap index fb8c0bd40088089ebb79f2c5f2c3bc71962e65b5..04a132d5f22cc9f266144dc56eb3235897c1289d 100644 GIT binary patch literal 6495 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 literal 2831 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