@ -1,18 +0,0 @@ |
||||
{ |
||||
"presets": [ |
||||
["env", { |
||||
"modules": false, |
||||
"targets": { |
||||
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"] |
||||
} |
||||
}], |
||||
"stage-2" |
||||
], |
||||
"plugins": ["transform-runtime"], |
||||
"env": { |
||||
"test": { |
||||
"presets": ["env", "stage-2"], |
||||
"plugins": [ "istanbul" ] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
> 1% |
||||
last 2 versions |
||||
not ie <= 8 |
@ -1,2 +0,0 @@ |
||||
build/*.js |
||||
config/*.js |
@ -1,30 +1,32 @@ |
||||
// http://eslint.org/docs/user-guide/configuring
|
||||
|
||||
module.exports = { |
||||
root: true, |
||||
parser: 'babel-eslint', |
||||
parserOptions: { |
||||
sourceType: 'module' |
||||
}, |
||||
env: { |
||||
browser: true, |
||||
node: true |
||||
}, |
||||
'extends': [ |
||||
'plugin:vue/recommended', |
||||
'@vue/standard' |
||||
], |
||||
globals: { |
||||
FB: true |
||||
}, |
||||
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
|
||||
extends: 'standard', |
||||
// required to lint *.vue files
|
||||
plugins: [ |
||||
'html' |
||||
], |
||||
// add your custom rules here
|
||||
'rules': { |
||||
// allow paren-less arrow functions
|
||||
'arrow-parens': 0, |
||||
// allow async-await
|
||||
'generator-star-spacing': 0, |
||||
// allow debugger during development
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 |
||||
rules: { |
||||
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
||||
'vue/script-indent': 'off', |
||||
'vue/html-indent': 'off', |
||||
'vue/max-attributes-per-line': [2, { |
||||
'singleline': 2, |
||||
'multiline': { |
||||
'max': 1, |
||||
'allowFirstLine': true |
||||
} |
||||
}], |
||||
'indent': 'off', |
||||
'arrow-parens': 'off', |
||||
'generator-star-spacing': 'off' |
||||
}, |
||||
parserOptions: { |
||||
parser: 'babel-eslint' |
||||
} |
||||
} |
||||
|
@ -1,16 +1,21 @@ |
||||
.DS_Store |
||||
node_modules/ |
||||
dist/ |
||||
node_modules |
||||
/dist |
||||
|
||||
# local env files |
||||
.env.local |
||||
.env.*.local |
||||
|
||||
# Log files |
||||
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 |
||||
*.sw* |
||||
|
@ -1,8 +0,0 @@ |
||||
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||
|
||||
module.exports = { |
||||
"plugins": { |
||||
// to edit target browsers: use "browserlist" field in package.json
|
||||
"autoprefixer": {} |
||||
} |
||||
} |
@ -1,9 +0,0 @@ |
||||
{ |
||||
"processors": ["stylelint-processor-html"], |
||||
"extends": "stylelint-config-standard", |
||||
"rules": { |
||||
"no-empty-source": null, |
||||
"color-hex-case": null, |
||||
"comment-empty-line-before": null |
||||
} |
||||
} |
@ -1,30 +1,36 @@ |
||||
# EUROMAT 2017 |
||||
# EUROMAT |
||||
|
||||
> A Vue.js powered, progressive web voting application for the upcoming German election with a European focus. |
||||
> A Vue.js powered, progressive web voting application for the upcoming European election. |
||||
|
||||
## Development |
||||
|
||||
``` bash |
||||
# install dependencies |
||||
## Project setup |
||||
``` |
||||
npm install |
||||
``` |
||||
|
||||
# serve with hot reload at localhost:8080 |
||||
npm run dev |
||||
### Compiles and hot-reloads for development |
||||
``` |
||||
npm run serve |
||||
``` |
||||
|
||||
# build for production with minification |
||||
### Compiles and minifies for production |
||||
``` |
||||
npm run build |
||||
``` |
||||
|
||||
# build for production and view the bundle analyzer report |
||||
npm run build --report |
||||
|
||||
# run unit tests |
||||
npm run unit |
||||
### Run your tests |
||||
``` |
||||
npm run test |
||||
``` |
||||
|
||||
# run e2e tests |
||||
npm run e2e |
||||
### Lints and fixes files |
||||
``` |
||||
npm run lint |
||||
``` |
||||
|
||||
# run all tests |
||||
npm test |
||||
### Run your unit tests |
||||
``` |
||||
npm run test:unit |
||||
``` |
||||
|
||||
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). |
||||
### Customize configuration |
||||
See [Configuration Reference](https://cli.vuejs.org/config/). |
||||
|
@ -0,0 +1,5 @@ |
||||
module.exports = { |
||||
presets: [ |
||||
'@vue/app' |
||||
] |
||||
} |
@ -1,35 +0,0 @@ |
||||
require('./check-versions')() |
||||
|
||||
process.env.NODE_ENV = 'production' |
||||
|
||||
var ora = require('ora') |
||||
var rm = require('rimraf') |
||||
var path = require('path') |
||||
var chalk = require('chalk') |
||||
var webpack = require('webpack') |
||||
var config = require('../config') |
||||
var webpackConfig = require('./webpack.prod.conf') |
||||
|
||||
var spinner = ora('building for production...') |
||||
spinner.start() |
||||
|
||||
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { |
||||
if (err) throw err |
||||
webpack(webpackConfig, function (err, stats) { |
||||
spinner.stop() |
||||
if (err) throw err |
||||
process.stdout.write(stats.toString({ |
||||
colors: true, |
||||
modules: false, |
||||
children: false, |
||||
chunks: false, |
||||
chunkModules: false |
||||
}) + '\n\n') |
||||
|
||||
console.log(chalk.cyan(' Build complete.\n')) |
||||
console.log(chalk.yellow( |
||||
' Tip: built files are meant to be served over an HTTP server.\n' + |
||||
' Opening index.html over file:// won\'t work.\n' |
||||
)) |
||||
}) |
||||
}) |
@ -1,48 +0,0 @@ |
||||
var chalk = require('chalk') |
||||
var semver = require('semver') |
||||
var packageConfig = require('../package.json') |
||||
var shell = require('shelljs') |
||||
function exec (cmd) { |
||||
return require('child_process').execSync(cmd).toString().trim() |
||||
} |
||||
|
||||
var versionRequirements = [ |
||||
{ |
||||
name: 'node', |
||||
currentVersion: semver.clean(process.version), |
||||
versionRequirement: packageConfig.engines.node |
||||
}, |
||||
] |
||||
|
||||
if (shell.which('npm')) { |
||||
versionRequirements.push({ |
||||
name: 'npm', |
||||
currentVersion: exec('npm --version'), |
||||
versionRequirement: packageConfig.engines.npm |
||||
}) |
||||
} |
||||
|
||||
module.exports = function () { |
||||
var warnings = [] |
||||
for (var i = 0; i < versionRequirements.length; i++) { |
||||
var mod = versionRequirements[i] |
||||
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { |
||||
warnings.push(mod.name + ': ' + |
||||
chalk.red(mod.currentVersion) + ' should be ' + |
||||
chalk.green(mod.versionRequirement) |
||||
) |
||||
} |
||||
} |
||||
|
||||
if (warnings.length) { |
||||
console.log('') |
||||
console.log(chalk.yellow('To use this template, you must update following to modules:')) |
||||
console.log() |
||||
for (var i = 0; i < warnings.length; i++) { |
||||
var warning = warnings[i] |
||||
console.log(' ' + warning) |
||||
} |
||||
console.log() |
||||
process.exit(1) |
||||
} |
||||
} |
@ -1,9 +0,0 @@ |
||||
/* eslint-disable */ |
||||
require('eventsource-polyfill') |
||||
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') |
||||
|
||||
hotClient.subscribe(function (event) { |
||||
if (event.action === 'reload') { |
||||
window.location.reload() |
||||
} |
||||
}) |
@ -1,91 +0,0 @@ |
||||
require('./check-versions')() |
||||
|
||||
var config = require('../config') |
||||
if (!process.env.NODE_ENV) { |
||||
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) |
||||
} |
||||
|
||||
var opn = require('opn') |
||||
var path = require('path') |
||||
var express = require('express') |
||||
var webpack = require('webpack') |
||||
var proxyMiddleware = require('http-proxy-middleware') |
||||
var webpackConfig = process.env.NODE_ENV === 'testing' |
||||
? require('./webpack.prod.conf') |
||||
: require('./webpack.dev.conf') |
||||
|
||||
// default port where dev server listens for incoming traffic
|
||||
var port = process.env.PORT || config.dev.port |
||||
// automatically open browser, if not set will be false
|
||||
var autoOpenBrowser = !!config.dev.autoOpenBrowser |
||||
// Define HTTP proxies to your custom API backend
|
||||
// https://github.com/chimurai/http-proxy-middleware
|
||||
var proxyTable = config.dev.proxyTable |
||||
|
||||
var app = express() |
||||
var compiler = webpack(webpackConfig) |
||||
|
||||
var devMiddleware = require('webpack-dev-middleware')(compiler, { |
||||
publicPath: webpackConfig.output.publicPath, |
||||
quiet: true |
||||
}) |
||||
|
||||
var hotMiddleware = require('webpack-hot-middleware')(compiler, { |
||||
log: false |
||||
}) |
||||
// force page reload when html-webpack-plugin template changes
|
||||
compiler.plugin('compilation', function (compilation) { |
||||
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { |
||||
hotMiddleware.publish({ action: 'reload' }) |
||||
cb() |
||||
}) |
||||
}) |
||||
|
||||
// proxy api requests
|
||||
Object.keys(proxyTable).forEach(function (context) { |
||||
var options = proxyTable[context] |
||||
if (typeof options === 'string') { |
||||
options = { target: options } |
||||
} |
||||
app.use(proxyMiddleware(options.filter || context, options)) |
||||
}) |
||||
|
||||
// handle fallback for HTML5 history API
|
||||
app.use(require('connect-history-api-fallback')()) |
||||
|
||||
// serve webpack bundle output
|
||||
app.use(devMiddleware) |
||||
|
||||
// enable hot-reload and state-preserving
|
||||
// compilation error display
|
||||
app.use(hotMiddleware) |
||||
|
||||
// serve pure static assets
|
||||
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) |
||||
app.use(staticPath, express.static('./static')) |
||||
|
||||
var uri = 'http://localhost:' + port |
||||
|
||||
var _resolve |
||||
var readyPromise = new Promise(resolve => { |
||||
_resolve = resolve |
||||
}) |
||||
|
||||
console.log('> Starting dev server...') |
||||
devMiddleware.waitUntilValid(() => { |
||||
console.log('> Listening at ' + uri + '\n') |
||||
// when env is testing, don't need open it
|
||||
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { |
||||
opn(uri) |
||||
} |
||||
_resolve() |
||||
}) |
||||
|
||||
var server = app.listen(port) |
||||
|
||||
module.exports = { |
||||
ready: readyPromise, |
||||
close: () => { |
||||
server.close() |
||||
} |
||||
} |
@ -1,9 +0,0 @@ |
||||
var fs = require('fs') |
||||
var UglifyJS = require('uglify-es') |
||||
|
||||
module.exports = function(filePath) { |
||||
var code = fs.readFileSync(filePath, 'utf-8') |
||||
var result = UglifyJS.minify(code) |
||||
if (result.error) return '' |
||||
return result.code |
||||
} |
@ -1,17 +0,0 @@ |
||||
// This service worker file is effectively a 'no-op' that will reset any
|
||||
// previous service worker registered for the same host:port combination.
|
||||
// In the production build, this file is replaced with an actual service worker
|
||||
// file that will precache your site's local assets.
|
||||
// See https://github.com/facebookincubator/create-react-app/issues/2272#issuecomment-302832432
|
||||
|
||||
self.addEventListener('install', () => self.skipWaiting()); |
||||
|
||||
self.addEventListener('activate', () => { |
||||
self.clients.matchAll({ type: 'window' }).then(windowClients => { |
||||
for (let windowClient of windowClients) { |
||||
// Force open pages to refresh, so that they have a chance to load the
|
||||
// fresh navigation response from the local dev server.
|
||||
windowClient.navigate(windowClient.url); |
||||
} |
||||
}); |
||||
}); |
@ -1,55 +0,0 @@ |
||||
(function() { |
||||
'use strict'; |
||||
|
||||
// Check to make sure service workers are supported in the current browser,
|
||||
// and that the current page is accessed from a secure origin. Using a
|
||||
// service worker from an insecure origin will trigger JS console errors.
|
||||
const isLocalhost = Boolean(window.location.hostname === 'localhost' || |
||||
// [::1] is the IPv6 localhost address.
|
||||
window.location.hostname === '[::1]' || |
||||
// 127.0.0.1/8 is considered localhost for IPv4.
|
||||
window.location.hostname.match( |
||||
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ |
||||
) |
||||
); |
||||
|
||||
window.addEventListener('load', function() { |
||||
if ('serviceWorker' in navigator && |
||||
(window.location.protocol === 'https:' || isLocalhost)) { |
||||
navigator.serviceWorker.register('service-worker.js') |
||||
.then(function(registration) { |
||||
// updatefound is fired if service-worker.js changes.
|
||||
registration.onupdatefound = function() { |
||||
// updatefound is also fired the very first time the SW is installed,
|
||||
// and there's no need to prompt for a reload at that point.
|
||||
// So check here to see if the page is already controlled,
|
||||
// i.e. whether there's an existing service worker.
|
||||
if (navigator.serviceWorker.controller) { |
||||
// The updatefound event implies that registration.installing is set
|
||||
const installingWorker = registration.installing; |
||||
|
||||
installingWorker.onstatechange = function() { |
||||
switch (installingWorker.state) { |
||||
case 'installed': |
||||
// At this point, the old content will have been purged and the
|
||||
// fresh content will have been added to the cache.
|
||||
// It's the perfect time to display a "New content is
|
||||
// available; please refresh." message in the page's interface.
|
||||
break; |
||||
|
||||
case 'redundant': |
||||
throw new Error('The installing ' + |
||||
'service worker became redundant.'); |
||||
|
||||
default: |
||||
// Ignore
|
||||
} |
||||
}; |
||||
} |
||||
}; |
||||
}).catch(function(e) { |
||||
console.error('Error during service worker registration:', e); |
||||
}); |
||||
} |
||||
}); |
||||
})(); |
@ -1,71 +0,0 @@ |
||||
var path = require('path') |
||||
var config = require('../config') |
||||
var ExtractTextPlugin = require('extract-text-webpack-plugin') |
||||
|
||||
exports.assetsPath = function (_path) { |
||||
var assetsSubDirectory = process.env.NODE_ENV === 'production' |
||||
? config.build.assetsSubDirectory |
||||
: config.dev.assetsSubDirectory |
||||
return path.posix.join(assetsSubDirectory, _path) |
||||
} |
||||
|
||||
exports.cssLoaders = function (options) { |
||||
options = options || {} |
||||
|
||||
var cssLoader = { |
||||
loader: 'css-loader', |
||||
options: { |
||||
minimize: process.env.NODE_ENV === 'production', |
||||
sourceMap: options.sourceMap |
||||
} |
||||
} |
||||
|
||||
// generate loader string to be used with extract text plugin
|
||||
function generateLoaders (loader, loaderOptions) { |
||||
var loaders = [cssLoader] |
||||
if (loader) { |
||||
loaders.push({ |
||||
loader: loader + '-loader', |
||||
options: Object.assign({}, loaderOptions, { |
||||
sourceMap: options.sourceMap |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
// Extract CSS when that option is specified
|
||||
// (which is the case during production build)
|
||||
if (options.extract) { |
||||
return ExtractTextPlugin.extract({ |
||||
use: loaders, |
||||
fallback: 'vue-style-loader' |
||||
}) |
||||
} else { |
||||
return ['vue-style-loader'].concat(loaders) |
||||
} |
||||
} |
||||
|
||||
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||
return { |
||||
css: generateLoaders(), |
||||
postcss: generateLoaders(), |
||||
less: generateLoaders('less'), |
||||
sass: generateLoaders('sass', { indentedSyntax: true }), |
||||
scss: generateLoaders('sass'), |
||||
stylus: generateLoaders('stylus'), |
||||
styl: generateLoaders('stylus') |
||||
} |
||||
} |
||||
|
||||
// Generate loaders for standalone style files (outside of .vue)
|
||||
exports.styleLoaders = function (options) { |
||||
var output = [] |
||||
var loaders = exports.cssLoaders(options) |
||||
for (var extension in loaders) { |
||||
var loader = loaders[extension] |
||||
output.push({ |
||||
test: new RegExp('\\.' + extension + '$'), |
||||
use: loader |
||||
}) |
||||
} |
||||
return output |
||||
} |
@ -1,12 +0,0 @@ |
||||
var utils = require('./utils') |
||||
var config = require('../config') |
||||
var isProduction = process.env.NODE_ENV === 'production' |
||||
|
||||
module.exports = { |
||||
loaders: utils.cssLoaders({ |
||||
sourceMap: isProduction |
||||
? config.build.productionSourceMap |
||||
: config.dev.cssSourceMap, |
||||
extract: isProduction |
||||
}) |
||||
} |
@ -1,74 +0,0 @@ |
||||
var path = require('path') |
||||
var utils = require('./utils') |
||||
var config = require('../config') |
||||
var vueLoaderConfig = require('./vue-loader.conf') |
||||
|
||||
function resolve (dir) { |
||||
return path.join(__dirname, '..', dir) |
||||
} |
||||
|
||||
module.exports = { |
||||
entry: { |
||||
app: './src/main.js' |
||||
}, |
||||
output: { |
||||
path: config.build.assetsRoot, |
||||
filename: '[name].js', |
||||
publicPath: process.env.NODE_ENV === 'production' |
||||
? config.build.assetsPublicPath |
||||
: config.dev.assetsPublicPath |
||||
}, |
||||
resolve: { |
||||
extensions: ['.js', '.vue', '.json'], |
||||
alias: { |
||||
'vue$': 'vue/dist/vue.esm.js', |
||||
'@': resolve('src'), |
||||
'#': resolve(''), |
||||
'styles': resolve('src/styles'), |
||||
'node_modules': resolve('node_modules') |
||||
} |
||||
}, |
||||
module: { |
||||
rules: [ |
||||
{ |
||||
test: /\.(js|vue)$/, |
||||
loader: 'eslint-loader', |
||||
enforce: 'pre', |
||||
include: [resolve('src'), resolve('test')], |
||||
options: { |
||||
formatter: require('eslint-friendly-formatter') |
||||
} |
||||
}, |
||||
{ |
||||
test: /\.vue$/, |
||||
loader: 'vue-loader', |
||||
options: vueLoaderConfig |
||||
}, |
||||
{ |
||||
test: /\.js$/, |
||||
loader: 'babel-loader', |
||||
include: [resolve('src'), resolve('test')] |
||||
}, |
||||
{ |
||||
test: /\.json$/, |
||||
loader: 'json-loader' |
||||
}, |
||||
{ |
||||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, |
||||
loader: 'url-loader', |
||||
options: { |
||||
limit: 10000, |
||||
name: utils.assetsPath('img/[name].[hash:7].[ext]') |
||||
} |
||||
}, |
||||
{ |
||||
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, |
||||
loader: 'url-loader', |
||||
options: { |
||||
limit: 10000, |
||||
name: utils.assetsPath('fonts/[name].[hash:7].[ext]') |
||||
} |
||||
} |
||||
] |
||||
} |
||||
} |
@ -1,43 +0,0 @@ |
||||
var fs = require('fs') |
||||
var path = require('path') |
||||
var utils = require('./utils') |
||||
var webpack = require('webpack') |
||||
var config = require('../config') |
||||
var merge = require('webpack-merge') |
||||
var baseWebpackConfig = require('./webpack.base.conf') |
||||
var HtmlWebpackPlugin = require('html-webpack-plugin') |
||||
var StylelintPlugin = require('stylelint-webpack-plugin') |
||||
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') |
||||
|
||||
// add hot-reload related code to entry chunks
|
||||
Object.keys(baseWebpackConfig.entry).forEach(function (name) { |
||||
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) |
||||
}) |
||||
|
||||
module.exports = merge(baseWebpackConfig, { |
||||
module: { |
||||
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) |
||||
}, |
||||
// cheap-module-eval-source-map is faster for development
|
||||
devtool: '#cheap-module-eval-source-map', |
||||
plugins: [ |
||||
new webpack.DefinePlugin({ |
||||
'process.env': config.dev.env |
||||
}), |
||||
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
|
||||
new webpack.HotModuleReplacementPlugin(), |
||||
new webpack.NoEmitOnErrorsPlugin(), |
||||
// https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({ |
||||
filename: 'index.html', |
||||
template: 'index.html', |
||||
inject: true, |
||||
serviceWorkerLoader: `<script>${fs.readFileSync(path.join(__dirname, |
||||
'./service-worker-dev.js'), 'utf-8')}</script>` |
||||
}), |
||||
new StylelintPlugin({ |
||||
files: ['**/*.vue'] |
||||
}), |
||||
new FriendlyErrorsPlugin() |
||||
] |
||||
}) |
@ -1,137 +0,0 @@ |
||||
var fs = require('fs') |
||||
var path = require('path') |
||||
var utils = require('./utils') |
||||
var webpack = require('webpack') |
||||
var config = require('../config') |
||||
var merge = require('webpack-merge') |
||||
var baseWebpackConfig = require('./webpack.base.conf') |
||||
var CopyWebpackPlugin = require('copy-webpack-plugin') |
||||
var HtmlWebpackPlugin = require('html-webpack-plugin') |
||||
var ExtractTextPlugin = require('extract-text-webpack-plugin') |
||||
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') |
||||
var SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin') |
||||
var loadMinified = require('./load-minified') |
||||
|
||||
var env = process.env.NODE_ENV === 'testing' |
||||
? require('../config/test.env') |
||||
: config.build.env |
||||
|
||||
var webpackConfig = merge(baseWebpackConfig, { |
||||
module: { |
||||
rules: utils.styleLoaders({ |
||||
sourceMap: config.build.productionSourceMap, |
||||
extract: true |
||||
}) |
||||
}, |
||||
devtool: config.build.productionSourceMap ? '#source-map' : false, |
||||
output: { |
||||
path: config.build.assetsRoot, |
||||
filename: utils.assetsPath('js/[name].[chunkhash].js'), |
||||
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') |
||||
}, |
||||
plugins: [ |
||||
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||
new webpack.DefinePlugin({ |
||||
'process.env': env |
||||
}), |
||||
new webpack.optimize.UglifyJsPlugin({ |
||||
compress: { |
||||
warnings: false |
||||
}, |
||||
sourceMap: true |
||||
}), |
||||
// extract css into its own file
|
||||
new ExtractTextPlugin({ |
||||
filename: utils.assetsPath('css/[name].[contenthash].css') |
||||
}), |
||||
// Compress extracted CSS. We are using this plugin so that possible
|
||||
// duplicated CSS from different components can be deduped.
|
||||
new OptimizeCSSPlugin({ |
||||
cssProcessorOptions: { |
||||
safe: true |
||||
} |
||||
}), |
||||
// generate dist index.html with correct asset hash for caching.
|
||||
// you can customize output by editing /index.html
|
||||
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({ |
||||
filename: process.env.NODE_ENV === 'testing' |
||||
? 'index.html' |
||||
: config.build.index, |
||||
template: 'index.html', |
||||
inject: true, |
||||
minify: { |
||||
removeComments: true, |
||||
collapseWhitespace: true, |
||||
removeAttributeQuotes: true |
||||
// more options:
|
||||
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||
}, |
||||
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||
chunksSortMode: 'dependency', |
||||
serviceWorkerLoader: `<script>${loadMinified(path.join(__dirname, |
||||
'./service-worker-prod.js'))}</script>` |
||||
}), |
||||
// split vendor js into its own file
|
||||
new webpack.optimize.CommonsChunkPlugin({ |
||||
name: 'vendor', |
||||
minChunks: function (module, count) { |
||||
// any required modules inside node_modules are extracted to vendor
|
||||
return ( |
||||
module.resource && |
||||
/\.js$/.test(module.resource) && |
||||
module.resource.indexOf( |
||||
path.join(__dirname, '../node_modules') |
||||
) === 0 |
||||
) |
||||
} |
||||
}), |
||||
// extract webpack runtime and module manifest to its own file in order to
|
||||
// prevent vendor hash from being updated whenever app bundle is updated
|
||||
new webpack.optimize.CommonsChunkPlugin({ |
||||
name: 'manifest', |
||||
chunks: ['vendor'] |
||||
}), |
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([ |
||||
{ |
||||
from: path.resolve(__dirname, '../static'), |
||||
to: config.build.assetsSubDirectory, |
||||
ignore: ['.*'] |
||||
} |
||||
]), |
||||
// service worker caching
|
||||
new SWPrecacheWebpackPlugin({ |
||||
cacheId: 'my-vue-app', |
||||
filename: 'service-worker.js', |
||||
staticFileGlobs: ['dist/**/*.{js,html,css}'], |
||||
minify: true, |
||||
stripPrefix: 'dist/' |
||||
}) |
||||
] |
||||
}) |
||||
|
||||
if (config.build.productionGzip) { |
||||
var CompressionWebpackPlugin = require('compression-webpack-plugin') |
||||
|
||||
webpackConfig.plugins.push( |
||||
new CompressionWebpackPlugin({ |
||||
asset: '[path].gz[query]', |
||||
algorithm: 'gzip', |
||||
test: new RegExp( |
||||
'\\.(' + |
||||
config.build.productionGzipExtensions.join('|') + |
||||
')$' |
||||
), |
||||
threshold: 10240, |
||||
minRatio: 0.8 |
||||
}) |
||||
) |
||||
} |
||||
|
||||
if (config.build.bundleAnalyzerReport) { |
||||
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin |
||||
webpackConfig.plugins.push(new BundleAnalyzerPlugin()) |
||||
} |
||||
|
||||
module.exports = webpackConfig |
@ -1,31 +0,0 @@ |
||||
// This is the webpack config used for unit tests.
|
||||
|
||||
var utils = require('./utils') |
||||
var webpack = require('webpack') |
||||
var merge = require('webpack-merge') |
||||
var baseConfig = require('./webpack.base.conf') |
||||
|
||||
var webpackConfig = merge(baseConfig, { |
||||
// use inline sourcemap for karma-sourcemap-loader
|
||||
module: { |
||||
rules: utils.styleLoaders() |
||||
}, |
||||
devtool: '#inline-source-map', |
||||
resolveLoader: { |
||||
alias: { |
||||
// necessary to to make lang="scss" work in test when using vue-loader's ?inject option
|
||||
// see discussion at https://github.com/vuejs/vue-loader/issues/724
|
||||
'scss-loader': 'sass-loader' |
||||
} |
||||
}, |
||||
plugins: [ |
||||
new webpack.DefinePlugin({ |
||||
'process.env': require('../config/test.env') |
||||
}) |
||||
] |
||||
}) |
||||
|
||||
// no need for app entry during tests
|
||||
delete webpackConfig.entry |
||||
|
||||
module.exports = webpackConfig |
@ -1,6 +0,0 @@ |
||||
var merge = require('webpack-merge') |
||||
var prodEnv = require('./prod.env') |
||||
|
||||
module.exports = merge(prodEnv, { |
||||
NODE_ENV: '"development"' |
||||
}) |
@ -1,38 +0,0 @@ |
||||
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||
var path = require('path') |
||||
|
||||
module.exports = { |
||||
build: { |
||||
env: require('./prod.env'), |
||||
index: path.resolve(__dirname, '../dist/index.html'), |
||||
assetsRoot: path.resolve(__dirname, '../dist'), |
||||
assetsSubDirectory: 'static', |
||||
assetsPublicPath: '/', |
||||
productionSourceMap: true, |
||||
// 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 |
||||
}, |
||||
dev: { |
||||
env: require('./dev.env'), |
||||
port: 8080, |
||||
autoOpenBrowser: true, |
||||
assetsSubDirectory: 'static', |
||||
assetsPublicPath: '/', |
||||
proxyTable: {}, |
||||
// CSS Sourcemaps off by default because relative paths are "buggy"
|
||||
// with this option, according to the CSS-Loader README
|
||||
// (https://github.com/webpack/css-loader#sourcemaps)
|
||||
// In our experience, they generally work as expected,
|
||||
// just be aware of this issue when enabling this option.
|
||||
cssSourceMap: false |
||||
} |
||||
} |
@ -1,3 +0,0 @@ |
||||
module.exports = { |
||||
NODE_ENV: '"production"' |
||||
} |
@ -1,6 +0,0 @@ |
||||
var merge = require('webpack-merge') |
||||
var devEnv = require('./dev.env') |
||||
|
||||
module.exports = merge(devEnv, { |
||||
NODE_ENV: '"testing"' |
||||
}) |
@ -0,0 +1,26 @@ |
||||
module.exports = { |
||||
moduleFileExtensions: [ |
||||
'js', |
||||
'jsx', |
||||
'json', |
||||
'vue' |
||||
], |
||||
transform: { |
||||
'^.+\\.vue$': 'vue-jest', |
||||
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', |
||||
'^.+\\.jsx?$': 'babel-jest' |
||||
}, |
||||
transformIgnorePatterns: [ |
||||
'/node_modules/' |
||||
], |
||||
moduleNameMapper: { |
||||
'^@/(.*)$': '<rootDir>/src/$1' |
||||
}, |
||||
snapshotSerializers: [ |
||||
'jest-serializer-vue' |
||||
], |
||||
testMatch: [ |
||||
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' |
||||
], |
||||
testURL: 'http://localhost/' |
||||
} |
@ -1,120 +1,56 @@ |
||||
{ |
||||
"name": "EUROMAT", |
||||
"version": "1.0.0", |
||||
"description": "A progressive web application Euro-Mat for the upcoming German election", |
||||
"author": "Moritz Kröger <write@morkro.de>", |
||||
"name": "euromat", |
||||
"version": "0.1.0", |
||||
"private": true, |
||||
"scripts": { |
||||
"precommit": "lint-staged", |
||||
"dev": "npm run svg && node build/dev-server.js", |
||||
"start": "npm run svg && node build/dev-server.js", |
||||
"build": "npm run svg && node build/build.js", |
||||
"svg": "vsvg -s ./src/assets/svg -t ./src/assets/icons", |
||||
"unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", |
||||
"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", |
||||
"css": "stylelint '**/*.vue' --syntax scss" |
||||
}, |
||||
"lint-staged": { |
||||
"src/**/*.vue": [ |
||||
"npm run css", |
||||
"git add" |
||||
] |
||||
"serve": "vue-cli-service serve", |
||||
"build": "vue-cli-service build", |
||||
"lint": "vue-cli-service lint", |
||||
"test:unit": "vue-cli-service test:unit", |
||||
"svg": "vsvg -s ./src/assets/svg -t ./src/assets/icons" |
||||
}, |
||||
"dependencies": { |
||||
"husky": "^0.14.3", |
||||
"lint-staged": "^4.0.3", |
||||
"stylelint": "^8.0.0", |
||||
"stylelint-config-standard": "^17.0.0", |
||||
"husky": "^1.3.1", |
||||
"lint-staged": "^8.1.5", |
||||
"register-service-worker": "^1.6.2", |
||||
"stylelint": "^9.10.1", |
||||
"stylelint-config-standard": "^18.2.0", |
||||
"stylelint-processor-html": "^1.0.0", |
||||
"stylelint-webpack-plugin": "^0.9.0", |
||||
"vue": "^2.3.3", |
||||
"stylelint-webpack-plugin": "^0.10.5", |
||||
"vue": "^2.6.6", |
||||
"vue-feather-icon": "^1.2.0", |
||||
"vue-i18n": "^7.1.1", |
||||
"vue-router": "^2.3.1", |
||||
"vue-svgicon": "^1.2.4", |
||||
"vuex": "^2.3.1" |
||||
"vue-i18n": "^8.9.0", |
||||
"vue-router": "^3.0.1", |
||||
"vue-svgicon": "^3.2.4", |
||||
"vuex": "^3.0.1" |
||||
}, |
||||
"devDependencies": { |
||||
"autoprefixer": "^7.1.2", |
||||
"babel-core": "^6.22.1", |
||||
"babel-eslint": "^7.1.1", |
||||
"babel-loader": "^7.1.1", |
||||
"babel-plugin-istanbul": "^4.1.1", |
||||
"babel-plugin-transform-runtime": "^6.22.0", |
||||
"babel-preset-env": "^1.3.2", |
||||
"babel-preset-stage-2": "^6.22.0", |
||||
"babel-register": "^6.22.0", |
||||
"chai": "^3.5.0", |
||||
"chalk": "^2.0.1", |
||||
"chromedriver": "^2.27.2", |
||||
"connect-history-api-fallback": "^1.3.0", |
||||
"copy-webpack-plugin": "^4.0.1", |
||||
"cross-env": "^5.0.1", |
||||
"cross-spawn": "^5.0.1", |
||||
"css-loader": "^0.28.0", |
||||
"cssnano": "^3.10.0", |
||||
"eslint": "^3.19.0", |
||||
"eslint-config-standard": "^6.2.1", |
||||
"eslint-friendly-formatter": "^3.0.0", |
||||
"eslint-loader": "^1.7.1", |
||||
"eslint-plugin-html": "^3.1.0", |
||||
"eslint-plugin-promise": "^3.4.0", |
||||
"eslint-plugin-standard": "^2.0.1", |
||||
"eventsource-polyfill": "^0.9.6", |
||||
"express": "^4.14.1", |
||||
"extract-text-webpack-plugin": "^2.0.0", |
||||
"file-loader": "^0.11.1", |
||||
"friendly-errors-webpack-plugin": "^1.1.3", |
||||
"html-webpack-plugin": "^2.28.0", |
||||
"http-proxy-middleware": "^0.17.3", |
||||
"inject-loader": "^3.0.0", |
||||
"json-loader": "^0.5.7", |
||||
"karma": "^1.4.1", |
||||
"karma-coverage": "^1.1.1", |
||||
"karma-mocha": "^1.3.0", |
||||
"karma-phantomjs-launcher": "^1.0.2", |
||||
"karma-phantomjs-shim": "^1.4.0", |
||||
"karma-sinon-chai": "^1.3.1", |
||||
"karma-sourcemap-loader": "^0.3.7", |
||||
"karma-spec-reporter": "0.0.31", |
||||
"karma-webpack": "^2.0.2", |
||||
"lolex": "^2.0.0", |
||||
"mocha": "^3.2.0", |
||||
"nightwatch": "^0.9.12", |
||||
"node-sass": "^4.5.3", |
||||
"normalize.css": "^7.0.0", |
||||
"opn": "^5.1.0", |
||||
"optimize-css-assets-webpack-plugin": "^2.0.0", |
||||
"ora": "^1.2.0", |
||||
"phantomjs-prebuilt": "^2.1.14", |
||||
"rimraf": "^2.6.0", |
||||
"sass-loader": "^6.0.6", |
||||
"selenium-server": "^3.0.1", |
||||
"semver": "^5.3.0", |
||||
"shelljs": "^0.7.6", |
||||
"sinon": "^2.1.0", |
||||
"sinon-chai": "^2.8.0", |
||||
"sw-precache-webpack-plugin": "^0.11.4", |
||||
"uglify-es": "^3.0.25", |
||||
"url-loader": "^0.5.8", |
||||
"vue-loader": "^12.1.0", |
||||
"vue-style-loader": "^3.0.1", |
||||
"vue-template-compiler": "^2.3.3", |
||||
"webpack": "^2.6.1", |
||||
"webpack-bundle-analyzer": "^2.2.1", |
||||
"webpack-dev-middleware": "^1.10.0", |
||||
"webpack-hot-middleware": "^2.18.0", |
||||
"webpack-merge": "^4.1.0" |
||||
"@vue/cli-plugin-babel": "^3.5.0", |
||||
"@vue/cli-plugin-eslint": "^3.5.0", |
||||
"@vue/cli-plugin-pwa": "^3.5.0", |
||||
"@vue/cli-plugin-unit-jest": "^3.5.0", |
||||
"@vue/cli-service": "^3.5.0", |
||||
"@vue/eslint-config-standard": "^4.0.0", |
||||
"@vue/test-utils": "1.0.0-beta.29", |
||||
"babel-core": "7.0.0-bridge.0", |
||||
"babel-eslint": "^10.0.1", |
||||
"babel-jest": "^23.6.0", |
||||
"eslint": "^5.8.0", |
||||
"eslint-plugin-vue": "^5.0.0", |
||||
"node-sass": "^4.11.0", |
||||
"normalize.css": "^8.0.1", |
||||
"sass-loader": "^7.1.0", |
||||
"vue-template-compiler": "^2.5.21" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 4.0.0", |
||||
"npm": ">= 3.0.0" |
||||
"husky": { |
||||
"hooks": { |
||||
"pre-commit": "lint-staged" |
||||
} |
||||
}, |
||||
"browserslist": [ |
||||
"> 1%", |
||||
"last 2 versions", |
||||
"not ie <= 8" |
||||
] |
||||
"lint-staged": { |
||||
"src/**/*.vue": [ |
||||
"npm run css", |
||||
"git add" |
||||
] |
||||
} |
||||
} |
||||
|
@ -0,0 +1,5 @@ |
||||
module.exports = { |
||||
plugins: { |
||||
autoprefixer: {} |
||||
} |
||||
} |
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 288 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 523 B After Width: | Height: | Size: 523 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
@ -0,0 +1,2 @@ |
||||
User-agent: * |
||||
Disallow: |