fix: eslint for vue components

This commit is contained in:
NGPixel 2017-10-29 21:36:05 -04:00
parent 72e3bacc2e
commit 98d311145b
45 changed files with 953 additions and 1253 deletions

View File

@ -1,14 +0,0 @@
{
"extends": "requarks",
"env": {
"node": true,
"es6": true,
"jest": true
},
"globals": {
"document": false,
"navigator": false,
"window": false,
"FuseBox": false
}
}

12
.eslintrc.yml Normal file
View File

@ -0,0 +1,12 @@
extends:
- requarks
- plugin:vue/recommended
env:
node: true
es6: true
jest: true
globals:
document: false
navigator: false
window: false
FuseBox: false

View File

@ -4,5 +4,9 @@
"puglint.enable": true, "puglint.enable": true,
"standard.enable": false, "standard.enable": false,
"editor.formatOnSave": false, "editor.formatOnSave": false,
"editor.tabSize": 2 "editor.tabSize": 2,
"eslint.validate": [
"javascript",
"vue"
]
} }

View File

@ -6,7 +6,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'alert', name: 'alert',
data () { data () {
return {} return {}
@ -15,7 +15,7 @@
shown() { return this.$store.state.alert.shown }, shown() { return this.$store.state.alert.shown },
style() { return 'is-' + this.$store.state.alert.style }, style() { return 'is-' + this.$store.state.alert.style },
icon() { return 'nc-icon-outline ' + this.$store.state.alert.icon }, icon() { return 'nc-icon-outline ' + this.$store.state.alert.icon },
msg() { return this.$store.state.alert.msg }, msg() { return this.$store.state.alert.msg }
}
} }
}
</script> </script>

View File

@ -17,7 +17,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'anchor', name: 'anchor',
data () { data () {
return {} return {}
@ -51,5 +51,5 @@
this.$refs.anchorURLinput.select() this.$refs.anchorURLinput.select()
} }
} }
} }
</script> </script>

View File

@ -4,7 +4,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'color-picker', name: 'color-picker',
props: ['value'], props: ['value'],
data () { data () {
@ -37,5 +37,5 @@
this.$emit('input', color) this.$emit('input', color)
} }
} }
} }
</script> </script>

View File

@ -27,29 +27,28 @@ export default {
results: [] results: []
}, },
conf: { conf: {
telemetry: true,
upgrade: false,
title: siteConfig.title || 'Wiki',
path: siteConfig.path || '/',
port: siteConfig.port || 80,
lang: siteConfig.lang || 'en',
public: (siteConfig.public === true),
pathData: './data',
pathRepo: './repo',
gitUseRemote: (siteConfig.git !== false),
gitUrl: '',
gitBranch: 'master',
gitAuthType: 'ssh',
gitAuthSSHKey: '',
gitAuthUser: '',
gitAuthPass: '',
gitAuthSSL: true,
gitShowUserEmail: true,
gitServerEmail: '',
mongo: 'mongodb://',
adminEmail: '', adminEmail: '',
adminPassword: '', adminPassword: '',
adminPasswordConfirm: '' adminPasswordConfirm: '',
gitAuthPass: '',
gitAuthSSHKey: '',
gitAuthSSL: true,
gitAuthType: 'ssh',
gitAuthUser: '',
gitBranch: 'master',
gitServerEmail: '',
gitShowUserEmail: true,
gitUrl: '',
gitUseRemote: (siteConfig.git !== false),
lang: siteConfig.lang || 'en',
mongo: 'mongodb://',
path: siteConfig.path || '/',
pathRepo: './repo',
port: siteConfig.port || 80,
public: (siteConfig.public === true),
telemetry: true,
title: siteConfig.title || 'Wiki',
upgrade: false
}, },
considerations: { considerations: {
https: false, https: false,

View File

@ -81,7 +81,7 @@ export default {
self.isLoading = true self.isLoading = true
self.$http.get('/js/ace/mode-' + m + '.js').then(resp => { self.$http.get('/js/ace/mode-' + m + '.js').then(resp => {
if (resp.ok) { if (resp.ok) {
eval(resp.bodyText) eval(resp.bodyText) // eslint-disable-line no-eval
self.modelistLoaded.push(m) self.modelistLoaded.push(m)
ace.acequire('ace/mode/' + m) ace.acequire('ace/mode/' + m)
codeEditor.getSession().setMode('ace/mode/' + m) codeEditor.getSession().setMode('ace/mode/' + m)

View File

@ -128,7 +128,9 @@
</template> </template>
<script> <script>
export default { /* global $, socket */
export default {
name: 'editor-file', name: 'editor-file',
data () { data () {
return { return {
@ -599,5 +601,5 @@
mounted() { mounted() {
this.$root.$on('editorFile/init', this.init) this.$root.$on('editorFile/init', this.init)
} }
} }
</script> </script>

View File

@ -33,13 +33,13 @@
</template> </template>
<script> <script>
const videoRules = { const videoRules = {
'youtube': new RegExp('/(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/)|(?:(?:watch)?\\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/', 'i'), 'youtube': new RegExp('/(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/)|(?:(?:watch)?\\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/', 'i'),
'vimeo': new RegExp('/vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/(?:[^/]*)\\/videos\\/|album\\/(?:\\d+)\\/video\\/|)(\\d+)(?:$|\\/|\\?)/', 'i'), 'vimeo': new RegExp('/vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/(?:[^/]*)\\/videos\\/|album\\/(?:\\d+)\\/video\\/|)(\\d+)(?:$|\\/|\\?)/', 'i'),
'dailymotion': new RegExp('/(?:dailymotion\\.com(?:\\/embed)?(?:\\/video|\\/hub)|dai\\.ly)\\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/', 'i') 'dailymotion': new RegExp('/(?:dailymotion\\.com(?:\\/embed)?(?:\\/video|\\/hub)|dai\\.ly)\\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/', 'i')
} }
export default { export default {
name: 'editor-video', name: 'editor-video',
data () { data () {
return { return {
@ -90,5 +90,5 @@
mounted () { mounted () {
this.$root.$on('editorVideo/init', this.init) this.$root.$on('editorVideo/init', this.init)
} }
} }
</script> </script>

View File

@ -44,6 +44,8 @@
</template> </template>
<script> <script>
/* global wiki, Diff2HtmlUI */
let diffui let diffui
let diffuiIsReady = false let diffuiIsReady = false
export default { export default {
@ -98,7 +100,7 @@ export default {
let self = this let self = this
diffuiIsReady = false diffuiIsReady = false
self.current = cm self.current = cm
self.$http.post(siteRoot + '/hist', { self.$http.post(wiki.siteRoot + '/hist', {
path: self.currentPath, path: self.currentPath,
commit: cm.commit commit: cm.commit
}).then(resp => { }).then(resp => {

View File

@ -3,10 +3,10 @@
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
export default { export default {
name: 'loading-spinner', name: 'loading-spinner',
computed: mapState(['loading']) computed: mapState(['loading'])
} }
</script> </script>

View File

@ -24,6 +24,8 @@
</template> </template>
<script> <script>
/* global CONSTANTS, graphQL, siteConfig */
export default { export default {
name: 'login', name: 'login',
data() { data() {
@ -67,4 +69,3 @@ export default {
} }
} }
</script> </script>

View File

@ -18,7 +18,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'modal-create-page', name: 'modal-create-page',
props: ['basepath'], props: ['basepath'],
data () { data () {
@ -31,7 +31,7 @@
}, },
computed: { computed: {
isShown () { isShown () {
if(this.$store.state.modalCreatePage.shown) { if (this.$store.state.modalCreatePage.shown) {
this.makeSelection() this.makeSelection()
} }
return this.$store.state.modalCreatePage.shown return this.$store.state.modalCreatePage.shown
@ -39,7 +39,7 @@
}, },
methods: { methods: {
makeSelection: function () { makeSelection: function () {
let self = this; let self = this
self._.delay(() => { self._.delay(() => {
let startPos = (self.currentPath.length > 0) ? self.currentPath.length + 1 : 0 let startPos = (self.currentPath.length > 0) ? self.currentPath.length + 1 : 0
self.$helpers.form.setInputSelection(self.$refs.createPageInput, startPos, self.userPath.length) self.$helpers.form.setInputSelection(self.$refs.createPageInput, startPos, self.userPath.length)
@ -63,5 +63,5 @@
this.currentPath = (this.basepath === 'home') ? '' : this.basepath this.currentPath = (this.basepath === 'home') ? '' : this.basepath
this.userPath = (this._.isEmpty(this.currentPath)) ? 'new-page' : this.currentPath + '/new-page' this.userPath = (this._.isEmpty(this.currentPath)) ? 'new-page' : this.currentPath + '/new-page'
} }
} }
</script> </script>

View File

@ -18,7 +18,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'modal-delete-page', name: 'modal-delete-page',
props: ['currentPath'], props: ['currentPath'],
data () { data () {
@ -62,5 +62,5 @@
}) })
} }
} }
} }
</script> </script>

View File

@ -16,7 +16,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'modal-discard-page', name: 'modal-discard-page',
props: ['mode', 'currentPath'], props: ['mode', 'currentPath'],
data () { data () {
@ -32,12 +32,12 @@
this.$store.dispatch('modalDiscardPage/close') this.$store.dispatch('modalDiscardPage/close')
}, },
discard: function () { discard: function () {
if(this.mode === 'create') { if (this.mode === 'create') {
window.location.assign('/') window.location.assign('/')
} else { } else {
window.location.assign('/' + this.currentPath) window.location.assign('/' + this.currentPath)
} }
} }
} }
} }
</script> </script>

View File

@ -19,7 +19,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'modal-move-page', name: 'modal-move-page',
props: ['currentPath'], props: ['currentPath'],
data () { data () {
@ -31,7 +31,7 @@
}, },
computed: { computed: {
isShown () { isShown () {
if(this.$store.state.modalMovePage.shown) { if (this.$store.state.modalMovePage.shown) {
this.movePath = this.currentPath this.movePath = this.currentPath
this.makeSelection() this.makeSelection()
} }
@ -40,7 +40,7 @@
}, },
methods: { methods: {
makeSelection() { makeSelection() {
let self = this; let self = this
self._.delay(() => { self._.delay(() => {
let startPos = (self._.includes(self.currentPath, '/')) ? self._.lastIndexOf(self.movePath, '/') + 1 : 0 let startPos = (self._.includes(self.currentPath, '/')) ? self._.lastIndexOf(self.movePath, '/') + 1 : 0
self.$helpers.form.setInputSelection(self.$refs.movePageInput, startPos, self.movePath.length) self.$helpers.form.setInputSelection(self.$refs.movePageInput, startPos, self.movePath.length)
@ -82,5 +82,5 @@
} }
} }
} }
} }
</script> </script>

View File

@ -18,6 +18,8 @@
</template> </template>
<script> <script>
/* global siteRoot, socket, $ */
export default { export default {
data() { data() {
return { return {
@ -57,9 +59,9 @@ export default {
}, },
searchmoveidx: function (val, oldVal) { searchmoveidx: function (val, oldVal) {
if (val > 0) { if (val > 0) {
this.searchmovekey = (this.searchmovearr[val - 1]) this.searchmovekey = (this.searchmovearr[val - 1]) ?
? 'res.' + this.searchmovearr[val - 1].entryPath 'res.' + this.searchmovearr[val - 1].entryPath :
: 'sug.' + this.searchmovearr[val - 1] 'sug.' + this.searchmovearr[val - 1]
} else { } else {
this.searchmovekey = '' this.searchmovekey = ''
} }

View File

@ -6,7 +6,7 @@
</template> </template>
<script> <script>
export default { export default {
name: 'toggle', name: 'toggle',
props: ['value', 'desc'], props: ['value', 'desc'],
data () { data () {
@ -17,5 +17,5 @@
this.$emit('input', !this.value) this.$emit('input', !this.value)
} }
} }
} }
</script> </script>

View File

@ -15,7 +15,9 @@
</template> </template>
<script> <script>
export default { /* global socket, siteRoot */
export default {
name: 'tree', name: 'tree',
data () { data () {
return { return {
@ -78,5 +80,5 @@
} }
this.fetch(basePath) this.fetch(basePath)
} }
} }
</script> </script>

View File

@ -1,310 +0,0 @@
'use strict'
/* global appconfig, runmode */
import jQuery from 'jquery'
import _ from 'lodash'
import Vue from 'vue'
import VeeValidate from 'vee-validate'
import axios from 'axios'
Vue.use(VeeValidate, {
enableAutoClasses: true,
classNames: {
touched: 'is-touched', // the control has been blurred
untouched: 'is-untouched', // the control hasn't been blurred
valid: 'is-valid', // model is valid
invalid: 'is-invalid', // model is invalid
pristine: 'is-pristine', // control has not been interacted with
dirty: 'is-dirty' // control has been interacted with
}
})
jQuery(document).ready(function ($) {
new Vue({ // eslint-disable-line no-new
el: 'main',
data: {
loading: false,
state: 'welcome',
syscheck: {
ok: false,
error: '',
results: []
},
dbcheck: {
ok: false,
error: ''
},
gitcheck: {
ok: false,
error: ''
},
final: {
ok: false,
error: '',
results: []
},
conf: {
title: appconfig.title || 'Wiki',
host: appconfig.host || 'http://',
port: appconfig.port || 80,
lang: appconfig.lang || 'en',
public: (appconfig.public === true),
db: appconfig.db || 'mongodb://localhost:27017/wiki',
pathData: './data',
pathRepo: './repo',
gitUseRemote: (appconfig.git !== false),
gitUrl: '',
gitBranch: 'master',
gitAuthType: 'ssh',
gitAuthSSHKey: '',
gitAuthUser: '',
gitAuthPass: '',
gitAuthSSL: true,
gitShowUserEmail: true,
gitServerEmail: '',
adminEmail: '',
adminPassword: '',
adminPasswordConfirm: ''
},
considerations: {
https: false,
port: false,
localhost: false
}
},
computed: {
currentProgress: function () {
let perc = '0%'
switch (this.state) {
case 'welcome':
perc = '0%'
break
case 'syscheck':
perc = (this.syscheck.ok) ? '15%' : '5%'
break
case 'general':
perc = '20%'
break
case 'considerations':
perc = '30%'
break
case 'db':
perc = '35%'
break
case 'dbcheck':
perc = (this.dbcheck.ok) ? '50%' : '40%'
break
case 'paths':
perc = '55%'
break
case 'git':
perc = '60%'
break
case 'gitcheck':
perc = (this.gitcheck.ok) ? '75%' : '65%'
break
case 'admin':
perc = '80%'
break
}
return perc
}
},
mounted: function () {
if (appconfig.paths) {
this.conf.pathData = appconfig.paths.data || './data'
this.conf.pathRepo = appconfig.paths.repo || './repo'
}
if (appconfig.git !== false && _.isPlainObject(appconfig.git)) {
this.conf.gitUrl = appconfig.git.url || ''
this.conf.gitBranch = appconfig.git.branch || 'master'
this.conf.gitShowUserEmail = (appconfig.git.showUserEmail !== false)
this.conf.gitServerEmail = appconfig.git.serverEmail || ''
if (_.isPlainObject(appconfig.git.auth)) {
this.conf.gitAuthType = appconfig.git.auth.type || 'ssh'
this.conf.gitAuthSSHKey = appconfig.git.auth.privateKey || ''
this.conf.gitAuthUser = appconfig.git.auth.username || ''
this.conf.gitAuthPass = appconfig.git.auth.password || ''
this.conf.gitAuthSSL = (appconfig.git.auth.sslVerify !== false)
}
}
},
methods: {
proceedToWelcome: function (ev) {
this.state = 'welcome'
this.loading = false
},
proceedToSyscheck: function (ev) {
let self = this
this.state = 'syscheck'
this.loading = true
self.syscheck = {
ok: false,
error: '',
results: []
}
_.delay(() => {
axios.post('/syscheck').then(resp => {
if (resp.data.ok === true) {
self.syscheck.ok = true
self.syscheck.results = resp.data.results
} else {
self.syscheck.ok = false
self.syscheck.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
proceedToGeneral: function (ev) {
let self = this
self.state = 'general'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('general')
})
},
proceedToConsiderations: function (ev) {
this.considerations = {
https: !_.startsWith(this.conf.host, 'https'),
port: false, // TODO
localhost: _.includes(this.conf.host, 'localhost')
}
this.state = 'considerations'
this.loading = false
},
proceedToDb: function (ev) {
let self = this
if (runmode.staticMongo) {
return self.proceedToDbcheck()
}
self.state = 'db'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('db')
})
},
proceedToDbcheck: function (ev) {
let self = this
this.state = 'dbcheck'
this.loading = true
self.dbcheck = {
ok: false,
error: ''
}
_.delay(() => {
axios.post('/dbcheck', {
db: self.conf.db
}).then(resp => {
if (resp.data.ok === true) {
self.dbcheck.ok = true
} else {
self.dbcheck.ok = false
self.dbcheck.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
proceedToPaths: function (ev) {
let self = this
self.state = 'paths'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('paths')
})
},
proceedToGit: function (ev) {
let self = this
self.state = 'git'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('git')
})
},
proceedToGitCheck: function (ev) {
let self = this
this.state = 'gitcheck'
this.loading = true
self.gitcheck = {
ok: false,
results: [],
error: ''
}
_.delay(() => {
axios.post('/gitcheck', self.conf).then(resp => {
if (resp.data.ok === true) {
self.gitcheck.ok = true
self.gitcheck.results = resp.data.results
} else {
self.gitcheck.ok = false
self.gitcheck.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
proceedToAdmin: function (ev) {
let self = this
self.state = 'admin'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('admin')
})
},
proceedToFinal: function (ev) {
let self = this
self.state = 'final'
self.loading = true
self.final = {
ok: false,
error: '',
results: []
}
_.delay(() => {
axios.post('/finalize', self.conf).then(resp => {
if (resp.data.ok === true) {
self.final.ok = true
self.final.results = resp.data.results
} else {
self.final.ok = false
self.final.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
finish: function (ev) {
let self = this
self.state = 'restart'
_.delay(() => {
axios.post('/restart', {}).then(resp => {
_.delay(() => {
window.location.assign(self.conf.host)
}, 30000)
}).catch(err => {
window.alert(err.message)
})
}, 1000)
}
}
})
})

View File

@ -1,4 +1,4 @@
'use strict' /* global wikijs */
export default { export default {
namespaced: true, namespaced: true,

View File

@ -1,4 +1,4 @@
'use strict' /* global wikijs */
export default { export default {
namespaced: true, namespaced: true,

View File

@ -1,4 +1,4 @@
'use strict' /* global wikijs */
export default { export default {
namespaced: true, namespaced: true,

View File

@ -1,4 +1,4 @@
'use strict' /* global wikijs */
export default { export default {
namespaced: true, namespaced: true,

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -1,4 +1,4 @@
'use strict' /* global wikijs */
export default { export default {
namespaced: true, namespaced: true,

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -1,5 +1,3 @@
'use strict'
export default { export default {
namespaced: true, namespaced: true,
state: { state: {

View File

@ -9,7 +9,7 @@
"restart": "node wiki restart", "restart": "node wiki restart",
"build": "node tools/fuse", "build": "node tools/fuse",
"dev": "node tools/fuse -d", "dev": "node tools/fuse -d",
"test": "jest" "test": "eslint --ext .js,.vue . && jest"
}, },
"bin": { "bin": {
"wiki": "wiki.js" "wiki": "wiki.js"
@ -149,6 +149,7 @@
"eslint-plugin-node": "5.2.1", "eslint-plugin-node": "5.2.1",
"eslint-plugin-promise": "3.6.0", "eslint-plugin-promise": "3.6.0",
"eslint-plugin-standard": "3.0.1", "eslint-plugin-standard": "3.0.1",
"eslint-plugin-vue": "3.13.1",
"fuse-box": "2.4.0", "fuse-box": "2.4.0",
"graphql-tag": "^2.5.0", "graphql-tag": "^2.5.0",
"i18next-xhr-backend": "1.4.3", "i18next-xhr-backend": "1.4.3",

View File

@ -1,4 +1,4 @@
'use strict' /* global appdata, ROOTPATH */
const crypto = require('crypto') const crypto = require('crypto')
const path = require('path') const path = require('path')

View File

@ -1,6 +1,6 @@
'use strict' 'use strict'
/* global appdata, rights */ /* global rights */
/** /**
* Authentication middleware * Authentication middleware

View File

@ -1,4 +1,4 @@
/* global wiki */ /* global wiki, appconfig */
const Promise = require('bluebird') const Promise = require('bluebird')
const bcrypt = require('bcryptjs-then') const bcrypt = require('bcryptjs-then')

View File

@ -1,5 +1,3 @@
'use strict'
/* global wiki */ /* global wiki */
const Promise = require('bluebird') const Promise = require('bluebird')
@ -78,7 +76,7 @@ module.exports = {
return fs.readFileAsync(cpath).then((contents) => { return fs.readFileAsync(cpath).then((contents) => {
return JSON.parse(contents) return JSON.parse(contents)
}).catch((err) => { // eslint-disable-line handle-callback-err }).catch((err) => { // eslint-disable-line handle-callback-err
winston.error('Corrupted cache file. Deleting it...') wiki.logger.error('Corrupted cache file. Deleting it...')
fs.unlinkSync(cpath) fs.unlinkSync(cpath)
return false return false
}) })
@ -115,7 +113,7 @@ module.exports = {
return fs.statAsync(fpath).then((st) => { return fs.statAsync(fpath).then((st) => {
if (st.isFile()) { if (st.isFile()) {
return fs.readFileAsync(fpath, 'utf8').then((contents) => { return fs.readFileAsync(fpath, 'utf8').then((contents) => {
let htmlProcessor = (options.parseMarkdown) ? mark.parseContent(contents) : Promise.resolve('') let htmlProcessor = (options.parseMarkdown) ? wiki.mark.parseContent(contents) : Promise.resolve('')
// Parse contents // Parse contents
@ -123,8 +121,8 @@ module.exports = {
let pageData = { let pageData = {
markdown: (options.includeMarkdown) ? contents : '', markdown: (options.includeMarkdown) ? contents : '',
html, html,
meta: (options.parseMeta) ? mark.parseMeta(contents) : {}, meta: (options.parseMeta) ? wiki.mark.parseMeta(contents) : {},
tree: (options.parseTree) ? mark.parseTree(contents) : [] tree: (options.parseTree) ? wiki.mark.parseTree(contents) : []
} }
if (!pageData.meta.title) { if (!pageData.meta.title) {
@ -147,8 +145,8 @@ module.exports = {
if (options.cache) { if (options.cache) {
let cacheData = JSON.stringify(_.pick(pageData, ['html', 'meta', 'tree', 'parent']), false, false, false) let cacheData = JSON.stringify(_.pick(pageData, ['html', 'meta', 'tree', 'parent']), false, false, false)
return fs.writeFileAsync(cpath, cacheData).catch((err) => { return fs.writeFileAsync(cpath, cacheData).catch((err) => {
winston.error('Unable to write to cache! Performance may be affected.') wiki.logger.error('Unable to write to cache! Performance may be affected.')
winston.error(err) wiki.logger.error(err)
return true return true
}) })
} else { } else {
@ -161,7 +159,7 @@ module.exports = {
return false return false
} }
}).catch((err) => { // eslint-disable-line handle-callback-err }).catch((err) => { // eslint-disable-line handle-callback-err
throw new Promise.OperationalError(lang.t('errors:notexist', { path: entryPath })) throw new Promise.OperationalError(wiki.lang.t('errors:notexist', { path: entryPath }))
}) })
}, },
@ -181,7 +179,7 @@ module.exports = {
return fs.statAsync(fpath).then((st) => { return fs.statAsync(fpath).then((st) => {
if (st.isFile()) { if (st.isFile()) {
return fs.readFileAsync(fpath, 'utf8').then((contents) => { return fs.readFileAsync(fpath, 'utf8').then((contents) => {
let pageMeta = mark.parseMeta(contents) let pageMeta = wiki.mark.parseMeta(contents)
return { return {
path: parentPath, path: parentPath,
@ -190,11 +188,11 @@ module.exports = {
} }
}) })
} else { } else {
return Promise.reject(new Error(lang.t('errors:parentinvalid'))) return Promise.reject(new Error(wiki.lang.t('errors:parentinvalid')))
} }
}) })
} else { } else {
return Promise.reject(new Error(lang.t('errors:parentisroot'))) return Promise.reject(new Error(wiki.lang.t('errors:parentisroot')))
} }
}, },
@ -214,15 +212,15 @@ module.exports = {
if (st.isFile()) { if (st.isFile()) {
return self.makePersistent(entryPath, contents, author).then(() => { return self.makePersistent(entryPath, contents, author).then(() => {
return self.updateCache(entryPath).then(entry => { return self.updateCache(entryPath).then(entry => {
return search.add(entry) return wiki.search.add(entry)
}) })
}) })
} else { } else {
return Promise.reject(new Error(lang.t('errors:notexist', { path: entryPath }))) return Promise.reject(new Error(wiki.lang.t('errors:notexist', { path: entryPath })))
} }
}).catch((err) => { }).catch((err) => {
winston.error(err) wiki.logger.error(err)
return Promise.reject(new Error(lang.t('errors:savefailed'))) return Promise.reject(new Error(wiki.lang.t('errors:savefailed')))
}) })
}, },
@ -243,21 +241,21 @@ module.exports = {
includeParentInfo: true, includeParentInfo: true,
cache: true cache: true
}).catch(err => { }).catch(err => {
winston.error(err) wiki.logger.error(err)
return err return err
}).then((pageData) => { }).then((pageData) => {
return { return {
entryPath, entryPath,
meta: pageData.meta, meta: pageData.meta,
parent: pageData.parent || {}, parent: pageData.parent || {},
text: mark.removeMarkdown(pageData.markdown) text: wiki.mark.removeMarkdown(pageData.markdown)
} }
}).catch(err => { }).catch(err => {
winston.error(err) wiki.logger.error(err)
return err return err
}).then((content) => { }).then((content) => {
let parentPath = _.chain(content.entryPath).split('/').initial().join('/').value() let parentPath = _.chain(content.entryPath).split('/').initial().join('/').value()
return db.Entry.findOneAndUpdate({ return wiki.db.Entry.findOneAndUpdate({
_id: content.entryPath _id: content.entryPath
}, { }, {
_id: content.entryPath, _id: content.entryPath,
@ -280,7 +278,7 @@ module.exports = {
return result return result
}) })
}).catch(err => { }).catch(err => {
winston.error(err) wiki.logger.error(err)
return err return err
}) })
}, },
@ -291,12 +289,12 @@ module.exports = {
* @returns {Promise<Boolean>} Promise of the operation * @returns {Promise<Boolean>} Promise of the operation
*/ */
updateTreeInfo() { updateTreeInfo() {
return db.Entry.distinct('parentPath', { parentPath: { $ne: '' } }).then(allPaths => { return wiki.db.Entry.distinct('parentPath', { parentPath: { $ne: '' } }).then(allPaths => {
if (allPaths.length > 0) { if (allPaths.length > 0) {
return Promise.map(allPaths, pathItem => { return Promise.map(allPaths, pathItem => {
let parentPath = _.chain(pathItem).split('/').initial().join('/').value() let parentPath = _.chain(pathItem).split('/').initial().join('/').value()
let guessedTitle = _.chain(pathItem).split('/').last().startCase().value() let guessedTitle = _.chain(pathItem).split('/').last().startCase().value()
return db.Entry.update({ _id: pathItem }, { return wiki.db.Entry.update({ _id: pathItem }, {
$set: { isDirectory: true }, $set: { isDirectory: true },
$setOnInsert: { isEntry: false, title: guessedTitle, parentPath } $setOnInsert: { isEntry: false, title: guessedTitle, parentPath }
}, { upsert: true }) }, { upsert: true })
@ -322,15 +320,15 @@ module.exports = {
if (!docExists) { if (!docExists) {
return self.makePersistent(entryPath, contents, author).then(() => { return self.makePersistent(entryPath, contents, author).then(() => {
return self.updateCache(entryPath).then(entry => { return self.updateCache(entryPath).then(entry => {
return search.add(entry) return wiki.search.add(entry)
}) })
}) })
} else { } else {
return Promise.reject(new Error(lang.t('errors:alreadyexists'))) return Promise.reject(new Error(wiki.lang.t('errors:alreadyexists')))
} }
}).catch((err) => { }).catch((err) => {
winston.error(err) wiki.logger.error(err)
return Promise.reject(new Error(lang.t('errors:generic'))) return Promise.reject(new Error(wiki.lang.t('errors:generic')))
}) })
}, },
@ -346,7 +344,7 @@ module.exports = {
let fpath = entryHelper.getFullPath(entryPath) let fpath = entryHelper.getFullPath(entryPath)
return fs.outputFileAsync(fpath, contents).then(() => { return fs.outputFileAsync(fpath, contents).then(() => {
return git.commitDocument(entryPath, author) return wiki.git.commitDocument(entryPath, author)
}) })
}, },
@ -362,11 +360,11 @@ module.exports = {
let self = this let self = this
if (_.isEmpty(entryPath) || entryPath === 'home') { if (_.isEmpty(entryPath) || entryPath === 'home') {
return Promise.reject(new Error(lang.t('errors:invalidpath'))) return Promise.reject(new Error(wiki.lang.t('errors:invalidpath')))
} }
return git.moveDocument(entryPath, newEntryPath).then(() => { return wiki.git.moveDocument(entryPath, newEntryPath).then(() => {
return git.commitDocument(newEntryPath, author).then(() => { return wiki.git.commitDocument(newEntryPath, author).then(() => {
// Delete old cache version // Delete old cache version
let oldEntryCachePath = entryHelper.getCachePath(entryPath) let oldEntryCachePath = entryHelper.getCachePath(entryPath)
@ -374,14 +372,14 @@ module.exports = {
// Delete old index entry // Delete old index entry
search.delete(entryPath) wiki.search.delete(entryPath)
// Create cache for new entry // Create cache for new entry
return Promise.join( return Promise.join(
db.Entry.deleteOne({ _id: entryPath }), wiki.db.Entry.deleteOne({ _id: entryPath }),
self.updateCache(newEntryPath).then(entry => { self.updateCache(newEntryPath).then(entry => {
return search.add(entry) return wiki.search.add(entry)
}) })
) )
}) })
@ -397,20 +395,20 @@ module.exports = {
*/ */
remove(entryPath, author) { remove(entryPath, author) {
if (_.isEmpty(entryPath) || entryPath === 'home') { if (_.isEmpty(entryPath) || entryPath === 'home') {
return Promise.reject(new Error(lang.t('errors:invalidpath'))) return Promise.reject(new Error(wiki.lang.t('errors:invalidpath')))
} }
return git.deleteDocument(entryPath, author).then(() => { return wiki.git.deleteDocument(entryPath, author).then(() => {
// Delete old cache version // Delete old cache version
let oldEntryCachePath = entryHelper.getCachePath(entryPath) let oldEntryCachePath = entryHelper.getCachePath(entryPath)
fs.unlinkAsync(oldEntryCachePath).catch((err) => { return true }) // eslint-disable-line handle-callback-err fs.unlinkAsync(oldEntryCachePath).catch((err) => { return true }) // eslint-disable-line handle-callback-err
// Delete old index entry // Delete old index entry
search.delete(entryPath) wiki.search.delete(entryPath)
// Delete entry // Delete entry
return db.Entry.deleteOne({ _id: entryPath }) return wiki.db.Entry.deleteOne({ _id: entryPath })
}) })
}, },
@ -423,7 +421,7 @@ module.exports = {
getStarter(entryPath) { getStarter(entryPath) {
let formattedTitle = _.startCase(_.last(_.split(entryPath, '/'))) let formattedTitle = _.startCase(_.last(_.split(entryPath, '/')))
return fs.readFileAsync(path.join(SERVERPATH, 'app/content/create.md'), 'utf8').then((contents) => { return fs.readFileAsync(path.join(wiki.SERVERPATH, 'app/content/create.md'), 'utf8').then((contents) => {
return _.replace(contents, new RegExp('{TITLE}', 'g'), formattedTitle) return _.replace(contents, new RegExp('{TITLE}', 'g'), formattedTitle)
}) })
}, },
@ -436,17 +434,17 @@ module.exports = {
* @return {Promise<Array>} List of entries * @return {Promise<Array>} List of entries
*/ */
getFromTree(basePath, usr) { getFromTree(basePath, usr) {
return db.Entry.find({ parentPath: basePath }, 'title parentPath isDirectory isEntry').sort({ title: 'asc' }).then(results => { return wiki.db.Entry.find({ parentPath: basePath }, 'title parentPath isDirectory isEntry').sort({ title: 'asc' }).then(results => {
return _.filter(results, r => { return _.filter(results, r => {
return rights.checkRole('/' + r._id, usr.rights, 'read') return wiki.rights.checkRole('/' + r._id, usr.rights, 'read')
}) })
}) })
}, },
getHistory(entryPath) { getHistory(entryPath) {
return db.Entry.findOne({ _id: entryPath, isEntry: true }).then(entry => { return wiki.db.Entry.findOne({ _id: entryPath, isEntry: true }).then(entry => {
if (!entry) { return false } if (!entry) { return false }
return git.getHistory(entryPath).then(history => { return wiki.git.getHistory(entryPath).then(history => {
return { return {
meta: entry, meta: entry,
history history

View File

@ -1,5 +1,3 @@
'use strict'
/* global wiki */ /* global wiki */
const Promise = require('bluebird') const Promise = require('bluebird')
@ -58,8 +56,7 @@ var mkdown = md({
}) })
.use(mdAttrs) .use(mdAttrs)
// if (wiki.config.features.mathjax) { if (wiki.config.features.mathjax) {
if (true) {
mkdown.use(mdMathjax) mkdown.use(mdMathjax)
} }

View File

@ -5,7 +5,7 @@
const Promise = require('bluebird') const Promise = require('bluebird')
const _ = require('lodash') const _ = require('lodash')
// const searchIndex = require('./search-index') // const searchIndex = require('./search-index')
const stopWord = require('stopword') // const stopWord = require('stopword')
const streamToPromise = require('stream-to-promise') const streamToPromise = require('stream-to-promise')
const searchAllowedChars = new RegExp('[^a-z0-9' + wiki.data.regex.cjk + wiki.data.regex.arabic + ' ]', 'g') const searchAllowedChars = new RegExp('[^a-z0-9' + wiki.data.regex.cjk + wiki.data.regex.arabic + ' ]', 'g')
@ -22,7 +22,7 @@ module.exports = {
init () { init () {
let self = this let self = this
self._isReady = new Promise((resolve, reject) => { self._isReady = new Promise((resolve, reject) => {
/*searchIndex({ /* searchIndex({
deletable: true, deletable: true,
fieldedSearch: true, fieldedSearch: true,
indexPath: 'wiki', indexPath: 'wiki',

View File

@ -1,6 +1,6 @@
'use strict' 'use strict'
/* global winston */ /* global winston, ROOTPATH, appconfig */
const Promise = require('bluebird') const Promise = require('bluebird')
const crypto = require('crypto') const crypto = require('crypto')

View File

@ -26,7 +26,7 @@ block body
.panel-content.form-sections .panel-content.form-sections
section section
p p
svg.icons.is-18.is-outlined.has-right-pad.is-text: use(xlink:href="#nc-cd-reader") svg.icons.is-18.is-outlined.has-right-pad.is-text: use(xlink:href='#nc-cd-reader')
span You are about to install Wiki.js #[strong= packageObj.version]. span You are about to install Wiki.js #[strong= packageObj.version].
section section
p.control.is-fullwidth p.control.is-fullwidth
@ -51,14 +51,14 @@ block body
span System Check span System Check
i(v-if='loading') i(v-if='loading')
.panel-content.is-text .panel-content.is-text
p(v-if='loading') #[svg.icons.is-24.is-text: use(xlink:href="#nc-ms-dots")] Checking your system for compatibility... p(v-if='loading') #[svg.icons.is-24.is-text: use(xlink:href='#nc-ms-dots')] Checking your system for compatibility...
p(v-if='!loading && syscheck.ok') p(v-if='!loading && syscheck.ok')
ul ul
li(v-for='rs in syscheck.results') #[svg.icons.is-18.is-text: use(xlink:href="#nc-check-bold")] {{rs}} li(v-for='rs in syscheck.results') #[svg.icons.is-18.is-text: use(xlink:href='#nc-check-bold')] {{rs}}
p(v-if='!loading && syscheck.ok') p(v-if='!loading && syscheck.ok')
svg.icons.is-18.is-text: use(xlink:href="#nc-check-bold") svg.icons.is-18.is-text: use(xlink:href='#nc-check-bold')
strong Looks good! No issues so far. strong Looks good! No issues so far.
p(v-if='!loading && !syscheck.ok') #[svg.icons.is-18.is-text: use(xlink:href="#nc-square-remove-12")] Error: {{ syscheck.error }} p(v-if='!loading && !syscheck.ok') #[svg.icons.is-18.is-text: use(xlink:href='#nc-square-remove-12')] Error: {{ syscheck.error }}
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}') .progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-small.is-light-blue.is-outlined(v-on:click='proceedToWelcome', v-bind:disabled='loading') Back button.button.is-small.is-light-blue.is-outlined(v-on:click='proceedToWelcome', v-bind:disabled='loading') Back
@ -218,14 +218,14 @@ block body
span Git Repository Check span Git Repository Check
i(v-if='loading') i(v-if='loading')
.panel-content.is-text .panel-content.is-text
p(v-if='loading') #[svg.icons.is-24.is-text: use(xlink:href="#nc-ms-dots")] Verifying Git repository settings... p(v-if='loading') #[svg.icons.is-24.is-text: use(xlink:href='#nc-ms-dots')] Verifying Git repository settings...
p(v-if='!loading && gitcheck.ok') p(v-if='!loading && gitcheck.ok')
ul ul
li(v-for='rs in gitcheck.results') #[svg.icons.is-18.is-text: use(xlink:href="#nc-check-bold")] {{rs}} li(v-for='rs in gitcheck.results') #[svg.icons.is-18.is-text: use(xlink:href='#nc-check-bold')] {{rs}}
p(v-if='!loading && gitcheck.ok') p(v-if='!loading && gitcheck.ok')
svg.icons.is-18.is-text: use(xlink:href="#nc-check-bold") svg.icons.is-18.is-text: use(xlink:href='#nc-check-bold')
strong Git settings are correct! strong Git settings are correct!
p(v-if='!loading && !gitcheck.ok') #[svg.icons.is-18.is-text: use(xlink:href="#nc-square-remove-12")] Error: {{ gitcheck.error }} p(v-if='!loading && !gitcheck.ok') #[svg.icons.is-18.is-text: use(xlink:href='#nc-square-remove-12')] Error: {{ gitcheck.error }}
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}') .progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-small.is-light-blue.is-outlined(v-on:click='proceedToGit', v-bind:disabled='loading') Back button.button.is-small.is-light-blue.is-outlined(v-on:click='proceedToGit', v-bind:disabled='loading') Back
@ -280,11 +280,11 @@ block body
section section
p.control.is-fullwidth p.control.is-fullwidth
label.label Connection String to Wiki.js 1.x MongoDB database label.label Connection String to Wiki.js 1.x MongoDB database
input(type='text', placeholder='mongodb://', v-model='conf.mongo', data-vv-scope='mongo', name='ipt-mongo', v-validate='{ required: true, min: 2 }') input(type='text', placeholder='mongodb://', v-model='conf.mongo', data-vv-scope='upgrade', name='ipt-mongo', v-validate='{ required: true, min: 2 }')
span.desc A MongoDB database connection string where a Wiki.js 1.x installation is located. #[strong No alterations will be made to this database. ] span.desc A MongoDB database connection string where a Wiki.js 1.x installation is located. #[strong No alterations will be made to this database. ]
section section
p.control.is-fullwidth p.control.is-fullwidth
input#ipt-public(type='checkbox', v-model='conf.public', data-vv-scope='general', name='ipt-public') input#ipt-public(type='checkbox', v-model='conf.public', data-vv-scope='upgrade', name='ipt-public')
label.label(for='ipt-public') Create groups based on individual permissions label.label(for='ipt-public') Create groups based on individual permissions
span.desc User groups will be created based on existing users permissions. If multiple users have the exact same permission rules, they will be put in the same user group. span.desc User groups will be created based on existing users permissions. If multiple users have the exact same permission rules, they will be put in the same user group.
.panel-footer .panel-footer

View File

@ -59,12 +59,12 @@ expect.extend({
}) })
describe('Code Linting', () => { describe('Code Linting', () => {
it('should pass ESLint validation', () => { // it('should pass ESLint validation', () => {
const CLIEngine = require('eslint').CLIEngine // const CLIEngine = require('eslint').CLIEngine
const cli = new CLIEngine() // const cli = new CLIEngine()
let report = cli.executeOnFiles(['**/*.js']) // let report = cli.executeOnFiles(['**/*.js', '**/*.vue'])
expect(report).toESLint() // expect(report).toESLint()
}) // })
it('should pass PugLint validation', () => { it('should pass PugLint validation', () => {
const PugLint = require('pug-lint') const PugLint = require('pug-lint')

View File

@ -1,6 +1,3 @@
'use strict'
const _ = require('lodash')
const Promise = require('bluebird') const Promise = require('bluebird')
const colors = require('colors/safe') const colors = require('colors/safe')
const fs = Promise.promisifyAll(require('fs-extra')) const fs = Promise.promisifyAll(require('fs-extra'))

View File

@ -2575,6 +2575,13 @@ eslint-plugin-standard@3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2"
eslint-plugin-vue@3.13.1:
version "3.13.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-3.13.1.tgz#875dc47a90c2e4034013b6ce1b915e5a5c6e9bf9"
dependencies:
requireindex "^1.1.0"
vue-eslint-parser "^2.0.1-beta.1"
eslint-scope@^3.7.1: eslint-scope@^3.7.1:
version "3.7.1" version "3.7.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
@ -2624,7 +2631,7 @@ eslint@4.10.0:
table "^4.0.1" table "^4.0.1"
text-table "~0.2.0" text-table "~0.2.0"
espree@^3.5.1: espree@^3.3.2, espree@^3.5.1:
version "3.5.1" version "3.5.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e"
dependencies: dependencies:
@ -6727,6 +6734,10 @@ require_optional@~1.0.0:
resolve-from "^2.0.0" resolve-from "^2.0.0"
semver "^5.1.0" semver "^5.1.0"
requireindex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162"
resolve-from@^1.0.0: resolve-from@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
@ -7799,6 +7810,16 @@ vue-clipboards@1.1.0:
dependencies: dependencies:
clipboard "^1.7.1" clipboard "^1.7.1"
vue-eslint-parser@^2.0.1-beta.1:
version "2.0.1-beta.1"
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.1-beta.1.tgz#7e1b3c0865905264605169497fe9e42d27c1ae60"
dependencies:
debug "^3.0.0"
eslint-scope "^3.7.1"
espree "^3.3.2"
esquery "^1.0.0"
lodash "^4.17.4"
vue-hot-reload-api@2.2.0: vue-hot-reload-api@2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.2.0.tgz#9a21b35ced3634434a43ee80efb7350ea8fb206d" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.2.0.tgz#9a21b35ced3634434a43ee80efb7350ea8fb206d"