From 9c3e5591e16fa647be5cf8a99d5cc8da5b9b0163 Mon Sep 17 00:00:00 2001 From: Xiaozhe Yao Date: Wed, 26 Sep 2018 01:06:04 +0800 Subject: [PATCH] add dashboard template --- dashboard/.babelrc | 18 ++++ dashboard/.editorconfig | 9 ++ dashboard/.eslintignore | 5 + dashboard/.eslintrc.js | 25 +++++ dashboard/.gitignore | 17 ++++ dashboard/.postcssrc.js | 10 ++ dashboard/README.md | 30 ++++++ dashboard/config/dev.env.js | 7 ++ dashboard/config/index.js | 76 +++++++++++++++ dashboard/config/prod.env.js | 4 + dashboard/config/test.env.js | 7 ++ dashboard/index.html | 13 +++ dashboard/package.json | 88 +++++++++++++++++ dashboard/src/.gitrepo | 12 +++ dashboard/src/App.vue | 91 ++++++++++++++++++ dashboard/src/assets/logo.png | Bin 0 -> 5674 bytes dashboard/src/components/HelloWorld.vue | 35 +++++++ dashboard/src/main.js | 19 ++++ dashboard/src/router/index.js | 15 +++ dashboard/static/.gitkeep | 0 .../e2e/custom-assertions/elementCount.js | 27 ++++++ dashboard/test/e2e/nightwatch.conf.js | 46 +++++++++ dashboard/test/e2e/runner.js | 48 +++++++++ dashboard/test/e2e/specs/test.js | 19 ++++ dashboard/test/unit/.eslintrc | 7 ++ dashboard/test/unit/jest.conf.js | 30 ++++++ dashboard/test/unit/setup.js | 3 + dashboard/test/unit/specs/HelloWorld.spec.js | 11 +++ 28 files changed, 672 insertions(+) create mode 100644 dashboard/.babelrc create mode 100644 dashboard/.editorconfig create mode 100644 dashboard/.eslintignore create mode 100644 dashboard/.eslintrc.js create mode 100644 dashboard/.gitignore create mode 100644 dashboard/.postcssrc.js create mode 100644 dashboard/README.md create mode 100644 dashboard/config/dev.env.js create mode 100644 dashboard/config/index.js create mode 100644 dashboard/config/prod.env.js create mode 100644 dashboard/config/test.env.js create mode 100644 dashboard/index.html create mode 100644 dashboard/package.json create mode 100644 dashboard/src/.gitrepo create mode 100644 dashboard/src/App.vue create mode 100755 dashboard/src/assets/logo.png create mode 100644 dashboard/src/components/HelloWorld.vue create mode 100644 dashboard/src/main.js create mode 100644 dashboard/src/router/index.js create mode 100644 dashboard/static/.gitkeep create mode 100644 dashboard/test/e2e/custom-assertions/elementCount.js create mode 100644 dashboard/test/e2e/nightwatch.conf.js create mode 100644 dashboard/test/e2e/runner.js create mode 100644 dashboard/test/e2e/specs/test.js create mode 100644 dashboard/test/unit/.eslintrc create mode 100644 dashboard/test/unit/jest.conf.js create mode 100644 dashboard/test/unit/setup.js create mode 100644 dashboard/test/unit/specs/HelloWorld.spec.js diff --git a/dashboard/.babelrc b/dashboard/.babelrc new file mode 100644 index 000000000..9390d164e --- /dev/null +++ b/dashboard/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"], + "env": { + "test": { + "presets": ["env", "stage-2"], + "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"] + } + } +} diff --git a/dashboard/.editorconfig b/dashboard/.editorconfig new file mode 100644 index 000000000..9d08a1a82 --- /dev/null +++ b/dashboard/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/dashboard/.eslintignore b/dashboard/.eslintignore new file mode 100644 index 000000000..e2192c5c2 --- /dev/null +++ b/dashboard/.eslintignore @@ -0,0 +1,5 @@ +/build/ +/config/ +/dist/ +/*.js +/test/unit/coverage/ diff --git a/dashboard/.eslintrc.js b/dashboard/.eslintrc.js new file mode 100644 index 000000000..2e2e21183 --- /dev/null +++ b/dashboard/.eslintrc.js @@ -0,0 +1,25 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module' + }, + env: { + browser: true, + }, + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + extends: 'standard', + // required to lint *.vue files + plugins: [ + 'html' + ], + // add your custom rules here + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/dashboard/.gitignore b/dashboard/.gitignore new file mode 100644 index 000000000..dfb4167f9 --- /dev/null +++ b/dashboard/.gitignore @@ -0,0 +1,17 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test/unit/coverage/ +/test/e2e/reports/ +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/dashboard/.postcssrc.js b/dashboard/.postcssrc.js new file mode 100644 index 000000000..eee3e92d7 --- /dev/null +++ b/dashboard/.postcssrc.js @@ -0,0 +1,10 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + "postcss-import": {}, + "postcss-url": {}, + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 000000000..d371726c4 --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,30 @@ +# dashboard + +> CVPM Dashboard + +## Build Setup + +``` bash +# install dependencies +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production with minification +npm run build + +# build for production and view the bundle analyzer report +npm run build --report + +# run unit tests +npm run unit + +# run e2e tests +npm run e2e + +# run all tests +npm test +``` + +For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). diff --git a/dashboard/config/dev.env.js b/dashboard/config/dev.env.js new file mode 100644 index 000000000..1e22973ae --- /dev/null +++ b/dashboard/config/dev.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"' +}) diff --git a/dashboard/config/index.js b/dashboard/config/index.js new file mode 100644 index 000000000..591a543d4 --- /dev/null +++ b/dashboard/config/index.js @@ -0,0 +1,76 @@ +'use strict' +// Template version: 1.2.8 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + + // Various Dev Server settings + host: 'localhost', // can be overwritten by process.env.HOST + port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: false, + errorOverlay: true, + notifyOnErrors: true, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: true, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-module-eval-source-map', + + // If you have problems debugging vue-files in devtools, + // set this to false - it *may* help + // https://vue-loader.vuejs.org/en/options.html#cachebusting + cacheBusting: true, + + cssSourceMap: true, + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/', + + /** + * Source Maps + */ + + productionSourceMap: true, + // https://webpack.js.org/configuration/devtool/#production + devtool: '#source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + } +} diff --git a/dashboard/config/prod.env.js b/dashboard/config/prod.env.js new file mode 100644 index 000000000..a6f997616 --- /dev/null +++ b/dashboard/config/prod.env.js @@ -0,0 +1,4 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"' +} diff --git a/dashboard/config/test.env.js b/dashboard/config/test.env.js new file mode 100644 index 000000000..c2824a307 --- /dev/null +++ b/dashboard/config/test.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const devEnv = require('./dev.env') + +module.exports = merge(devEnv, { + NODE_ENV: '"testing"' +}) diff --git a/dashboard/index.html b/dashboard/index.html new file mode 100644 index 000000000..ae779dfd2 --- /dev/null +++ b/dashboard/index.html @@ -0,0 +1,13 @@ + + + + + + dashboard + + + +
+ + + diff --git a/dashboard/package.json b/dashboard/package.json new file mode 100644 index 000000000..83dc742b4 --- /dev/null +++ b/dashboard/package.json @@ -0,0 +1,88 @@ +{ + "name": "dashboard", + "version": "1.0.0", + "description": "CVPM Dashboard", + "author": "Xiaozhe Yao ", + "private": true, + "scripts": { + "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "start": "npm run dev", + "unit": "jest --config test/unit/jest.conf.js --coverage", + "e2e": "node test/e2e/runner.js", + "test": "npm run unit && npm run e2e", + "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs", + "build": "node build/build.js" + }, + "dependencies": { + "vue": "^2.5.2", + "vue-router": "^3.0.1", + "vuetify": "^1.0.0" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-eslint": "^7.1.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-jest": "^21.0.2", + "babel-loader": "^7.1.1", + "babel-plugin-dynamic-import-node": "^1.2.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-plugin-transform-vue-jsx": "^3.5.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chalk": "^2.0.1", + "chromedriver": "^2.27.2", + "copy-webpack-plugin": "^4.0.1", + "cross-spawn": "^5.0.1", + "css-loader": "^0.28.0", + "eslint": "^3.19.0", + "eslint-config-standard": "^10.2.1", + "eslint-friendly-formatter": "^3.0.0", + "eslint-loader": "^1.7.1", + "eslint-plugin-html": "^3.0.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^3.0.1", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "jest": "^21.2.0", + "jest-serializer-vue": "^0.3.0", + "nightwatch": "^0.9.12", + "node-notifier": "^5.1.2", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "postcss-url": "^7.2.1", + "rimraf": "^2.6.0", + "selenium-server": "^3.0.1", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "uglifyjs-webpack-plugin": "^1.1.1", + "url-loader": "^0.5.8", + "vue-jest": "^1.0.2", + "vue-loader": "^13.3.0", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.1", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/dashboard/src/.gitrepo b/dashboard/src/.gitrepo new file mode 100644 index 000000000..8ba7ed824 --- /dev/null +++ b/dashboard/src/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = https://github.com/vuetifyjs/templates-common.git + branch = subrepo/webpack-src + commit = 090741fa8ba4da0c6f85db64eff64550704123e1 + parent = e05204fc0583a8c99f1963ce873eba1266838215 + method = merge + cmdver = 0.4.0 diff --git a/dashboard/src/App.vue b/dashboard/src/App.vue new file mode 100644 index 000000000..4143476bf --- /dev/null +++ b/dashboard/src/App.vue @@ -0,0 +1,91 @@ + + + diff --git a/dashboard/src/assets/logo.png b/dashboard/src/assets/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..a2ce2353f273cbda4cc6de145f86062ff039a1d2 GIT binary patch literal 5674 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 P6963zeMGIAUBv$Y4kLO$ literal 0 HcmV?d00001 diff --git a/dashboard/src/components/HelloWorld.vue b/dashboard/src/components/HelloWorld.vue new file mode 100644 index 000000000..6bbe5cdbe --- /dev/null +++ b/dashboard/src/components/HelloWorld.vue @@ -0,0 +1,35 @@ + + + + diff --git a/dashboard/src/main.js b/dashboard/src/main.js new file mode 100644 index 000000000..18df910c8 --- /dev/null +++ b/dashboard/src/main.js @@ -0,0 +1,19 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import Vue from 'vue' +import App from './App' +import router from './router' +import Vuetify from 'vuetify' +import 'vuetify/dist/vuetify.min.css' + +Vue.use(Vuetify) + +Vue.config.productionTip = false + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + components: { App }, + template: '' +}) diff --git a/dashboard/src/router/index.js b/dashboard/src/router/index.js new file mode 100644 index 000000000..5fa7f9d31 --- /dev/null +++ b/dashboard/src/router/index.js @@ -0,0 +1,15 @@ +import Vue from 'vue' +import Router from 'vue-router' +import HelloWorld from '@/components/HelloWorld' + +Vue.use(Router) + +export default new Router({ + routes: [ + { + path: '/', + name: 'HelloWorld', + component: HelloWorld + } + ] +}) diff --git a/dashboard/static/.gitkeep b/dashboard/static/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/dashboard/test/e2e/custom-assertions/elementCount.js b/dashboard/test/e2e/custom-assertions/elementCount.js new file mode 100644 index 000000000..818e60209 --- /dev/null +++ b/dashboard/test/e2e/custom-assertions/elementCount.js @@ -0,0 +1,27 @@ +// A custom Nightwatch assertion. +// The assertion name is the filename. +// Example usage: +// +// browser.assert.elementCount(selector, count) +// +// For more information on custom assertions see: +// http://nightwatchjs.org/guide#writing-custom-assertions + +exports.assertion = function (selector, count) { + this.message = 'Testing if element <' + selector + '> has count: ' + count + this.expected = count + this.pass = function (val) { + return val === this.expected + } + this.value = function (res) { + return res.value + } + this.command = function (cb) { + var self = this + return this.api.execute(function (selector) { + return document.querySelectorAll(selector).length + }, [selector], function (res) { + cb.call(self, res) + }) + } +} diff --git a/dashboard/test/e2e/nightwatch.conf.js b/dashboard/test/e2e/nightwatch.conf.js new file mode 100644 index 000000000..f019c0ac4 --- /dev/null +++ b/dashboard/test/e2e/nightwatch.conf.js @@ -0,0 +1,46 @@ +require('babel-register') +var config = require('../../config') + +// http://nightwatchjs.org/gettingstarted#settings-file +module.exports = { + src_folders: ['test/e2e/specs'], + output_folder: 'test/e2e/reports', + custom_assertions_path: ['test/e2e/custom-assertions'], + + selenium: { + start_process: true, + server_path: require('selenium-server').path, + host: '127.0.0.1', + port: 4444, + cli_args: { + 'webdriver.chrome.driver': require('chromedriver').path + } + }, + + test_settings: { + default: { + selenium_port: 4444, + selenium_host: 'localhost', + silent: true, + globals: { + devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) + } + }, + + chrome: { + desiredCapabilities: { + browserName: 'chrome', + javascriptEnabled: true, + acceptSslCerts: true + } + }, + + firefox: { + desiredCapabilities: { + browserName: 'firefox', + javascriptEnabled: true, + acceptSslCerts: true + } + } + } +} diff --git a/dashboard/test/e2e/runner.js b/dashboard/test/e2e/runner.js new file mode 100644 index 000000000..3a02f8e96 --- /dev/null +++ b/dashboard/test/e2e/runner.js @@ -0,0 +1,48 @@ +// 1. start the dev server using production config +process.env.NODE_ENV = 'testing' + +const webpack = require('webpack') +const DevServer = require('webpack-dev-server') + +const webpackConfig = require('../../build/webpack.prod.conf') +const devConfigPromise = require('../../build/webpack.dev.conf') + +let server + +devConfigPromise.then(devConfig => { + const devServerOptions = devConfig.devServer + const compiler = webpack(webpackConfig) + server = new DevServer(compiler, devServerOptions) + const port = devServerOptions.port + const host = devServerOptions.host + return server.listen(port, host) +}) +.then(() => { + // 2. run the nightwatch test suite against it + // to run in additional browsers: + // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" + // 2. add it to the --env flag below + // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` + // For more information on Nightwatch's config file, see + // http://nightwatchjs.org/guide#settings-file + let opts = process.argv.slice(2) + if (opts.indexOf('--config') === -1) { + opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) + } + if (opts.indexOf('--env') === -1) { + opts = opts.concat(['--env', 'chrome']) + } + + const spawn = require('cross-spawn') + const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) + + runner.on('exit', function (code) { + server.close() + process.exit(code) + }) + + runner.on('error', function (err) { + server.close() + throw err + }) +}) diff --git a/dashboard/test/e2e/specs/test.js b/dashboard/test/e2e/specs/test.js new file mode 100644 index 000000000..a7b1bd920 --- /dev/null +++ b/dashboard/test/e2e/specs/test.js @@ -0,0 +1,19 @@ +// For authoring Nightwatch tests, see +// http://nightwatchjs.org/guide#usage + +module.exports = { + 'default e2e tests': function (browser) { + // automatically uses dev Server port from /config.index.js + // default: http://localhost:8080 + // see nightwatch.conf.js + const devServer = browser.globals.devServerURL + + browser + .url(devServer) + .waitForElementVisible('#app', 5000) + .assert.elementPresent('.hello') + .assert.containsText('h1', 'Welcome to Your Vue.js App') + .assert.elementCount('img', 1) + .end() + } +} diff --git a/dashboard/test/unit/.eslintrc b/dashboard/test/unit/.eslintrc new file mode 100644 index 000000000..4d5d98f3e --- /dev/null +++ b/dashboard/test/unit/.eslintrc @@ -0,0 +1,7 @@ +{ + "env": { + "jest": true + }, + "globals": { + } +} diff --git a/dashboard/test/unit/jest.conf.js b/dashboard/test/unit/jest.conf.js new file mode 100644 index 000000000..4f7da1519 --- /dev/null +++ b/dashboard/test/unit/jest.conf.js @@ -0,0 +1,30 @@ +const path = require('path') + +module.exports = { + rootDir: path.resolve(__dirname, '../../'), + moduleFileExtensions: [ + 'js', + 'json', + 'vue' + ], + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + transform: { + '^.+\\.js$': '/node_modules/babel-jest', + '.*\\.(vue)$': '/node_modules/vue-jest' + }, + testPathIgnorePatterns: [ + '/test/e2e' + ], + snapshotSerializers: ['/node_modules/jest-serializer-vue'], + setupFiles: ['/test/unit/setup'], + mapCoverage: true, + coverageDirectory: '/test/unit/coverage', + collectCoverageFrom: [ + 'src/**/*.{js,vue}', + '!src/main.js', + '!src/router/index.js', + '!**/node_modules/**' + ] +} diff --git a/dashboard/test/unit/setup.js b/dashboard/test/unit/setup.js new file mode 100644 index 000000000..edbdbae81 --- /dev/null +++ b/dashboard/test/unit/setup.js @@ -0,0 +1,3 @@ +import Vue from 'vue' + +Vue.config.productionTip = false diff --git a/dashboard/test/unit/specs/HelloWorld.spec.js b/dashboard/test/unit/specs/HelloWorld.spec.js new file mode 100644 index 000000000..d3e6a58e9 --- /dev/null +++ b/dashboard/test/unit/specs/HelloWorld.spec.js @@ -0,0 +1,11 @@ +import Vue from 'vue' +import HelloWorld from '@/components/HelloWorld' + +describe('HelloWorld.vue', () => { + it('should render correct contents', () => { + const Constructor = Vue.extend(HelloWorld) + const vm = new Constructor().$mount() + expect(vm.$el.querySelector('.hello h1').textContent) + .toEqual('Welcome to Your Vue.js App') + }) +})