diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100644 index 0000000..7d45e90 --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,84 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + 'root': true, + 'parserOptions': { + parser: 'babel-eslint', + ecmaVersion: 2018, + }, + 'env': { + browser: true, + }, + 'extends': [ + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + 'eslint:recommended', + ], + 'globals': { + axios: true, + L: true, + moment: true, + process: true, + Vue: true, + }, + // add your custom rules here + 'rules': { + 'array-bracket-newline': ['error', { multiline: true }], + 'array-bracket-spacing': ['error'], + 'arrow-body-style': ['error', 'as-needed'], + 'arrow-parens': ['error', 'as-needed'], + 'arrow-spacing': ['error', { before: true, after: true }], + 'block-spacing': ['error'], + 'brace-style': ['error', '1tbs'], + 'comma-dangle': ['error', 'always-multiline'], // Apply Contentflow rules + 'comma-spacing': ['error'], + 'comma-style': ['error', 'last'], + 'curly': ['error'], + 'dot-location': ['error', 'property'], + 'dot-notation': ['error'], + 'eol-last': ['error', 'always'], + 'eqeqeq': ['error', 'always', { 'null': 'ignore' }], + 'func-call-spacing': ['error', 'never'], + 'function-paren-newline': ['error', 'multiline'], + 'generator-star-spacing': ['off'], // allow async-await + 'implicit-arrow-linebreak': ['error'], + 'indent': ['error', 2], + 'key-spacing': ['error', { beforeColon: false, afterColon: true, mode: 'strict' }], + 'keyword-spacing': ['error'], + 'linebreak-style': ['error', 'unix'], + 'lines-between-class-members': ['error'], + 'multiline-comment-style': ['warn'], + 'newline-per-chained-call': ['error'], + 'no-console': ['off'], + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // allow debugger during development + 'no-else-return': ['error'], + 'no-extra-parens': ['error'], + 'no-implicit-coercion': ['error'], + 'no-lonely-if': ['error'], + 'no-multiple-empty-lines': ['warn', { max: 2, maxEOF: 0, maxBOF: 0 }], + 'no-multi-spaces': ['error'], + 'no-trailing-spaces': ['error'], + 'no-unneeded-ternary': ['error'], + 'no-useless-return': ['error'], + 'no-whitespace-before-property': ['error'], + 'object-curly-newline': ['error', { consistent: true }], + 'object-curly-spacing': ['error', 'always'], + 'object-shorthand': ['error'], + 'padded-blocks': ['error', 'never'], + 'prefer-arrow-callback': ['error'], + 'prefer-const': ['error'], + 'prefer-object-spread': ['error'], + 'prefer-template': ['error'], + 'quote-props': ['error', 'consistent-as-needed', { keywords: true }], + 'quotes': ['error', 'single', { allowTemplateLiterals: true }], + 'semi': ['error', 'never'], + 'space-before-blocks': ['error', 'always'], + 'spaced-comment': ['warn', 'always'], + 'space-infix-ops': ['error'], + 'space-in-parens': ['error', 'never'], + 'space-unary-ops': ['error', { words: true, nonwords: false }], + 'switch-colon-spacing': ['error'], + 'unicode-bom': ['error', 'never'], + 'wrap-iife': ['error'], + 'yoda': ['error'], + }, +} diff --git a/frontend/app.js b/frontend/app.js index ffd2ec9..1f77c97 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -1,4 +1,4 @@ -const app = new Vue({ +window.app = new Vue({ created() { // Use defaults with custom icon paths @@ -9,11 +9,14 @@ const app = new Vue({ shadowUrl: '/asset/leaflet/marker-shadow.png', }) - // This is only to detect another user updated the location - // therefore this is NOT cryptographically safe! + /* + * This is only to detect another user updated the location + * therefore this is NOT cryptographically safe! + */ this.browserID = localStorage.getItem('browserID') if (!this.browserID) { - this.browserID = Math.random().toString(16).substr(2) + this.browserID = Math.random().toString(16) + .substr(2) localStorage.setItem('browserID', this.browserID) } }, @@ -38,12 +41,11 @@ const app = new Vue({ methods: { initMap() { this.map = L.map('map') - .setView([0,0], 13) + .setView([0, 0], 13) L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors' + attribution: '© OpenStreetMap contributors', }).addTo(this.map) - }, shareLocation() { @@ -73,9 +75,9 @@ const app = new Vue({ this.socket = new WebSocket(`${window.location.href.split('#')[0].replace(/^http/, 'ws')}/ws`) this.socket.onclose = () => window.setTimeout(this.subscribe, 1000) // Restart socket this.socket.onmessage = evt => { - let loc= JSON.parse(evt.data) + const loc = JSON.parse(evt.data) loc.time = new Date(loc.time) - this.loc= loc + this.loc = loc } }, @@ -95,7 +97,7 @@ const app = new Vue({ const center = [this.loc.lat, this.loc.lon] if (!this.marker) { - this.marker = L.marker(center, {icon:this.icon}) + this.marker = L.marker(center, { icon: this.icon }) .addTo(this.map) }