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)
}