diff --git a/CHANGELOG.md b/CHANGELOG.md index 592a7dd3..674ea891 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,20 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [v1.0.0-beta.14] - Unreleased +## [v1.0.1] - Unreleased ### Added - **History**: History section to list all changes - **Security**: Optional Two-Factor Authentication (2FA) protection +## [v1.0.0] - Unreleased +### Changed +- **Misc**: Switch to Yarn for npm dependencies installation + +### Fixed +- **Misc**: JS/CSS is now loading properly in Safari (macOS/iOS) +- **Misc**: Process termination handling +- **Search**: siteRoot is now properly parsed in search results href + ## [v1.0.0-beta.13] - 2017-07-09 ### Added - **Admin**: Added Host Information section to System Info page diff --git a/README.md b/README.md index e4ba5dd7..cecddceb 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,11 @@ Current and upcoming milestones *(major features only, see the [changelog](https - [x] Render line breaks by default (GitHub style) - [x] New Localization: German -### Beta 14 +### 1.0.0 + +- [x] Bug fixes release + +### 1.1.0 > *Planned for August release* ![Progress](http://progressed.io/bar/20) diff --git a/client/js/components/search.vue b/client/js/components/search.vue index cb6c45f0..5c97ce38 100644 --- a/client/js/components/search.vue +++ b/client/js/components/search.vue @@ -10,7 +10,7 @@ li(v-if='searchres.length === 0') a: em {{ $t('search.nomatch') }} li(v-for='sres in searchres', v-bind:class='{ "is-active": searchmovekey === "res." + sres.entryPath }') - a(v-bind:href='siteRoot + "/" + sres.entryPath') {{ sres.title }} + a(v-bind:href='sres.entryPath') {{ sres.title }} p.searchresults-label(v-if='searchsuggest.length > 0') {{ $t('search.didyoumean') }} ul.searchresults-list(v-if='searchsuggest.length > 0') li(v-for='sug in searchsuggest', v-bind:class='{ "is-active": searchmovekey === "sug." + sug }') @@ -39,7 +39,10 @@ export default { self.searchactive = true self.searchload++ socket.emit('search', { terms: val }, (data) => { - self.searchres = data.match + self.searchres = self._.map(data.match, m => { + m.entryPath = `${siteRoot}/${m.entryPath}` + return m + }) self.searchsuggest = data.suggest self.searchmovearr = self._.concat([], self.searchres, self.searchsuggest) if (self.searchload > 0) { self.searchload-- } @@ -74,7 +77,7 @@ export default { let i = this.searchmoveidx - 1 if (this.searchmovearr[i]) { - window.location.assign(siteRoot + '/' + this.searchmovearr[i].entryPath) + window.location.assign(this.searchmovearr[i].entryPath) } else { this.searchq = this.searchmovearr[i] } diff --git a/fuse.js b/fuse.js index ea6a7309..76143cbd 100644 --- a/fuse.js +++ b/fuse.js @@ -9,6 +9,9 @@ const colors = require('colors/safe') const fsbx = require('fuse-box') const nodemon = require('nodemon') +const babel = require('babel-core') +const uglify = require('uglify-es') +const fs = require('fs-extra') // ====================================================== // Parse cmd arguments @@ -90,7 +93,7 @@ globalTasks.then(() => { fsbx.VuePlugin(), ['.scss', fsbx.SassPlugin({ outputStyle: (dev) ? 'nested' : 'compressed' }), fsbx.CSSPlugin()], fsbx.BabelPlugin({ comments: false, presets: ['es2015'] }), - fsbx.JSONPlugin(), + fsbx.JSONPlugin() /* !dev && fsbx.QuantumPlugin({ target: 'browser', uglify: true, @@ -109,7 +112,7 @@ globalTasks.then(() => { }) } }) */ - !dev && fsbx.UglifyESPlugin() + // !dev && fsbx.UglifyESPlugin() ], debug: false, log: true @@ -140,6 +143,46 @@ globalTasks.then(() => { watch: (args.d) ? ['server'] : ['server/configure.js'], env: { 'NODE_ENV': 'development' } }) + } else { + console.info(colors.yellow.bold('\nTranspiling vendor bundle...')) + let appCode = babel.transform(fs.readFileSync('./assets/js/app.js', 'utf8'), { + babelrc: false, + compact: false, + filename: 'app.js', + plugins: ['transform-object-assign'] + }).code + let vendorCode = babel.transform(fs.readFileSync('./assets/js/vendor.js', 'utf8'), { + babelrc: false, + comments: false, + compact: false, + filename: 'vendor.js', + plugins: [ + 'transform-es2015-arrow-functions', + 'transform-es2015-block-scoped-functions', + 'transform-es2015-block-scoping', + 'transform-es2015-classes', + 'transform-es2015-computed-properties', + 'transform-es2015-destructuring', + 'transform-es2015-duplicate-keys', + 'transform-es2015-for-of', + 'transform-es2015-function-name', + 'transform-es2015-literals', + 'transform-es2015-object-super', + 'transform-es2015-parameters', + 'transform-es2015-shorthand-properties', + 'transform-es2015-spread', + 'transform-es2015-sticky-regex', + 'transform-es2015-template-literals', + 'transform-es2015-typeof-symbol', + 'transform-es2015-unicode-regex' + ] + }).code + console.info(colors.yellow.bold('Minifing bundles...')) + fs.writeFileSync('./assets/js/vendor.js', uglify.minify(vendorCode).code, 'utf8') + fs.writeFileSync('./assets/js/app.js', uglify.minify(appCode).code, 'utf8') + fs.writeFileSync('./assets/js/configure.js', uglify.minify(fs.readFileSync('./assets/js/configure.js', 'utf8')).code, 'utf8') + console.info(colors.green.bold('\nBUILD SUCCEEDED.')) + return true } }).catch(err => { console.error(colors.red(' X Bundle compilation failed! ' + err.message)) diff --git a/npm/install.js b/npm/install.js index 2c4de41a..19df66f0 100644 --- a/npm/install.js +++ b/npm/install.js @@ -138,12 +138,24 @@ const tasks = { } }) }, + /** + * Install Yarn + */ + installYarn() { + ora.text = 'Installing Yarn...' + return exec.stdout('npm', ['install', '-g', 'yarn'], { + cwd: installDir + }).then(results => { + ora.text = 'Yarn installed successfully.' + return true + }) + }, /** * Install npm dependencies */ installDependencies() { ora.text = 'Installing Wiki.js npm dependencies...' - return exec.stdout('npm', ['install', '--only=production', '--no-optional'], { + return exec.stdout('yarn', ['install', '--production', '--ignore-optional'], { cwd: installDir }).then(results => { ora.text = 'Wiki.js npm dependencies installed successfully.' @@ -247,6 +259,9 @@ Promise.join( }).then(() => { isContainerBased && console.info('>> Creating config file...') return tasks.ensureConfigFile() +}).then(() => { + isContainerBased && console.info('>> Installing Yarn...') + return tasks.installYarn() }).then(() => { isContainerBased && console.info('>> Installing dependencies...') return tasks.installDependencies() diff --git a/npm/package-lock.json b/npm/package-lock.json index 824f1497..568100e2 100644 Binary files a/npm/package-lock.json and b/npm/package-lock.json differ diff --git a/npm/package.json b/npm/package.json index 5b74e10f..af5d0c70 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { "name": "wiki.js", - "version": "1.0.0-beta.13.2", + "version": "1.0.1", "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown", "main": "install.js", "scripts": { diff --git a/package.json b/package.json index b74fdc56..b47b4a0a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "wiki", - "version": "1.0.0-beta.13", + "version": "1.0.1", "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown", - "main": "server.js", + "main": "wiki.js", "scripts": { "start": "node wiki start", "stop": "node wiki stop", @@ -37,7 +37,7 @@ "node": ">=4.6" }, "dependencies": { - "auto-load": "~2.1.0", + "auto-load": "~3.0.0", "axios": "~0.16.2", "bcryptjs-then": "~1.0.1", "bluebird": "~3.5.0", @@ -46,7 +46,7 @@ "cheerio": "~1.0.0-rc.2", "child-process-promise": "~2.2.1", "chokidar": "~1.7.0", - "compression": "~1.6.2", + "compression": "~1.7.0", "connect-flash": "~0.1.1", "connect-mongo": "~1.3.2", "cookie-parser": "~1.4.3", @@ -60,7 +60,7 @@ "file-type": "~5.2.0", "filesize.js": "~1.0.2", "follow-redirects": "~1.2.4", - "fs-extra": "~3.0.1", + "fs-extra": "~4.0.0", "git-wrapper2-promise": "~0.2.9", "highlight.js": "~9.12.0", "i18next": "~8.4.3", @@ -89,7 +89,7 @@ "moment": "~2.18.1", "moment-timezone": "~0.5.13", "mongodb": "~2.2.30", - "mongoose": "^4.11.1", + "mongoose": "~4.11.1", "multer": "~1.3.0", "node-2fa": "~1.1.2", "node-graceful": "~0.2.3", @@ -104,13 +104,13 @@ "passport-slack": "0.0.7", "passport-windowslive": "~1.0.2", "passport.socketio": "~3.7.0", - "pm2": "~2.5.0", + "pm2": "~2.6.1", "pug": "~2.0.0-rc.2", "read-chunk": "~2.0.0", "remove-markdown": "~0.2.0", "request": "~2.81.0", "search-index-adder": "~0.3.9", - "search-index-searcher": "~0.2.8", + "search-index-searcher": "~0.2.10", "semver": "~5.3.0", "serve-favicon": "~2.4.3", "simplemde": "~1.11.2", @@ -125,21 +125,22 @@ "yargs": "~8.0.1" }, "devDependencies": { - "@glimpse/glimpse": "~0.21.5", + "@glimpse/glimpse": "~0.22.13", "@panter/vue-i18next": "~0.5.0", "babel-cli": "~6.24.1", "babel-jest": "~20.0.3", + "babel-plugin-transform-object-assign": "~6.22.0", "babel-preset-es2015": "~6.24.1", "brace": "~0.10.0", "colors": "~1.1.2", "consolidate": "~0.14.5", - "eslint": "~4.1.1", + "eslint": "~4.3.0", "eslint-config-standard": "~10.2.1", "eslint-plugin-import": "~2.7.0", "eslint-plugin-node": "~5.1.0", "eslint-plugin-promise": "~3.5.0", "eslint-plugin-standard": "~3.0.1", - "fuse-box": "~2.2.0", + "fuse-box": "~2.2.1", "i18next-xhr-backend": "~1.4.2", "jest": "~20.0.4", "jquery": "~3.2.1", @@ -156,11 +157,11 @@ "typescript": "~2.4.1", "uglify-es": "~3.0.24", "vee-validate": "~2.0.0-rc.6", - "vue": "~2.3.4", + "vue": "~2.4.2", "vue-clipboards": "~1.0.2", "vue-lodash": "~1.0.3", "vue-resource": "~1.3.4", - "vue-template-compiler": "~2.3.4", + "vue-template-compiler": "~2.4.2", "vue-template-es2015-compiler": "~1.5.3", "vuex": "~2.3.1" }, diff --git a/tsconfig.json b/tsconfig.json index 68aba21a..20c43b30 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,5 +11,11 @@ "strictNullChecks": true, "suppressImplicitAnyIndexErrors": true, "target": "es5" - } + }, + "exclude": [ + ".fusebox", + "data", + "node_modules", + "repo" + ] } diff --git a/yarn.lock b/yarn.lock index 1163b817..60ff1355 100644 Binary files a/yarn.lock and b/yarn.lock differ