parent
fb16c494f3
commit
7e62c42e00
58 changed files with 13976 additions and 1 deletions
@ -0,0 +1,18 @@ |
||||
{ |
||||
"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,9 @@ |
||||
root = true |
||||
|
||||
[*] |
||||
charset = utf-8 |
||||
indent_style = space |
||||
indent_size = 2 |
||||
end_of_line = lf |
||||
insert_final_newline = true |
||||
trim_trailing_whitespace = true |
@ -0,0 +1,2 @@ |
||||
build/*.js |
||||
config/*.js |
@ -0,0 +1,27 @@ |
||||
// http://eslint.org/docs/user-guide/configuring
|
||||
|
||||
module.exports = { |
||||
root: true, |
||||
parser: 'babel-eslint', |
||||
parserOptions: { |
||||
sourceType: 'module' |
||||
}, |
||||
env: { |
||||
browser: 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 |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
.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 |
||||
*.suo |
||||
*.ntvs* |
||||
*.njsproj |
||||
*.sln |
@ -0,0 +1,8 @@ |
||||
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||
|
||||
module.exports = { |
||||
"plugins": { |
||||
// to edit target browsers: use "browserlist" field in package.json
|
||||
"autoprefixer": {} |
||||
} |
||||
} |
@ -1 +1,30 @@ |
||||
# eur-o-mat |
||||
# eur-o-mat |
||||
|
||||
> A progressive web application Euro-Mat for the upcoming German election |
||||
|
||||
## 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 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). |
||||
|
@ -0,0 +1,35 @@ |
||||
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' |
||||
)) |
||||
}) |
||||
}) |
@ -0,0 +1,48 @@ |
||||
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) |
||||
} |
||||
} |
@ -0,0 +1,9 @@ |
||||
/* 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() |
||||
} |
||||
}) |
@ -0,0 +1,91 @@ |
||||
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() |
||||
} |
||||
} |
@ -0,0 +1,9 @@ |
||||
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 |
||||
} |
@ -0,0 +1,17 @@ |
||||
// 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); |
||||
} |
||||
}); |
||||
}); |
@ -0,0 +1,55 @@ |
||||
(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); |
||||
}); |
||||
} |
||||
}); |
||||
})(); |
@ -0,0 +1,71 @@ |
||||
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 |
||||
} |
@ -0,0 +1,12 @@ |
||||
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 |
||||
}) |
||||
} |
@ -0,0 +1,67 @@ |
||||
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') |
||||
} |
||||
}, |
||||
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: /\.(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]') |
||||
} |
||||
} |
||||
] |
||||
} |
||||
} |
@ -0,0 +1,39 @@ |
||||
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 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 FriendlyErrorsPlugin() |
||||
] |
||||
}) |
@ -0,0 +1,137 @@ |
||||
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 |
@ -0,0 +1,31 @@ |
||||
// 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 |
@ -0,0 +1,6 @@ |
||||
var merge = require('webpack-merge') |
||||
var prodEnv = require('./prod.env') |
||||
|
||||
module.exports = merge(prodEnv, { |
||||
NODE_ENV: '"development"' |
||||
}) |
@ -0,0 +1,38 @@ |
||||
// 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 |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
module.exports = { |
||||
NODE_ENV: '"production"' |
||||
} |
@ -0,0 +1,6 @@ |
||||
var merge = require('webpack-merge') |
||||
var devEnv = require('./dev.env') |
||||
|
||||
module.exports = merge(devEnv, { |
||||
NODE_ENV: '"testing"' |
||||
}) |
@ -0,0 +1,37 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
<title>eur-o-mat</title> |
||||
<link rel="icon" type="image/png" sizes="32x32" href="/static/img/icons/favicon-32x32.png"> |
||||
<link rel="icon" type="image/png" sizes="16x16" href="/static/img/icons/favicon-16x16.png"> |
||||
<!--[if IE]><link rel="shortcut icon" href="/static/img/icons/favicon.ico"><![endif]--> |
||||
<!-- Add to home screen for Android and modern mobile browsers --> |
||||
<link rel="manifest" href="/static/manifest.json"> |
||||
<meta name="theme-color" content="#4DBA87"> |
||||
|
||||
<!-- Add to home screen for Safari on iOS --> |
||||
<meta name="apple-mobile-web-app-capable" content="yes"> |
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
||||
<meta name="apple-mobile-web-app-title" content="eur-o-mat"> |
||||
<link rel="apple-touch-icon" href="/static/img/icons/apple-touch-icon-152x152.png"> |
||||
<!-- Add to home screen for Windows --> |
||||
<meta name="msapplication-TileImage" content="/static/img/icons/msapplication-icon-144x144.png"> |
||||
<meta name="msapplication-TileColor" content="#000000"> |
||||
<% for (var chunk of webpack.chunks) { |
||||
for (var file of chunk.files) { |
||||
if (file.match(/\.(js|css)$/)) { %> |
||||
<link rel="<%= chunk.initial?'preload':'prefetch' %>" href="<%= htmlWebpackPlugin.files.publicPath + file %>" as="<%= file.match(/\.css$/)?'style':'script' %>"><% }}} %> |
||||
</head> |
||||
<body> |
||||
<noscript> |
||||
This is your fallback content in case JavaScript fails to load. |
||||
</noscript> |
||||
<div id="app"></div> |
||||
<!-- Todo: only include in production --> |
||||
<%= htmlWebpackPlugin.options.serviceWorkerLoader %> |
||||
<!-- built files will be auto injected --> |
||||
</body> |
||||
</html> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,97 @@ |
||||
{ |
||||
"name": "eur-o-mat", |
||||
"version": "1.0.0", |
||||
"description": "A progressive web application Euro-Mat for the upcoming German election", |
||||
"author": "Moritz Kröger <write@morkro.de>", |
||||
"private": true, |
||||
"scripts": { |
||||
"dev": "node build/dev-server.js", |
||||
"start": "node build/dev-server.js", |
||||
"build": "node build/build.js", |
||||
"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" |
||||
}, |
||||
"dependencies": { |
||||
"vue": "^2.3.3", |
||||
"vue-router": "^2.3.1" |
||||
}, |
||||
"devDependencies": { |
||||
"autoprefixer": "^7.1.2", |
||||
"babel-core": "^6.22.1", |
||||
"sw-precache-webpack-plugin": "^0.11.4", |
||||
"babel-eslint": "^7.1.1", |
||||
"babel-loader": "^7.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", |
||||
"chalk": "^2.0.1", |
||||
"connect-history-api-fallback": "^1.3.0", |
||||
"copy-webpack-plugin": "^4.0.1", |
||||
"css-loader": "^0.28.0", |
||||
"cssnano": "^3.10.0", |
||||
"eslint": "^3.19.0", |
||||
"eslint-friendly-formatter": "^3.0.0", |
||||
"eslint-loader": "^1.7.1", |
||||
"eslint-plugin-html": "^3.1.0", |
||||
"eslint-config-standard": "^6.2.1", |
||||
"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", |
||||
"webpack-bundle-analyzer": "^2.2.1", |
||||
"cross-env": "^5.0.1", |
||||
"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", |
||||
"chai": "^3.5.0", |
||||
"sinon": "^2.1.0", |
||||
"sinon-chai": "^2.8.0", |
||||
"inject-loader": "^3.0.0", |
||||
"babel-plugin-istanbul": "^4.1.1", |
||||
"phantomjs-prebuilt": "^2.1.14", |
||||
"chromedriver": "^2.27.2", |
||||
"cross-spawn": "^5.0.1", |
||||
"nightwatch": "^0.9.12", |
||||
"selenium-server": "^3.0.1", |
||||
"semver": "^5.3.0", |
||||
"shelljs": "^0.7.6", |
||||
"opn": "^5.1.0", |
||||
"optimize-css-assets-webpack-plugin": "^2.0.0", |
||||
"ora": "^1.2.0", |
||||
"rimraf": "^2.6.0", |
||||
"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-dev-middleware": "^1.10.0", |
||||
"webpack-hot-middleware": "^2.18.0", |
||||
"webpack-merge": "^4.1.0", |
||||
"uglify-es": "^3.0.25" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 4.0.0", |
||||
"npm": ">= 3.0.0" |
||||
}, |
||||
"browserslist": [ |
||||
"> 1%", |
||||
"last 2 versions", |
||||
"not ie <= 8" |
||||
] |
||||
} |
@ -0,0 +1,54 @@ |
||||
<template> |
||||
<div id="app"> |
||||
<header> |
||||
<span>Vue.js PWA</span> |
||||
</header> |
||||
<main> |
||||
<img src="./assets/logo.png" alt="Vue.js PWA"> |
||||
<router-view></router-view> |
||||
</main> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'app' |
||||
} |
||||
</script> |
||||
|
||||
<style> |
||||
body { |
||||
margin: 0; |
||||
} |
||||
|
||||
#app { |
||||
font-family: 'Avenir', Helvetica, Arial, sans-serif; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
color: #2c3e50; |
||||
} |
||||
|
||||
main { |
||||
text-align: center; |
||||
margin-top: 40px; |
||||
} |
||||
|
||||
header { |
||||
margin: 0; |
||||
height: 56px; |
||||
padding: 0 16px 0 24px; |
||||
background-color: #35495E; |
||||
color: #ffffff; |
||||
} |
||||
|
||||
header span { |
||||
display: block; |
||||
position: relative; |
||||
font-size: 20px; |
||||
line-height: 1; |
||||
letter-spacing: .02em; |
||||
font-weight: 400; |
||||
box-sizing: border-box; |
||||
padding-top: 16px; |
||||
} |
||||
</style> |
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,52 @@ |
||||
<template> |
||||
<div class="hello"> |
||||
<h1>{{ msg }}</h1> |
||||
<h2>Essential Links</h2> |
||||
<ul> |
||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li> |
||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li> |
||||
<li><a href="https://gitter.im/vuejs/vue" target="_blank" rel="noopener">Gitter Chat</a></li> |
||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li> |
||||
<li><a href="http://vuejs-templates.github.io/webpack/" target="_blank" rel="noopener">Docs for This Template</a></li> |
||||
</ul> |
||||
<h2>Ecosystem</h2> |
||||
<ul> |
||||
<li><a href="http://router.vuejs.org/" target="_blank" rel="noopener">vue-router</a></li> |
||||
<li><a href="http://vuex.vuejs.org/" target="_blank" rel="noopener">vuex</a></li> |
||||
<li><a href="http://vue-loader.vuejs.org/" target="_blank" rel="noopener">vue-loader</a></li> |
||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li> |
||||
</ul> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'hello', |
||||
data () { |
||||
return { |
||||
msg: 'Welcome to Your Vue.js PWA' |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
||||
<style> |
||||
h1, h2 { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
ul { |
||||
list-style-type: none; |
||||
padding: 0; |
||||
} |
||||
|
||||
li { |
||||
display: inline-block; |
||||
margin: 0 10px; |
||||
} |
||||
|
||||
a { |
||||
color: #35495E; |
||||
} |
||||
</style> |
@ -0,0 +1,265 @@ |
||||
const options = [ |
||||
{ |
||||
position: 'positive', |
||||
id: 0, |
||||
label: 'Ich stimme zu' |
||||
}, |
||||
{ |
||||
position: 'neutral', |
||||
id: 1, |
||||
label: 'Neutral' |
||||
}, |
||||
{ |
||||
position: 'negative', |
||||
id: 2, |
||||
label: 'Ich bin dagegen' |
||||
} |
||||
] |
||||
|
||||
const parties = [ |
||||
{ |
||||
name: 'Christlich Demokratische Union Deutschlands', |
||||
token: 'CDU', |
||||
id: 0 |
||||
}, |
||||
{ |
||||
name: 'Sozialdemokratische Partei Deutschlands', |
||||
token: 'SPD', |
||||
id: 1 |
||||
}, |
||||
{ |
||||
name: 'Die Linke', |
||||
token: 'LINKE', |
||||
id: 2 |
||||
}, |
||||
{ |
||||
name: 'Bündnis 90/Die Grünen', |
||||
token: 'GRÜNE', |
||||
id: 3 |
||||
}, |
||||
{ |
||||
name: 'Freie Demokratische Partei', |
||||
token: 'FDP', |
||||
id: 4 |
||||
}, |
||||
{ |
||||
name: 'Alternative für Deutschland', |
||||
token: 'AfD', |
||||
id: 5 |
||||
} |
||||
] |
||||
|
||||
const theses = [ |
||||
{ |
||||
id: 0, |
||||
thesis: |
||||
'Zur Stärkung des Euro sollte eine gemeinsame Wirtschaftspolitik für die Eurozone unter Leitung eines europäischen Ministers eingeführt werden.' |
||||
}, |
||||
{ |
||||
id: 1, |
||||
thesis: |
||||
'Die Abgeordneten des Europäischen Parlaments sollen nach einem einheitlichen Wahlrecht über transnationale Listen gewählt werden.' |
||||
}, |
||||
{ |
||||
id: 2, |
||||
thesis: |
||||
'Das Europäische Parlament sollte das Recht bekommen, eigene Gesetzesvorschläge zu machen.' |
||||
}, |
||||
{ |
||||
id: 3, |
||||
thesis: |
||||
'Änderungen an den europäischen Verträgen und andere grundlegenden Entscheidungen sollten in Zukunft über einen Volksentscheid auf europäischer Ebene beschlossen werden.' |
||||
}, |
||||
{ |
||||
id: 4, |
||||
thesis: |
||||
'Die Hürde für europäische Bürgerinitiativen soll von 1 Million auf 500.000 Unterschriften gesenkt werden.' |
||||
}, |
||||
{ |
||||
id: 5, |
||||
thesis: |
||||
'Einflussnahme auf europäische Gesetze soll durch ein Lobbyregister transparenter gemacht werden.' |
||||
}, |
||||
{ |
||||
id: 6, |
||||
thesis: |
||||
'Die Europäische Kommission sollte verkleinert werden und besser durch das Parlament kontrolliert werden.' |
||||
}, |
||||
{ |
||||
id: 7, |
||||
thesis: |
||||
'Es sollte in Deutschland ein Referendum über die EU-Mitgliedschaft geben.' |
||||
}, |
||||
{ |
||||
id: 8, |
||||
thesis: |
||||
'Im Sinne des Subsidiaritätsprinzips sollten nationale Parlamente ein stärkeres Mitspracherecht in der europäischen Gesetzgebung erhalten.' |
||||
}, |
||||
{ |
||||
id: 9, |
||||
thesis: |
||||
'Die EU hat zu viele Aufgaben übernommen, die besser von den nationalen Parlamenten geregelt werden sollten.' |
||||
}, |
||||
{ |
||||
id: 10, |
||||
thesis: |
||||
'Es sollte auch ausnahmsweise keine Grenzkontrollen im Schengen-Raum geben.' |
||||
}, |
||||
{ |
||||
id: 11, |
||||
thesis: |
||||
'Deutschland soll sich für die Einführung eines gemeinsamen Asyl-Systems mit Verteilungsschlüssel auf EU-Ebene einsetzen.' |
||||
}, |
||||
{ |
||||
id: 12, |
||||
thesis: |
||||
'Alle Mitgliedstaaten sollten einen größeren Beitrag zum Schutz der EU-Außengrenzen leisten und ein eigenständig wirksamer europäischer Grenzschutz ausgebaut werden.' |
||||
}, |
||||
{ |
||||
id: 13, |
||||
thesis: |
||||
'Es sollte ein gemeinsamer europäischer Geheimdienst zur effektiveren Terrorismusbekämpfung aufgebaut werden.' |
||||
}, |
||||
{ |
||||
id: 14, |
||||
thesis: |
||||
'Die EU soll sich gemeinsam gegen internationale Cyber-Angriffe und Fake News mit einer Spezialeinheit zur Wehr setzen.' |
||||
}, |
||||
{ id: 15, thesis: 'Die EU soll keine weiteren Flüchtlinge mehr aufnehmen.' }, |
||||
{ |
||||
id: 16, |
||||
thesis: |
||||
'Die EU sollte mehr Geld zur weltweiten Bekämpfung von Hunger und Armut und Fluchtursachen ausgeben.' |
||||
}, |
||||
{ |
||||
id: 17, |
||||
thesis: |
||||
'Es sollte in der EU mehr Abstimmung bei Rüstungsexporten in Drittländer geben.' |
||||
}, |
||||
{ |
||||
id: 18, |
||||
thesis: |
||||
'Deutschland soll sich für einen gemeinsamen EU-Sitz im UN-Sicherheitsrat einsetzen.' |
||||
}, |
||||
{ id: 19, thesis: 'Die EU soll keine neuen Mitgliedstaaten aufnehmen.' }, |
||||
{ |
||||
id: 20, |
||||
thesis: |
||||
'Langfristig sollten die EU-Mitgliedstaaten ihre Streitkräfte zu einer europäischen Armee vereinen.' |
||||
}, |
||||
{ |
||||
id: 21, |
||||
thesis: |
||||
'Die EU sollte auf globaler Ebene aktiver für ihre gemeinsamen Werte eintreten.' |
||||
}, |
||||
{ |
||||
id: 22, |
||||
thesis: |
||||
'Auf europäischer Ebene sollte eine CO2-Steuer eingeführt werden die zur Finanzierung des EU-Haushaltes beiträgt.' |
||||
}, |
||||
{ |
||||
id: 23, |
||||
thesis: |
||||
'Die Bundesregierung sollte sich für ein europaweites Mitspracherecht bei dem Bau neuer Atomkraftwerke einsetzen.' |
||||
}, |
||||
{ |
||||
id: 24, |
||||
thesis: |
||||
'Es sollte auf europäischer Ebene ein eigenes Förderprogramm für regenerative Energien geben.' |
||||
}, |
||||
{ |
||||
id: 25, |
||||
thesis: |
||||
'Die Bundesregierung sollte sich für ein europaweites Verbot von Fracking (Schiefergasbohrungen) einsetzen.' |
||||
}, |
||||
{ |
||||
id: 26, |
||||
thesis: |
||||
'Die EU sollte sich global für hohe Umwelt- und Sozialstandards und fairen Handel einsetzen.' |
||||
}, |
||||
{ |
||||
id: 27, |
||||
thesis: |
||||
'Die EU sollte mehr Geld in Bildung und Zukunftstechnologien und weniger in Agrarförderung investieren.' |
||||
}, |
||||
{ |
||||
id: 28, |
||||
thesis: 'Es sollten europaweit angemessene Mindestlöhne eingeführt werden.' |
||||
}, |
||||
{ |
||||
id: 29, |
||||
thesis: |
||||
'Es sollte europaweit einen einheitlichen Unternehmenssteuersatz geben und gegen Steuervermeidung durch international tätige Unternehmen sollte stärker vorgegangen werden.' |
||||
}, |
||||
{ |
||||
id: 30, |
||||
thesis: |
||||
'Freihandelsabkommen sollten allein durch das Europäische Parlament ratifiziert werden.' |
||||
}, |
||||
{ |
||||
id: 31, |
||||
thesis: |
||||
'Die EU soll zum Schutz vor unrechtmäßiger Konkurrenz einheimischer Produkte und Unternehmen verstärkt Zölle erheben.' |
||||
}, |
||||
{ |
||||
id: 32, |
||||
thesis: |
||||
'Die Staaten der Eurozone sollten gemeinsam Kredite aufnehmen können für die sie gemeinsam haften (Eurobonds).' |
||||
}, |
||||
{ |
||||
id: 33, |
||||
thesis: |
||||
'Die Nichteinhaltung europäischer Rechtsstandards sollte durch Kürzung von Fördermitteln sanktioniert werden.' |
||||
}, |
||||
{ |
||||
id: 34, |
||||
thesis: |
||||
'Es sollte eine gemeinsame Arbeitslosenversicherung auf europäischer Ebene geben.' |
||||
}, |
||||
{ |
||||
id: 35, |
||||
thesis: |
||||
'Auf europäischer Ebene sollte der Fokus auf Investitionen anstatt auf Schuldenabbau liegen.' |
||||
}, |
||||
{ |
||||
id: 36, |
||||
thesis: |
||||
'Die EU sollte verstärkt in Elektromobilität und ein engmaschiges Netz an Ladestationen in ganz Europa investieren.' |
||||
}, |
||||
{ |
||||
id: 37, |
||||
thesis: |
||||
'Es sollte ein Europakunde-Fach eingeführt werden welches in ganz Europa nach einem einheitlichen Lehrplan unterrichtet wird.' |
||||
}, |
||||
{ |
||||
id: 38, |
||||
thesis: |
||||
'Es sollte einen gesamteuropäischen Feiertag zur Einheit Europas geben.' |
||||
}, |
||||
{ |
||||
id: 39, |
||||
thesis: |
||||
'Die EU sollte weitere Barrieren für GründerInnen abbauen um ein attraktives Klima für innovative Start-Ups in Europa zu schaffen.' |
||||
}, |
||||
{ |
||||
id: 40, |
||||
thesis: |
||||
'Zur interkulturellen Verständigung sollte die EU allen 18-jährigen EuropäerInnen eine Interrailkarte finanzieren.' |
||||
}, |
||||
{ |
||||
id: 41, |
||||
thesis: |
||||
'Arbeitslose EU-Bürger sollten eine EU-finanzierte Starthilfe bekommen, wenn sie in einem anderen Land einen Job suchen bzw. annehmen wollen.' |
||||
}, |
||||
{ |
||||
id: 42, |
||||
thesis: |
||||
'Deutschland soll sich für eine rasche Umsetzung eines digitalen Binnenmarktes einsetzen, in dem Daten so frei verkehren können, wie es für Personen, Waren, Dienstleistungen und Kapital bereits der Fall ist.' |
||||
} |
||||
] |
||||
|
||||
export default { |
||||
options, |
||||
parties, |
||||
theses |
||||
} |
@ -0,0 +1,33 @@ |
||||
import isInteger from '@/utils/isInteger' |
||||
import { options, parties, theses } from './data' |
||||
|
||||
export const getOption = position => |
||||
options.find(o => o.position === position) |
||||
|
||||
export const getThesis = id => |
||||
theses.find(t => t.id === id).thesis |
||||
|
||||
export const getParty = token => { |
||||
const property = isInteger(token) ? 'id' : 'token' |
||||
return parties.find(p => p[property] === token) |
||||
} |
||||
|
||||
export const createThesisGroup = (thesis, parties = []) => ( |
||||
{ |
||||
thesis, |
||||
parties: parties.map(({ token, position }) => |
||||
Object.assign({}, getParty(token), { position })) |
||||
} |
||||
) |
||||
|
||||
export const getThesesTree = () => |
||||
[ |
||||
createThesisGroup(getThesis(0), [ |
||||
{ token: 'CDU', position: 'positive' }, |
||||
{ token: 'SPD', position: 'neutral' }, |
||||
{ token: 'GRÜNE', position: 'neutral' }, |
||||
{ token: 'LINKE', position: 'negative' }, |
||||
{ token: 'FDP', position: 'neutral' }, |
||||
{ token: 'AfD', position: 'neutral' } |
||||
]) |
||||
] |
@ -0,0 +1,15 @@ |
||||
// 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' |
||||
|
||||
Vue.config.productionTip = false |
||||
|
||||
/* eslint-disable no-new */ |
||||
new Vue({ |
||||
el: '#app', |
||||
router, |
||||
template: '<App/>', |
||||
components: { App } |
||||
}) |
@ -0,0 +1,15 @@ |
||||
import Vue |