From 51cd37fd05f0a1ce3c4a40c02056a9a4e3798962 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sat, 28 Oct 2017 14:17:14 -0400 Subject: [PATCH] feat: upgraded dependencies --- client/js/app.js | 9 +- .../js/components/config-manager.component.js | 2 +- package.json | 93 +++++++++--------- server/configure.js | 6 +- server/modules/telemetry.js | 2 +- server/views/configure/index.pug | 46 ++++----- tools/fuse.js | 4 - yarn.lock | Bin 282432 -> 284603 bytes 8 files changed, 80 insertions(+), 82 deletions(-) diff --git a/client/js/app.js b/client/js/app.js index 67601a6f..52a99e4b 100644 --- a/client/js/app.js +++ b/client/js/app.js @@ -9,7 +9,9 @@ import Vue from 'vue' import VueResource from 'vue-resource' import VueClipboards from 'vue-clipboards' import VeeValidate from 'vee-validate' -import { ApolloClient, createBatchingNetworkInterface } from 'apollo-client' +import { ApolloClient } from 'apollo-client' +import { HttpLink } from 'apollo-link-http' +import { InMemoryCache } from 'apollo-cache-inmemory' import store from './store' // ==================================== @@ -71,10 +73,11 @@ window.CONSTANTS = CONSTANTS // ==================================== window.graphQL = new ApolloClient({ - networkInterface: createBatchingNetworkInterface({ + link: new HttpLink({ uri: window.location.protocol + '//' + window.location.host + siteConfig.path + '/graphql' }), - connectToDevTools: true + cache: new InMemoryCache(), + connectToDevTools: (process.env.node_env === 'development') }) // ==================================== diff --git a/client/js/components/config-manager.component.js b/client/js/components/config-manager.component.js index 3cb55e7b..fa85ebed 100644 --- a/client/js/components/config-manager.component.js +++ b/client/js/components/config-manager.component.js @@ -30,7 +30,7 @@ export default { telemetry: true, upgrade: false, title: siteConfig.title || 'Wiki', - host: siteConfig.host || 'http://', + path: siteConfig.path || '/', port: siteConfig.port || 80, lang: siteConfig.lang || 'en', public: (siteConfig.public === true), diff --git a/package.json b/package.json index b28e556e..434f5fc0 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,7 @@ "restart": "node wiki restart", "build": "node tools/fuse", "dev": "node tools/fuse -d", - "test": "jest", - "postinstall": "opencollective postinstall" + "test": "jest" }, "bin": { "wiki": "wiki.js" @@ -34,17 +33,17 @@ }, "homepage": "https://github.com/Requarks/wiki#readme", "engines": { - "node": ">=6.11.1" + "node": ">=8.8.1" }, "dependencies": { - "apollo-server-express": "1.1.3", + "apollo-server-express": "1.2.0", "auto-load": "3.0.0", - "axios": "0.16.2", + "axios": "0.17.0", "bcryptjs-then": "1.0.1", "bluebird": "3.5.1", "body-parser": "1.18.2", - "bugsnag": "2.0.0", - "bull": "3.3.0", + "bugsnag": "2.0.1", + "bull": "3.3.5", "bunyan": "1.8.12", "cheerio": "1.0.0-rc.2", "child-process-promise": "2.2.1", @@ -53,30 +52,30 @@ "connect-flash": "0.1.1", "connect-redis": "3.3.2", "cookie-parser": "1.4.3", - "diff2html": "2.3.1", + "diff2html": "2.3.2", "dotize": "^0.2.0", "execa": "0.8.0", - "express": "4.16.1", + "express": "4.16.2", "express-brute": "1.0.1", "express-brute-redis": "0.0.1", "express-session": "1.15.6", - "file-type": "6.2.0", + "file-type": "7.2.0", "filesize.js": "1.0.2", "follow-redirects": "1.2.5", "fs-extra": "4.0.2", "git-wrapper2-promise": "0.2.9", - "graphql": "0.10.5", - "graphql-tools": "2.2.1", + "graphql": "0.11.7", + "graphql-tools": "2.6.1", "highlight.js": "9.12.0", - "i18next": "9.1.0", + "i18next": "10.0.3", "i18next-express-middleware": "1.0.7", "i18next-localstorage-cache": "1.1.1", "i18next-node-fs-backend": "1.0.0", "image-size": "0.6.1", - "ioredis": "3.1.4", + "ioredis": "3.2.1", "jimp": "0.2.28", "js-yaml": "3.10.0", - "jsonwebtoken": "8.0.1", + "jsonwebtoken": "8.1.0", "klaw": "2.1.0", "lodash": "4.17.4", "markdown-it": "8.4.0", @@ -88,11 +87,12 @@ "markdown-it-external-links": "0.0.6", "markdown-it-footnote": "3.0.1", "markdown-it-mathjax": "2.0.0", - "markdown-it-task-lists": "2.0.1", + "markdown-it-task-lists": "2.1.0", "mathjax-node": "1.2.1", "mime-types": "2.1.17", - "moment": "2.18.1", + "moment": "2.19.1", "moment-timezone": "0.5.13", + "mongodb": "2.2.33", "multer": "1.3.0", "node-2fa": "1.1.2", "node-graceful": "0.2.3", @@ -106,76 +106,73 @@ "passport-local": "1.0.0", "passport-slack": "0.0.7", "passport-windowslive": "1.0.2", - "pg": "6.4.2", + "pg": "7.3.0", "pg-hstore": "2.3.2", - "pg-promise": "6.10.3", - "pm2": "2.7.1", + "pg-promise": "7.0.3", + "pm2": "2.7.2", "pug": "2.0.0-rc.4", "qr-image": "3.2.0", "read-chunk": "2.1.0", "remove-markdown": "0.2.2", "request": "2.83.0", "semver": "5.4.1", - "sequelize": "4.13.5", + "sequelize": "4.19.0", "serve-favicon": "2.4.5", "simplemde": "1.11.2", "stream-to-promise": "2.2.0", - "tar": "4.0.1", + "tar": "4.0.2", "through2": "2.0.3", "uuid": "3.1.0", - "validator": "9.0.0", + "validator": "9.1.1", "validator-as-promised": "1.0.2", "winston": "2.4.0", - "yargs": "9.0.1" + "yargs": "10.0.3" }, "devDependencies": { "@glimpse/glimpse": "0.22.15", - "@panter/vue-i18next": "0.6.1", - "apollo-client": "^1.9.3", - "autoprefixer": "7.1.5", + "@panter/vue-i18next": "0.8.0", + "apollo-client-preset": "1.0.1", + "autoprefixer": "7.1.6", "babel-cli": "6.26.0", "babel-core": "6.26.0", "babel-jest": "21.2.0", - "babel-preset-env": "1.6.0", + "babel-preset-env": "1.6.1", "babel-preset-es2015": "6.24.1", "babel-preset-stage-2": "6.24.1", "brace": "0.10.0", "colors": "1.1.2", "consolidate": "0.14.5", - "eslint": "4.8.0", + "eslint": "4.10.0", "eslint-config-requarks": "1.0.7", "eslint-config-standard": "10.2.1", - "eslint-plugin-import": "2.7.0", - "eslint-plugin-node": "5.2.0", - "eslint-plugin-promise": "3.5.0", + "eslint-plugin-import": "2.8.0", + "eslint-plugin-node": "5.2.1", + "eslint-plugin-promise": "3.6.0", "eslint-plugin-standard": "3.0.1", - "fuse-box": "2.3.3", - "graphql-tag": "^2.4.2", + "fuse-box": "2.4.0", + "graphql-tag": "^2.5.0", "i18next-xhr-backend": "1.4.3", "jest": "21.2.1", "jest-junit": "3.1.0", - "jquery": "3.2.1", - "jquery-contextmenu": "2.6.2", - "jquery-simple-upload": "1.0.0", - "js-cookie": "2.1.4", + "js-cookie": "2.2.0", "node-sass": "4.5.3", "nodemon": "1.12.1", - "postcss-selector-parser": "2.2.3", + "postcss-selector-parser": "3.1.0", "pug-lint": "2.5.0", "twemoji-awesome": "1.0.6", "typescript": "2.5.3", - "uglify-es": "3.1.3", - "vee-validate": "2.0.0-rc.18", - "vue": "2.4.4", + "uglify-es": "3.1.5", + "vee-validate": "2.0.0-rc.19", + "vue": "2.5.2", "vue-clipboards": "1.1.0", - "vue-hot-reload-api": "2.1.1", + "vue-hot-reload-api": "2.2.0", "vue-lodash": "1.0.4", - "vue-material": "^0.7.5", + "vue-material": "^0.8.1", "vue-resource": "1.3.4", - "vue-simple-breakpoints": "1.0.2", - "vue-template-compiler": "2.4.4", - "vue-template-es2015-compiler": "1.5.3", - "vuex": "2.4.1", + "vue-simple-breakpoints": "1.0.3", + "vue-template-compiler": "2.5.2", + "vue-template-es2015-compiler": "1.6.0", + "vuex": "3.0.0", "vuex-persistedstate": "2.0.0" }, "jest": { diff --git a/server/configure.js b/server/configure.js index e2a7471a..cc8bf161 100644 --- a/server/configure.js +++ b/server/configure.js @@ -77,10 +77,10 @@ module.exports = () => { Promise.mapSeries([ () => { const semver = require('semver') - if (!semver.satisfies(semver.clean(process.version), '>=6.11.1')) { - throw new Error('Node.js version is too old. Minimum is 6.11.1.') + if (!semver.satisfies(semver.clean(process.version), '>=8.8.1')) { + throw new Error('Node.js version is too old. Minimum is 8.8.1.') } - return 'Node.js ' + process.version + ' detected. Minimum is 6.11.1.' + return 'Node.js ' + process.version + ' detected. Minimum is 8.8.1.' }, () => { return Promise.try(() => { diff --git a/server/modules/telemetry.js b/server/modules/telemetry.js index 20849adc..c85f2212 100644 --- a/server/modules/telemetry.js +++ b/server/modules/telemetry.js @@ -31,7 +31,7 @@ module.exports = { return this }, sendError(err) { - bugsnag.notify(err) + bugsnag.notify(err, { userId: this.cid }) }, sendEvent(eventCategory, eventAction, eventLabel) { if (!this.enabled) { return false } diff --git a/server/views/configure/index.pug b/server/views/configure/index.pug index 577c1b69..91f940d7 100644 --- a/server/views/configure/index.pug +++ b/server/views/configure/index.pug @@ -80,33 +80,35 @@ block body label.label Site Title input(type='text', placeholder='e.g. Wiki', v-model='conf.title', data-vv-scope='general', name='ipt-title', v-validate='{ required: true, min: 2 }') span.desc The site title will appear in the top left corner on every page and within the window title bar. - section - p.control.is-fullwidth - label.label Host - input(type='text', placeholder='http://', v-model='conf.host', data-vv-scope='general', name='ipt-host', v-validate='{ required: true, min: 4 }') - span.desc The full URL to your wiki, without the trailing slash, e.g.: http://wiki.domain.com. Make sure to include the port if different than 80/443. - section - p.control - label.label Port - input(type='text', placeholder='e.g. 80', v-model.number='conf.port', data-vv-scope='general', name='ipt-port', v-validate='{ required: true }') - span.desc The port on which Wiki.js will listen to. Usually port 80 if connecting directly, or a random port (e.g. 3000) if using a web server in front of it.
Set $(PORT) to use PORT environment variable. - section - p.control - label.label Site UI Language - select(v-model='conf.lang') - each lg in data.langs - option(value=lg.id)= lg.name - span.desc The language in which navigation, help and other UI elements will be displayed. + section.columns + .column.is-half + p.control + label.label Port + input(type='text', placeholder='e.g. 80', v-model.number='conf.port', data-vv-scope='general', name='ipt-port', v-validate='{ required: true }') + span.desc The port on which Wiki.js will listen to. Usually port 80 if connecting directly, or a random port (e.g. 3000) if using a web server in front of it. Set #[strong $(PORT)] to use the PORT environment variable. + .column.is-half + p.control.is-fullwidth + label.label Site Relative Path + input(type='text', placeholder='/', v-model='conf.path', data-vv-scope='general', name='ipt-path', v-validate='{ required: true, min: 1 }') + span.desc The relative path to your wiki. Unless you configure a reverse proxy in front of Wiki.js to handle requests made to a sub-directory, #[strong it is recommended to leave the default value]. + section.columns + .column.is-half + p.control + label.label Site UI Language + select(v-model='conf.lang') + each lg in data.langs + option(value=lg.id)= lg.name + span.desc The language in which navigation, help and other UI elements will be displayed. + .column.is-half + p.control.is-fullwidth + input#ipt-public(type='checkbox', v-model='conf.public', data-vv-scope='general', name='ipt-public') + label.label(for='ipt-public') Public Access + span.desc Should the site be accessible (read only) without login. section p.control.is-fullwidth label.label Local Repository Path input(type='text', placeholder='e.g. ./repo', v-model='conf.pathRepo', data-vv-scope='general', name='ipt-repopath', v-validate='{ required: true, min: 2 }') span.desc The path where the local git repository will be created, used to store content in markdown files and uploads.#[br] #[strong It is recommended to leave the default value]. - section - p.control.is-fullwidth - input#ipt-public(type='checkbox', v-model='conf.public', data-vv-scope='general', name='ipt-public') - label.label(for='ipt-public') Public Access - span.desc Should the site be accessible (read only) without login. .panel-footer .progress-bar: div(v-bind:style='{width: currentProgress}') button.button.is-small.is-light-blue.is-outlined(v-on:click='proceedToSyscheck', v-bind:disabled='loading') Back diff --git a/tools/fuse.js b/tools/fuse.js index 70aede3c..eb3e407d 100644 --- a/tools/fuse.js +++ b/tools/fuse.js @@ -47,10 +47,6 @@ const ALIASES = { 'vue-resource': (dev) ? 'vue-resource/dist/vue-resource.js' : 'vue-resource/dist/vue-resource.es2015.js' } const SHIMS = { - jquery: { - source: '../node_modules/jquery/dist/jquery.js', - exports: '$' - }, diff2html: { source: '../node_modules/diff2html/dist/diff2html.min.js', exports: 'Diff2Html' diff --git a/yarn.lock b/yarn.lock index ee5bbfe9d549ff3860376398ec64794e43020550..efae57f7ad9ac93edc56587d3f5dd2f76e4546ab 100644 GIT binary patch delta 7901 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 delta 7113 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 KmG5Y54*n0xFGL;y