From 5594b32477cf5d21d85219d7d938220d93a14c49 Mon Sep 17 00:00:00 2001 From: Lionel Bijaoui Date: Fri, 24 Aug 2018 18:39:19 +0200 Subject: [PATCH 1/7] Rework on validation and events to allow for a more flexible structure Use an event bus for most events Breaking: validate is a promise since now all validation is asynchronous --- dev/projects/basic/app.vue | 3 +- dev/projects/full/app.vue | 42 +-- dev/projects/full/schema.js | 48 +-- package-lock.json | 578 +++++++++++++++----------------- package.json | 21 +- src/event-bus.js | 2 + src/fields/abstractField.js | 38 ++- src/fields/core/fieldSubmit.vue | 18 +- src/formGenerator.vue | 157 +++++---- src/formGroup.vue | 28 +- src/formMixin.js | 14 +- src/index.js | 2 + 12 files changed, 470 insertions(+), 481 deletions(-) create mode 100644 src/event-bus.js diff --git a/dev/projects/basic/app.vue b/dev/projects/basic/app.vue index 40a32d19..31f5431a 100644 --- a/dev/projects/basic/app.vue +++ b/dev/projects/basic/app.vue @@ -97,8 +97,7 @@ export default { formOptions: { validateAfterLoad: true, - validateAfterChanged: true, - validateBeforeSave: true + validateAfterChanged: true } }; }, diff --git a/dev/projects/full/app.vue b/dev/projects/full/app.vue index ba4c898d..cbc5b439 100644 --- a/dev/projects/full/app.vue +++ b/dev/projects/full/app.vue @@ -75,8 +75,7 @@ export default { formOptions: { validateAfterLoad: true, - validateAfterChanged: true, - validateBeforeSave: true + validateAfterChanged: true } }; }, @@ -118,7 +117,7 @@ export default { }, onValidated(res, errors) { - console.log("VFG validated:", res, errors); + console.log("onValidated VFG validated:", arguments, res, errors); }, generateModel() { @@ -145,24 +144,28 @@ export default { }, saveModel() { - console.log("Save model..."); - if (this.formOptions.validateBeforeSave === false || this.validate()) { - this.mergeModelValues(); - - if (this.isNewModel) { - this.rows.push(this.model); - this.selectRow(null, this.model, false); + console.log("Save model...", this.validate, typeof this.validate); + this.validate().then( + (test) => { + console.log("saveModel", test); + this.mergeModelValues(); + + if (this.isNewModel) { + this.rows.push(this.model); + this.selectRow(null, this.model, false); + } + }, + (error) => { + // Validation error + console.warn("Error saving model...", error); } - } else { - console.warn("Error saving model..."); - // Validation error - } + ); }, mergeModelValues() { let model = this.model; if (model && this.selected.length > 0) { - each(this.selected, row => { + each(this.selected, (row) => { merge(row, model); }); } @@ -170,7 +173,7 @@ export default { deleteModel() { if (this.selected.length > 0) { - each(this.selected, row => { + each(this.selected, (row) => { let index = this.rows.indexOf(row); this.rows.splice(index, 1); }); @@ -181,7 +184,7 @@ export default { getNextID() { let id = 0; - each(this.rows, row => { + each(this.rows, (row) => { if (row.id > id) id = row.id; }); @@ -189,7 +192,8 @@ export default { }, validate() { - // console.log("validate", this.$refs.form, this.$refs.form.validate()); + console.log("APP validate", this.$refs.form, typeof this.$refs.form.validate); + return this.$refs.form.validate(); }, @@ -199,7 +203,7 @@ export default { getLocation(model) { if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(pos => { + navigator.geolocation.getCurrentPosition((pos) => { if (!model.address) model.address = {}; if (!model.address.geo) model.address.geo = {}; model.address.geo.latitude = pos.coords.latitude.toFixed(5); diff --git a/dev/projects/full/schema.js b/dev/projects/full/schema.js index 10bc44a9..3ba4aa64 100644 --- a/dev/projects/full/schema.js +++ b/dev/projects/full/schema.js @@ -461,30 +461,30 @@ export default { } ] }, - { - type: "staticMap", - model: "address.geo", - label: "Map", - visible: false, - fieldOptions: { - lat: "latitude", - lng: "longitude", - zoom: 6, - sizeX: 640, - sizeY: 640, - scale: 1, - format: "png", - // maptype:"satellite", - language: "FR-fr", - // region: - markers: "color:blue%7Clabel:S%7C43.107733,4.541936" - // path: - // visible: - // style:"feature:road.highway%7Celement:labels.text.stroke%7Cvisibility:on%7Ccolor:0xb06eba&style=feature:road.highway%7Celement:labels.text.fill%7Cvisibility:on%7Ccolor:0xffffff", - // key: - // signature: - } - }, + // { + // type: "staticMap", + // model: "address.geo", + // label: "Map", + // visible: false, + // fieldOptions: { + // lat: "latitude", + // lng: "longitude", + // zoom: 6, + // sizeX: 640, + // sizeY: 640, + // scale: 1, + // format: "png", + // // maptype:"satellite", + // language: "FR-fr", + // // region: + // markers: "color:blue%7Clabel:S%7C43.107733,4.541936" + // // path: + // // visible: + // // style:"feature:road.highway%7Celement:labels.text.stroke%7Cvisibility:on%7Ccolor:0xb06eba&style=feature:road.highway%7Celement:labels.text.fill%7Cvisibility:on%7Ccolor:0xffffff", + // // key: + // // signature: + // } + // }, { type: "switch", model: "status", diff --git a/package-lock.json b/package-lock.json index f93aa73a..bd73b1be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,24 +13,51 @@ "@babel/highlight": "7.0.0-beta.44" } }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "2.5.1", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "@babel/helper-function-name": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.36.tgz", - "integrity": "sha512-/SGPOyifPf20iTrMN+WdlY2MbKa7/o4j7B/4IAsdOusASp2icT+Wcdjf4tjJHaXNX8Pe9bpgVxLNxhRvcf8E5w==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.36", - "@babel/template": "7.0.0-beta.36", - "@babel/types": "7.0.0-beta.36" + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.36.tgz", - "integrity": "sha512-vPPcx2vsSoDbcyWr9S3nd0FM3B4hEXnt0p1oKpwa08GwK0fSRxa98MyaRGf8suk8frdQlG1P3mDrz5p/Rr3pbA==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", "dev": true, "requires": { - "@babel/types": "7.0.0-beta.36" + "@babel/types": "7.0.0-beta.44" } }, "@babel/helper-module-imports": { @@ -62,6 +89,15 @@ } } }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, "@babel/highlight": { "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", @@ -111,118 +147,49 @@ "dev": true }, "@babel/template": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.36.tgz", - "integrity": "sha512-mUBi90WRyZ9iVvlWLEdeo8gn/tROyJdjKNC4W5xJTSZL+9MS89rTJSqiaJKXIkxk/YRDL/g/8snrG/O0xl33uA==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.36", - "@babel/types": "7.0.0-beta.36", - "babylon": "7.0.0-beta.36", + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", "lodash": "4.17.10" }, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz", - "integrity": "sha512-sW77BFwJ48YvQp3Gzz5xtAUiXuYOL2aMJKDwiaY3OcvdqBFurtYfOpSa4QrNyDxmOGRFSYzUpabU2m9QrlWE7w==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, "babylon": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz", - "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } } } }, "@babel/traverse": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.36.tgz", - "integrity": "sha512-OTUb6iSKVR/98dGThRJ1BiyfwbuX10BVnkz89IpaerjTPRhDfMBfLsqmzxz5MiywUOW4M0Clta0o7rSxkfcuzw==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.36", - "@babel/helper-function-name": "7.0.0-beta.36", - "@babel/types": "7.0.0-beta.36", - "babylon": "7.0.0-beta.36", + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", "debug": "3.1.0", "globals": "11.7.0", "invariant": "2.2.4", "lodash": "4.17.10" }, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz", - "integrity": "sha512-sW77BFwJ48YvQp3Gzz5xtAUiXuYOL2aMJKDwiaY3OcvdqBFurtYfOpSa4QrNyDxmOGRFSYzUpabU2m9QrlWE7w==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, "babylon": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz", - "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -237,22 +204,13 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } } } }, "@babel/types": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.36.tgz", - "integrity": "sha512-PyAORDO9um9tfnrddXgmWN9e6Sq9qxraQIt5ynqBOSXKA5qvK1kUr+Q3nSzKFdzorsiK+oqcUnAFvEoKxv9D+Q==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", "dev": true, "requires": { "esutils": "2.0.2", @@ -507,10 +465,16 @@ } } }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "align-text": { @@ -905,17 +869,82 @@ "dev": true }, "autoprefixer": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.3.tgz", - "integrity": "sha512-KkQyCHBxma7R2eoEkjja/RHUBw+Fc1nY46LdV62fzJI5D7i8mLLCtAZ/AVR3UbXhDZ8mUz4C/PF4lZrbiHa1ZQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.1.tgz", + "integrity": "sha512-Q/2zhVEglXXCBNCOFfnihQcQystPYJt4GrIopeWhPjFxRPXya8eOstB89AafW0nWhSscByp+rSXp9EE5X4zgXQ==", "dev": true, "requires": { - "browserslist": "3.2.8", - "caniuse-lite": "1.0.30000856", + "browserslist": "4.0.2", + "caniuse-lite": "1.0.30000877", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "6.0.22", + "postcss": "7.0.2", "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "browserslist": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.0.2.tgz", + "integrity": "sha512-lpujC4zv1trcKUUwfD4pFVNga4YSpB3sLB+/I+A8gvGQxno1c0dMB2aCQy0FE5oUNIDjD9puFiFF0zeS6Ji48w==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000877", + "electron-to-chromium": "1.3.58", + "node-releases": "1.0.0-alpha.11" + } + }, + "caniuse-lite": { + "version": "1.0.30000877", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000877.tgz", + "integrity": "sha512-h04kV/lcuhItU1CZTJOxUEk/9R+1XeJqgc67E+XC8J9TjPM8kzVgOn27ZtRdDUo8O5F8U4QRCzDWJrVym3w3Cg==", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "electron-to-chromium": { + "version": "1.3.58", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.58.tgz", + "integrity": "sha512-AGJxlBEn2wOohxqWZkISVsOjZueKTQljfEODTDSEiMqSpH0S+xzV+/5oEM9AGaqhu7DzrpKOgU7ocQRjj0nJmg==", + "dev": true + }, + "postcss": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.2.tgz", + "integrity": "sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.4.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } } }, "aws-sign2": { @@ -993,64 +1022,24 @@ } }, "babel-eslint": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.1.tgz", - "integrity": "sha512-RzdVOyWKQRUnLXhwLk+eKb4oyW+BykZSkpYwFhM4tnfzAG5OWfvG0w/uyzMp5XKEU0jN82+JefHr39bG2+KhRQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.36", - "@babel/traverse": "7.0.0-beta.36", - "@babel/types": "7.0.0-beta.36", - "babylon": "7.0.0-beta.36", + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", "eslint-scope": "3.7.1", "eslint-visitor-keys": "1.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz", - "integrity": "sha512-sW77BFwJ48YvQp3Gzz5xtAUiXuYOL2aMJKDwiaY3OcvdqBFurtYfOpSa4QrNyDxmOGRFSYzUpabU2m9QrlWE7w==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, "babylon": { - "version": "7.0.0-beta.36", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz", - "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ==", + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } } } }, @@ -2959,9 +2948,9 @@ } }, "cleave.js": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/cleave.js/-/cleave.js-1.4.2.tgz", - "integrity": "sha512-m3Yv7yyuy4W2sUGCdge0IUkJ1PnGk6wuCgbfjxUlfZWzT5pF0OIpggk/xhjBjXTItPnOy/E4+i3w8h903+zK9g==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cleave.js/-/cleave.js-1.4.3.tgz", + "integrity": "sha512-nlCVcz/P33Ic37kYpbei9Jxqvo2T+eAF5Za3+61MCmQh2XmlXGp9rx2RnVJ3xWUDhIjTR5rLNVu70jqiDBWX/w==", "dev": true }, "cli-boxes": { @@ -3197,18 +3186,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", @@ -4985,30 +4962,30 @@ } }, "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.3.0.tgz", + "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", "dev": true, "requires": { - "ajv": "5.5.2", + "ajv": "6.5.2", "babel-code-frame": "6.26.0", "chalk": "2.4.1", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", + "cross-spawn": "6.0.5", "debug": "3.1.0", "doctrine": "2.1.0", - "eslint-scope": "3.7.1", + "eslint-scope": "4.0.0", + "eslint-utils": "1.3.1", "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", + "espree": "4.0.0", "esquery": "1.0.1", "esutils": "2.0.2", "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "11.5.0", - "ignore": "3.3.8", + "globals": "11.7.0", + "ignore": "4.0.6", "imurmurhash": "0.1.4", - "inquirer": "3.3.0", + "inquirer": "5.2.0", "is-resolvable": "1.1.0", "js-yaml": "3.12.0", "json-stable-stringify-without-jsonify": "1.0.1", @@ -5021,25 +4998,23 @@ "path-is-inside": "1.0.2", "pluralize": "7.0.0", "progress": "2.0.0", - "regexpp": "1.1.0", + "regexpp": "2.0.0", "require-uncached": "1.0.3", - "semver": "5.4.1", + "semver": "5.5.0", + "string.prototype.matchall": "2.0.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "4.0.2", + "table": "4.0.3", "text-table": "0.2.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "acorn": "5.7.1" } }, "ansi-regex": { @@ -5068,17 +5043,6 @@ "supports-color": "5.4.0" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -5088,28 +5052,38 @@ "ms": "2.0.0" } }, - "esprima": { + "eslint-scope": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", - "dev": true + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "espree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "acorn": "5.7.1", + "acorn-jsx": "4.1.1" } }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -8253,9 +8227,9 @@ "dev": true }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "import-lazy": { @@ -8339,9 +8313,9 @@ } }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { "ansi-escapes": "3.1.0", @@ -8353,8 +8327,7 @@ "lodash": "4.17.10", "mute-stream": "0.0.7", "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", + "rxjs": "5.5.11", "string-width": "2.1.1", "strip-ansi": "4.0.0", "through": "2.3.8" @@ -11060,6 +11033,15 @@ "vm-browserify": "0.0.4" } }, + "node-releases": { + "version": "1.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.11.tgz", + "integrity": "sha512-CaViu+2FqTNYOYNihXa5uPS/zry92I3vPU4nCB6JB3OeZ2UGtOpF5gRwuN4+m3hbEcL47bOXyun1jX2iC+3uEQ==", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, "node-sass": { "version": "4.9.3", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", @@ -16000,10 +15982,19 @@ } } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "1.1.2" + } + }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", + "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", "dev": true }, "regexpu-core": { @@ -16366,19 +16357,13 @@ "is-promise": "2.1.0" } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", "dev": true, "requires": { - "rx-lite": "4.0.8" + "symbol-observable": "1.0.1" } }, "safe-buffer": { @@ -17315,6 +17300,19 @@ "strip-ansi": "3.0.1" } }, + "string.prototype.matchall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", + "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.12.0", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "regexp.prototype.flags": "1.2.0" + } + }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", @@ -17396,6 +17394,12 @@ } } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", @@ -17403,31 +17407,19 @@ "dev": true }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", "chalk": "2.4.1", "lodash": "4.17.10", "slice-ansi": "1.0.0", "string-width": "2.1.1" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -17839,12 +17831,6 @@ } } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -18098,40 +18084,24 @@ "dev": true }, "url-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.0.1.tgz", - "integrity": "sha512-rAonpHy7231fmweBKUFe0bYnlGDty77E+fm53NZdij7j/YOpyGzc7ttqG1nAXl3aRs0k41o0PC3TvGXQiw2Zvw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.1.tgz", + "integrity": "sha512-vugEeXjyYFBCUOpX+ZuaunbK3QXMKaQ3zUnRfIpRBlGkY7QizCnzyyn2ASfcxsvyU3ef+CJppVywnl3Kgf13Gg==", "dev": true, "requires": { "loader-utils": "1.1.0", "mime": "2.3.1", - "schema-utils": "0.4.5" + "schema-utils": "1.0.0" }, "dependencies": { - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { "ajv": "6.5.2", + "ajv-errors": "1.0.0", "ajv-keywords": "3.2.0" } } diff --git a/package.json b/package.json index ca48762c..6da721c6 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ "devDependencies": { "@vue/test-utils": "1.0.0-beta.24", "ajv": "6.5.2", - "autoprefixer": "8.6.3", + "autoprefixer": "9.1.1", "babel-core": "6.26.3", - "babel-eslint": "8.2.1", + "babel-eslint": "8.2.6", "babel-loader": "7.1.5", "babel-plugin-istanbul": "4.1.6", "babel-plugin-lodash": "3.3.4", @@ -59,13 +59,13 @@ "bumped": "0.10.10", "bumped-terminal": "0.7.5", "chai": "4.1.2", - "cleave.js": "1.4.2", + "cleave.js": "1.4.3", "conventional-changelog-cli": "2.0.1", "coveralls": "3.0.2", "cross-env": "5.2.0", "css-loader": "0.28.11", "eonasdan-bootstrap-datetimepicker": "4.17.47", - "eslint": "4.19.1", + "eslint": "5.3.0", "eslint-config-prettier": "3.0.1", "eslint-friendly-formatter": "4.0.1", "eslint-loader": "2.1.0", @@ -103,7 +103,7 @@ "sinon-chai": "3.2.0", "spectrum-colorpicker": "1.8.0", "stats-webpack-plugin": "0.6.2", - "url-loader": "1.0.1", + "url-loader": "1.1.1", "vue": "2.5.17", "vue-loader": "14.2.2", "vue-multiselect": "2.1.0", @@ -130,16 +130,7 @@ "bracketSpacing": true, "semi": true, "useTabs": true, - "arrowParens": "always", - "overrides": [ - { - "files": "*.yml", - "options": { - "tabWidth": 2, - "useTabs": false - } - } - ] + "arrowParens": "always" }, "nyc": { "include": [ diff --git a/src/event-bus.js b/src/event-bus.js new file mode 100644 index 00000000..1132baf0 --- /dev/null +++ b/src/event-bus.js @@ -0,0 +1,2 @@ +import Vue from "vue"; +export const eventBus = new Vue(); diff --git a/src/fields/abstractField.js b/src/fields/abstractField.js index 7096e322..3193ddf5 100644 --- a/src/fields/abstractField.js +++ b/src/fields/abstractField.js @@ -1,6 +1,7 @@ import { get as objGet, forEach, isFunction, isString, isArray, debounce, isNil } from "lodash"; import validators from "../utils/validators"; import { slugifyFormID } from "../utils/schema"; +import { eventBus } from "../event-bus.js"; const convertValidator = (validator) => { if (isString(validator)) { @@ -33,10 +34,7 @@ export default { type: Object }, formOptions: { - type: [Object, Function], - default: () => { - return {}; - } + type: Object } }, @@ -118,12 +116,11 @@ export default { return field[option]; } }, - validate(calledParent) { + validate() { this.clearValidationErrors(); let validateAsync = objGet(this.formOptions, "validateAsync", false); let results = []; - // console.log("validate", this.schema.readonly); if ( this.schema.validator && @@ -150,8 +147,9 @@ export default { if (err) { this.errors = this.errors.concat(err); } - let isValid = this.errors.length === 0; - this.$emit("validated", isValid, this.errors, this); + // let isValid = this.errors.length === 0; + // this.$emit("validated", isValid, this.errors, this); + // eventBus.$emit("validated", isValid, this.errors, this); }); } else if (result) { results = results.concat(result); @@ -174,10 +172,9 @@ export default { } let isValid = fieldErrors.length === 0; - if (!calledParent) { - this.$emit("validated", isValid, fieldErrors, this); - } + this.errors = fieldErrors; + eventBus.$emit("field-validated", isValid, fieldErrors, this._uid); return fieldErrors; }; @@ -192,7 +189,7 @@ export default { if (!isFunction(this.debouncedValidateFunc)) { this.debouncedValidateFunc = debounce( this.validate.bind(this), - objGet(this, "$parent.options.validateDebounceTime", 500) + objGet(this.formOptions, "validateDebounceTime", 500) ); } this.debouncedValidateFunc(); @@ -209,14 +206,13 @@ export default { } if (changed) { - this.$emit("model-updated", newValue, this.schema.model); + eventBus.$emit("model-updated", newValue, this.schema.model); if (isFunction(this.schema.onChanged)) { this.schema.onChanged.call(this, this.model, newValue, oldValue, this.schema); } - - if (objGet(this.$parent, "options.validateAfterChanged", false) === true) { - if (objGet(this.$parent, "options.validateDebounceTime", 0) > 0) { + if (objGet(this.formOptions, "validateAfterChanged", false)) { + if (objGet(this.formOptions, "validateDebounceTime", 500) > 0) { this.debouncedValidate(); } else { this.validate(); @@ -274,6 +270,11 @@ export default { return value; } }, + created() { + eventBus.$on("clear-validation-errors", this.clearValidationErrors); + eventBus.$on("validate-fields", this.validate); + eventBus.$emit("field-registering"); + }, mounted() { const diff = function(a, b) { return b.filter(function(i) { @@ -321,5 +322,10 @@ export default { console.log("diff", result, this.schema.type, this.schema.model); } } + }, + beforeDestroy() { + eventBus.$off("clear-validation-errors"); + eventBus.$off("validate-fields"); + eventBus.$emit("field-deregistering", this); } }; diff --git a/src/fields/core/fieldSubmit.vue b/src/fields/core/fieldSubmit.vue index a6f6ca0c..4a823242 100644 --- a/src/fields/core/fieldSubmit.vue +++ b/src/fields/core/fieldSubmit.vue @@ -4,6 +4,7 @@ diff --git a/src/formGroup.vue b/src/formGroup.vue index f38ad812..f8cc93f9 100644 --- a/src/formGroup.vue +++ b/src/formGroup.vue @@ -9,7 +9,7 @@
- +
@@ -17,8 +17,8 @@
-
- +
+
@@ -27,6 +27,7 @@ import { get as objGet, isNil } from "lodash"; import { slugifyFormID } from "./utils/schema"; import formMixin from "./formMixin.js"; import fieldComponents from "./utils/fieldsLoader.js"; +// import { eventBus } from "./event-bus.js"; export default { name: "form-group", @@ -78,28 +79,15 @@ export default { return "field-" + fieldSchema.type; }, // Child field executed validation - onFieldValidated(res, errors, field) { - this.$emit("validated", res, errors, field); - }, + // onFieldValidated(res, errors, field) { + // this.$emit("validated", res, errors, field); + // // eventBus.$emit("validated", res, errors, field); + // }, buttonVisibility(field) { return field.buttons && field.buttons.length > 0; }, buttonClickHandler(btn, field, event) { return btn.onclick.call(this, this.model, field, event, this); - }, - fieldErrors(field) { - return this.errors.filter((e) => e.field === field).map((item) => item.error); - }, - onModelUpdated(newVal, schema) { - this.$emit("model-updated", newVal, schema); - }, - validate(calledParent) { - return this.$refs.child.validate(calledParent); - }, - clearValidationErrors() { - if (this.$refs.child) { - return this.$refs.child.clearValidationErrors(); - } } } }; diff --git a/src/formMixin.js b/src/formMixin.js index 2a4aa700..b34248c9 100644 --- a/src/formMixin.js +++ b/src/formMixin.js @@ -4,7 +4,7 @@ export default { methods: { // Get style classes of field getFieldRowClasses(field) { - const hasErrors = this.fieldErrors(field).length > 0; + const hasErrors = this.fieldErrors().length > 0; let baseClasses = { [objGet(this.options, "validationErrorClass", "error")]: hasErrors, [objGet(this.options, "validationSuccessClass", "valid")]: !hasErrors, @@ -28,8 +28,16 @@ export default { return baseClasses; }, fieldErrors(field) { - let res = this.errors.filter((e) => e.field === field); - return res.map((item) => item.error); + let errors = []; + + if (field) { + errors = this.errors.filter((e) => e.field === field).map((item) => item.error); + } else { + if (this.$children.length > 0) { + errors = this.$children[0].errors; + } + } + return errors; }, getValueFromOption(field, option, defaultValue = false) { if (isFunction(field[option])) return field[option].call(this, this.model, field, this); diff --git a/src/index.js b/src/index.js index 4e3b9827..e90495a9 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ const schema = require("./utils/schema.js"); const validators = require("./utils/validators.js").default; const fieldComponents = require("./utils/fieldsLoader").default; const abstractField = require("./fields/abstractField").default; +const eventBus = require("./event-bus.js").eventBus; const install = (Vue) => { Vue.component("VueFormGenerator", module.exports.component); }; @@ -13,5 +14,6 @@ module.exports = { validators, abstractField, fieldComponents, + eventBus, install }; From c70a2b716336905d50368a62d773286bcc2a3ef5 Mon Sep 17 00:00:00 2001 From: Lionel Bijaoui Date: Mon, 27 Aug 2018 11:32:22 +0200 Subject: [PATCH 2/7] Creation of dev entry to test multiple instances of vue-form-generator --- build/webpack.dev.config.js | 1 + dev/projects/multi/app.vue | 155 ++++++++++++++++++++++++++++++++++ dev/projects/multi/index.html | 22 +++++ dev/projects/multi/main.js | 9 ++ 4 files changed, 187 insertions(+) create mode 100644 dev/projects/multi/app.vue create mode 100644 dev/projects/multi/index.html create mode 100644 dev/projects/multi/main.js diff --git a/build/webpack.dev.config.js b/build/webpack.dev.config.js index c840e470..00d2bf9c 100644 --- a/build/webpack.dev.config.js +++ b/build/webpack.dev.config.js @@ -48,6 +48,7 @@ module.exports = { basic: path.resolve("dev", "projects", "basic", "main.js"), mselect: path.resolve("dev", "projects", "multiselect", "main.js"), grouping: path.resolve("dev", "projects", "grouping", "main.js"), + multi: path.resolve("dev", "projects", "multi", "main.js"), checklist: path.resolve("dev", "projects", "checklist", "main.js"), picker: path.resolve("dev", "projects", "picker", "main.js") }, diff --git a/dev/projects/multi/app.vue b/dev/projects/multi/app.vue new file mode 100644 index 00000000..05cebd8a --- /dev/null +++ b/dev/projects/multi/app.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/dev/projects/multi/index.html b/dev/projects/multi/index.html new file mode 100644 index 00000000..c9dde342 --- /dev/null +++ b/dev/projects/multi/index.html @@ -0,0 +1,22 @@ + + + + + + vue-form-generator development + + + + + + + + + + +
+
+ + + + diff --git a/dev/projects/multi/main.js b/dev/projects/multi/main.js new file mode 100644 index 00000000..b63543ee --- /dev/null +++ b/dev/projects/multi/main.js @@ -0,0 +1,9 @@ +import Vue from "vue"; +import VueFormGenerator from "../../../src"; +Vue.use(VueFormGenerator); + +import App from "./app.vue"; + +new Vue({ + ...App +}).$mount("#app"); From 2f1e6b76e307404ed15a23f53ee58086fc97be88 Mon Sep 17 00:00:00 2001 From: Lionel Bijaoui Date: Mon, 27 Aug 2018 11:33:29 +0200 Subject: [PATCH 3/7] Better isolation of the event bus --- src/event-bus.js | 2 -- src/fields/abstractField.js | 32 ++++++++++++++--------- src/fields/core/fieldSubmit.vue | 5 ++-- src/formGenerator.vue | 46 +++++++++++++++++---------------- src/formGroup.vue | 23 ++++++++++------- src/index.js | 2 -- 6 files changed, 60 insertions(+), 50 deletions(-) delete mode 100644 src/event-bus.js diff --git a/src/event-bus.js b/src/event-bus.js deleted file mode 100644 index 1132baf0..00000000 --- a/src/event-bus.js +++ /dev/null @@ -1,2 +0,0 @@ -import Vue from "vue"; -export const eventBus = new Vue(); diff --git a/src/fields/abstractField.js b/src/fields/abstractField.js index 3193ddf5..c8087213 100644 --- a/src/fields/abstractField.js +++ b/src/fields/abstractField.js @@ -1,7 +1,6 @@ import { get as objGet, forEach, isFunction, isString, isArray, debounce, isNil } from "lodash"; import validators from "../utils/validators"; import { slugifyFormID } from "../utils/schema"; -import { eventBus } from "../event-bus.js"; const convertValidator = (validator) => { if (isString(validator)) { @@ -35,6 +34,9 @@ export default { }, formOptions: { type: Object + }, + eventBus: { + type: Object } }, @@ -105,6 +107,14 @@ export default { } }, + watch: { + errors: { + handler: function(errors) { + this.$emit("errors-updated", errors); + } + } + }, + methods: { getValueFromOption(field, option, defaultValue) { if (typeof this.$parent.getValueFromOption === "function") { @@ -147,9 +157,6 @@ export default { if (err) { this.errors = this.errors.concat(err); } - // let isValid = this.errors.length === 0; - // this.$emit("validated", isValid, this.errors, this); - // eventBus.$emit("validated", isValid, this.errors, this); }); } else if (result) { results = results.concat(result); @@ -174,7 +181,8 @@ export default { let isValid = fieldErrors.length === 0; this.errors = fieldErrors; - eventBus.$emit("field-validated", isValid, fieldErrors, this._uid); + + this.eventBus.$emit("field-validated", isValid, fieldErrors, this._uid); return fieldErrors; }; @@ -206,7 +214,7 @@ export default { } if (changed) { - eventBus.$emit("model-updated", newValue, this.schema.model); + this.eventBus.$emit("model-updated", newValue, this.schema.model); if (isFunction(this.schema.onChanged)) { this.schema.onChanged.call(this, this.model, newValue, oldValue, this.schema); @@ -271,9 +279,9 @@ export default { } }, created() { - eventBus.$on("clear-validation-errors", this.clearValidationErrors); - eventBus.$on("validate-fields", this.validate); - eventBus.$emit("field-registering"); + this.eventBus.$on("clear-validation-errors", this.clearValidationErrors); + this.eventBus.$on("validate-fields", this.validate); + this.eventBus.$emit("field-registering"); }, mounted() { const diff = function(a, b) { @@ -324,8 +332,8 @@ export default { } }, beforeDestroy() { - eventBus.$off("clear-validation-errors"); - eventBus.$off("validate-fields"); - eventBus.$emit("field-deregistering", this); + this.eventBus.$off("clear-validation-errors"); + this.eventBus.$off("validate-fields"); + this.eventBus.$emit("field-deregistering", this); } }; diff --git a/src/fields/core/fieldSubmit.vue b/src/fields/core/fieldSubmit.vue index 4a823242..4ab759e3 100644 --- a/src/fields/core/fieldSubmit.vue +++ b/src/fields/core/fieldSubmit.vue @@ -4,7 +4,6 @@ diff --git a/src/formGroup.vue b/src/formGroup.vue index f8cc93f9..7b55110f 100644 --- a/src/formGroup.vue +++ b/src/formGroup.vue @@ -9,7 +9,7 @@
- +
@@ -17,8 +17,8 @@
-
- +
+
@@ -27,7 +27,6 @@ import { get as objGet, isNil } from "lodash"; import { slugifyFormID } from "./utils/schema"; import formMixin from "./formMixin.js"; import fieldComponents from "./utils/fieldsLoader.js"; -// import { eventBus } from "./event-bus.js"; export default { name: "form-group", @@ -47,8 +46,16 @@ export default { default() { return []; } + }, + eventBus: { + type: Object } }, + data() { + return { + childErrors: [] + }; + }, methods: { // Should field type have a label? fieldTypeHasLabel(field) { @@ -78,16 +85,14 @@ export default { getFieldType(fieldSchema) { return "field-" + fieldSchema.type; }, - // Child field executed validation - // onFieldValidated(res, errors, field) { - // this.$emit("validated", res, errors, field); - // // eventBus.$emit("validated", res, errors, field); - // }, buttonVisibility(field) { return field.buttons && field.buttons.length > 0; }, buttonClickHandler(btn, field, event) { return btn.onclick.call(this, this.model, field, event, this); + }, + childValidated(errors) { + this.childErrors = errors; } } }; diff --git a/src/index.js b/src/index.js index e90495a9..4e3b9827 100644 --- a/src/index.js +++ b/src/index.js @@ -3,7 +3,6 @@ const schema = require("./utils/schema.js"); const validators = require("./utils/validators.js").default; const fieldComponents = require("./utils/fieldsLoader").default; const abstractField = require("./fields/abstractField").default; -const eventBus = require("./event-bus.js").eventBus; const install = (Vue) => { Vue.component("VueFormGenerator", module.exports.component); }; @@ -14,6 +13,5 @@ module.exports = { validators, abstractField, fieldComponents, - eventBus, install }; From 0cb2d211c5ee74dac4a24bc20e8d98e4f8175635 Mon Sep 17 00:00:00 2001 From: Lionel Bijaoui Date: Tue, 28 Aug 2018 16:56:19 +0200 Subject: [PATCH 4/7] Dev for grouping updated --- dev/projects/grouping/app.vue | 63 +++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/dev/projects/grouping/app.vue b/dev/projects/grouping/app.vue index 7a337fc8..9a81fb18 100644 --- a/dev/projects/grouping/app.vue +++ b/dev/projects/grouping/app.vue @@ -29,13 +29,16 @@ export default { more: "More", things: "Things" }, - single: "blah" + single: "blah", + subname: "" }, schema: { - groups: [ + fields: [ { + type: "group", legend: "Contact Details", + tag: "div", fields: [ { type: "input", @@ -43,7 +46,27 @@ export default { label: "Name", fieldOptions: { inputType: "text" - } + }, + required: true, + validator: ["required"] + }, + { + type: "group", + legend: "Subgroup", + styleClasses: "subgroup", + tag: "fieldset", + fields: [ + { + type: "input", + model: "subname", + label: "Name", + fieldOptions: { + inputType: "text" + }, + required: true, + validator: ["required"] + } + ] }, { type: "input", @@ -56,6 +79,17 @@ export default { ] }, { + type: "input", + model: "single", + label: "Single field (without group)", + fieldOptions: { + inputType: "text" + }, + required: true, + validator: ["string"] + }, + { + type: "group", legend: "Other Details", fields: [ { @@ -76,20 +110,12 @@ export default { } ] } - ], - fields: [ - { - type: "input", - model: "single", - label: "Single field (without group)", - fieldOptions: { - inputType: "text" - } - } ] }, formOptions: { + validateAfterLoad: true, + validateAfterChanged: true, fieldIdPrefix: "frm1-" } }; @@ -103,4 +129,15 @@ export default { From 2f83710fb655f3e1b5414ea4c18d502c9708df49 Mon Sep 17 00:00:00 2001 From: Lionel Bijaoui Date: Tue, 28 Aug 2018 16:57:36 +0200 Subject: [PATCH 5/7] Better groups --- src/fields/abstractField.js | 29 +-- src/fields/core/fieldCheckbox.vue | 2 +- src/fields/core/fieldChecklist.vue | 4 +- src/fields/core/fieldInput.vue | 2 +- src/fields/core/fieldLabel.vue | 2 +- src/fields/core/fieldRadios.vue | 2 +- src/fields/core/fieldSelect.vue | 2 +- src/fields/core/fieldSubmit.vue | 2 +- src/fields/core/fieldTextArea.vue | 2 +- src/fields/core/fieldUpload.vue | 2 +- src/fields/optional/fieldCleave.vue | 2 +- src/fields/optional/fieldDateTimePicker.vue | 2 +- src/fields/optional/fieldGoogleAddress.vue | 2 +- src/fields/optional/fieldMasked.vue | 2 +- src/fields/optional/fieldSpectrum.vue | 2 +- src/fields/optional/fieldSwitch.vue | 4 +- src/formElement.vue | 200 ++++++++++++++++++ src/formGenerator.vue | 91 +++------ src/formGroup.vue | 201 +++++++------------ src/formMixin.js | 42 +--- src/utils/fieldsLoader.js | 16 +- src/utils/schema.js | 4 +- test/unit/setup.js | 8 +- test/unit/specs/fields/abstractField.spec.js | 60 +++--- 24 files changed, 378 insertions(+), 307 deletions(-) create mode 100644 src/formElement.vue diff --git a/src/fields/abstractField.js b/src/fields/abstractField.js index c8087213..84a32842 100644 --- a/src/fields/abstractField.js +++ b/src/fields/abstractField.js @@ -1,6 +1,5 @@ -import { get as objGet, forEach, isFunction, isString, isArray, debounce, isNil } from "lodash"; +import { get as objGet, forEach, isFunction, isString, isArray, debounce, isNil, uniqueId } from "lodash"; import validators from "../utils/validators"; -import { slugifyFormID } from "../utils/schema"; const convertValidator = (validator) => { if (isString(validator)) { @@ -37,11 +36,16 @@ export default { }, eventBus: { type: Object + }, + fieldID: { + type: String } }, data() { + const fieldUID = uniqueId(this.fieldID + "_"); return { + fieldUID, errors: [], debouncedValidateFunc: null, debouncedFormatFunction: null @@ -109,7 +113,7 @@ export default { watch: { errors: { - handler: function(errors) { + handler(errors) { this.$emit("errors-updated", errors); } } @@ -117,11 +121,13 @@ export default { methods: { getValueFromOption(field, option, defaultValue) { - if (typeof this.$parent.getValueFromOption === "function") { + if (isFunction(this.$parent.getValueFromOption)) { return this.$parent.getValueFromOption(field, option, defaultValue); } else { // Environnement de test ? - if (isNil(field[option])) return defaultValue; + if (isNil(field[option])) { + return defaultValue; + } return field[option]; } @@ -142,12 +148,12 @@ export default { if (!isArray(this.schema.validator)) { validators.push(convertValidator(this.schema.validator).bind(this)); } else { - forEach(this.schema.validator, (validator) => { + this.schema.validator.forEach((validator) => { validators.push(convertValidator(validator).bind(this)); }); } - forEach(validators, (validator) => { + validators.forEach((validator) => { if (validateAsync) { results.push(validator(this.value, this.schema, this.model)); } else { @@ -167,7 +173,7 @@ export default { let handleErrors = (errors) => { let fieldErrors = []; - forEach(errors, (err) => { + errors.forEach((err) => { if (isArray(err) && err.length > 0) { fieldErrors = fieldErrors.concat(err); } else if (isString(err)) { @@ -182,7 +188,7 @@ export default { this.errors = fieldErrors; - this.eventBus.$emit("field-validated", isValid, fieldErrors, this._uid); + this.eventBus.$emit("field-validated", isValid, fieldErrors, this.fieldUID); return fieldErrors; }; @@ -265,11 +271,6 @@ export default { } }, - getFieldID(schema) { - const idPrefix = objGet(this.formOptions, "fieldIdPrefix", ""); - return slugifyFormID(schema, idPrefix); - }, - formatValueToField(value) { return value; }, diff --git a/src/fields/core/fieldCheckbox.vue b/src/fields/core/fieldCheckbox.vue index e53dcf20..6f7eef4c 100644 --- a/src/fields/core/fieldCheckbox.vue +++ b/src/fields/core/fieldCheckbox.vue @@ -1,5 +1,5 @@ + diff --git a/src/formGenerator.vue b/src/formGenerator.vue index 865d6477..fe84f12a 100644 --- a/src/formGenerator.vue +++ b/src/formGenerator.vue @@ -1,32 +1,27 @@ -