From 2c5acf491e66d49c9cfe9201446b4450d395e8e2 Mon Sep 17 00:00:00 2001 From: Luc Claustres Date: Tue, 27 Aug 2019 23:34:01 +0200 Subject: [PATCH] WIP https://github.com/kalisio/kdk/issues/39 --- mocha.opts | 2 - package.json | 66 +- src/application.js | 20 +- src/client/api.js | 8 +- src/client/components/account/KAccountActivity.vue | 2 +- src/client/components/account/KAccountDZ.vue | 8 +- src/client/components/account/KAccountSecurity.vue | 6 +- src/client/components/account/KIdentityPanel.vue | 2 +- .../components/authentication/KChangeEndpoint.vue | 44 +- src/client/components/authentication/KLogin.vue | 40 +- src/client/components/authentication/KRegister.vue | 78 +- src/client/components/collection/KCard.vue | 6 +- src/client/components/editor/KModalEditor.vue | 4 +- src/client/components/form/KAttachmentField.vue | 28 +- src/client/components/form/KChipsWithIconField.vue | 6 +- src/client/components/form/KForm.vue | 36 +- src/client/components/form/KItemField.vue | 4 +- src/client/components/form/KOptionsField.vue | 2 +- src/client/components/form/KSelectField.vue | 2 +- src/client/components/form/KTagField.vue | 2 +- src/client/components/frame/KBlock.vue | 2 +- src/client/components/frame/KModal.vue | 4 +- src/client/components/frame/KScreen.vue | 2 +- src/client/components/frame/KScreenHeader.vue | 2 +- src/client/components/frame/KTextArea.vue | 2 +- src/client/components/frame/KWidget.vue | 2 +- src/client/components/input/KAutocomplete.vue | 14 +- src/client/components/input/KBtn.vue | 2 +- src/client/components/input/KIconChooser.vue | 20 +- src/client/components/input/KInputFile.vue | 12 +- src/client/components/input/KItemChooser.vue | 16 +- src/client/components/input/KUploader.vue | 2 +- src/client/components/layout/KHome.vue | 2 +- src/client/components/layout/KLayout.vue | 4 +- src/client/components/layout/KLinksPanel.vue | 6 +- src/client/components/layout/KSideNav.vue | 6 +- src/client/components/layout/KTabBar.vue | 10 +- src/client/components/media/KMarkdownViewer.vue | 4 +- src/client/components/media/KMediaBrowser.vue | 4 +- src/client/components/menu/KRadialFab.vue | 4 +- src/client/components/time/KTimeController.vue | 12 +- src/client/components/time/KTimeIndicator.vue | 14 +- src/client/components/time/KTimeInterval.vue | 2 +- src/client/components/time/KTimePointer.vue | 6 +- src/client/guards.js | 4 +- src/client/index.js | 21 +- src/client/mixins/mixin.authentication.js | 58 +- src/client/mixins/mixin.authorisation.js | 4 +- src/client/mixins/mixin.base-activity.js | 6 +- src/client/mixins/mixin.base-collection.js | 20 +- src/client/mixins/mixin.base-context.js | 10 +- src/client/mixins/mixin.base-editor.js | 30 +- src/client/mixins/mixin.base-field.js | 2 +- src/client/mixins/mixin.base-item.js | 4 +- src/client/mixins/mixin.object-proxy.js | 20 +- src/client/mixins/mixin.range-compute.js | 26 +- src/client/mixins/mixin.refs-resolver.js | 2 +- src/client/mixins/mixin.schema-proxy.js | 2 +- src/client/mixins/mixin.service.js | 2 +- src/client/mixins/mixin.version.js | 2 +- src/client/services/local-settings.service.js | 4 +- src/client/store.js | 8 +- src/client/utils.js | 36 +- src/common/index.js | 7 +- src/common/permissions.js | 24 +- src/db.js | 23 + src/hooks/hooks.authorisations.js | 80 +- src/hooks/hooks.model.js | 20 +- src/hooks/hooks.query.js | 32 +- src/hooks/hooks.service.js | 8 +- src/hooks/hooks.storage.js | 24 +- src/hooks/hooks.tags.js | 106 +- src/hooks/hooks.users.js | 34 +- src/index.js | 3 +- src/marshall.js | 6 +- src/models/tags.model.mongodb.js | 2 +- .../authorisations/authorisations.hooks.js | 4 +- .../authorisations/authorisations.service.js | 34 +- src/services/storage/storage.hooks.js | 10 +- src/services/tags/tags.hooks.js | 14 +- src/services/users/users.hooks.js | 12 +- test/config/default.js | 4 +- test/hooks.test.js | 48 +- test/index.test.js | 312 +- test/storage.test.js | 109 +- yarn.lock | 7827 +++----------------- 86 files changed, 1847 insertions(+), 7677 deletions(-) delete mode 100644 mocha.opts diff --git a/mocha.opts b/mocha.opts deleted file mode 100644 index d5a5f30..0000000 --- a/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ ---recursive test/ ---compilers js:babel-core/register \ No newline at end of file diff --git a/package.json b/package.json index 03f2060..8c537cc 100644 --- a/package.json +++ b/package.json @@ -39,17 +39,20 @@ "watch:vue": "cpx src/**/*.vue lib/ --watch", "watch": "npm-run-all --parallel watch:**", "lint": "standard src/**/*.js src/**/*.vue test/**/*.js --fix", - "mocha": "cross-env NODE_CONFIG_DIR=./test/config/ mocha --opts mocha.opts", + "mocha": "cross-env NODE_CONFIG_DIR=./test/config/ mocha --require babel-core/register", "coverage": "cross-env NODE_CONFIG_DIR=./test/config/ node node_modules/istanbul/lib/cli cover node_modules/mocha/bin/_mocha -- --opts mocha.opts", "test": "npm run compile && npm run lint && npm run coverage", "start": "npm run compile && node lib" }, "standard": { - "parser": "babel-eslint", + "parser": "vue-eslint-parser", + "parserOptions": { + "parser": "babel-eslint", + "sourceType": "module" + }, "plugins": [ - "html" + "vue" ], - "sourceType": "module", "env": [ "mocha" ], @@ -76,79 +79,56 @@ "@feathersjs/authentication-jwt": "^2.0.1", "@feathersjs/authentication-local": "^1.2.1", "@feathersjs/authentication-oauth2": "^1.1.0", - "@feathersjs/client": "^3.5.3", "@feathersjs/configuration": "^1.0.2", "@feathersjs/errors": "^3.3.0", "@feathersjs/express": "^1.2.3", - "@feathersjs/feathers": "^3.1.7", + "@feathersjs/feathers": "^3.3.1", "@feathersjs/socketio": "^3.2.2", - "@quasar/extras": "^1.2.0", - "ajv": "^5.2.2", - "ajv-i18n": "2", "aws-sdk": "^2.200.0", "body-parser": "^1.17.1", "casl": "^1.0.3", "compression": "^1.6.2", "cors": "^2.8.1", "dauria": "^2.0.0", - "debug": "^3.1.0", + "debug": "^4.1.0", "express-rate-limit": "^2.11.0", "feathers-blob": "^1.4.0", "feathers-hooks-common": "^3.0.0", "feathers-mongodb": "^2.8.0", - "feathers-reactive": "^0.7.2", - "fs-extra": "^3.0.0", "helmet": "^3.5.0", - "js-yaml": "^3.10.0", "limiter": "^1.1.3", - "lodash": "^4.17.4", - "loglevel": "^1.6.0", - "mime-types-browser": "^0.0.3", - "moment": "^2.22.2", + "lodash": "^4.17.15", + "moment": "^2.24.0", "mongodb": "^2.2.26", "multer": "^1.3.0", "passport-github": "^1.1.0", "passport-google-oauth20": "^2.0.0", "password-generator": "^2.2.0", "password-validator": "^4.0.0", - "quasar": "^1.0.5", - "request": "^2.81.0", "s3-blob-store": "2.1.0", - "showdown": "^1.8.6", - "sift": "^6.0.0", - "socket.io-client": "^2.0.0", - "uberproto": "^1.2.0", - "vue2-dropzone": "^3.5.8", - "winston": "^2.3.1", - "winston-daily-rotate-file": "^1.7.2" + "winston": "^3.2.1", + "winston-daily-rotate-file": "^3.10.0" }, "devDependencies": { - "@quasar/app": "^1.0.4", "babel-cli": "^6.24.1", - "babel-eslint": "^7.2.3", + "babel-eslint": "^10.0.3", "babel-plugin-add-module-exports": "^0.2.1", "babel-plugin-transform-export-extensions": "^6.22.0", "babel-preset-env": "^1.7.0", - "chai": "^3.5.0", + "chai": "^4.2.0", "chai-lint": "^0.1.1", "containerized": "^1.0.2", "cpx": "^1.5.0", - "cross-env": "^4.0.0", - "css-loader": "^0.28.7", - "eslint": "^4.4.1", - "eslint-loader": "^2.1.1", - "eslint-plugin-html": "^3.1.1", - "eslint-plugin-vue": "^5.0.0", - "isomorphic-fetch": "^2.2.1", + "cross-env": "^5.2.0", + "eslint": "^6.1.0", + "eslint-plugin-vue": "^5.2.3", + "fs-extra": "^8.1.0", "istanbul": "^1.1.0-alpha.1", - "jsdom": "^10.1.0", - "jsdom-global": "^3.0.2", - "mocha": "^3.2.0", + "mocha": "^6.2.0", "npm-run-all": "^4.1.1", - "shx": "^0.2.2", - "standard": "^10.0.3", - "strip-ansi": "=3.0.1", - "superagent": "^3.5.2" + "shx": "^0.3.2", + "standard": "^14.0.0", + "superagent": "^5.1.0" }, "peerDependencies": {} } diff --git a/src/application.js b/src/application.js index 15196fa..37c9c32 100644 --- a/src/application.js +++ b/src/application.js @@ -45,7 +45,7 @@ function auth () { app.getPasswordPolicy = function () { // Create on first access, should not be done outside a function because the app has not yet been correctly initialized if (validator) return validator - let { minLength, maxLength, uppercase, lowercase, digits, symbols, noSpaces, prohibited } = config.passwordPolicy + const { minLength, maxLength, uppercase, lowercase, digits, symbols, noSpaces, prohibited } = config.passwordPolicy validator = new PasswordValidator() if (minLength) validator.is().min(minLength) @@ -102,13 +102,13 @@ function auth () { export function declareService (path, app, service, middlewares = {}) { const feathersPath = app.get('apiPath') + '/' + path - let feathersService = app.service(feathersPath) + const feathersService = app.service(feathersPath) // Some internal Feathers service might internally declare the service if (feathersService) { return feathersService } // Initialize our service by providing any middleware as well - let args = [ feathersPath ] + let args = [feathersPath] if (middlewares.before) args = args.concat(middlewares.before) args.push(service) if (middlewares.after) args = args.concat(middlewares.after) @@ -196,7 +196,7 @@ export function createService (name, app, options = {}) { }, options) if (serviceOptions.disabled) return undefined // For DB services a model has to be provided - let fileName = serviceOptions.fileName || name + const fileName = serviceOptions.fileName || name let dbService = false try { @@ -297,16 +297,16 @@ function setupLogger (logsConfig) { console.error('Could not remove default logger transport', error) } // We have one entry per log type - let logsTypes = logsConfig ? Object.getOwnPropertyNames(logsConfig) : [] + const logsTypes = logsConfig ? Object.getOwnPropertyNames(logsConfig) : [] // Create corresponding winston transports with options logsTypes.forEach(logType => { - let options = logsConfig[logType] + const options = logsConfig[logType] // Setup default log level if not defined if (!options.level) { options.level = (process.env.NODE_ENV === 'development' ? 'debug' : 'info') } try { - logger.add(logger.transports[logType], options) + logger.add(new logger.transports[logType](options)) } catch (error) { // Logger might be down, use console console.error('Could not setup default log levels', error) @@ -326,7 +326,7 @@ function setupSockets (app) { const apiLimiter = app.get('apiLimiter') const authConfig = app.get('authentication') const authLimiter = (authConfig ? authConfig.limiter : null) - let connections = {} + const connections = {} let nbConnections = 0 return io => { @@ -380,7 +380,7 @@ function setupSockets (app) { socket.use((packet, next) => { if (packet.length > 0) { // Message are formatted like this 'service_path::service_method' - let pathAndMethod = packet[0].split('::') + const pathAndMethod = packet[0].split('::') if (pathAndMethod.length > 0) { // const servicePath = pathAndMethod[0] debugLimiter(socket.socketLimiter.getTokensRemaining() + ' remaining API token for socket', socket.id, socket.conn.remoteAddress) @@ -421,7 +421,7 @@ function setupSockets (app) { } export function kalisio () { - let app = express(feathers()) + const app = express(feathers()) // By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. // The value can be set to Infinity (or 0) to indicate an unlimited number of listeners. app.setMaxListeners(0) diff --git a/src/client/api.js b/src/client/api.js index b708c49..528ef1d 100644 --- a/src/client/api.js +++ b/src/client/api.js @@ -38,7 +38,7 @@ function siftMatcher (originalQuery) { } export function kalisio () { - let api = feathers() + const api = feathers() // Setup our interface // ------------------- @@ -80,7 +80,7 @@ export function kalisio () { } api.getService = function (name, context) { const path = api.getServicePath(name, context) - let service = api.service(path) + const service = api.service(path) if (!service) { throw new Error('Cannot retrieve service ' + name + ' for context ' + (typeof context === 'object' ? context._id : context)) } @@ -145,7 +145,7 @@ export function kalisio () { } api.can = function (operation, service, context, resource) { - let abilities = Store.get('user.abilities') + const abilities = Store.get('user.abilities') logger.debug('Check for abilities ', operation, service, context, resource, abilities) if (!abilities) { logger.debug('Access denied without abilities') @@ -177,7 +177,7 @@ export function kalisio () { } else { logger.setLevel('info') } - let origin = api.getBaseUrl() + const origin = api.getBaseUrl() if (config.transport === 'http') { api.configure(feathers.rest(origin).fetch(window.fetch.bind(window))) } else { diff --git a/src/client/components/account/KAccountActivity.vue b/src/client/components/account/KAccountActivity.vue index 2a94385..1028a9b 100644 --- a/src/client/components/account/KAccountActivity.vue +++ b/src/client/components/account/KAccountActivity.vue @@ -81,4 +81,4 @@ export default { this.$events.$off('user-changed', this.refreshAccount) } } - \ No newline at end of file + diff --git a/src/client/components/account/KAccountDZ.vue b/src/client/components/account/KAccountDZ.vue index 756740b..4df84dd 100644 --- a/src/client/components/account/KAccountDZ.vue +++ b/src/client/components/account/KAccountDZ.vue @@ -1,7 +1,7 @@