From 698a5ae39041de676d3104316b166fc53ea08933 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 20 Apr 2020 00:41:50 +0300 Subject: [PATCH 01/96] Vue 3 support --- build/release.sh | 2 +- build/rollup.config.js | 6 +- package-lock.json | 2716 +++--------------- package.json | 27 +- src/app-initialize.ts | 13 - src/components/containers.ts | 6 + src/components/index.ts | 2 +- src/components/inputs.ts | 46 +- src/components/ion-vue-router.ts | 202 -- src/components/navigation/index.ts | 2 - src/components/navigation/ion-page.ts | 9 - src/components/navigation/ion-tabs.ts | 235 -- src/components/overlays.ts | 22 +- src/controllers/index.ts | 13 - src/controllers/modal-controller.ts | 22 - src/controllers/popover-controller.ts | 17 - src/controllers/vue-delegate.ts | 109 - src/index.ts | 23 +- src/interfaces.ts | 88 - src/ionic-vue.ts | 20 + src/ionic.ts | 19 - src/router.ts | 121 - src/sfc.d.ts | 4 - src/utils/createInputComponent.ts | 74 - src/utils/createOverlayComponent.ts | 100 - src/utils/defineContainer.ts | 14 + src/utils/defineInput.ts | 42 + src/utils/defineOverlay.ts | 127 + src/utils/index.ts | 5 +- test/api.spec.js | 184 -- test/framework-delegate.spec.js | 73 - test/ion-vue-router-transitionless.spec.js | 43 - test/ion-vue-router.spec.js | 170 -- test/router.node.spec.js | 9 - test/router.spec.js | 45 - types/app-initialize.d.ts | 5 +- types/components/containers.d.ts | 13 + types/components/createOverlayComponent.d.ts | 12 - types/components/index.d.ts | 2 +- types/components/inputs.d.ts | 18 +- types/components/ion-modal.d.ts | 2 - types/components/ion-vue-router.d.ts | 25 - types/components/navigation/index.d.ts | 2 - types/components/navigation/ion-page.d.ts | 7 - types/components/navigation/ion-tabs.d.ts | 7 - types/components/overlays.d.ts | 7 +- types/controllers/index.d.ts | 8 +- types/controllers/modal-controller.d.ts | 11 +- types/controllers/popover-controller.d.ts | 2 +- types/controllers/vue-delegate.d.ts | 7 +- types/index.d.ts | 9 +- types/interfaces.d.ts | 68 +- types/ionic-vue.d.ts | 3 + types/ionic.d.ts | 5 +- types/router.d.ts | 18 - types/utils/createContainerComponent.d.ts | 7 + types/utils/createInputComponent.d.ts | 6 +- types/utils/createOverlayComponent.d.ts | 27 +- types/utils/defineContainer.d.ts | 7 + types/utils/defineInput.d.ts | 10 + types/utils/defineOverlay.d.ts | 27 + types/utils/index.d.ts | 5 +- 62 files changed, 818 insertions(+), 4112 deletions(-) delete mode 100644 src/app-initialize.ts create mode 100644 src/components/containers.ts delete mode 100644 src/components/ion-vue-router.ts delete mode 100644 src/components/navigation/index.ts delete mode 100644 src/components/navigation/ion-page.ts delete mode 100644 src/components/navigation/ion-tabs.ts delete mode 100644 src/controllers/index.ts delete mode 100644 src/controllers/modal-controller.ts delete mode 100644 src/controllers/popover-controller.ts delete mode 100644 src/controllers/vue-delegate.ts delete mode 100644 src/interfaces.ts create mode 100644 src/ionic-vue.ts delete mode 100644 src/ionic.ts delete mode 100644 src/router.ts delete mode 100644 src/sfc.d.ts delete mode 100644 src/utils/createInputComponent.ts delete mode 100644 src/utils/createOverlayComponent.ts create mode 100644 src/utils/defineContainer.ts create mode 100644 src/utils/defineInput.ts create mode 100644 src/utils/defineOverlay.ts delete mode 100644 test/api.spec.js delete mode 100644 test/framework-delegate.spec.js delete mode 100644 test/ion-vue-router-transitionless.spec.js delete mode 100644 test/ion-vue-router.spec.js delete mode 100644 test/router.node.spec.js delete mode 100644 test/router.spec.js create mode 100644 types/components/containers.d.ts delete mode 100644 types/components/createOverlayComponent.d.ts delete mode 100644 types/components/ion-modal.d.ts create mode 100644 types/ionic-vue.d.ts create mode 100644 types/utils/createContainerComponent.d.ts create mode 100644 types/utils/defineContainer.d.ts create mode 100644 types/utils/defineInput.d.ts create mode 100644 types/utils/defineOverlay.d.ts diff --git a/build/release.sh b/build/release.sh index aff0482..644d5be 100755 --- a/build/release.sh +++ b/build/release.sh @@ -8,7 +8,7 @@ read -p "Releasing $VERSION - are you sure? (y/n)" -n 1 -r echo # (optional) move to a new line if [[ $REPLY =~ ^[Yy]$ ]] then - npm run lint.fix + npm run lint echo "Releasing $VERSION ..." VERSION=$VERSION npm run prod diff --git a/build/rollup.config.js b/build/rollup.config.js index 833d5d8..395c078 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -1,5 +1,5 @@ import path from "path"; -import vue from "rollup-plugin-vue"; +// import vue from "rollup-plugin-vue"; import { terser } from "rollup-plugin-terser"; import typescript from "rollup-plugin-typescript2"; import { version as packageVersion } from "../package.json"; @@ -41,14 +41,14 @@ function baseConfig() { ], external: [ "vue", - "vue-router", + // "vue-router", "@ionic/core", "@ionic/core/loader", "ionicons", "ionicons/icons" ], plugins: [ - vue(), + // vue(), typescript({ useTsconfigDeclarationDir: true, objectHashIgnoreUnknownHack: false, diff --git a/package-lock.json b/package-lock.json index 3dea324..5e9a035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@modus/ionic-vue", - "version": "1.3.6", + "version": "3.0.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { @@ -37,84 +37,11 @@ "source-map": "^0.5.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "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" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -128,6 +55,14 @@ "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" + }, + "dependencies": { + "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": { @@ -232,8 +167,7 @@ "@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", - "dev": true + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" }, "@babel/helpers": { "version": "7.9.2", @@ -247,25 +181,16 @@ } }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.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" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -276,29 +201,13 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "@babel/parser": { "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -399,63 +308,6 @@ "@babel/code-frame": "^7.8.3", "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "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" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@babel/traverse": { @@ -473,103 +325,16 @@ "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "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" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@babel/types": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } } }, "@bcoe/v8-coverage": { @@ -588,6 +353,15 @@ "minimist": "^1.2.0" } }, + "@ionic/core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.0.7.tgz", + "integrity": "sha512-94Ebr4Uw/2aOqweGr4Xmo5csjTQwLcDuHraMC+VuQWNoCztuJI9cX/yhsAS2Yftor+vXC/uGZkubK+P+RFh1jQ==", + "requires": { + "ionicons": "^5.0.1", + "tslib": "^1.10.0" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", @@ -616,58 +390,6 @@ "chalk": "^3.0.0", "jest-util": "^25.3.0", "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "@jest/core": { @@ -712,53 +434,6 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -767,15 +442,6 @@ "requires": { "ansi-regex": "^5.0.0" } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -833,64 +499,6 @@ "string-length": "^3.1.0", "terminal-link": "^2.0.0", "v8-to-istanbul": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "@jest/source-map": { @@ -902,20 +510,6 @@ "callsites": "^3.0.0", "graceful-fs": "^4.2.3", "source-map": "^0.6.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@jest/test-result": { @@ -964,70 +558,6 @@ "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "@jest/types": { @@ -1040,58 +570,6 @@ "@types/istanbul-reports": "^1.1.1", "@types/yargs": "^15.0.0", "chalk": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "@rollup/pluginutils": { @@ -1105,54 +583,11 @@ "micromatch": "^4.0.2" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, @@ -1244,9 +679,9 @@ } }, "@types/node": { - "version": "12.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", - "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", + "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==", "dev": true }, "@types/prettier": { @@ -1276,62 +711,65 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "@vue/component-compiler": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler/-/component-compiler-3.6.0.tgz", - "integrity": "sha512-NIA0vmOI4zbtJAn69iZls8IJ8VxmguswAuiUdu8TcR+YYTYzntfw290HUCSFjzAdRg+FUWZv8r+wc3TzJ/IjwA==", - "dev": true, + "@vue/compiler-core": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.2.tgz", + "integrity": "sha512-/c3ePWU9T7xwn0J/YRlxCxnxqphNVlcXisnI6aMoK3pjvQFXOMD6tfrHUtepCrQLNdKlhxNjqe3Q625Z64Z0kQ==", "requires": { - "@vue/component-compiler-utils": "^2.1.0", - "clean-css": "^4.1.11", - "hash-sum": "^1.0.2", - "postcss-modules-sync": "^1.0.0", - "source-map": "0.6.*" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", + "@vue/shared": "3.0.0-beta.2", + "estree-walker": "^0.8.1", + "source-map": "^0.6.1" } }, - "@vue/component-compiler-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz", - "integrity": "sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==", - "dev": true, + "@vue/compiler-dom": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.2.tgz", + "integrity": "sha512-VZwvnsWPoi0/MR5CF5p5VhRGk3AkM9MQYt/pMaXDmbl09kWKVjQZubCRvpzuyjjm1QnV1yrSaqTZWDAIYbKYtw==", "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", - "postcss-selector-parser": "^5.0.0", - "prettier": "1.16.3", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@vue/compiler-core": "3.0.0-beta.2", + "@vue/shared": "3.0.0-beta.2" } }, - "@vue/test-utils": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.29.tgz", - "integrity": "sha512-yX4sxEIHh4M9yAbLA/ikpEnGKMNBCnoX98xE1RwxfhQVcn0MaXNSj1Qmac+ZydTj6VBSEVukchBogXBTwc+9iA==", - "dev": true, + "@vue/reactivity": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.2.tgz", + "integrity": "sha512-vAYHiBmpHfLAJulssTTTlvdHtyyKeOCG3qCu/TxDhu3NFHEfrt4eytR2atR6EbpTb853/QKcoW3k6L6g/znxAw==", "requires": { - "dom-event-types": "^1.0.0", - "lodash": "^4.17.4" + "@vue/shared": "3.0.0-beta.2" + } + }, + "@vue/runtime-core": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.2.tgz", + "integrity": "sha512-tcxNNV7y+H2046F79iw90OdwyxvMEqJ5iOQTsOvfVf2hBNrCWPG1tAU+kywFBlBY4I26k7XB/Q1ZdHb2q8YLaA==", + "requires": { + "@vue/reactivity": "3.0.0-beta.2", + "@vue/shared": "3.0.0-beta.2" + } + }, + "@vue/runtime-dom": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.2.tgz", + "integrity": "sha512-swWm7fa3JKEGE0KYVevYqaBTSGxx/bmlwJTbJcnnNgdZZGtWUQsUzXCk6JKRuoYjy+iU0ONcHidEhpwdazH9Aw==", + "requires": { + "@vue/runtime-core": "3.0.0-beta.2", + "@vue/shared": "3.0.0-beta.2", + "csstype": "^2.6.8" } }, + "@vue/shared": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.2.tgz", + "integrity": "sha512-ED5oa+ZOcjAJkWEzL0zFZ4QG89L23DrW9LBBGT6YBUhBmOsf9BKii2JIBfdxWYwRkjAhbHffQH0mc6rI2famug==" + }, + "@vue/test-utils": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.1.tgz", + "integrity": "sha512-qureK5X+67Fp3z2YnIreqBlE/bkwof+sjJu8STRkM4Oy9FqcHqbAlkakwFvQOQhOioWCPS+QKjzWBNjBmzNdOQ==", + "dev": true + }, "abab": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", @@ -1369,9 +807,9 @@ } }, "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "acorn-walk": { @@ -1408,10 +846,13 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "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" + } }, "anymatch": { "version": "3.1.1", @@ -1522,6 +963,39 @@ "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -1664,58 +1138,6 @@ "babel-preset-jest": "^25.3.0", "chalk": "^3.0.0", "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "babel-messages": { @@ -2164,6 +1586,29 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-types": { @@ -2176,6 +1621,14 @@ "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, "babylon": { @@ -2254,18 +1707,6 @@ "tweetnacl": "^0.14.3" } }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2349,15 +1790,6 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, - "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" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2375,55 +1807,34 @@ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "os-homedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz", - "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==", - "dev": true - }, "regexpu-core": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", - "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", "dev": true }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -2469,9 +1880,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "version": "1.0.30001042", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001042.tgz", + "integrity": "sha512-igMQ4dlqnf4tWv0xjaaE02op9AJ2oQzXKjWf4EuAHFN694Uo9/EfPVIPJcmn2WkU9RqozCxx5e2KPcVClHDbDw==", "dev": true }, "capture-exit": { @@ -2490,16 +1901,55 @@ "dev": true }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "ci-info": { @@ -2531,23 +1981,6 @@ } } }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -2623,9 +2056,9 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "commondir": { @@ -2646,15 +2079,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -2671,9 +2095,9 @@ "dev": true }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "core-util-is": { @@ -2706,42 +2130,6 @@ } } }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } - } - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -2765,6 +2153,11 @@ } } }, + "csstype": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", + "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2786,12 +2179,12 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -2907,12 +2300,6 @@ } } }, - "dom-event-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz", - "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -2933,9 +2320,9 @@ } }, "electron-to-chromium": { - "version": "1.3.238", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.238.tgz", - "integrity": "sha512-k+s6EIiSTgfOm7WiMlGBMMMtBQXSui8OfLN1sXU3RohJOuLGVq0lVm7hXyDIDBcbPM0MeZabAdIPQOSEZT3ZLg==", + "version": "1.3.412", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.412.tgz", + "integrity": "sha512-4bVdSeJScR8fT7ERveLWbxemY5uXEHVseqMRyORosiKcTUSGtVwBkV8uLjXCqoFLeImA57Z9hbz3TOid01U4Hw==", "dev": true }, "emoji-regex": { @@ -2944,12 +2331,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2976,15 +2357,6 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } } }, "esprima": { @@ -3000,10 +2372,9 @@ "dev": true }, "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.8.1.tgz", + "integrity": "sha512-H6cJORkqvrNziu0KX2hqOMAlA2CiuAxHeGJXSIoKA/KLv229Dw806J3II6mKTm5xiDX1At1EXCfsOQPB+tMB+g==" }, "esutils": { "version": "2.0.3", @@ -3053,6 +2424,15 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3070,6 +2450,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -3230,12 +2616,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -3262,6 +2642,20 @@ "requires": { "json5": "^0.5.1", "path-exists": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, "find-cache-dir": { @@ -3273,66 +2667,6 @@ "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } } }, "find-up": { @@ -3343,14 +2677,6 @@ "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } } }, "for-in": { @@ -3409,15 +2735,6 @@ "dev": true, "optional": true }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "dev": true, - "requires": { - "loader-utils": "^0.2.16" - } - }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -3455,9 +2772,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3469,15 +2786,15 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growly": { @@ -3570,12 +2887,6 @@ } } }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -3617,12 +2928,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -3639,12 +2944,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3670,6 +2969,11 @@ "loose-envify": "^1.0.0" } }, + "ionicons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.0.1.tgz", + "integrity": "sha512-P9GHr7pgCJcG211W0wute49NZ9AvJZvFJf4OwYybakjX6j7tu0q5t5HNWn9bcb9YjI7SxBblJg8iqQ1Yb59DXw==" + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -3898,29 +3202,6 @@ "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { @@ -3944,47 +3225,6 @@ "jest-cli": "^25.3.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "jest-cli": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz", @@ -4005,15 +3245,6 @@ "realpath-native": "^2.0.0", "yargs": "^15.3.1" } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -4134,58 +3365,6 @@ "micromatch": "^4.0.2", "pretty-format": "^25.3.0", "realpath-native": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-diff": { @@ -4198,58 +3377,6 @@ "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", "pretty-format": "^25.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-docblock": { @@ -4272,58 +3399,6 @@ "jest-get-type": "^25.2.6", "jest-util": "^25.3.0", "pretty-format": "^25.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-environment-jsdom": { @@ -4386,14 +3461,6 @@ "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - } } }, "jest-jasmine2": { @@ -4419,58 +3486,6 @@ "jest-util": "^25.3.0", "pretty-format": "^25.3.0", "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-leak-detector": { @@ -4493,58 +3508,6 @@ "jest-diff": "^25.3.0", "jest-get-type": "^25.2.6", "pretty-format": "^25.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-message-util": { @@ -4560,58 +3523,6 @@ "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-mock": { @@ -4647,67 +3558,6 @@ "jest-pnp-resolver": "^1.2.1", "realpath-native": "^2.0.0", "resolve": "^1.15.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-resolve-dependencies": { @@ -4746,155 +3596,39 @@ "jest-worker": "^25.2.6", "source-map-support": "^0.5.6", "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-runtime": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", - "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", - "dev": true, - "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", + "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", + "dev": true, + "requires": { + "@jest/console": "^25.3.0", + "@jest/environment": "^25.3.0", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.3.0", + "jest-haste-map": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-mock": "^25.3.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.3.0", + "jest-snapshot": "^25.3.0", + "jest-util": "^25.3.0", + "jest-validate": "^25.3.0", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" } }, "jest-serializer": { @@ -4925,61 +3659,11 @@ "semver": "^6.3.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -5002,58 +3686,6 @@ "chalk": "^3.0.0", "is-ci": "^2.0.0", "make-dir": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-validate": { @@ -5068,78 +3700,17 @@ "jest-get-type": "^25.2.6", "leven": "^3.1.0", "pretty-format": "^25.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-vue-preprocessor": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/jest-vue-preprocessor/-/jest-vue-preprocessor-1.5.0.tgz", - "integrity": "sha512-2O0pewvL8urvjjkDq/ZorvFpk3vKtXFawfJ3nVlv38o7V3j4YY0nAWh+7p/2yYLZrBOg2aDTiQTwxCRt4qZNWA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/jest-vue-preprocessor/-/jest-vue-preprocessor-1.7.1.tgz", + "integrity": "sha512-3JStGaNMuSzuo6OytlnUjtF+L9iYwKMu+BCrQYPXu3DEpzmKuuY3bZiTUz6+x9NbElKz2NMQNxysIgNZaT/QqA==", "dev": true, "requires": { "babel-plugin-transform-runtime": "6.23.0", "find-babel-config": "1.2.0", - "typescript": "2.7.2", - "vue-property-decorator": "6.1.0" - }, - "dependencies": { - "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", - "dev": true - } + "vue-property-decorator": "8.3.0" } }, "jest-watcher": { @@ -5154,58 +3725,6 @@ "chalk": "^3.0.0", "jest-util": "^25.3.0", "string-length": "^3.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-worker": { @@ -5235,16 +3754,10 @@ } } }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true - }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { @@ -5322,10 +3835,13 @@ "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "jsonfile": { "version": "4.0.0", @@ -5376,18 +3892,6 @@ "type-check": "~0.3.2" } }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -5400,8 +3904,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.sortby": { "version": "4.7.0", @@ -5427,20 +3930,10 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" @@ -5483,25 +3976,8 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "requires": { + "object-visit": "^1.0.0" } }, "merge-stream": { @@ -5587,9 +4063,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nanomatch": { @@ -5695,12 +4171,6 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -5782,6 +4252,12 @@ "word-wrap": "~1.2.3" } }, + "os-homedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz", + "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==", + "dev": true + }, "p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -5831,9 +4307,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { @@ -5896,247 +4372,12 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.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" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "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" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "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" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-sync": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-sync/-/postcss-modules-sync-1.0.0.tgz", - "integrity": "sha1-YZpxnPeN0WpINBNRQLMkz3czS+E=", - "dev": true, - "requires": { - "generic-names": "^1.0.2", - "icss-replace-symbols": "^1.0.2", - "postcss": "^5.2.5", - "postcss-modules-local-by-default": "^1.1.1", - "postcss-modules-scope": "^1.0.2", - "string-hash": "^1.1.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prettier": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz", - "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==", - "dev": true - }, "pretty-format": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", @@ -6198,12 +4439,6 @@ "sisteransi": "^1.0.4" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -6232,12 +4467,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -6250,12 +4479,6 @@ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -6263,9 +4486,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" @@ -6435,9 +4658,9 @@ "dev": true }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.0.tgz", + "integrity": "sha512-LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -6530,64 +4753,26 @@ "requires": { "path-parse": "^1.0.6" } - }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true } } }, - "rollup-plugin-vue": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-vue/-/rollup-plugin-vue-4.7.2.tgz", - "integrity": "sha512-RuAK+YTL81/iccOWoadqQz2TXqOogivjbvtCuU6EfVP9/E5XIjuMNVsVWHkSelZQblI1z2b5tshWL7XoiOfABQ==", + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "requires": { - "@vue/component-compiler": "^3.6", - "@vue/component-compiler-utils": "^2.1.0", - "debug": "^4.1.1", - "hash-sum": "^1.0.2", - "magic-string": "^0.25.2", - "querystring": "^0.2.0", - "rollup-pluginutils": "^2.0.1", - "source-map": "0.7.3", - "vue-runtime-helpers": "1.0.0" + "estree-walker": "^0.6.1" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true } } }, - "rollup-pluginutils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", - "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - } - }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -6856,6 +5041,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -6873,6 +5067,18 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 } } }, @@ -6948,10 +5154,9 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.5.3", @@ -6974,14 +5179,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "source-map-url": { @@ -6991,9 +5188,9 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", - "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "split-string": { @@ -7061,12 +5258,6 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, "string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", @@ -7150,10 +5341,13 @@ "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } }, "supports-hyperlinks": { "version": "2.1.0", @@ -7207,24 +5401,6 @@ "commander": "^2.19.0", "source-map": "~0.6.1", "source-map-support": "~0.5.10" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } } }, "test-exclude": { @@ -7251,10 +5427,9 @@ "dev": true }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -7320,8 +5495,7 @@ "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tslint": { "version": "6.1.1", @@ -7344,15 +5518,6 @@ "tsutils": "^2.29.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" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -7363,15 +5528,6 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -7498,15 +5654,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { @@ -7521,12 +5677,6 @@ "set-value": "^2.0.1" } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -7630,33 +5780,35 @@ "extsprintf": "^1.2.0" } }, + "vue": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.2.tgz", + "integrity": "sha512-/HYhK9i8PWM0fL38YflFK/vY1ots+JyNI2GZa8VtDqj4jD3+2UZ0CH0kjmw9YTmRtHdsU65CXGkVuA3EMV3mXQ==", + "requires": { + "@vue/compiler-dom": "3.0.0-beta.2", + "@vue/runtime-dom": "3.0.0-beta.2", + "@vue/shared": "3.0.0-beta.2" + } + }, "vue-class-component": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-6.3.2.tgz", - "integrity": "sha512-cH208IoM+jgZyEf/g7mnFyofwPDJTM/QvBNhYMjqGB8fCsRyTf68rH2ISw/G20tJv+5mIThQ3upKwoL4jLTr1A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.3.tgz", + "integrity": "sha512-oEqYpXKaFN+TaXU+mRLEx8dX0ah85aAJEe61mpdoUrq0Bhe/6sWhyZX1JjMQLhVsHAkncyhedhmCdDVSasUtDw==", "dev": true }, "vue-property-decorator": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-6.1.0.tgz", - "integrity": "sha512-NM4PYPOkOIO7SFtWiQqVrbp+ORzd7CJXcIz0X710PNW9pxGfbil0/x/ULFympzIUoHXBKN2dqoOQzh6oeMzpTQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.3.0.tgz", + "integrity": "sha512-77YtTbZHd5CNiPzbqv51kEgL48yvD2dUDfF28vEyw3MbQ9bBAb/tDyFzskcqjNRbWyXk1vq4oM2CK/LfhxuIBg==", "dev": true, "requires": { - "reflect-metadata": "^0.1.10", - "vue-class-component": "^6.1.0" + "vue-class-component": "^7.1.0" } }, - "vue-runtime-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vue-runtime-helpers/-/vue-runtime-helpers-1.0.0.tgz", - "integrity": "sha512-DgwCNgIXkq1GJsWwtFOjA/K2nxpjyon/QqAut0EiwrMHBatAPbfdqksDdRoK15b5YrSJRa59rx3pc0L6V4udUA==", - "dev": true - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true + "vue-router": { + "version": "4.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.6.tgz", + "integrity": "sha512-0wDX4KX3NEeHTRU67e3hyR9YHRLZ6jQZrEoCGTL5XdwSRgR57s77KvL5xvKhwVO5pgFb4PCSGoLAT8dhsUmnEQ==" }, "w3c-hr-time": { "version": "1.0.2", @@ -7841,12 +5993,6 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", @@ -7867,9 +6013,9 @@ } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index db5bfab..2a73176 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@modus/ionic-vue", - "version": "1.3.6", - "description": "Ionic integration adapters for Vue", + "version": "3.0.0-alpha.1", + "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", "user": "michaeltintiuc", @@ -13,10 +13,8 @@ "unpkg": "dist/ionic-vue.js", "jsdelivr": "dist/ionic-vue.js", "files": [ - "src/", "types/", - "dist/*.js", - "dist/*.ts" + "dist/" ], "bugs": { "url": "https://github.com/ModusCreateOrg/ionic-vue/issues" @@ -44,20 +42,21 @@ "cordova", "capacitor", "app", - "webapp" + "webapp", + "ionic5", + "vuejs3", + "vue3" ], "scripts": { "dev": "rollup -c ./build/rollup.config.js", "watch": "rollup -w -c ./build/rollup.config.js", "prod": "npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd", - "lint": "tslint --project .", - "lint.fix": "tslint --project . --fix", + "lint": "tslint --project . --fix", "test": "jest --coverage --verbose", - "install.peer": "npm i --no-save vue vue-template-compiler vue-router @ionic/core", "clean": "node ./scripts/clean.js" }, "devDependencies": { - "@vue/test-utils": "^1.0.0-beta.24", + "@vue/test-utils": "^2.0.0-alpha.0", "babel-jest": "^25.3.0", "babel-preset-env": "^1.7.0", "jest": "^25.3.0", @@ -67,16 +66,14 @@ "rollup-plugin-buble": "^0.19.2", "rollup-plugin-terser": "^1.0.1", "rollup-plugin-typescript2": "^0.27.0", - "rollup-plugin-vue": "^4.3.0", "tslib": "^1.11.1", "tslint": "^6.1.1", "tslint-ionic-rules": "^0.0.21", "typescript": "^3.8.3" }, - "peerDependencies": { - "vue": "^2.6.11", - "vue-template-compiler": "^2.6.11", - "vue-router": "^3.1.6", + "dependencies": { + "vue": "next", + "vue-router": "next", "@ionic/core": "^5.0.7" }, "jestSonar": { diff --git a/src/app-initialize.ts b/src/app-initialize.ts deleted file mode 100644 index d6b7dbb..0000000 --- a/src/app-initialize.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IonicConfig } from '@ionic/core'; -import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; -import { IonicWindow } from './interfaces'; - -export async function appInitialize(config?: IonicConfig) { - const win: IonicWindow = window as any; - const Ionic = win?.Ionic || {}; - - Ionic.config = config; - - await applyPolyfills(); - defineCustomElements(win); -} diff --git a/src/components/containers.ts b/src/components/containers.ts new file mode 100644 index 0000000..3456124 --- /dev/null +++ b/src/components/containers.ts @@ -0,0 +1,6 @@ +import { defineContainer } from '../utils'; + +export const IonApp = defineContainer('ion-app'); +export const IonItem = defineContainer('ion-item'); +export const IonLabel = defineContainer('ion-label'); +export const IonButton = defineContainer('ion-button'); diff --git a/src/components/index.ts b/src/components/index.ts index 1fb9cc0..51317a3 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,3 +1,3 @@ export * from './overlays'; export * from './inputs'; -export * from './navigation'; +export * from './containers'; diff --git a/src/components/inputs.ts b/src/components/inputs.ts index f2312d4..8074e01 100644 --- a/src/components/inputs.ts +++ b/src/components/inputs.ts @@ -1,39 +1,25 @@ -import { createInputComponent } from '../utils'; +import { defineInput } from '../utils'; -export const IonCheckboxVue = createInputComponent( - 'IonCheckboxVue', +export const IonCheckbox = defineInput( + 'IonCheckbox', 'ion-checkbox', - 'ionChange', + 'onIonChange', 'checked' ); -export const IonDatetimeVue = createInputComponent( - 'IonDatetimeVue', - 'ion-datetime' -); -export const IonInputVue = createInputComponent( - 'IonInputVue', - 'ion-input', - 'ionInput' -); -export const IonRadioVue = createInputComponent( - 'IonRadioVue', - 'ion-radio', - 'ionSelect' -); -export const IonRangeVue = createInputComponent('IonRangeVue', 'ion-range'); -export const IonSearchbarVue = createInputComponent( - 'IonSearchbarVue', +export const IonDatetime = defineInput('IonDatetime', 'ion-datetime'); +export const IonInput = defineInput('IonInput', 'ion-input', 'onIonInput'); +export const IonRadio = defineInput('IonRadio', 'ion-radio', 'onIonSelect'); +export const IonRange = defineInput('IonRange', 'ion-range'); +export const IonSearchbar = defineInput( + 'IonSearchbar', 'ion-searchbar', - 'ionInput' -); -export const IonSelectVue = createInputComponent('IonSelectVue', 'ion-select'); -export const IonTextareaVue = createInputComponent( - 'IonTextareaVue', - 'ion-textarea' + 'onIonInput' ); -export const IonToggleVue = createInputComponent( - 'IonToggleVue', +export const IonSelect = defineInput('IonSelect', 'ion-select'); +export const IonTextarea = defineInput('IonTextarea', 'ion-textarea'); +export const IonToggle = defineInput( + 'IonToggle', 'ion-toggle', - 'ionChange', + 'onIonChange', 'checked' ); diff --git a/src/components/ion-vue-router.ts b/src/components/ion-vue-router.ts deleted file mode 100644 index e139f20..0000000 --- a/src/components/ion-vue-router.ts +++ /dev/null @@ -1,202 +0,0 @@ -import Vue, { CreateElement, RenderContext, VNode, VNodeData } from 'vue'; -import { NavDirection } from '@ionic/core'; - -type TransitionDone = () => void; - -interface KeepAliveProps { - include?: string | string[] | RegExp; - exclude?: string | string[] | RegExp; - max?: number; -} - -interface Props { - name?: string; - animated?: boolean; - keepAlive?: KeepAliveProps; -} - -// Component entering the view -let enteringEl: HTMLElement; - -export default { - name: 'IonVueRouter', - functional: true, - - props: { - // Router view name - name: { default: 'default', type: String }, - // Disable transitions - animated: { default: true, type: Boolean }, - // keep-alive props - keepAlive: { type: [String, Object as () => KeepAliveProps] } - }, - - render(h: CreateElement, { parent, props, data, children }: RenderContext) { - if (!parent.$router) { - throw new Error( - 'IonTabs requires an instance of either VueRouter or IonicVueRouter' - ); - } - - const ionRouterOutletData: VNodeData = { - ...data, - ref: 'ionRouterOutlet', - on: { click: (event: Event) => catchIonicGoBack(parent, event) } - }; - const routerViewData: VNodeData = { props: { name: props.name } }; - const transitionData: VNodeData = { - props: { css: false, mode: 'in-out' }, - on: { - leave: (el: HTMLElement, done: TransitionDone) => { - leave(parent, props as Props, el, done); - }, - beforeEnter, - enter, - afterEnter, - beforeLeave, - afterLeave, - enterCancelled, - leaveCancelled - } - }; - const routerViewNode: VNode = h('router-view', routerViewData, children); - const keepAliveNode: VNode = h( - 'keep-alive', - { props: { ...props.keepAlive } }, - [routerViewNode] - ); - const transitionNode: VNode = h('transition', transitionData, [ - props.keepAlive === undefined ? routerViewNode : keepAliveNode - ]); - - return h('ion-router-outlet', ionRouterOutletData, [transitionNode]); - } -}; - -function catchIonicGoBack(parent: Vue, event: Event): void { - // In case of nested ion-vue-routers run only once - event.stopImmediatePropagation(); - - if (!event.target) return; - - // We only care for the event coming from Ionic's back button - const backButton = (event.target as HTMLElement).closest( - 'ion-back-button' - ) as HTMLIonBackButtonElement; - if (!backButton) return; - - const $router = parent.$router; - let defaultHref: string; - - // Explicitly override router direction to always trigger a back transition - $router.directionOverride = 'back'; - - // If we can go back - do so - if ($router.canGoBack()) { - event.preventDefault(); - $router.back(); - return; - } - - // If there's a default fallback - use it - defaultHref = backButton.defaultHref as string; - if (undefined !== defaultHref) { - event.preventDefault(); - $router.push(defaultHref); - } -} - -// Transition when we leave the route -function leave( - parent: Vue, - props: Props, - el: HTMLElement, - done: TransitionDone -) { - const promise = transition(parent, props, el); - - // Skip any transition if we don't get back a Promise - if (!promise) { - done(); - return; - } - - // Perform navigation once the transition was finished - parent.$router.transition = new Promise(resolve => { - promise - .then(() => { - resolve(); - done(); - }) - .catch(console.error); - }); -} - -// Trigger the ionic/core transitions -function transition(parent: Vue, props: Props, leavingEl: HTMLElement) { - const ionRouterOutlet = parent.$refs - .ionRouterOutlet as HTMLIonRouterOutletElement; - - // The Ionic framework didn't load - skip animations - if (typeof ionRouterOutlet.componentOnReady === 'undefined') { - return; - } - - // Skip animations if there's no component to navigate to - // or the current and the "to-be-rendered" components are the same - if (!enteringEl || enteringEl === leavingEl) { - return; - } - - // Add the proper Ionic classes, important for smooth transitions - enteringEl.classList.add('ion-page', 'ion-page-invisible'); - - // Reset the cached styling applied by ionic/core's: - // .afterStyles({ 'display': 'none' }) - if (typeof props.keepAlive !== 'undefined') { - enteringEl.style.display = ''; - } - - // Commit to the transition as soon as the Ionic Router Outlet is ready - return ionRouterOutlet - .componentOnReady() - .then((el: HTMLIonRouterOutletElement) => { - return el.commit(enteringEl, leavingEl, { - deepWait: true, - duration: - !props.animated || parent.$router.direction === 'root' - ? 0 - : undefined, - direction: parent.$router.direction as NavDirection, - showGoBack: parent.$router.canGoBack() - }); - }) - .catch(console.error); -} - -// Set the component to be rendered before we render the new route -function beforeEnter(el: HTMLElement) { - enteringEl = el; -} - -// Enter the new route -function enter(_el: HTMLElement, done: TransitionDone) { - done(); -} - -// Vue transition stub functions -function afterEnter(_el: HTMLElement) { - /* */ -} -function afterLeave(_el: HTMLElement) { - /* */ -} -function beforeLeave(_el: HTMLElement) { - /* */ -} -function enterCancelled(_el: HTMLElement) { - /* */ -} -function leaveCancelled(_el: HTMLElement) { - /* */ -} diff --git a/src/components/navigation/index.ts b/src/components/navigation/index.ts deleted file mode 100644 index b2c620e..0000000 --- a/src/components/navigation/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './ion-page'; -export * from './ion-tabs'; diff --git a/src/components/navigation/ion-page.ts b/src/components/navigation/ion-page.ts deleted file mode 100644 index 6230e7a..0000000 --- a/src/components/navigation/ion-page.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CreateElement, RenderContext } from 'vue'; - -export default { - name: 'IonPage', - functional: true, - render(h: CreateElement, { children }: RenderContext) { - return h('div', { class: { 'ion-page': true } }, children); - } -}; diff --git a/src/components/navigation/ion-tabs.ts b/src/components/navigation/ion-tabs.ts deleted file mode 100644 index 2909ac0..0000000 --- a/src/components/navigation/ion-tabs.ts +++ /dev/null @@ -1,235 +0,0 @@ -import Vue, { CreateElement, RenderContext, VNode } from 'vue'; -import { Route } from 'vue-router'; - - -interface EventListeners { - // tslint:disable-next-line:ban-types - [key: string]: Function | Function[]; -} - -const tabBars = [] as VNode[]; -const cachedTabs = [] as VNode[]; - -export default { - name: 'IonTabs', - functional: true, - render(h: CreateElement, { parent, data, slots, listeners }: RenderContext) { - const renderQueue = [] as VNode[]; - const postRenderQueue = [] as VNode[]; - const route = parent.$route; - let selectedTab = ''; - - if (!parent.$router) { - throw new Error('IonTabs requires an instance of either VueRouter or IonicVueRouter'); - } - - // Loop through all of the children in the default slot - for (let i = 0; i < slots().default.length; i++) { - const vnode = slots().default[i]; - - // Not an ion-tab, push to render and post-render processing queues - if (!vnode.tag || vnode.tag.match(/ion-tab$/) === null) { - renderQueue.push(vnode); - postRenderQueue[i] = vnode; - continue; - } - - const tabName = matchRouteToTab(vnode, route); - const tabIsCached = cachedTabs[i]; - - // Landed on tab route - // Cache the tab, push to render queue and continue iteration - if (tabName) { - if (!tabIsCached) { - cachedTabs[i] = vnode; - } - - selectedTab = tabName; - vnode.data.attrs.active = true; - renderQueue.push(vnode); - continue; - } - - // If tab was previously cached, push to render queue but don't activate - // Otherwise push an empty node - renderQueue.push(tabIsCached ? vnode : h()); - } - - // Post processing after initial render - // Required for tabs within Vue components or router view - Vue.nextTick(() => { - for (let i = 0; i < postRenderQueue.length; i++) { - const vnode = postRenderQueue[i]; - - if (vnode && vnode.elm && vnode.elm.nodeName === 'ION-TAB') { - const ionTab = vnode.elm as HTMLIonTabElement; - const vnodeData = { - data: { - attrs: { tab: ionTab.getAttribute('tab'), routes: ionTab.getAttribute('route') }, - }, - }; - const tabName = matchRouteToTab(vnodeData as any, route); - - // Set tab active state - ionTab.active = !!tabName; - - // Loop through all tab-bars and set active tab - if (tabName) { - for (const tabBar of tabBars) { - (tabBar.elm as HTMLIonTabBarElement).selectedTab = tabName; - } - } - - cachedTabs[i] = vnode; - } - } - - // Free tab-bars references - tabBars.length = 0; - }); - - // Render - return h('div', { ...data, style: hostStyles }, [ - parseSlot(slots().top, selectedTab, listeners), - h('div', { class: 'tabs-inner', style: tabsInner }, renderQueue), - parseSlot(slots().bottom, selectedTab, listeners), - ]); - } -}; - -// Search for ion-tab-bar in VNode array -function parseSlot(slot: VNode[], tab: string, listeners: EventListeners): VNode[] { - const vnodes = [] as VNode[]; - - if (!slot) { - return vnodes; - } - - for (const vnode of slot) { - vnodes.push(vnode.tag && vnode.tag.match(/ion-tab-bar$/) ? parseTabBar(vnode, tab, listeners) : vnode); - } - - return vnodes; -} - -// Set selected tab attribute and click handlers -function parseTabBar(vnode: VNode, tab: string, listeners: EventListeners): VNode { - const { IonTabsWillChange, IonTabsDidChange } = listeners; - - if (!vnode.data) { - vnode.data = { - attrs: { - 'selected-tab': tab, - }, - }; - } else if (!vnode.data.attrs) { - vnode.data.attrs = { 'selected-tab': tab }; - } else { - vnode.data.attrs['selected-tab'] = tab; - } - - // Loop through ion-tab-buttons and assign click handlers - // If custom click handler was provided, do not override it - if (vnode.children) { - for (const child of vnode.children) { - if (child.tag && child.tag === 'ion-tab-button') { - const clickHandler = (e: Event) => { - const path = (child.elm as HTMLIonTabButtonElement).tab; - const route = hasDataAttr(child, 'to') ? child.data!.attrs!.to : { path }; - e.preventDefault(); - - // Do not trigger any events if there's nowhere to go to - if (!route) { - return; - } - - if (Array.isArray(IonTabsWillChange)) { - IonTabsWillChange.map(item => item(route)); - } else if (IonTabsWillChange) { - IonTabsWillChange(route); - } - - vnode.context!.$router.push(route, () => { - if (Array.isArray(IonTabsDidChange)) { - IonTabsDidChange.map(item => item(route)); - } else if (IonTabsDidChange) { - IonTabsDidChange(route); - } - }); - }; - - if (!child.data || !child.data.on || !child.data.on.click) { - Object.assign(child.data, { on: { click: clickHandler } }); - } else if (child.data.on.click) { - // Always push our click handler to end of array - if (Array.isArray(child.data.on.click)) { - child.data.on.click.push(clickHandler); - } else { - // tslint:disable-next-line:ban-types - child.data.on.click = [child.data.on.click as Function, clickHandler]; - } - } - } - } - } - - // Store a reference to the matched ion-tab-bar - tabBars.push(vnode); - - return vnode; -} - -// Check if a VNode has a specific attribute set -function hasDataAttr(vnode: VNode, attr: string) { - return vnode.data && vnode.data.attrs && vnode.data.attrs[attr]; -} - -// Match tab to route through :routes property -// Otherwise match by URL -function matchRouteToTab(vnode: VNode, route: Route): string { - if (!vnode.data || !vnode.data.attrs || !vnode.data.attrs.tab) { - throw new Error('The tab attribute is required for an ion-tab element'); - } - - const tabName = vnode.data.attrs.tab; - - // Handle route matching by :routes attribute - if (vnode.data.attrs.routes) { - const routes = Array.isArray(vnode.data.attrs.routes) - ? vnode.data.attrs.routes - : vnode.data.attrs.routes.replace(' ', '').split(','); - - // Parse an array of possible matches - for (const r of routes) { - if (route.name === r) { - return tabName; - } - } - } else { - if (route.path.indexOf(tabName) > -1) { - return tabName; - } - } - - return ''; -} - -// CSS for ion-tabs inner and outer elements -const hostStyles = { - display: 'flex', - position: 'absolute', - top: 0, - left: 0, - right: 0, - bottom: 0, - flexDirection: 'column', - width: '100%', - height: '100%', - contain: 'layout size style', -}; - -const tabsInner = { - position: 'relative', - flex: 1, - contain: 'layout size style', -}; diff --git a/src/components/overlays.ts b/src/components/overlays.ts index 6db77ea..b71d7b0 100644 --- a/src/components/overlays.ts +++ b/src/components/overlays.ts @@ -1,20 +1,24 @@ -import { createOverlayComponent } from '../utils'; import { + ActionSheetOptions, + ModalOptions, + PopoverOptions, actionSheetController, modalController, popoverController -} from '../controllers'; +} from '@ionic/core'; +import { OverlayType, defineOverlay } from '../utils'; -export const IonModalVue = createOverlayComponent( - 'IonModal', +export const IonModal = defineOverlay( + OverlayType.Modal, modalController ); -export const IonActionSheetVue = createOverlayComponent< - HTMLIonActionSheetElement ->('IonActionSheet', actionSheetController); +export const IonActionSheet = defineOverlay< + HTMLIonActionSheetElement, + ActionSheetOptions +>(OverlayType.ActionSheet, actionSheetController); -export const IonPopoverVue = createOverlayComponent( - 'IonPopover', +export const IonPopover = defineOverlay( + OverlayType.Popover, popoverController ); diff --git a/src/controllers/index.ts b/src/controllers/index.ts deleted file mode 100644 index bed8d6f..0000000 --- a/src/controllers/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { - actionSheetController, - alertController, - loadingController, - menuController, - toastController, - pickerController, -} from '@ionic/core'; -import { modalController as _modalController } from './modal-controller'; -import { popoverController as _popoverController } from './popover-controller'; - -export const modalController = _modalController(); -export const popoverController = _popoverController(); diff --git a/src/controllers/modal-controller.ts b/src/controllers/modal-controller.ts deleted file mode 100644 index 7e76fc8..0000000 --- a/src/controllers/modal-controller.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - ModalOptions, - OverlayController, - modalController as _modalController -} from '@ionic/core'; -import { VueDelegate } from './vue-delegate'; - -export interface ModalController extends OverlayController { - create(options: ModalOptions): Promise; -} - -export const modalController = (): ModalController => { - return { - ..._modalController, - create(options: ModalOptions) { - return _modalController.create({ - ...options, - delegate: new VueDelegate() - }); - } - }; -}; diff --git a/src/controllers/popover-controller.ts b/src/controllers/popover-controller.ts deleted file mode 100644 index bbdfaab..0000000 --- a/src/controllers/popover-controller.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - PopoverOptions, - popoverController as _popoverController -} from '@ionic/core'; -import { VueDelegate } from './vue-delegate'; - -export const popoverController = () => { - return { - ..._popoverController, - create(options: PopoverOptions) { - return _popoverController.create({ - ...options, - delegate: new VueDelegate() - }); - } - }; -}; diff --git a/src/controllers/vue-delegate.ts b/src/controllers/vue-delegate.ts deleted file mode 100644 index 62be1c5..0000000 --- a/src/controllers/vue-delegate.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Vue, { VueConstructor } from 'vue'; -import { - FrameworkDelegate, - LIFECYCLE_DID_ENTER, - LIFECYCLE_DID_LEAVE, - LIFECYCLE_WILL_ENTER, - LIFECYCLE_WILL_LEAVE, - LIFECYCLE_WILL_UNLOAD -} from '@ionic/core'; -import { EsModule, HTMLVueElement, WebpackFunction } from '../interfaces'; - -// Handle creation of sync and async components -async function createVueComponent( - component: WebpackFunction | object | VueConstructor -): Promise { - if ( - typeof component === 'function' && - (component as WebpackFunction).cid === undefined - ) { - const cmp = await (component as WebpackFunction)(); - return Vue.extend(isESModule(cmp) ? cmp.default : cmp); - } - return Vue.extend(component); -} - -export class VueDelegate implements FrameworkDelegate { - // Attach the passed Vue component to DOM - async attachViewToDom( - parentElement: HTMLElement, - component: HTMLElement | WebpackFunction | object | VueConstructor, - opts?: object, - classes?: string[] - ): Promise { - // Handle HTML elements - if (isElement(component)) { - // Add any classes to the element - addClasses(component as HTMLElement, classes); - - // Append the element to DOM - parentElement.appendChild(component as HTMLElement); - bindLifecycleEvents(component, parentElement); - return Promise.resolve(component as HTMLElement); - } - - // Get the Vue constructor - const constructor = await createVueComponent(component); - const componentInstance = new constructor(opts); - componentInstance.$mount(); - - // Add any classes to the Vue component's root element - addClasses(componentInstance.$el as HTMLElement, classes); - - // Append the Vue component to DOM - parentElement.appendChild(componentInstance.$el); - return componentInstance.$el as HTMLElement; - } - - // Remove the earlier created Vue component from DOM - removeViewFromDom( - _parentElement: HTMLElement, - childElement: HTMLVueElement - ): Promise { - // Destroy the Vue component instance - if (childElement.__vue__) { - childElement.__vue__.$destroy(); - } - - return Promise.resolve(); - } -} - -const LIFECYCLES = [ - LIFECYCLE_WILL_ENTER, - LIFECYCLE_DID_ENTER, - LIFECYCLE_WILL_LEAVE, - LIFECYCLE_DID_LEAVE, - LIFECYCLE_WILL_UNLOAD -]; - -export function bindLifecycleEvents(instance: any, element: HTMLElement) { - LIFECYCLES.forEach(eventName => { - element.addEventListener(eventName, (ev: any) => { - if (typeof instance[eventName] === 'function') { - instance[eventName](ev.detail); - } - }); - }); -} - -// Check Symbol support -const hasSymbol = - typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; - -// Check if object is an ES module -function isESModule(obj: EsModule) { - return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module'); -} - -// Check if value is an Element -function isElement(el: any) { - return typeof Element !== 'undefined' && el instanceof Element; -} - -// Add an array of classes to an element -function addClasses(element: HTMLElement, classes: string[] = []) { - for (const cls of classes) { - element.classList.add(cls); - } -} diff --git a/src/index.ts b/src/index.ts index 9092b39..4f5ac87 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,16 +1,4 @@ import { addIcons } from 'ionicons'; -export { - createAnimation, - createGesture, - AlertButton, - AlertInput, - Gesture, - GestureConfig, - GestureDetail, - mdTransitionAnimation, - iosTransitionAnimation, - setupConfig -} from '@ionic/core'; import { arrowBackSharp, caretBackSharp, @@ -26,17 +14,10 @@ import { searchOutline, searchSharp } from 'ionicons/icons'; -import { install } from './ionic'; -export default { - install, - version: '__VERSION__' -}; - -export { default as IonicVueRouter } from './router'; - -export * from './controllers'; +export { IonicVue } from './ionic-vue'; export * from './components'; +// export { default as IonicVueRouter } from './router'; // Icons that are used by internal components addIcons({ diff --git a/src/interfaces.ts b/src/interfaces.ts deleted file mode 100644 index cbd3d42..0000000 --- a/src/interfaces.ts +++ /dev/null @@ -1,88 +0,0 @@ -import Vue from 'vue'; -import VueRouter from 'vue-router'; -import { HTMLStencilElement, IonicConfig, RouterDirection } from '@ionic/core'; -import { RouterOptions } from 'vue-router/types/router'; - -declare module 'vue-router/types/router' { - interface VueRouter { - direction: RouterDirection; - directionOverride: RouterDirection | null; - transition: Promise; - canGoBack(): boolean; - } -} - -export interface HTMLVueElement extends HTMLElement { - __vue__: Vue; -} - -export interface VueWindow extends Window { - Vue: typeof Vue; - VueRouter: typeof VueRouter; - disableIonicTransitions: boolean; -} - -export interface WebpackFunction extends Function { - cid: number; -} - -export interface EsModule extends Object { - __esModule?: boolean; - [Symbol.toStringTag]: string; -} - -export interface IonicGlobal { - config?: IonicConfig; - asyncQueue?: boolean; -} - -export interface IonicWindow extends Window { - Ionic: IonicGlobal; - __zone_symbol__requestAnimationFrame?: (ts: FrameRequestCallback) => number; -} - -export interface FrameworkDelegate { - attachViewToDom(parentElement: HTMLElement, component: HTMLElement | WebpackFunction | object | Vue, opts?: object, classes?: string[]): Promise; - removeViewFromDom(parentElement: HTMLElement, childElement: HTMLVueElement): Promise; -} - -export interface IonBackButton extends HTMLStencilElement { - defaultHref?: string; -} - -export interface IonRouterOutlet extends HTMLStencilElement { - commit(enterinEl: HTMLElement, leavingEl: HTMLElement | undefined, opts?: object | undefined): Promise; -} - -export interface ApiCache { - [key: string]: any; -} - -export interface RouterArgs extends RouterOptions { - direction?: RouterDirection; - viewCount?: number; -} - -export interface ProxyControllerInterface { - create(opts: object): Promise; - dismiss(): Promise; - getTop(): Promise; -} - -export interface ProxyDelegateOptions extends Object { - [key: string]: any; - delegate?: FrameworkDelegate; -} - -export interface ProxyMenuControllerInterface { - open(menuId?: string): Promise; - close(menuId?: string): Promise; - toggle(menuId?: string): Promise; - enable(shouldEnable: boolean, menuId?: string): Promise; - swipeEnable(shouldEnable: boolean, menuId?: string): Promise; - isOpen(menuId?: string): Promise; - isEnabled(menuId?: string): Promise; - get(menuId?: string): Promise; - getOpen(): Promise; - getMenus(): Promise; -} diff --git a/src/ionic-vue.ts b/src/ionic-vue.ts new file mode 100644 index 0000000..a98ab44 --- /dev/null +++ b/src/ionic-vue.ts @@ -0,0 +1,20 @@ +import { App, Plugin } from 'vue'; +import { IonicConfig } from '@ionic/core'; +import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; + +interface IonicWindow extends Window { + Ionic: { + config?: IonicConfig; + }; +} + +export const IonicVue: Plugin = { + async install(_app: App, config?: IonicConfig) { + const win: IonicWindow = window as any; + const Ionic = win?.Ionic || {}; + Ionic.config = config || {}; + + await applyPolyfills(); + defineCustomElements(win); + } +}; diff --git a/src/ionic.ts b/src/ionic.ts deleted file mode 100644 index 8365d42..0000000 --- a/src/ionic.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { appInitialize } from './app-initialize'; -import VueImport, { PluginFunction } from 'vue'; -import { IonicConfig } from '@ionic/core'; - -let Vue: typeof VueImport; - -export const install: PluginFunction = (_Vue, config) => { - if (Vue && _Vue === Vue) { - if (process.env.NODE_ENV !== 'production') { - console.error( - '[Ionic] Plugin already installed. Vue.use(Ionic) should be called only once.' - ); - } - return; - } - Vue = _Vue; - Vue.config.ignoredElements.push(/^ion-/); - appInitialize(config); -}; diff --git a/src/router.ts b/src/router.ts deleted file mode 100644 index 588b831..0000000 --- a/src/router.ts +++ /dev/null @@ -1,121 +0,0 @@ -import VueRouter, { Route } from 'vue-router'; -import { PluginFunction } from 'vue'; -import { RouterArgs } from './interfaces'; -import IonVueRouter from './components/ion-vue-router'; -import { BackButtonEvent, RouterDirection } from '@ionic/core'; - -// Extend the official VueRouter -export default class Router extends VueRouter { - direction: RouterDirection; - directionOverride: RouterDirection | null; - viewCount: number; - prevRouteStack: Route[]; - history: any; - static installed: boolean; - static install: PluginFunction; - - constructor(args: RouterArgs = {} as RouterArgs) { - super(args); - - // The direction user navigates in - this.direction = args.direction || 'forward'; - - // Override normal direction - this.directionOverride = null; - - // Number of views navigated - this.viewCount = args.viewCount || 0; - - // Stack of previous routes - this.prevRouteStack = []; - - // Extend the existing history object - this.extendHistory(); - - // Wait for transition to finish before confirming navigation - this.extendTransitionConfirmation(); - - // Listen to Ionic's back button event - document.addEventListener('ionBackButton', (e: Event) => { - (e as BackButtonEvent).detail.register(0, () => this.back()); - }); - } - - extendTransitionConfirmation() { - this.history._confirmTransition = this.history.confirmTransition; - this.history.confirmTransition = async (...opts: any) => { - if (undefined !== this.transition) { - await this.transition; - } - this.history._confirmTransition(...opts); - }; - } - - extendHistory() { - // Save a reference to the original method - this.history._updateRoute = this.history.updateRoute; - - this.history.updateRoute = (nextRoute: Route) => { - // Guesstimate the direction of the next route - this.direction = this.guessDirection(nextRoute); - - // Override the direction - if (this.directionOverride) { - this.direction = this.directionOverride; - } - - // Increment or decrement the view count - this.viewCount += this.direction === 'back' ? -1 : 1; - - // Call the original method - this.history._updateRoute(nextRoute); - - // Reset direction overrides - this.directionOverride = null; - }; - } - - canGoBack(): boolean { - // We can display the back button if we're not on / - // or there were more than 1 views rendered - return this.viewCount > 1 && this.currentRoute.fullPath.length > 1; - } - - guessDirection(nextRoute: Route): RouterDirection { - if (this.prevRouteStack.length !== 0) { - const prevRoute: Route = this.prevRouteStack[this.prevRouteStack.length - 1]; - - // Last route is the same as the next one - go back - // If we're going to / reset the stack otherwise pop a route - if (prevRoute.fullPath === nextRoute.fullPath) { - if (prevRoute.fullPath.length === 1) { - this.prevRouteStack = []; - } else { - this.prevRouteStack.pop(); - } - return 'back'; - } - } - - // Forward movement, push next route to stack - if (this.history.current.fullPath !== nextRoute.fullPath) { - this.prevRouteStack.push(this.history.current); - } - return 'forward'; - } -} - -Router.install = (Vue) => { - // If already installed - skip - if (Router.installed) { - return; - } - - Router.installed = true; - - // Install the official VueRouter - VueRouter.install(Vue); - - // Register the IonVueRouter component globally - Vue.component('IonVueRouter', IonVueRouter); -}; diff --git a/src/sfc.d.ts b/src/sfc.d.ts deleted file mode 100644 index 8f6f410..0000000 --- a/src/sfc.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.vue' { - import Vue from 'vue'; - export default Vue; -} diff --git a/src/utils/createInputComponent.ts b/src/utils/createInputComponent.ts deleted file mode 100644 index a1c8132..0000000 --- a/src/utils/createInputComponent.ts +++ /dev/null @@ -1,74 +0,0 @@ -import Vue, { CreateElement, RenderContext } from 'vue'; - -interface EventHandler { - [key: string]: (e: Event) => void; -} - -type Callback = (value: Event | string) => void; - -// Events to register handlers for -const events: string[] = [ - 'ionChange', - 'ionInput', - 'ionBlur', - 'ionFocus', - 'ionCancel', - 'ionSelect' -]; - -export function createInputComponent( - name: string, - coreTag: string, - modelEvent = 'ionChange', - valueProperty = 'value' -) { - return Vue.extend({ - name, - functional: true, - model: { - event: modelEvent, - prop: valueProperty - }, - render(h: CreateElement, { data, listeners, slots }: RenderContext) { - return h( - coreTag, - { - ...data, - on: buildEventHandlers(listeners, modelEvent, valueProperty) - }, - slots().default - ); - } - }); -} - -function buildEventHandlers( - listeners: RenderContext['listeners'], - modelEvent: string, - valueProperty: string -) { - const handlers: EventHandler = {}; - - // Loop through all the events - events.map((eventName: string) => { - if (!listeners[eventName]) { - return; - } - - // Normalize listeners coming from context as Function | Function[] - const callbacks: Callback[] = Array.isArray(listeners[eventName]) - ? (listeners[eventName] as Callback[]) - : [listeners[eventName] as Callback]; - - // Assign handlers - handlers[eventName] = (e: Event) => { - callbacks.map(f => { - if (e) { - f(modelEvent === eventName ? (e.target as any)[valueProperty] : e); - } - }); - }; - }); - - return handlers; -} diff --git a/src/utils/createOverlayComponent.ts b/src/utils/createOverlayComponent.ts deleted file mode 100644 index 7b9640d..0000000 --- a/src/utils/createOverlayComponent.ts +++ /dev/null @@ -1,100 +0,0 @@ -import Vue, { CreateElement, VueConstructor } from 'vue'; - -export interface OverlayElement extends HTMLElement { - present: () => Promise; - dismiss: (data?: any, role?: string | undefined) => Promise; -} - -export interface Data { - overlay: T | null; -} - -export interface Methods { - present: () => Promise; -} - -export interface Props { - isOpen: boolean; -} - -export function createOverlayComponent( - name: string, - controller: { create: (opts: any) => Promise } -): VueConstructor & Methods & Props & Vue> { - const coreTag = name.charAt(0).toLowerCase() + name.slice(1); - const eventHandlers = Object.entries({ - [`${coreTag}WillPresent`]: 'onWillPresent', - [`${coreTag}DidPresent`]: 'onDidPresent', - [`${coreTag}WillDismiss`]: 'onWillDismiss', - [`${coreTag}DidDismiss`]: 'onDidDismiss', - }); - - return Vue.extend, Methods, {}, Props>({ - name: `${name}Vue`, - data() { - return { - overlay: null, - }; - }, - props: { - isOpen: { - type: Boolean, - required: true, - }, - }, - watch: { - async isOpen(newVal: boolean) { - console.log(newVal); - if (newVal) { - if (this.overlay) { - await this.overlay.present(); - } else { - await this.present(); - } - } else { - await this.overlay?.dismiss(); - this.overlay = null; - } - } - }, - async mounted() { - console.log(this.isOpen); - this.isOpen && await this.present(); - }, - async beforeDestroy() { - console.log('bye'); - await this.overlay?.dismiss(); - }, - render(h: CreateElement) { - for (const [eventName, handler] of eventHandlers) { - console.log(eventName, handler); - if (this.$listeners[handler]) { - this.overlay?.addEventListener(eventName, (e: Event) => { - const handlers = this.$listeners[handler]; - if (Array.isArray(handlers)) { - handlers.map(f => f(e)); - return; - } - handlers(e); - }); - } - } - return h('div', [h('div', { ref: 'overlay' }, this.overlay ? this.$slots.default : null)]); - }, - methods: { - async present() { - - // const children = this.$slots.default; - this.overlay = await controller.create({ - ...this.$attrs, - component: this.$refs.overlay, - componentProps: { parent: this }, - }); - - console.log(this.overlay); - - await this.overlay.present(); - } - } - }); -} diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts new file mode 100644 index 0000000..66efcb9 --- /dev/null +++ b/src/utils/defineContainer.ts @@ -0,0 +1,14 @@ +import { FunctionalComponent, h } from 'vue'; + +type Data = { + [key: string]: unknown; +}; + +export const defineContainer = (name: string) => { + const Container: FunctionalComponent = (props, { slots }) => + h(name, props, slots.default && slots.default()); + + Container.displayName = name; + + return Container; +}; diff --git a/src/utils/defineInput.ts b/src/utils/defineInput.ts new file mode 100644 index 0000000..489724f --- /dev/null +++ b/src/utils/defineInput.ts @@ -0,0 +1,42 @@ +import { FunctionalComponent, h } from 'vue'; + +export interface InputProps { + modelValue: string | boolean; + [key: string]: unknown; +} + +export enum InputEvents { + onUpdate = 'update:modelValue' +} + +// @TODO +// remove replace() when Vue supports camelCase events that Ionic uses +// camelCase attributes don't work either +export function defineInput( + name: string, + ionTag: string, + updateEvent = 'onIonChange', + modelProp = 'value' +) { + const Input: FunctionalComponent = ( + props, + { attrs, slots, emit } + ) => { + return h( + ionTag, + { + ...attrs, + [modelProp]: props.modelValue, + [updateEvent.replace('Ion', '')]: (e: Event) => + emit(InputEvents.onUpdate, (e?.target as any)[modelProp]) + }, + slots.default && slots.default() + ); + }; + + Input.displayName = name; + Input.props = [modelProp, 'modelValue']; + Input.emits = [InputEvents.onUpdate]; + + return Input; +} diff --git a/src/utils/defineOverlay.ts b/src/utils/defineOverlay.ts new file mode 100644 index 0000000..0c45199 --- /dev/null +++ b/src/utils/defineOverlay.ts @@ -0,0 +1,127 @@ +import { FunctionalComponent, h, ref } from 'vue'; + +export interface OverlayElement extends HTMLElement { + present: () => Promise; + dismiss: (...args: any) => Promise; +} + +export interface OverlayProps { + isOpen?: boolean; + modelValue?: boolean; +} + +export interface OverlayController { + create: (...args: any) => Promise; +} + +export type OverlayEventListeners = [ + string, + Exclude +][]; + +export enum OverlayEvents { + onWillPresent = 'onWillPresent', + onDidPresent = 'onDidPresent', + onWillDismiss = 'onWillDismiss', + onDidDismiss = 'onDidDismiss', + onUpdate = 'update:modelValue' +} + +export enum OverlayType { + Modal = 'IonModal', + ActionSheet = 'IonActionSheet', + Popover = 'IonPopover' +} + +export function defineOverlay( + name: OverlayType, + controller: OverlayController +) { + const overlay = ref(null); + const content = ref(null); + const coreTag = name.charAt(0).toLowerCase() + name.slice(1); + const eventListeners: OverlayEventListeners = Object.entries({ + [`${coreTag}WillPresent`]: OverlayEvents.onWillPresent, + [`${coreTag}DidPresent`]: OverlayEvents.onDidPresent, + [`${coreTag}WillDismiss`]: OverlayEvents.onWillDismiss, + [`${coreTag}DidDismiss`]: OverlayEvents.onDidDismiss + }); + + const Overlay: FunctionalComponent< + OverlayProps & Omit, + OverlayEvents[] + > = (props, { attrs, slots, emit }) => { + const isOpen = props.isOpen === undefined ? props.modelValue : props.isOpen; + + if (!attrs.onDidDismiss) { + attrs.onDidDismiss = () => emit(OverlayEvents.onUpdate, false); + } + + return h( + 'div', + { + style: { display: 'none' }, + async onVnodeUpdated() { + if (isOpen) { + await (overlay.value?.present() || present(attrs)); + } else { + await overlay.value?.dismiss(); + overlay.value = null; + } + }, + async onVnodeMounted() { + isOpen && (await present(attrs)); + }, + async onVnodeBeforeUnmount() { + await overlay.value?.dismiss(); + overlay.value = null; + content.value = null; + } + }, + [h('div', { ref: content }, slots.default ? slots.default() : undefined)] + ); + }; + + Overlay.displayName = name; + Overlay.inheritAttrs = false; + Overlay.props = ['isOpen', 'modelValue']; + Overlay.emits = [ + OverlayEvents.onUpdate, + OverlayEvents.onWillPresent, + OverlayEvents.onDidPresent, + OverlayEvents.onWillDismiss, + OverlayEvents.onDidDismiss + ]; + + async function present({ + onWillPresent, + onDidPresent, + onWillDismiss, + onDidDismiss, + ...attrs + }: Partial void>>) { + overlay.value = await controller.create({ + ...attrs, + component: content.value + }); + + const listeners = { + onWillPresent, + onDidPresent, + onWillDismiss, + onDidDismiss + }; + for (const [eventName, listener] of eventListeners) { + const handlers = listeners[listener]; + if (handlers) { + overlay.value?.addEventListener(eventName, (e: Event) => { + Array.isArray(handlers) ? handlers.map(f => f(e)) : handlers(e); + }); + } + } + + await overlay.value.present(); + } + + return Overlay; +} diff --git a/src/utils/index.ts b/src/utils/index.ts index af840fd..54aca8c 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,2 +1,3 @@ -export * from "./createOverlayComponent"; -export * from "./createInputComponent"; +export * from './defineOverlay'; +export * from './defineInput'; +export * from './defineContainer'; diff --git a/test/api.spec.js b/test/api.spec.js deleted file mode 100644 index 3658cad..0000000 --- a/test/api.spec.js +++ /dev/null @@ -1,184 +0,0 @@ -import Vue from 'vue' -import API from '../src/api.js' - -const api = new API() - -beforeEach(() => { - HTMLElement.prototype.componentOnReady = function() { - const el = this - el.create = function(props = {}) { - return Object.assign(el, props) - } - el.dismiss = function() { - return el - } - el.getTop = el.dismiss - el.open = el.create - el.close = el.dismiss - el.toggle = el.dismiss - el.enable = el.dismiss - el.swipeEnable = el.dismiss - el.isOpen = el.dismiss - el.isEnabled = el.dismiss - el.get = el.dismiss - el.getOpen = el.dismiss - el.getMenus = el.dismiss - - return Promise.resolve(el) - } -}) - -afterEach(() => { - HTMLElement.prototype.componentOnReady = undefined -}) - -describe('API', () => { - it('Installs correctly', () => { - Vue.use(API) - - const app = new Vue() - - expect(typeof app.$ionic).toBe('object') - expect(API.install(Vue)).toBeFalsy() - }) - - it('Creates action sheet controller', () => { - expect.assertions(3) - - api.actionSheetController - .dismiss() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.actionSheetController - .getTop() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - return api.actionSheetController.create().then(c => { - return expect(c).toBeTruthy() - }) - }) - - it('Creates alert controllers', () => { - expect.assertions(3) - - // Creates initial element - api.alertController - .create({ foo: 'bar' }) - .then(c => { - return expect(c.foo).toBe('bar') - }) - .catch(err => err) - - // Returns previous element with extra props - return api.alertController.create({ bar: 'foo' }).then(c => { - expect(c.foo).toBe('bar') - return expect(c.bar).toBe('foo') - }) - }) - - it('Creates loading controllers', done => { - return api.loadingController.create({ bar: 'foo' }).then(c => { - expect(c.bar).toBe('foo') - return done() - }) - }) - - it('Creates modal controllers', done => { - return api.modalController.create({ bar: 'foo' }).then(c => { - expect(c.bar).toBe('foo') - return done() - }) - }) - - it('Creates popover controllers', done => { - return api.popoverController.create({ bar: 'foo' }).then(c => { - expect(c.bar).toBe('foo') - return done() - }) - }) - - it('Creates toast controllers', done => { - return api.toastController.create({ bar: 'foo' }).then(c => { - expect(c.bar).toBe('foo') - return done() - }) - }) - - it('Creates menu controllers', done => { - expect.assertions(10) - - api.menuController - .close() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .toggle() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .enable() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .swipeEnable() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .isOpen() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .isEnabled() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .get() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .getOpen() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - api.menuController - .getMenus() - .then(c => { - return expect(c).toBeTruthy() - }) - .catch(err => err) - - return api.menuController.open({ bar: 'foo' }).then(c => { - expect(c.bar).toBe('foo') - return done() - }) - }) -}) diff --git a/test/framework-delegate.spec.js b/test/framework-delegate.spec.js deleted file mode 100644 index 9c3a59e..0000000 --- a/test/framework-delegate.spec.js +++ /dev/null @@ -1,73 +0,0 @@ -import Vue from 'vue' -import Delegate from '../src/framework-delegate.js' - -const delegate = new Delegate(Vue) - -const app = document.createElement('div') -app.id = 'app' -document.body.appendChild(app) - -describe('Framework delegation', () => { - it('Attaches components to DOM', () => { - expect.assertions(2) - - const component = { - template: '

foo

', - } - - const data = { - data() { - return { foo: 'bar' } - }, - } - - return delegate.attachViewToDom(app, component, data, ['foo']).then(el => { - expect(el.classList.contains('foo')).toBeTruthy() - expect(el.__vue__.foo).toBe('bar') - return - }) - }) - - it('Attaches lazy loaded components to DOM', () => { - expect.assertions(2) - - const component = function() { - return Promise.resolve({ - render(h) { - return h('p') - }, - }) - } - - const data = { - data() { - return { foo: 'bar' } - }, - } - - return delegate.attachViewToDom(app, component, data, ['foo']).then(el => { - expect(el.classList.contains('foo')).toBeTruthy() - expect(el.__vue__.foo).toBe('bar') - return - }) - }) - - it('Attaches HTML elements to DOM', () => { - expect.assertions(1) - const element = document.createElement('p') - - return delegate.attachViewToDom(app, element, null, ['foo']).then(el => { - return expect(el.classList.contains('foo')).toBeTruthy() - }) - }) - - it('Removes from DOM', () => { - expect.assertions(2) - const div = document.querySelector('p') - expect(typeof div.__vue__).toBe('object') - - return delegate.removeViewFromDom(app, div).then(() => { - return expect(div.__vue__).toBe(null) - }) - }) -}) diff --git a/test/ion-vue-router-transitionless.spec.js b/test/ion-vue-router-transitionless.spec.js deleted file mode 100644 index 2493b1a..0000000 --- a/test/ion-vue-router-transitionless.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -import Vue from 'vue' -import Router from '../src/router.js' -import IonVueRouterTransitionless from '../src/components/ion-vue-router-transitionless.vue' - -Vue.use(Router) - -describe('IonVueRouter', () => { - it('Catches back button click event', () => { - const constructor = Vue.extend(IonVueRouterTransitionless) - const component = new constructor({ router: new Router({ mode: 'abstract' }) }) - - expect(component.catchIonicGoBack({})).toBeFalsy() - - component.$router.push('/') - component.$router.push('/foo') - expect(component.$route.fullPath).toBe('/foo') - - // Go back - component.catchIonicGoBack(mockBackEvent('/')) - expect(component.$route.fullPath).toBe('/') - - // Should not go back - component.catchIonicGoBack(mockBackEvent()) - expect(component.$route.fullPath).toBe('/') - - // Go back to default route - component.catchIonicGoBack(mockBackEvent('/bar')) - expect(component.$route.fullPath).toBe('/bar') - }) -}) - -function mockBackEvent(route) { - return { - target: { - closest() { - return { - defaultHref: route, - } - }, - }, - preventDefault() {}, - } -} diff --git a/test/ion-vue-router.spec.js b/test/ion-vue-router.spec.js deleted file mode 100644 index f029fec..0000000 --- a/test/ion-vue-router.spec.js +++ /dev/null @@ -1,170 +0,0 @@ -import Vue from 'vue' -import Router from '../src/router.js' -import IonVueRouter from '../src/components/ion-vue-router.vue' - -describe('IonVueRouter', () => { - Vue.use(Router) - Vue.config.ignoredElements.push(/^ion-/) - - const app = new Vue({ - components: { Toolbar: Toolbar() }, - render(h) { - return h('ion-vue-router') - }, - router: new Router({ - mode: 'abstract', - routes: [{ path: '/', component: Home() }, { path: '/page', component: Page() }], - }), - }).$mount() - - it('Renders the home route correctly', done => { - app.$router.push('/') - setTimeout(() => { - expect(app.$el.textContent.trim()).toBe('Home Go to page') - done() - }, 1) - }) - - it('Renders the page route correctly', done => { - app.$router.push('/page') - setTimeout(() => { - expect(app.$el.textContent.trim()).toBe('Page Go home') - done() - }, 1) - }) - - it('Renders back route correctly', done => { - app.$router.go(-1) - setTimeout(() => { - expect(app.$el.textContent.trim()).toBe('Home Go to page') - done() - }, 1) - }) - - it('Sets the default data correctly', () => { - expect(typeof IonVueRouter.data).toBe('function') - expect(IonVueRouter.data()).toMatchObject({ - leavingEl: null, - enteringEl: null, - }) - }) - - it('Sets the default props correctly', () => { - const constructor = Vue.extend(IonVueRouter) - const component = new constructor({ router: new Router() }) - expect(component.bindCss).toBeFalsy() - expect(component.animated).toBeTruthy() - expect(component.name).toBe('default') - }) - - it('Transitions correctly', () => { - expect.assertions(3) - - const constructor = Vue.extend(IonVueRouter) - const component = new constructor({ router: new Router() }) - - component.$refs.ionRouterOutlet = mockIonRouterOutlet() - expect(component.transition()).toBeFalsy() - - component.enteringEl = document.createElement('div') - component.leave(document.createElement('h1'), res => { - expect(res).toBeTruthy() - }) - - return component - .transition(document.createElement('div'), document.createElement('h1')) - .then(res => { - return expect(res).toBeTruthy() - }) - }) - - it('Gets duration correctly', () => { - const constructor = Vue.extend(IonVueRouter) - const component = new constructor({ router: new Router() }) - - expect(component.getDuration()).toBe(undefined) - - component.animated = false - expect(component.getDuration()).toBe(0) - }) - - it('Gets direction correctly', () => { - const constructor = Vue.extend(IonVueRouter) - const component = new constructor({ router: new Router() }) - - expect(component.getDirection()).toBe('forward') - - component.$router.direction = -1 - expect(component.getDirection()).toBe('back') - }) - - it('Runs stub methods correctly', () => { - const constructor = Vue.extend(IonVueRouter) - const component = new constructor({ router: new Router() }) - - component.enterCancelled() - component.leaveCancelled() - }) -}) - -function Toolbar() { - return Vue.component('Toolbar', { - name: 'Toolbar', - props: { - backURL: { type: String, default: '' }, - title: { type: String, default: '' }, - }, - template: ` - - - - - - {{ title }} - - `, - }) -} - -function Home() { - return Vue.component('Home', { - template: ` - - - - Go to page - - `, - }) -} - -function Page() { - return Vue.component('Page', { - methods: { - goHome() { - this.$router.back() - }, - }, - template: ` - - - - Go home - - `, - }) -} - -function mockIonRouterOutlet() { - return { - componentOnReady() { - return new Promise(resolve => { - return resolve({ - commit() { - return true - }, - }) - }) - }, - } -} diff --git a/test/router.node.spec.js b/test/router.node.spec.js deleted file mode 100644 index e79a744..0000000 --- a/test/router.node.spec.js +++ /dev/null @@ -1,9 +0,0 @@ -import Vue from 'vue' - -describe('Router node', () => { - it('Sets globals correctly', () => { - window.Vue = undefined - global.Vue = Vue - require('../src/router.js') - }) -}) diff --git a/test/router.spec.js b/test/router.spec.js deleted file mode 100644 index 2693e79..0000000 --- a/test/router.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import Vue from 'vue' -import Router from '../src/router.js' - -describe('Router', () => { - it('Installs correctly', () => { - Vue.use(Router) - - const app = new Vue({ - router: new Router(), - }) - - expect(typeof app.$router).toBe('object') - expect(typeof app.$options.components.IonVueRouter).toBe('function') - expect(Router.install()).toBeFalsy() - }) - - it('Navigates correctly', () => { - const r = new Router({ mode: 'abstract' }) - - r.push('/') - expect(r.viewCount).toBe(1) - expect(r.direction).toBe(1) - expect(r.canGoBack()).toBeFalsy() - - r.push('/foo') - expect(r.viewCount).toBe(2) - expect(r.direction).toBe(1) - expect(r.canGoBack()).toBeTruthy() - - r.push('/bar') - expect(r.viewCount).toBe(3) - expect(r.direction).toBe(1) - expect(r.canGoBack()).toBeTruthy() - - r.go(-1) - expect(r.viewCount).toBe(2) - expect(r.direction).toBe(-1) - expect(r.canGoBack()).toBeTruthy() - - r.go(-1) - expect(r.viewCount).toBe(1) - expect(r.direction).toBe(-1) - expect(r.canGoBack()).toBeFalsy() - }) -}) diff --git a/types/app-initialize.d.ts b/types/app-initialize.d.ts index e13c240..ec118bd 100644 --- a/types/app-initialize.d.ts +++ b/types/app-initialize.d.ts @@ -1,3 +1,6 @@ +import { App } from 'vue'; import { IonicConfig } from '@ionic/core'; -export declare function appInitialize(config?: IonicConfig): Promise; +export declare const pluginInstall: { + install(_app: App, config?: IonicConfig | undefined): Promise; +}; //# sourceMappingURL=app-initialize.d.ts.map \ No newline at end of file diff --git a/types/components/containers.d.ts b/types/components/containers.d.ts new file mode 100644 index 0000000..1a515e3 --- /dev/null +++ b/types/components/containers.d.ts @@ -0,0 +1,13 @@ +export declare const IonApp: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +export declare const IonItem: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +export declare const IonLabel: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +export declare const IonButton: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +//# sourceMappingURL=containers.d.ts.map \ No newline at end of file diff --git a/types/components/createOverlayComponent.d.ts b/types/components/createOverlayComponent.d.ts deleted file mode 100644 index b91faa0..0000000 --- a/types/components/createOverlayComponent.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { VueConstructor } from 'vue'; -import { OverlayController } from '@ionic/core'; -interface OverlayElement extends HTMLElement { - present: () => Promise; - dismiss: (data?: any, role?: string | undefined) => Promise; -} -interface Controller extends OverlayController { - create: (opts: any) => Promise; -} -export declare function createOverlayComponent(name: string, controller: Controller): VueConstructor; -export {}; -//# sourceMappingURL=createOverlayComponent.d.ts.map \ No newline at end of file diff --git a/types/components/index.d.ts b/types/components/index.d.ts index 80f59ad..ae64450 100644 --- a/types/components/index.d.ts +++ b/types/components/index.d.ts @@ -1,4 +1,4 @@ export * from './overlays'; export * from './inputs'; -export * from './navigation'; +export * from './containers'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/inputs.d.ts b/types/components/inputs.d.ts index 79358a3..d563a63 100644 --- a/types/components/inputs.d.ts +++ b/types/components/inputs.d.ts @@ -1,10 +1,10 @@ -export declare const IonCheckboxVue: import("vue/types/vue").ExtendedVue>; -export declare const IonDatetimeVue: import("vue/types/vue").ExtendedVue>; -export declare const IonInputVue: import("vue/types/vue").ExtendedVue>; -export declare const IonRadioVue: import("vue/types/vue").ExtendedVue>; -export declare const IonRangeVue: import("vue/types/vue").ExtendedVue>; -export declare const IonSearchbarVue: import("vue/types/vue").ExtendedVue>; -export declare const IonSelectVue: import("vue/types/vue").ExtendedVue>; -export declare const IonTextareaVue: import("vue/types/vue").ExtendedVue>; -export declare const IonToggleVue: import("vue/types/vue").ExtendedVue>; +export declare const IonCheckbox: import("vue").FunctionalComponent; +export declare const IonDatetime: import("vue").FunctionalComponent; +export declare const IonInput: import("vue").FunctionalComponent; +export declare const IonRadio: import("vue").FunctionalComponent; +export declare const IonRange: import("vue").FunctionalComponent; +export declare const IonSearchbar: import("vue").FunctionalComponent; +export declare const IonSelect: import("vue").FunctionalComponent; +export declare const IonTextarea: import("vue").FunctionalComponent; +export declare const IonToggle: import("vue").FunctionalComponent; //# sourceMappingURL=inputs.d.ts.map \ No newline at end of file diff --git a/types/components/ion-modal.d.ts b/types/components/ion-modal.d.ts deleted file mode 100644 index 2c813e7..0000000 --- a/types/components/ion-modal.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const IonModalVue: import("vue").VueConstructor; -//# sourceMappingURL=ion-modal.d.ts.map \ No newline at end of file diff --git a/types/components/ion-vue-router.d.ts b/types/components/ion-vue-router.d.ts index 37cdec2..caa2428 100644 --- a/types/components/ion-vue-router.d.ts +++ b/types/components/ion-vue-router.d.ts @@ -1,26 +1 @@ -import { CreateElement, RenderContext, VNode } from 'vue'; -interface KeepAliveProps { - include?: string | string[] | RegExp; - exclude?: string | string[] | RegExp; - max?: number; -} -declare const _default: { - name: string; - functional: boolean; - props: { - name: { - default: string; - type: StringConstructor; - }; - animated: { - default: boolean; - type: BooleanConstructor; - }; - keepAlive: { - type: (StringConstructor | (() => KeepAliveProps))[]; - }; - }; - render(h: CreateElement, { parent, props, data, children }: RenderContext>): VNode; -}; -export default _default; //# sourceMappingURL=ion-vue-router.d.ts.map \ No newline at end of file diff --git a/types/components/navigation/index.d.ts b/types/components/navigation/index.d.ts index 3ae1c49..f36479a 100644 --- a/types/components/navigation/index.d.ts +++ b/types/components/navigation/index.d.ts @@ -1,3 +1 @@ -export * from './ion-page'; -export * from './ion-tabs'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/navigation/ion-page.d.ts b/types/components/navigation/ion-page.d.ts index 3afb446..fcc30bd 100644 --- a/types/components/navigation/ion-page.d.ts +++ b/types/components/navigation/ion-page.d.ts @@ -1,8 +1 @@ -import { CreateElement, RenderContext } from 'vue'; -declare const _default: { - name: string; - functional: boolean; - render(h: CreateElement, { children }: RenderContext>): import("vue").VNode; -}; -export default _default; //# sourceMappingURL=ion-page.d.ts.map \ No newline at end of file diff --git a/types/components/navigation/ion-tabs.d.ts b/types/components/navigation/ion-tabs.d.ts index e99dec9..42d5e20 100644 --- a/types/components/navigation/ion-tabs.d.ts +++ b/types/components/navigation/ion-tabs.d.ts @@ -1,8 +1 @@ -import { CreateElement, RenderContext, VNode } from 'vue'; -declare const _default: { - name: string; - functional: boolean; - render(h: CreateElement, { parent, data, slots, listeners }: RenderContext>): VNode; -}; -export default _default; //# sourceMappingURL=ion-tabs.d.ts.map \ No newline at end of file diff --git a/types/components/overlays.d.ts b/types/components/overlays.d.ts index e7e601b..c935f66 100644 --- a/types/components/overlays.d.ts +++ b/types/components/overlays.d.ts @@ -1,4 +1,5 @@ -export declare const IonModalVue: import("vue").VueConstructor & import("../utils").Methods & import("../utils").Props & import("vue").default>; -export declare const IonActionSheetVue: import("vue").VueConstructor & import("../utils").Methods & import("../utils").Props & import("vue").default>; -export declare const IonPopoverVue: import("vue").VueConstructor & import("../utils").Methods & import("../utils").Props & import("vue").default>; +import { ActionSheetOptions, ModalOptions, PopoverOptions } from '@ionic/core'; +export declare const IonModal: import("vue").FunctionalComponent, "presentingElement" | "showBackdrop" | "backdropDismiss" | "cssClass" | "animated" | "swipeToClose" | "mode" | "keyboardClose" | "id" | "enterAnimation" | "leaveAnimation">, import("../utils").OverlayEvents[]>; +export declare const IonActionSheet: import("vue").FunctionalComponent, import("../utils").OverlayEvents[]>; +export declare const IonPopover: import("vue").FunctionalComponent, "showBackdrop" | "backdropDismiss" | "cssClass" | "animated" | "mode" | "keyboardClose" | "id" | "enterAnimation" | "leaveAnimation" | "translucent" | "event">, import("../utils").OverlayEvents[]>; //# sourceMappingURL=overlays.d.ts.map \ No newline at end of file diff --git a/types/controllers/index.d.ts b/types/controllers/index.d.ts index c9c7ec8..3131ed3 100644 --- a/types/controllers/index.d.ts +++ b/types/controllers/index.d.ts @@ -1,5 +1,9 @@ -export { actionSheetController, alertController, loadingController, menuController, toastController, pickerController, } from '@ionic/core'; -export declare const modalController: import("./modal-controller").ModalController; +export { actionSheetController, alertController, loadingController, menuController, toastController, pickerController } from "@ionic/core"; +export declare const modalController: { + create(options: import("@ionic/core").ModalOptions): Promise; + dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; + getTop(): Promise; +}; export declare const popoverController: { create(options: import("@ionic/core").PopoverOptions): Promise; dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; diff --git a/types/controllers/modal-controller.d.ts b/types/controllers/modal-controller.d.ts index 5c0a43f..d51ab22 100644 --- a/types/controllers/modal-controller.d.ts +++ b/types/controllers/modal-controller.d.ts @@ -1,6 +1,7 @@ -import { ModalOptions, OverlayController } from '@ionic/core'; -export interface ModalController extends OverlayController { - create(options: ModalOptions): Promise; -} -export declare const modalController: () => ModalController; +import { ModalOptions } from "@ionic/core"; +export declare const modalController: () => { + create(options: ModalOptions): Promise; + dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; + getTop(): Promise; +}; //# sourceMappingURL=modal-controller.d.ts.map \ No newline at end of file diff --git a/types/controllers/popover-controller.d.ts b/types/controllers/popover-controller.d.ts index 91a28a8..cd7b2f9 100644 --- a/types/controllers/popover-controller.d.ts +++ b/types/controllers/popover-controller.d.ts @@ -1,4 +1,4 @@ -import { PopoverOptions } from '@ionic/core'; +import { PopoverOptions } from "@ionic/core"; export declare const popoverController: () => { create(options: PopoverOptions): Promise; dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; diff --git a/types/controllers/vue-delegate.d.ts b/types/controllers/vue-delegate.d.ts index aba7af3..def4896 100644 --- a/types/controllers/vue-delegate.d.ts +++ b/types/controllers/vue-delegate.d.ts @@ -1,9 +1,4 @@ -import { VueConstructor } from 'vue'; import { FrameworkDelegate } from '@ionic/core'; -import { HTMLVueElement, WebpackFunction } from '../interfaces'; -export declare class VueDelegate implements FrameworkDelegate { - attachViewToDom(parentElement: HTMLElement, component: HTMLElement | WebpackFunction | object | VueConstructor, opts?: object, classes?: string[]): Promise; - removeViewFromDom(_parentElement: HTMLElement, childElement: HTMLVueElement): Promise; -} +export declare const VueDelegate: FrameworkDelegate; export declare function bindLifecycleEvents(instance: any, element: HTMLElement): void; //# sourceMappingURL=vue-delegate.d.ts.map \ No newline at end of file diff --git a/types/index.d.ts b/types/index.d.ts index 975e4c2..4be3e55 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,10 +1,3 @@ -export { createAnimation, createGesture, AlertButton, AlertInput, Gesture, GestureConfig, GestureDetail, mdTransitionAnimation, iosTransitionAnimation, setupConfig } from '@ionic/core'; -declare const _default: { - install: import("vue").PluginFunction; - version: string; -}; -export default _default; -export { default as IonicVueRouter } from './router'; -export * from './controllers'; +export { IonicVue } from './ionic-vue'; export * from './components'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/interfaces.d.ts b/types/interfaces.d.ts index 24ae769..7533068 100644 --- a/types/interfaces.d.ts +++ b/types/interfaces.d.ts @@ -1,74 +1,8 @@ -import Vue from 'vue'; -import VueRouter from 'vue-router'; -import { HTMLStencilElement, IonicConfig, RouterDirection } from '@ionic/core'; -import { RouterOptions } from 'vue-router/types/router'; -declare module 'vue-router/types/router' { - interface VueRouter { - direction: RouterDirection; - directionOverride: RouterDirection | null; - transition: Promise; - canGoBack(): boolean; - } -} -export interface HTMLVueElement extends HTMLElement { - __vue__: Vue; -} -export interface VueWindow extends Window { - Vue: typeof Vue; - VueRouter: typeof VueRouter; - disableIonicTransitions: boolean; -} -export interface WebpackFunction extends Function { - cid: number; -} -export interface EsModule extends Object { - __esModule?: boolean; - [Symbol.toStringTag]: string; -} -export interface IonicGlobal { - config?: IonicConfig; - asyncQueue?: boolean; -} -export interface IonicWindow extends Window { - Ionic: IonicGlobal; - __zone_symbol__requestAnimationFrame?: (ts: FrameRequestCallback) => number; -} -export interface FrameworkDelegate { - attachViewToDom(parentElement: HTMLElement, component: HTMLElement | WebpackFunction | object | Vue, opts?: object, classes?: string[]): Promise; - removeViewFromDom(parentElement: HTMLElement, childElement: HTMLVueElement): Promise; -} +import { HTMLStencilElement } from '@ionic/core'; export interface IonBackButton extends HTMLStencilElement { defaultHref?: string; } export interface IonRouterOutlet extends HTMLStencilElement { commit(enterinEl: HTMLElement, leavingEl: HTMLElement | undefined, opts?: object | undefined): Promise; } -export interface ApiCache { - [key: string]: any; -} -export interface RouterArgs extends RouterOptions { - direction?: RouterDirection; - viewCount?: number; -} -export interface ProxyControllerInterface { - create(opts: object): Promise; - dismiss(): Promise; - getTop(): Promise; -} -export interface ProxyDelegateOptions extends Object { - [key: string]: any; - delegate?: FrameworkDelegate; -} -export interface ProxyMenuControllerInterface { - open(menuId?: string): Promise; - close(menuId?: string): Promise; - toggle(menuId?: string): Promise; - enable(shouldEnable: boolean, menuId?: string): Promise; - swipeEnable(shouldEnable: boolean, menuId?: string): Promise; - isOpen(menuId?: string): Promise; - isEnabled(menuId?: string): Promise; - get(menuId?: string): Promise; - getOpen(): Promise; - getMenus(): Promise; -} //# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/types/ionic-vue.d.ts b/types/ionic-vue.d.ts new file mode 100644 index 0000000..0a4d435 --- /dev/null +++ b/types/ionic-vue.d.ts @@ -0,0 +1,3 @@ +import { Plugin } from 'vue'; +export declare const IonicVue: Plugin; +//# sourceMappingURL=ionic-vue.d.ts.map \ No newline at end of file diff --git a/types/ionic.d.ts b/types/ionic.d.ts index 8ce9959..d3c56de 100644 --- a/types/ionic.d.ts +++ b/types/ionic.d.ts @@ -1,4 +1,3 @@ -import { PluginFunction } from 'vue'; -import { IonicConfig } from '@ionic/core'; -export declare const install: PluginFunction; +import { Plugin } from 'vue'; +export declare const install: Plugin; //# sourceMappingURL=ionic.d.ts.map \ No newline at end of file diff --git a/types/router.d.ts b/types/router.d.ts index 66330a2..4715a7c 100644 --- a/types/router.d.ts +++ b/types/router.d.ts @@ -1,19 +1 @@ -import VueRouter, { Route } from 'vue-router'; -import { PluginFunction } from 'vue'; -import { RouterArgs } from './interfaces'; -import { RouterDirection } from '@ionic/core'; -export default class Router extends VueRouter { - direction: RouterDirection; - directionOverride: RouterDirection | null; - viewCount: number; - prevRouteStack: Route[]; - history: any; - static installed: boolean; - static install: PluginFunction; - constructor(args?: RouterArgs); - extendTransitionConfirmation(): void; - extendHistory(): void; - canGoBack(): boolean; - guessDirection(nextRoute: Route): RouterDirection; -} //# sourceMappingURL=router.d.ts.map \ No newline at end of file diff --git a/types/utils/createContainerComponent.d.ts b/types/utils/createContainerComponent.d.ts new file mode 100644 index 0000000..dbf29e0 --- /dev/null +++ b/types/utils/createContainerComponent.d.ts @@ -0,0 +1,7 @@ +import { SetupContext } from 'vue'; +declare type Data = { + [key: string]: unknown; +}; +export declare const createContainerComponent: (name: string) => (props: Data, { slots }: SetupContext any) | null>>) => import("vue").VNode; +export {}; +//# sourceMappingURL=createContainerComponent.d.ts.map \ No newline at end of file diff --git a/types/utils/createInputComponent.d.ts b/types/utils/createInputComponent.d.ts index cc306f4..7bc7a44 100644 --- a/types/utils/createInputComponent.d.ts +++ b/types/utils/createInputComponent.d.ts @@ -1,3 +1,5 @@ -import Vue from 'vue'; -export declare function createInputComponent(name: string, coreTag: string, modelEvent?: string, valueProperty?: string): import("vue/types/vue").ExtendedVue>; +import { FunctionalComponent } from 'vue'; +export declare function createInputComponent(name: string, coreTag: string, updateEvent?: string, modelProp?: string): FunctionalComponent<{ + [key: string]: unknown; +}, Record>; //# sourceMappingURL=createInputComponent.d.ts.map \ No newline at end of file diff --git a/types/utils/createOverlayComponent.d.ts b/types/utils/createOverlayComponent.d.ts index 93e072d..4c82cce 100644 --- a/types/utils/createOverlayComponent.d.ts +++ b/types/utils/createOverlayComponent.d.ts @@ -1,18 +1,25 @@ -import Vue, { VueConstructor } from 'vue'; +import { FunctionalComponent } from 'vue'; export interface OverlayElement extends HTMLElement { present: () => Promise; - dismiss: (data?: any, role?: string | undefined) => Promise; + dismiss: (...args: any) => Promise; } -export interface Data { - overlay: T | null; +export interface OverlayProps { + isOpen?: boolean; + modelValue?: boolean; } -export interface Methods { - present: () => Promise; +export declare enum OverlayEvents { + onWillPresent = "onWillPresent", + onDidPresent = "onDidPresent", + onWillDismiss = "onWillDismiss", + onDidDismiss = "onDidDismiss", + onUpdate = "update:modelValue" } -export interface Props { - isOpen: boolean; +export declare enum OverlayType { + Modal = "IonModal", + ActionSheet = "IonActionSheet", + Popover = "IonPopover" } -export declare function createOverlayComponent(name: string, controller: { +export declare function createOverlay(name: OverlayType, controller: { create: (opts: any) => Promise; -}): VueConstructor & Methods & Props & Vue>; +}): FunctionalComponent>, OverlayEvents[]>; //# sourceMappingURL=createOverlayComponent.d.ts.map \ No newline at end of file diff --git a/types/utils/defineContainer.d.ts b/types/utils/defineContainer.d.ts new file mode 100644 index 0000000..068fec9 --- /dev/null +++ b/types/utils/defineContainer.d.ts @@ -0,0 +1,7 @@ +import { FunctionalComponent } from 'vue'; +declare type Data = { + [key: string]: unknown; +}; +export declare const defineContainer: (name: string) => FunctionalComponent>; +export {}; +//# sourceMappingURL=defineContainer.d.ts.map \ No newline at end of file diff --git a/types/utils/defineInput.d.ts b/types/utils/defineInput.d.ts new file mode 100644 index 0000000..82cccd2 --- /dev/null +++ b/types/utils/defineInput.d.ts @@ -0,0 +1,10 @@ +import { FunctionalComponent } from 'vue'; +export interface InputProps { + modelValue: string | boolean; + [key: string]: unknown; +} +export declare enum InputEvents { + onUpdate = "update:modelValue" +} +export declare function defineInput(name: string, ionTag: string, updateEvent?: string, modelProp?: string): FunctionalComponent; +//# sourceMappingURL=defineInput.d.ts.map \ No newline at end of file diff --git a/types/utils/defineOverlay.d.ts b/types/utils/defineOverlay.d.ts new file mode 100644 index 0000000..d8c10e3 --- /dev/null +++ b/types/utils/defineOverlay.d.ts @@ -0,0 +1,27 @@ +import { FunctionalComponent } from 'vue'; +export interface OverlayElement extends HTMLElement { + present: () => Promise; + dismiss: (...args: any) => Promise; +} +export interface OverlayProps { + isOpen?: boolean; + modelValue?: boolean; +} +export interface OverlayController { + create: (...args: any) => Promise; +} +export declare type OverlayEventListeners = [string, Exclude][]; +export declare enum OverlayEvents { + onWillPresent = "onWillPresent", + onDidPresent = "onDidPresent", + onWillDismiss = "onWillDismiss", + onDidDismiss = "onDidDismiss", + onUpdate = "update:modelValue" +} +export declare enum OverlayType { + Modal = "IonModal", + ActionSheet = "IonActionSheet", + Popover = "IonPopover" +} +export declare function defineOverlay(name: OverlayType, controller: OverlayController): FunctionalComponent>, OverlayEvents[]>; +//# sourceMappingURL=defineOverlay.d.ts.map \ No newline at end of file diff --git a/types/utils/index.d.ts b/types/utils/index.d.ts index ca4d30b..ab3e41d 100644 --- a/types/utils/index.d.ts +++ b/types/utils/index.d.ts @@ -1,3 +1,4 @@ -export * from "./createOverlayComponent"; -export * from "./createInputComponent"; +export * from './defineOverlay'; +export * from './defineInput'; +export * from './defineContainer'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file From 81e0f1a3458ee38dee4081a566e5c87ced475046 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Thu, 23 Apr 2020 22:08:08 +0300 Subject: [PATCH 02/96] Router PoC --- build/rollup.config.js | 2 +- src/components/containers.ts | 1 + src/components/index.ts | 1 + src/components/router-outlet.ts | 66 +++++++++++++++++++++++++++++ types/components/containers.d.ts | 3 ++ types/components/index.d.ts | 1 + types/components/router-outlet.d.ts | 9 ++++ 7 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/components/router-outlet.ts create mode 100644 types/components/router-outlet.d.ts diff --git a/build/rollup.config.js b/build/rollup.config.js index 395c078..61fbd51 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -41,7 +41,7 @@ function baseConfig() { ], external: [ "vue", - // "vue-router", + "vue-router", "@ionic/core", "@ionic/core/loader", "ionicons", diff --git a/src/components/containers.ts b/src/components/containers.ts index 3456124..a2ad4fa 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -4,3 +4,4 @@ export const IonApp = defineContainer('ion-app'); export const IonItem = defineContainer('ion-item'); export const IonLabel = defineContainer('ion-label'); export const IonButton = defineContainer('ion-button'); +export const IonContent = defineContainer('ion-content'); diff --git a/src/components/index.ts b/src/components/index.ts index 51317a3..92c4629 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,3 +1,4 @@ export * from './overlays'; export * from './inputs'; export * from './containers'; +export * from './router-outlet'; diff --git a/src/components/router-outlet.ts b/src/components/router-outlet.ts new file mode 100644 index 0000000..4fa9363 --- /dev/null +++ b/src/components/router-outlet.ts @@ -0,0 +1,66 @@ +import { + BaseTransitionProps, + FunctionalComponent, + Transition, + h, + ref +} from 'vue'; +import { RouteLocationNormalized, View, useRouter } from 'vue-router'; +import { RouterOutletOptions } from '@ionic/core'; + +export interface Props extends RouterOutletOptions { + name?: string; + route?: RouteLocationNormalized; +} + +export const IonRouterView: FunctionalComponent = (props, { attrs }) => { + const router = useRouter(); + const ionRouterOutlet = ref(null); + const enteringEl = ref(null); + + const transition = async (leavingEl: HTMLElement) => { + if (!enteringEl.value || enteringEl.value === leavingEl) { + return; + } + + enteringEl.value?.classList.add('ion-page', 'ion-page-invisible'); + const el = await ionRouterOutlet.value?.componentOnReady(); + + return el?.commit(enteringEl.value, leavingEl, { + deepWait: true, + duration: undefined, + direction: router.history.state.forward ? 'back' : 'forward' + // showGoBack: true, + }); + }; + + const transitionHooks: BaseTransitionProps = { + onBeforeEnter(el) { + enteringEl.value = el; + }, + + async onLeave(el, done) { + await transition(el); + done(); + } + }; + + return h( + 'ion-router-outlet', + { ...attrs, ref: ionRouterOutlet }, + h(View, { name: props.name }, (...opts: any) => { + const { Component, props: componentProps } = opts[0]; + return h( + Transition, + { + css: false, + mode: 'in-out', + ...transitionHooks + }, + () => h(Component, componentProps) + ); + }) + ); +}; + +IonRouterView.props = ['name']; diff --git a/types/components/containers.d.ts b/types/components/containers.d.ts index 1a515e3..176a1f7 100644 --- a/types/components/containers.d.ts +++ b/types/components/containers.d.ts @@ -10,4 +10,7 @@ export declare const IonLabel: import("vue").FunctionalComponent<{ export declare const IonButton: import("vue").FunctionalComponent<{ [key: string]: unknown; }, Record>; +export declare const IonContent: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; //# sourceMappingURL=containers.d.ts.map \ No newline at end of file diff --git a/types/components/index.d.ts b/types/components/index.d.ts index ae64450..3ddcd97 100644 --- a/types/components/index.d.ts +++ b/types/components/index.d.ts @@ -1,4 +1,5 @@ export * from './overlays'; export * from './inputs'; export * from './containers'; +export * from './router-outlet'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/router-outlet.d.ts b/types/components/router-outlet.d.ts new file mode 100644 index 0000000..66672a4 --- /dev/null +++ b/types/components/router-outlet.d.ts @@ -0,0 +1,9 @@ +import { FunctionalComponent } from "vue"; +import { RouteLocationNormalized } from "vue-router"; +import { RouterOutletOptions } from "@ionic/core"; +export interface Props extends RouterOutletOptions { + name?: string; + route?: RouteLocationNormalized; +} +export declare const IonRouterView: FunctionalComponent; +//# sourceMappingURL=router-outlet.d.ts.map \ No newline at end of file From ab6a6a1fedfa3ba478db4e69a148d4bc68a027bc Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 24 Apr 2020 22:36:12 +0300 Subject: [PATCH 03/96] Fixes #112, #111. Cleanup --- package-lock.json | 783 +++++++++++------- package.json | 12 +- scripts/clean.js | 12 +- src/components/back-button/index.ts | 29 + src/components/containers.ts | 4 + src/components/index.ts | 1 + .../index.ts} | 22 +- src/index.ts | 2 +- src/router.ts | 46 + types/app-initialize.d.ts | 6 - types/components/back-button/index.d.ts | 4 + types/components/containers.d.ts | 12 + types/components/index.d.ts | 1 + types/components/ion-vue-router.d.ts | 1 - types/components/navigation/index.d.ts | 1 - types/components/navigation/ion-page.d.ts | 1 - types/components/navigation/ion-tabs.d.ts | 1 - types/components/router-outlet.d.ts | 9 - types/components/router-outlet/index.d.ts | 9 + types/controllers/index.d.ts | 12 - types/controllers/modal-controller.d.ts | 7 - types/controllers/popover-controller.d.ts | 7 - types/controllers/vue-delegate.d.ts | 4 - types/index.d.ts | 1 + types/interfaces.d.ts | 8 - types/ionic.d.ts | 3 - types/router.d.ts | 10 + types/utils/createContainerComponent.d.ts | 7 - types/utils/createInputComponent.d.ts | 5 - types/utils/createOverlayComponent.d.ts | 25 - 30 files changed, 611 insertions(+), 434 deletions(-) create mode 100644 src/components/back-button/index.ts rename src/components/{router-outlet.ts => router-outlet/index.ts} (66%) create mode 100644 src/router.ts delete mode 100644 types/app-initialize.d.ts create mode 100644 types/components/back-button/index.d.ts delete mode 100644 types/components/ion-vue-router.d.ts delete mode 100644 types/components/navigation/index.d.ts delete mode 100644 types/components/navigation/ion-page.d.ts delete mode 100644 types/components/navigation/ion-tabs.d.ts delete mode 100644 types/components/router-outlet.d.ts create mode 100644 types/components/router-outlet/index.d.ts delete mode 100644 types/controllers/index.d.ts delete mode 100644 types/controllers/modal-controller.d.ts delete mode 100644 types/controllers/popover-controller.d.ts delete mode 100644 types/controllers/vue-delegate.d.ts delete mode 100644 types/interfaces.d.ts delete mode 100644 types/ionic.d.ts delete mode 100644 types/utils/createContainerComponent.d.ts delete mode 100644 types/utils/createInputComponent.d.ts delete mode 100644 types/utils/createOverlayComponent.d.ts diff --git a/package-lock.json b/package-lock.json index 5e9a035..ccd4678 100644 --- a/package-lock.json +++ b/package-lock.json @@ -381,45 +381,46 @@ "dev": true }, "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.4.0.tgz", + "integrity": "sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.4.0", + "jest-util": "^25.4.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.3.0.tgz", - "integrity": "sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.4.0.tgz", + "integrity": "sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/reporters": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.4.0", + "@jest/reporters": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.3.0", - "jest-config": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-message-util": "^25.3.0", + "jest-changed-files": "^25.4.0", + "jest-config": "^25.4.0", + "jest-haste-map": "^25.4.0", + "jest-message-util": "^25.4.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-resolve-dependencies": "^25.3.0", - "jest-runner": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", - "jest-watcher": "^25.3.0", + "jest-resolve": "^25.4.0", + "jest-resolve-dependencies": "^25.4.0", + "jest-runner": "^25.4.0", + "jest-runtime": "^25.4.0", + "jest-snapshot": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", + "jest-watcher": "^25.4.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "realpath-native": "^2.0.0", @@ -446,40 +447,40 @@ } }, "@jest/environment": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", - "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.4.0.tgz", + "integrity": "sha512-KDctiak4mu7b4J6BIoN/+LUL3pscBzoUCP+EtSPd2tK9fqyDY5OF+CmkBywkFWezS9tyH5ACOQNtpjtueEDH6Q==", "dev": true, "requires": { - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0" + "@jest/fake-timers": "^25.4.0", + "@jest/types": "^25.4.0", + "jest-mock": "^25.4.0" } }, "@jest/fake-timers": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", - "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.4.0.tgz", + "integrity": "sha512-lI9z+VOmVX4dPPFzyj0vm+UtaB8dCJJ852lcDnY0uCPRvZAaVGnMwBBc1wxtf+h7Vz6KszoOvKAt4QijDnHDkg==", "dev": true, "requires": { - "@jest/types": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", + "@jest/types": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-mock": "^25.4.0", + "jest-util": "^25.4.0", "lolex": "^5.0.0" } }, "@jest/reporters": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", - "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.4.0.tgz", + "integrity": "sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -489,16 +490,16 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.3.0", - "jest-resolve": "^25.3.0", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "jest-haste-map": "^25.4.0", + "jest-resolve": "^25.4.0", + "jest-util": "^25.4.0", + "jest-worker": "^25.4.0", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^3.1.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" + "v8-to-istanbul": "^4.1.3" } }, "@jest/source-map": { @@ -513,45 +514,45 @@ } }, "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.4.0.tgz", + "integrity": "sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.4.0", + "@jest/types": "^25.4.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz", - "integrity": "sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.4.0.tgz", + "integrity": "sha512-240cI+nsM3attx2bMp9uGjjHrwrpvxxrZi8Tyqp/cfOzl98oZXVakXBgxODGyBYAy/UGXPKXLvNc2GaqItrsJg==", "dev": true, "requires": { - "@jest/test-result": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-runner": "^25.3.0", - "jest-runtime": "^25.3.0" + "@jest/test-result": "^25.4.0", + "jest-haste-map": "^25.4.0", + "jest-runner": "^25.4.0", + "jest-runtime": "^25.4.0" } }, "@jest/transform": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", - "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.4.0.tgz", + "integrity": "sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.3.0", + "jest-haste-map": "^25.4.0", "jest-regex-util": "^25.2.6", - "jest-util": "^25.3.0", + "jest-util": "^25.4.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", @@ -561,9 +562,9 @@ } }, "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", + "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -684,6 +685,12 @@ "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, "@types/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", @@ -712,63 +719,67 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.2.tgz", - "integrity": "sha512-/c3ePWU9T7xwn0J/YRlxCxnxqphNVlcXisnI6aMoK3pjvQFXOMD6tfrHUtepCrQLNdKlhxNjqe3Q625Z64Z0kQ==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.3.tgz", + "integrity": "sha512-r8AFbzQN3IuLbOEKa8y4EDYrbrBUiHh3kX3UHw3YDfBPDG2NryeAMtonden3Nvs7i3QFTCPzrWRfb/bjWqgAzQ==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.2", + "@vue/shared": "3.0.0-beta.3", "estree-walker": "^0.8.1", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.2.tgz", - "integrity": "sha512-VZwvnsWPoi0/MR5CF5p5VhRGk3AkM9MQYt/pMaXDmbl09kWKVjQZubCRvpzuyjjm1QnV1yrSaqTZWDAIYbKYtw==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.3.tgz", + "integrity": "sha512-1WimkkPN13ySLAlJl61WSo7xFeC3D8Nqkz35YIZIgksOOIr6W/Q3NfDxfM6bG5nTBWBmgb995oDZ8NNgq2frSg==", "requires": { - "@vue/compiler-core": "3.0.0-beta.2", - "@vue/shared": "3.0.0-beta.2" + "@vue/compiler-core": "3.0.0-beta.3", + "@vue/shared": "3.0.0-beta.3" } }, "@vue/reactivity": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.2.tgz", - "integrity": "sha512-vAYHiBmpHfLAJulssTTTlvdHtyyKeOCG3qCu/TxDhu3NFHEfrt4eytR2atR6EbpTb853/QKcoW3k6L6g/znxAw==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.3.tgz", + "integrity": "sha512-/QU5sDJkIlTqDd+T3gMZXgchslW8o0hPtyVxphGUjdUGdsXnXjEagDIHDsi35qOJnjfZ8dwq/L1IfVQJ9TENaA==", "requires": { - "@vue/shared": "3.0.0-beta.2" + "@vue/shared": "3.0.0-beta.3" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.2.tgz", - "integrity": "sha512-tcxNNV7y+H2046F79iw90OdwyxvMEqJ5iOQTsOvfVf2hBNrCWPG1tAU+kywFBlBY4I26k7XB/Q1ZdHb2q8YLaA==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.3.tgz", + "integrity": "sha512-GHIlKNlJW0sdlro6ouu7Sy34M4I8FAfn6V02RdUwbPwJJc1VICoejnSS1i88i6riGMgNtRhmxW1NDNPCTY1/vQ==", "requires": { - "@vue/reactivity": "3.0.0-beta.2", - "@vue/shared": "3.0.0-beta.2" + "@vue/reactivity": "3.0.0-beta.3", + "@vue/shared": "3.0.0-beta.3" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.2.tgz", - "integrity": "sha512-swWm7fa3JKEGE0KYVevYqaBTSGxx/bmlwJTbJcnnNgdZZGtWUQsUzXCk6JKRuoYjy+iU0ONcHidEhpwdazH9Aw==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.3.tgz", + "integrity": "sha512-2CbmDjAGYV4BStukAdByXpK2lQC8svk5oSsG/1rWSdXcDH/gpkCmQocaBahzyRBwX9pVEK4RwRBX4CiNbYjVVg==", "requires": { - "@vue/runtime-core": "3.0.0-beta.2", - "@vue/shared": "3.0.0-beta.2", + "@vue/runtime-core": "3.0.0-beta.3", + "@vue/shared": "3.0.0-beta.3", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.2.tgz", - "integrity": "sha512-ED5oa+ZOcjAJkWEzL0zFZ4QG89L23DrW9LBBGT6YBUhBmOsf9BKii2JIBfdxWYwRkjAhbHffQH0mc6rI2famug==" + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.3.tgz", + "integrity": "sha512-NSiCty9fUjn+JuGtBCnlxqB+9jq4S/W6lGREMz/2cQZchIETu16fBxvQukljVmtbChAjrw/JTOb8HzTrDAhLlQ==" }, "@vue/test-utils": { - "version": "2.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.1.tgz", - "integrity": "sha512-qureK5X+67Fp3z2YnIreqBlE/bkwof+sjJu8STRkM4Oy9FqcHqbAlkakwFvQOQhOioWCPS+QKjzWBNjBmzNdOQ==", - "dev": true + "version": "2.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.2.tgz", + "integrity": "sha512-b3u4ZEGC/6MrrnqHK7ey0w04KPL060KqF56OozLVgNk4Sxrn9aUQER1MZKD2kuEdeyArqV3hT0m5BBGdTSvztQ==", + "dev": true, + "requires": { + "dom-event-types": "^1.0.0", + "lodash": "^4.17.15" + } }, "abab": { "version": "2.0.3", @@ -819,9 +830,9 @@ "dev": true }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -837,6 +848,14 @@ "dev": true, "requires": { "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, "ansi-regex": { @@ -1126,16 +1145,16 @@ } }, "babel-jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.3.0.tgz", - "integrity": "sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.4.0.tgz", + "integrity": "sha512-p+epx4K0ypmHuCnd8BapfyOwWwosNCYhedetQey1awddtfmEX0MmdxctGl956uwUmjwXR5VSS5xJcGX9DvdIog==", "dev": true, "requires": { - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.3.0", + "babel-preset-jest": "^25.4.0", "chalk": "^3.0.0", "slash": "^3.0.0" } @@ -1172,9 +1191,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", - "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.4.0.tgz", + "integrity": "sha512-M3a10JCtTyKevb0MjuH6tU+cP/NVQZ82QPADqI1RQYY1OphztsCeIeQmTsHmF/NS6m0E51Zl4QNsI3odXSQF5w==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" @@ -1539,12 +1558,12 @@ } }, "babel-preset-jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz", - "integrity": "sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.4.0.tgz", + "integrity": "sha512-PwFiEWflHdu3JCeTr0Pb9NcHHE34qWFnPQRVPvqQITx4CsDCzs6o05923I10XvLvn9nNsRHuiVgB72wG/90ZHQ==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^25.2.6", + "babel-plugin-jest-hoist": "^25.4.0", "babel-preset-current-node-syntax": "^0.1.2" } }, @@ -2300,6 +2319,12 @@ } } }, + "dom-event-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz", + "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==", + "dev": true + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -2340,6 +2365,15 @@ "once": "^1.4.0" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2460,16 +2494,16 @@ } }, "expect": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.4.0.tgz", + "integrity": "sha512-7BDIX99BTi12/sNGJXA9KMRcby4iAmu1xccBOhyKCyEhjcVKS3hPmHdA/4nSI9QGIOkUropKqr3vv7WMDM5lvQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "ansi-styles": "^4.0.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", + "jest-matcher-utils": "^25.4.0", + "jest-message-util": "^25.4.0", "jest-regex-util": "^25.2.6" }, "dependencies": { @@ -2729,9 +2763,9 @@ "dev": true }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, @@ -2887,6 +2921,12 @@ } } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -3000,6 +3040,12 @@ } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -3215,32 +3261,32 @@ } }, "jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.3.0.tgz", - "integrity": "sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.4.0.tgz", + "integrity": "sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==", "dev": true, "requires": { - "@jest/core": "^25.3.0", + "@jest/core": "^25.4.0", "import-local": "^3.0.2", - "jest-cli": "^25.3.0" + "jest-cli": "^25.4.0" }, "dependencies": { "jest-cli": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz", - "integrity": "sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.4.0.tgz", + "integrity": "sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==", "dev": true, "requires": { - "@jest/core": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/core": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", "exit": "^0.1.2", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", + "jest-config": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", "prompts": "^2.0.1", "realpath-native": "^2.0.0", "yargs": "^15.3.1" @@ -3249,12 +3295,12 @@ } }, "jest-changed-files": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.3.0.tgz", - "integrity": "sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.4.0.tgz", + "integrity": "sha512-VR/rfJsEs4BVMkwOTuStRyS630fidFVekdw/lBaBQjx9KK3VZFOZ2c0fsom2fRp8pMCrCTP6LGna00o/DXGlqA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "execa": "^3.2.0", "throat": "^5.0.0" }, @@ -3342,41 +3388,41 @@ } }, "jest-config": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz", - "integrity": "sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.4.0.tgz", + "integrity": "sha512-egT9aKYxMyMSQV1aqTgam0SkI5/I2P9qrKexN5r2uuM2+68ypnc+zPGmfUxK7p1UhE7dYH9SLBS7yb+TtmT1AA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.3.0", - "@jest/types": "^25.3.0", - "babel-jest": "^25.3.0", + "@jest/test-sequencer": "^25.4.0", + "@jest/types": "^25.4.0", + "babel-jest": "^25.4.0", "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.3.0", - "jest-environment-node": "^25.3.0", + "jest-environment-jsdom": "^25.4.0", + "jest-environment-node": "^25.4.0", "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.3.0", + "jest-jasmine2": "^25.4.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", + "jest-resolve": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", "micromatch": "^4.0.2", - "pretty-format": "^25.3.0", + "pretty-format": "^25.4.0", "realpath-native": "^2.0.0" } }, "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.4.0.tgz", + "integrity": "sha512-kklLbJVXW0y8UKOWOdYhI6TH5MG6QAxrWiBMgQaPIuhj3dNFGirKCd+/xfplBXICQ7fI+3QcqHm9p9lWu1N6ug==", "dev": true, "requires": { "chalk": "^3.0.0", "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" + "pretty-format": "^25.4.0" } }, "jest-docblock": { @@ -3389,43 +3435,43 @@ } }, "jest-each": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.3.0.tgz", - "integrity": "sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.4.0.tgz", + "integrity": "sha512-lwRIJ8/vQU/6vq3nnSSUw1Y3nz5tkYSFIywGCZpUBd6WcRgpn8NmJoQICojbpZmsJOJNHm0BKdyuJ6Xdx+eDQQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", - "jest-util": "^25.3.0", - "pretty-format": "^25.3.0" + "jest-util": "^25.4.0", + "pretty-format": "^25.4.0" } }, "jest-environment-jsdom": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz", - "integrity": "sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz", + "integrity": "sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ==", "dev": true, "requires": { - "@jest/environment": "^25.3.0", - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", + "@jest/environment": "^25.4.0", + "@jest/fake-timers": "^25.4.0", + "@jest/types": "^25.4.0", + "jest-mock": "^25.4.0", + "jest-util": "^25.4.0", "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.3.0.tgz", - "integrity": "sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.4.0.tgz", + "integrity": "sha512-wryZ18vsxEAKFH7Z74zi/y/SyI1j6UkVZ6QsllBuT/bWlahNfQjLNwFsgh/5u7O957dYFoXj4yfma4n4X6kU9A==", "dev": true, "requires": { - "@jest/environment": "^25.3.0", - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", + "@jest/environment": "^25.4.0", + "@jest/fake-timers": "^25.4.0", + "@jest/types": "^25.4.0", + "jest-mock": "^25.4.0", + "jest-util": "^25.4.0", "semver": "^6.3.0" }, "dependencies": { @@ -3444,19 +3490,19 @@ "dev": true }, "jest-haste-map": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.4.0.tgz", + "integrity": "sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.3", "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "jest-util": "^25.4.0", + "jest-worker": "^25.4.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", @@ -3464,60 +3510,60 @@ } }, "jest-jasmine2": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz", - "integrity": "sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.4.0.tgz", + "integrity": "sha512-QccxnozujVKYNEhMQ1vREiz859fPN/XklOzfQjm2j9IGytAkUbSwjFRBtQbHaNZ88cItMpw02JnHGsIdfdpwxQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.3.0", + "@jest/environment": "^25.4.0", "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/test-result": "^25.4.0", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.3.0", + "expect": "^25.4.0", "is-generator-fn": "^2.0.0", - "jest-each": "^25.3.0", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "pretty-format": "^25.3.0", + "jest-each": "^25.4.0", + "jest-matcher-utils": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-runtime": "^25.4.0", + "jest-snapshot": "^25.4.0", + "jest-util": "^25.4.0", + "pretty-format": "^25.4.0", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz", - "integrity": "sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.4.0.tgz", + "integrity": "sha512-7Y6Bqfv2xWsB+7w44dvZuLs5SQ//fzhETgOGG7Gq3TTGFdYvAgXGwV8z159RFZ6fXiCPm/szQ90CyfVos9JIFQ==", "dev": true, "requires": { "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" + "pretty-format": "^25.4.0" } }, "jest-matcher-utils": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz", - "integrity": "sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.4.0.tgz", + "integrity": "sha512-yPMdtj7YDgXhnGbc66bowk8AkQ0YwClbbwk3Kzhn5GVDrciiCr27U4NJRbrqXbTdtxjImONITg2LiRIw650k5A==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.3.0", + "jest-diff": "^25.4.0", "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" + "pretty-format": "^25.4.0" } }, "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", + "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", "micromatch": "^4.0.2", @@ -3526,12 +3572,12 @@ } }, "jest-mock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", - "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.4.0.tgz", + "integrity": "sha512-MdazSfcYAUjJjuVTTnusLPzE0pE4VXpOUzWdj8sbM+q6abUjm3bATVPXFqTXrxSieR8ocpvQ9v/QaQCftioQFg==", "dev": true, "requires": { - "@jest/types": "^25.3.0" + "@jest/types": "^25.4.0" } }, "jest-pnp-resolver": { @@ -3547,84 +3593,86 @@ "dev": true }, "jest-resolve": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.4.0.tgz", + "integrity": "sha512-wOsKqVDFWUiv8BtLMCC6uAJ/pHZkfFgoBTgPtmYlsprAjkxrr2U++ZnB3l5ykBMd2O24lXvf30SMAjJIW6k2aA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", "realpath-native": "^2.0.0", - "resolve": "^1.15.1" + "resolve": "^1.15.1", + "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz", - "integrity": "sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz", + "integrity": "sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.3.0" + "jest-snapshot": "^25.4.0" } }, "jest-runner": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.3.0.tgz", - "integrity": "sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.4.0.tgz", + "integrity": "sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.4.0", + "@jest/environment": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", + "jest-config": "^25.4.0", "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-jasmine2": "^25.3.0", - "jest-leak-detector": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "jest-haste-map": "^25.4.0", + "jest-jasmine2": "^25.4.0", + "jest-leak-detector": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-resolve": "^25.4.0", + "jest-runtime": "^25.4.0", + "jest-util": "^25.4.0", + "jest-worker": "^25.4.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", - "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.4.0.tgz", + "integrity": "sha512-lgNJlCDULtXu9FumnwCyWlOub8iytijwsPNa30BKrSNtgoT6NUMXOPrZvsH06U6v0wgD/Igwz13nKA2wEKU2VA==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", + "@jest/console": "^25.4.0", + "@jest/environment": "^25.4.0", "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", + "jest-config": "^25.4.0", + "jest-haste-map": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-mock": "^25.4.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", + "jest-resolve": "^25.4.0", + "jest-snapshot": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", @@ -3638,24 +3686,24 @@ "dev": true }, "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.4.0.tgz", + "integrity": "sha512-J4CJ0X2SaGheYRZdLz9CRHn9jUknVmlks4UBeu270hPAvdsauFXOhx9SQP2JtRzhnR3cvro/9N9KP83/uvFfRg==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", + "expect": "^25.4.0", + "jest-diff": "^25.4.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", + "jest-matcher-utils": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-resolve": "^25.4.0", "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", + "pretty-format": "^25.4.0", "semver": "^6.3.0" }, "dependencies": { @@ -3677,29 +3725,29 @@ } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.4.0.tgz", + "integrity": "sha512-WSZD59sBtAUjLv1hMeKbNZXmMcrLRWcYqpO8Dz8b4CeCTZpfNQw2q9uwrYAD+BbJoLJlu4ezVPwtAmM/9/SlZA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, "jest-validate": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.3.0.tgz", - "integrity": "sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.4.0.tgz", + "integrity": "sha512-hvjmes/EFVJSoeP1yOl8qR8mAtMR3ToBkZeXrD/ZS9VxRyWDqQ/E1C5ucMTeSmEOGLipvdlyipiGbHJ+R1MQ0g==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", "leven": "^3.1.0", - "pretty-format": "^25.3.0" + "pretty-format": "^25.4.0" } }, "jest-vue-preprocessor": { @@ -3714,23 +3762,23 @@ } }, "jest-watcher": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.3.0.tgz", - "integrity": "sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.4.0.tgz", + "integrity": "sha512-36IUfOSRELsKLB7k25j/wutx0aVuHFN6wO94gPNjQtQqFPa2rkOymmx9rM5EzbF3XBZZ2oqD9xbRVoYa2w86gw==", "dev": true, "requires": { - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/test-result": "^25.4.0", + "@jest/types": "^25.4.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-util": "^25.4.0", "string-length": "^3.1.0" } }, "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", + "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -3816,6 +3864,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3892,6 +3946,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3997,18 +4057,18 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -4144,6 +4204,18 @@ } } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4294,6 +4366,18 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -4379,12 +4463,12 @@ "dev": true }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.4.0.tgz", + "integrity": "sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -4473,6 +4557,37 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", @@ -5193,6 +5308,38 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -5617,9 +5764,9 @@ "dev": true }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "typedarray-to-buffer": { @@ -5769,6 +5916,16 @@ } } }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5781,13 +5938,13 @@ } }, "vue": { - "version": "3.0.0-beta.2", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.2.tgz", - "integrity": "sha512-/HYhK9i8PWM0fL38YflFK/vY1ots+JyNI2GZa8VtDqj4jD3+2UZ0CH0kjmw9YTmRtHdsU65CXGkVuA3EMV3mXQ==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.3.tgz", + "integrity": "sha512-5DBah04o/0MNVLFg8BwB5cP3prU6HA/vxXVcUT7E+uvwY6EiJsRKtyZ71m294bKV5ZZkYzzJjLtZrjYGR2tW7g==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.2", - "@vue/runtime-dom": "3.0.0-beta.2", - "@vue/shared": "3.0.0-beta.2" + "@vue/compiler-dom": "3.0.0-beta.3", + "@vue/runtime-dom": "3.0.0-beta.3", + "@vue/shared": "3.0.0-beta.3" } }, "vue-class-component": { @@ -5806,9 +5963,9 @@ } }, "vue-router": { - "version": "4.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.6.tgz", - "integrity": "sha512-0wDX4KX3NEeHTRU67e3hyR9YHRLZ6jQZrEoCGTL5XdwSRgR57s77KvL5xvKhwVO5pgFb4PCSGoLAT8dhsUmnEQ==" + "version": "4.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.7.tgz", + "integrity": "sha512-B1wghgEeFZSjBRPa6rTjy82/b8ArfrirY+Y8ZxZXdkOg4mQpfSPnTfgWGNa1n4dCLDiUiNl1BYhhW0s4fqV3gQ==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index 2a73176..b9b652b 100644 --- a/package.json +++ b/package.json @@ -56,10 +56,10 @@ "clean": "node ./scripts/clean.js" }, "devDependencies": { - "@vue/test-utils": "^2.0.0-alpha.0", - "babel-jest": "^25.3.0", + "@vue/test-utils": "^2.0.0-alpha.2", + "babel-jest": "^25.4.0", "babel-preset-env": "^1.7.0", - "jest": "^25.3.0", + "jest": "^25.4.0", "jest-sonar-reporter": "^2.0.0", "jest-vue-preprocessor": "^1.4.0", "rollup": "^0.62.0", @@ -72,9 +72,9 @@ "typescript": "^3.8.3" }, "dependencies": { - "vue": "next", - "vue-router": "next", - "@ionic/core": "^5.0.7" + "@ionic/core": "^5.0.7", + "vue": "^3.0.0-beta.3", + "vue-router": "^4.0.0-alpha.7" }, "jestSonar": { "reportPath": "reports", diff --git a/scripts/clean.js b/scripts/clean.js index 54708e6..1544b97 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,9 +1,9 @@ -const fs = require('fs-extra') -const path = require('path') +const fs = require("fs-extra"); +const path = require("path"); -const cleanDirs = ['dist'] +const cleanDirs = ["dist", "types"]; cleanDirs.forEach(dir => { - const cleanDir = path.join(__dirname, '../', dir) - fs.removeSync(cleanDir) -}) + const cleanDir = path.join(__dirname, "../", dir); + fs.removeSync(cleanDir); +}); diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts new file mode 100644 index 0000000..5edb56a --- /dev/null +++ b/src/components/back-button/index.ts @@ -0,0 +1,29 @@ +import { FunctionalComponent, h } from 'vue'; +import { useRouter } from 'vue-router'; +import { JSX } from '@ionic/core'; + +export const IonBackButton: FunctionalComponent = ( + props, + { attrs } +) => { + const router = useRouter(); + return h('ion-back-button', { + ...props, + ...attrs, + onClick() { + props.defaultHref + ? router.replace(props.defaultHref) + : router.history.go(-1); + } + }); +}; + +IonBackButton.props = [ + 'defaultHref', + 'color', + 'disabled', + 'icon', + 'mode', + 'text', + 'type' +]; diff --git a/src/components/containers.ts b/src/components/containers.ts index a2ad4fa..99d287b 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -4,4 +4,8 @@ export const IonApp = defineContainer('ion-app'); export const IonItem = defineContainer('ion-item'); export const IonLabel = defineContainer('ion-label'); export const IonButton = defineContainer('ion-button'); +export const IonHeader = defineContainer('ion-header'); +export const IonToolbar = defineContainer('ion-toolbar'); +export const IonTitle = defineContainer('ion-title'); export const IonContent = defineContainer('ion-content'); +export const IonButtons = defineContainer('ion-buttons'); diff --git a/src/components/index.ts b/src/components/index.ts index 92c4629..4599c3e 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -2,3 +2,4 @@ export * from './overlays'; export * from './inputs'; export * from './containers'; export * from './router-outlet'; +export * from './back-button'; diff --git a/src/components/router-outlet.ts b/src/components/router-outlet/index.ts similarity index 66% rename from src/components/router-outlet.ts rename to src/components/router-outlet/index.ts index 4fa9363..1b315cf 100644 --- a/src/components/router-outlet.ts +++ b/src/components/router-outlet/index.ts @@ -5,16 +5,17 @@ import { h, ref } from 'vue'; -import { RouteLocationNormalized, View, useRouter } from 'vue-router'; -import { RouterOutletOptions } from '@ionic/core'; +import { RouteLocationNormalizedLoaded, View, useRouter } from 'vue-router'; +import { JSX } from '@ionic/core'; -export interface Props extends RouterOutletOptions { +export interface Props extends JSX.IonRouterOutlet { name?: string; - route?: RouteLocationNormalized; + route?: RouteLocationNormalizedLoaded; } -export const IonRouterView: FunctionalComponent = (props, { attrs }) => { +export const IonRouterView: FunctionalComponent = props => { const router = useRouter(); + const { name, route, ...outletProps } = props; const ionRouterOutlet = ref(null); const enteringEl = ref(null); @@ -28,9 +29,8 @@ export const IonRouterView: FunctionalComponent = (props, { attrs }) => { return el?.commit(enteringEl.value, leavingEl, { deepWait: true, - duration: undefined, - direction: router.history.state.forward ? 'back' : 'forward' - // showGoBack: true, + direction: router.direction?.value, + showGoBack: router.showGoBack?.value }); }; @@ -47,8 +47,8 @@ export const IonRouterView: FunctionalComponent = (props, { attrs }) => { return h( 'ion-router-outlet', - { ...attrs, ref: ionRouterOutlet }, - h(View, { name: props.name }, (...opts: any) => { + { ...outletProps, ref: ionRouterOutlet }, + h(View, { name, route }, (...opts: any) => { const { Component, props: componentProps } = opts[0]; return h( Transition, @@ -63,4 +63,4 @@ export const IonRouterView: FunctionalComponent = (props, { attrs }) => { ); }; -IonRouterView.props = ['name']; +IonRouterView.props = ['name', 'route', 'animated', 'animation', 'mode']; diff --git a/src/index.ts b/src/index.ts index 4f5ac87..7008463 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,7 @@ import { export { IonicVue } from './ionic-vue'; export * from './components'; -// export { default as IonicVueRouter } from './router'; +export * from './router'; // Icons that are used by internal components addIcons({ diff --git a/src/router.ts b/src/router.ts new file mode 100644 index 0000000..c9191c6 --- /dev/null +++ b/src/router.ts @@ -0,0 +1,46 @@ +import { Ref, ref } from 'vue'; +import { + Router, + RouterHistory, + RouterOptions, + createRouter as createVueRouter +} from 'vue-router'; +import { NavDirection } from '@ionic/core'; + +declare module 'vue-router' { + interface Router { + direction: Ref; + showGoBack: Ref; + } +} + +export const createRouter = (opts: RouterOptions): Router => { + const direction = ref('forward'); + const showGoBack = ref(true); + + const setShowBack = (path: string) => { + showGoBack.value = path !== '/'; + }; + + const history: RouterHistory = { + ...opts.history, + push(to, ...args) { + opts.history.push(to, ...args); + setShowBack(opts.history.location.fullPath); + }, + replace(...args) { + opts.history.replace(...args); + setShowBack(opts.history.location.fullPath); + } + }; + + history.listen(to => { + setShowBack(to.fullPath); + }); + + return { + ...createVueRouter({ ...opts, history }), + direction, + showGoBack + }; +}; diff --git a/types/app-initialize.d.ts b/types/app-initialize.d.ts deleted file mode 100644 index ec118bd..0000000 --- a/types/app-initialize.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { App } from 'vue'; -import { IonicConfig } from '@ionic/core'; -export declare const pluginInstall: { - install(_app: App, config?: IonicConfig | undefined): Promise; -}; -//# sourceMappingURL=app-initialize.d.ts.map \ No newline at end of file diff --git a/types/components/back-button/index.d.ts b/types/components/back-button/index.d.ts new file mode 100644 index 0000000..89bce7b --- /dev/null +++ b/types/components/back-button/index.d.ts @@ -0,0 +1,4 @@ +import { FunctionalComponent } from 'vue'; +import { JSX } from '@ionic/core'; +export declare const IonBackButton: FunctionalComponent; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/containers.d.ts b/types/components/containers.d.ts index 176a1f7..b72d04b 100644 --- a/types/components/containers.d.ts +++ b/types/components/containers.d.ts @@ -10,7 +10,19 @@ export declare const IonLabel: import("vue").FunctionalComponent<{ export declare const IonButton: import("vue").FunctionalComponent<{ [key: string]: unknown; }, Record>; +export declare const IonHeader: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +export declare const IonToolbar: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +export declare const IonTitle: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; export declare const IonContent: import("vue").FunctionalComponent<{ [key: string]: unknown; }, Record>; +export declare const IonButtons: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; //# sourceMappingURL=containers.d.ts.map \ No newline at end of file diff --git a/types/components/index.d.ts b/types/components/index.d.ts index 3ddcd97..e536552 100644 --- a/types/components/index.d.ts +++ b/types/components/index.d.ts @@ -2,4 +2,5 @@ export * from './overlays'; export * from './inputs'; export * from './containers'; export * from './router-outlet'; +export * from './back-button'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/ion-vue-router.d.ts b/types/components/ion-vue-router.d.ts deleted file mode 100644 index caa2428..0000000 --- a/types/components/ion-vue-router.d.ts +++ /dev/null @@ -1 +0,0 @@ -//# sourceMappingURL=ion-vue-router.d.ts.map \ No newline at end of file diff --git a/types/components/navigation/index.d.ts b/types/components/navigation/index.d.ts deleted file mode 100644 index f36479a..0000000 --- a/types/components/navigation/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/navigation/ion-page.d.ts b/types/components/navigation/ion-page.d.ts deleted file mode 100644 index fcc30bd..0000000 --- a/types/components/navigation/ion-page.d.ts +++ /dev/null @@ -1 +0,0 @@ -//# sourceMappingURL=ion-page.d.ts.map \ No newline at end of file diff --git a/types/components/navigation/ion-tabs.d.ts b/types/components/navigation/ion-tabs.d.ts deleted file mode 100644 index 42d5e20..0000000 --- a/types/components/navigation/ion-tabs.d.ts +++ /dev/null @@ -1 +0,0 @@ -//# sourceMappingURL=ion-tabs.d.ts.map \ No newline at end of file diff --git a/types/components/router-outlet.d.ts b/types/components/router-outlet.d.ts deleted file mode 100644 index 66672a4..0000000 --- a/types/components/router-outlet.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FunctionalComponent } from "vue"; -import { RouteLocationNormalized } from "vue-router"; -import { RouterOutletOptions } from "@ionic/core"; -export interface Props extends RouterOutletOptions { - name?: string; - route?: RouteLocationNormalized; -} -export declare const IonRouterView: FunctionalComponent; -//# sourceMappingURL=router-outlet.d.ts.map \ No newline at end of file diff --git a/types/components/router-outlet/index.d.ts b/types/components/router-outlet/index.d.ts new file mode 100644 index 0000000..a324729 --- /dev/null +++ b/types/components/router-outlet/index.d.ts @@ -0,0 +1,9 @@ +import { FunctionalComponent } from 'vue'; +import { RouteLocationNormalizedLoaded } from 'vue-router'; +import { JSX } from '@ionic/core'; +export interface Props extends JSX.IonRouterOutlet { + name?: string; + route?: RouteLocationNormalizedLoaded; +} +export declare const IonRouterView: FunctionalComponent; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/controllers/index.d.ts b/types/controllers/index.d.ts deleted file mode 100644 index 3131ed3..0000000 --- a/types/controllers/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export { actionSheetController, alertController, loadingController, menuController, toastController, pickerController } from "@ionic/core"; -export declare const modalController: { - create(options: import("@ionic/core").ModalOptions): Promise; - dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; - getTop(): Promise; -}; -export declare const popoverController: { - create(options: import("@ionic/core").PopoverOptions): Promise; - dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; - getTop(): Promise; -}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/controllers/modal-controller.d.ts b/types/controllers/modal-controller.d.ts deleted file mode 100644 index d51ab22..0000000 --- a/types/controllers/modal-controller.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ModalOptions } from "@ionic/core"; -export declare const modalController: () => { - create(options: ModalOptions): Promise; - dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; - getTop(): Promise; -}; -//# sourceMappingURL=modal-controller.d.ts.map \ No newline at end of file diff --git a/types/controllers/popover-controller.d.ts b/types/controllers/popover-controller.d.ts deleted file mode 100644 index cd7b2f9..0000000 --- a/types/controllers/popover-controller.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PopoverOptions } from "@ionic/core"; -export declare const popoverController: () => { - create(options: PopoverOptions): Promise; - dismiss(data?: any, role?: string | undefined, id?: string | undefined): Promise; - getTop(): Promise; -}; -//# sourceMappingURL=popover-controller.d.ts.map \ No newline at end of file diff --git a/types/controllers/vue-delegate.d.ts b/types/controllers/vue-delegate.d.ts deleted file mode 100644 index def4896..0000000 --- a/types/controllers/vue-delegate.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FrameworkDelegate } from '@ionic/core'; -export declare const VueDelegate: FrameworkDelegate; -export declare function bindLifecycleEvents(instance: any, element: HTMLElement): void; -//# sourceMappingURL=vue-delegate.d.ts.map \ No newline at end of file diff --git a/types/index.d.ts b/types/index.d.ts index 4be3e55..5c358b0 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,3 +1,4 @@ export { IonicVue } from './ionic-vue'; export * from './components'; +export * from './router'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/interfaces.d.ts b/types/interfaces.d.ts deleted file mode 100644 index 7533068..0000000 --- a/types/interfaces.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { HTMLStencilElement } from '@ionic/core'; -export interface IonBackButton extends HTMLStencilElement { - defaultHref?: string; -} -export interface IonRouterOutlet extends HTMLStencilElement { - commit(enterinEl: HTMLElement, leavingEl: HTMLElement | undefined, opts?: object | undefined): Promise; -} -//# sourceMappingURL=interfaces.d.ts.map \ No newline at end of file diff --git a/types/ionic.d.ts b/types/ionic.d.ts deleted file mode 100644 index d3c56de..0000000 --- a/types/ionic.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Plugin } from 'vue'; -export declare const install: Plugin; -//# sourceMappingURL=ionic.d.ts.map \ No newline at end of file diff --git a/types/router.d.ts b/types/router.d.ts index 4715a7c..9f636b6 100644 --- a/types/router.d.ts +++ b/types/router.d.ts @@ -1 +1,11 @@ +import { Ref } from "vue"; +import { Router, RouterOptions } from "vue-router"; +import { NavDirection } from "@ionic/core"; +declare module "vue-router" { + interface Router { + direction: Ref; + showGoBack: Ref; + } +} +export declare const createRouter: (opts: RouterOptions) => Router; //# sourceMappingURL=router.d.ts.map \ No newline at end of file diff --git a/types/utils/createContainerComponent.d.ts b/types/utils/createContainerComponent.d.ts deleted file mode 100644 index dbf29e0..0000000 --- a/types/utils/createContainerComponent.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SetupContext } from 'vue'; -declare type Data = { - [key: string]: unknown; -}; -export declare const createContainerComponent: (name: string) => (props: Data, { slots }: SetupContext any) | null>>) => import("vue").VNode; -export {}; -//# sourceMappingURL=createContainerComponent.d.ts.map \ No newline at end of file diff --git a/types/utils/createInputComponent.d.ts b/types/utils/createInputComponent.d.ts deleted file mode 100644 index 7bc7a44..0000000 --- a/types/utils/createInputComponent.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { FunctionalComponent } from 'vue'; -export declare function createInputComponent(name: string, coreTag: string, updateEvent?: string, modelProp?: string): FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -//# sourceMappingURL=createInputComponent.d.ts.map \ No newline at end of file diff --git a/types/utils/createOverlayComponent.d.ts b/types/utils/createOverlayComponent.d.ts deleted file mode 100644 index 4c82cce..0000000 --- a/types/utils/createOverlayComponent.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { FunctionalComponent } from 'vue'; -export interface OverlayElement extends HTMLElement { - present: () => Promise; - dismiss: (...args: any) => Promise; -} -export interface OverlayProps { - isOpen?: boolean; - modelValue?: boolean; -} -export declare enum OverlayEvents { - onWillPresent = "onWillPresent", - onDidPresent = "onDidPresent", - onWillDismiss = "onWillDismiss", - onDidDismiss = "onDidDismiss", - onUpdate = "update:modelValue" -} -export declare enum OverlayType { - Modal = "IonModal", - ActionSheet = "IonActionSheet", - Popover = "IonPopover" -} -export declare function createOverlay(name: OverlayType, controller: { - create: (opts: any) => Promise; -}): FunctionalComponent>, OverlayEvents[]>; -//# sourceMappingURL=createOverlayComponent.d.ts.map \ No newline at end of file From 8767bdb1f9b127d12f253112e28fe8959d1cc21c Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 25 Apr 2020 15:26:12 +0300 Subject: [PATCH 04/96] Fixes #113 --- src/components/router-outlet/index.ts | 4 +- src/router.ts | 53 +++++++++++++++------------ types/router.d.ts | 10 ++--- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 1b315cf..f380cdf 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -29,8 +29,8 @@ export const IonRouterView: FunctionalComponent = props => { return el?.commit(enteringEl.value, leavingEl, { deepWait: true, - direction: router.direction?.value, - showGoBack: router.showGoBack?.value + direction: router.direction.value, + showGoBack: router.showBackButton.value }); }; diff --git a/src/router.ts b/src/router.ts index c9191c6..4e7bc17 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,46 +1,51 @@ import { Ref, ref } from 'vue'; import { Router, - RouterHistory, RouterOptions, createRouter as createVueRouter } from 'vue-router'; import { NavDirection } from '@ionic/core'; +enum Direction { + forward = 'forward', + back = 'back' +} + declare module 'vue-router' { interface Router { direction: Ref; - showGoBack: Ref; + showBackButton: Ref; } } export const createRouter = (opts: RouterOptions): Router => { - const direction = ref('forward'); - const showGoBack = ref(true); + const direction = ref(Direction.forward); + const directionOverride = ref(); + const showBackButton = ref(false); - const setShowBack = (path: string) => { - showGoBack.value = path !== '/'; + const router = { + ...createVueRouter(opts), + direction, + showBackButton }; - const history: RouterHistory = { - ...opts.history, - push(to, ...args) { - opts.history.push(to, ...args); - setShowBack(opts.history.location.fullPath); - }, - replace(...args) { - opts.history.replace(...args); - setShowBack(opts.history.location.fullPath); - } - }; + router.history.listen((_to, _from, info) => { + directionOverride.value = + info.distance > 0 ? Direction.forward : Direction.back; + }); - history.listen(to => { - setShowBack(to.fullPath); + router.beforeEach((to, from, next) => { + showBackButton.value = to.fullPath !== '/'; + + direction.value = + directionOverride.value || + (to.fullPath.startsWith(from.fullPath) + ? Direction.forward + : Direction.back); + directionOverride.value = undefined; + + next(); }); - return { - ...createVueRouter({ ...opts, history }), - direction, - showGoBack - }; + return router; }; diff --git a/types/router.d.ts b/types/router.d.ts index 9f636b6..816f816 100644 --- a/types/router.d.ts +++ b/types/router.d.ts @@ -1,10 +1,10 @@ -import { Ref } from "vue"; -import { Router, RouterOptions } from "vue-router"; -import { NavDirection } from "@ionic/core"; -declare module "vue-router" { +import { Ref } from 'vue'; +import { Router, RouterOptions } from 'vue-router'; +import { NavDirection } from '@ionic/core'; +declare module 'vue-router' { interface Router { direction: Ref; - showGoBack: Ref; + showBackButton: Ref; } } export declare const createRouter: (opts: RouterOptions) => Router; From 845285d81d364731a176a52b2e050bc78313105e Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 25 Apr 2020 15:26:12 +0300 Subject: [PATCH 05/96] Fixes #113 --- CHANGELOG.md | 32 ++++++++++++++++ src/components/router-outlet/index.ts | 4 +- src/router.ts | 53 +++++++++++++++------------ types/router.d.ts | 10 ++--- 4 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e159539 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +### KNOWN ISSUES +* Some Ionic events and attributes do not work due to their camelCase naming (upstream Vue 3 issue) +* Routing related attributes on Ionic components are not yet supported + +# [3.0.0-alpha.2](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.1...v3.0.0-alpha.2) + +### Features +* Router `` +* Native general components: `IonHeader`, `IonToolbar`, `IonTitle`, `IonContent`, `IonButtons` +* Native back button `IonBackButton` + +### Performance Improvements +* Simplified navigation direction logic + + +# [3.0.0-alpha.1](https://github.com/ModusCreateOrg/ionic-vue/compare/v1.3.6...v3.0.0-alpha.1) + +### BREAKING CHANGES +* `IonicVue` is now a named export +* Routing is temporarily disabled +* Ionic controllers are replaced with native components and are not longer exported, import from `@ionic/core` if needed +* Global `$ionic` property (`Vue.$ionic` and `this.$ionic`) are removed in favor of tree-shakable components + +### Features +* Rewrite from ground up for Vue v3 support +* Native overlay components: `IonModal`, `IonActionSheet`, `IonPopover` +* Native input components: `IonInput`, `IonCheckbox`, `IonDatetime`, `IonRange`, `IonRadio`, `IonSearchbar`, `IonSelect`, `IonTextarea`, `IonToggle` +* Native general components: `IonItem`, `IonLabel`, `IonButton` +* `v-model` support for all components: `` or `` + +### Performance Improvements +* Everything is (and will be) a functional component utilising Reactivity APIs diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 1b315cf..f380cdf 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -29,8 +29,8 @@ export const IonRouterView: FunctionalComponent = props => { return el?.commit(enteringEl.value, leavingEl, { deepWait: true, - direction: router.direction?.value, - showGoBack: router.showGoBack?.value + direction: router.direction.value, + showGoBack: router.showBackButton.value }); }; diff --git a/src/router.ts b/src/router.ts index c9191c6..4e7bc17 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,46 +1,51 @@ import { Ref, ref } from 'vue'; import { Router, - RouterHistory, RouterOptions, createRouter as createVueRouter } from 'vue-router'; import { NavDirection } from '@ionic/core'; +enum Direction { + forward = 'forward', + back = 'back' +} + declare module 'vue-router' { interface Router { direction: Ref; - showGoBack: Ref; + showBackButton: Ref; } } export const createRouter = (opts: RouterOptions): Router => { - const direction = ref('forward'); - const showGoBack = ref(true); + const direction = ref(Direction.forward); + const directionOverride = ref(); + const showBackButton = ref(false); - const setShowBack = (path: string) => { - showGoBack.value = path !== '/'; + const router = { + ...createVueRouter(opts), + direction, + showBackButton }; - const history: RouterHistory = { - ...opts.history, - push(to, ...args) { - opts.history.push(to, ...args); - setShowBack(opts.history.location.fullPath); - }, - replace(...args) { - opts.history.replace(...args); - setShowBack(opts.history.location.fullPath); - } - }; + router.history.listen((_to, _from, info) => { + directionOverride.value = + info.distance > 0 ? Direction.forward : Direction.back; + }); - history.listen(to => { - setShowBack(to.fullPath); + router.beforeEach((to, from, next) => { + showBackButton.value = to.fullPath !== '/'; + + direction.value = + directionOverride.value || + (to.fullPath.startsWith(from.fullPath) + ? Direction.forward + : Direction.back); + directionOverride.value = undefined; + + next(); }); - return { - ...createVueRouter({ ...opts, history }), - direction, - showGoBack - }; + return router; }; diff --git a/types/router.d.ts b/types/router.d.ts index 9f636b6..816f816 100644 --- a/types/router.d.ts +++ b/types/router.d.ts @@ -1,10 +1,10 @@ -import { Ref } from "vue"; -import { Router, RouterOptions } from "vue-router"; -import { NavDirection } from "@ionic/core"; -declare module "vue-router" { +import { Ref } from 'vue'; +import { Router, RouterOptions } from 'vue-router'; +import { NavDirection } from '@ionic/core'; +declare module 'vue-router' { interface Router { direction: Ref; - showGoBack: Ref; + showBackButton: Ref; } } export declare const createRouter: (opts: RouterOptions) => Router; From 69c1118cce0aae1d617e9fba55b918177bc2595d Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 25 Apr 2020 16:02:53 +0300 Subject: [PATCH 06/96] [build] 3.0.0-alpha.2 From d5ed09affa8ecb60a94414c4ba58739e0eca50d3 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 25 Apr 2020 16:02:54 +0300 Subject: [PATCH 07/96] [release] 3.0.0-alpha.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ccd4678..e7b7ea2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b9b652b..970071b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.2", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 4615b553cd4aec05f8105b060ffde7237f5c359d Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 27 Apr 2020 23:18:47 +0300 Subject: [PATCH 08/96] Swipe back --- CHANGELOG.md | 10 ++ package-lock.json | 64 ++++++------- package.json | 2 +- src/components/router-outlet/index.ts | 110 +++++++++++++++++++--- src/router.ts | 6 +- src/utils/defineOverlay.ts | 12 +-- types/components/router-outlet/index.d.ts | 1 + 7 files changed, 153 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e159539..1d72a17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ ### KNOWN ISSUES * Some Ionic events and attributes do not work due to their camelCase naming (upstream Vue 3 issue) * Routing related attributes on Ionic components are not yet supported +* Scroll position is not restored when navigating back + +# Unreleased + +### Features +* Swipe to go back for iOS mode +* Update to vue@3.0.0-beta.4 + +### Bug fixes +* Improve back button display logic # [3.0.0-alpha.2](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.1...v3.0.0-alpha.2) diff --git a/package-lock.json b/package-lock.json index e7b7ea2..287563d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -719,57 +719,57 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.3.tgz", - "integrity": "sha512-r8AFbzQN3IuLbOEKa8y4EDYrbrBUiHh3kX3UHw3YDfBPDG2NryeAMtonden3Nvs7i3QFTCPzrWRfb/bjWqgAzQ==", + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.4.tgz", + "integrity": "sha512-9BQu2BqF2kUDWEfaE60Zm6EqBgS5fg5IwKLdk6WZ1k162jg7cfFklhopD+/7LY1TT9kIZ0PmRBAPrNl+8gwrzg==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.3", + "@vue/shared": "3.0.0-beta.4", "estree-walker": "^0.8.1", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.3.tgz", - "integrity": "sha512-1WimkkPN13ySLAlJl61WSo7xFeC3D8Nqkz35YIZIgksOOIr6W/Q3NfDxfM6bG5nTBWBmgb995oDZ8NNgq2frSg==", + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.4.tgz", + "integrity": "sha512-/1ICCldaRuxdWhBSiYQpWYz2SwxW3bl4sDMuI0h8iUG+IGscDtOn94y8Pt6wqrGT4sWi4KvqQTDdJVx6uOTzqg==", "requires": { - "@vue/compiler-core": "3.0.0-beta.3", - "@vue/shared": "3.0.0-beta.3" + "@vue/compiler-core": "3.0.0-beta.4", + "@vue/shared": "3.0.0-beta.4" } }, "@vue/reactivity": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.3.tgz", - "integrity": "sha512-/QU5sDJkIlTqDd+T3gMZXgchslW8o0hPtyVxphGUjdUGdsXnXjEagDIHDsi35qOJnjfZ8dwq/L1IfVQJ9TENaA==", + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.4.tgz", + "integrity": "sha512-1AU80//po4tUXf71xQR1XC9ldFiKx1fM/uNQcUtlhgctgRy2avqQZKbWSnY0XgbK8dQWtMpkEZoOFT+I1+IURQ==", "requires": { - "@vue/shared": "3.0.0-beta.3" + "@vue/shared": "3.0.0-beta.4" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.3.tgz", - "integrity": "sha512-GHIlKNlJW0sdlro6ouu7Sy34M4I8FAfn6V02RdUwbPwJJc1VICoejnSS1i88i6riGMgNtRhmxW1NDNPCTY1/vQ==", + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.4.tgz", + "integrity": "sha512-g/WYLmsWrEkgHDIpW3Zt7e1+duxcoqi5uh4isNlpHPhhwBFfTi+ghAqf3TO7G1VOhZY6qMqgMDM/g155ibkeHw==", "requires": { - "@vue/reactivity": "3.0.0-beta.3", - "@vue/shared": "3.0.0-beta.3" + "@vue/reactivity": "3.0.0-beta.4", + "@vue/shared": "3.0.0-beta.4" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.3.tgz", - "integrity": "sha512-2CbmDjAGYV4BStukAdByXpK2lQC8svk5oSsG/1rWSdXcDH/gpkCmQocaBahzyRBwX9pVEK4RwRBX4CiNbYjVVg==", + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.4.tgz", + "integrity": "sha512-+0EOnjBIGs8YubiK871oWj9a3YwpT8dCC/rQpTmVUnISLmiGbgQk59RL2JW69yIsmDUkCRePvj06OqjbUB1Huw==", "requires": { - "@vue/runtime-core": "3.0.0-beta.3", - "@vue/shared": "3.0.0-beta.3", + "@vue/runtime-core": "3.0.0-beta.4", + "@vue/shared": "3.0.0-beta.4", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.3.tgz", - "integrity": "sha512-NSiCty9fUjn+JuGtBCnlxqB+9jq4S/W6lGREMz/2cQZchIETu16fBxvQukljVmtbChAjrw/JTOb8HzTrDAhLlQ==" + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.4.tgz", + "integrity": "sha512-itHxDgTzurGLiwkWc9IMPNhac0hv4mkoszGsRQclCKYmJ+Fao913i7pN3Smnl8xUYtv9Bo7EWyxmT60irN0+gg==" }, "@vue/test-utils": { "version": "2.0.0-alpha.2", @@ -5938,13 +5938,13 @@ } }, "vue": { - "version": "3.0.0-beta.3", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.3.tgz", - "integrity": "sha512-5DBah04o/0MNVLFg8BwB5cP3prU6HA/vxXVcUT7E+uvwY6EiJsRKtyZ71m294bKV5ZZkYzzJjLtZrjYGR2tW7g==", + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.4.tgz", + "integrity": "sha512-HNn76qo6+Q9tuvNh9r8o0GpWTXXowECHJGUT58w/xn7kPkWa8Shs3BX6FN0GP9Q35VZNSZCBmpWtQ9FM2LGpHQ==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.3", - "@vue/runtime-dom": "3.0.0-beta.3", - "@vue/shared": "3.0.0-beta.3" + "@vue/compiler-dom": "3.0.0-beta.4", + "@vue/runtime-dom": "3.0.0-beta.4", + "@vue/shared": "3.0.0-beta.4" } }, "vue-class-component": { diff --git a/package.json b/package.json index 970071b..16b13d1 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ }, "dependencies": { "@ionic/core": "^5.0.7", - "vue": "^3.0.0-beta.3", + "vue": "^3.0.0-beta.4", "vue-router": "^4.0.0-alpha.7" }, "jestSonar": { diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index f380cdf..c67ebf3 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -3,21 +3,34 @@ import { FunctionalComponent, Transition, h, - ref + nextTick, + ref, + shallowRef } from 'vue'; -import { RouteLocationNormalizedLoaded, View, useRouter } from 'vue-router'; +import { + RouteLocationNormalizedLoaded, + RouteRecordNormalized, + View, + useRouter +} from 'vue-router'; import { JSX } from '@ionic/core'; export interface Props extends JSX.IonRouterOutlet { name?: string; route?: RouteLocationNormalizedLoaded; + swipeBack?: boolean; } export const IonRouterView: FunctionalComponent = props => { const router = useRouter(); const { name, route, ...outletProps } = props; - const ionRouterOutlet = ref(null); - const enteringEl = ref(null); + const ionRouterOutlet = ref(); + const enteringEl = ref(); + const newView = shallowRef(); + + let persisted = false; + let progressAnimation = false; + let inTransition = false; const transition = async (leavingEl: HTMLElement) => { if (!enteringEl.value || enteringEl.value === leavingEl) { @@ -25,42 +38,115 @@ export const IonRouterView: FunctionalComponent = props => { } enteringEl.value?.classList.add('ion-page', 'ion-page-invisible'); - const el = await ionRouterOutlet.value?.componentOnReady(); + const outlet = await ionRouterOutlet.value?.componentOnReady(); - return el?.commit(enteringEl.value, leavingEl, { + return outlet?.commit(enteringEl.value, leavingEl, { deepWait: true, direction: router.direction.value, - showGoBack: router.showBackButton.value + showGoBack: router.showBackButton.value, + progressAnimation }); }; const transitionHooks: BaseTransitionProps = { onBeforeEnter(el) { + inTransition = true; enteringEl.value = el; }, - async onLeave(el, done) { + async onLeave(el, done: any) { await transition(el); - done(); + + setTimeout(done, persisted ? 100 : 0); + + inTransition = false; + progressAnimation = false; + persisted = false; } }; return h( 'ion-router-outlet', - { ...outletProps, ref: ionRouterOutlet }, + { + ...outletProps, + ref: ionRouterOutlet, + + // workaround for Vue 3 camelCase prop issue + onVnodeMounted(vnode) { + vnode?.el && + (vnode.el.swipeHandler = { + canStart() { + return ( + !inTransition && + !!router.history.state.back && + props.swipeBack !== false && + ionRouterOutlet.value?.mode === 'ios' + ); + }, + onStart() { + progressAnimation = true; + inTransition = true; + router.direction.value = 'back'; + + const prevRoute = router.getRoutes().find(r => { + return r.path === (router.history.state.back as any).fullPath; + }) as RouteRecordNormalized; + + newView.value = { + component: prevRoute?.components[props.name || 'default'], + props: prevRoute?.props + }; + }, + onEnd(shouldComplete: any) { + inTransition = false; + + if (shouldComplete) { + nextTick(() => { + persisted = false; + router.history.go(-1); + }); + return; + } + + persisted = true; + newView.value = undefined; + } + }); + } + }, h(View, { name, route }, (...opts: any) => { const { Component, props: componentProps } = opts[0]; + + const child = newView.value + ? h(newView.value.component, newView.value.props) + : h(Component, componentProps); + + if (newView.value?.component === Component) { + newView.value = undefined; + } + return h( Transition, { css: false, mode: 'in-out', + persisted, + class: { + 'can-go-back': !!router.history.state.back + }, ...transitionHooks }, - () => h(Component, componentProps) + () => child ); }) ); }; -IonRouterView.props = ['name', 'route', 'animated', 'animation', 'mode']; +IonRouterView.props = [ + 'name', + 'route', + 'animated', + 'animation', + 'mode', + 'swipeBack' +]; diff --git a/src/router.ts b/src/router.ts index 4e7bc17..1004d4f 100644 --- a/src/router.ts +++ b/src/router.ts @@ -35,7 +35,7 @@ export const createRouter = (opts: RouterOptions): Router => { }); router.beforeEach((to, from, next) => { - showBackButton.value = to.fullPath !== '/'; + showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; direction.value = directionOverride.value || @@ -47,5 +47,9 @@ export const createRouter = (opts: RouterOptions): Router => { next(); }); + router.afterEach(to => { + showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; + }); + return router; }; diff --git a/src/utils/defineOverlay.ts b/src/utils/defineOverlay.ts index 0c45199..0949348 100644 --- a/src/utils/defineOverlay.ts +++ b/src/utils/defineOverlay.ts @@ -37,8 +37,8 @@ export function defineOverlay( name: OverlayType, controller: OverlayController ) { - const overlay = ref(null); - const content = ref(null); + const overlay = ref(); + const content = ref(); const coreTag = name.charAt(0).toLowerCase() + name.slice(1); const eventListeners: OverlayEventListeners = Object.entries({ [`${coreTag}WillPresent`]: OverlayEvents.onWillPresent, @@ -66,7 +66,7 @@ export function defineOverlay( await (overlay.value?.present() || present(attrs)); } else { await overlay.value?.dismiss(); - overlay.value = null; + overlay.value = undefined; } }, async onVnodeMounted() { @@ -74,8 +74,8 @@ export function defineOverlay( }, async onVnodeBeforeUnmount() { await overlay.value?.dismiss(); - overlay.value = null; - content.value = null; + overlay.value = undefined; + content.value = undefined; } }, [h('div', { ref: content }, slots.default ? slots.default() : undefined)] @@ -120,7 +120,7 @@ export function defineOverlay( } } - await overlay.value.present(); + await overlay.value?.present(); } return Overlay; diff --git a/types/components/router-outlet/index.d.ts b/types/components/router-outlet/index.d.ts index a324729..f5d3ce1 100644 --- a/types/components/router-outlet/index.d.ts +++ b/types/components/router-outlet/index.d.ts @@ -4,6 +4,7 @@ import { JSX } from '@ionic/core'; export interface Props extends JSX.IonRouterOutlet { name?: string; route?: RouteLocationNormalizedLoaded; + swipeBack?: boolean; } export declare const IonRouterView: FunctionalComponent; //# sourceMappingURL=index.d.ts.map \ No newline at end of file From d641608d84dc9db049f487d98089ff84332bd3e8 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 1 May 2020 17:40:26 +0300 Subject: [PATCH 09/96] [build] 3.0.0-alpha.3 --- .prettierrc | 6 + CHANGELOG.md | 4 +- package-lock.json | 892 +++++++++++++++----------- package.json | 16 +- src/components/router-outlet/index.ts | 24 +- src/router.ts | 20 +- 6 files changed, 568 insertions(+), 394 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..324ece1 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "arrowParens": "avoid" +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d72a17..56f6394 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ ### Features * Swipe to go back for iOS mode -* Update to vue@3.0.0-beta.4 +* Hardware back button support +* Update to vue@3.0.0-beta.5 +* Update to vue-router@4.0.0-alpha.9 ### Bug fixes * Improve back button display logic diff --git a/package-lock.json b/package-lock.json index 287563d..ebff60e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.2", + "version": "3.0.0-alpha.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", + "@babel/generator": "^7.9.6", "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -46,12 +46,12 @@ } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", "dev": true, "requires": { - "@babel/types": "^7.9.5", + "@babel/types": "^7.9.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -134,15 +134,15 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" } }, "@babel/helper-simple-access": { @@ -170,14 +170,14 @@ "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" } }, "@babel/highlight": { @@ -205,9 +205,9 @@ } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -311,26 +311,26 @@ } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", + "@babel/generator": "^7.9.6", "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", "requires": { "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", @@ -354,9 +354,9 @@ } }, "@ionic/core": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.0.7.tgz", - "integrity": "sha512-94Ebr4Uw/2aOqweGr4Xmo5csjTQwLcDuHraMC+VuQWNoCztuJI9cX/yhsAS2Yftor+vXC/uGZkubK+P+RFh1jQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.1.0.tgz", + "integrity": "sha512-L3Ps+0B0SqHlArMxPqgzmgtCs2D/cmgWw7rIDsOclh21igXZ9957kRR4BO7hzaXLbBIKjG1IzK2TAcX0uC94Sw==", "requires": { "ionicons": "^5.0.1", "tslib": "^1.10.0" @@ -381,46 +381,46 @@ "dev": true }, "@jest/console": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.4.0.tgz", - "integrity": "sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-message-util": "^25.4.0", - "jest-util": "^25.4.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.4.0.tgz", - "integrity": "sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.3.tgz", + "integrity": "sha512-/wY1JCmY61wMjGsix0ccNmiHsl7+l1nGMvdXnWbceezWyf8gFoqA7kRN6e2CTcF2K1GVYhsUdLdyKpz7hVMegQ==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/reporters": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/reporters": "^25.5.1", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.4.0", - "jest-config": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-message-util": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^25.5.0", + "jest-config": "^25.5.3", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-resolve-dependencies": "^25.4.0", - "jest-runner": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", - "jest-watcher": "^25.4.0", + "jest-resolve": "^25.5.1", + "jest-resolve-dependencies": "^25.5.2", + "jest-runner": "^25.5.3", + "jest-runtime": "^25.5.3", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "jest-watcher": "^25.5.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "realpath-native": "^2.0.0", @@ -435,6 +435,12 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -447,124 +453,169 @@ } }, "@jest/environment": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.4.0.tgz", - "integrity": "sha512-KDctiak4mu7b4J6BIoN/+LUL3pscBzoUCP+EtSPd2tK9fqyDY5OF+CmkBywkFWezS9tyH5ACOQNtpjtueEDH6Q==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", "dev": true, "requires": { - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0" + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" } }, "@jest/fake-timers": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.4.0.tgz", - "integrity": "sha512-lI9z+VOmVX4dPPFzyj0vm+UtaB8dCJJ852lcDnY0uCPRvZAaVGnMwBBc1wxtf+h7Vz6KszoOvKAt4QijDnHDkg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "lolex": "^5.0.0" } }, + "@jest/globals": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" + } + }, "@jest/reporters": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.4.0.tgz", - "integrity": "sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", + "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.4.0", - "jest-resolve": "^25.4.0", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "jest-haste-map": "^25.5.1", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^3.1.0", "terminal-link": "^2.0.0", "v8-to-istanbul": "^4.1.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "@jest/test-result": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.4.0.tgz", - "integrity": "sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.4.0.tgz", - "integrity": "sha512-240cI+nsM3attx2bMp9uGjjHrwrpvxxrZi8Tyqp/cfOzl98oZXVakXBgxODGyBYAy/UGXPKXLvNc2GaqItrsJg==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.3.tgz", + "integrity": "sha512-/xvmwp+7eTsgmbyFp649WCpyf6x+c7CMERYOnZtIYIqpOW2p0vDbY1TNyr1wum4c/xSe+KR8iBIzsZKa6csmeg==", "dev": true, "requires": { - "@jest/test-result": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-runner": "^25.4.0", - "jest-runtime": "^25.4.0" + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.3", + "jest-runtime": "^25.5.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "@jest/transform": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.4.0.tgz", - "integrity": "sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", "jest-regex-util": "^25.2.6", - "jest-util": "^25.4.0", + "jest-util": "^25.5.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -634,9 +685,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -654,6 +705,15 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -719,62 +779,62 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.4.tgz", - "integrity": "sha512-9BQu2BqF2kUDWEfaE60Zm6EqBgS5fg5IwKLdk6WZ1k162jg7cfFklhopD+/7LY1TT9kIZ0PmRBAPrNl+8gwrzg==", + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.5.tgz", + "integrity": "sha512-8j61FHZ+CoFy4Fdzdxz3g7sTLG/YbqvqPFC8o+IKSCAbtznQ9GHvakT7bQf/umBhSxAEKYXZQpWuLvoEY527bQ==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.4", + "@vue/shared": "3.0.0-beta.5", "estree-walker": "^0.8.1", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.4.tgz", - "integrity": "sha512-/1ICCldaRuxdWhBSiYQpWYz2SwxW3bl4sDMuI0h8iUG+IGscDtOn94y8Pt6wqrGT4sWi4KvqQTDdJVx6uOTzqg==", + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.5.tgz", + "integrity": "sha512-IUR+ITbYB8n+mCx5HXNb3EsvG7hlx7mqyliwlzBuhJR3QNcy3qeanspN6pcTwHqBJ/CTE+q98ttJs+RaEgepmQ==", "requires": { - "@vue/compiler-core": "3.0.0-beta.4", - "@vue/shared": "3.0.0-beta.4" + "@vue/compiler-core": "3.0.0-beta.5", + "@vue/shared": "3.0.0-beta.5" } }, "@vue/reactivity": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.4.tgz", - "integrity": "sha512-1AU80//po4tUXf71xQR1XC9ldFiKx1fM/uNQcUtlhgctgRy2avqQZKbWSnY0XgbK8dQWtMpkEZoOFT+I1+IURQ==", + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.5.tgz", + "integrity": "sha512-6tvll/4F/guShcYK7cktbboHwyNLMfp/gyIUraLYutIRBTDh+OR1J1G2vC53xR22InCjPls5/tbA3eMPHkYv1Q==", "requires": { - "@vue/shared": "3.0.0-beta.4" + "@vue/shared": "3.0.0-beta.5" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.4.tgz", - "integrity": "sha512-g/WYLmsWrEkgHDIpW3Zt7e1+duxcoqi5uh4isNlpHPhhwBFfTi+ghAqf3TO7G1VOhZY6qMqgMDM/g155ibkeHw==", + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.5.tgz", + "integrity": "sha512-AewCm2zfiY3TAKZhRO619TmebXuSohW8FdDtPgiKw7Dl/DrNt3s09L8g8JPNln4Y2VelfF7gtg/Y9nG98cFrGg==", "requires": { - "@vue/reactivity": "3.0.0-beta.4", - "@vue/shared": "3.0.0-beta.4" + "@vue/reactivity": "3.0.0-beta.5", + "@vue/shared": "3.0.0-beta.5" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.4.tgz", - "integrity": "sha512-+0EOnjBIGs8YubiK871oWj9a3YwpT8dCC/rQpTmVUnISLmiGbgQk59RL2JW69yIsmDUkCRePvj06OqjbUB1Huw==", + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.5.tgz", + "integrity": "sha512-vk7W1qUR3ueQv6tv/hrroShFd4C+caoFNv8ekmzop8V3zxC2J9sAbMpc5Qmi3COGUV07z5Sgr33Ht92e2yFBNA==", "requires": { - "@vue/runtime-core": "3.0.0-beta.4", - "@vue/shared": "3.0.0-beta.4", + "@vue/runtime-core": "3.0.0-beta.5", + "@vue/shared": "3.0.0-beta.5", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.4.tgz", - "integrity": "sha512-itHxDgTzurGLiwkWc9IMPNhac0hv4mkoszGsRQclCKYmJ+Fao913i7pN3Smnl8xUYtv9Bo7EWyxmT60irN0+gg==" + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.5.tgz", + "integrity": "sha512-RKMeR+yuS2HokYtkFb72YZ6EnxDiIjEXLTflLkHBp2fdEj4liHSJ3cESVtcfNOGr5sWd8w4dG2t4xloTDx24Fg==" }, "@vue/test-utils": { - "version": "2.0.0-alpha.2", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.2.tgz", - "integrity": "sha512-b3u4ZEGC/6MrrnqHK7ey0w04KPL060KqF56OozLVgNk4Sxrn9aUQER1MZKD2kuEdeyArqV3hT0m5BBGdTSvztQ==", + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.3.tgz", + "integrity": "sha512-LS5QIPfMO1Kb3DGiN/zRsRl+rxrA7GVIHroeiXTRrEKDVUJOczh+9xj4g9183bFiuMUK73pBCfDTuxTP8N8y8Q==", "dev": true, "requires": { "dom-event-types": "^1.0.0", @@ -1145,18 +1205,27 @@ } }, "babel-jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.4.0.tgz", - "integrity": "sha512-p+epx4K0ypmHuCnd8BapfyOwWwosNCYhedetQey1awddtfmEX0MmdxctGl956uwUmjwXR5VSS5xJcGX9DvdIog==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", "dev": true, "requires": { - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.4.0", + "babel-preset-jest": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "babel-messages": { @@ -1191,11 +1260,13 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.4.0.tgz", - "integrity": "sha512-M3a10JCtTyKevb0MjuH6tU+cP/NVQZ82QPADqI1RQYY1OphztsCeIeQmTsHmF/NS6m0E51Zl4QNsI3odXSQF5w==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", "dev": true, "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", "@types/babel__traverse": "^7.0.6" } }, @@ -1558,12 +1629,12 @@ } }, "babel-preset-jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.4.0.tgz", - "integrity": "sha512-PwFiEWflHdu3JCeTr0Pb9NcHHE34qWFnPQRVPvqQITx4CsDCzs6o05923I10XvLvn9nNsRHuiVgB72wG/90ZHQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^25.4.0", + "babel-plugin-jest-hoist": "^25.5.0", "babel-preset-current-node-syntax": "^0.1.2" } }, @@ -2156,9 +2227,9 @@ "dev": true }, "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" @@ -2494,16 +2565,16 @@ } }, "expect": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.4.0.tgz", - "integrity": "sha512-7BDIX99BTi12/sNGJXA9KMRcby4iAmu1xccBOhyKCyEhjcVKS3hPmHdA/4nSI9QGIOkUropKqr3vv7WMDM5lvQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "ansi-styles": "^4.0.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6" }, "dependencies": { @@ -3261,32 +3332,39 @@ } }, "jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.4.0.tgz", - "integrity": "sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.3.tgz", + "integrity": "sha512-YImNJIOcQ5pguFpzZ14FQ+v2rannjrFP3R+SU/Wi2TyLQE5hZXcAbg9+WVl+lnEZHAZ99Jyh+tjhW59iMiI0pg==", "dev": true, "requires": { - "@jest/core": "^25.4.0", + "@jest/core": "^25.5.3", "import-local": "^3.0.2", - "jest-cli": "^25.4.0" + "jest-cli": "^25.5.3" }, "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "jest-cli": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.4.0.tgz", - "integrity": "sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.3.tgz", + "integrity": "sha512-epjgZ0WeBECVXOQ11pn7Pc3n8SeGAqdWb+X2eSLoyCGieFEBAatB7bVI+UmyH/vsiOxpIb0qwby0QrrGMZMfcQ==", "dev": true, "requires": { - "@jest/core": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/core": "^25.5.3", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-config": "^25.5.3", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "prompts": "^2.0.1", "realpath-native": "^2.0.0", "yargs": "^15.3.1" @@ -3295,12 +3373,12 @@ } }, "jest-changed-files": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.4.0.tgz", - "integrity": "sha512-VR/rfJsEs4BVMkwOTuStRyS630fidFVekdw/lBaBQjx9KK3VZFOZ2c0fsom2fRp8pMCrCTP6LGna00o/DXGlqA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "execa": "^3.2.0", "throat": "^5.0.0" }, @@ -3388,41 +3466,50 @@ } }, "jest-config": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.4.0.tgz", - "integrity": "sha512-egT9aKYxMyMSQV1aqTgam0SkI5/I2P9qrKexN5r2uuM2+68ypnc+zPGmfUxK7p1UhE7dYH9SLBS7yb+TtmT1AA==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.3.tgz", + "integrity": "sha512-PrzL7wCP9XMEmUd+0ArcR37SVL7oF1lnIPxzppfeYvPytOtgTdXa2M/0TKcPYPHaa/T3UvHEpSNiC25yXktfsQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.4.0", - "@jest/types": "^25.4.0", - "babel-jest": "^25.4.0", + "@jest/test-sequencer": "^25.5.3", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.4.0", - "jest-environment-node": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.4.0", + "jest-jasmine2": "^25.5.2", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "micromatch": "^4.0.2", - "pretty-format": "^25.4.0", + "pretty-format": "^25.5.0", "realpath-native": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-diff": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.4.0.tgz", - "integrity": "sha512-kklLbJVXW0y8UKOWOdYhI6TH5MG6QAxrWiBMgQaPIuhj3dNFGirKCd+/xfplBXICQ7fI+3QcqHm9p9lWu1N6ug==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, "requires": { "chalk": "^3.0.0", "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" } }, "jest-docblock": { @@ -3435,43 +3522,43 @@ } }, "jest-each": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.4.0.tgz", - "integrity": "sha512-lwRIJ8/vQU/6vq3nnSSUw1Y3nz5tkYSFIywGCZpUBd6WcRgpn8NmJoQICojbpZmsJOJNHm0BKdyuJ6Xdx+eDQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", - "jest-util": "^25.4.0", - "pretty-format": "^25.4.0" + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" } }, "jest-environment-jsdom": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz", - "integrity": "sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", "dev": true, "requires": { - "@jest/environment": "^25.4.0", - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.4.0.tgz", - "integrity": "sha512-wryZ18vsxEAKFH7Z74zi/y/SyI1j6UkVZ6QsllBuT/bWlahNfQjLNwFsgh/5u7O957dYFoXj4yfma4n4X6kU9A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", "dev": true, "requires": { - "@jest/environment": "^25.4.0", - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "semver": "^6.3.0" }, "dependencies": { @@ -3490,94 +3577,112 @@ "dev": true }, "jest-haste-map": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.4.0.tgz", - "integrity": "sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-jasmine2": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.4.0.tgz", - "integrity": "sha512-QccxnozujVKYNEhMQ1vREiz859fPN/XklOzfQjm2j9IGytAkUbSwjFRBtQbHaNZ88cItMpw02JnHGsIdfdpwxQ==", + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.2.tgz", + "integrity": "sha512-wRtHAy97F4hafJgnh5CwI/N1tDo7z+urteQAyr3rjK7X3TZWX5hSV4cO7WIBKLDV0kPICCmsGiNYs1caeHD/sQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.4.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.4.0", + "expect": "^25.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^25.4.0", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "pretty-format": "^25.4.0", + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.2", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.4.0.tgz", - "integrity": "sha512-7Y6Bqfv2xWsB+7w44dvZuLs5SQ//fzhETgOGG7Gq3TTGFdYvAgXGwV8z159RFZ6fXiCPm/szQ90CyfVos9JIFQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", "dev": true, "requires": { "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" } }, "jest-matcher-utils": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.4.0.tgz", - "integrity": "sha512-yPMdtj7YDgXhnGbc66bowk8AkQ0YwClbbwk3Kzhn5GVDrciiCr27U4NJRbrqXbTdtxjImONITg2LiRIw650k5A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.4.0", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" } }, "jest-message-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", - "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-mock": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.4.0.tgz", - "integrity": "sha512-MdazSfcYAUjJjuVTTnusLPzE0pE4VXpOUzWdj8sbM+q6abUjm3bATVPXFqTXrxSieR8ocpvQ9v/QaQCftioQFg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, "requires": { - "@jest/types": "^25.4.0" + "@jest/types": "^25.5.0" } }, "jest-pnp-resolver": { @@ -3593,120 +3698,164 @@ "dev": true }, "jest-resolve": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.4.0.tgz", - "integrity": "sha512-wOsKqVDFWUiv8BtLMCC6uAJ/pHZkfFgoBTgPtmYlsprAjkxrr2U++ZnB3l5ykBMd2O24lXvf30SMAjJIW6k2aA==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.1", "read-pkg-up": "^7.0.1", "realpath-native": "^2.0.0", - "resolve": "^1.15.1", + "resolve": "^1.17.0", "slash": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-resolve-dependencies": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz", - "integrity": "sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A==", + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.2.tgz", + "integrity": "sha512-4xlPp6/SFFZj7g7WkhoKEEWsYqmAK6WcmFFRfDJ0K4T2f/MCJgFEPqv1F88ro6ZJdpOti08CxGku4gBwau/RjQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.4.0" + "jest-snapshot": "^25.5.1" } }, "jest-runner": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.4.0.tgz", - "integrity": "sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.3.tgz", + "integrity": "sha512-g4DyOG9hXdFhYL57bzVKWT6AuakcwDgvkB1RIie17mzF1EK4FFLSq9D/5hglgWtlhh6IH3CRDePIFetMHzLmCw==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/environment": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.3", "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.4.0", - "jest-jasmine2": "^25.4.0", - "jest-leak-detector": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-resolve": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.2", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.3", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-runtime": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.4.0.tgz", - "integrity": "sha512-lgNJlCDULtXu9FumnwCyWlOub8iytijwsPNa30BKrSNtgoT6NUMXOPrZvsH06U6v0wgD/Igwz13nKA2wEKU2VA==", - "dev": true, - "requires": { - "@jest/console": "^25.4.0", - "@jest/environment": "^25.4.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.3.tgz", + "integrity": "sha512-q6ajy2rtRDjIzSJm7J0g1kYG4MLlgfBeMNdaEKOa7z/JHLxEBz0ija67C9UioO1L0oWxiulH3Zt7iFhE8r3ITg==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-mock": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.3", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.3.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } }, "jest-snapshot": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.4.0.tgz", - "integrity": "sha512-J4CJ0X2SaGheYRZdLz9CRHn9jUknVmlks4UBeu270hPAvdsauFXOhx9SQP2JtRzhnR3cvro/9N9KP83/uvFfRg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.4.0", - "jest-diff": "^25.4.0", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-resolve": "^25.4.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.4.0", + "pretty-format": "^25.5.0", "semver": "^6.3.0" }, "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3725,29 +3874,38 @@ } }, "jest-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.4.0.tgz", - "integrity": "sha512-WSZD59sBtAUjLv1hMeKbNZXmMcrLRWcYqpO8Dz8b4CeCTZpfNQw2q9uwrYAD+BbJoLJlu4ezVPwtAmM/9/SlZA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } } }, "jest-validate": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.4.0.tgz", - "integrity": "sha512-hvjmes/EFVJSoeP1yOl8qR8mAtMR3ToBkZeXrD/ZS9VxRyWDqQ/E1C5ucMTeSmEOGLipvdlyipiGbHJ+R1MQ0g==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", "leven": "^3.1.0", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" } }, "jest-vue-preprocessor": { @@ -3762,23 +3920,23 @@ } }, "jest-watcher": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.4.0.tgz", - "integrity": "sha512-36IUfOSRELsKLB7k25j/wutx0aVuHFN6wO94gPNjQtQqFPa2rkOymmx9rM5EzbF3XBZZ2oqD9xbRVoYa2w86gw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", + "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", "dev": true, "requires": { - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.4.0", + "jest-util": "^25.5.0", "string-length": "^3.1.0" } }, "jest-worker": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", - "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -4463,12 +4621,12 @@ "dev": true }, "pretty-format": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.4.0.tgz", - "integrity": "sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -4773,9 +4931,9 @@ "dev": true }, "resolve": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.0.tgz", - "integrity": "sha512-LarL/PIKJvc09k1jaeT4kQb/8/7P+qV4qSnN2K80AES+OHdfZELAKVOBjxsvtToT/uLOfFbvYvKfZmV8cee7nA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -5645,9 +5803,9 @@ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tslint": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.1.tgz", - "integrity": "sha512-kd6AQ/IgPRpLn6g5TozqzPdGNZ0q0jtXW4//hRcj10qLYBaa3mTUU2y2MCG+RXZm8Zx+KZi0eA+YCrMyNlF4UA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5938,13 +6096,13 @@ } }, "vue": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.4.tgz", - "integrity": "sha512-HNn76qo6+Q9tuvNh9r8o0GpWTXXowECHJGUT58w/xn7kPkWa8Shs3BX6FN0GP9Q35VZNSZCBmpWtQ9FM2LGpHQ==", + "version": "3.0.0-beta.5", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.5.tgz", + "integrity": "sha512-Puri+Cea5hy1pjtnTN2crnwU2jI5lBBtcLHqQkHABjFi5RTQ3T2FMF2HtWfXi4UqjLK1/f+r1P05y4y+Da2sMg==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.4", - "@vue/runtime-dom": "3.0.0-beta.4", - "@vue/shared": "3.0.0-beta.4" + "@vue/compiler-dom": "3.0.0-beta.5", + "@vue/runtime-dom": "3.0.0-beta.5", + "@vue/shared": "3.0.0-beta.5" } }, "vue-class-component": { @@ -5963,9 +6121,9 @@ } }, "vue-router": { - "version": "4.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.7.tgz", - "integrity": "sha512-B1wghgEeFZSjBRPa6rTjy82/b8ArfrirY+Y8ZxZXdkOg4mQpfSPnTfgWGNa1n4dCLDiUiNl1BYhhW0s4fqV3gQ==" + "version": "4.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.9.tgz", + "integrity": "sha512-OUbbjRmAGf6aA8VoSF+jrZgg0Ozk+Quqtsec/uSdEX43R6v7MEmKgR+M66doAZkRUfbm7lotxnObwV55/CjNRQ==" }, "w3c-hr-time": { "version": "1.0.2", @@ -6121,9 +6279,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", "dev": true }, "xml": { diff --git a/package.json b/package.json index 16b13d1..770f291 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.2", + "version": "3.0.0-alpha.3", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", @@ -56,10 +56,10 @@ "clean": "node ./scripts/clean.js" }, "devDependencies": { - "@vue/test-utils": "^2.0.0-alpha.2", - "babel-jest": "^25.4.0", + "@vue/test-utils": "^2.0.0-alpha.3", + "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", - "jest": "^25.4.0", + "jest": "^25.5.3", "jest-sonar-reporter": "^2.0.0", "jest-vue-preprocessor": "^1.4.0", "rollup": "^0.62.0", @@ -67,14 +67,14 @@ "rollup-plugin-terser": "^1.0.1", "rollup-plugin-typescript2": "^0.27.0", "tslib": "^1.11.1", - "tslint": "^6.1.1", + "tslint": "^6.1.2", "tslint-ionic-rules": "^0.0.21", "typescript": "^3.8.3" }, "dependencies": { - "@ionic/core": "^5.0.7", - "vue": "^3.0.0-beta.4", - "vue-router": "^4.0.0-alpha.7" + "@ionic/core": "^5.1.0", + "vue": "^3.0.0-beta.5", + "vue-router": "^4.0.0-alpha.9" }, "jestSonar": { "reportPath": "reports", diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index c67ebf3..00fcf5b 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -5,13 +5,13 @@ import { h, nextTick, ref, - shallowRef + shallowRef, } from 'vue'; import { RouteLocationNormalizedLoaded, RouteRecordNormalized, - View, - useRouter + RouterView, + useRouter, } from 'vue-router'; import { JSX } from '@ionic/core'; @@ -44,7 +44,7 @@ export const IonRouterView: FunctionalComponent = props => { deepWait: true, direction: router.direction.value, showGoBack: router.showBackButton.value, - progressAnimation + progressAnimation, }); }; @@ -62,7 +62,7 @@ export const IonRouterView: FunctionalComponent = props => { inTransition = false; progressAnimation = false; persisted = false; - } + }, }; return h( @@ -94,7 +94,7 @@ export const IonRouterView: FunctionalComponent = props => { newView.value = { component: prevRoute?.components[props.name || 'default'], - props: prevRoute?.props + props: prevRoute?.props, }; }, onEnd(shouldComplete: any) { @@ -110,11 +110,11 @@ export const IonRouterView: FunctionalComponent = props => { persisted = true; newView.value = undefined; - } + }, }); - } + }, }, - h(View, { name, route }, (...opts: any) => { + h(RouterView, { name, route }, (...opts: any) => { const { Component, props: componentProps } = opts[0]; const child = newView.value @@ -132,9 +132,9 @@ export const IonRouterView: FunctionalComponent = props => { mode: 'in-out', persisted, class: { - 'can-go-back': !!router.history.state.back + 'can-go-back': !!router.history.state.back, }, - ...transitionHooks + ...transitionHooks, }, () => child ); @@ -148,5 +148,5 @@ IonRouterView.props = [ 'animated', 'animation', 'mode', - 'swipeBack' + 'swipeBack', ]; diff --git a/src/router.ts b/src/router.ts index 1004d4f..efa9515 100644 --- a/src/router.ts +++ b/src/router.ts @@ -2,13 +2,13 @@ import { Ref, ref } from 'vue'; import { Router, RouterOptions, - createRouter as createVueRouter + createRouter as createVueRouter, } from 'vue-router'; -import { NavDirection } from '@ionic/core'; +import { BackButtonEvent, NavDirection } from '@ionic/core'; enum Direction { forward = 'forward', - back = 'back' + back = 'back', } declare module 'vue-router' { @@ -26,12 +26,11 @@ export const createRouter = (opts: RouterOptions): Router => { const router = { ...createVueRouter(opts), direction, - showBackButton + showBackButton, }; router.history.listen((_to, _from, info) => { - directionOverride.value = - info.distance > 0 ? Direction.forward : Direction.back; + directionOverride.value = (info.direction as unknown) as Direction; }); router.beforeEach((to, from, next) => { @@ -51,5 +50,14 @@ export const createRouter = (opts: RouterOptions): Router => { showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; }); + if (document) { + document.addEventListener('ionBackButton', (e: Event) => { + (e as BackButtonEvent).detail.register(0, (next: () => void) => { + router.history.go(-1); + next(); + }); + }); + } + return router; }; From a32152014b12be5cd673190406b1c43a339ed835 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 1 May 2020 17:43:03 +0300 Subject: [PATCH 10/96] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56f6394..0c5f50a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ # Unreleased + + +# [3.0.0-alpha.3](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.2...v3.0.0-alpha.3) + ### Features * Swipe to go back for iOS mode * Hardware back button support From 3ee062469250731e823b793ad4b3c5b003327e6a Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 1 May 2020 17:51:50 +0300 Subject: [PATCH 11/96] Update release script --- build/release.sh | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/release.sh b/build/release.sh index 644d5be..cde1450 100755 --- a/build/release.sh +++ b/build/release.sh @@ -5,20 +5,20 @@ echo "Enter release version: " read VERSION read -p "Releasing $VERSION - are you sure? (y/n)" -n 1 -r -echo # (optional) move to a new line +echo #move to new line + if [[ $REPLY =~ ^[Yy]$ ]] then - npm run lint echo "Releasing $VERSION ..." VERSION=$VERSION npm run prod # commit git add -A - git commit --allow-empty -m "[build] $VERSION" - npm version $VERSION --message "[release] $VERSION" + npm version $VERSION prerelease --preid=alpha --no-git-tag-version + git commit -m "[build] $VERSION" + git tag v$VERSION # publish - git push origin refs/tags/v$VERSION - git push + git push --tags npm publish fi diff --git a/package.json b/package.json index 770f291..1982914 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "scripts": { "dev": "rollup -c ./build/rollup.config.js", "watch": "rollup -w -c ./build/rollup.config.js", - "prod": "npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd", + "prod": "npm run lint && npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd", "lint": "tslint --project . --fix", "test": "jest --coverage --verbose", "clean": "node ./scripts/clean.js" From e91797e3048cfe50550877de70678d28922d205d Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sun, 3 May 2020 14:44:49 +0300 Subject: [PATCH 12/96] Update readme, fixes #117 --- README.md | 253 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 129 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index e580a17..ace291d 100644 --- a/README.md +++ b/README.md @@ -1,164 +1,179 @@ -# Ionic-Vue becomes @ionic/vue -**Important: This project has been contributed to the Ionic core and can be used as [@ionic/vue](https://github.com/ionic-team/ionic/tree/master/vue).** - -Modus Create engineers will continue to support the community at the Ionic's official [Issue board](https://github.com/ionic-team/ionic/issues) - -However, this repository is still being actively maintained and kept in-sync with the official @ionic/vue. The main difference being the availability of pending upstream pull requests and flexibility of choosing dependency versions. - -Our goal is to allow developers to be on the bleeding-edge and freely experiment, thus we are delivering features and bug fixes as fast as possible. - -Bug fixes, features, documentation and any other changes are always contributed back to upstream @ionic/vue. - ---- ---- - # Ionic-Vue [![CircleCI](https://circleci.com/gh/ModusCreateOrg/ionic-vue.svg?style=shield)](https://circleci.com/gh/ModusCreateOrg/ionic-vue) [![codecov](https://codecov.io/gh/ModusCreateOrg/ionic-vue/branch/master/graph/badge.svg?token=mvAX8xwXDJ)](https://codecov.io/gh/ModusCreateOrg/ionic-vue) [![SonarQube](https://sonarcloud.io/api/project_badges/measure?project=ionic_vue&metric=security_rating)](https://sonarcloud.io/dashboard?id=ionic_vue) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) -[![MIT Licensed](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/your/your-project/blob/master/LICENSE) +[![MIT Licensed](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/ModusCreateOrg/ionic-vue/blob/master/LICENSE) -Ionic integration adapters for Vue. +Ionic 5 integration adapters for Vue 3.

@modus/ionic-vue

+## Status: Alpha + +This is a prerelease, most of the functionality is in there such as the router, animations, input and overlay components. Since we are building on top of prereleases of Vue and VueRouter there may be breaking changes and bugs. The prerelease is created for early adopters to test the library and provide feedback, bug reports and feature requests. + ## Roadmap -Overview: all of the controllers and major features such as transitions and router have been implemented and tested for several months now. -Apart from minor improvements and further testing of various mixes of Ionic components and implementations this library is considered feature complete. - -| Feature | Status | @ionic/vue | Notes | -|-------------|---------|------------|-------| -| Router | :heavy_check_mark: | :heavy_check_mark: | Fully implemented | -| Router View | :heavy_check_mark: | :heavy_check_mark: | Fully implemented | -| Tabs | :heavy_check_mark: | :heavy_check_mark: | Fully implemented | -| Controllers | :heavy_check_mark: | :heavy_check_mark: | Fully implemented | -| TypeScript | :heavy_check_mark: | :heavy_check_mark: | Fully implemented | -| MS Edge Fix | :heavy_check_mark: | :heavy_check_mark: | Fully implemented | -| Router keep-alive | :heavy_check_mark: | [Pending](https://github.com/ionic-team/ionic/pull/18561) | - | -| Functional Inputs | :heavy_check_mark: | [Pending](https://github.com/ionic-team/ionic/pull/19087) | - | -| Import controllers directly | :heavy_check_mark: | [Pending](https://github.com/ionic-team/ionic/pull/19573) | Improve treeshaking and sync with react and angular implementations | -| Unit tests | :x: | :x: | Outdated as were originally written in plain JS, need to be updated for TS | - -## Ionic versions 4 and 5 -:warning: Moving forward all versions of `ionic-vue` will be supporting Ionic 5 only, if you'd like to continue using Ionic 4 please use `ionic-vue` version `1.3.4` +Please consult the [projects page](https://github.com/ModusCreateOrg/ionic-vue/projects/1) for more details. ## Installing / Getting started A quick introduction of the minimal setup you need to get a hello world up and running. -```shell +```sh npm install @ionic/core @modus/ionic-vue ``` Now you can use it during the initialization step of your Vue app. +Note that `createRouter` is imported from `@modus/ionic-vue` and not `vue-router` this will allow you to get Ionic transitions between your routes out of the box. ```js -import Vue from 'vue' -import '@ionic/core/css/ionic.bundle.css' -import Ionic, { IonicVueRouter } from '@modus/ionic-vue' -import Home from './Home.vue' - -Vue.use(Ionic) -Vue.use(IonicVueRouter) - -new Vue({ - router: new IonicVueRouter({ - routes: [ - { path: '/', component: Home }, - { path: '/page', component: () => import('./Page.vue') } - ], - }), -}).$mount('ion-app') +import { createApp } from "vue"; +import { createWebHistory } from "vue-router"; +import { IonicVue, createRouter } from "@modus/ionic-vue"; + +// Ionic core styles +import "@ionic/core/css/ionic.bundle.css"; + +import App from "./App.vue"; +import Home from "./components/Home.vue"; +import Page from "./components/Page.vue"; + +const history = createWebHistory(); +const router = createRouter({ + history, + routes: [ + { path: "/", component: Home }, + { path: "/page", component: Page }, + ], +}); + +createApp(App) + .use(IonicVue) + .use(router) + .mount("#app"); ``` -Ionic requires a root element of `ion-app` in your HTML. +All components should be explicitly imported now, this allows for smaller build sizes and improved tree-shaking. +Import `IonApp` and `IonRouterView` from `@modus/ionic-vue`, this will be your app's entry point. -IonicVueRouter requires `ion-vue-router` element in order to render Ionic transitions. Otherwise you can use the [official VueRouter](https://router.vuejs.org/) +```vue + -```html - - - ... + ``` -### IonicVue - -`IonicVue` abstracts DOM interaction of Ionic UI components inside a Vue application. - -```js -import { alertController } from '@ionic/vue'; - -Vue.component('Foo', { +Everything is a component now, here's an example of how you could trigger a modal + +```vue + + + ``` -IonicVue supports all of the Ionic controllers: - -- [Action Sheet](https://github.com/ionic-team/ionic/tree/master/core/src/components/action-sheet-controller) -- [Alert](https://github.com/ionic-team/ionic/tree/master/core/src/components/alert-controller) -- [Loading](https://github.com/ionic-team/ionic/tree/master/core/src/components/loading-controller) -- [Menu](https://github.com/ionic-team/ionic/tree/master/core/src/components/menu-controller) -- [Modal](https://github.com/ionic-team/ionic/tree/master/core/src/components/modal-controller) -- [Picker](https://github.com/ionic-team/ionic/tree/master/core/src/components/picker-controller) -- [Popover](https://github.com/ionic-team/ionic/tree/master/core/src/components/popover-controller) -- [Toast](https://github.com/ionic-team/ionic/tree/master/core/src/components/toast-controller) - -### IonicVueRouter - -`IonicVueRouter` binds Ionic transitions and routing functionalities with Vue Router. +### IonicVue Router +IonicVue Router binds Ionic transitions and routing functionalities to Vue Router. It is an extension of the official Vue Router thus it can be used as a drop-in replacement with all of the methods, hooks, etc. working as expected. ## Developing -### Setting up Dev - -Simply clone the repo and install dependencies to get started with development. +Clone the repo's `dev` branch and install dependencies to get started with development. ```shell -git clone https://github.com/moduscreateorg/ionic-vue.git +git clone https://github.com/moduscreateorg/ionic-vue.git -b dev cd ionic-vue/ npm install ``` -Testing will require peer dependencies to be installed. Peer dependencies are: - -- `vue` -- `vue-template-compiler` -- `vue-router` -- `@ionic/core` - -You can install peer dependencies without modifying package.json. - -```sh -npm run install.peer -``` - We recommend trying out your `ionic-vue` changes in an actual app. You can do that with `npm link`: ```sh @@ -168,8 +183,6 @@ cd ../sample-app/ npm link @modus/ionic-vue ``` -[Beep](https://github.com/ModusCreateOrg/beep) is a fantastic sample application you can use to test `ionic-vue`. - ### Building Rollup automatically creates distribution packages. @@ -192,14 +205,6 @@ For production build run: npm run prod ``` -## Tests - -Make sure you have installed peer dependencies (explained above) before running tests. - -```shell -npm test -``` - ## Static Analysis The ionic-vue project uses SonarQube's SonarCloud product for static analysis scans. From 92deb24fc8e1b7305b82befa51186901eba77476 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 9 May 2020 15:22:06 +0300 Subject: [PATCH 13/96] [build] 3.0.0-alpha.4 --- build/release.sh | 2 +- package-lock.json | 208 ++++++++++++++------------ package.json | 12 +- src/components/router-outlet/index.ts | 17 ++- src/router.ts | 24 +++ types/router.d.ts | 2 + 6 files changed, 161 insertions(+), 104 deletions(-) diff --git a/build/release.sh b/build/release.sh index cde1450..a86912e 100755 --- a/build/release.sh +++ b/build/release.sh @@ -13,8 +13,8 @@ then VERSION=$VERSION npm run prod # commit + npm version $VERSION --no-git-tag-version git add -A - npm version $VERSION prerelease --preid=alpha --no-git-tag-version git commit -m "[build] $VERSION" git tag v$VERSION diff --git a/package-lock.json b/package-lock.json index ebff60e..830edf1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.3", + "version": "3.0.0-alpha.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -394,9 +394,9 @@ } }, "@jest/core": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.3.tgz", - "integrity": "sha512-/wY1JCmY61wMjGsix0ccNmiHsl7+l1nGMvdXnWbceezWyf8gFoqA7kRN6e2CTcF2K1GVYhsUdLdyKpz7hVMegQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", + "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", "dev": true, "requires": { "@jest/console": "^25.5.0", @@ -409,14 +409,14 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^25.5.0", - "jest-config": "^25.5.3", + "jest-config": "^25.5.4", "jest-haste-map": "^25.5.1", "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6", "jest-resolve": "^25.5.1", - "jest-resolve-dependencies": "^25.5.2", - "jest-runner": "^25.5.3", - "jest-runtime": "^25.5.3", + "jest-resolve-dependencies": "^25.5.4", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4", "jest-snapshot": "^25.5.1", "jest-util": "^25.5.0", "jest-validate": "^25.5.0", @@ -560,16 +560,16 @@ } }, "@jest/test-sequencer": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.3.tgz", - "integrity": "sha512-/xvmwp+7eTsgmbyFp649WCpyf6x+c7CMERYOnZtIYIqpOW2p0vDbY1TNyr1wum4c/xSe+KR8iBIzsZKa6csmeg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", "dev": true, "requires": { "@jest/test-result": "^25.5.0", "graceful-fs": "^4.2.4", "jest-haste-map": "^25.5.1", - "jest-runner": "^25.5.3", - "jest-runtime": "^25.5.3" + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" }, "dependencies": { "graceful-fs": { @@ -779,62 +779,62 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.5.tgz", - "integrity": "sha512-8j61FHZ+CoFy4Fdzdxz3g7sTLG/YbqvqPFC8o+IKSCAbtznQ9GHvakT7bQf/umBhSxAEKYXZQpWuLvoEY527bQ==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.10.tgz", + "integrity": "sha512-GX5D9a0mjTUzZkd1PTDbETQlP0zcDb4k8wnMsYr1ZW/HXHn+PeS131FWSXz7kV4hVFiwOgxLfN+GEXseZXrxrA==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.5", + "@vue/shared": "3.0.0-beta.10", "estree-walker": "^0.8.1", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.5.tgz", - "integrity": "sha512-IUR+ITbYB8n+mCx5HXNb3EsvG7hlx7mqyliwlzBuhJR3QNcy3qeanspN6pcTwHqBJ/CTE+q98ttJs+RaEgepmQ==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.10.tgz", + "integrity": "sha512-S1Qqc74Hc3BnHjORzWJvG4Fj5B4O8aqTF1Oyd+Px65CB6qkbAaqTLneYnM5by/78j8inmt4FCHOf48L+gzChRA==", "requires": { - "@vue/compiler-core": "3.0.0-beta.5", - "@vue/shared": "3.0.0-beta.5" + "@vue/compiler-core": "3.0.0-beta.10", + "@vue/shared": "3.0.0-beta.10" } }, "@vue/reactivity": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.5.tgz", - "integrity": "sha512-6tvll/4F/guShcYK7cktbboHwyNLMfp/gyIUraLYutIRBTDh+OR1J1G2vC53xR22InCjPls5/tbA3eMPHkYv1Q==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.10.tgz", + "integrity": "sha512-4f/hqdVptNMxCcZfmyxBRrOV0AT0z41CrRtJWCpLQhr+VEisKVhpfe7P7hhfp8prbPhSWa9oZuqVtb5MccgN4g==", "requires": { - "@vue/shared": "3.0.0-beta.5" + "@vue/shared": "3.0.0-beta.10" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.5.tgz", - "integrity": "sha512-AewCm2zfiY3TAKZhRO619TmebXuSohW8FdDtPgiKw7Dl/DrNt3s09L8g8JPNln4Y2VelfF7gtg/Y9nG98cFrGg==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.10.tgz", + "integrity": "sha512-oBIckKooEeohEPwrn57cuoghNyqY630xmp2exBKiFEaVK3d9N8JBNaFAzw1KZsDNzSyZbUdHzqOZIcZjindypw==", "requires": { - "@vue/reactivity": "3.0.0-beta.5", - "@vue/shared": "3.0.0-beta.5" + "@vue/reactivity": "3.0.0-beta.10", + "@vue/shared": "3.0.0-beta.10" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.5.tgz", - "integrity": "sha512-vk7W1qUR3ueQv6tv/hrroShFd4C+caoFNv8ekmzop8V3zxC2J9sAbMpc5Qmi3COGUV07z5Sgr33Ht92e2yFBNA==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.10.tgz", + "integrity": "sha512-xrPf0KN1Xe8mFzqxUMxpkzwJjVZcGFEKZLcX4Oh2EmxikD9lnR6DghyPy/LL8QOpJUge6p2mmsqvXwS6MODHDA==", "requires": { - "@vue/runtime-core": "3.0.0-beta.5", - "@vue/shared": "3.0.0-beta.5", + "@vue/runtime-core": "3.0.0-beta.10", + "@vue/shared": "3.0.0-beta.10", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.5.tgz", - "integrity": "sha512-RKMeR+yuS2HokYtkFb72YZ6EnxDiIjEXLTflLkHBp2fdEj4liHSJ3cESVtcfNOGr5sWd8w4dG2t4xloTDx24Fg==" + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.10.tgz", + "integrity": "sha512-nKPkVB1KqhGuR6lPDcPJ+mhrfVuIGXNmw8s6ecPGjhjil2DetSe1RhgfwRBM0U/QuqUD6RjsIT5WZlnV7878Gg==" }, "@vue/test-utils": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.3.tgz", - "integrity": "sha512-LS5QIPfMO1Kb3DGiN/zRsRl+rxrA7GVIHroeiXTRrEKDVUJOczh+9xj4g9183bFiuMUK73pBCfDTuxTP8N8y8Q==", + "version": "2.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.4.tgz", + "integrity": "sha512-9fAQx0MNhgqcNdcbh8xhyCywsWMd2zny4qpGCrgyOcB9s3V2xgjjtwUN72VbvaLnpdZk3mBwFOchNNe0oociNw==", "dev": true, "requires": { "dom-event-types": "^1.0.0", @@ -848,9 +848,9 @@ "dev": true }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, "acorn-dynamic-import": { @@ -3171,6 +3171,13 @@ } } }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true, + "optional": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -3223,11 +3230,14 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "optional": true + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -3332,14 +3342,14 @@ } }, "jest": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.3.tgz", - "integrity": "sha512-YImNJIOcQ5pguFpzZ14FQ+v2rannjrFP3R+SU/Wi2TyLQE5hZXcAbg9+WVl+lnEZHAZ99Jyh+tjhW59iMiI0pg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz", + "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==", "dev": true, "requires": { - "@jest/core": "^25.5.3", + "@jest/core": "^25.5.4", "import-local": "^3.0.2", - "jest-cli": "^25.5.3" + "jest-cli": "^25.5.4" }, "dependencies": { "graceful-fs": { @@ -3349,12 +3359,12 @@ "dev": true }, "jest-cli": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.3.tgz", - "integrity": "sha512-epjgZ0WeBECVXOQ11pn7Pc3n8SeGAqdWb+X2eSLoyCGieFEBAatB7bVI+UmyH/vsiOxpIb0qwby0QrrGMZMfcQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", + "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", "dev": true, "requires": { - "@jest/core": "^25.5.3", + "@jest/core": "^25.5.4", "@jest/test-result": "^25.5.0", "@jest/types": "^25.5.0", "chalk": "^3.0.0", @@ -3362,7 +3372,7 @@ "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.5.3", + "jest-config": "^25.5.4", "jest-util": "^25.5.0", "jest-validate": "^25.5.0", "prompts": "^2.0.1", @@ -3466,13 +3476,13 @@ } }, "jest-config": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.3.tgz", - "integrity": "sha512-PrzL7wCP9XMEmUd+0ArcR37SVL7oF1lnIPxzppfeYvPytOtgTdXa2M/0TKcPYPHaa/T3UvHEpSNiC25yXktfsQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.5.3", + "@jest/test-sequencer": "^25.5.4", "@jest/types": "^25.5.0", "babel-jest": "^25.5.1", "chalk": "^3.0.0", @@ -3482,7 +3492,7 @@ "jest-environment-jsdom": "^25.5.0", "jest-environment-node": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.5.2", + "jest-jasmine2": "^25.5.4", "jest-regex-util": "^25.2.6", "jest-resolve": "^25.5.1", "jest-util": "^25.5.0", @@ -3606,9 +3616,9 @@ } }, "jest-jasmine2": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.2.tgz", - "integrity": "sha512-wRtHAy97F4hafJgnh5CwI/N1tDo7z+urteQAyr3rjK7X3TZWX5hSV4cO7WIBKLDV0kPICCmsGiNYs1caeHD/sQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", @@ -3623,7 +3633,7 @@ "jest-each": "^25.5.0", "jest-matcher-utils": "^25.5.0", "jest-message-util": "^25.5.0", - "jest-runtime": "^25.5.2", + "jest-runtime": "^25.5.4", "jest-snapshot": "^25.5.1", "jest-util": "^25.5.0", "pretty-format": "^25.5.0", @@ -3723,9 +3733,9 @@ } }, "jest-resolve-dependencies": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.2.tgz", - "integrity": "sha512-4xlPp6/SFFZj7g7WkhoKEEWsYqmAK6WcmFFRfDJ0K4T2f/MCJgFEPqv1F88ro6ZJdpOti08CxGku4gBwau/RjQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", "dev": true, "requires": { "@jest/types": "^25.5.0", @@ -3734,9 +3744,9 @@ } }, "jest-runner": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.3.tgz", - "integrity": "sha512-g4DyOG9hXdFhYL57bzVKWT6AuakcwDgvkB1RIie17mzF1EK4FFLSq9D/5hglgWtlhh6IH3CRDePIFetMHzLmCw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", "dev": true, "requires": { "@jest/console": "^25.5.0", @@ -3746,14 +3756,14 @@ "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^25.5.3", + "jest-config": "^25.5.4", "jest-docblock": "^25.3.0", "jest-haste-map": "^25.5.1", - "jest-jasmine2": "^25.5.2", + "jest-jasmine2": "^25.5.4", "jest-leak-detector": "^25.5.0", "jest-message-util": "^25.5.0", "jest-resolve": "^25.5.1", - "jest-runtime": "^25.5.3", + "jest-runtime": "^25.5.4", "jest-util": "^25.5.0", "jest-worker": "^25.5.0", "source-map-support": "^0.5.6", @@ -3769,9 +3779,9 @@ } }, "jest-runtime": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.3.tgz", - "integrity": "sha512-q6ajy2rtRDjIzSJm7J0g1kYG4MLlgfBeMNdaEKOa7z/JHLxEBz0ija67C9UioO1L0oWxiulH3Zt7iFhE8r3ITg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", "dev": true, "requires": { "@jest/console": "^25.5.0", @@ -3787,7 +3797,7 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^25.5.3", + "jest-config": "^25.5.4", "jest-haste-map": "^25.5.1", "jest-message-util": "^25.5.0", "jest-mock": "^25.5.0", @@ -5026,6 +5036,12 @@ "requires": { "path-parse": "^1.0.6" } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true } } }, @@ -5798,9 +5814,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" }, "tslint": { "version": "6.1.2", @@ -6056,9 +6072,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", - "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -6096,13 +6112,13 @@ } }, "vue": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.5.tgz", - "integrity": "sha512-Puri+Cea5hy1pjtnTN2crnwU2jI5lBBtcLHqQkHABjFi5RTQ3T2FMF2HtWfXi4UqjLK1/f+r1P05y4y+Da2sMg==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.10.tgz", + "integrity": "sha512-qA7uwX9mFtPd7yUF0lZq3B5yd9AZBmyCk/CCakhyCBqfWE4KsqaIYwb2Uwn6VXn0/aNzKZ8akP0OYCKygq1fkg==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.5", - "@vue/runtime-dom": "3.0.0-beta.5", - "@vue/shared": "3.0.0-beta.5" + "@vue/compiler-dom": "3.0.0-beta.10", + "@vue/runtime-dom": "3.0.0-beta.10", + "@vue/shared": "3.0.0-beta.10" } }, "vue-class-component": { @@ -6121,9 +6137,9 @@ } }, "vue-router": { - "version": "4.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.9.tgz", - "integrity": "sha512-OUbbjRmAGf6aA8VoSF+jrZgg0Ozk+Quqtsec/uSdEX43R6v7MEmKgR+M66doAZkRUfbm7lotxnObwV55/CjNRQ==" + "version": "4.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.10.tgz", + "integrity": "sha512-dA2ywr/rk2yc6JG3nn1eu9wlhR3AAO1dAs75uqY2N8HxvJviSxO0YAm0aHvLkFYTNa9JGV+ao0gr5oJzVbGTaQ==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index 1982914..a530bfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.3", + "version": "3.0.0-alpha.4", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", @@ -56,25 +56,25 @@ "clean": "node ./scripts/clean.js" }, "devDependencies": { - "@vue/test-utils": "^2.0.0-alpha.3", + "@vue/test-utils": "^2.0.0-alpha.4", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", - "jest": "^25.5.3", + "jest": "^25.5.4", "jest-sonar-reporter": "^2.0.0", "jest-vue-preprocessor": "^1.4.0", "rollup": "^0.62.0", "rollup-plugin-buble": "^0.19.2", "rollup-plugin-terser": "^1.0.1", "rollup-plugin-typescript2": "^0.27.0", - "tslib": "^1.11.1", + "tslib": "^1.11.2", "tslint": "^6.1.2", "tslint-ionic-rules": "^0.0.21", "typescript": "^3.8.3" }, "dependencies": { "@ionic/core": "^5.1.0", - "vue": "^3.0.0-beta.5", - "vue-router": "^4.0.0-alpha.9" + "vue": "^3.0.0-beta.10", + "vue-router": "^4.0.0-alpha.10" }, "jestSonar": { "reportPath": "reports", diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 00fcf5b..2041fbd 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -49,14 +49,29 @@ export const IonRouterView: FunctionalComponent = props => { }; const transitionHooks: BaseTransitionProps = { - onBeforeEnter(el) { + async onEnter(el, done) { inTransition = true; enteringEl.value = el; + + if (router.direction.value === 'back') { + await router.restoreScroll( + el, + progressAnimation + ? (router.history.state.back as any).fullPath + : router.currentRoute.value.fullPath + ); + } + + done(); }, async onLeave(el, done: any) { await transition(el); + if (!persisted) { + await router.saveScroll(el); + } + setTimeout(done, persisted ? 100 : 0); inTransition = false; diff --git a/src/router.ts b/src/router.ts index efa9515..d141076 100644 --- a/src/router.ts +++ b/src/router.ts @@ -15,6 +15,8 @@ declare module 'vue-router' { interface Router { direction: Ref; showBackButton: Ref; + saveScroll: (el: HTMLElement) => Promise; + restoreScroll: (el: HTMLElement, key: string) => Promise; } } @@ -22,6 +24,7 @@ export const createRouter = (opts: RouterOptions): Router => { const direction = ref(Direction.forward); const directionOverride = ref(); const showBackButton = ref(false); + const scroll = new Map(); const router = { ...createVueRouter(opts), @@ -50,6 +53,27 @@ export const createRouter = (opts: RouterOptions): Router => { showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; }); + router.saveScroll = async el => { + const ionContent = el.querySelector('ion-content'); + const scrollElement = ionContent && (await ionContent.getScrollElement()); + + scroll.set((router.history.state.back as any).fullPath, { + top: scrollElement?.scrollTop || 0, + left: scrollElement?.scrollLeft || 0, + }); + }; + + router.restoreScroll = async (el, key) => { + const ionContent = el.querySelector('ion-content'); + const scrollElement = ionContent && (await ionContent.getScrollElement()); + scrollElement?.scrollTo( + scroll.get(key) || { + top: 0, + left: 0, + } + ); + }; + if (document) { document.addEventListener('ionBackButton', (e: Event) => { (e as BackButtonEvent).detail.register(0, (next: () => void) => { diff --git a/types/router.d.ts b/types/router.d.ts index 816f816..7ca4134 100644 --- a/types/router.d.ts +++ b/types/router.d.ts @@ -5,6 +5,8 @@ declare module 'vue-router' { interface Router { direction: Ref; showBackButton: Ref; + saveScroll: (el: HTMLElement) => Promise; + restoreScroll: (el: HTMLElement, key: string) => Promise; } } export declare const createRouter: (opts: RouterOptions) => Router; From 1e36bff89a49117c999be58d30c4a80702eed848 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 9 May 2020 15:33:51 +0300 Subject: [PATCH 14/96] Update changelog, fix release script --- CHANGELOG.md | 7 ++++++- build/release.sh | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c5f50a..e88d4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,15 @@ ### KNOWN ISSUES * Some Ionic events and attributes do not work due to their camelCase naming (upstream Vue 3 issue) * Routing related attributes on Ionic components are not yet supported -* Scroll position is not restored when navigating back # Unreleased +# [3.0.0-alpha.4](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.3...v3.0.0-alpha.4) + +### Features +* Restore scroll on navigation +* Update to vue@3.0.0-beta.10 +* Update to vue-router@4.0.0-alpha.10 # [3.0.0-alpha.3](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.2...v3.0.0-alpha.3) diff --git a/build/release.sh b/build/release.sh index a86912e..9510927 100755 --- a/build/release.sh +++ b/build/release.sh @@ -20,5 +20,5 @@ then # publish git push --tags - npm publish + npm publish --tag next fi From 4ba3ee2fd1f2cacf16b3c33a0a37341f302b2bc6 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sun, 10 May 2020 19:48:23 +0300 Subject: [PATCH 15/96] [build] 3.0.0-alpha.5 --- build/release.sh | 1 + package-lock.json | 2 +- package.json | 2 +- src/router.ts | 10 ++++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build/release.sh b/build/release.sh index 9510927..a012a16 100755 --- a/build/release.sh +++ b/build/release.sh @@ -19,6 +19,7 @@ then git tag v$VERSION # publish + git push git push --tags npm publish --tag next fi diff --git a/package-lock.json b/package-lock.json index 830edf1..7efa3d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a530bfa..3aae3e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", diff --git a/src/router.ts b/src/router.ts index d141076..724fa1f 100644 --- a/src/router.ts +++ b/src/router.ts @@ -57,10 +57,12 @@ export const createRouter = (opts: RouterOptions): Router => { const ionContent = el.querySelector('ion-content'); const scrollElement = ionContent && (await ionContent.getScrollElement()); - scroll.set((router.history.state.back as any).fullPath, { - top: scrollElement?.scrollTop || 0, - left: scrollElement?.scrollLeft || 0, - }); + if (scrollElement) { + scroll.set((router.history.state.back as any).fullPath, { + top: scrollElement?.scrollTop || 0, + left: scrollElement?.scrollLeft || 0, + }); + } }; router.restoreScroll = async (el, key) => { From 41ac3a13bb4200f2f92a1504d4a944a0519f1b6f Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 9 Jun 2020 01:02:05 +0300 Subject: [PATCH 16/96] Tabs WIP sans routing --- src/components/index.ts | 1 + src/components/tabs/index.ts | 7 +++++ src/components/tabs/tab-bar.ts | 33 ++++++++++++++++++++++++ src/components/tabs/tabs.ts | 41 ++++++++++++++++++++++++++++++ types/components/index.d.ts | 1 + types/components/tab-bar.d.ts | 3 +++ types/components/tabs.d.ts | 3 +++ types/components/tabs/index.d.ts | 9 +++++++ types/components/tabs/tab-bar.d.ts | 4 +++ types/components/tabs/tabs.d.ts | 4 +++ 10 files changed, 106 insertions(+) create mode 100644 src/components/tabs/index.ts create mode 100644 src/components/tabs/tab-bar.ts create mode 100644 src/components/tabs/tabs.ts create mode 100644 types/components/tab-bar.d.ts create mode 100644 types/components/tabs.d.ts create mode 100644 types/components/tabs/index.d.ts create mode 100644 types/components/tabs/tab-bar.d.ts create mode 100644 types/components/tabs/tabs.d.ts diff --git a/src/components/index.ts b/src/components/index.ts index 4599c3e..3e6d214 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -3,3 +3,4 @@ export * from './inputs'; export * from './containers'; export * from './router-outlet'; export * from './back-button'; +export * from './tabs'; diff --git a/src/components/tabs/index.ts b/src/components/tabs/index.ts new file mode 100644 index 0000000..a187184 --- /dev/null +++ b/src/components/tabs/index.ts @@ -0,0 +1,7 @@ +import { defineContainer } from '../../utils'; + +export * from './tabs'; +export * from './tab-bar'; + +export const IonTab = defineContainer('ion-tab'); +export const IonTabButton = defineContainer('ion-tab-button'); diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts new file mode 100644 index 0000000..162f7ab --- /dev/null +++ b/src/components/tabs/tab-bar.ts @@ -0,0 +1,33 @@ +import { Component, FunctionalComponent, VNode, h, ref } from 'vue'; +import { ShapeFlags } from '@vue/shared'; +import { tabs } from './tabs'; +import { JSX } from '@ionic/core'; + +const setActiveTab = (value?: string) => { + tabs.value.map(tab => { + tab.el!.active = tab.props?.tab === value; + }); +} + +export const IonTabBar: FunctionalComponent = (props, { slots }) => { + const tabBarRef = ref(); + + const children = slots.default && slots.default().map((child: VNode) => { + if (child.shapeFlag & ShapeFlags.COMPONENT && (child.type as Component).displayName === 'ion-tab-button') { + return { ...child, props: { ...child.props, onClick: () => { + tabBarRef.value && (tabBarRef.value.selectedTab = child.props?.tab); + setActiveTab(tabBarRef.value?.selectedTab); + } } }; + } + return child; + }); + + if (props.selectedTab) { + setActiveTab(props.selectedTab); + } + + return h('ion-tab-bar', { ...props, ref: tabBarRef }, children); +} + +IonTabBar.displayName = 'ion-tab-bar'; +IonTabBar.props = [ 'selectedTab' ]; diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts new file mode 100644 index 0000000..6f11824 --- /dev/null +++ b/src/components/tabs/tabs.ts @@ -0,0 +1,41 @@ +import { Component, FunctionalComponent, VNode, h, ref } from 'vue'; +import { ShapeFlags } from '@vue/shared'; + +// CSS for ion-tabs inner and outer elements +const hostStyles = { + display: 'flex', + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + flexDirection: 'column', + width: '100%', + height: '100%', + contain: 'layout size style', +}; + +const innerStyles = { + position: 'relative', + flex: 1, + contain: 'layout size style', +}; + +export const tabs = ref([]); + +export const IonTabs: FunctionalComponent = (props, { slots }) => { + const children = slots.default && slots.default().map((child: VNode) => { + if (child.shapeFlag & ShapeFlags.COMPONENT && (child.type as Component).displayName === 'ion-tab') { + tabs.value.push(child); + } + return child; + }); + + return h('div', { ...props, style: hostStyles }, [ + slots.top && slots.top(), + h('div', { class: 'tabs-inner', style: innerStyles }, children), + slots.bottom && slots.bottom(), + ]); +} + +IonTabs.displayName = 'ion-tabs'; diff --git a/types/components/index.d.ts b/types/components/index.d.ts index e536552..972e0c9 100644 --- a/types/components/index.d.ts +++ b/types/components/index.d.ts @@ -3,4 +3,5 @@ export * from './inputs'; export * from './containers'; export * from './router-outlet'; export * from './back-button'; +export * from './tabs'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/tab-bar.d.ts b/types/components/tab-bar.d.ts new file mode 100644 index 0000000..e03c6e8 --- /dev/null +++ b/types/components/tab-bar.d.ts @@ -0,0 +1,3 @@ +import { FunctionalComponent } from 'vue'; +export declare const IonTabBar: FunctionalComponent; +//# sourceMappingURL=tab-bar.d.ts.map \ No newline at end of file diff --git a/types/components/tabs.d.ts b/types/components/tabs.d.ts new file mode 100644 index 0000000..b72e6e4 --- /dev/null +++ b/types/components/tabs.d.ts @@ -0,0 +1,3 @@ +import { FunctionalComponent } from 'vue'; +export declare const IonTabs: FunctionalComponent; +//# sourceMappingURL=tabs.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/index.d.ts b/types/components/tabs/index.d.ts new file mode 100644 index 0000000..856f6b6 --- /dev/null +++ b/types/components/tabs/index.d.ts @@ -0,0 +1,9 @@ +export * from './tabs'; +export * from './tab-bar'; +export declare const IonTab: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +export declare const IonTabButton: import("vue").FunctionalComponent<{ + [key: string]: unknown; +}, Record>; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tab-bar.d.ts b/types/components/tabs/tab-bar.d.ts new file mode 100644 index 0000000..e3493c3 --- /dev/null +++ b/types/components/tabs/tab-bar.d.ts @@ -0,0 +1,4 @@ +import { FunctionalComponent } from 'vue'; +import { JSX } from '@ionic/core'; +export declare const IonTabBar: FunctionalComponent; +//# sourceMappingURL=tab-bar.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tabs.d.ts b/types/components/tabs/tabs.d.ts new file mode 100644 index 0000000..79a94de --- /dev/null +++ b/types/components/tabs/tabs.d.ts @@ -0,0 +1,4 @@ +import { FunctionalComponent, VNode } from 'vue'; +export declare const tabs: import("vue").Ref[]>; +export declare const IonTabs: FunctionalComponent; +//# sourceMappingURL=tabs.d.ts.map \ No newline at end of file From 9d70af6c9b62b4d84eca5fc626d7ff2968b5e3c2 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 9 Jun 2020 11:48:19 +0300 Subject: [PATCH 17/96] Improve tab ref handling --- src/components/tabs/index.ts | 4 ++-- src/components/tabs/tab-bar.ts | 15 +++++++++++---- src/components/tabs/tab.ts | 14 ++++++++++++++ src/components/tabs/tabs.ts | 14 +++----------- types/components/tabs/index.d.ts | 6 ++---- types/components/tabs/tab.d.ts | 4 ++++ types/components/tabs/tabs.d.ts | 2 +- 7 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 src/components/tabs/tab.ts create mode 100644 types/components/tabs/tab.d.ts diff --git a/src/components/tabs/index.ts b/src/components/tabs/index.ts index a187184..eee7300 100644 --- a/src/components/tabs/index.ts +++ b/src/components/tabs/index.ts @@ -1,7 +1,7 @@ import { defineContainer } from '../../utils'; -export * from './tabs'; +export { IonTabs } from './tabs'; export * from './tab-bar'; +export * from './tab'; -export const IonTab = defineContainer('ion-tab'); export const IonTabButton = defineContainer('ion-tab-button'); diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 162f7ab..899adcd 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -1,14 +1,21 @@ import { Component, FunctionalComponent, VNode, h, ref } from 'vue'; import { ShapeFlags } from '@vue/shared'; -import { tabs } from './tabs'; +import { tabNodes } from './tabs'; import { JSX } from '@ionic/core'; const setActiveTab = (value?: string) => { - tabs.value.map(tab => { - tab.el!.active = tab.props?.tab === value; + tabNodes.value.forEach((node, tab) => { + node.el!.active = tab === value; }); } +const componentProps: (keyof JSX.IonTabBar)[] = [ + 'color', + 'mode', + 'selectedTab', + 'translucent', +]; + export const IonTabBar: FunctionalComponent = (props, { slots }) => { const tabBarRef = ref(); @@ -30,4 +37,4 @@ export const IonTabBar: FunctionalComponent = (props, { slots }) } IonTabBar.displayName = 'ion-tab-bar'; -IonTabBar.props = [ 'selectedTab' ]; +IonTabBar.props = componentProps; diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts new file mode 100644 index 0000000..f55ec6a --- /dev/null +++ b/src/components/tabs/tab.ts @@ -0,0 +1,14 @@ +import { FunctionalComponent, h } from 'vue'; +import { JSX } from '@ionic/core'; +import { tabNodes } from './tabs'; + +const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; + +export const IonTab: FunctionalComponent = (props, { slots }) => { + const vnode = h('ion-tab', props, slots.default && slots.default()); + tabNodes.value.set(props.tab, vnode); + return vnode; +} + +IonTab.displayName = 'ion-tab'; +IonTab.props = componentProps; diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts index 6f11824..22aba9a 100644 --- a/src/components/tabs/tabs.ts +++ b/src/components/tabs/tabs.ts @@ -1,5 +1,4 @@ -import { Component, FunctionalComponent, VNode, h, ref } from 'vue'; -import { ShapeFlags } from '@vue/shared'; +import { FunctionalComponent, VNode, h, ref } from 'vue'; // CSS for ion-tabs inner and outer elements const hostStyles = { @@ -21,19 +20,12 @@ const innerStyles = { contain: 'layout size style', }; -export const tabs = ref([]); +export const tabNodes = ref>(new Map()); export const IonTabs: FunctionalComponent = (props, { slots }) => { - const children = slots.default && slots.default().map((child: VNode) => { - if (child.shapeFlag & ShapeFlags.COMPONENT && (child.type as Component).displayName === 'ion-tab') { - tabs.value.push(child); - } - return child; - }); - return h('div', { ...props, style: hostStyles }, [ slots.top && slots.top(), - h('div', { class: 'tabs-inner', style: innerStyles }, children), + h('div', { class: 'tabs-inner', style: innerStyles }, slots.default && slots.default()), slots.bottom && slots.bottom(), ]); } diff --git a/types/components/tabs/index.d.ts b/types/components/tabs/index.d.ts index 856f6b6..11caf54 100644 --- a/types/components/tabs/index.d.ts +++ b/types/components/tabs/index.d.ts @@ -1,8 +1,6 @@ -export * from './tabs'; +export { IonTabs } from './tabs'; export * from './tab-bar'; -export declare const IonTab: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; +export * from './tab'; export declare const IonTabButton: import("vue").FunctionalComponent<{ [key: string]: unknown; }, Record>; diff --git a/types/components/tabs/tab.d.ts b/types/components/tabs/tab.d.ts new file mode 100644 index 0000000..dd2d037 --- /dev/null +++ b/types/components/tabs/tab.d.ts @@ -0,0 +1,4 @@ +import { FunctionalComponent } from 'vue'; +import { JSX } from '@ionic/core'; +export declare const IonTab: FunctionalComponent; +//# sourceMappingURL=tab.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tabs.d.ts b/types/components/tabs/tabs.d.ts index 79a94de..eec98b2 100644 --- a/types/components/tabs/tabs.d.ts +++ b/types/components/tabs/tabs.d.ts @@ -1,4 +1,4 @@ import { FunctionalComponent, VNode } from 'vue'; -export declare const tabs: import("vue").Ref[]>; +export declare const tabNodes: import("vue").Ref>>; export declare const IonTabs: FunctionalComponent; //# sourceMappingURL=tabs.d.ts.map \ No newline at end of file From 6902ff7fc31d14d28faaf3837aa79c0d792c8e68 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 9 Jun 2020 14:03:10 +0300 Subject: [PATCH 18/96] Fixes #124 --- src/components/icon/index.ts | 25 +++++++++++++++++++++++++ src/components/index.ts | 1 + types/components/icon/index.d.ts | 17 +++++++++++++++++ types/components/index.d.ts | 1 + types/components/tab-bar.d.ts | 3 --- types/components/tabs.d.ts | 3 --- 6 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 src/components/icon/index.ts create mode 100644 types/components/icon/index.d.ts delete mode 100644 types/components/tab-bar.d.ts delete mode 100644 types/components/tabs.d.ts diff --git a/src/components/icon/index.ts b/src/components/icon/index.ts new file mode 100644 index 0000000..381fa3d --- /dev/null +++ b/src/components/icon/index.ts @@ -0,0 +1,25 @@ +import { FunctionalComponent, h } from 'vue'; +import { isPlatform } from '@ionic/core'; + +interface Props { + ariaLabel?: string; + color?: string; + flipRtl?: boolean; + icon?: string; + ios?: string; + lazy?: boolean; + md?: string; + mode?: 'ios' | 'md'; + name?: string; + size?: string; + src?: string; +} + +export const IonIcon: FunctionalComponent = (props) => { + const { md, ios } = props; + const icon = (isPlatform(window, 'ios') ? ios ?? md : md ?? ios) ?? props.icon; + return h('ion-icon', { ...props, icon }); +} + +IonIcon.displayName = 'ion-icon'; +IonIcon.props = ['ariaLabel', 'color', 'flipRtl', 'icon', 'ios', 'lazy', 'md', 'mode', 'name', 'size', 'src']; diff --git a/src/components/index.ts b/src/components/index.ts index 3e6d214..8eb914d 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -4,3 +4,4 @@ export * from './containers'; export * from './router-outlet'; export * from './back-button'; export * from './tabs'; +export * from './icon'; diff --git a/types/components/icon/index.d.ts b/types/components/icon/index.d.ts new file mode 100644 index 0000000..ca4e609 --- /dev/null +++ b/types/components/icon/index.d.ts @@ -0,0 +1,17 @@ +import { FunctionalComponent } from 'vue'; +interface Props { + ariaLabel?: string; + color?: string; + flipRtl?: boolean; + icon?: string; + ios?: string; + lazy?: boolean; + md?: string; + mode?: 'ios' | 'md'; + name?: string; + size?: string; + src?: string; +} +export declare const IonIcon: FunctionalComponent; +export {}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/index.d.ts b/types/components/index.d.ts index 972e0c9..f6c86c5 100644 --- a/types/components/index.d.ts +++ b/types/components/index.d.ts @@ -4,4 +4,5 @@ export * from './containers'; export * from './router-outlet'; export * from './back-button'; export * from './tabs'; +export * from './icon'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/tab-bar.d.ts b/types/components/tab-bar.d.ts deleted file mode 100644 index e03c6e8..0000000 --- a/types/components/tab-bar.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { FunctionalComponent } from 'vue'; -export declare const IonTabBar: FunctionalComponent; -//# sourceMappingURL=tab-bar.d.ts.map \ No newline at end of file diff --git a/types/components/tabs.d.ts b/types/components/tabs.d.ts deleted file mode 100644 index b72e6e4..0000000 --- a/types/components/tabs.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { FunctionalComponent } from 'vue'; -export declare const IonTabs: FunctionalComponent; -//# sourceMappingURL=tabs.d.ts.map \ No newline at end of file From f99511594cd96af888443778815ec522d0a27edd Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 9 Jun 2020 14:53:09 +0300 Subject: [PATCH 19/96] Improve tab button --- src/components/tabs/index.ts | 7 ++---- src/components/tabs/tab-bar.ts | 36 +++++++++------------------ src/components/tabs/tab-button.ts | 25 +++++++++++++++++++ src/components/tabs/tab.ts | 5 ++-- types/components/tabs/index.d.ts | 6 ++--- types/components/tabs/tab-bar.d.ts | 2 ++ types/components/tabs/tab-button.d.ts | 4 +++ 7 files changed, 50 insertions(+), 35 deletions(-) create mode 100644 src/components/tabs/tab-button.ts create mode 100644 types/components/tabs/tab-button.d.ts diff --git a/src/components/tabs/index.ts b/src/components/tabs/index.ts index eee7300..7f2dd80 100644 --- a/src/components/tabs/index.ts +++ b/src/components/tabs/index.ts @@ -1,7 +1,4 @@ -import { defineContainer } from '../../utils'; - export { IonTabs } from './tabs'; -export * from './tab-bar'; +export { IonTabBar } from './tab-bar'; export * from './tab'; - -export const IonTabButton = defineContainer('ion-tab-button'); +export * from './tab-button'; diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 899adcd..16a84a3 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -1,14 +1,8 @@ -import { Component, FunctionalComponent, VNode, h, ref } from 'vue'; -import { ShapeFlags } from '@vue/shared'; +import { FunctionalComponent, h, ref } from 'vue'; import { tabNodes } from './tabs'; import { JSX } from '@ionic/core'; -const setActiveTab = (value?: string) => { - tabNodes.value.forEach((node, tab) => { - node.el!.active = tab === value; - }); -} - +const name = 'ion-tab-bar'; const componentProps: (keyof JSX.IonTabBar)[] = [ 'color', 'mode', @@ -16,25 +10,19 @@ const componentProps: (keyof JSX.IonTabBar)[] = [ 'translucent', ]; -export const IonTabBar: FunctionalComponent = (props, { slots }) => { - const tabBarRef = ref(); +export const tabBarRef = ref(); - const children = slots.default && slots.default().map((child: VNode) => { - if (child.shapeFlag & ShapeFlags.COMPONENT && (child.type as Component).displayName === 'ion-tab-button') { - return { ...child, props: { ...child.props, onClick: () => { - tabBarRef.value && (tabBarRef.value.selectedTab = child.props?.tab); - setActiveTab(tabBarRef.value?.selectedTab); - } } }; - } - return child; +export const setActiveTab = (value?: string) => { + tabNodes.value.forEach((node, tab) => { + node.el!.active = tab === value; }); +} - if (props.selectedTab) { - setActiveTab(props.selectedTab); - } - - return h('ion-tab-bar', { ...props, ref: tabBarRef }, children); +export const IonTabBar: FunctionalComponent = (props, { slots }) => { + const selectedTab = props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]); + setActiveTab(selectedTab); + return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); } -IonTabBar.displayName = 'ion-tab-bar'; +IonTabBar.displayName = name; IonTabBar.props = componentProps; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts new file mode 100644 index 0000000..4d1c1a9 --- /dev/null +++ b/src/components/tabs/tab-button.ts @@ -0,0 +1,25 @@ +import { FunctionalComponent, h } from 'vue'; +import { JSX } from '@ionic/core'; +import { setActiveTab, tabBarRef } from './tab-bar'; + +const name = 'ion-tab-button'; +const componentProps: (keyof JSX.IonTabButton)[] = [ + 'disabled', + 'download', + 'href', + 'layout', + 'mode', + 'rel', + 'selected', + 'tab', + 'target', +]; + +export const IonTabButton: FunctionalComponent = (props, { slots }) => + h(name, { ...props, onClick() { + tabBarRef.value && (tabBarRef.value.selectedTab = props?.tab); + setActiveTab(tabBarRef.value?.selectedTab); + } }, slots.default && slots.default()); + +IonTabButton.displayName = name; +IonTabButton.props = componentProps; diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index f55ec6a..b44c065 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -2,13 +2,14 @@ import { FunctionalComponent, h } from 'vue'; import { JSX } from '@ionic/core'; import { tabNodes } from './tabs'; +const name = 'ion-tab'; const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; export const IonTab: FunctionalComponent = (props, { slots }) => { - const vnode = h('ion-tab', props, slots.default && slots.default()); + const vnode = h(name, props, slots.default && slots.default()); tabNodes.value.set(props.tab, vnode); return vnode; } -IonTab.displayName = 'ion-tab'; +IonTab.displayName = name; IonTab.props = componentProps; diff --git a/types/components/tabs/index.d.ts b/types/components/tabs/index.d.ts index 11caf54..0df0642 100644 --- a/types/components/tabs/index.d.ts +++ b/types/components/tabs/index.d.ts @@ -1,7 +1,5 @@ export { IonTabs } from './tabs'; -export * from './tab-bar'; +export { IonTabBar } from './tab-bar'; export * from './tab'; -export declare const IonTabButton: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; +export * from './tab-button'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tab-bar.d.ts b/types/components/tabs/tab-bar.d.ts index e3493c3..a484b71 100644 --- a/types/components/tabs/tab-bar.d.ts +++ b/types/components/tabs/tab-bar.d.ts @@ -1,4 +1,6 @@ import { FunctionalComponent } from 'vue'; import { JSX } from '@ionic/core'; +export declare const tabBarRef: import("vue").Ref; +export declare const setActiveTab: (value?: string | undefined) => void; export declare const IonTabBar: FunctionalComponent; //# sourceMappingURL=tab-bar.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tab-button.d.ts b/types/components/tabs/tab-button.d.ts new file mode 100644 index 0000000..6aa1a66 --- /dev/null +++ b/types/components/tabs/tab-button.d.ts @@ -0,0 +1,4 @@ +import { FunctionalComponent } from 'vue'; +import { JSX } from '@ionic/core'; +export declare const IonTabButton: FunctionalComponent; +//# sourceMappingURL=tab-button.d.ts.map \ No newline at end of file From f142c48270320061086ac85b2527026dacc40e31 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 9 Jun 2020 16:54:06 +0300 Subject: [PATCH 20/96] Update dependencies, remove types from git --- .gitignore | 2 +- CHANGELOG.md | 6 ++ package-lock.json | 88 ++++++++++------------- package.json | 6 +- types/components/back-button/index.d.ts | 4 -- types/components/containers.d.ts | 28 -------- types/components/icon/index.d.ts | 17 ----- types/components/index.d.ts | 8 --- types/components/inputs.d.ts | 10 --- types/components/overlays.d.ts | 5 -- types/components/router-outlet/index.d.ts | 10 --- types/components/tabs/index.d.ts | 5 -- types/components/tabs/tab-bar.d.ts | 6 -- types/components/tabs/tab-button.d.ts | 4 -- types/components/tabs/tab.d.ts | 4 -- types/components/tabs/tabs.d.ts | 4 -- types/index.d.ts | 4 -- types/ionic-vue.d.ts | 3 - types/router.d.ts | 13 ---- types/utils/defineContainer.d.ts | 7 -- types/utils/defineInput.d.ts | 10 --- types/utils/defineOverlay.d.ts | 27 ------- types/utils/index.d.ts | 4 -- 23 files changed, 49 insertions(+), 226 deletions(-) delete mode 100644 types/components/back-button/index.d.ts delete mode 100644 types/components/containers.d.ts delete mode 100644 types/components/icon/index.d.ts delete mode 100644 types/components/index.d.ts delete mode 100644 types/components/inputs.d.ts delete mode 100644 types/components/overlays.d.ts delete mode 100644 types/components/router-outlet/index.d.ts delete mode 100644 types/components/tabs/index.d.ts delete mode 100644 types/components/tabs/tab-bar.d.ts delete mode 100644 types/components/tabs/tab-button.d.ts delete mode 100644 types/components/tabs/tab.d.ts delete mode 100644 types/components/tabs/tabs.d.ts delete mode 100644 types/index.d.ts delete mode 100644 types/ionic-vue.d.ts delete mode 100644 types/router.d.ts delete mode 100644 types/utils/defineContainer.d.ts delete mode 100644 types/utils/defineInput.d.ts delete mode 100644 types/utils/defineOverlay.d.ts delete mode 100644 types/utils/index.d.ts diff --git a/.gitignore b/.gitignore index da38761..17dd3b5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,11 +2,11 @@ ~* dist/ +types/ node_modules/ coverage/ reports/ src/**/*.js -types/**/*.map # ignore log files *.log diff --git a/CHANGELOG.md b/CHANGELOG.md index e88d4d5..9756d0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ # Unreleased +### Features +* Added tabs support (no routing yet) - IonTabs, IonTabBar, IonTab, IonTabButton +* Added IonIcon component +* Update to vue@3.0.0-beta.14 +* Update to vue-router@4.0.0-alpha.12 + # [3.0.0-alpha.4](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.3...v3.0.0-alpha.4) ### Features diff --git a/package-lock.json b/package-lock.json index 7efa3d3..75f06e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -779,67 +779,63 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.10.tgz", - "integrity": "sha512-GX5D9a0mjTUzZkd1PTDbETQlP0zcDb4k8wnMsYr1ZW/HXHn+PeS131FWSXz7kV4hVFiwOgxLfN+GEXseZXrxrA==", + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.14.tgz", + "integrity": "sha512-VZarslk2r0E8V9Iuu24LPOWuomWV8KgTp3Pmie6Ys+LnIk+G/hme9BwC2jZgmqgF+adwcfmUC5BTi/KbhRVeIw==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.10", + "@vue/shared": "3.0.0-beta.14", "estree-walker": "^0.8.1", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.10.tgz", - "integrity": "sha512-S1Qqc74Hc3BnHjORzWJvG4Fj5B4O8aqTF1Oyd+Px65CB6qkbAaqTLneYnM5by/78j8inmt4FCHOf48L+gzChRA==", + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.14.tgz", + "integrity": "sha512-wZ2uWo4jvAGD5FPNZYMOxpKEDigLcoPvOGhIAv8H4B6ltDyW54Zfc4RrW5MopJqEcHDDZMpcgGcFN5Qa09sLOg==", "requires": { - "@vue/compiler-core": "3.0.0-beta.10", - "@vue/shared": "3.0.0-beta.10" + "@vue/compiler-core": "3.0.0-beta.14", + "@vue/shared": "3.0.0-beta.14" } }, "@vue/reactivity": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.10.tgz", - "integrity": "sha512-4f/hqdVptNMxCcZfmyxBRrOV0AT0z41CrRtJWCpLQhr+VEisKVhpfe7P7hhfp8prbPhSWa9oZuqVtb5MccgN4g==", + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.14.tgz", + "integrity": "sha512-csqLljnM+8OBBAyzeUXGIYJhhph0DLOsHQwJGmz7uc342taW6XSi4MXaLk5MRiigunfmXxEswJGziwsh+4YP3g==", "requires": { - "@vue/shared": "3.0.0-beta.10" + "@vue/shared": "3.0.0-beta.14" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.10.tgz", - "integrity": "sha512-oBIckKooEeohEPwrn57cuoghNyqY630xmp2exBKiFEaVK3d9N8JBNaFAzw1KZsDNzSyZbUdHzqOZIcZjindypw==", + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.14.tgz", + "integrity": "sha512-5WKNMd7lX0vdSMeNd1cF0VhM+N+kXicSXKKZtTfQLUfZt1gLuE3nlBhv1PqjGf79zXw5lQLzz6XoUY1i52rEkA==", "requires": { - "@vue/reactivity": "3.0.0-beta.10", - "@vue/shared": "3.0.0-beta.10" + "@vue/reactivity": "3.0.0-beta.14", + "@vue/shared": "3.0.0-beta.14" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.10.tgz", - "integrity": "sha512-xrPf0KN1Xe8mFzqxUMxpkzwJjVZcGFEKZLcX4Oh2EmxikD9lnR6DghyPy/LL8QOpJUge6p2mmsqvXwS6MODHDA==", + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.14.tgz", + "integrity": "sha512-nwHvG+IsO0Ttl39NPvQKX2vv5H4XWZVzZCX1rqEIBP3llHyyB9dMrNSPcw54YlPGrEuCwBxVDokHG4CSeVEdtg==", "requires": { - "@vue/runtime-core": "3.0.0-beta.10", - "@vue/shared": "3.0.0-beta.10", + "@vue/runtime-core": "3.0.0-beta.14", + "@vue/shared": "3.0.0-beta.14", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.10.tgz", - "integrity": "sha512-nKPkVB1KqhGuR6lPDcPJ+mhrfVuIGXNmw8s6ecPGjhjil2DetSe1RhgfwRBM0U/QuqUD6RjsIT5WZlnV7878Gg==" + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.14.tgz", + "integrity": "sha512-mnK5teJMLzsBE56Kys+uiyR/jAl1kbokHZ++MnlP7ls9icPqZ/QQE/VTDl3QJ7IHteS2VR6ytAz/Aa/4Dpv/ew==" }, "@vue/test-utils": { - "version": "2.0.0-alpha.4", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.4.tgz", - "integrity": "sha512-9fAQx0MNhgqcNdcbh8xhyCywsWMd2zny4qpGCrgyOcB9s3V2xgjjtwUN72VbvaLnpdZk3mBwFOchNNe0oociNw==", - "dev": true, - "requires": { - "dom-event-types": "^1.0.0", - "lodash": "^4.17.15" - } + "version": "2.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.6.tgz", + "integrity": "sha512-7GaFJve/ljFBzZxhJstg53TlWIZ1hDVHHQnoSbcI32YYkmzZv1rFyMta6hQIAiH+Sel7P9XVfIvb8DTY5u9wEw==", + "dev": true }, "abab": { "version": "2.0.3", @@ -2390,12 +2386,6 @@ } } }, - "dom-event-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz", - "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -6112,13 +6102,13 @@ } }, "vue": { - "version": "3.0.0-beta.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.10.tgz", - "integrity": "sha512-qA7uwX9mFtPd7yUF0lZq3B5yd9AZBmyCk/CCakhyCBqfWE4KsqaIYwb2Uwn6VXn0/aNzKZ8akP0OYCKygq1fkg==", + "version": "3.0.0-beta.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.14.tgz", + "integrity": "sha512-0MH1g5O3zX8ijvZuiQTYFq3UwHxtj512I/wrMPQLVXwjqb+ILA+fooSpdz4xgUBBl5zN/K9xJIwbl23sv+Sn7A==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.10", - "@vue/runtime-dom": "3.0.0-beta.10", - "@vue/shared": "3.0.0-beta.10" + "@vue/compiler-dom": "3.0.0-beta.14", + "@vue/runtime-dom": "3.0.0-beta.14", + "@vue/shared": "3.0.0-beta.14" } }, "vue-class-component": { @@ -6137,9 +6127,9 @@ } }, "vue-router": { - "version": "4.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.10.tgz", - "integrity": "sha512-dA2ywr/rk2yc6JG3nn1eu9wlhR3AAO1dAs75uqY2N8HxvJviSxO0YAm0aHvLkFYTNa9JGV+ao0gr5oJzVbGTaQ==" + "version": "4.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.12.tgz", + "integrity": "sha512-TJhbWHPZS1v259PKlZf+ljSob0U2RUii3HXQgrcFXsNmeWuqEYEh6trswHHr4+MQdXxHgonyYK28qhBjNhORkA==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index 3aae3e2..da88f48 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "clean": "node ./scripts/clean.js" }, "devDependencies": { - "@vue/test-utils": "^2.0.0-alpha.4", + "@vue/test-utils": "^2.0.0-alpha.6", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", "jest": "^25.5.4", @@ -73,8 +73,8 @@ }, "dependencies": { "@ionic/core": "^5.1.0", - "vue": "^3.0.0-beta.10", - "vue-router": "^4.0.0-alpha.10" + "vue": "^3.0.0-beta.14", + "vue-router": "^4.0.0-alpha.12" }, "jestSonar": { "reportPath": "reports", diff --git a/types/components/back-button/index.d.ts b/types/components/back-button/index.d.ts deleted file mode 100644 index 89bce7b..0000000 --- a/types/components/back-button/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FunctionalComponent } from 'vue'; -import { JSX } from '@ionic/core'; -export declare const IonBackButton: FunctionalComponent; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/containers.d.ts b/types/components/containers.d.ts deleted file mode 100644 index b72d04b..0000000 --- a/types/components/containers.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -export declare const IonApp: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonItem: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonLabel: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonButton: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonHeader: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonToolbar: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonTitle: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonContent: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -export declare const IonButtons: import("vue").FunctionalComponent<{ - [key: string]: unknown; -}, Record>; -//# sourceMappingURL=containers.d.ts.map \ No newline at end of file diff --git a/types/components/icon/index.d.ts b/types/components/icon/index.d.ts deleted file mode 100644 index ca4e609..0000000 --- a/types/components/icon/index.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { FunctionalComponent } from 'vue'; -interface Props { - ariaLabel?: string; - color?: string; - flipRtl?: boolean; - icon?: string; - ios?: string; - lazy?: boolean; - md?: string; - mode?: 'ios' | 'md'; - name?: string; - size?: string; - src?: string; -} -export declare const IonIcon: FunctionalComponent; -export {}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/index.d.ts b/types/components/index.d.ts deleted file mode 100644 index f6c86c5..0000000 --- a/types/components/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './overlays'; -export * from './inputs'; -export * from './containers'; -export * from './router-outlet'; -export * from './back-button'; -export * from './tabs'; -export * from './icon'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/inputs.d.ts b/types/components/inputs.d.ts deleted file mode 100644 index d563a63..0000000 --- a/types/components/inputs.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export declare const IonCheckbox: import("vue").FunctionalComponent; -export declare const IonDatetime: import("vue").FunctionalComponent; -export declare const IonInput: import("vue").FunctionalComponent; -export declare const IonRadio: import("vue").FunctionalComponent; -export declare const IonRange: import("vue").FunctionalComponent; -export declare const IonSearchbar: import("vue").FunctionalComponent; -export declare const IonSelect: import("vue").FunctionalComponent; -export declare const IonTextarea: import("vue").FunctionalComponent; -export declare const IonToggle: import("vue").FunctionalComponent; -//# sourceMappingURL=inputs.d.ts.map \ No newline at end of file diff --git a/types/components/overlays.d.ts b/types/components/overlays.d.ts deleted file mode 100644 index c935f66..0000000 --- a/types/components/overlays.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ActionSheetOptions, ModalOptions, PopoverOptions } from '@ionic/core'; -export declare const IonModal: import("vue").FunctionalComponent, "presentingElement" | "showBackdrop" | "backdropDismiss" | "cssClass" | "animated" | "swipeToClose" | "mode" | "keyboardClose" | "id" | "enterAnimation" | "leaveAnimation">, import("../utils").OverlayEvents[]>; -export declare const IonActionSheet: import("vue").FunctionalComponent, import("../utils").OverlayEvents[]>; -export declare const IonPopover: import("vue").FunctionalComponent, "showBackdrop" | "backdropDismiss" | "cssClass" | "animated" | "mode" | "keyboardClose" | "id" | "enterAnimation" | "leaveAnimation" | "translucent" | "event">, import("../utils").OverlayEvents[]>; -//# sourceMappingURL=overlays.d.ts.map \ No newline at end of file diff --git a/types/components/router-outlet/index.d.ts b/types/components/router-outlet/index.d.ts deleted file mode 100644 index f5d3ce1..0000000 --- a/types/components/router-outlet/index.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FunctionalComponent } from 'vue'; -import { RouteLocationNormalizedLoaded } from 'vue-router'; -import { JSX } from '@ionic/core'; -export interface Props extends JSX.IonRouterOutlet { - name?: string; - route?: RouteLocationNormalizedLoaded; - swipeBack?: boolean; -} -export declare const IonRouterView: FunctionalComponent; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/index.d.ts b/types/components/tabs/index.d.ts deleted file mode 100644 index 0df0642..0000000 --- a/types/components/tabs/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { IonTabs } from './tabs'; -export { IonTabBar } from './tab-bar'; -export * from './tab'; -export * from './tab-button'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tab-bar.d.ts b/types/components/tabs/tab-bar.d.ts deleted file mode 100644 index a484b71..0000000 --- a/types/components/tabs/tab-bar.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { FunctionalComponent } from 'vue'; -import { JSX } from '@ionic/core'; -export declare const tabBarRef: import("vue").Ref; -export declare const setActiveTab: (value?: string | undefined) => void; -export declare const IonTabBar: FunctionalComponent; -//# sourceMappingURL=tab-bar.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tab-button.d.ts b/types/components/tabs/tab-button.d.ts deleted file mode 100644 index 6aa1a66..0000000 --- a/types/components/tabs/tab-button.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FunctionalComponent } from 'vue'; -import { JSX } from '@ionic/core'; -export declare const IonTabButton: FunctionalComponent; -//# sourceMappingURL=tab-button.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tab.d.ts b/types/components/tabs/tab.d.ts deleted file mode 100644 index dd2d037..0000000 --- a/types/components/tabs/tab.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FunctionalComponent } from 'vue'; -import { JSX } from '@ionic/core'; -export declare const IonTab: FunctionalComponent; -//# sourceMappingURL=tab.d.ts.map \ No newline at end of file diff --git a/types/components/tabs/tabs.d.ts b/types/components/tabs/tabs.d.ts deleted file mode 100644 index eec98b2..0000000 --- a/types/components/tabs/tabs.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FunctionalComponent, VNode } from 'vue'; -export declare const tabNodes: import("vue").Ref>>; -export declare const IonTabs: FunctionalComponent; -//# sourceMappingURL=tabs.d.ts.map \ No newline at end of file diff --git a/types/index.d.ts b/types/index.d.ts deleted file mode 100644 index 5c358b0..0000000 --- a/types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { IonicVue } from './ionic-vue'; -export * from './components'; -export * from './router'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/ionic-vue.d.ts b/types/ionic-vue.d.ts deleted file mode 100644 index 0a4d435..0000000 --- a/types/ionic-vue.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Plugin } from 'vue'; -export declare const IonicVue: Plugin; -//# sourceMappingURL=ionic-vue.d.ts.map \ No newline at end of file diff --git a/types/router.d.ts b/types/router.d.ts deleted file mode 100644 index 7ca4134..0000000 --- a/types/router.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Ref } from 'vue'; -import { Router, RouterOptions } from 'vue-router'; -import { NavDirection } from '@ionic/core'; -declare module 'vue-router' { - interface Router { - direction: Ref; - showBackButton: Ref; - saveScroll: (el: HTMLElement) => Promise; - restoreScroll: (el: HTMLElement, key: string) => Promise; - } -} -export declare const createRouter: (opts: RouterOptions) => Router; -//# sourceMappingURL=router.d.ts.map \ No newline at end of file diff --git a/types/utils/defineContainer.d.ts b/types/utils/defineContainer.d.ts deleted file mode 100644 index 068fec9..0000000 --- a/types/utils/defineContainer.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { FunctionalComponent } from 'vue'; -declare type Data = { - [key: string]: unknown; -}; -export declare const defineContainer: (name: string) => FunctionalComponent>; -export {}; -//# sourceMappingURL=defineContainer.d.ts.map \ No newline at end of file diff --git a/types/utils/defineInput.d.ts b/types/utils/defineInput.d.ts deleted file mode 100644 index 82cccd2..0000000 --- a/types/utils/defineInput.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FunctionalComponent } from 'vue'; -export interface InputProps { - modelValue: string | boolean; - [key: string]: unknown; -} -export declare enum InputEvents { - onUpdate = "update:modelValue" -} -export declare function defineInput(name: string, ionTag: string, updateEvent?: string, modelProp?: string): FunctionalComponent; -//# sourceMappingURL=defineInput.d.ts.map \ No newline at end of file diff --git a/types/utils/defineOverlay.d.ts b/types/utils/defineOverlay.d.ts deleted file mode 100644 index d8c10e3..0000000 --- a/types/utils/defineOverlay.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { FunctionalComponent } from 'vue'; -export interface OverlayElement extends HTMLElement { - present: () => Promise; - dismiss: (...args: any) => Promise; -} -export interface OverlayProps { - isOpen?: boolean; - modelValue?: boolean; -} -export interface OverlayController { - create: (...args: any) => Promise; -} -export declare type OverlayEventListeners = [string, Exclude][]; -export declare enum OverlayEvents { - onWillPresent = "onWillPresent", - onDidPresent = "onDidPresent", - onWillDismiss = "onWillDismiss", - onDidDismiss = "onDidDismiss", - onUpdate = "update:modelValue" -} -export declare enum OverlayType { - Modal = "IonModal", - ActionSheet = "IonActionSheet", - Popover = "IonPopover" -} -export declare function defineOverlay(name: OverlayType, controller: OverlayController): FunctionalComponent>, OverlayEvents[]>; -//# sourceMappingURL=defineOverlay.d.ts.map \ No newline at end of file diff --git a/types/utils/index.d.ts b/types/utils/index.d.ts deleted file mode 100644 index ab3e41d..0000000 --- a/types/utils/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './defineOverlay'; -export * from './defineInput'; -export * from './defineContainer'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file From 6a3202931703ed60205493e0aaf3a454c7a97eee Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Wed, 10 Jun 2020 19:26:41 +0300 Subject: [PATCH 21/96] turn side-effects off --- build/rollup.config.js | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/build/rollup.config.js b/build/rollup.config.js index 61fbd51..690906b 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -47,6 +47,9 @@ function baseConfig() { "ionicons", "ionicons/icons" ], + treeshake: { + moduleSideEffects: false + }, plugins: [ // vue(), typescript({ diff --git a/package.json b/package.json index da88f48..5ac8522 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "types/", "dist/" ], + "sideEffects": false, "bugs": { "url": "https://github.com/ModusCreateOrg/ionic-vue/issues" }, From a620321eafc6218096a383c318f055919f5dcfff Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 16 Jun 2020 16:13:55 +0300 Subject: [PATCH 22/96] Fix ionic config setup, update changelog and deps --- CHANGELOG.md | 7 ++++++- package.json | 2 +- src/ionic-vue.ts | 15 +++------------ 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9756d0d..e627ba6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,17 @@ # Unreleased +# [3.0.0-alpha.5](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.4...v3.0.0-alpha.5) + ### Features * Added tabs support (no routing yet) - IonTabs, IonTabBar, IonTab, IonTabButton * Added IonIcon component -* Update to vue@3.0.0-beta.14 +* Update to vue@3.0.0-beta.15 * Update to vue-router@4.0.0-alpha.12 +### Bug fixes +* Fix setup of Ionic config + # [3.0.0-alpha.4](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.3...v3.0.0-alpha.4) ### Features diff --git a/package.json b/package.json index 5ac8522..3b115e6 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ }, "dependencies": { "@ionic/core": "^5.1.0", - "vue": "^3.0.0-beta.14", + "vue": "^3.0.0-beta.15", "vue-router": "^4.0.0-alpha.12" }, "jestSonar": { diff --git a/src/ionic-vue.ts b/src/ionic-vue.ts index a98ab44..e0b4185 100644 --- a/src/ionic-vue.ts +++ b/src/ionic-vue.ts @@ -1,20 +1,11 @@ import { App, Plugin } from 'vue'; -import { IonicConfig } from '@ionic/core'; +import { IonicConfig, setupConfig } from '@ionic/core'; import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; -interface IonicWindow extends Window { - Ionic: { - config?: IonicConfig; - }; -} - export const IonicVue: Plugin = { async install(_app: App, config?: IonicConfig) { - const win: IonicWindow = window as any; - const Ionic = win?.Ionic || {}; - Ionic.config = config || {}; - + config && setupConfig(config); await applyPolyfills(); - defineCustomElements(win); + defineCustomElements(window); } }; From 630efb00c195300612a823f9a0b4ee8d5ac05cb0 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 16 Jun 2020 16:15:39 +0300 Subject: [PATCH 23/96] [build] 3.0.0-alpha.6 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 75f06e0..ef8f9c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.5", + "version": "3.0.0-alpha.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3b115e6..a14d777 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.5", + "version": "3.0.0-alpha.6", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 3a94203ed2aa35a278262a13c5fd99ce72f6541b Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 16 Jun 2020 16:54:09 +0300 Subject: [PATCH 24/96] Fix lock file --- package-lock.json | 64 +++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef8f9c7..6e3f047 100644 --- a/package-lock.json +++ b/package-lock.json @@ -779,57 +779,57 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.14.tgz", - "integrity": "sha512-VZarslk2r0E8V9Iuu24LPOWuomWV8KgTp3Pmie6Ys+LnIk+G/hme9BwC2jZgmqgF+adwcfmUC5BTi/KbhRVeIw==", + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.15.tgz", + "integrity": "sha512-NLNW7tAMHl8ybRgTPTIWLsi8aXHbFngY2x95eEHAdxhNasTY5NsgmQBBH9TBAUQEn6Wo8ybmuvQoNzgcw979Zg==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.14", + "@vue/shared": "3.0.0-beta.15", "estree-walker": "^0.8.1", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.14.tgz", - "integrity": "sha512-wZ2uWo4jvAGD5FPNZYMOxpKEDigLcoPvOGhIAv8H4B6ltDyW54Zfc4RrW5MopJqEcHDDZMpcgGcFN5Qa09sLOg==", + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.15.tgz", + "integrity": "sha512-0qVaCosZ6XrkmlSOndGlNh33JQ2oao82uWxC/qw4QWBGm6a1DcKkZFIZFYLQWg5ZIcSrEQrR1VzUidBaZw9AIg==", "requires": { - "@vue/compiler-core": "3.0.0-beta.14", - "@vue/shared": "3.0.0-beta.14" + "@vue/compiler-core": "3.0.0-beta.15", + "@vue/shared": "3.0.0-beta.15" } }, "@vue/reactivity": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.14.tgz", - "integrity": "sha512-csqLljnM+8OBBAyzeUXGIYJhhph0DLOsHQwJGmz7uc342taW6XSi4MXaLk5MRiigunfmXxEswJGziwsh+4YP3g==", + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.15.tgz", + "integrity": "sha512-Xa0LG8RTNlPYsuqOBhhV03xKhMmuSU0vtKXoIi1yxp9gGU7ga/TMmnhELb66AiupiXdLJwRcdv00KhPF/2y0dA==", "requires": { - "@vue/shared": "3.0.0-beta.14" + "@vue/shared": "3.0.0-beta.15" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.14.tgz", - "integrity": "sha512-5WKNMd7lX0vdSMeNd1cF0VhM+N+kXicSXKKZtTfQLUfZt1gLuE3nlBhv1PqjGf79zXw5lQLzz6XoUY1i52rEkA==", + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.15.tgz", + "integrity": "sha512-jDkqSs1hsS9fRCgzah7VINafxWj7bYoDyweVuBqm6KPcHRfGkRZZxl2NltbbVaLH76Qvm4PPSnqGgEx7QtFSgg==", "requires": { - "@vue/reactivity": "3.0.0-beta.14", - "@vue/shared": "3.0.0-beta.14" + "@vue/reactivity": "3.0.0-beta.15", + "@vue/shared": "3.0.0-beta.15" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.14.tgz", - "integrity": "sha512-nwHvG+IsO0Ttl39NPvQKX2vv5H4XWZVzZCX1rqEIBP3llHyyB9dMrNSPcw54YlPGrEuCwBxVDokHG4CSeVEdtg==", + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.15.tgz", + "integrity": "sha512-161rUw1sWfbv51Ua8gKXaPc+seRJQcV+MLokTJtqYtNCajya0Mx6vdXJajBWqjDT8/Udx0sb7Wm/K/0DfGBUTw==", "requires": { - "@vue/runtime-core": "3.0.0-beta.14", - "@vue/shared": "3.0.0-beta.14", + "@vue/runtime-core": "3.0.0-beta.15", + "@vue/shared": "3.0.0-beta.15", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.14.tgz", - "integrity": "sha512-mnK5teJMLzsBE56Kys+uiyR/jAl1kbokHZ++MnlP7ls9icPqZ/QQE/VTDl3QJ7IHteS2VR6ytAz/Aa/4Dpv/ew==" + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.15.tgz", + "integrity": "sha512-wViILT5GgxMtnXVQ1xupj43wvnZ41g3NLWaBObs7l+eTxz5vq5yx72qH6HRpsfhR2Mg39jE0cfNLFEpC4lJIUQ==" }, "@vue/test-utils": { "version": "2.0.0-alpha.6", @@ -6102,13 +6102,13 @@ } }, "vue": { - "version": "3.0.0-beta.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.14.tgz", - "integrity": "sha512-0MH1g5O3zX8ijvZuiQTYFq3UwHxtj512I/wrMPQLVXwjqb+ILA+fooSpdz4xgUBBl5zN/K9xJIwbl23sv+Sn7A==", + "version": "3.0.0-beta.15", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.15.tgz", + "integrity": "sha512-KTmvfNpkvD6mao8vloqjUMjrHEivS1HZvHmYeHPRHqU2HRvNcrZuwXYvETt3dGOTu0Oj7zAWQXP+uZ34CW75sw==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.14", - "@vue/runtime-dom": "3.0.0-beta.14", - "@vue/shared": "3.0.0-beta.14" + "@vue/compiler-dom": "3.0.0-beta.15", + "@vue/runtime-dom": "3.0.0-beta.15", + "@vue/shared": "3.0.0-beta.15" } }, "vue-class-component": { From 287afb59cb32634c5d377d8d8015f6c8c3fcbd11 Mon Sep 17 00:00:00 2001 From: Tim Vu <53657181+djtimmy679@users.noreply.github.com> Date: Wed, 17 Jun 2020 09:33:35 -0400 Subject: [PATCH 25/96] Dev (#128) * Added remaining wrapper containers * Unit tests --- .gitignore | 2 + jest.config.js | 14 +- package-lock.json | 705 +++++++++++++++++++++++++++++++++-- package.json | 6 +- src/components/containers.ts | 72 +++- test/defineContainer.spec.ts | 20 + test/defineInput.spec.ts | 30 ++ test/ionic-vue.spec.ts | 13 + tsconfig.json | 2 + tslint.json | 12 +- 10 files changed, 823 insertions(+), 53 deletions(-) create mode 100644 test/defineContainer.spec.ts create mode 100644 test/defineInput.spec.ts create mode 100644 test/ionic-vue.spec.ts diff --git a/.gitignore b/.gitignore index 17dd3b5..247486e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,10 @@ types/ node_modules/ coverage/ reports/ +types/ src/**/*.js + # ignore log files *.log npm-debug.log* diff --git a/jest.config.js b/jest.config.js index 55532d7..1c34e73 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,12 +1,8 @@ module.exports = { - testURL: 'http://localhost/', - moduleFileExtensions: ['js', 'vue'], - moduleNameMapper: { - '^vue$': 'vue/dist/vue.common.js', - }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node', 'vue'], transform: { - '^.+\\.js$': '/node_modules/babel-jest', - '.*\\.(vue)$': '/node_modules/jest-vue-preprocessor', + '^.+\\.ts?$': 'ts-jest' }, - "testResultsProcessor": "jest-sonar-reporter" -} + testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.ts?$', + 'testResultsProcessor': 'jest-sonar-reporter' +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6e3f047..3d5aa7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -644,14 +644,45 @@ } }, "@sinonjs/commons": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", - "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", - "dev": true, + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", + "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/formatio": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "@sinonjs/samsam": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", + "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" + }, "@types/babel__core": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", @@ -739,10 +770,26 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.3.tgz", + "integrity": "sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==", + "dev": true, + "requires": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, "@types/node": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", - "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", + "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==", "dev": true }, "@types/normalize-package-data": { @@ -757,6 +804,19 @@ "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", "dev": true }, + "@types/sinon": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.4.tgz", + "integrity": "sha512-sJmb32asJZY6Z2u09bl0G2wglSxDlROlAejCjsnor+LzBMz17gu8IU7vKC/vWDnv9zEq2wqADHVXFjf4eE8Gdw==", + "requires": { + "@types/sinonjs__fake-timers": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", + "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -885,6 +945,16 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -897,6 +967,12 @@ "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -1024,9 +1100,9 @@ "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, "babel-code-frame": { @@ -1793,6 +1869,12 @@ "tweetnacl": "^0.14.3" } }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1845,6 +1927,15 @@ "electron-to-chromium": "^1.3.47" } }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -1936,6 +2027,39 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "cacache": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", + "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "move-file": "^2.0.0", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -2038,6 +2162,12 @@ } } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -2067,6 +2197,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -2353,8 +2489,7 @@ "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, "diff-sequences": { "version": "25.2.6", @@ -2417,6 +2552,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2426,6 +2567,38 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2817,6 +2990,15 @@ "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3045,6 +3227,18 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3384,9 +3578,9 @@ }, "dependencies": { "cross-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -4076,6 +4270,11 @@ "verror": "1.10.0" } }, + "just-extend": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4110,6 +4309,28 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -4124,6 +4345,17 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -4148,6 +4380,23 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -4174,6 +4423,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -4250,6 +4505,52 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -4280,6 +4581,15 @@ "minimist": "^1.2.5" } }, + "move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", + "dev": true, + "requires": { + "path-exists": "^4.0.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4317,6 +4627,18 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "nise": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", + "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4518,6 +4840,15 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4572,6 +4903,21 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -4671,6 +5017,18 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -4681,6 +5039,12 @@ "sisteransi": "^1.0.4" } }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -4709,6 +5073,15 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -4746,6 +5119,21 @@ "type-fest": "^0.8.1" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", @@ -5235,6 +5623,15 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5292,6 +5689,35 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "sinon": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", + "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", + "requires": { + "@sinonjs/commons": "^1.7.2", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.0.3", + "diff": "^4.0.2", + "nise": "^4.0.1", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -5432,6 +5858,12 @@ } } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5473,9 +5905,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -5489,9 +5921,9 @@ "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -5536,6 +5968,15 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", @@ -5624,6 +6065,15 @@ } } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -5693,6 +6143,34 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -5714,6 +6192,72 @@ "source-map-support": "~0.5.10" } }, + "terser-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-QeBHLJzKJHCnrPNlZj5EmOF6wwvzpVGDHvTrySIH8+jZEXfcKKCiriRmF6945rKzuZDnkOEU/LDv7qtPiiyP/Q==", + "dev": true, + "requires": { + "cacache": "^15.0.3", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.0.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -5803,6 +6347,70 @@ "punycode": "^2.1.0" } }, + "ts-jest": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.0.tgz", + "integrity": "sha512-JbhQdyDMYN5nfKXaAwCIyaWLGwevcT2/dbqRPsQeh6NZPUuXjZQZEfeLb75tz0ubCIgEELNm6xAzTe5NXs5Y4Q==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "micromatch": "4.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "18.x" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "ts-loader": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz", + "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "tslib": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", @@ -5924,8 +6532,7 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { "version": "0.8.1", @@ -5943,9 +6550,9 @@ } }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", + "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -5988,6 +6595,24 @@ "set-value": "^2.0.1" } }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -6055,6 +6680,12 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -6166,6 +6797,16 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -6285,9 +6926,9 @@ } }, "ws": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", - "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", "dev": true }, "xml": { @@ -6314,6 +6955,12 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", diff --git a/package.json b/package.json index a14d777..f46eb73 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,8 @@ "clean": "node ./scripts/clean.js" }, "devDependencies": { + "@types/jest": "^25.2.3", + "@types/node": "^14.0.5", "@vue/test-utils": "^2.0.0-alpha.6", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", @@ -67,10 +69,12 @@ "rollup-plugin-buble": "^0.19.2", "rollup-plugin-terser": "^1.0.1", "rollup-plugin-typescript2": "^0.27.0", + "ts-jest": "^26.1.0", + "ts-loader": "^7.0.5", "tslib": "^1.11.2", "tslint": "^6.1.2", "tslint-ionic-rules": "^0.0.21", - "typescript": "^3.8.3" + "typescript": "^3.9.3" }, "dependencies": { "@ionic/core": "^5.1.0", diff --git a/src/components/containers.ts b/src/components/containers.ts index 99d287b..82a3bb0 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -1,11 +1,65 @@ import { defineContainer } from '../utils'; -export const IonApp = defineContainer('ion-app'); -export const IonItem = defineContainer('ion-item'); -export const IonLabel = defineContainer('ion-label'); -export const IonButton = defineContainer('ion-button'); -export const IonHeader = defineContainer('ion-header'); -export const IonToolbar = defineContainer('ion-toolbar'); -export const IonTitle = defineContainer('ion-title'); -export const IonContent = defineContainer('ion-content'); -export const IonButtons = defineContainer('ion-buttons'); +export const IonApp = /*@__PURE__*/defineContainer('ion-app'); +export const IonAvatar = /*@__PURE__*/defineContainer('ion-avatar'); +export const IonBackdrop = /*@__PURE__*/defineContainer('ion-backdrop'); +export const IonBadge = /*@__PURE__*/defineContainer('ion-badge'); +export const IonButton = /*@__PURE__*/defineContainer('ion-button'); +export const IonButtons = /*@__PURE__*/defineContainer('ion-buttons'); +export const IonCard = /*@__PURE__*/defineContainer('ion-card'); +export const IonCardContent = /*@__PURE__*/defineContainer('ion-card-content'); +export const IonCardHeader = /*@__PURE__*/defineContainer('ion-card-header'); +export const IonCardSubtitle = /*@__PURE__*/defineContainer('ion-card-subtitle'); +export const IonCardTitle = /*@__PURE__*/defineContainer('ion-card-title'); +export const IonChip = /*@__PURE__*/defineContainer('ion-chip'); +export const IonCol = /*@__PURE__*/defineContainer('ion-col'); +export const IonContent = /*@__PURE__*/defineContainer('ion-content'); +export const IonFab = /*@__PURE__*/defineContainer('ion-fab'); +export const IonFabButton = /*@__PURE__*/defineContainer('ion-fab-button'); +export const IonFabList = /*@__PURE__*/defineContainer('ion-fab-list'); +export const IonFooter = /*@__PURE__*/defineContainer('ion-footer'); +export const IonGrid = /*@__PURE__*/defineContainer('ion-grid'); +export const IonHeader = /*@__PURE__*/defineContainer('ion-header'); +export const IonImg = /*@__PURE__*/defineContainer('ion-img'); +export const IonInfiniteScroll = /*@__PURE__*/defineContainer('ion-infinite-scroll'); +export const IonInfiniteScrollContent = /*@__PURE__*/defineContainer('ion-infinite-scroll-content'); +export const IonItem = /*@__PURE__*/defineContainer('ion-item'); +export const IonItemDivider = /*@__PURE__*/defineContainer('ion-item-divider'); +export const IonItemGroup = /*@__PURE__*/defineContainer('ion-item-group'); +export const IonItemOption = /*@__PURE__*/defineContainer('ion-item-option'); +export const IonItemOptions = /*@__PURE__*/defineContainer('ion-item-options'); +export const IonItemSliding = /*@__PURE__*/defineContainer('ion-item-sliding'); +export const IonLabel = /*@__PURE__*/defineContainer('ion-label'); +export const IonList = /*@__PURE__*/defineContainer('ion-list'); +export const IonListHeader = /*@__PURE__*/defineContainer('ion-list-header'); +export const IonMenu = /*@__PURE__*/defineContainer('ion-menu'); +export const IonMenuButton = /*@__PURE__*/defineContainer('ion-menu-button'); +export const IonMenuToggle = /*@__PURE__*/defineContainer('ion-menu-toggle'); +export const IonNote = /*@__PURE__*/defineContainer('ion-note'); +export const IonPickerColumn = /*@__PURE__*/defineContainer('ion-picker-column'); +export const IonNav = /*@__PURE__*/defineContainer('ion-nav'); +export const IonProgressBar = /*@__PURE__*/defineContainer('ion-progress-bar'); +export const IonRadioGroup = /*@__PURE__*/defineContainer('ion-radio-group'); +export const IonRefresher = /*@__PURE__*/defineContainer('ion-refresher'); +export const IonRefresherContent = /*@__PURE__*/defineContainer('ion-refresher-content'); +export const IonReorder = /*@__PURE__*/ defineContainer('ion-reorder'); +export const IonReorderGroup = /*@__PURE__*/defineContainer('ion-reorder-group'); +export const IonRippleEffect = /*@__PURE__*/defineContainer('ion-ripple-effect'); +export const IonRouterLink = /*@__PURE__*/defineContainer('ion-router-link'); +export const IonRow = /*@__PURE__*/defineContainer('ion-row'); +export const IonSegment = /*@__PURE__*/defineContainer('ion-segment'); +export const IonSegmentButton = /*@__PURE__*/defineContainer('ion-segment-button'); +export const IonSelectOption = /*@__PURE__*/defineContainer('ion-select-option'); +export const IonSelectPopover = /*@__PURE__*/defineContainer('ion-select-popover'); +export const IonSkeletonText = /*@__PURE__*/defineContainer('ion-skeleton-text'); +export const IonSlide = /*@__PURE__*/defineContainer('ion-slide'); +export const IonSlides = /*@__PURE__*/defineContainer('ion-slides'); +export const IonSpinner = /*@__PURE__*/defineContainer('ion-spinner'); +export const IonSplitPane = /*@__PURE__*/defineContainer('ion-split-pane'); +export const IonTab = /*@__PURE__*/defineContainer('ion-tab'); +export const IonTabButton = /*@__PURE__*/defineContainer('ion-tab-button'); +export const IonText = /*@__PURE__*/defineContainer('ion-text'); +export const IonThumbnail = /*@__PURE__*/defineContainer('ion-thumbnail'); +export const IonTitle = /*@__PURE__*/defineContainer('ion-title'); +export const IonToolbar = /*@__PURE__*/defineContainer('ion-toolbar'); +export const IonVirtualScroll = /*@__PURE__*/defineContainer('ion-virtual-scroll'); diff --git a/test/defineContainer.spec.ts b/test/defineContainer.spec.ts new file mode 100644 index 0000000..af28654 --- /dev/null +++ b/test/defineContainer.spec.ts @@ -0,0 +1,20 @@ +import { defineContainer } from '../src/utils/defineContainer'; +import { ShapeFlags } from '@vue/shared'; +import { createVNode } from 'vue'; + +describe('test defineContainer function', () => { + const testContainer = defineContainer('test'); + it('should be a FunctionalComponent', () => { + expect(typeof test).toBe('function'); + expect(createVNode(testContainer).shapeFlag).toBe(ShapeFlags.FUNCTIONAL_COMPONENT); + }); + it('should have a display name equal to string passed in', () => { + expect(testContainer.displayName).toEqual('test'); + }); + it('should call slots default', () => { + const prop = { props: 'testProp' }; + const ctx = { slots: { default: jest.fn() } }; // defining props/slots for test + testContainer(prop, ctx as any); + expect(ctx.slots.default).toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/test/defineInput.spec.ts b/test/defineInput.spec.ts new file mode 100644 index 0000000..9ededbb --- /dev/null +++ b/test/defineInput.spec.ts @@ -0,0 +1,30 @@ +import { defineInput } from '../src/utils/defineInput'; +import { createVNode } from 'vue'; +import { ShapeFlags } from '@vue/shared'; +import { shallowMount } from '@vue/test-utils'; +import sinon from 'sinon'; + +describe('test defineInput function', () => { + const testInput = defineInput('test', 'test2'); + it('should return a functional component with display name equal to name passed in', () => { + expect(typeof testInput).toBe('function'); + expect(createVNode(testInput).shapeFlag).toBe(ShapeFlags.FUNCTIONAL_COMPONENT); + expect(testInput.displayName).toBe('test'); + }); + it('should check if h function is running correctly', () => { + const props = { props: 'updateEvent' }; + const ctx = { slots: { default: jest.fn() } }; // defining props/slots for test + testInput(props as any, ctx as any); + expect(ctx.slots.default).toHaveBeenCalled(); + }); + it('should trigger input', async () => { + const spy = sinon.stub(); + const wrapper = shallowMount(testInput, { + props: { + updateEvent: { spy } + } + }); + await(wrapper.trigger('click')); + expect(spy.called).toBe(true); + }); +}); \ No newline at end of file diff --git a/test/ionic-vue.spec.ts b/test/ionic-vue.spec.ts new file mode 100644 index 0000000..ad55189 --- /dev/null +++ b/test/ionic-vue.spec.ts @@ -0,0 +1,13 @@ +import Ionic from '@ionic/core/loader'; +import { IonicVue } from '../src/ionic-vue'; +describe('test that install function in ionic-vue.ts works', () => { + const app = jest.fn(); + it('should test that applyPolyfills & defineCustomElements is called', async () => { + expect(typeof IonicVue.install).toBe('function'); // tests if function exists + const polyfillSpy = jest.spyOn(Ionic, 'applyPolyfills'); + const customElementsSpy = jest.spyOn(Ionic, 'defineCustomElements'); + await IonicVue.install!(app as any); + expect(customElementsSpy).toHaveBeenCalled(); + expect(polyfillSpy).toHaveBeenCalled(); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 2765dda..d26e42c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "declaration": true, "declarationMap": true, "declarationDir": "types", + "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, "jsx": "react", @@ -25,6 +26,7 @@ "pretty": true, "removeComments": false, "rootDir": "src", + "sourceMap": true, "strictPropertyInitialization": false, "target": "es5" }, diff --git a/tslint.json b/tslint.json index 0532515..9e82d89 100644 --- a/tslint.json +++ b/tslint.json @@ -1,7 +1,9 @@ { - "extends": "tslint-ionic-rules", - "rules": { - "no-non-null-assertion": false, - "no-import-side-effect": [true, {"ignore-module": "(svg|\\.css)$"}] - } + "extends": "tslint-ionic-rules/", + "rules": { + "no-non-null-assertion": false, + "no-import-side-effect": [true, {"ignore-module": "(svg|\\.css)$"}], + "semicolon": [true, "always"] + } } + \ No newline at end of file From 293a9268d79a7159e2e685d74d5fc596c236fbc6 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 20 Jun 2020 12:59:16 +0300 Subject: [PATCH 26/96] Fixes #114 --- src/components/router-outlet/index.ts | 2 +- src/components/tabs/tab-bar.ts | 8 ++--- src/components/tabs/tab-button.ts | 20 ++++++++++-- src/components/tabs/tab.ts | 44 ++++++++++++++++++++++++--- src/components/tabs/tabs.ts | 9 ++++-- 5 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 2041fbd..04c5e9f 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -134,7 +134,7 @@ export const IonRouterView: FunctionalComponent = props => { const child = newView.value ? h(newView.value.component, newView.value.props) - : h(Component, componentProps); + : Component ? h(Component, componentProps) : null; if (newView.value?.component === Component) { newView.value = undefined; diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 16a84a3..45e4f4d 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -13,14 +13,14 @@ const componentProps: (keyof JSX.IonTabBar)[] = [ export const tabBarRef = ref(); export const setActiveTab = (value?: string) => { - tabNodes.value.forEach((node, tab) => { - node.el!.active = tab === value; + tabNodes.value.forEach((tab, tabName) => { + // already unref-ed thus casting + tab.ref && ((tab.ref as unknown as HTMLIonTabElement).active = tabName === value); }); } export const IonTabBar: FunctionalComponent = (props, { slots }) => { - const selectedTab = props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]); - setActiveTab(selectedTab); + const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]); return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); } diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index 4d1c1a9..e7091ab 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -1,6 +1,8 @@ import { FunctionalComponent, h } from 'vue'; import { JSX } from '@ionic/core'; +import { tabNodes } from './tabs'; import { setActiveTab, tabBarRef } from './tab-bar'; +import { useRouter } from 'vue-router'; const name = 'ion-tab-button'; const componentProps: (keyof JSX.IonTabButton)[] = [ @@ -15,11 +17,23 @@ const componentProps: (keyof JSX.IonTabButton)[] = [ 'target', ]; -export const IonTabButton: FunctionalComponent = (props, { slots }) => - h(name, { ...props, onClick() { +export const IonTabButton: FunctionalComponent = (props, { slots }) => { + const router = useRouter(); + + const onClick = async () => { tabBarRef.value && (tabBarRef.value.selectedTab = props?.tab); + + if (props.tab && props.href && router) { + const location = tabNodes.value.get(props.tab)?.location || props.href; + location && router.push(router.currentRoute.value.fullPath === location ? props.href : location); + return; + } + setActiveTab(tabBarRef.value?.selectedTab); - } }, slots.default && slots.default()); + }; + + return h(name, { ...props, onClick }, slots.default && slots.default()); +} IonTabButton.displayName = name; IonTabButton.props = componentProps; diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index b44c065..3f76ca1 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -1,14 +1,50 @@ -import { FunctionalComponent, h } from 'vue'; +import { FunctionalComponent, Ref, getCurrentInstance, h, onActivated, ref } from 'vue'; +import { useRoute } from 'vue-router'; import { JSX } from '@ionic/core'; import { tabNodes } from './tabs'; +import { tabBarRef } from './tab-bar'; const name = 'ion-tab'; const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; +const refs: { [key: string]: Ref } = {}; export const IonTab: FunctionalComponent = (props, { slots }) => { - const vnode = h(name, props, slots.default && slots.default()); - tabNodes.value.set(props.tab, vnode); - return vnode; + let tabNode = tabNodes.value.get(props.tab); + let active = tabBarRef.value?.selectedTab === props.tab; + const instance = getCurrentInstance()!; + const route = useRoute && useRoute(); + + if (tabBarRef.value?.selectedTab === undefined) { + tabBarRef.value && (tabBarRef.value.selectedTab = props.tab); + active = true; + } + + if (!tabNode) { + refs[props.tab] = ref(); + tabNodes.value.set(props.tab, { ref: refs[props.tab] }); + } + tabNode = tabNodes.value.get(props.tab)!; + + // Only add Lifecycle.ACTIVATE hooks once + // @ts-ignore + if (!instance?.a || instance?.a.length === 0) { + onActivated(() => { + const tabRef = refs[props.tab].value; + tabBarRef.value && (tabBarRef.value.selectedTab = props.tab); + tabRef && (tabRef.active = true); + }, instance); + } + + const onVnodeUpdated = () => { + if (tabBarRef.value?.selectedTab === props.tab) { + tabNode && route && (tabNode.location = route.fullPath); + } + } + const onVnodeBeforeUnmount = () => { + tabBarRef.value && (tabBarRef.value.selectedTab = undefined); + } + + return h(name, { ...props, active, onVnodeUpdated, onVnodeBeforeUnmount, ref: refs[props.tab] }, slots.default && slots.default()); } IonTab.displayName = name; diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts index 22aba9a..441da95 100644 --- a/src/components/tabs/tabs.ts +++ b/src/components/tabs/tabs.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, VNode, h, ref } from 'vue'; +import { FunctionalComponent, Ref, h, ref } from 'vue'; // CSS for ion-tabs inner and outer elements const hostStyles = { @@ -20,7 +20,12 @@ const innerStyles = { contain: 'layout size style', }; -export const tabNodes = ref>(new Map()); +export interface Tab { + ref: Ref; + location?: string; +} + +export const tabNodes = ref>(new Map()); export const IonTabs: FunctionalComponent = (props, { slots }) => { return h('div', { ...props, style: hostStyles }, [ From 7a3cc8f60bd58efb0974fb85eaea2c74fe3ebc4b Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 20 Jun 2020 13:04:48 +0300 Subject: [PATCH 27/96] Add terser annotation, fix linting --- src/components/containers.ts | 2 -- src/components/icon/index.ts | 2 +- src/components/inputs.ts | 18 +++++++++--------- src/components/overlays.ts | 6 +++--- src/components/tabs/tab-bar.ts | 4 ++-- src/components/tabs/tab-button.ts | 2 +- src/components/tabs/tab.ts | 6 +++--- src/components/tabs/tabs.ts | 2 +- 8 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/components/containers.ts b/src/components/containers.ts index 82a3bb0..02da836 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -56,8 +56,6 @@ export const IonSlide = /*@__PURE__*/defineContainer('ion-slide'); export const IonSlides = /*@__PURE__*/defineContainer('ion-slides'); export const IonSpinner = /*@__PURE__*/defineContainer('ion-spinner'); export const IonSplitPane = /*@__PURE__*/defineContainer('ion-split-pane'); -export const IonTab = /*@__PURE__*/defineContainer('ion-tab'); -export const IonTabButton = /*@__PURE__*/defineContainer('ion-tab-button'); export const IonText = /*@__PURE__*/defineContainer('ion-text'); export const IonThumbnail = /*@__PURE__*/defineContainer('ion-thumbnail'); export const IonTitle = /*@__PURE__*/defineContainer('ion-title'); diff --git a/src/components/icon/index.ts b/src/components/icon/index.ts index 381fa3d..faa4b1b 100644 --- a/src/components/icon/index.ts +++ b/src/components/icon/index.ts @@ -19,7 +19,7 @@ export const IonIcon: FunctionalComponent = (props) => { const { md, ios } = props; const icon = (isPlatform(window, 'ios') ? ios ?? md : md ?? ios) ?? props.icon; return h('ion-icon', { ...props, icon }); -} +}; IonIcon.displayName = 'ion-icon'; IonIcon.props = ['ariaLabel', 'color', 'flipRtl', 'icon', 'ios', 'lazy', 'md', 'mode', 'name', 'size', 'src']; diff --git a/src/components/inputs.ts b/src/components/inputs.ts index 8074e01..1cd4bc5 100644 --- a/src/components/inputs.ts +++ b/src/components/inputs.ts @@ -1,23 +1,23 @@ import { defineInput } from '../utils'; -export const IonCheckbox = defineInput( +export const IonCheckbox = /*@__PURE__*/defineInput( 'IonCheckbox', 'ion-checkbox', 'onIonChange', 'checked' ); -export const IonDatetime = defineInput('IonDatetime', 'ion-datetime'); -export const IonInput = defineInput('IonInput', 'ion-input', 'onIonInput'); -export const IonRadio = defineInput('IonRadio', 'ion-radio', 'onIonSelect'); -export const IonRange = defineInput('IonRange', 'ion-range'); -export const IonSearchbar = defineInput( +export const IonDatetime = /*@__PURE__*/defineInput('IonDatetime', 'ion-datetime'); +export const IonInput = /*@__PURE__*/defineInput('IonInput', 'ion-input', 'onIonInput'); +export const IonRadio = /*@__PURE__*/defineInput('IonRadio', 'ion-radio', 'onIonSelect'); +export const IonRange = /*@__PURE__*/defineInput('IonRange', 'ion-range'); +export const IonSearchbar = /*@__PURE__*/defineInput( 'IonSearchbar', 'ion-searchbar', 'onIonInput' ); -export const IonSelect = defineInput('IonSelect', 'ion-select'); -export const IonTextarea = defineInput('IonTextarea', 'ion-textarea'); -export const IonToggle = defineInput( +export const IonSelect = /*@__PURE__*/defineInput('IonSelect', 'ion-select'); +export const IonTextarea = /*@__PURE__*/defineInput('IonTextarea', 'ion-textarea'); +export const IonToggle = /*@__PURE__*/defineInput( 'IonToggle', 'ion-toggle', 'onIonChange', diff --git a/src/components/overlays.ts b/src/components/overlays.ts index b71d7b0..7cc9eb8 100644 --- a/src/components/overlays.ts +++ b/src/components/overlays.ts @@ -8,17 +8,17 @@ import { } from '@ionic/core'; import { OverlayType, defineOverlay } from '../utils'; -export const IonModal = defineOverlay( +export const IonModal = /*@__PURE__*/defineOverlay( OverlayType.Modal, modalController ); -export const IonActionSheet = defineOverlay< +export const IonActionSheet = /*@__PURE__*/defineOverlay< HTMLIonActionSheetElement, ActionSheetOptions >(OverlayType.ActionSheet, actionSheetController); -export const IonPopover = defineOverlay( +export const IonPopover = /*@__PURE__*/defineOverlay( OverlayType.Popover, popoverController ); diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 45e4f4d..8cceb53 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -17,12 +17,12 @@ export const setActiveTab = (value?: string) => { // already unref-ed thus casting tab.ref && ((tab.ref as unknown as HTMLIonTabElement).active = tabName === value); }); -} +}; export const IonTabBar: FunctionalComponent = (props, { slots }) => { const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]); return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); -} +}; IonTabBar.displayName = name; IonTabBar.props = componentProps; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index e7091ab..e6b3e8a 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -33,7 +33,7 @@ export const IonTabButton: FunctionalComponent = (props, { slo }; return h(name, { ...props, onClick }, slots.default && slots.default()); -} +}; IonTabButton.displayName = name; IonTabButton.props = componentProps; diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index 3f76ca1..c7a24f8 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -39,13 +39,13 @@ export const IonTab: FunctionalComponent = (props, { slots }) => { if (tabBarRef.value?.selectedTab === props.tab) { tabNode && route && (tabNode.location = route.fullPath); } - } + }; const onVnodeBeforeUnmount = () => { tabBarRef.value && (tabBarRef.value.selectedTab = undefined); - } + }; return h(name, { ...props, active, onVnodeUpdated, onVnodeBeforeUnmount, ref: refs[props.tab] }, slots.default && slots.default()); -} +}; IonTab.displayName = name; IonTab.props = componentProps; diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts index 441da95..5f57e28 100644 --- a/src/components/tabs/tabs.ts +++ b/src/components/tabs/tabs.ts @@ -33,6 +33,6 @@ export const IonTabs: FunctionalComponent = (props, { slots }) => { h('div', { class: 'tabs-inner', style: innerStyles }, slots.default && slots.default()), slots.bottom && slots.bottom(), ]); -} +}; IonTabs.displayName = 'ion-tabs'; From 7310859638fc42067672dee0cf01770daf0a3a5c Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 20 Jun 2020 13:09:45 +0300 Subject: [PATCH 28/96] Fix missing prev route state --- src/router.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/router.ts b/src/router.ts index 724fa1f..e782fdc 100644 --- a/src/router.ts +++ b/src/router.ts @@ -56,9 +56,10 @@ export const createRouter = (opts: RouterOptions): Router => { router.saveScroll = async el => { const ionContent = el.querySelector('ion-content'); const scrollElement = ionContent && (await ionContent.getScrollElement()); + const prevRoute = router.history.state.back as any; - if (scrollElement) { - scroll.set((router.history.state.back as any).fullPath, { + if (scrollElement && prevRoute?.fullPath) { + scroll.set(prevRoute.fullPath, { top: scrollElement?.scrollTop || 0, left: scrollElement?.scrollLeft || 0, }); From 90df8821897fcdd97a3723503fecc9c82f7776b0 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 22 Jun 2020 17:00:04 +0300 Subject: [PATCH 29/96] [build] 3.0.0-alpha.7 --- CHANGELOG.md | 6 ++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e627ba6..a55b214 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ # Unreleased +# [3.0.0-alpha.7](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.6...v3.0.0-alpha.7) + +### Features +* Added routing to tabs +* Added the rest of the missing Ionic components + # [3.0.0-alpha.5](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.4...v3.0.0-alpha.5) ### Features diff --git a/package-lock.json b/package-lock.json index 3d5aa7e..1798076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.6", + "version": "3.0.0-alpha.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f46eb73..cae42ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.6", + "version": "3.0.0-alpha.7", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 9d8406574a82cf1a276e6ecc1292ca43477cefeb Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Wed, 24 Jun 2020 17:59:34 +0300 Subject: [PATCH 30/96] Fix default tab selection --- CHANGELOG.md | 3 +++ src/components/tabs/tab-bar.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a55b214..16593cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ # Unreleased +### Bug fixes +* Fix default active tab selection + # [3.0.0-alpha.7](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.6...v3.0.0-alpha.7) ### Features diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 8cceb53..2623f30 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -20,7 +20,7 @@ export const setActiveTab = (value?: string) => { }; export const IonTabBar: FunctionalComponent = (props, { slots }) => { - const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]); + const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]) || undefined; return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); }; From 289b048dcadf3571d5ad5f21d71a3d731317b665 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 27 Jun 2020 21:21:15 +0300 Subject: [PATCH 31/96] Fixes #130 --- CHANGELOG.md | 5 +++++ src/components/router-outlet/index.ts | 32 +++++++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16593cb..ed791c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ # Unreleased +# [3.0.0-alpha.8](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.7...v3.0.0-alpha.8) + +### Features +* Added Keep Alive support to IonRouterView + ### Bug fixes * Fix default active tab selection diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 04c5e9f..c6986ca 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -1,6 +1,8 @@ import { BaseTransitionProps, FunctionalComponent, + KeepAlive, + KeepAliveProps, Transition, h, nextTick, @@ -19,6 +21,7 @@ export interface Props extends JSX.IonRouterOutlet { name?: string; route?: RouteLocationNormalizedLoaded; swipeBack?: boolean; + keepAlive?: KeepAliveProps; } export const IonRouterView: FunctionalComponent = props => { @@ -37,13 +40,15 @@ export const IonRouterView: FunctionalComponent = props => { return; } - enteringEl.value?.classList.add('ion-page', 'ion-page-invisible'); + enteringEl.value.classList.add('ion-page', 'ion-page-invisible'); + enteringEl.value.style.display = ''; const outlet = await ionRouterOutlet.value?.componentOnReady(); return outlet?.commit(enteringEl.value, leavingEl, { deepWait: true, direction: router.direction.value, showGoBack: router.showBackButton.value, + duration: persisted ? 0 : undefined, progressAnimation, }); }; @@ -67,13 +72,13 @@ export const IonRouterView: FunctionalComponent = props => { async onLeave(el, done: any) { await transition(el); - if (!persisted) { await router.saveScroll(el); + done(); + } else { + setTimeout(done, 100); } - setTimeout(done, persisted ? 100 : 0); - inTransition = false; progressAnimation = false; persisted = false; @@ -131,7 +136,6 @@ export const IonRouterView: FunctionalComponent = props => { }, h(RouterView, { name, route }, (...opts: any) => { const { Component, props: componentProps } = opts[0]; - const child = newView.value ? h(newView.value.component, newView.value.props) : Component ? h(Component, componentProps) : null; @@ -140,18 +144,27 @@ export const IonRouterView: FunctionalComponent = props => { newView.value = undefined; } + if (child?.props) { + child.props.class = { + 'can-go-back': !!router.history.state.back, + }; + } + + if (persisted && child) { + nextTick(() => { + (enteringEl.value as any)._leaveCb && (enteringEl.value as any)._leaveCb(); + }); + } + return h( Transition, { css: false, mode: 'in-out', persisted, - class: { - 'can-go-back': !!router.history.state.back, - }, ...transitionHooks, }, - () => child + () => props.keepAlive !== undefined ? h(KeepAlive, props.keepAlive || null, [child]) : child ); }) ); @@ -164,4 +177,5 @@ IonRouterView.props = [ 'animation', 'mode', 'swipeBack', + 'keepAlive', ]; From ed360a742a091416b6a6667f9292ec88e90d85e5 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 27 Jun 2020 21:22:02 +0300 Subject: [PATCH 32/96] [build] 3.0.0-alpha.8 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1798076..68368c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.7", + "version": "3.0.0-alpha.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cae42ef..a992871 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.7", + "version": "3.0.0-alpha.8", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 2a4f9574aac54c4bc0e50a80ba1d6e2b17fac5a8 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 3 Jul 2020 14:01:09 +0300 Subject: [PATCH 33/96] Back button router check --- CHANGELOG.md | 3 +++ src/components/back-button/index.ts | 4 ++-- src/components/tabs/tab.ts | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed791c2..1000fb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ # Unreleased +### Bug fixes +* Allow IonBackButton to be used without router + # [3.0.0-alpha.8](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.7...v3.0.0-alpha.8) ### Features diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts index 5edb56a..f230c55 100644 --- a/src/components/back-button/index.ts +++ b/src/components/back-button/index.ts @@ -12,8 +12,8 @@ export const IonBackButton: FunctionalComponent = ( ...attrs, onClick() { props.defaultHref - ? router.replace(props.defaultHref) - : router.history.go(-1); + ? router?.replace(props.defaultHref) + : router?.history.go(-1); } }); }; diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index c7a24f8..a3b81c4 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -12,7 +12,7 @@ export const IonTab: FunctionalComponent = (props, { slots }) => { let tabNode = tabNodes.value.get(props.tab); let active = tabBarRef.value?.selectedTab === props.tab; const instance = getCurrentInstance()!; - const route = useRoute && useRoute(); + const route = useRoute(); if (tabBarRef.value?.selectedTab === undefined) { tabBarRef.value && (tabBarRef.value.selectedTab = props.tab); From a9be99e13c24d65d295639783a92c88453b4ba3e Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 3 Jul 2020 15:14:42 +0300 Subject: [PATCH 34/96] Fixes #123 --- CHANGELOG.md | 3 + build/rollup.config.js | 7 +- package-lock.json | 454 +---------------------------------- package.json | 1 + src/components/containers.ts | 122 +++++----- src/components/inputs.ts | 23 +- src/components/overlays.ts | 15 +- src/components/tabs/tab.ts | 2 +- src/utils/defineContainer.ts | 9 +- src/utils/defineInput.ts | 17 +- src/utils/defineOverlay.ts | 5 +- 11 files changed, 123 insertions(+), 535 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1000fb9..08de193 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ # Unreleased +### Features +* Improve component props typings and definitions + ### Bug fixes * Allow IonBackButton to be used without router diff --git a/build/rollup.config.js b/build/rollup.config.js index 690906b..5b1b2dd 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -2,6 +2,7 @@ import path from "path"; // import vue from "rollup-plugin-vue"; import { terser } from "rollup-plugin-terser"; import typescript from "rollup-plugin-typescript2"; +import keysTransformer from 'ts-transformer-keys/transformer'; import { version as packageVersion } from "../package.json"; const resolve = _path => path.resolve(__dirname, "../", _path); @@ -55,7 +56,11 @@ function baseConfig() { typescript({ useTsconfigDeclarationDir: true, objectHashIgnoreUnknownHack: false, - clean: true + clean: true, + transformers: [service => ({ + before: [ keysTransformer(service.getProgram()) ], + after: [] + })] }) ] }; diff --git a/package-lock.json b/package-lock.json index 68368c7..5e31ed7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -647,42 +647,11 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", + "dev": true, "requires": { "type-detect": "4.0.8" } }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/formatio": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" - } - }, - "@sinonjs/samsam": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", - "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" - }, "@types/babel__core": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", @@ -780,12 +749,6 @@ "pretty-format": "^25.2.1" } }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, "@types/node": { "version": "14.0.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", @@ -804,19 +767,6 @@ "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", "dev": true }, - "@types/sinon": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.4.tgz", - "integrity": "sha512-sJmb32asJZY6Z2u09bl0G2wglSxDlROlAejCjsnor+LzBMz17gu8IU7vKC/vWDnv9zEq2wqADHVXFjf4eE8Gdw==", - "requires": { - "@types/sinonjs__fake-timers": "*" - } - }, - "@types/sinonjs__fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", - "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==" - }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -945,16 +895,6 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -967,12 +907,6 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -2027,39 +1961,6 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "cacache": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", - "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "move-file": "^2.0.0", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -2162,12 +2063,6 @@ } } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -2197,12 +2092,6 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -2489,7 +2378,8 @@ "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, "diff-sequences": { "version": "25.2.6", @@ -2990,15 +2880,6 @@ "universalify": "^0.1.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3227,18 +3108,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4270,11 +4139,6 @@ "verror": "1.10.0" } }, - "just-extend": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==" - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4345,11 +4209,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4380,23 +4239,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -4505,52 +4347,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", - "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", - "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -4581,15 +4377,6 @@ "minimist": "^1.2.5" } }, - "move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", - "dev": true, - "requires": { - "path-exists": "^4.0.0" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4627,18 +4414,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "nise": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", - "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4840,15 +4615,6 @@ "p-limit": "^2.2.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4903,21 +4669,6 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5023,12 +4774,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -5073,15 +4818,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -5623,15 +5359,6 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5689,35 +5416,6 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "sinon": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", - "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", - "requires": { - "@sinonjs/commons": "^1.7.2", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/formatio": "^5.0.1", - "@sinonjs/samsam": "^5.0.3", - "diff": "^4.0.2", - "nise": "^4.0.1", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -5858,12 +5556,6 @@ } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5968,15 +5660,6 @@ "tweetnacl": "~0.14.0" } }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", @@ -6149,28 +5832,6 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "tar": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", - "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -6192,72 +5853,6 @@ "source-map-support": "~0.5.10" } }, - "terser-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-QeBHLJzKJHCnrPNlZj5EmOF6wwvzpVGDHvTrySIH8+jZEXfcKKCiriRmF6945rKzuZDnkOEU/LDv7qtPiiyP/Q==", - "dev": true, - "requires": { - "cacache": "^15.0.3", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.0.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^3.0.0", - "source-map": "^0.6.1", - "terser": "^4.6.13", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - } - } - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -6411,6 +6006,12 @@ } } }, + "ts-transformer-keys": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ts-transformer-keys/-/ts-transformer-keys-0.4.2.tgz", + "integrity": "sha512-8WVoathKnPIeZbhKuqkBKdWLq1JuiZjT5EmaKobeMI5AHQZIVLI8vyU+1h7e1YiIEIvtBUbmZ12uj2cFbgj5qg==", + "dev": true + }, "tslib": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", @@ -6532,7 +6133,8 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, "type-fest": { "version": "0.8.1", @@ -6595,24 +6197,6 @@ "set-value": "^2.0.1" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -6797,16 +6381,6 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -6955,12 +6529,6 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", diff --git a/package.json b/package.json index a992871..773bba5 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "rollup-plugin-typescript2": "^0.27.0", "ts-jest": "^26.1.0", "ts-loader": "^7.0.5", + "ts-transformer-keys": "^0.4.2", "tslib": "^1.11.2", "tslint": "^6.1.2", "tslint-ionic-rules": "^0.0.21", diff --git a/src/components/containers.ts b/src/components/containers.ts index 02da836..6431d83 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -1,63 +1,63 @@ +import { keys } from 'ts-transformer-keys'; +import { JSX } from '@ionic/core'; import { defineContainer } from '../utils'; -export const IonApp = /*@__PURE__*/defineContainer('ion-app'); -export const IonAvatar = /*@__PURE__*/defineContainer('ion-avatar'); -export const IonBackdrop = /*@__PURE__*/defineContainer('ion-backdrop'); -export const IonBadge = /*@__PURE__*/defineContainer('ion-badge'); -export const IonButton = /*@__PURE__*/defineContainer('ion-button'); -export const IonButtons = /*@__PURE__*/defineContainer('ion-buttons'); -export const IonCard = /*@__PURE__*/defineContainer('ion-card'); -export const IonCardContent = /*@__PURE__*/defineContainer('ion-card-content'); -export const IonCardHeader = /*@__PURE__*/defineContainer('ion-card-header'); -export const IonCardSubtitle = /*@__PURE__*/defineContainer('ion-card-subtitle'); -export const IonCardTitle = /*@__PURE__*/defineContainer('ion-card-title'); -export const IonChip = /*@__PURE__*/defineContainer('ion-chip'); -export const IonCol = /*@__PURE__*/defineContainer('ion-col'); -export const IonContent = /*@__PURE__*/defineContainer('ion-content'); -export const IonFab = /*@__PURE__*/defineContainer('ion-fab'); -export const IonFabButton = /*@__PURE__*/defineContainer('ion-fab-button'); -export const IonFabList = /*@__PURE__*/defineContainer('ion-fab-list'); -export const IonFooter = /*@__PURE__*/defineContainer('ion-footer'); -export const IonGrid = /*@__PURE__*/defineContainer('ion-grid'); -export const IonHeader = /*@__PURE__*/defineContainer('ion-header'); -export const IonImg = /*@__PURE__*/defineContainer('ion-img'); -export const IonInfiniteScroll = /*@__PURE__*/defineContainer('ion-infinite-scroll'); -export const IonInfiniteScrollContent = /*@__PURE__*/defineContainer('ion-infinite-scroll-content'); -export const IonItem = /*@__PURE__*/defineContainer('ion-item'); -export const IonItemDivider = /*@__PURE__*/defineContainer('ion-item-divider'); -export const IonItemGroup = /*@__PURE__*/defineContainer('ion-item-group'); -export const IonItemOption = /*@__PURE__*/defineContainer('ion-item-option'); -export const IonItemOptions = /*@__PURE__*/defineContainer('ion-item-options'); -export const IonItemSliding = /*@__PURE__*/defineContainer('ion-item-sliding'); -export const IonLabel = /*@__PURE__*/defineContainer('ion-label'); -export const IonList = /*@__PURE__*/defineContainer('ion-list'); -export const IonListHeader = /*@__PURE__*/defineContainer('ion-list-header'); -export const IonMenu = /*@__PURE__*/defineContainer('ion-menu'); -export const IonMenuButton = /*@__PURE__*/defineContainer('ion-menu-button'); -export const IonMenuToggle = /*@__PURE__*/defineContainer('ion-menu-toggle'); -export const IonNote = /*@__PURE__*/defineContainer('ion-note'); -export const IonPickerColumn = /*@__PURE__*/defineContainer('ion-picker-column'); -export const IonNav = /*@__PURE__*/defineContainer('ion-nav'); -export const IonProgressBar = /*@__PURE__*/defineContainer('ion-progress-bar'); -export const IonRadioGroup = /*@__PURE__*/defineContainer('ion-radio-group'); -export const IonRefresher = /*@__PURE__*/defineContainer('ion-refresher'); -export const IonRefresherContent = /*@__PURE__*/defineContainer('ion-refresher-content'); -export const IonReorder = /*@__PURE__*/ defineContainer('ion-reorder'); -export const IonReorderGroup = /*@__PURE__*/defineContainer('ion-reorder-group'); -export const IonRippleEffect = /*@__PURE__*/defineContainer('ion-ripple-effect'); -export const IonRouterLink = /*@__PURE__*/defineContainer('ion-router-link'); -export const IonRow = /*@__PURE__*/defineContainer('ion-row'); -export const IonSegment = /*@__PURE__*/defineContainer('ion-segment'); -export const IonSegmentButton = /*@__PURE__*/defineContainer('ion-segment-button'); -export const IonSelectOption = /*@__PURE__*/defineContainer('ion-select-option'); -export const IonSelectPopover = /*@__PURE__*/defineContainer('ion-select-popover'); -export const IonSkeletonText = /*@__PURE__*/defineContainer('ion-skeleton-text'); -export const IonSlide = /*@__PURE__*/defineContainer('ion-slide'); -export const IonSlides = /*@__PURE__*/defineContainer('ion-slides'); -export const IonSpinner = /*@__PURE__*/defineContainer('ion-spinner'); -export const IonSplitPane = /*@__PURE__*/defineContainer('ion-split-pane'); -export const IonText = /*@__PURE__*/defineContainer('ion-text'); -export const IonThumbnail = /*@__PURE__*/defineContainer('ion-thumbnail'); -export const IonTitle = /*@__PURE__*/defineContainer('ion-title'); -export const IonToolbar = /*@__PURE__*/defineContainer('ion-toolbar'); -export const IonVirtualScroll = /*@__PURE__*/defineContainer('ion-virtual-scroll'); +export const IonApp = /*@__PURE__*/defineContainer('ion-app', keys()); +export const IonAvatar = /*@__PURE__*/defineContainer('ion-avatar', keys()); +export const IonBackdrop = /*@__PURE__*/defineContainer('ion-backdrop', keys()); +export const IonBadge = /*@__PURE__*/defineContainer('ion-badge', keys()); +export const IonButton = /*@__PURE__*/defineContainer('ion-button', keys()); +export const IonButtons = /*@__PURE__*/defineContainer('ion-buttons', keys()); +export const IonCard = /*@__PURE__*/defineContainer('ion-card', keys()); +export const IonCardContent = /*@__PURE__*/defineContainer('ion-card-content', keys()); +export const IonCardHeader = /*@__PURE__*/defineContainer('ion-card-header', keys()); +export const IonCardSubtitle = /*@__PURE__*/defineContainer('ion-card-subtitle', keys()); +export const IonCardTitle = /*@__PURE__*/defineContainer('ion-card-title', keys()); +export const IonChip = /*@__PURE__*/defineContainer('ion-chip', keys()); +export const IonCol = /*@__PURE__*/defineContainer('ion-col', keys()); +export const IonContent = /*@__PURE__*/defineContainer('ion-content', keys()); +export const IonFab = /*@__PURE__*/defineContainer('ion-fab', keys()); +export const IonFabButton = /*@__PURE__*/defineContainer('ion-fab-button', keys()); +export const IonFabList = /*@__PURE__*/defineContainer('ion-fab-list', keys()); +export const IonFooter = /*@__PURE__*/defineContainer('ion-footer', keys()); +export const IonGrid = /*@__PURE__*/defineContainer('ion-grid', keys()); +export const IonHeader = /*@__PURE__*/defineContainer('ion-header', keys()); +export const IonImg = /*@__PURE__*/defineContainer('ion-img', keys()); +export const IonInfiniteScroll = /*@__PURE__*/defineContainer('ion-infinite-scroll', keys()); +export const IonInfiniteScrollContent = /*@__PURE__*/defineContainer('ion-infinite-scroll-content', keys()); +export const IonItem = /*@__PURE__*/defineContainer('ion-item', keys()); +export const IonItemDivider = /*@__PURE__*/defineContainer('ion-item-divider', keys()); +export const IonItemGroup = /*@__PURE__*/defineContainer('ion-item-group', keys()); +export const IonItemOption = /*@__PURE__*/defineContainer('ion-item-option', keys()); +export const IonItemOptions = /*@__PURE__*/defineContainer('ion-item-options', keys()); +export const IonItemSliding = /*@__PURE__*/defineContainer('ion-item-sliding', keys()); +export const IonLabel = /*@__PURE__*/defineContainer('ion-label', keys()); +export const IonList = /*@__PURE__*/defineContainer('ion-list', keys()); +export const IonListHeader = /*@__PURE__*/defineContainer('ion-list-header', keys()); +export const IonMenu = /*@__PURE__*/defineContainer('ion-menu', keys()); +export const IonMenuButton = /*@__PURE__*/defineContainer('ion-menu-button', keys()); +export const IonMenuToggle = /*@__PURE__*/defineContainer('ion-menu-toggle', keys()); +export const IonNote = /*@__PURE__*/defineContainer('ion-note', keys()); +export const IonPickerColumn = /*@__PURE__*/defineContainer('ion-picker-column', keys()); +export const IonProgressBar = /*@__PURE__*/defineContainer('ion-progress-bar', keys()); +export const IonRadioGroup = /*@__PURE__*/defineContainer('ion-radio-group', keys()); +export const IonRefresher = /*@__PURE__*/defineContainer('ion-refresher', keys()); +export const IonRefresherContent = /*@__PURE__*/defineContainer('ion-refresher-content', keys()); +export const IonReorder = /*@__PURE__*/ defineContainer('ion-reorder', keys()); +export const IonReorderGroup = /*@__PURE__*/defineContainer('ion-reorder-group', keys()); +export const IonRippleEffect = /*@__PURE__*/defineContainer('ion-ripple-effect', keys()); +export const IonRow = /*@__PURE__*/defineContainer('ion-row', keys()); +export const IonSegment = /*@__PURE__*/defineContainer('ion-segment', keys()); +export const IonSegmentButton = /*@__PURE__*/defineContainer('ion-segment-button', keys()); +export const IonSelectOption = /*@__PURE__*/defineContainer('ion-select-option', keys()); +export const IonSelectPopover = /*@__PURE__*/defineContainer('ion-select-popover', keys()); +export const IonSkeletonText = /*@__PURE__*/defineContainer('ion-skeleton-text', keys()); +export const IonSlide = /*@__PURE__*/defineContainer('ion-slide', keys()); +export const IonSlides = /*@__PURE__*/defineContainer('ion-slides', keys()); +export const IonSpinner = /*@__PURE__*/defineContainer('ion-spinner', keys()); +export const IonSplitPane = /*@__PURE__*/defineContainer('ion-split-pane', keys()); +export const IonText = /*@__PURE__*/defineContainer('ion-text', keys()); +export const IonThumbnail = /*@__PURE__*/defineContainer('ion-thumbnail', keys()); +export const IonTitle = /*@__PURE__*/defineContainer('ion-title', keys()); +export const IonToolbar = /*@__PURE__*/defineContainer('ion-toolbar', keys()); +export const IonVirtualScroll = /*@__PURE__*/defineContainer('ion-virtual-scroll', keys()); diff --git a/src/components/inputs.ts b/src/components/inputs.ts index 1cd4bc5..0feb43c 100644 --- a/src/components/inputs.ts +++ b/src/components/inputs.ts @@ -1,25 +1,30 @@ +import { keys } from 'ts-transformer-keys'; +import { JSX } from '@ionic/core'; import { defineInput } from '../utils'; -export const IonCheckbox = /*@__PURE__*/defineInput( +export const IonCheckbox = /*@__PURE__*/defineInput( 'IonCheckbox', 'ion-checkbox', + keys(), 'onIonChange', 'checked' ); -export const IonDatetime = /*@__PURE__*/defineInput('IonDatetime', 'ion-datetime'); -export const IonInput = /*@__PURE__*/defineInput('IonInput', 'ion-input', 'onIonInput'); -export const IonRadio = /*@__PURE__*/defineInput('IonRadio', 'ion-radio', 'onIonSelect'); -export const IonRange = /*@__PURE__*/defineInput('IonRange', 'ion-range'); -export const IonSearchbar = /*@__PURE__*/defineInput( +export const IonDatetime = /*@__PURE__*/defineInput('IonDatetime', 'ion-datetime', keys()); +export const IonInput = /*@__PURE__*/defineInput('IonInput', 'ion-input', keys(), 'onIonInput'); +export const IonRadio = /*@__PURE__*/defineInput('IonRadio', 'ion-radio', keys(), 'onIonSelect'); +export const IonRange = /*@__PURE__*/defineInput('IonRange', 'ion-range', keys()); +export const IonSearchbar = /*@__PURE__*/defineInput( 'IonSearchbar', 'ion-searchbar', + keys(), 'onIonInput' ); -export const IonSelect = /*@__PURE__*/defineInput('IonSelect', 'ion-select'); -export const IonTextarea = /*@__PURE__*/defineInput('IonTextarea', 'ion-textarea'); -export const IonToggle = /*@__PURE__*/defineInput( +export const IonSelect = /*@__PURE__*/defineInput('IonSelect', 'ion-select', keys()); +export const IonTextarea = /*@__PURE__*/defineInput('IonTextarea', 'ion-textarea', keys()); +export const IonToggle = /*@__PURE__*/defineInput( 'IonToggle', 'ion-toggle', + keys(), 'onIonChange', 'checked' ); diff --git a/src/components/overlays.ts b/src/components/overlays.ts index 7cc9eb8..fc7897d 100644 --- a/src/components/overlays.ts +++ b/src/components/overlays.ts @@ -4,21 +4,28 @@ import { PopoverOptions, actionSheetController, modalController, - popoverController + popoverController, } from '@ionic/core'; +import { keys } from 'ts-transformer-keys'; import { OverlayType, defineOverlay } from '../utils'; export const IonModal = /*@__PURE__*/defineOverlay( OverlayType.Modal, - modalController + modalController, + keys>(), ); export const IonActionSheet = /*@__PURE__*/defineOverlay< HTMLIonActionSheetElement, ActionSheetOptions ->(OverlayType.ActionSheet, actionSheetController); +>( + OverlayType.ActionSheet, + actionSheetController, + keys(), +); export const IonPopover = /*@__PURE__*/defineOverlay( OverlayType.Popover, - popoverController + popoverController, + keys>(), ); diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index a3b81c4..200c509 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -8,7 +8,7 @@ const name = 'ion-tab'; const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; const refs: { [key: string]: Ref } = {}; -export const IonTab: FunctionalComponent = (props, { slots }) => { +export const IonTab: FunctionalComponent> = (props, { slots }) => { let tabNode = tabNodes.value.get(props.tab); let active = tabBarRef.value?.selectedTab === props.tab; const instance = getCurrentInstance()!; diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index 66efcb9..da8e1c9 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -1,14 +1,11 @@ import { FunctionalComponent, h } from 'vue'; -type Data = { - [key: string]: unknown; -}; - -export const defineContainer = (name: string) => { - const Container: FunctionalComponent = (props, { slots }) => +export const defineContainer = (name: string, componentProps: string[]) => { + const Container: FunctionalComponent = (props, { slots }) => h(name, props, slots.default && slots.default()); Container.displayName = name; + Container.props = componentProps; return Container; }; diff --git a/src/utils/defineInput.ts b/src/utils/defineInput.ts index 489724f..1516a6e 100644 --- a/src/utils/defineInput.ts +++ b/src/utils/defineInput.ts @@ -1,8 +1,7 @@ import { FunctionalComponent, h } from 'vue'; -export interface InputProps { +export interface InputProps extends Object { modelValue: string | boolean; - [key: string]: unknown; } export enum InputEvents { @@ -12,21 +11,23 @@ export enum InputEvents { // @TODO // remove replace() when Vue supports camelCase events that Ionic uses // camelCase attributes don't work either -export function defineInput( +export function defineInput( name: string, ionTag: string, + componentProps: string[], updateEvent = 'onIonChange', modelProp = 'value' ) { - const Input: FunctionalComponent = ( + const Input: FunctionalComponent = ( props, - { attrs, slots, emit } + { slots, emit } ) => { + const { modelValue, ...restOfProps } = props; return h( ionTag, { - ...attrs, - [modelProp]: props.modelValue, + ...restOfProps, + [modelProp]: modelValue, [updateEvent.replace('Ion', '')]: (e: Event) => emit(InputEvents.onUpdate, (e?.target as any)[modelProp]) }, @@ -35,7 +36,7 @@ export function defineInput( }; Input.displayName = name; - Input.props = [modelProp, 'modelValue']; + Input.props = [modelProp, 'modelValue', ...componentProps]; Input.emits = [InputEvents.onUpdate]; return Input; diff --git a/src/utils/defineOverlay.ts b/src/utils/defineOverlay.ts index 0949348..d66ecd0 100644 --- a/src/utils/defineOverlay.ts +++ b/src/utils/defineOverlay.ts @@ -35,7 +35,8 @@ export enum OverlayType { export function defineOverlay( name: OverlayType, - controller: OverlayController + controller: OverlayController, + componentProps: string[] ) { const overlay = ref(); const content = ref(); @@ -84,7 +85,7 @@ export function defineOverlay( Overlay.displayName = name; Overlay.inheritAttrs = false; - Overlay.props = ['isOpen', 'modelValue']; + Overlay.props = ['isOpen', 'modelValue', ...componentProps]; Overlay.emits = [ OverlayEvents.onUpdate, OverlayEvents.onWillPresent, From 3d046532d0d73765b7dc506a95b988805a8d48e5 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 3 Jul 2020 15:19:28 +0300 Subject: [PATCH 35/96] Bump deps --- package-lock.json | 164 +++++++++++++++++++++++----------------------- package.json | 18 ++--- 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e31ed7..83070f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -354,11 +354,11 @@ } }, "@ionic/core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.1.0.tgz", - "integrity": "sha512-L3Ps+0B0SqHlArMxPqgzmgtCs2D/cmgWw7rIDsOclh21igXZ9957kRR4BO7hzaXLbBIKjG1IzK2TAcX0uC94Sw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.2.3.tgz", + "integrity": "sha512-EUGicoQfWZV9//sstNkssFxvSaM7zXIG2EbOZVKX+2l7sWkUC39lO9CBZoMyafSppEZT1hMsY1R3coVkGQefEg==", "requires": { - "ionicons": "^5.0.1", + "ionicons": "^5.1.2", "tslib": "^1.10.0" } }, @@ -625,22 +625,14 @@ } }, "@rollup/pluginutils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.9.tgz", - "integrity": "sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", - "micromatch": "^4.0.2" - }, - "dependencies": { - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - } + "picomatch": "^2.2.2" } }, "@sinonjs/commons": { @@ -750,9 +742,9 @@ } }, "@types/node": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", - "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==", + "version": "14.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", + "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", "dev": true }, "@types/normalize-package-data": { @@ -789,62 +781,69 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.15.tgz", - "integrity": "sha512-NLNW7tAMHl8ybRgTPTIWLsi8aXHbFngY2x95eEHAdxhNasTY5NsgmQBBH9TBAUQEn6Wo8ybmuvQoNzgcw979Zg==", + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.18.tgz", + "integrity": "sha512-3JSSCs11lYuNdfyT5DVB06OeWlT/aAK8JKHLmG8OsXkT0flVSc19mtnqi+EaFhW3rT63qT0fjJfTfU0Wn1PN9Q==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.15", + "@vue/shared": "3.0.0-beta.18", "estree-walker": "^0.8.1", "source-map": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.8.1.tgz", + "integrity": "sha512-H6cJORkqvrNziu0KX2hqOMAlA2CiuAxHeGJXSIoKA/KLv229Dw806J3II6mKTm5xiDX1At1EXCfsOQPB+tMB+g==" + } } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.15.tgz", - "integrity": "sha512-0qVaCosZ6XrkmlSOndGlNh33JQ2oao82uWxC/qw4QWBGm6a1DcKkZFIZFYLQWg5ZIcSrEQrR1VzUidBaZw9AIg==", + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.18.tgz", + "integrity": "sha512-vTfZNfn/bfGVJCdQwQN5xeBIaFCYPKp/NZCyMewh0wdju2ewzSmQIzG3gaSqEIxYor/FQmFkGuRRzWJJBmcoUQ==", "requires": { - "@vue/compiler-core": "3.0.0-beta.15", - "@vue/shared": "3.0.0-beta.15" + "@vue/compiler-core": "3.0.0-beta.18", + "@vue/shared": "3.0.0-beta.18" } }, "@vue/reactivity": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.15.tgz", - "integrity": "sha512-Xa0LG8RTNlPYsuqOBhhV03xKhMmuSU0vtKXoIi1yxp9gGU7ga/TMmnhELb66AiupiXdLJwRcdv00KhPF/2y0dA==", + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.18.tgz", + "integrity": "sha512-UFKONXh5XZCwynGrS6CAYTz3AoNVmLUpuQnfl3z8XbHulw9kqVwFoQgXwFBlrizdLsPoNW0s3FHPmtqC9Ohjgg==", "requires": { - "@vue/shared": "3.0.0-beta.15" + "@vue/shared": "3.0.0-beta.18" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.15.tgz", - "integrity": "sha512-jDkqSs1hsS9fRCgzah7VINafxWj7bYoDyweVuBqm6KPcHRfGkRZZxl2NltbbVaLH76Qvm4PPSnqGgEx7QtFSgg==", + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.18.tgz", + "integrity": "sha512-ZgIxCSuR1luq3pmWQbsYkn6ybUK/BKAWRQwAxUCP9BjFHnvN0W4BSLwy6VuH2l2ToKGni+xPxpDZhQQQsVAfng==", "requires": { - "@vue/reactivity": "3.0.0-beta.15", - "@vue/shared": "3.0.0-beta.15" + "@vue/reactivity": "3.0.0-beta.18", + "@vue/shared": "3.0.0-beta.18" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.15.tgz", - "integrity": "sha512-161rUw1sWfbv51Ua8gKXaPc+seRJQcV+MLokTJtqYtNCajya0Mx6vdXJajBWqjDT8/Udx0sb7Wm/K/0DfGBUTw==", + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.18.tgz", + "integrity": "sha512-2ym4EyWg1C/UDXuVjFyqwLgAjrWRTRM3wHBmp0TlpoXSSNvIEJg5HXRgC1jnHtkVbGmyHHPndsbFP+oBj10tzQ==", "requires": { - "@vue/runtime-core": "3.0.0-beta.15", - "@vue/shared": "3.0.0-beta.15", + "@vue/runtime-core": "3.0.0-beta.18", + "@vue/shared": "3.0.0-beta.18", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.15.tgz", - "integrity": "sha512-wViILT5GgxMtnXVQ1xupj43wvnZ41g3NLWaBObs7l+eTxz5vq5yx72qH6HRpsfhR2Mg39jE0cfNLFEpC4lJIUQ==" + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.18.tgz", + "integrity": "sha512-wRvQaTHeCt3xxqj3UpMR2JxkkU7ul/9RMqSxGJhOd4Bsp72Md4H83XkijHy8LkPKZWszmxjEpfCYuw9MU0a4kg==" }, "@vue/test-utils": { - "version": "2.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.6.tgz", - "integrity": "sha512-7GaFJve/ljFBzZxhJstg53TlWIZ1hDVHHQnoSbcI32YYkmzZv1rFyMta6hQIAiH+Sel7P9XVfIvb8DTY5u9wEw==", + "version": "2.0.0-alpha.8", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.8.tgz", + "integrity": "sha512-T2S1Op2mKdF0DmQNiGLZDZHI86Ny1hvl+ApxGUEPVydMqqz5mTFHlbW89+MsKik5cQ3ikSA1hZj0y817IqAPvw==", "dev": true }, "abab": { @@ -2265,9 +2264,9 @@ } }, "csstype": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", - "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.11.tgz", + "integrity": "sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw==" }, "dashdash": { "version": "1.14.1", @@ -2530,9 +2529,10 @@ "dev": true }, "estree-walker": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.8.1.tgz", - "integrity": "sha512-H6cJORkqvrNziu0KX2hqOMAlA2CiuAxHeGJXSIoKA/KLv229Dw806J3II6mKTm5xiDX1At1EXCfsOQPB+tMB+g==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true }, "esutils": { "version": "2.0.3", @@ -3134,9 +3134,9 @@ } }, "ionicons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.0.1.tgz", - "integrity": "sha512-P9GHr7pgCJcG211W0wute49NZ9AvJZvFJf4OwYybakjX6j7tu0q5t5HNWn9bcb9YjI7SxBblJg8iqQ1Yb59DXw==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.1.2.tgz", + "integrity": "sha512-zO7ZgbBbXhpA7cXO2rDzTNdcCqErjg1Sprq/ossTvaiV0MriOjRE7JO3EGvYjDTPzF9YALGpvLXqCgsRT0tprA==" }, "ip-regex": { "version": "2.1.0", @@ -5130,16 +5130,16 @@ } }, "rollup-plugin-typescript2": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.0.tgz", - "integrity": "sha512-SRKG/Canve3cxBsqhY1apIBznqnX9X/WU3Lrq3XSwmTmFqccj3+//logLXFEmp+PYFNllSVng+f4zjqRTPKNkA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.1.tgz", + "integrity": "sha512-RJl77Bbj1EunAQDC3dK/O2HWuSUX3oJbRGzyLoS5o9W4Hs1Nix3Gavqj1Lzs5Y6Ff4H2xXfmZ1WWUQCYocSbzQ==", "dev": true, "requires": { "@rollup/pluginutils": "^3.0.8", "find-cache-dir": "^3.3.1", "fs-extra": "8.1.0", "resolve": "1.15.1", - "tslib": "1.11.1" + "tslib": "1.11.2" }, "dependencies": { "resolve": { @@ -5152,9 +5152,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", "dev": true } } @@ -5943,9 +5943,9 @@ } }, "ts-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.0.tgz", - "integrity": "sha512-JbhQdyDMYN5nfKXaAwCIyaWLGwevcT2/dbqRPsQeh6NZPUuXjZQZEfeLb75tz0ubCIgEELNm6xAzTe5NXs5Y4Q==", + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.1.tgz", + "integrity": "sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A==", "dev": true, "requires": { "bs-logger": "0.x", @@ -6013,9 +6013,9 @@ "dev": true }, "tslib": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", - "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" }, "tslint": { "version": "6.1.2", @@ -6152,9 +6152,9 @@ } }, "typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", + "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -6317,13 +6317,13 @@ } }, "vue": { - "version": "3.0.0-beta.15", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.15.tgz", - "integrity": "sha512-KTmvfNpkvD6mao8vloqjUMjrHEivS1HZvHmYeHPRHqU2HRvNcrZuwXYvETt3dGOTu0Oj7zAWQXP+uZ34CW75sw==", + "version": "3.0.0-beta.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.18.tgz", + "integrity": "sha512-waevph9s+M/aBf4XJIjfwHlHH7SBEr29dTMqq6ymnp/qJQHsavLlQHjsWRcxkYJ5rKfM6omoW+G6EBRBDB05sA==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.15", - "@vue/runtime-dom": "3.0.0-beta.15", - "@vue/shared": "3.0.0-beta.15" + "@vue/compiler-dom": "3.0.0-beta.18", + "@vue/runtime-dom": "3.0.0-beta.18", + "@vue/shared": "3.0.0-beta.18" } }, "vue-class-component": { @@ -6342,9 +6342,9 @@ } }, "vue-router": { - "version": "4.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-alpha.12.tgz", - "integrity": "sha512-TJhbWHPZS1v259PKlZf+ljSob0U2RUii3HXQgrcFXsNmeWuqEYEh6trswHHr4+MQdXxHgonyYK28qhBjNhORkA==" + "version": "4.0.0-beta.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.1.tgz", + "integrity": "sha512-byqdBiKISN9Qrse6A0fgR6tePQNwlAdx+wBgO2x08MEn6hy8ds19uKvosfruVjw5vhpFmjvGR15Z68an+7fRAQ==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index 773bba5..03788cd 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,8 @@ }, "devDependencies": { "@types/jest": "^25.2.3", - "@types/node": "^14.0.5", - "@vue/test-utils": "^2.0.0-alpha.6", + "@types/node": "^14.0.14", + "@vue/test-utils": "^2.0.0-alpha.8", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", "jest": "^25.5.4", @@ -68,19 +68,19 @@ "rollup": "^0.62.0", "rollup-plugin-buble": "^0.19.2", "rollup-plugin-terser": "^1.0.1", - "rollup-plugin-typescript2": "^0.27.0", - "ts-jest": "^26.1.0", + "rollup-plugin-typescript2": "^0.27.1", + "ts-jest": "^26.1.1", "ts-loader": "^7.0.5", "ts-transformer-keys": "^0.4.2", - "tslib": "^1.11.2", + "tslib": "^1.13.0", "tslint": "^6.1.2", "tslint-ionic-rules": "^0.0.21", - "typescript": "^3.9.3" + "typescript": "^3.9.6" }, "dependencies": { - "@ionic/core": "^5.1.0", - "vue": "^3.0.0-beta.15", - "vue-router": "^4.0.0-alpha.12" + "@ionic/core": "^5.2.3", + "vue": "^3.0.0-beta.18", + "vue-router": "^4.0.0-beta.1" }, "jestSonar": { "reportPath": "reports", From 26a8b23e6010ca9771f806f34210f6ab427b531b Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 3 Jul 2020 15:48:12 +0300 Subject: [PATCH 36/96] Cleanup --- src/components/back-button/index.ts | 8 ++------ src/router.ts | 1 + 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts index f230c55..e482bd5 100644 --- a/src/components/back-button/index.ts +++ b/src/components/back-button/index.ts @@ -2,14 +2,10 @@ import { FunctionalComponent, h } from 'vue'; import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; -export const IonBackButton: FunctionalComponent = ( - props, - { attrs } -) => { +export const IonBackButton: FunctionalComponent = props => { const router = useRouter(); return h('ion-back-button', { - ...props, - ...attrs, + props, onClick() { props.defaultHref ? router?.replace(props.defaultHref) diff --git a/src/router.ts b/src/router.ts index e782fdc..7c1840e 100644 --- a/src/router.ts +++ b/src/router.ts @@ -13,6 +13,7 @@ enum Direction { declare module 'vue-router' { interface Router { + history: RouterHistory; direction: Ref; showBackButton: Ref; saveScroll: (el: HTMLElement) => Promise; From 9685e90f6eafcd1ed6aa2917528d9f10ac86c1a0 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 3 Jul 2020 16:22:04 +0300 Subject: [PATCH 37/96] Implement vue-router@beta.1 updates --- src/components/router-outlet/index.ts | 19 ++++++++++--------- src/router.ts | 5 +++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index c6986ca..bb78a50 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -62,15 +62,15 @@ export const IonRouterView: FunctionalComponent = props => { await router.restoreScroll( el, progressAnimation - ? (router.history.state.back as any).fullPath - : router.currentRoute.value.fullPath + ? router.history.state.back as any + : router.currentRoute.value ); } done(); }, - async onLeave(el, done: any) { + async onLeave(el, done) { await transition(el); if (!persisted) { await router.saveScroll(el); @@ -109,21 +109,21 @@ export const IonRouterView: FunctionalComponent = props => { router.direction.value = 'back'; const prevRoute = router.getRoutes().find(r => { - return r.path === (router.history.state.back as any).fullPath; + return r.path === router.history.state.back as any; }) as RouteRecordNormalized; - newView.value = { + newView.value = prevRoute && { component: prevRoute?.components[props.name || 'default'], props: prevRoute?.props, }; }, - onEnd(shouldComplete: any) { + onEnd(shouldComplete: boolean) { inTransition = false; if (shouldComplete) { nextTick(() => { persisted = false; - router.history.go(-1); + router.go(-1); }); return; } @@ -140,7 +140,7 @@ export const IonRouterView: FunctionalComponent = props => { ? h(newView.value.component, newView.value.props) : Component ? h(Component, componentProps) : null; - if (newView.value?.component === Component) { + if (newView.value?.component === Component.type) { newView.value = undefined; } @@ -152,7 +152,8 @@ export const IonRouterView: FunctionalComponent = props => { if (persisted && child) { nextTick(() => { - (enteringEl.value as any)._leaveCb && (enteringEl.value as any)._leaveCb(); + const leaveCb = (enteringEl.value as any)._leaveCb; + leaveCb && leaveCb(); }); } diff --git a/src/router.ts b/src/router.ts index 7c1840e..6dae1c1 100644 --- a/src/router.ts +++ b/src/router.ts @@ -29,6 +29,7 @@ export const createRouter = (opts: RouterOptions): Router => { const router = { ...createVueRouter(opts), + history: opts.history, direction, showBackButton, }; @@ -59,8 +60,8 @@ export const createRouter = (opts: RouterOptions): Router => { const scrollElement = ionContent && (await ionContent.getScrollElement()); const prevRoute = router.history.state.back as any; - if (scrollElement && prevRoute?.fullPath) { - scroll.set(prevRoute.fullPath, { + if (scrollElement && prevRoute) { + scroll.set(prevRoute, { top: scrollElement?.scrollTop || 0, left: scrollElement?.scrollLeft || 0, }); From 96cefc1afe0f4dab349c5c0c338f572e631aea5a Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 7 Jul 2020 20:46:45 +0300 Subject: [PATCH 38/96] Fixes #132 --- CHANGELOG.md | 3 +++ src/router.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08de193..30fceba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,14 @@ # Unreleased +# [3.0.0-alpha.9](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.8...v3.0.0-alpha.9) + ### Features * Improve component props typings and definitions ### Bug fixes * Allow IonBackButton to be used without router +* Fix IonContent scoll element evaluating to false # [3.0.0-alpha.8](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.7...v3.0.0-alpha.8) diff --git a/src/router.ts b/src/router.ts index 6dae1c1..10a3816 100644 --- a/src/router.ts +++ b/src/router.ts @@ -70,7 +70,7 @@ export const createRouter = (opts: RouterOptions): Router => { router.restoreScroll = async (el, key) => { const ionContent = el.querySelector('ion-content'); - const scrollElement = ionContent && (await ionContent.getScrollElement()); + const scrollElement = ionContent && (await ionContent.getScrollElement()) || undefined; scrollElement?.scrollTo( scroll.get(key) || { top: 0, From 3d2f749da522a0bae13d96abb4acc4dc8baf056e Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 7 Jul 2020 20:47:30 +0300 Subject: [PATCH 39/96] [build] 3.0.0-alpha.9 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 83070f4..b645d02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.8", + "version": "3.0.0-alpha.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 03788cd..a963d36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.8", + "version": "3.0.0-alpha.9", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 98f82e852fb4a1516d60d7119ac408bed62cd7da Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Thu, 9 Jul 2020 12:12:35 +0300 Subject: [PATCH 40/96] Fixes #131 --- src/components/tabs/tab-bar.ts | 6 +++--- src/components/tabs/tab-button.ts | 16 ++++++++++++---- src/components/tabs/tab.ts | 8 ++++---- src/components/tabs/tabs.ts | 21 +++++++++++++++++---- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 2623f30..fafd0e9 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -1,5 +1,5 @@ import { FunctionalComponent, h, ref } from 'vue'; -import { tabNodes } from './tabs'; +import { tabNodesRef } from './tabs'; import { JSX } from '@ionic/core'; const name = 'ion-tab-bar'; @@ -13,14 +13,14 @@ const componentProps: (keyof JSX.IonTabBar)[] = [ export const tabBarRef = ref(); export const setActiveTab = (value?: string) => { - tabNodes.value.forEach((tab, tabName) => { + tabNodesRef.value.forEach((tab, tabName) => { // already unref-ed thus casting tab.ref && ((tab.ref as unknown as HTMLIonTabElement).active = tabName === value); }); }; export const IonTabBar: FunctionalComponent = (props, { slots }) => { - const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodes?.value.size && tabNodes.value.entries().next().value[0]) || undefined; + const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodesRef?.value.size && tabNodesRef.value.entries().next().value[0]) || undefined; return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); }; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index e6b3e8a..21a0a54 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -1,6 +1,6 @@ import { FunctionalComponent, h } from 'vue'; import { JSX } from '@ionic/core'; -import { tabNodes } from './tabs'; +import { tabNodesRef, tabsRef } from './tabs'; import { setActiveTab, tabBarRef } from './tab-bar'; import { useRouter } from 'vue-router'; @@ -21,15 +21,23 @@ export const IonTabButton: FunctionalComponent = (props, { slo const router = useRouter(); const onClick = async () => { + console.log('clicl', tabsRef.value?.onIonTabsWillChange); + if (tabsRef.value && tabsRef.value.onIonTabsWillChange && props.tab) { + tabsRef.value.onIonTabsWillChange(new CustomEvent('ionTabWillChange', { detail: { tab: props.tab } })); + } + tabBarRef.value && (tabBarRef.value.selectedTab = props?.tab); if (props.tab && props.href && router) { - const location = tabNodes.value.get(props.tab)?.location || props.href; + const location = tabNodesRef.value.get(props.tab)?.location || props.href; location && router.push(router.currentRoute.value.fullPath === location ? props.href : location); - return; + } else { + setActiveTab(tabBarRef.value?.selectedTab); } - setActiveTab(tabBarRef.value?.selectedTab); + if (tabsRef.value && tabsRef.value.onIonTabsDidChange && props.tab) { + tabsRef.value.onIonTabsDidChange(new CustomEvent('ionTabDidChange', { detail: { tab: props.tab } })); + } }; return h(name, { ...props, onClick }, slots.default && slots.default()); diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index 200c509..b2df3c2 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -1,7 +1,7 @@ import { FunctionalComponent, Ref, getCurrentInstance, h, onActivated, ref } from 'vue'; import { useRoute } from 'vue-router'; import { JSX } from '@ionic/core'; -import { tabNodes } from './tabs'; +import { tabNodesRef } from './tabs'; import { tabBarRef } from './tab-bar'; const name = 'ion-tab'; @@ -9,7 +9,7 @@ const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; const refs: { [key: string]: Ref } = {}; export const IonTab: FunctionalComponent> = (props, { slots }) => { - let tabNode = tabNodes.value.get(props.tab); + let tabNode = tabNodesRef.value.get(props.tab); let active = tabBarRef.value?.selectedTab === props.tab; const instance = getCurrentInstance()!; const route = useRoute(); @@ -21,9 +21,9 @@ export const IonTab: FunctionalComponent> = (props if (!tabNode) { refs[props.tab] = ref(); - tabNodes.value.set(props.tab, { ref: refs[props.tab] }); + tabNodesRef.value.set(props.tab, { ref: refs[props.tab] }); } - tabNode = tabNodes.value.get(props.tab)!; + tabNode = tabNodesRef.value.get(props.tab)!; // Only add Lifecycle.ACTIVATE hooks once // @ts-ignore diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts index 5f57e28..e079f51 100644 --- a/src/components/tabs/tabs.ts +++ b/src/components/tabs/tabs.ts @@ -1,4 +1,5 @@ -import { FunctionalComponent, Ref, h, ref } from 'vue'; +import { FunctionalComponent, Ref, VNode, h, ref } from 'vue'; +import { JSX } from '@ionic/core'; // CSS for ion-tabs inner and outer elements const hostStyles = { @@ -25,10 +26,21 @@ export interface Tab { location?: string; } -export const tabNodes = ref>(new Map()); +export const tabNodesRef = ref>(new Map()); +export const tabsRef = ref(); -export const IonTabs: FunctionalComponent = (props, { slots }) => { - return h('div', { ...props, style: hostStyles }, [ +export const IonTabs: FunctionalComponent = (props, { slots }) => { + const { onIonTabsWillChange, onIonTabsDidChange, ...restProps } = props; + + // @TODO remove when Vue3 allows for camelCase props and events + const onVnodeMounted = ({ el }: VNode) => { + if (el) { + el.onIonTabsDidChange = onIonTabsDidChange; + el.onIonTabsWillChange = onIonTabsWillChange; + } + }; + + return h('div', { ...restProps, onVnodeMounted, style: hostStyles, ref: tabsRef }, [ slots.top && slots.top(), h('div', { class: 'tabs-inner', style: innerStyles }, slots.default && slots.default()), slots.bottom && slots.bottom(), @@ -36,3 +48,4 @@ export const IonTabs: FunctionalComponent = (props, { slots }) => { }; IonTabs.displayName = 'ion-tabs'; +IonTabs.emits = ['onIonTabsWillChange', 'onIonTabsDidChange']; From 7b9df4056299e61c29517230dd829127fb218195 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Thu, 9 Jul 2020 12:20:42 +0300 Subject: [PATCH 41/96] Update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30fceba..ecb8371 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ ### KNOWN ISSUES * Some Ionic events and attributes do not work due to their camelCase naming (upstream Vue 3 issue) -* Routing related attributes on Ionic components are not yet supported # Unreleased +### Features +* Added onIonTabsDidChange and onIonTabsWillChange events to IonTabs component + # [3.0.0-alpha.9](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.8...v3.0.0-alpha.9) ### Features From d2a41976454a5e40594cb6571222e4213c1467ba Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 10 Jul 2020 19:15:50 +0300 Subject: [PATCH 42/96] input component improvements --- CHANGELOG.md | 5 ++++- src/utils/defineInput.ts | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecb8371..d607876 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,14 @@ ### KNOWN ISSUES -* Some Ionic events and attributes do not work due to their camelCase naming (upstream Vue 3 issue) # Unreleased ### Features * Added onIonTabsDidChange and onIonTabsWillChange events to IonTabs component +### Bug fixes +* Fix ionic input events not firing (i.e. IonSelect's @ionChange) +* Fix ionic input value not being set when used without v-model (i.e. ) + # [3.0.0-alpha.9](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.8...v3.0.0-alpha.9) ### Features diff --git a/src/utils/defineInput.ts b/src/utils/defineInput.ts index 1516a6e..5829a6b 100644 --- a/src/utils/defineInput.ts +++ b/src/utils/defineInput.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, h } from 'vue'; +import { FunctionalComponent, VNode, h } from 'vue'; export interface InputProps extends Object { modelValue: string | boolean; @@ -23,13 +23,26 @@ export function defineInput( { slots, emit } ) => { const { modelValue, ...restOfProps } = props; + + // @TODO hack to support CamelCase Ionic events + const onVnodeBeforeMount = (vnode: VNode) => { + if (vnode.el) { + vnode.el.addEventListener(updateEvent.replace('onIon', 'ion'), (e: Event) => { + emit(InputEvents.onUpdate, (e?.target as any)[modelProp]); + }); + for (const [key, prop] of Object.entries(props)) { + if (key.startsWith('onIon')) { + vnode.el.addEventListener(key.replace('onIon', 'ion'), prop); + } + } + } + }; return h( ionTag, { ...restOfProps, - [modelProp]: modelValue, - [updateEvent.replace('Ion', '')]: (e: Event) => - emit(InputEvents.onUpdate, (e?.target as any)[modelProp]) + onVnodeBeforeMount, + [modelProp]: props.hasOwnProperty('modelValue') ? modelValue : (props as any)[modelProp], }, slots.default && slots.default() ); From ba94c96b19a8c9627ab3f4ad3b2498f293530a77 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 10 Jul 2020 19:17:52 +0300 Subject: [PATCH 43/96] [build] 3.0.0-alpha.10 --- CHANGELOG.md | 2 ++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d607876..b5a3a85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ # Unreleased +# [3.0.0-alpha.10](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.9...v3.0.0-alpha.10) + ### Features * Added onIonTabsDidChange and onIonTabsWillChange events to IonTabs component diff --git a/package-lock.json b/package-lock.json index b645d02..822d308 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.9", + "version": "3.0.0-alpha.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a963d36..a43669e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.9", + "version": "3.0.0-alpha.10", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 2f4289f00e5bb567b00293094e30bbe539396c0a Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 10 Jul 2020 19:40:39 +0300 Subject: [PATCH 44/96] Update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a3a85..e1ee5f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -### KNOWN ISSUES +# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.10...dev) -# Unreleased +--- # [3.0.0-alpha.10](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.9...v3.0.0-alpha.10) From 789c26690a6fd2dc05b39075f3ef862d9e24acd8 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 10 Jul 2020 19:44:48 +0300 Subject: [PATCH 45/96] Update vue and vue-router to latest --- package-lock.json | 70 +++++++++++++++++++++++------------------------ package.json | 4 +-- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 822d308..02041e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -781,13 +781,13 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.18.tgz", - "integrity": "sha512-3JSSCs11lYuNdfyT5DVB06OeWlT/aAK8JKHLmG8OsXkT0flVSc19mtnqi+EaFhW3rT63qT0fjJfTfU0Wn1PN9Q==", + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.20.tgz", + "integrity": "sha512-ZMMMD4GMZXrwJFBzdn3v+VcrrGofqrP7gfJ5ie/3p2sIEVAfsI0qwIb/DCezWt/Cm3viMJiTpv4SINPGK4xM8Q==", "requires": { "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.18", + "@vue/shared": "3.0.0-beta.20", "estree-walker": "^0.8.1", "source-map": "^0.6.1" }, @@ -800,45 +800,45 @@ } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.18.tgz", - "integrity": "sha512-vTfZNfn/bfGVJCdQwQN5xeBIaFCYPKp/NZCyMewh0wdju2ewzSmQIzG3gaSqEIxYor/FQmFkGuRRzWJJBmcoUQ==", + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.20.tgz", + "integrity": "sha512-vtkvL8OOcIMdZn8oLKTVRqKLcpRBivhR6xz2sS8mfRA+NNh+QDpBFip5Zjl//FD6mRvv2wiJoWWqe0MgXUChbg==", "requires": { - "@vue/compiler-core": "3.0.0-beta.18", - "@vue/shared": "3.0.0-beta.18" + "@vue/compiler-core": "3.0.0-beta.20", + "@vue/shared": "3.0.0-beta.20" } }, "@vue/reactivity": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.18.tgz", - "integrity": "sha512-UFKONXh5XZCwynGrS6CAYTz3AoNVmLUpuQnfl3z8XbHulw9kqVwFoQgXwFBlrizdLsPoNW0s3FHPmtqC9Ohjgg==", + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.20.tgz", + "integrity": "sha512-X59+ZENE1sFRW56vcyb3eTGwqGwRpBJIkau0/NMv86hBbtWUigG4+r4thoCNKQAX3iyMQBlk5dQvxUxopjn5pg==", "requires": { - "@vue/shared": "3.0.0-beta.18" + "@vue/shared": "3.0.0-beta.20" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.18.tgz", - "integrity": "sha512-ZgIxCSuR1luq3pmWQbsYkn6ybUK/BKAWRQwAxUCP9BjFHnvN0W4BSLwy6VuH2l2ToKGni+xPxpDZhQQQsVAfng==", + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.20.tgz", + "integrity": "sha512-X5mM44vKVi9YC963McJ2m3siKdAAXS0s+LaWnnVH4IjkrlJFcaqQBMhfkJt8mI2SCv5tICBDgmIIkIkJzZ2tTw==", "requires": { - "@vue/reactivity": "3.0.0-beta.18", - "@vue/shared": "3.0.0-beta.18" + "@vue/reactivity": "3.0.0-beta.20", + "@vue/shared": "3.0.0-beta.20" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.18.tgz", - "integrity": "sha512-2ym4EyWg1C/UDXuVjFyqwLgAjrWRTRM3wHBmp0TlpoXSSNvIEJg5HXRgC1jnHtkVbGmyHHPndsbFP+oBj10tzQ==", + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.20.tgz", + "integrity": "sha512-L8G9O34TuUUWMA06kZBSGfc44vHPpy+d3K8bM5qXiocdSCyjvikb9McXJsTZesLZZksRAyr1G05u/ikxCERCWQ==", "requires": { - "@vue/runtime-core": "3.0.0-beta.18", - "@vue/shared": "3.0.0-beta.18", + "@vue/runtime-core": "3.0.0-beta.20", + "@vue/shared": "3.0.0-beta.20", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.18.tgz", - "integrity": "sha512-wRvQaTHeCt3xxqj3UpMR2JxkkU7ul/9RMqSxGJhOd4Bsp72Md4H83XkijHy8LkPKZWszmxjEpfCYuw9MU0a4kg==" + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.20.tgz", + "integrity": "sha512-Ttuh2Kib8aelCm0J0M31z7ajHYWI3DOj59sbAh8ZuwIn8l5sKUmDUkxry2n3gYJ5s3uV3xhFCLQs1THtsg1/qA==" }, "@vue/test-utils": { "version": "2.0.0-alpha.8", @@ -6317,13 +6317,13 @@ } }, "vue": { - "version": "3.0.0-beta.18", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.18.tgz", - "integrity": "sha512-waevph9s+M/aBf4XJIjfwHlHH7SBEr29dTMqq6ymnp/qJQHsavLlQHjsWRcxkYJ5rKfM6omoW+G6EBRBDB05sA==", + "version": "3.0.0-beta.20", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.20.tgz", + "integrity": "sha512-JmfvMwZQ/bsEF5YBDdYqZzpp4M8dSninyGxG2bHUlpS4Y66X/pduw2GpGE61xxgfrp2KM5cI9ryRpsNHrsf9HA==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.18", - "@vue/runtime-dom": "3.0.0-beta.18", - "@vue/shared": "3.0.0-beta.18" + "@vue/compiler-dom": "3.0.0-beta.20", + "@vue/runtime-dom": "3.0.0-beta.20", + "@vue/shared": "3.0.0-beta.20" } }, "vue-class-component": { @@ -6342,9 +6342,9 @@ } }, "vue-router": { - "version": "4.0.0-beta.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.1.tgz", - "integrity": "sha512-byqdBiKISN9Qrse6A0fgR6tePQNwlAdx+wBgO2x08MEn6hy8ds19uKvosfruVjw5vhpFmjvGR15Z68an+7fRAQ==" + "version": "4.0.0-beta.2", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.2.tgz", + "integrity": "sha512-+TvUCpxEhgSCssMTXdX4qei/YZN1kEt4nZoOySPLLUlAeEIlY3K1ps3hyCOeC1qYGCuSwaWuDmK/yi2d7W0sSg==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index a43669e..26fb4d5 100644 --- a/package.json +++ b/package.json @@ -79,8 +79,8 @@ }, "dependencies": { "@ionic/core": "^5.2.3", - "vue": "^3.0.0-beta.18", - "vue-router": "^4.0.0-beta.1" + "vue": "^3.0.0-beta.20", + "vue-router": "^4.0.0-beta.2" }, "jestSonar": { "reportPath": "reports", From cc481b62a15ce122fb5b3134d4954bdbc010bfa8 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 14 Jul 2020 20:52:02 +0300 Subject: [PATCH 46/96] Fixes #134 --- CHANGELOG.md | 3 ++ src/components/router-outlet/index.ts | 76 +++++++++++++-------------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1ee5f3..9e06115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.10...dev) +### Features +* IonRouterView - remove keepAlive prop and use v-slot prop instead + --- # [3.0.0-alpha.10](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.9...v3.0.0-alpha.10) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index bb78a50..477bf78 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -1,8 +1,6 @@ import { BaseTransitionProps, FunctionalComponent, - KeepAlive, - KeepAliveProps, Transition, h, nextTick, @@ -21,10 +19,9 @@ export interface Props extends JSX.IonRouterOutlet { name?: string; route?: RouteLocationNormalizedLoaded; swipeBack?: boolean; - keepAlive?: KeepAliveProps; } -export const IonRouterView: FunctionalComponent = props => { +export const IonRouterView: FunctionalComponent = (props, { slots }) => { const router = useRouter(); const { name, route, ...outletProps } = props; const ionRouterOutlet = ref(); @@ -85,6 +82,41 @@ export const IonRouterView: FunctionalComponent = props => { }, }; + const routerView = h(RouterView, { name, route }, (...opts: any) => { + const { Component, props: componentProps } = opts[0]; + const child = newView.value + ? h(newView.value.component, newView.value.props) + : Component ? h(Component, componentProps) : null; + + if (newView.value?.component === Component.type) { + newView.value = undefined; + } + + if (child?.props) { + child.props.class = { + 'can-go-back': !!router.history.state.back, + }; + } + + if (persisted && child) { + nextTick(() => { + const leaveCb = (enteringEl.value as any)._leaveCb; + leaveCb && leaveCb(); + }); + } + + return h( + Transition, + { + css: false, + mode: 'in-out', + persisted, + ...transitionHooks, + }, + () => child + ); + }); + return h( 'ion-router-outlet', { @@ -134,40 +166,7 @@ export const IonRouterView: FunctionalComponent = props => { }); }, }, - h(RouterView, { name, route }, (...opts: any) => { - const { Component, props: componentProps } = opts[0]; - const child = newView.value - ? h(newView.value.component, newView.value.props) - : Component ? h(Component, componentProps) : null; - - if (newView.value?.component === Component.type) { - newView.value = undefined; - } - - if (child?.props) { - child.props.class = { - 'can-go-back': !!router.history.state.back, - }; - } - - if (persisted && child) { - nextTick(() => { - const leaveCb = (enteringEl.value as any)._leaveCb; - leaveCb && leaveCb(); - }); - } - - return h( - Transition, - { - css: false, - mode: 'in-out', - persisted, - ...transitionHooks, - }, - () => props.keepAlive !== undefined ? h(KeepAlive, props.keepAlive || null, [child]) : child - ); - }) + slots.default ? slots.default({ Component: routerView }) : routerView ); }; @@ -178,5 +177,4 @@ IonRouterView.props = [ 'animation', 'mode', 'swipeBack', - 'keepAlive', ]; From edd27a8229b7a481b76591ac3ed539f066dfc4a2 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 14 Jul 2020 21:15:36 +0300 Subject: [PATCH 47/96] [build] 3.0.0-alpha.11 --- CHANGELOG.md | 8 +++++--- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e06115..db54c59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,12 @@ -# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.10...dev) +# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.11...dev) + +--- + +# [3.0.0-alpha.11](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.10...v3.0.0-alpha.11) ### Features * IonRouterView - remove keepAlive prop and use v-slot prop instead ---- - # [3.0.0-alpha.10](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.9...v3.0.0-alpha.10) ### Features diff --git a/package-lock.json b/package-lock.json index 02041e5..6ce01f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.10", + "version": "3.0.0-alpha.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 26fb4d5..540d4a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.10", + "version": "3.0.0-alpha.11", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 1348091262a7b553dce23e2cd7eb51e5ff0b990e Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Wed, 15 Jul 2020 17:48:23 +0300 Subject: [PATCH 48/96] router children rendering improvements --- CHANGELOG.md | 3 ++ src/components/router-outlet/index.ts | 43 ++++++++++++++------------- src/components/tabs/tab-button.ts | 1 - 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db54c59..31e9338 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.11...dev) +### Features +* Export transition props when rendering children in RouterView + --- # [3.0.0-alpha.11](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.10...v3.0.0-alpha.11) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 477bf78..25c476e 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -2,6 +2,7 @@ import { BaseTransitionProps, FunctionalComponent, Transition, + VNode, h, nextTick, ref, @@ -26,7 +27,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { const { name, route, ...outletProps } = props; const ionRouterOutlet = ref(); const enteringEl = ref(); - const newView = shallowRef(); + const newView = shallowRef(); let persisted = false; let progressAnimation = false; @@ -83,12 +84,10 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { }; const routerView = h(RouterView, { name, route }, (...opts: any) => { - const { Component, props: componentProps } = opts[0]; - const child = newView.value - ? h(newView.value.component, newView.value.props) - : Component ? h(Component, componentProps) : null; + const { Component, route: matchedRoute } = opts[0]; + const child = newView.value ?? Component; - if (newView.value?.component === Component.type) { + if (newView.value?.type === Component.type) { newView.value = undefined; } @@ -105,16 +104,16 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { }); } - return h( - Transition, - { - css: false, - mode: 'in-out', - persisted, - ...transitionHooks, - }, - () => child - ); + const transitionProps = { + css: false, + mode: 'in-out', + persisted, + ...transitionHooks, + }; + + return slots.default + ? slots.default({ Component: child, route: matchedRoute, transitionProps }) + : h(Transition, transitionProps, () => Component); }); return h( @@ -144,10 +143,12 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { return r.path === router.history.state.back as any; }) as RouteRecordNormalized; - newView.value = prevRoute && { - component: prevRoute?.components[props.name || 'default'], - props: prevRoute?.props, - }; + if (prevRoute) { + newView.value = h( + prevRoute.components[props.name || 'default'], + prevRoute.props + ); + } }, onEnd(shouldComplete: boolean) { inTransition = false; @@ -166,7 +167,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { }); }, }, - slots.default ? slots.default({ Component: routerView }) : routerView + routerView ); }; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index 21a0a54..e6216a9 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -21,7 +21,6 @@ export const IonTabButton: FunctionalComponent = (props, { slo const router = useRouter(); const onClick = async () => { - console.log('clicl', tabsRef.value?.onIonTabsWillChange); if (tabsRef.value && tabsRef.value.onIonTabsWillChange && props.tab) { tabsRef.value.onIonTabsWillChange(new CustomEvent('ionTabWillChange', { detail: { tab: props.tab } })); } From 4d0bdfd531c002dd827cf5301265de658c146701 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Thu, 16 Jul 2020 00:19:21 +0300 Subject: [PATCH 49/96] Update deps --- package-lock.json | 113 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 72 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ce01f4..a24691a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -167,7 +167,8 @@ "@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true }, "@babel/helpers": { "version": "7.9.6", @@ -207,7 +208,8 @@ "@babel/parser": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", - "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==" + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -331,6 +333,7 @@ "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", @@ -781,64 +784,89 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.20.tgz", - "integrity": "sha512-ZMMMD4GMZXrwJFBzdn3v+VcrrGofqrP7gfJ5ie/3p2sIEVAfsI0qwIb/DCezWt/Cm3viMJiTpv4SINPGK4xM8Q==", - "requires": { - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", - "@vue/shared": "3.0.0-beta.20", - "estree-walker": "^0.8.1", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.22.tgz", + "integrity": "sha512-i/e965dQbJ4EGkX53a/aBO//IjgG5Rl9LOoRh91ZmPxi44WSG+tu+mvq+y7lRl5HoxkjGWo8GVErFYSRQnSLPA==", + "requires": { + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", + "@vue/shared": "3.0.0-beta.22", + "estree-walker": "^2.0.1", "source-map": "^0.6.1" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==" + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, "estree-walker": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.8.1.tgz", - "integrity": "sha512-H6cJORkqvrNziu0KX2hqOMAlA2CiuAxHeGJXSIoKA/KLv229Dw806J3II6mKTm5xiDX1At1EXCfsOQPB+tMB+g==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", + "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==" + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.20.tgz", - "integrity": "sha512-vtkvL8OOcIMdZn8oLKTVRqKLcpRBivhR6xz2sS8mfRA+NNh+QDpBFip5Zjl//FD6mRvv2wiJoWWqe0MgXUChbg==", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.22.tgz", + "integrity": "sha512-kJCEeyaBbS+VjYNFEi3o2mnwS2rqdthpQ6TNigojXmGKEoA3UCOrn3IGR3iTSdo/3knaoA9/zwJ8LcxSXkZXMg==", "requires": { - "@vue/compiler-core": "3.0.0-beta.20", - "@vue/shared": "3.0.0-beta.20" + "@vue/compiler-core": "3.0.0-beta.22", + "@vue/shared": "3.0.0-beta.22" } }, "@vue/reactivity": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.20.tgz", - "integrity": "sha512-X59+ZENE1sFRW56vcyb3eTGwqGwRpBJIkau0/NMv86hBbtWUigG4+r4thoCNKQAX3iyMQBlk5dQvxUxopjn5pg==", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.22.tgz", + "integrity": "sha512-DzRrb/MBgjRFPzD7YmkLBb9m9VMSC6rIxTX5RT7c5tQ44D1WnpivrkXGe2Wm9aqjIP7AV3UyhMumKpHjvV8sFw==", "requires": { - "@vue/shared": "3.0.0-beta.20" + "@vue/shared": "3.0.0-beta.22" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.20.tgz", - "integrity": "sha512-X5mM44vKVi9YC963McJ2m3siKdAAXS0s+LaWnnVH4IjkrlJFcaqQBMhfkJt8mI2SCv5tICBDgmIIkIkJzZ2tTw==", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.22.tgz", + "integrity": "sha512-uTz8iAgp0UexmxlVS0NCZWS/7n4tuXiHkT2fiJLUQq1/fdNOt3yM1UEtlIZ2lM6wDxX9ukNeddS3NUXanrOGnA==", "requires": { - "@vue/reactivity": "3.0.0-beta.20", - "@vue/shared": "3.0.0-beta.20" + "@vue/reactivity": "3.0.0-beta.22", + "@vue/shared": "3.0.0-beta.22" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.20.tgz", - "integrity": "sha512-L8G9O34TuUUWMA06kZBSGfc44vHPpy+d3K8bM5qXiocdSCyjvikb9McXJsTZesLZZksRAyr1G05u/ikxCERCWQ==", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.22.tgz", + "integrity": "sha512-bAIDV8CW/EoN484a0Wxu2I6jJyrXMbF47TZ/S/N0IS/ftBKxZ4dDlokMjiG5Vxl2R9c/DeKv3RWdr4KRUfy80w==", "requires": { - "@vue/runtime-core": "3.0.0-beta.20", - "@vue/shared": "3.0.0-beta.20", + "@vue/runtime-core": "3.0.0-beta.22", + "@vue/shared": "3.0.0-beta.22", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.20.tgz", - "integrity": "sha512-Ttuh2Kib8aelCm0J0M31z7ajHYWI3DOj59sbAh8ZuwIn8l5sKUmDUkxry2n3gYJ5s3uV3xhFCLQs1THtsg1/qA==" + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.22.tgz", + "integrity": "sha512-LX/unRMM9QUGIQjR9v2pKy60MRXWQRVEgaL6R8nFSRkbx2TTmShIdqmQPgciQwEBe7n5hsdZcSms+8LepNEykg==" }, "@vue/test-utils": { "version": "2.0.0-alpha.8", @@ -4207,7 +4235,8 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true }, "lodash.memoize": { "version": "4.1.2", @@ -6317,13 +6346,13 @@ } }, "vue": { - "version": "3.0.0-beta.20", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.20.tgz", - "integrity": "sha512-JmfvMwZQ/bsEF5YBDdYqZzpp4M8dSninyGxG2bHUlpS4Y66X/pduw2GpGE61xxgfrp2KM5cI9ryRpsNHrsf9HA==", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.22.tgz", + "integrity": "sha512-5oWCsrczYcfDaL9o+XhHsDYi/DqmD8y30oJAP7MWoD9n+olofXQBsj/D3g1vDfXP6kITMKPmK4B6kFv+brwYfQ==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.20", - "@vue/runtime-dom": "3.0.0-beta.20", - "@vue/shared": "3.0.0-beta.20" + "@vue/compiler-dom": "3.0.0-beta.22", + "@vue/runtime-dom": "3.0.0-beta.22", + "@vue/shared": "3.0.0-beta.22" } }, "vue-class-component": { diff --git a/package.json b/package.json index 540d4a4..df7345d 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ }, "dependencies": { "@ionic/core": "^5.2.3", - "vue": "^3.0.0-beta.20", + "vue": "^3.0.0-beta.22", "vue-router": "^4.0.0-beta.2" }, "jestSonar": { From a3eee2166a5b21288d61dbc6fc3c1ae4873dedf8 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Thu, 16 Jul 2020 18:37:45 +0300 Subject: [PATCH 50/96] [build] 3.0.0-alpha.12 --- CHANGELOG.md | 8 +++++--- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31e9338..4f57c3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,12 @@ -# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.11...dev) +# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.12...dev) + +--- + +# [3.0.0-alpha.12](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.11...v3.0.0-alpha.12) ### Features * Export transition props when rendering children in RouterView ---- - # [3.0.0-alpha.11](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.10...v3.0.0-alpha.11) ### Features diff --git a/package-lock.json b/package-lock.json index a24691a..b1aa62a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.11", + "version": "3.0.0-alpha.12", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index df7345d..588b047 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.11", + "version": "3.0.0-alpha.12", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From eea3d6ada3171ff672052943ca81781f44f9090c Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 20 Jul 2020 19:47:34 +0300 Subject: [PATCH 51/96] Update dependencies --- package-lock.json | 171 ++++++++++++++++++++++++++++++++++------------ package.json | 10 +-- 2 files changed, 131 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1aa62a..e501366 100644 --- a/package-lock.json +++ b/package-lock.json @@ -745,9 +745,9 @@ } }, "@types/node": { - "version": "14.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", - "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", + "version": "14.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.23.tgz", + "integrity": "sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==", "dev": true }, "@types/normalize-package-data": { @@ -784,13 +784,13 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-beta.22.tgz", - "integrity": "sha512-i/e965dQbJ4EGkX53a/aBO//IjgG5Rl9LOoRh91ZmPxi44WSG+tu+mvq+y7lRl5HoxkjGWo8GVErFYSRQnSLPA==", + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.2.tgz", + "integrity": "sha512-FPPNTd20Y8U5RWyXHWOC22gpSnaFz8V2zDq+f1AQ6xTTRD09qFw7wJ8T50mnVgeXgYbACMnD+RXOAAwYfB6ijQ==", "requires": { "@babel/parser": "^7.10.4", "@babel/types": "^7.10.4", - "@vue/shared": "3.0.0-beta.22", + "@vue/shared": "3.0.0-rc.2", "estree-walker": "^2.0.1", "source-map": "^0.6.1" }, @@ -828,50 +828,50 @@ } }, "@vue/compiler-dom": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-beta.22.tgz", - "integrity": "sha512-kJCEeyaBbS+VjYNFEi3o2mnwS2rqdthpQ6TNigojXmGKEoA3UCOrn3IGR3iTSdo/3knaoA9/zwJ8LcxSXkZXMg==", + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-rc.2.tgz", + "integrity": "sha512-38iflPPoZtbPBBLDI9q2xP3MQAnUIQFs9aRwSMJqDI0PxEvB2J9O6o5bBtN7QIorL5KnxDO9LLz+RuCgmFIQVQ==", "requires": { - "@vue/compiler-core": "3.0.0-beta.22", - "@vue/shared": "3.0.0-beta.22" + "@vue/compiler-core": "3.0.0-rc.2", + "@vue/shared": "3.0.0-rc.2" } }, "@vue/reactivity": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-beta.22.tgz", - "integrity": "sha512-DzRrb/MBgjRFPzD7YmkLBb9m9VMSC6rIxTX5RT7c5tQ44D1WnpivrkXGe2Wm9aqjIP7AV3UyhMumKpHjvV8sFw==", + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-rc.2.tgz", + "integrity": "sha512-kgnBKzX74sV/Zc2iS5Zp+QwlctMBplsw7LAogGr2K2BrkfjqXSBr4yag/m8poGmceVMNm6/wFsWrOEnbL0hyZQ==", "requires": { - "@vue/shared": "3.0.0-beta.22" + "@vue/shared": "3.0.0-rc.2" } }, "@vue/runtime-core": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-beta.22.tgz", - "integrity": "sha512-uTz8iAgp0UexmxlVS0NCZWS/7n4tuXiHkT2fiJLUQq1/fdNOt3yM1UEtlIZ2lM6wDxX9ukNeddS3NUXanrOGnA==", + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-rc.2.tgz", + "integrity": "sha512-NNeFIkW0IQCuqp77XcgqsYdME7wr6ab6RcSmu9ZSKcEZbqhL+0PVioCjfyMW6Sa+35ng6PegocNbOp++vXIQ9g==", "requires": { - "@vue/reactivity": "3.0.0-beta.22", - "@vue/shared": "3.0.0-beta.22" + "@vue/reactivity": "3.0.0-rc.2", + "@vue/shared": "3.0.0-rc.2" } }, "@vue/runtime-dom": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-beta.22.tgz", - "integrity": "sha512-bAIDV8CW/EoN484a0Wxu2I6jJyrXMbF47TZ/S/N0IS/ftBKxZ4dDlokMjiG5Vxl2R9c/DeKv3RWdr4KRUfy80w==", + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-rc.2.tgz", + "integrity": "sha512-VvT06p5Qm29LdyX+jvEMXgqD5/2PfeftnkIPbLRjvmpcZTxmdm1GmitLfbv2YQvOPUDWjVBmjJ1SHJkdI0SDhg==", "requires": { - "@vue/runtime-core": "3.0.0-beta.22", - "@vue/shared": "3.0.0-beta.22", + "@vue/runtime-core": "3.0.0-rc.2", + "@vue/shared": "3.0.0-rc.2", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-beta.22.tgz", - "integrity": "sha512-LX/unRMM9QUGIQjR9v2pKy60MRXWQRVEgaL6R8nFSRkbx2TTmShIdqmQPgciQwEBe7n5hsdZcSms+8LepNEykg==" + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-rc.2.tgz", + "integrity": "sha512-lJ1jb5PEDoSTosKdOyFh9/GpSFY/d9HXkG126aJXM4WgvJaf+OVKUWKZSgqolKLLIOJHG9ZcQt4OQyoktMenBg==" }, "@vue/test-utils": { - "version": "2.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-alpha.8.tgz", - "integrity": "sha512-T2S1Op2mKdF0DmQNiGLZDZHI86Ny1hvl+ApxGUEPVydMqqz5mTFHlbW89+MsKik5cQ3ikSA1hZj0y817IqAPvw==", + "version": "2.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-beta.0.tgz", + "integrity": "sha512-D9LPFqx+RMMtRFNdjR5SPBASM44nTiSF0mR3kE7yjD2i4zse7eMlVGIzF2KbiEkF8v6W/4oz2TfwIAiWPfxibA==", "dev": true }, "abab": { @@ -5972,23 +5972,95 @@ } }, "ts-jest": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.1.tgz", - "integrity": "sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A==", + "version": "26.1.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.3.tgz", + "integrity": "sha512-beUTSvuqR9SmKQEylewqJdnXWMVGJRFqSz2M8wKJe7GBMmLZ5zw6XXKSJckbHNMxn+zdB3guN2eOucSw2gBMnw==", "dev": true, "requires": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", + "jest-util": "26.x", "json5": "2.x", "lodash.memoize": "4.x", "make-error": "1.x", - "micromatch": "4.x", "mkdirp": "1.x", "semver": "7.x", "yargs-parser": "18.x" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-util": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", + "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "dev": true, + "requires": { + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6000,6 +6072,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -6181,9 +6262,9 @@ } }, "typescript": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", - "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -6346,13 +6427,13 @@ } }, "vue": { - "version": "3.0.0-beta.22", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-beta.22.tgz", - "integrity": "sha512-5oWCsrczYcfDaL9o+XhHsDYi/DqmD8y30oJAP7MWoD9n+olofXQBsj/D3g1vDfXP6kITMKPmK4B6kFv+brwYfQ==", + "version": "3.0.0-rc.2", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-rc.2.tgz", + "integrity": "sha512-syYidmtdfAz2aN1q7F/TlyPZdRXjIbp/QnpetWwhoBaOQOnqm+dHN5KwN8xBF+eUE4ys4aO8rrv7ulTQ4l8rFQ==", "requires": { - "@vue/compiler-dom": "3.0.0-beta.22", - "@vue/runtime-dom": "3.0.0-beta.22", - "@vue/shared": "3.0.0-beta.22" + "@vue/compiler-dom": "3.0.0-rc.2", + "@vue/runtime-dom": "3.0.0-rc.2", + "@vue/shared": "3.0.0-rc.2" } }, "vue-class-component": { diff --git a/package.json b/package.json index 588b047..410e57e 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,8 @@ }, "devDependencies": { "@types/jest": "^25.2.3", - "@types/node": "^14.0.14", - "@vue/test-utils": "^2.0.0-alpha.8", + "@types/node": "^14.0.23", + "@vue/test-utils": "^2.0.0-beta.0", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", "jest": "^25.5.4", @@ -69,17 +69,17 @@ "rollup-plugin-buble": "^0.19.2", "rollup-plugin-terser": "^1.0.1", "rollup-plugin-typescript2": "^0.27.1", - "ts-jest": "^26.1.1", + "ts-jest": "^26.1.3", "ts-loader": "^7.0.5", "ts-transformer-keys": "^0.4.2", "tslib": "^1.13.0", "tslint": "^6.1.2", "tslint-ionic-rules": "^0.0.21", - "typescript": "^3.9.6" + "typescript": "^3.9.7" }, "dependencies": { "@ionic/core": "^5.2.3", - "vue": "^3.0.0-beta.22", + "vue": "^3.0.0-rc.2", "vue-router": "^4.0.0-beta.2" }, "jestSonar": { From 9082af4aa08d08797498746f8ffc8019b20a3aaf Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 20 Jul 2020 19:47:50 +0300 Subject: [PATCH 52/96] Fixes #133 --- src/components/router-outlet/index.ts | 18 +++++++++++------- src/router.ts | 10 +++++----- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 25c476e..5febe6a 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -61,7 +61,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { el, progressAnimation ? router.history.state.back as any - : router.currentRoute.value + : router.currentRoute.value.fullPath ); } @@ -69,16 +69,19 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { }, async onLeave(el, done) { - await transition(el); if (!persisted) { - await router.saveScroll(el); - done(); - } else { - setTimeout(done, 100); + await router.saveScroll( + el, + progressAnimation + ? router.currentRoute.value.fullPath + : router.history.state.back as any + ); } + await transition(el); + persisted ? setTimeout(done, 100) : done(); + inTransition = false; - progressAnimation = false; persisted = false; }, }; @@ -152,6 +155,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { }, onEnd(shouldComplete: boolean) { inTransition = false; + progressAnimation = false; if (shouldComplete) { nextTick(() => { diff --git a/src/router.ts b/src/router.ts index 10a3816..3ef8e54 100644 --- a/src/router.ts +++ b/src/router.ts @@ -16,7 +16,7 @@ declare module 'vue-router' { history: RouterHistory; direction: Ref; showBackButton: Ref; - saveScroll: (el: HTMLElement) => Promise; + saveScroll: (el: HTMLElement, key: string) => Promise; restoreScroll: (el: HTMLElement, key: string) => Promise; } } @@ -40,6 +40,7 @@ export const createRouter = (opts: RouterOptions): Router => { router.beforeEach((to, from, next) => { showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; + console.log(to.fullPath, from.fullPath); direction.value = directionOverride.value || @@ -55,13 +56,12 @@ export const createRouter = (opts: RouterOptions): Router => { showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; }); - router.saveScroll = async el => { + router.saveScroll = async (el, key) => { const ionContent = el.querySelector('ion-content'); const scrollElement = ionContent && (await ionContent.getScrollElement()); - const prevRoute = router.history.state.back as any; - if (scrollElement && prevRoute) { - scroll.set(prevRoute, { + if (scrollElement && key) { + scroll.set(key, { top: scrollElement?.scrollTop || 0, left: scrollElement?.scrollLeft || 0, }); From 6d3dc664b9ee3d29e0fca80bcc27f10e036b24a3 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 20 Jul 2020 23:16:21 +0300 Subject: [PATCH 53/96] Bugfixes, router props handling --- CHANGELOG.md | 13 ++++++++++++- src/components/back-button/index.ts | 14 +++++++++++--- src/components/containers.ts | 10 +++++----- src/components/router-outlet/index.ts | 2 ++ src/components/tabs/tab-button.ts | 15 ++++++++++++--- src/index.ts | 2 +- src/interfaces.ts | 18 ++++++++++++++++++ src/router.ts | 10 ++++++---- src/utils/defineContainer.ts | 26 ++++++++++++++++++++++++++ src/utils/defineOverlay.ts | 13 +++++++------ 10 files changed, 100 insertions(+), 23 deletions(-) create mode 100644 src/interfaces.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f57c3b..d7fac79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,18 @@ -# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.12...dev) +# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.13...dev) --- +# [3.0.0-alpha.13](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.12...v3.0.0-alpha.13) + +### Features +* Ionic components href attribute behaves like RouterLink's to attribute +* Support routerAnimation and routerDirection props for Ionic components + +### Bug fixes +* Scroll is no longer reset if swipe back is cancelled +* Fix props no longer being applied correctly to overlay components +* Fix onClick overriding on certain Ionic components + # [3.0.0-alpha.12](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.11...v3.0.0-alpha.12) ### Features diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts index e482bd5..a562465 100644 --- a/src/components/back-button/index.ts +++ b/src/components/back-button/index.ts @@ -1,12 +1,19 @@ import { FunctionalComponent, h } from 'vue'; import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; +import { NavigableBack } from '../../interfaces'; -export const IonBackButton: FunctionalComponent = props => { +export const IonBackButton: FunctionalComponent = props => { const router = useRouter(); return h('ion-back-button', { props, - onClick() { + onClick(e: MouseEvent) { + props.onClick && props.onClick(e); + + if (e.defaultPrevented) { + return; + } + props.defaultHref ? router?.replace(props.defaultHref) : router?.history.go(-1); @@ -21,5 +28,6 @@ IonBackButton.props = [ 'icon', 'mode', 'text', - 'type' + 'type', + 'onClick', ]; diff --git a/src/components/containers.ts b/src/components/containers.ts index 6431d83..7039245 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -1,12 +1,12 @@ import { keys } from 'ts-transformer-keys'; import { JSX } from '@ionic/core'; -import { defineContainer } from '../utils'; +import { defineContainer, defineNavigableContainer } from '../utils'; export const IonApp = /*@__PURE__*/defineContainer('ion-app', keys()); export const IonAvatar = /*@__PURE__*/defineContainer('ion-avatar', keys()); export const IonBackdrop = /*@__PURE__*/defineContainer('ion-backdrop', keys()); export const IonBadge = /*@__PURE__*/defineContainer('ion-badge', keys()); -export const IonButton = /*@__PURE__*/defineContainer('ion-button', keys()); +export const IonButton = /*@__PURE__*/defineNavigableContainer('ion-button', keys()); export const IonButtons = /*@__PURE__*/defineContainer('ion-buttons', keys()); export const IonCard = /*@__PURE__*/defineContainer('ion-card', keys()); export const IonCardContent = /*@__PURE__*/defineContainer('ion-card-content', keys()); @@ -17,7 +17,7 @@ export const IonChip = /*@__PURE__*/defineContainer('ion-chip', key export const IonCol = /*@__PURE__*/defineContainer('ion-col', keys()); export const IonContent = /*@__PURE__*/defineContainer('ion-content', keys()); export const IonFab = /*@__PURE__*/defineContainer('ion-fab', keys()); -export const IonFabButton = /*@__PURE__*/defineContainer('ion-fab-button', keys()); +export const IonFabButton = /*@__PURE__*/defineNavigableContainer('ion-fab-button', keys()); export const IonFabList = /*@__PURE__*/defineContainer('ion-fab-list', keys()); export const IonFooter = /*@__PURE__*/defineContainer('ion-footer', keys()); export const IonGrid = /*@__PURE__*/defineContainer('ion-grid', keys()); @@ -25,10 +25,10 @@ export const IonHeader = /*@__PURE__*/defineContainer('ion-header export const IonImg = /*@__PURE__*/defineContainer('ion-img', keys()); export const IonInfiniteScroll = /*@__PURE__*/defineContainer('ion-infinite-scroll', keys()); export const IonInfiniteScrollContent = /*@__PURE__*/defineContainer('ion-infinite-scroll-content', keys()); -export const IonItem = /*@__PURE__*/defineContainer('ion-item', keys()); +export const IonItem = /*@__PURE__*/defineNavigableContainer('ion-item', keys()); export const IonItemDivider = /*@__PURE__*/defineContainer('ion-item-divider', keys()); export const IonItemGroup = /*@__PURE__*/defineContainer('ion-item-group', keys()); -export const IonItemOption = /*@__PURE__*/defineContainer('ion-item-option', keys()); +export const IonItemOption = /*@__PURE__*/defineNavigableContainer('ion-item-option', keys()); export const IonItemOptions = /*@__PURE__*/defineContainer('ion-item-options', keys()); export const IonItemSliding = /*@__PURE__*/defineContainer('ion-item-sliding', keys()); export const IonLabel = /*@__PURE__*/defineContainer('ion-label', keys()); diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 5febe6a..9c41fd8 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -15,6 +15,7 @@ import { useRouter, } from 'vue-router'; import { JSX } from '@ionic/core'; +import { animationOverride } from '../../router'; export interface Props extends JSX.IonRouterOutlet { name?: string; @@ -47,6 +48,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { direction: router.direction.value, showGoBack: router.showBackButton.value, duration: persisted ? 0 : undefined, + animationBuilder: animationOverride.value, progressAnimation, }); }; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index e6216a9..967bb6d 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -1,8 +1,9 @@ import { FunctionalComponent, h } from 'vue'; +import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; import { tabNodesRef, tabsRef } from './tabs'; import { setActiveTab, tabBarRef } from './tab-bar'; -import { useRouter } from 'vue-router'; +import { Navigable } from '../../interfaces'; const name = 'ion-tab-button'; const componentProps: (keyof JSX.IonTabButton)[] = [ @@ -17,10 +18,16 @@ const componentProps: (keyof JSX.IonTabButton)[] = [ 'target', ]; -export const IonTabButton: FunctionalComponent = (props, { slots }) => { +export const IonTabButton: FunctionalComponent = (props, { slots }) => { const router = useRouter(); - const onClick = async () => { + const onClick = async (e: MouseEvent) => { + props.onClick && props.onClick(e); + + if (e.defaultPrevented) { + return; + } + if (tabsRef.value && tabsRef.value.onIonTabsWillChange && props.tab) { tabsRef.value.onIonTabsWillChange(new CustomEvent('ionTabWillChange', { detail: { tab: props.tab } })); } @@ -37,6 +44,8 @@ export const IonTabButton: FunctionalComponent = (props, { slo if (tabsRef.value && tabsRef.value.onIonTabsDidChange && props.tab) { tabsRef.value.onIonTabsDidChange(new CustomEvent('ionTabDidChange', { detail: { tab: props.tab } })); } + + e.preventDefault(); }; return h(name, { ...props, onClick }, slots.default && slots.default()); diff --git a/src/index.ts b/src/index.ts index 7008463..c525614 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,7 @@ import { export { IonicVue } from './ionic-vue'; export * from './components'; -export * from './router'; +export { createRouter } from './router'; // Icons that are used by internal components addIcons({ diff --git a/src/interfaces.ts b/src/interfaces.ts new file mode 100644 index 0000000..67c4129 --- /dev/null +++ b/src/interfaces.ts @@ -0,0 +1,18 @@ +import { RouteLocationRaw } from 'vue-router'; +import { AnimationBuilder } from '@ionic/core'; +import { Direction } from './router'; + +export interface Navigable { + href?: RouteLocationRaw; + onClick?: (e: MouseEvent) => void; +} + +export interface NavigableRouter extends Navigable { + replace?: boolean; + routerDirection?: Direction; + routerAnimation?: AnimationBuilder; +} + +export interface NavigableBack extends Omit { + defaultHref?: RouteLocationRaw; +} diff --git a/src/router.ts b/src/router.ts index 3ef8e54..a85c976 100644 --- a/src/router.ts +++ b/src/router.ts @@ -4,9 +4,9 @@ import { RouterOptions, createRouter as createVueRouter, } from 'vue-router'; -import { BackButtonEvent, NavDirection } from '@ionic/core'; +import { AnimationBuilder, BackButtonEvent, NavDirection } from '@ionic/core'; -enum Direction { +export enum Direction { forward = 'forward', back = 'back', } @@ -21,9 +21,11 @@ declare module 'vue-router' { } } +export const directionOverride = ref(); +export const animationOverride = ref(); + export const createRouter = (opts: RouterOptions): Router => { const direction = ref(Direction.forward); - const directionOverride = ref(); const showBackButton = ref(false); const scroll = new Map(); @@ -40,7 +42,6 @@ export const createRouter = (opts: RouterOptions): Router => { router.beforeEach((to, from, next) => { showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; - console.log(to.fullPath, from.fullPath); direction.value = directionOverride.value || @@ -54,6 +55,7 @@ export const createRouter = (opts: RouterOptions): Router => { router.afterEach(to => { showBackButton.value = to.fullPath !== '/' || !!router.history.state.back; + animationOverride.value = undefined; }); router.saveScroll = async (el, key) => { diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index da8e1c9..d41f7d9 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -1,4 +1,7 @@ import { FunctionalComponent, h } from 'vue'; +import { useLink, useRouter } from 'vue-router'; +import { NavigableRouter } from '../interfaces'; +import { directionOverride } from '../router'; export const defineContainer = (name: string, componentProps: string[]) => { const Container: FunctionalComponent = (props, { slots }) => @@ -9,3 +12,26 @@ export const defineContainer = (name: string, componentPro return Container; }; + +export const defineNavigableContainer = (name: string, componentProps: string[]) => { + const Container: FunctionalComponent = (props, { slots }) => { + const router = useRouter(); + + if (router && props.href !== undefined) { + const link = useLink({ to: props.href, replace: props.replace }); + const oldClick = props.onClick; + props.onClick = (e: MouseEvent) => { + oldClick && oldClick(e); + directionOverride.value = props.routerDirection; + !e.defaultPrevented && link.navigate(e) && e.preventDefault(); + }; + } + + return h(name, props, slots.default && slots.default()); + }; + + Container.displayName = name; + Container.props = [...componentProps, 'onClick', 'replace', 'routerDirection', 'routerAnimation']; + + return Container; +}; diff --git a/src/utils/defineOverlay.ts b/src/utils/defineOverlay.ts index d66ecd0..1a6c113 100644 --- a/src/utils/defineOverlay.ts +++ b/src/utils/defineOverlay.ts @@ -38,6 +38,8 @@ export function defineOverlay( controller: OverlayController, componentProps: string[] ) { + type Props = OverlayProps & Omit; + const overlay = ref(); const content = ref(); const coreTag = name.charAt(0).toLowerCase() + name.slice(1); @@ -49,7 +51,7 @@ export function defineOverlay( }); const Overlay: FunctionalComponent< - OverlayProps & Omit, + Props, OverlayEvents[] > = (props, { attrs, slots, emit }) => { const isOpen = props.isOpen === undefined ? props.modelValue : props.isOpen; @@ -64,14 +66,14 @@ export function defineOverlay( style: { display: 'none' }, async onVnodeUpdated() { if (isOpen) { - await (overlay.value?.present() || present(attrs)); + await (overlay.value?.present() || present(props, attrs)); } else { await overlay.value?.dismiss(); overlay.value = undefined; } }, async onVnodeMounted() { - isOpen && (await present(attrs)); + isOpen && (await present(props, attrs)); }, async onVnodeBeforeUnmount() { await overlay.value?.dismiss(); @@ -94,15 +96,14 @@ export function defineOverlay( OverlayEvents.onDidDismiss ]; - async function present({ + async function present(props: Props, { onWillPresent, onDidPresent, onWillDismiss, onDidDismiss, - ...attrs }: Partial void>>) { overlay.value = await controller.create({ - ...attrs, + ...props, component: content.value }); From ed59037e3f88f0c46313ede8c0974afcef74ece2 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 20 Jul 2020 23:17:20 +0300 Subject: [PATCH 54/96] [build] 3.0.0-alpha.13 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e501366..12bcf91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.12", + "version": "3.0.0-alpha.13", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 410e57e..3c85be2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.12", + "version": "3.0.0-alpha.13", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 19d9c18c50bdaba67154d9da9c104b5df7e211d8 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 24 Jul 2020 19:02:07 +0300 Subject: [PATCH 55/96] Improve component definitions and event handling --- src/ionic-vue.ts | 2 +- src/utils/defineContainer.ts | 21 +++++++++++++++------ src/utils/defineInput.ts | 16 +++++++++------- src/utils/defineOverlay.ts | 10 ++++++---- src/utils/splitPropsAndEvents.ts | 6 ++++++ 5 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 src/utils/splitPropsAndEvents.ts diff --git a/src/ionic-vue.ts b/src/ionic-vue.ts index e0b4185..f86c854 100644 --- a/src/ionic-vue.ts +++ b/src/ionic-vue.ts @@ -6,6 +6,6 @@ export const IonicVue: Plugin = { async install(_app: App, config?: IonicConfig) { config && setupConfig(config); await applyPolyfills(); - defineCustomElements(window); + window && defineCustomElements(window); } }; diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index d41f7d9..8816316 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -2,6 +2,7 @@ import { FunctionalComponent, h } from 'vue'; import { useLink, useRouter } from 'vue-router'; import { NavigableRouter } from '../interfaces'; import { directionOverride } from '../router'; +import { splitPropsAndEvents } from './splitPropsAndEvents'; export const defineContainer = (name: string, componentProps: string[]) => { const Container: FunctionalComponent = (props, { slots }) => @@ -13,25 +14,33 @@ export const defineContainer = (name: string, componentPro return Container; }; -export const defineNavigableContainer = (name: string, componentProps: string[]) => { - const Container: FunctionalComponent = (props, { slots }) => { +export const defineNavigableContainer = (name: string, componentPropsAndEvents: string[]) => { + const Container: FunctionalComponent = (props, { attrs, slots }) => { + console.log(name, { ...props }, attrs); const router = useRouter(); if (router && props.href !== undefined) { const link = useLink({ to: props.href, replace: props.replace }); - const oldClick = props.onClick; - props.onClick = (e: MouseEvent) => { + const oldClick = attrs.onClick as any; + + props.href = link.href.value; + attrs.onClick = (e: MouseEvent) => { oldClick && oldClick(e); directionOverride.value = props.routerDirection; - !e.defaultPrevented && link.navigate(e) && e.preventDefault(); + if (!e.defaultPrevented) { + link.navigate(e); + e.preventDefault(); + } }; } return h(name, props, slots.default && slots.default()); }; + const data = splitPropsAndEvents(componentPropsAndEvents); Container.displayName = name; - Container.props = [...componentProps, 'onClick', 'replace', 'routerDirection', 'routerAnimation']; + Container.props = [...data.props, 'replace', 'routerDirection', 'routerAnimation']; + Container.emits = [...data.events, 'onClick']; return Container; }; diff --git a/src/utils/defineInput.ts b/src/utils/defineInput.ts index 5829a6b..df019b3 100644 --- a/src/utils/defineInput.ts +++ b/src/utils/defineInput.ts @@ -1,4 +1,5 @@ import { FunctionalComponent, VNode, h } from 'vue'; +import { splitPropsAndEvents } from './splitPropsAndEvents'; export interface InputProps extends Object { modelValue: string | boolean; @@ -14,13 +15,13 @@ export enum InputEvents { export function defineInput( name: string, ionTag: string, - componentProps: string[], + componentPropsAndEvents: string[], updateEvent = 'onIonChange', modelProp = 'value' ) { - const Input: FunctionalComponent = ( + const Input: FunctionalComponent = ( props, - { slots, emit } + { attrs, slots, emit } ) => { const { modelValue, ...restOfProps } = props; @@ -30,9 +31,9 @@ export function defineInput( vnode.el.addEventListener(updateEvent.replace('onIon', 'ion'), (e: Event) => { emit(InputEvents.onUpdate, (e?.target as any)[modelProp]); }); - for (const [key, prop] of Object.entries(props)) { + for (const [key, event] of Object.entries(attrs)) { if (key.startsWith('onIon')) { - vnode.el.addEventListener(key.replace('onIon', 'ion'), prop); + vnode.el.addEventListener(key.replace('onIon', 'ion'), event); } } } @@ -48,9 +49,10 @@ export function defineInput( ); }; + const data = splitPropsAndEvents(componentPropsAndEvents); Input.displayName = name; - Input.props = [modelProp, 'modelValue', ...componentProps]; - Input.emits = [InputEvents.onUpdate]; + Input.props = [modelProp, 'modelValue', ...data.props]; + Input.emits = [InputEvents.onUpdate, ...data.events]; return Input; } diff --git a/src/utils/defineOverlay.ts b/src/utils/defineOverlay.ts index 1a6c113..4b14bf0 100644 --- a/src/utils/defineOverlay.ts +++ b/src/utils/defineOverlay.ts @@ -55,10 +55,12 @@ export function defineOverlay( OverlayEvents[] > = (props, { attrs, slots, emit }) => { const isOpen = props.isOpen === undefined ? props.modelValue : props.isOpen; + const onDidDismiss = attrs.onDidDismiss as (e: Event) => void; - if (!attrs.onDidDismiss) { - attrs.onDidDismiss = () => emit(OverlayEvents.onUpdate, false); - } + attrs.onDidDismiss = (e: Event) => { + onDidDismiss && onDidDismiss(e); + emit(OverlayEvents.onUpdate, false); + }; return h( 'div', @@ -81,7 +83,7 @@ export function defineOverlay( content.value = undefined; } }, - [h('div', { ref: content }, slots.default ? slots.default() : undefined)] + [h('div', { ref: content }, slots.default && slots.default())] ); }; diff --git a/src/utils/splitPropsAndEvents.ts b/src/utils/splitPropsAndEvents.ts new file mode 100644 index 0000000..51e960f --- /dev/null +++ b/src/utils/splitPropsAndEvents.ts @@ -0,0 +1,6 @@ +export const splitPropsAndEvents = (propsAndEvents: string[]) => { + const props: string[] = []; + const events: string[] = []; + propsAndEvents.map(i => (i.startsWith('on') ? events : props).push(i)); + return { props, events }; +}; From ffd11ca9a33307130b66773a8d54aa3050065619 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sun, 26 Jul 2020 13:10:14 +0300 Subject: [PATCH 56/96] Update deps --- package-lock.json | 82 +++++++++++++++++++++++------------------------ package.json | 8 ++--- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12bcf91..c26ecc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -357,9 +357,9 @@ } }, "@ionic/core": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.2.3.tgz", - "integrity": "sha512-EUGicoQfWZV9//sstNkssFxvSaM7zXIG2EbOZVKX+2l7sWkUC39lO9CBZoMyafSppEZT1hMsY1R3coVkGQefEg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.3.0.tgz", + "integrity": "sha512-W6H5mL8N2HvjjGzRnIGE7dEa7itJ9qIw/IC2xExvAo806nULX2PfswLQw3qL09ZOS9OXqZpCDMzX79dEzGa6vg==", "requires": { "ionicons": "^5.1.2", "tslib": "^1.10.0" @@ -745,9 +745,9 @@ } }, "@types/node": { - "version": "14.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.23.tgz", - "integrity": "sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==", + "version": "14.0.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.26.tgz", + "integrity": "sha512-W+fpe5s91FBGE0pEa0lnqGLL4USgpLgs4nokw16SrBBco/gQxuua7KnArSEOd5iaMqbbSHV10vUDkJYJJqpXKA==", "dev": true }, "@types/normalize-package-data": { @@ -784,13 +784,13 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.2.tgz", - "integrity": "sha512-FPPNTd20Y8U5RWyXHWOC22gpSnaFz8V2zDq+f1AQ6xTTRD09qFw7wJ8T50mnVgeXgYbACMnD+RXOAAwYfB6ijQ==", + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.4.tgz", + "integrity": "sha512-0SZKcUTBYI+v9JN9cCjeJvu/jglw7N+l0g3KspjAHLsA8mXZn5XM2j8v22uR3ChoJmxTFjAyuQfFYcomJpqXRw==", "requires": { "@babel/parser": "^7.10.4", "@babel/types": "^7.10.4", - "@vue/shared": "3.0.0-rc.2", + "@vue/shared": "3.0.0-rc.4", "estree-walker": "^2.0.1", "source-map": "^0.6.1" }, @@ -828,45 +828,45 @@ } }, "@vue/compiler-dom": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-rc.2.tgz", - "integrity": "sha512-38iflPPoZtbPBBLDI9q2xP3MQAnUIQFs9aRwSMJqDI0PxEvB2J9O6o5bBtN7QIorL5KnxDO9LLz+RuCgmFIQVQ==", + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-rc.4.tgz", + "integrity": "sha512-CZbPWlcQlLEa/IEXBxvIbs+OgCbONS3Auq/RXRff+zj440XNQ7j4vgd18+8suWaxObL5oBo0wg9BTUhP0oJgog==", "requires": { - "@vue/compiler-core": "3.0.0-rc.2", - "@vue/shared": "3.0.0-rc.2" + "@vue/compiler-core": "3.0.0-rc.4", + "@vue/shared": "3.0.0-rc.4" } }, "@vue/reactivity": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-rc.2.tgz", - "integrity": "sha512-kgnBKzX74sV/Zc2iS5Zp+QwlctMBplsw7LAogGr2K2BrkfjqXSBr4yag/m8poGmceVMNm6/wFsWrOEnbL0hyZQ==", + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-rc.4.tgz", + "integrity": "sha512-Qer7HKYS70imlxPTiIEeSoxXcGLRL96ZoTzDfAOdEd4kjRcztz9tPhiu/70jEuNoHWmQWSWbn09WLusgMB4Eqw==", "requires": { - "@vue/shared": "3.0.0-rc.2" + "@vue/shared": "3.0.0-rc.4" } }, "@vue/runtime-core": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-rc.2.tgz", - "integrity": "sha512-NNeFIkW0IQCuqp77XcgqsYdME7wr6ab6RcSmu9ZSKcEZbqhL+0PVioCjfyMW6Sa+35ng6PegocNbOp++vXIQ9g==", + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-rc.4.tgz", + "integrity": "sha512-wxyB2PwMRF5iPB4JGQ4xbrdYve/oYeh3Gem2JUDGTlSpU6M5HsxyvEL8aUp3uVy+XLgtABoMZZJnYClnWwwzLQ==", "requires": { - "@vue/reactivity": "3.0.0-rc.2", - "@vue/shared": "3.0.0-rc.2" + "@vue/reactivity": "3.0.0-rc.4", + "@vue/shared": "3.0.0-rc.4" } }, "@vue/runtime-dom": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-rc.2.tgz", - "integrity": "sha512-VvT06p5Qm29LdyX+jvEMXgqD5/2PfeftnkIPbLRjvmpcZTxmdm1GmitLfbv2YQvOPUDWjVBmjJ1SHJkdI0SDhg==", + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-rc.4.tgz", + "integrity": "sha512-0YdPMQxJv3IVlCJe0Jr+oN3qXhoCPSgwyxPZhbGgf5tOaNFsBAuqtahNcZL7H9XIiTEI3GdQC2d6UpVSKmwn0g==", "requires": { - "@vue/runtime-core": "3.0.0-rc.2", - "@vue/shared": "3.0.0-rc.2", + "@vue/runtime-core": "3.0.0-rc.4", + "@vue/shared": "3.0.0-rc.4", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-rc.2.tgz", - "integrity": "sha512-lJ1jb5PEDoSTosKdOyFh9/GpSFY/d9HXkG126aJXM4WgvJaf+OVKUWKZSgqolKLLIOJHG9ZcQt4OQyoktMenBg==" + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-rc.4.tgz", + "integrity": "sha512-cN1YTH/LUPsufLrDQR/n/DxdTu7GjsmLWcZ249mQc+fcYeUdjAFDiOHL2xWE/s3g6jwwOMjS7jelpxYUctD7Gw==" }, "@vue/test-utils": { "version": "2.0.0-beta.0", @@ -6427,13 +6427,13 @@ } }, "vue": { - "version": "3.0.0-rc.2", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-rc.2.tgz", - "integrity": "sha512-syYidmtdfAz2aN1q7F/TlyPZdRXjIbp/QnpetWwhoBaOQOnqm+dHN5KwN8xBF+eUE4ys4aO8rrv7ulTQ4l8rFQ==", + "version": "3.0.0-rc.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-rc.4.tgz", + "integrity": "sha512-nBmuGl/M2LEHn5Db+9Xm0cJoC7yKpx+9RJJObVMLUB4ru7z+ysL4ugKuag+1ehvl6SnljbvYOcuQeGLLvKK07w==", "requires": { - "@vue/compiler-dom": "3.0.0-rc.2", - "@vue/runtime-dom": "3.0.0-rc.2", - "@vue/shared": "3.0.0-rc.2" + "@vue/compiler-dom": "3.0.0-rc.4", + "@vue/runtime-dom": "3.0.0-rc.4", + "@vue/shared": "3.0.0-rc.4" } }, "vue-class-component": { @@ -6452,9 +6452,9 @@ } }, "vue-router": { - "version": "4.0.0-beta.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.2.tgz", - "integrity": "sha512-+TvUCpxEhgSCssMTXdX4qei/YZN1kEt4nZoOySPLLUlAeEIlY3K1ps3hyCOeC1qYGCuSwaWuDmK/yi2d7W0sSg==" + "version": "4.0.0-beta.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.4.tgz", + "integrity": "sha512-Cp8CkTcQuWL3neBLZnd+zg7cH0aA/kX1AwNLmdrChz5z6JI9hNu2qImAXNvhobDddLtNbyjdYSedCB9RYt6aig==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index 3c85be2..591b31f 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ }, "devDependencies": { "@types/jest": "^25.2.3", - "@types/node": "^14.0.23", + "@types/node": "^14.0.26", "@vue/test-utils": "^2.0.0-beta.0", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", @@ -78,9 +78,9 @@ "typescript": "^3.9.7" }, "dependencies": { - "@ionic/core": "^5.2.3", - "vue": "^3.0.0-rc.2", - "vue-router": "^4.0.0-beta.2" + "@ionic/core": "^5.3.0", + "vue": "^3.0.0-rc.4", + "vue-router": "^4.0.0-beta.4" }, "jestSonar": { "reportPath": "reports", From 74b1be9923523839bcc6e83eb14ac1aec52af47f Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 8 Aug 2020 00:00:27 +0300 Subject: [PATCH 57/96] Fix outlet component rendering --- package-lock.json | 162 +++++++++++++------------- package.json | 14 +-- src/components/router-outlet/index.ts | 4 +- src/utils/defineContainer.ts | 1 - 4 files changed, 91 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index c26ecc1..0cd7eb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -357,9 +357,9 @@ } }, "@ionic/core": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.3.0.tgz", - "integrity": "sha512-W6H5mL8N2HvjjGzRnIGE7dEa7itJ9qIw/IC2xExvAo806nULX2PfswLQw3qL09ZOS9OXqZpCDMzX79dEzGa6vg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.3.1.tgz", + "integrity": "sha512-psOiYZbpL5uGKi7MZ9BXCfQIdJVVVW1n8AvrWAiifFE/ebI1x0wbO+D5QLmF2Mc2t/d0nbk4N1V8XyF2bjjiLg==", "requires": { "ionicons": "^5.1.2", "tslib": "^1.10.0" @@ -745,9 +745,9 @@ } }, "@types/node": { - "version": "14.0.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.26.tgz", - "integrity": "sha512-W+fpe5s91FBGE0pEa0lnqGLL4USgpLgs4nokw16SrBBco/gQxuua7KnArSEOd5iaMqbbSHV10vUDkJYJJqpXKA==", + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", "dev": true }, "@types/normalize-package-data": { @@ -784,13 +784,13 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.4.tgz", - "integrity": "sha512-0SZKcUTBYI+v9JN9cCjeJvu/jglw7N+l0g3KspjAHLsA8mXZn5XM2j8v22uR3ChoJmxTFjAyuQfFYcomJpqXRw==", + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.5.tgz", + "integrity": "sha512-dNz5AObEYg0Oglw3emIsBhTAOVfObrfxDaAzR0UTRDDq+Ohfr6KTSaVQAH88Ym+oa08ZlLZBFc6ARe9doAOIxg==", "requires": { "@babel/parser": "^7.10.4", "@babel/types": "^7.10.4", - "@vue/shared": "3.0.0-rc.4", + "@vue/shared": "3.0.0-rc.5", "estree-walker": "^2.0.1", "source-map": "^0.6.1" }, @@ -801,14 +801,14 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, "@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==" + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz", + "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==" }, "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -828,50 +828,50 @@ } }, "@vue/compiler-dom": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-rc.4.tgz", - "integrity": "sha512-CZbPWlcQlLEa/IEXBxvIbs+OgCbONS3Auq/RXRff+zj440XNQ7j4vgd18+8suWaxObL5oBo0wg9BTUhP0oJgog==", + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0-rc.5.tgz", + "integrity": "sha512-z8n+R1GhFnWuKURLYxfVSEfP7nSNM91qteobxwys55fhlZZuReouMnUwgrn+ois/IL6RdFlT9H+n4+N6yLrdJA==", "requires": { - "@vue/compiler-core": "3.0.0-rc.4", - "@vue/shared": "3.0.0-rc.4" + "@vue/compiler-core": "3.0.0-rc.5", + "@vue/shared": "3.0.0-rc.5" } }, "@vue/reactivity": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-rc.4.tgz", - "integrity": "sha512-Qer7HKYS70imlxPTiIEeSoxXcGLRL96ZoTzDfAOdEd4kjRcztz9tPhiu/70jEuNoHWmQWSWbn09WLusgMB4Eqw==", + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.0-rc.5.tgz", + "integrity": "sha512-oe9C+1jtWUdYL/iNc0OPWbwgOk2rOW2uQ+exx3I6Jo6PKOmnAiPkMElalf9vRnO53rnUphVecMp8BlTJvcNgDw==", "requires": { - "@vue/shared": "3.0.0-rc.4" + "@vue/shared": "3.0.0-rc.5" } }, "@vue/runtime-core": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-rc.4.tgz", - "integrity": "sha512-wxyB2PwMRF5iPB4JGQ4xbrdYve/oYeh3Gem2JUDGTlSpU6M5HsxyvEL8aUp3uVy+XLgtABoMZZJnYClnWwwzLQ==", + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.0-rc.5.tgz", + "integrity": "sha512-MRIWreFigxdRuI2moFociUL5rVBfgYPrT7rWfQ0XfOyW46b+AiuCJyZvgbsRXwkAERfW1Tb/mY5forYjX2thOg==", "requires": { - "@vue/reactivity": "3.0.0-rc.4", - "@vue/shared": "3.0.0-rc.4" + "@vue/reactivity": "3.0.0-rc.5", + "@vue/shared": "3.0.0-rc.5" } }, "@vue/runtime-dom": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-rc.4.tgz", - "integrity": "sha512-0YdPMQxJv3IVlCJe0Jr+oN3qXhoCPSgwyxPZhbGgf5tOaNFsBAuqtahNcZL7H9XIiTEI3GdQC2d6UpVSKmwn0g==", + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0-rc.5.tgz", + "integrity": "sha512-0jwpO3MBqMToq7qC816Z8Y6G8aN4ZKbv7MupgRaepzxhiK0sXcjLQmOATP3g/NyX52UCBJS4wAwsxidqGnAabA==", "requires": { - "@vue/runtime-core": "3.0.0-rc.4", - "@vue/shared": "3.0.0-rc.4", + "@vue/runtime-core": "3.0.0-rc.5", + "@vue/shared": "3.0.0-rc.5", "csstype": "^2.6.8" } }, "@vue/shared": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-rc.4.tgz", - "integrity": "sha512-cN1YTH/LUPsufLrDQR/n/DxdTu7GjsmLWcZ249mQc+fcYeUdjAFDiOHL2xWE/s3g6jwwOMjS7jelpxYUctD7Gw==" + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0-rc.5.tgz", + "integrity": "sha512-ZhcgGzBpp+pUzisZgQpM4ctIGgLpYjBj7/rZfbhEPxFHF/BuTV2jmhXvAl8aF9xDAejIcw85xCy92gDSwKtPag==" }, "@vue/test-utils": { - "version": "2.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-beta.0.tgz", - "integrity": "sha512-D9LPFqx+RMMtRFNdjR5SPBASM44nTiSF0mR3kE7yjD2i4zse7eMlVGIzF2KbiEkF8v6W/4oz2TfwIAiWPfxibA==", + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-beta.2.tgz", + "integrity": "sha512-RgbV/79clAYtRqmHHz3aISpveiUz2RwZJHWzo972AEYO336SrPqp0u4VeTHNl8yc+wn5GwSGoEusjf9d4jjLDw==", "dev": true }, "abab": { @@ -2292,9 +2292,9 @@ } }, "csstype": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.11.tgz", - "integrity": "sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw==" + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.13.tgz", + "integrity": "sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==" }, "dashdash": { "version": "1.14.1", @@ -4398,13 +4398,10 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "ms": { "version": "2.1.2", @@ -5972,9 +5969,9 @@ } }, "ts-jest": { - "version": "26.1.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.3.tgz", - "integrity": "sha512-beUTSvuqR9SmKQEylewqJdnXWMVGJRFqSz2M8wKJe7GBMmLZ5zw6XXKSJckbHNMxn+zdB3guN2eOucSw2gBMnw==", + "version": "26.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.4.tgz", + "integrity": "sha512-Nd7diUX6NZWfWq6FYyvcIPR/c7GbEF75fH1R6coOp3fbNzbRJBZZAn0ueVS0r8r9ral1VcrpneAFAwB3TsVS1Q==", "dev": true, "requires": { "bs-logger": "0.x", @@ -5990,13 +5987,14 @@ }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.2.0.tgz", + "integrity": "sha512-lvm3rJvctxd7+wxKSxxbzpDbr4FXDLaC57WEKdUIZ2cjTYuxYSc0zlyD7Z4Uqr5VdKxRUrtwIkiqBuvgf8uKJA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } @@ -6049,24 +6047,19 @@ "dev": true }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.2.0.tgz", + "integrity": "sha512-YmDwJxLZ1kFxpxPfhSJ0rIkiZOM0PQbRcfH0TzJOhqCisCAsI1WcmoQqO83My9xeVA2k4n+rzg2UuexVKzPpig==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.2.0", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "micromatch": "^4.0.2" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", @@ -6128,9 +6121,9 @@ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" }, "tslint": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", - "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -6144,7 +6137,7 @@ "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.10.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "dependencies": { @@ -6158,6 +6151,15 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -6427,13 +6429,13 @@ } }, "vue": { - "version": "3.0.0-rc.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-rc.4.tgz", - "integrity": "sha512-nBmuGl/M2LEHn5Db+9Xm0cJoC7yKpx+9RJJObVMLUB4ru7z+ysL4ugKuag+1ehvl6SnljbvYOcuQeGLLvKK07w==", + "version": "3.0.0-rc.5", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.0-rc.5.tgz", + "integrity": "sha512-8t8Y4sHMBGD5iLZ7JfBGmKBJlzesPoL+/nW9EV8s+4LwnKC4rGlRp+Lj2rcign4iQaj0GFaL7DrQ8IoOfVX6+w==", "requires": { - "@vue/compiler-dom": "3.0.0-rc.4", - "@vue/runtime-dom": "3.0.0-rc.4", - "@vue/shared": "3.0.0-rc.4" + "@vue/compiler-dom": "3.0.0-rc.5", + "@vue/runtime-dom": "3.0.0-rc.5", + "@vue/shared": "3.0.0-rc.5" } }, "vue-class-component": { @@ -6452,9 +6454,9 @@ } }, "vue-router": { - "version": "4.0.0-beta.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.4.tgz", - "integrity": "sha512-Cp8CkTcQuWL3neBLZnd+zg7cH0aA/kX1AwNLmdrChz5z6JI9hNu2qImAXNvhobDddLtNbyjdYSedCB9RYt6aig==" + "version": "4.0.0-beta.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.6.tgz", + "integrity": "sha512-zF+reWzcM0ivbIAbjfCpDVYlvc4iQAi7rx5abLNUcNiJxuTMR0lEBoxamQcaewV4sJ+zskX6PYW3QM5/fRkPqA==" }, "w3c-hr-time": { "version": "1.0.2", diff --git a/package.json b/package.json index 591b31f..a40a423 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,8 @@ }, "devDependencies": { "@types/jest": "^25.2.3", - "@types/node": "^14.0.26", - "@vue/test-utils": "^2.0.0-beta.0", + "@types/node": "^14.0.27", + "@vue/test-utils": "^2.0.0-beta.2", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", "jest": "^25.5.4", @@ -69,18 +69,18 @@ "rollup-plugin-buble": "^0.19.2", "rollup-plugin-terser": "^1.0.1", "rollup-plugin-typescript2": "^0.27.1", - "ts-jest": "^26.1.3", + "ts-jest": "^26.1.4", "ts-loader": "^7.0.5", "ts-transformer-keys": "^0.4.2", "tslib": "^1.13.0", - "tslint": "^6.1.2", + "tslint": "^6.1.3", "tslint-ionic-rules": "^0.0.21", "typescript": "^3.9.7" }, "dependencies": { - "@ionic/core": "^5.3.0", - "vue": "^3.0.0-rc.4", - "vue-router": "^4.0.0-beta.4" + "@ionic/core": "^5.3.1", + "vue": "^3.0.0-rc.5", + "vue-router": "^4.0.0-beta.6" }, "jestSonar": { "reportPath": "reports", diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 9c41fd8..eb4d6ef 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -92,7 +92,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { const { Component, route: matchedRoute } = opts[0]; const child = newView.value ?? Component; - if (newView.value?.type === Component.type) { + if (newView.value?.type === Component?.type) { newView.value = undefined; } @@ -118,7 +118,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { return slots.default ? slots.default({ Component: child, route: matchedRoute, transitionProps }) - : h(Transition, transitionProps, () => Component); + : h(Transition, transitionProps, () => child); }); return h( diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index 8816316..1ad62fb 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -16,7 +16,6 @@ export const defineContainer = (name: string, componentPro export const defineNavigableContainer = (name: string, componentPropsAndEvents: string[]) => { const Container: FunctionalComponent = (props, { attrs, slots }) => { - console.log(name, { ...props }, attrs); const router = useRouter(); if (router && props.href !== undefined) { From 352e7801b55ae6e7c981855c7e2b3a629de38322 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Sat, 8 Aug 2020 00:07:48 +0300 Subject: [PATCH 58/96] [build] 3.0.0-alpha.14 --- CHANGELOG.md | 7 ++++++- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7fac79..fc975c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ -# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.13...dev) +# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.14...dev) --- +# [3.0.0-alpha.14](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.13...v3.0.0-alpha.14) + +### Bug fixes +* Fix rendering of route components when using swipe-back gesture + # [3.0.0-alpha.13](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.12...v3.0.0-alpha.13) ### Features diff --git a/package-lock.json b/package-lock.json index 0cd7eb4..c483f75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.13", + "version": "3.0.0-alpha.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a40a423..0e15012 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.13", + "version": "3.0.0-alpha.14", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From fd33111d8910685d8c3694618fbbd0c404aa3027 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 11 Aug 2020 19:54:32 +0300 Subject: [PATCH 59/96] Fixes #138 #139 #140 --- .eslintrc.js | 14 + CHANGELOG.md | 7 + package-lock.json | 610 +++++++++++++++++++++++++++++++++++ package.json | 4 +- src/components/containers.ts | 1 + src/components/index.ts | 1 + src/components/page/index.ts | 7 + src/interfaces.ts | 1 + src/utils/defineContainer.ts | 9 +- 9 files changed, 650 insertions(+), 4 deletions(-) create mode 100644 .eslintrc.js create mode 100644 src/components/page/index.ts diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..86d6560 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + }, + rules: { + 'no-unused-vars': [ + 'error', + // we are only using this rule to check for unused arguments since TS + // catches unused variables but not args. + { varsIgnorePattern: '.*', args: 'after-used', argsIgnorePattern: '^_' }, + ], + }, +}; diff --git a/CHANGELOG.md b/CHANGELOG.md index fc975c4..d3acc99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.14...dev) +### Features +* Added IonPage and IonRouterLink Ionic components +* Switched to eslint + +### Bug fixes +* Fix handling of target attribute + --- # [3.0.0-alpha.14](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.13...v3.0.0-alpha.14) diff --git a/package-lock.json b/package-lock.json index c483f75..59df12d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -694,6 +694,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -744,6 +750,12 @@ "pretty-format": "^25.2.1" } }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, "@types/node": { "version": "14.0.27", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", @@ -783,6 +795,80 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, + "@typescript-eslint/experimental-utils": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.0.tgz", + "integrity": "sha512-/vSHUDYizSOhrOJdjYxPNGfb4a3ibO8zd4nUKo/QBFOmxosT3cVUV7KIg8Dwi6TXlr667G7YPqFK9+VSZOorNA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.9.0", + "@typescript-eslint/typescript-estree": "3.9.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.9.0.tgz", + "integrity": "sha512-rDHOKb6uW2jZkHQniUQVZkixQrfsZGUCNWWbKWep4A5hGhN5dLHMUCNAWnC4tXRlHedXkTDptIpxs6e4Pz8UfA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.9.0", + "@typescript-eslint/types": "3.9.0", + "@typescript-eslint/typescript-estree": "3.9.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/types": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.9.0.tgz", + "integrity": "sha512-rb6LDr+dk9RVVXO/NJE8dT1pGlso3voNdEIN8ugm4CWM5w5GimbThCMiMl4da1t5u3YwPWEwOnKAULCZgBtBHg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.0.tgz", + "integrity": "sha512-N+158NKgN4rOmWVfvKOMoMFV5n8XxAliaKkArm/sOypzQ0bUL8MSnOEBW3VFIeffb/K5ce/cAV0yYhR7U4ALAA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.9.0", + "@typescript-eslint/visitor-keys": "3.9.0", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.0.tgz", + "integrity": "sha512-O1qeoGqDbu0EZUC/MZ6F1WHTIzcBVhGqDj3LhTnj65WUA548RXVxUHbYhAW9bZWfb2rnX9QsbbP5nmeJ5Z4+ng==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "@vue/compiler-core": { "version": "3.0.0-rc.5", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.5.tgz", @@ -934,6 +1020,12 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -2507,6 +2599,15 @@ } } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -2544,12 +2645,294 @@ "source-map": "~0.6.1" } }, + "eslint": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", + "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + } + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "dev": true, + "requires": { + "acorn": "^7.3.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -2811,6 +3194,15 @@ "bser": "2.1.1" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2865,6 +3257,34 @@ "path-exists": "^4.0.0" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2921,6 +3341,12 @@ "dev": true, "optional": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -2971,6 +3397,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3120,6 +3555,30 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "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-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -3265,6 +3724,12 @@ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3277,6 +3742,15 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4131,6 +4605,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4647,6 +5127,15 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-json": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", @@ -4800,6 +5289,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -4944,6 +5439,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -5454,6 +5955,25 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -5810,6 +6330,12 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5852,6 +6378,58 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -5890,6 +6468,12 @@ "minimatch": "^3.0.4" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -6388,6 +6972,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, "v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -6599,6 +7189,26 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", diff --git a/package.json b/package.json index 0e15012..7127282 100644 --- a/package.json +++ b/package.json @@ -52,16 +52,18 @@ "dev": "rollup -c ./build/rollup.config.js", "watch": "rollup -w -c ./build/rollup.config.js", "prod": "npm run lint && npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd", - "lint": "tslint --project . --fix", + "lint": "eslint --ext .ts src/** --fix", "test": "jest --coverage --verbose", "clean": "node ./scripts/clean.js" }, "devDependencies": { "@types/jest": "^25.2.3", "@types/node": "^14.0.27", + "@typescript-eslint/parser": "^3.9.0", "@vue/test-utils": "^2.0.0-beta.2", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", + "eslint": "^7.6.0", "jest": "^25.5.4", "jest-sonar-reporter": "^2.0.0", "jest-vue-preprocessor": "^1.4.0", diff --git a/src/components/containers.ts b/src/components/containers.ts index 7039245..f3059ae 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -46,6 +46,7 @@ export const IonRefresherContent = /*@__PURE__*/defineContainer('ion-reorder', keys()); export const IonReorderGroup = /*@__PURE__*/defineContainer('ion-reorder-group', keys()); export const IonRippleEffect = /*@__PURE__*/defineContainer('ion-ripple-effect', keys()); +export const IonRouterLink = /*@__PURE__*/defineNavigableContainer('ion-router-link', keys()); export const IonRow = /*@__PURE__*/defineContainer('ion-row', keys()); export const IonSegment = /*@__PURE__*/defineContainer('ion-segment', keys()); export const IonSegmentButton = /*@__PURE__*/defineContainer('ion-segment-button', keys()); diff --git a/src/components/index.ts b/src/components/index.ts index 8eb914d..7c4b36e 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -5,3 +5,4 @@ export * from './router-outlet'; export * from './back-button'; export * from './tabs'; export * from './icon'; +export * from './page'; diff --git a/src/components/page/index.ts b/src/components/page/index.ts new file mode 100644 index 0000000..dff1d5d --- /dev/null +++ b/src/components/page/index.ts @@ -0,0 +1,7 @@ +import { FunctionalComponent, h } from 'vue'; + +export const IonPage: FunctionalComponent = (props, { slots }) => { + return h('ion-page', { ...props, class: 'ion-page' }, slots); +}; + +IonPage.displayName = 'ion-page'; diff --git a/src/interfaces.ts b/src/interfaces.ts index 67c4129..4d16a41 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -4,6 +4,7 @@ import { Direction } from './router'; export interface Navigable { href?: RouteLocationRaw; + target?: string; onClick?: (e: MouseEvent) => void; } diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index 1ad62fb..19c3060 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -26,10 +26,13 @@ export const defineNavigableContainer = (name: string, com attrs.onClick = (e: MouseEvent) => { oldClick && oldClick(e); directionOverride.value = props.routerDirection; - if (!e.defaultPrevented) { - link.navigate(e); - e.preventDefault(); + + if (e.defaultPrevented || (props.target && /\b_blank\b/i.test(props.target))) { + return; } + + link.navigate(e); + e.preventDefault(); }; } From 0a2b45efa3c088d3ffd1347dcf66198be4692a4b Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 11 Aug 2020 19:56:26 +0300 Subject: [PATCH 60/96] Fixes #138 #139 #140 (#141) --- .eslintrc.js | 14 + CHANGELOG.md | 7 + package-lock.json | 610 +++++++++++++++++++++++++++++++++++ package.json | 4 +- src/components/containers.ts | 1 + src/components/index.ts | 1 + src/components/page/index.ts | 7 + src/interfaces.ts | 1 + src/utils/defineContainer.ts | 9 +- 9 files changed, 650 insertions(+), 4 deletions(-) create mode 100644 .eslintrc.js create mode 100644 src/components/page/index.ts diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..86d6560 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + }, + rules: { + 'no-unused-vars': [ + 'error', + // we are only using this rule to check for unused arguments since TS + // catches unused variables but not args. + { varsIgnorePattern: '.*', args: 'after-used', argsIgnorePattern: '^_' }, + ], + }, +}; diff --git a/CHANGELOG.md b/CHANGELOG.md index fc975c4..d3acc99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.14...dev) +### Features +* Added IonPage and IonRouterLink Ionic components +* Switched to eslint + +### Bug fixes +* Fix handling of target attribute + --- # [3.0.0-alpha.14](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.13...v3.0.0-alpha.14) diff --git a/package-lock.json b/package-lock.json index c483f75..59df12d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -694,6 +694,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -744,6 +750,12 @@ "pretty-format": "^25.2.1" } }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, "@types/node": { "version": "14.0.27", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", @@ -783,6 +795,80 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, + "@typescript-eslint/experimental-utils": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.0.tgz", + "integrity": "sha512-/vSHUDYizSOhrOJdjYxPNGfb4a3ibO8zd4nUKo/QBFOmxosT3cVUV7KIg8Dwi6TXlr667G7YPqFK9+VSZOorNA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.9.0", + "@typescript-eslint/typescript-estree": "3.9.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.9.0.tgz", + "integrity": "sha512-rDHOKb6uW2jZkHQniUQVZkixQrfsZGUCNWWbKWep4A5hGhN5dLHMUCNAWnC4tXRlHedXkTDptIpxs6e4Pz8UfA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.9.0", + "@typescript-eslint/types": "3.9.0", + "@typescript-eslint/typescript-estree": "3.9.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/types": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.9.0.tgz", + "integrity": "sha512-rb6LDr+dk9RVVXO/NJE8dT1pGlso3voNdEIN8ugm4CWM5w5GimbThCMiMl4da1t5u3YwPWEwOnKAULCZgBtBHg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.0.tgz", + "integrity": "sha512-N+158NKgN4rOmWVfvKOMoMFV5n8XxAliaKkArm/sOypzQ0bUL8MSnOEBW3VFIeffb/K5ce/cAV0yYhR7U4ALAA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "3.9.0", + "@typescript-eslint/visitor-keys": "3.9.0", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.0.tgz", + "integrity": "sha512-O1qeoGqDbu0EZUC/MZ6F1WHTIzcBVhGqDj3LhTnj65WUA548RXVxUHbYhAW9bZWfb2rnX9QsbbP5nmeJ5Z4+ng==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "@vue/compiler-core": { "version": "3.0.0-rc.5", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0-rc.5.tgz", @@ -934,6 +1020,12 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -2507,6 +2599,15 @@ } } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -2544,12 +2645,294 @@ "source-map": "~0.6.1" } }, + "eslint": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", + "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + } + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "dev": true, + "requires": { + "acorn": "^7.3.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -2811,6 +3194,15 @@ "bser": "2.1.1" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2865,6 +3257,34 @@ "path-exists": "^4.0.0" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2921,6 +3341,12 @@ "dev": true, "optional": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -2971,6 +3397,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3120,6 +3555,30 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "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-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -3265,6 +3724,12 @@ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3277,6 +3742,15 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4131,6 +4605,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4647,6 +5127,15 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-json": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", @@ -4800,6 +5289,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -4944,6 +5439,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -5454,6 +5955,25 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -5810,6 +6330,12 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5852,6 +6378,58 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -5890,6 +6468,12 @@ "minimatch": "^3.0.4" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -6388,6 +6972,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, "v8-to-istanbul": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", @@ -6599,6 +7189,26 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", diff --git a/package.json b/package.json index 0e15012..7127282 100644 --- a/package.json +++ b/package.json @@ -52,16 +52,18 @@ "dev": "rollup -c ./build/rollup.config.js", "watch": "rollup -w -c ./build/rollup.config.js", "prod": "npm run lint && npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd", - "lint": "tslint --project . --fix", + "lint": "eslint --ext .ts src/** --fix", "test": "jest --coverage --verbose", "clean": "node ./scripts/clean.js" }, "devDependencies": { "@types/jest": "^25.2.3", "@types/node": "^14.0.27", + "@typescript-eslint/parser": "^3.9.0", "@vue/test-utils": "^2.0.0-beta.2", "babel-jest": "^25.5.1", "babel-preset-env": "^1.7.0", + "eslint": "^7.6.0", "jest": "^25.5.4", "jest-sonar-reporter": "^2.0.0", "jest-vue-preprocessor": "^1.4.0", diff --git a/src/components/containers.ts b/src/components/containers.ts index 7039245..f3059ae 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -46,6 +46,7 @@ export const IonRefresherContent = /*@__PURE__*/defineContainer('ion-reorder', keys()); export const IonReorderGroup = /*@__PURE__*/defineContainer('ion-reorder-group', keys()); export const IonRippleEffect = /*@__PURE__*/defineContainer('ion-ripple-effect', keys()); +export const IonRouterLink = /*@__PURE__*/defineNavigableContainer('ion-router-link', keys()); export const IonRow = /*@__PURE__*/defineContainer('ion-row', keys()); export const IonSegment = /*@__PURE__*/defineContainer('ion-segment', keys()); export const IonSegmentButton = /*@__PURE__*/defineContainer('ion-segment-button', keys()); diff --git a/src/components/index.ts b/src/components/index.ts index 8eb914d..7c4b36e 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -5,3 +5,4 @@ export * from './router-outlet'; export * from './back-button'; export * from './tabs'; export * from './icon'; +export * from './page'; diff --git a/src/components/page/index.ts b/src/components/page/index.ts new file mode 100644 index 0000000..dff1d5d --- /dev/null +++ b/src/components/page/index.ts @@ -0,0 +1,7 @@ +import { FunctionalComponent, h } from 'vue'; + +export const IonPage: FunctionalComponent = (props, { slots }) => { + return h('ion-page', { ...props, class: 'ion-page' }, slots); +}; + +IonPage.displayName = 'ion-page'; diff --git a/src/interfaces.ts b/src/interfaces.ts index 67c4129..4d16a41 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -4,6 +4,7 @@ import { Direction } from './router'; export interface Navigable { href?: RouteLocationRaw; + target?: string; onClick?: (e: MouseEvent) => void; } diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index 1ad62fb..19c3060 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -26,10 +26,13 @@ export const defineNavigableContainer = (name: string, com attrs.onClick = (e: MouseEvent) => { oldClick && oldClick(e); directionOverride.value = props.routerDirection; - if (!e.defaultPrevented) { - link.navigate(e); - e.preventDefault(); + + if (e.defaultPrevented || (props.target && /\b_blank\b/i.test(props.target))) { + return; } + + link.navigate(e); + e.preventDefault(); }; } From 9e9d6b630d384707c850559ec3c6eebf2b1f873f Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 14 Aug 2020 00:20:35 +0300 Subject: [PATCH 61/96] Fix tabs --- CHANGELOG.md | 2 ++ src/components/tabs/tab-bar.ts | 11 ++++++----- src/components/tabs/tab-button.ts | 9 ++++++--- src/components/tabs/tab.ts | 18 ++++++++---------- src/components/tabs/tabs.ts | 8 ++------ 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3acc99..8f0d45d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ ### Bug fixes * Fix handling of target attribute +* Fix IonTabs refs +* Fix switching between tabs with routes and plain tabs causing a redirect --- diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index fafd0e9..24efb7f 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -1,5 +1,5 @@ import { FunctionalComponent, h, ref } from 'vue'; -import { tabNodesRef } from './tabs'; +import { tabRefs } from './tabs'; import { JSX } from '@ionic/core'; const name = 'ion-tab-bar'; @@ -13,14 +13,15 @@ const componentProps: (keyof JSX.IonTabBar)[] = [ export const tabBarRef = ref(); export const setActiveTab = (value?: string) => { - tabNodesRef.value.forEach((tab, tabName) => { - // already unref-ed thus casting - tab.ref && ((tab.ref as unknown as HTMLIonTabElement).active = tabName === value); + Object.keys(tabRefs).forEach((tabName) => { + const tab = tabRefs[tabName]?.value; + tab && (tab.active = tabName === value); }); }; export const IonTabBar: FunctionalComponent = (props, { slots }) => { - const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabNodesRef?.value.size && tabNodesRef.value.entries().next().value[0]) || undefined; + const tabs = Object.keys(tabRefs); + const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabs.length && tabs[0]) || undefined; return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); }; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index 967bb6d..e4a65b1 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -1,7 +1,7 @@ import { FunctionalComponent, h } from 'vue'; import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; -import { tabNodesRef, tabsRef } from './tabs'; +import { tabLocations, tabsRef } from './tabs'; import { setActiveTab, tabBarRef } from './tab-bar'; import { Navigable } from '../../interfaces'; @@ -32,11 +32,14 @@ export const IonTabButton: FunctionalComponent = ( tabsRef.value.onIonTabsWillChange(new CustomEvent('ionTabWillChange', { detail: { tab: props.tab } })); } + const wasActiveTab = tabBarRef.value?.selectedTab === props.tab; tabBarRef.value && (tabBarRef.value.selectedTab = props?.tab); if (props.tab && props.href && router) { - const location = tabNodesRef.value.get(props.tab)?.location || props.href; - location && router.push(router.currentRoute.value.fullPath === location ? props.href : location); + const location = tabLocations[props.tab] || props.href; + const goToRoot = wasActiveTab && router.currentRoute.value.fullPath === location; + setActiveTab(tabBarRef.value?.selectedTab); + location && router.push(goToRoot ? props.href : location); } else { setActiveTab(tabBarRef.value?.selectedTab); } diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index b2df3c2..4064446 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -1,15 +1,14 @@ -import { FunctionalComponent, Ref, getCurrentInstance, h, onActivated, ref } from 'vue'; +import { FunctionalComponent, getCurrentInstance, h, onActivated, ref } from 'vue'; import { useRoute } from 'vue-router'; import { JSX } from '@ionic/core'; -import { tabNodesRef } from './tabs'; import { tabBarRef } from './tab-bar'; +import { tabLocations, tabRefs } from './tabs'; const name = 'ion-tab'; const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; -const refs: { [key: string]: Ref } = {}; export const IonTab: FunctionalComponent> = (props, { slots }) => { - let tabNode = tabNodesRef.value.get(props.tab); + let tabNode = tabRefs[props.tab]; let active = tabBarRef.value?.selectedTab === props.tab; const instance = getCurrentInstance()!; const route = useRoute(); @@ -20,16 +19,15 @@ export const IonTab: FunctionalComponent> = (props } if (!tabNode) { - refs[props.tab] = ref(); - tabNodesRef.value.set(props.tab, { ref: refs[props.tab] }); + tabRefs[props.tab] = ref(); } - tabNode = tabNodesRef.value.get(props.tab)!; + tabNode = tabRefs[props.tab]; // Only add Lifecycle.ACTIVATE hooks once // @ts-ignore if (!instance?.a || instance?.a.length === 0) { onActivated(() => { - const tabRef = refs[props.tab].value; + const tabRef = tabRefs[props.tab].value; tabBarRef.value && (tabBarRef.value.selectedTab = props.tab); tabRef && (tabRef.active = true); }, instance); @@ -37,14 +35,14 @@ export const IonTab: FunctionalComponent> = (props const onVnodeUpdated = () => { if (tabBarRef.value?.selectedTab === props.tab) { - tabNode && route && (tabNode.location = route.fullPath); + route && (tabLocations[props.tab] = route.fullPath); } }; const onVnodeBeforeUnmount = () => { tabBarRef.value && (tabBarRef.value.selectedTab = undefined); }; - return h(name, { ...props, active, onVnodeUpdated, onVnodeBeforeUnmount, ref: refs[props.tab] }, slots.default && slots.default()); + return h(name, { ...props, active, onVnodeUpdated, onVnodeBeforeUnmount, ref: tabRefs[props.tab] }, slots.default && slots.default()); }; IonTab.displayName = name; diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts index e079f51..cbb8a20 100644 --- a/src/components/tabs/tabs.ts +++ b/src/components/tabs/tabs.ts @@ -21,13 +21,9 @@ const innerStyles = { contain: 'layout size style', }; -export interface Tab { - ref: Ref; - location?: string; -} - -export const tabNodesRef = ref>(new Map()); export const tabsRef = ref(); +export const tabRefs: { [key: string]: Ref } = {}; +export const tabLocations: { [key: string]: string | undefined } = {}; export const IonTabs: FunctionalComponent = (props, { slots }) => { const { onIonTabsWillChange, onIonTabsDidChange, ...restProps } = props; From 4d363a450c9a05d6eca99a452132c185fe695aba Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 14 Aug 2020 14:56:23 +0300 Subject: [PATCH 62/96] Fix ionRadioGroup --- CHANGELOG.md | 1 + src/components/containers.ts | 1 - src/components/inputs.ts | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f0d45d..02214d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * Fix handling of target attribute * Fix IonTabs refs * Fix switching between tabs with routes and plain tabs causing a redirect +* Fix IonRadioGroup v-model --- diff --git a/src/components/containers.ts b/src/components/containers.ts index f3059ae..2e144fe 100644 --- a/src/components/containers.ts +++ b/src/components/containers.ts @@ -40,7 +40,6 @@ export const IonMenuToggle = /*@__PURE__*/defineContainer('io export const IonNote = /*@__PURE__*/defineContainer('ion-note', keys()); export const IonPickerColumn = /*@__PURE__*/defineContainer('ion-picker-column', keys()); export const IonProgressBar = /*@__PURE__*/defineContainer('ion-progress-bar', keys()); -export const IonRadioGroup = /*@__PURE__*/defineContainer('ion-radio-group', keys()); export const IonRefresher = /*@__PURE__*/defineContainer('ion-refresher', keys()); export const IonRefresherContent = /*@__PURE__*/defineContainer('ion-refresher-content', keys()); export const IonReorder = /*@__PURE__*/ defineContainer('ion-reorder', keys()); diff --git a/src/components/inputs.ts b/src/components/inputs.ts index 0feb43c..b9cb023 100644 --- a/src/components/inputs.ts +++ b/src/components/inputs.ts @@ -12,6 +12,7 @@ export const IonCheckbox = /*@__PURE__*/defineInput( export const IonDatetime = /*@__PURE__*/defineInput('IonDatetime', 'ion-datetime', keys()); export const IonInput = /*@__PURE__*/defineInput('IonInput', 'ion-input', keys(), 'onIonInput'); export const IonRadio = /*@__PURE__*/defineInput('IonRadio', 'ion-radio', keys(), 'onIonSelect'); +export const IonRadioGroup = /*@__PURE__*/defineInput('IonRadioGroup', 'ion-radio-group', keys(), 'onIonChange'); export const IonRange = /*@__PURE__*/defineInput('IonRange', 'ion-range', keys()); export const IonSearchbar = /*@__PURE__*/defineInput( 'IonSearchbar', From 26a88455a382a5038b4d8369920b93df8afd4754 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Fri, 14 Aug 2020 14:56:56 +0300 Subject: [PATCH 63/96] [build] 3.0.0-alpha.15 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 59df12d..2f29b93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.14", + "version": "3.0.0-alpha.15", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7127282..e0de90e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modus/ionic-vue", - "version": "3.0.0-alpha.14", + "version": "3.0.0-alpha.15", "description": "Vue 3 integration adapters for Ionic 5", "homepage": "https://moduscreate.com", "author": "Michael Tintiuc ", From 0ff4e95600bacbf9f63b40a60d02e096218f8778 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 17 Aug 2020 23:26:16 +0300 Subject: [PATCH 64/96] Fix backButton props --- src/components/back-button/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts index a562465..e104d9a 100644 --- a/src/components/back-button/index.ts +++ b/src/components/back-button/index.ts @@ -6,7 +6,7 @@ import { NavigableBack } from '../../interfaces'; export const IonBackButton: FunctionalComponent = props => { const router = useRouter(); return h('ion-back-button', { - props, + ...props, onClick(e: MouseEvent) { props.onClick && props.onClick(e); From 30b816cb106feb4acad5c5b9e06dc9ae7e399240 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 18 Aug 2020 12:38:52 +0300 Subject: [PATCH 65/96] Refactor to use defineComponent --- src/components/back-button/index.ts | 8 +-- src/components/icon/index.ts | 11 ++-- src/components/page/index.ts | 8 +-- src/components/router-outlet/index.ts | 86 +++++++++++++-------------- src/components/tabs/tab-bar.ts | 8 +-- src/components/tabs/tab-button.ts | 8 +-- src/components/tabs/tab.ts | 8 +-- src/components/tabs/tabs.ts | 10 ++-- src/ionic-vue.ts | 2 +- src/utils/defineContainer.ts | 20 ++++--- src/utils/defineInput.ts | 18 +++--- src/utils/defineOverlay.ts | 81 +++++++++++++------------ 12 files changed, 138 insertions(+), 130 deletions(-) diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts index e104d9a..e392db8 100644 --- a/src/components/back-button/index.ts +++ b/src/components/back-button/index.ts @@ -1,11 +1,11 @@ -import { FunctionalComponent, h } from 'vue'; +import { FunctionalComponent, defineComponent, h } from 'vue'; import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; import { NavigableBack } from '../../interfaces'; -export const IonBackButton: FunctionalComponent = props => { +export const IonBackButton: FunctionalComponent = defineComponent(props => { const router = useRouter(); - return h('ion-back-button', { + return () => h('ion-back-button', { ...props, onClick(e: MouseEvent) { props.onClick && props.onClick(e); @@ -19,7 +19,7 @@ export const IonBackButton: FunctionalComponent = (props) => { - const { md, ios } = props; - const icon = (isPlatform(window, 'ios') ? ios ?? md : md ?? ios) ?? props.icon; - return h('ion-icon', { ...props, icon }); -}; +export const IonIcon: FunctionalComponent = defineComponent(props => { + const icon = (isPlatform(window, 'ios') ? props.ios ?? props.md : props.md ?? props.ios) ?? props.icon; + return () => h('ion-icon', { ...props, icon }); +}); IonIcon.displayName = 'ion-icon'; IonIcon.props = ['ariaLabel', 'color', 'flipRtl', 'icon', 'ios', 'lazy', 'md', 'mode', 'name', 'size', 'src']; diff --git a/src/components/page/index.ts b/src/components/page/index.ts index dff1d5d..4551c3e 100644 --- a/src/components/page/index.ts +++ b/src/components/page/index.ts @@ -1,7 +1,7 @@ -import { FunctionalComponent, h } from 'vue'; +import { FunctionalComponent, defineComponent, h } from 'vue'; -export const IonPage: FunctionalComponent = (props, { slots }) => { - return h('ion-page', { ...props, class: 'ion-page' }, slots); -}; +export const IonPage: FunctionalComponent = defineComponent((props, { slots }) => { + return () => h('ion-page', { ...props, class: 'ion-page' }, slots); +}); IonPage.displayName = 'ion-page'; diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index eb4d6ef..363e046 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -3,10 +3,11 @@ import { FunctionalComponent, Transition, VNode, + defineComponent, h, nextTick, ref, - shallowRef, + shallowRef } from 'vue'; import { RouteLocationNormalizedLoaded, @@ -23,9 +24,8 @@ export interface Props extends JSX.IonRouterOutlet { swipeBack?: boolean; } -export const IonRouterView: FunctionalComponent = (props, { slots }) => { +export const IonRouterView: FunctionalComponent = defineComponent((props, { slots }) => { const router = useRouter(); - const { name, route, ...outletProps } = props; const ionRouterOutlet = ref(); const enteringEl = ref(); const newView = shallowRef(); @@ -88,7 +88,7 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { }, }; - const routerView = h(RouterView, { name, route }, (...opts: any) => { + const routerView = h(RouterView, { name: props.name, route: props.route }, (...opts: any) => { const { Component, route: matchedRoute } = opts[0]; const child = newView.value ?? Component; @@ -121,61 +121,61 @@ export const IonRouterView: FunctionalComponent = (props, { slots }) => { : h(Transition, transitionProps, () => child); }); - return h( + return () => h( 'ion-router-outlet', { - ...outletProps, + ...props, ref: ionRouterOutlet, // workaround for Vue 3 camelCase prop issue onVnodeMounted(vnode) { vnode?.el && (vnode.el.swipeHandler = { - canStart() { - return ( - !inTransition && + canStart() { + return ( + !inTransition && !!router.history.state.back && props.swipeBack !== false && ionRouterOutlet.value?.mode === 'ios' + ); + }, + onStart() { + progressAnimation = true; + inTransition = true; + router.direction.value = 'back'; + + const prevRoute = router.getRoutes().find(r => { + return r.path === router.history.state.back as any; + }) as RouteRecordNormalized; + + if (prevRoute) { + newView.value = h( + prevRoute.components[props.name || 'default'], + prevRoute.props ); - }, - onStart() { - progressAnimation = true; - inTransition = true; - router.direction.value = 'back'; - - const prevRoute = router.getRoutes().find(r => { - return r.path === router.history.state.back as any; - }) as RouteRecordNormalized; - - if (prevRoute) { - newView.value = h( - prevRoute.components[props.name || 'default'], - prevRoute.props - ); - } - }, - onEnd(shouldComplete: boolean) { - inTransition = false; - progressAnimation = false; - - if (shouldComplete) { - nextTick(() => { - persisted = false; - router.go(-1); - }); - return; - } - - persisted = true; - newView.value = undefined; - }, - }); + } + }, + onEnd(shouldComplete: boolean) { + inTransition = false; + progressAnimation = false; + + if (shouldComplete) { + nextTick(() => { + persisted = false; + router.go(-1); + }); + return; + } + + persisted = true; + newView.value = undefined; + }, + }); }, }, routerView ); -}; +}); IonRouterView.props = [ 'name', diff --git a/src/components/tabs/tab-bar.ts b/src/components/tabs/tab-bar.ts index 24efb7f..3f01309 100644 --- a/src/components/tabs/tab-bar.ts +++ b/src/components/tabs/tab-bar.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, h, ref } from 'vue'; +import { FunctionalComponent, defineComponent, h, ref } from 'vue'; import { tabRefs } from './tabs'; import { JSX } from '@ionic/core'; @@ -19,11 +19,11 @@ export const setActiveTab = (value?: string) => { }); }; -export const IonTabBar: FunctionalComponent = (props, { slots }) => { +export const IonTabBar: FunctionalComponent = defineComponent((props, { slots }) => { const tabs = Object.keys(tabRefs); const selectedTab = tabBarRef.value?.selectedTab || props.selectedTab || (tabs.length && tabs[0]) || undefined; - return h(name, { ...props, selectedTab, ref: tabBarRef }, slots.default && slots.default()); -}; + return () => h(name, { ...props, selectedTab, ref: tabBarRef }, slots); +}); IonTabBar.displayName = name; IonTabBar.props = componentProps; diff --git a/src/components/tabs/tab-button.ts b/src/components/tabs/tab-button.ts index e4a65b1..ee4b7ab 100644 --- a/src/components/tabs/tab-button.ts +++ b/src/components/tabs/tab-button.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, h } from 'vue'; +import { FunctionalComponent, defineComponent, h } from 'vue'; import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; import { tabLocations, tabsRef } from './tabs'; @@ -18,7 +18,7 @@ const componentProps: (keyof JSX.IonTabButton)[] = [ 'target', ]; -export const IonTabButton: FunctionalComponent = (props, { slots }) => { +export const IonTabButton: FunctionalComponent = defineComponent((props, { slots }) => { const router = useRouter(); const onClick = async (e: MouseEvent) => { @@ -51,8 +51,8 @@ export const IonTabButton: FunctionalComponent = ( e.preventDefault(); }; - return h(name, { ...props, onClick }, slots.default && slots.default()); -}; + return () => h(name, { ...props, onClick }, slots); +}); IonTabButton.displayName = name; IonTabButton.props = componentProps; diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts index 4064446..81c4ea5 100644 --- a/src/components/tabs/tab.ts +++ b/src/components/tabs/tab.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, getCurrentInstance, h, onActivated, ref } from 'vue'; +import { FunctionalComponent, defineComponent, getCurrentInstance, h, onActivated, ref } from 'vue'; import { useRoute } from 'vue-router'; import { JSX } from '@ionic/core'; import { tabBarRef } from './tab-bar'; @@ -7,7 +7,7 @@ import { tabLocations, tabRefs } from './tabs'; const name = 'ion-tab'; const componentProps: (keyof JSX.IonTab)[] = [ 'tab' ]; -export const IonTab: FunctionalComponent> = (props, { slots }) => { +export const IonTab: FunctionalComponent> = defineComponent((props, { slots }) => { let tabNode = tabRefs[props.tab]; let active = tabBarRef.value?.selectedTab === props.tab; const instance = getCurrentInstance()!; @@ -42,8 +42,8 @@ export const IonTab: FunctionalComponent> = (props tabBarRef.value && (tabBarRef.value.selectedTab = undefined); }; - return h(name, { ...props, active, onVnodeUpdated, onVnodeBeforeUnmount, ref: tabRefs[props.tab] }, slots.default && slots.default()); -}; + return () => h(name, { ...props, active, onVnodeUpdated, onVnodeBeforeUnmount, ref: tabRefs[props.tab] }, slots); +}); IonTab.displayName = name; IonTab.props = componentProps; diff --git a/src/components/tabs/tabs.ts b/src/components/tabs/tabs.ts index cbb8a20..aa9b4d2 100644 --- a/src/components/tabs/tabs.ts +++ b/src/components/tabs/tabs.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, Ref, VNode, h, ref } from 'vue'; +import { FunctionalComponent, Ref, VNode, defineComponent, h, ref } from 'vue'; import { JSX } from '@ionic/core'; // CSS for ion-tabs inner and outer elements @@ -25,7 +25,7 @@ export const tabsRef = ref(); export const tabRefs: { [key: string]: Ref } = {}; export const tabLocations: { [key: string]: string | undefined } = {}; -export const IonTabs: FunctionalComponent = (props, { slots }) => { +export const IonTabs: FunctionalComponent = defineComponent((props, { slots }) => { const { onIonTabsWillChange, onIonTabsDidChange, ...restProps } = props; // @TODO remove when Vue3 allows for camelCase props and events @@ -36,12 +36,12 @@ export const IonTabs: FunctionalComponent = (props, { slots }) => { } }; - return h('div', { ...restProps, onVnodeMounted, style: hostStyles, ref: tabsRef }, [ + return () => h('div', { ...restProps, onVnodeMounted, style: hostStyles, ref: tabsRef }, [ slots.top && slots.top(), - h('div', { class: 'tabs-inner', style: innerStyles }, slots.default && slots.default()), + h('div', { class: 'tabs-inner', style: innerStyles }, slots), slots.bottom && slots.bottom(), ]); -}; +}); IonTabs.displayName = 'ion-tabs'; IonTabs.emits = ['onIonTabsWillChange', 'onIonTabsDidChange']; diff --git a/src/ionic-vue.ts b/src/ionic-vue.ts index f86c854..3015b84 100644 --- a/src/ionic-vue.ts +++ b/src/ionic-vue.ts @@ -6,6 +6,6 @@ export const IonicVue: Plugin = { async install(_app: App, config?: IonicConfig) { config && setupConfig(config); await applyPolyfills(); - window && defineCustomElements(window); + window && await defineCustomElements(window); } }; diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index 19c3060..4f2b571 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, h } from 'vue'; +import { FunctionalComponent, defineComponent, h } from 'vue'; import { useLink, useRouter } from 'vue-router'; import { NavigableRouter } from '../interfaces'; import { directionOverride } from '../router'; @@ -15,19 +15,21 @@ export const defineContainer = (name: string, componentPro }; export const defineNavigableContainer = (name: string, componentPropsAndEvents: string[]) => { - const Container: FunctionalComponent = (props, { attrs, slots }) => { + const Container: FunctionalComponent = defineComponent((props, { attrs, slots }) => { const router = useRouter(); + let { href } = props; + let onClick: (e: MouseEvent) => void; - if (router && props.href !== undefined) { - const link = useLink({ to: props.href, replace: props.replace }); + if (router && href !== undefined) { + const link = useLink({ to: href, replace: props.replace }); const oldClick = attrs.onClick as any; - props.href = link.href.value; - attrs.onClick = (e: MouseEvent) => { + href = link.href.value; + onClick = (e: MouseEvent) => { oldClick && oldClick(e); directionOverride.value = props.routerDirection; - if (e.defaultPrevented || (props.target && /\b_blank\b/i.test(props.target))) { + if (e.defaultPrevented || (props.target && /\b_blank\b/i.test(props.target as string))) { return; } @@ -36,8 +38,8 @@ export const defineNavigableContainer = (name: string, com }; } - return h(name, props, slots.default && slots.default()); - }; + return () => h(name, { ...props, href, onClick }, slots); + }); const data = splitPropsAndEvents(componentPropsAndEvents); Container.displayName = name; diff --git a/src/utils/defineInput.ts b/src/utils/defineInput.ts index df019b3..680accf 100644 --- a/src/utils/defineInput.ts +++ b/src/utils/defineInput.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, VNode, h } from 'vue'; +import { FunctionalComponent, VNode, defineComponent, h } from 'vue'; import { splitPropsAndEvents } from './splitPropsAndEvents'; export interface InputProps extends Object { @@ -19,16 +19,16 @@ export function defineInput( updateEvent = 'onIonChange', modelProp = 'value' ) { - const Input: FunctionalComponent = ( + const Input: FunctionalComponent = defineComponent(( props, { attrs, slots, emit } ) => { - const { modelValue, ...restOfProps } = props; - // @TODO hack to support CamelCase Ionic events const onVnodeBeforeMount = (vnode: VNode) => { + console.log('mount', name); if (vnode.el) { vnode.el.addEventListener(updateEvent.replace('onIon', 'ion'), (e: Event) => { + console.log(name, (e?.target as any)[modelProp]); emit(InputEvents.onUpdate, (e?.target as any)[modelProp]); }); for (const [key, event] of Object.entries(attrs)) { @@ -38,16 +38,16 @@ export function defineInput( } } }; - return h( + return () => h( ionTag, { - ...restOfProps, + ...props, onVnodeBeforeMount, - [modelProp]: props.hasOwnProperty('modelValue') ? modelValue : (props as any)[modelProp], + [modelProp]: props.hasOwnProperty('modelValue') ? props.modelValue : (props as any)[modelProp], }, - slots.default && slots.default() + slots ); - }; + }); const data = splitPropsAndEvents(componentPropsAndEvents); Input.displayName = name; diff --git a/src/utils/defineOverlay.ts b/src/utils/defineOverlay.ts index 4b14bf0..8c69961 100644 --- a/src/utils/defineOverlay.ts +++ b/src/utils/defineOverlay.ts @@ -1,4 +1,4 @@ -import { FunctionalComponent, h, ref } from 'vue'; +import { FunctionalComponent, defineComponent, h, ref } from 'vue'; export interface OverlayElement extends HTMLElement { present: () => Promise; @@ -52,40 +52,34 @@ export function defineOverlay( const Overlay: FunctionalComponent< Props, - OverlayEvents[] - > = (props, { attrs, slots, emit }) => { - const isOpen = props.isOpen === undefined ? props.modelValue : props.isOpen; - const onDidDismiss = attrs.onDidDismiss as (e: Event) => void; - - attrs.onDidDismiss = (e: Event) => { - onDidDismiss && onDidDismiss(e); - emit(OverlayEvents.onUpdate, false); - }; - - return h( - 'div', - { - style: { display: 'none' }, - async onVnodeUpdated() { - if (isOpen) { - await (overlay.value?.present() || present(props, attrs)); - } else { + OverlayEvents[] | {} + > = defineComponent((props, { attrs, slots, emit }) => { + return () => h( + 'div', + { + style: { display: 'none' }, + async onVnodeUpdated() { + const isOpen = props.isOpen ?? props.modelValue; + if (isOpen) { + await (overlay.value?.present() || present(props, attrs, emit)); + } else { + await overlay.value?.dismiss(); + overlay.value = undefined; + } + }, + async onVnodeMounted() { + const isOpen = props.isOpen ?? props.modelValue; + isOpen && (await present(props, attrs, emit)); + }, + async onVnodeBeforeUnmount() { await overlay.value?.dismiss(); overlay.value = undefined; + content.value = undefined; } }, - async onVnodeMounted() { - isOpen && (await present(props, attrs)); - }, - async onVnodeBeforeUnmount() { - await overlay.value?.dismiss(); - overlay.value = undefined; - content.value = undefined; - } - }, - [h('div', { ref: content }, slots.default && slots.default())] - ); - }; + [h('div', { ref: content }, slots)] + ); + }); Overlay.displayName = name; Overlay.inheritAttrs = false; @@ -98,12 +92,16 @@ export function defineOverlay( OverlayEvents.onDidDismiss ]; - async function present(props: Props, { - onWillPresent, - onDidPresent, - onWillDismiss, - onDidDismiss, - }: Partial void>>) { + async function present( + props: Readonly, + { + onWillPresent, + onDidPresent, + onWillDismiss, + onDidDismiss, + }: Partial void>>, + emit: (event: OverlayEvents, ...args: any[]) => void + ) { overlay.value = await controller.create({ ...props, component: content.value @@ -122,6 +120,15 @@ export function defineOverlay( Array.isArray(handlers) ? handlers.map(f => f(e)) : handlers(e); }); } + if (listener === OverlayEvents.onDidPresent) { + overlay.value?.addEventListener(eventName, () => { + emit(OverlayEvents.onUpdate, true); + }); + } else if (listener === OverlayEvents.onDidDismiss) { + overlay.value?.addEventListener(eventName, () => { + emit(OverlayEvents.onUpdate, false); + }); + } } await overlay.value?.present(); From 61f07782658e22b02d2d2510f226858756e30131 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 18 Aug 2020 15:47:55 +0300 Subject: [PATCH 66/96] Add displayName to components --- src/components/back-button/index.ts | 4 +++- src/components/icon/index.ts | 5 +++-- src/components/page/index.ts | 5 +++-- src/components/router-outlet/index.ts | 1 + 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/back-button/index.ts b/src/components/back-button/index.ts index e392db8..def72e3 100644 --- a/src/components/back-button/index.ts +++ b/src/components/back-button/index.ts @@ -3,9 +3,10 @@ import { useRouter } from 'vue-router'; import { JSX } from '@ionic/core'; import { NavigableBack } from '../../interfaces'; +const name = 'ion-back-button'; export const IonBackButton: FunctionalComponent = defineComponent(props => { const router = useRouter(); - return () => h('ion-back-button', { + return () => h(name, { ...props, onClick(e: MouseEvent) { props.onClick && props.onClick(e); @@ -21,6 +22,7 @@ export const IonBackButton: FunctionalComponent = defineComponent(props => { const icon = (isPlatform(window, 'ios') ? props.ios ?? props.md : props.md ?? props.ios) ?? props.icon; - return () => h('ion-icon', { ...props, icon }); + return () => h(name, { ...props, icon }); }); -IonIcon.displayName = 'ion-icon'; +IonIcon.displayName = name; IonIcon.props = ['ariaLabel', 'color', 'flipRtl', 'icon', 'ios', 'lazy', 'md', 'mode', 'name', 'size', 'src']; diff --git a/src/components/page/index.ts b/src/components/page/index.ts index 4551c3e..47acef1 100644 --- a/src/components/page/index.ts +++ b/src/components/page/index.ts @@ -1,7 +1,8 @@ import { FunctionalComponent, defineComponent, h } from 'vue'; +const name = 'ion-page'; export const IonPage: FunctionalComponent = defineComponent((props, { slots }) => { - return () => h('ion-page', { ...props, class: 'ion-page' }, slots); + return () => h(name, { ...props, class: 'ion-page' }, slots); }); -IonPage.displayName = 'ion-page'; +IonPage.displayName = name; diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 363e046..131de7a 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -177,6 +177,7 @@ export const IonRouterView: FunctionalComponent = defineComponent((props, ); }); +IonRouterView.displayName = 'ion-router-view'; IonRouterView.props = [ 'name', 'route', From d6fb8b00b321d920be86ec16bef14e6fe80ee708 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 18 Aug 2020 20:21:57 +0300 Subject: [PATCH 67/96] Add missing defineComponent --- src/utils/defineContainer.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/defineContainer.ts b/src/utils/defineContainer.ts index 4f2b571..068a29d 100644 --- a/src/utils/defineContainer.ts +++ b/src/utils/defineContainer.ts @@ -5,8 +5,9 @@ import { directionOverride } from '../router'; import { splitPropsAndEvents } from './splitPropsAndEvents'; export const defineContainer = (name: string, componentProps: string[]) => { - const Container: FunctionalComponent = (props, { slots }) => - h(name, props, slots.default && slots.default()); + const Container: FunctionalComponent = defineComponent((props, { slots }) => { + return () => h(name, props, slots); + }); Container.displayName = name; Container.props = componentProps; From 469d795b8fc518392f989e7e03545bcbb4f57d98 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 18 Aug 2020 20:22:16 +0300 Subject: [PATCH 68/96] Fix ion-split-pane --- src/components/router-outlet/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/router-outlet/index.ts b/src/components/router-outlet/index.ts index 131de7a..8b74762 100644 --- a/src/components/router-outlet/index.ts +++ b/src/components/router-outlet/index.ts @@ -39,7 +39,11 @@ export const IonRouterView: FunctionalComponent = defineComponent((props, return; } - enteringEl.value.classList.add('ion-page', 'ion-page-invisible'); + // ion-page class makes ion-split-pane invisible + if (enteringEl.value.nodeName !== 'ION-SPLIT-PANE') { + enteringEl.value.classList.add('ion-page', 'ion-page-invisible'); + } + enteringEl.value.style.display = ''; const outlet = await ionRouterOutlet.value?.componentOnReady(); From c68492f4686a290b50fd13deb24b01df79198eaf Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Tue, 18 Aug 2020 20:22:23 +0300 Subject: [PATCH 69/96] Update changelog --- CHANGELOG.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02214d3..03e700b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ -# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.14...dev) +# [Unreleased](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.15...dev) + +### Features +* Improve tooling and IDE support by wrapping components with defineComponent + +### Bug fixes +* Fix IonBackButton props +* Fix IonSplitPane within IonRouterView being hidden after navigation +* Add missing component displayName props + +--- + +# [3.0.0-alpha.15](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.14...v3.0.0-alpha.15) ### Features * Added IonPage and IonRouterLink Ionic components @@ -10,8 +22,6 @@ * Fix switching between tabs with routes and plain tabs causing a redirect * Fix IonRadioGroup v-model ---- - # [3.0.0-alpha.14](https://github.com/ModusCreateOrg/ionic-vue/compare/v3.0.0-alpha.13...v3.0.0-alpha.14) ### Bug fixes From 0fbfd0ad01abff0c61ab92082520622b5848edfa Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Wed, 19 Aug 2020 23:37:47 +0300 Subject: [PATCH 70/96] Update dependencies and build, add vetur support --- build/rollup.config.js | 60 +- package-lock.json | 2045 +++++++++++++++++----------------------- package.json | 22 +- scripts/vetur.js | 65 ++ tsconfig.json | 13 +- vetur/attributes.json | 1951 ++++++++++++++++++++++++++++++++++++++ vetur/tags.json | 876 +++++++++++++++++ 7 files changed, 3787 insertions(+), 1245 deletions(-) create mode 100644 scripts/vetur.js create mode 100644 vetur/attributes.json create mode 100644 vetur/tags.json diff --git a/build/rollup.config.js b/build/rollup.config.js index 5b1b2dd..142d660 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -1,11 +1,10 @@ -import path from "path"; -// import vue from "rollup-plugin-vue"; -import { terser } from "rollup-plugin-terser"; -import typescript from "rollup-plugin-typescript2"; +import path from 'path'; +import { terser } from 'rollup-plugin-terser'; +import typescript from 'rollup-plugin-typescript2'; import keysTransformer from 'ts-transformer-keys/transformer'; -import { version as packageVersion } from "../package.json"; +import { version as packageVersion } from '../package.json'; -const resolve = _path => path.resolve(__dirname, "../", _path); +const resolve = _path => path.resolve(__dirname, '../', _path); const version = process.env.VERSION || packageVersion; const banner = `/*! * @modus/ionic-vue v${version} @@ -18,11 +17,11 @@ function outputConfig(suffix, format, opts = {}) { return Object.assign( { file: resolve(`./dist/ionic-vue${suffix}.js`), - name: "IonicVue", - exports: "named", + name: 'IonicVue', + exports: 'named', sourcemap: true, format, - banner + banner, }, opts ); @@ -30,39 +29,32 @@ function outputConfig(suffix, format, opts = {}) { function baseConfig() { return { - input: resolve("./src/index.ts"), - output: [ - outputConfig("", "umd", { - globals: { - vue: "Vue" - } - }), - outputConfig(".esm", "esm"), - outputConfig(".common", "cjs") - ], + input: resolve('./src/index.ts'), + output: [outputConfig('.esm', 'esm')], external: [ - "vue", - "vue-router", - "@ionic/core", - "@ionic/core/loader", - "ionicons", - "ionicons/icons" + 'vue', + 'vue-router', + '@ionic/core', + '@ionic/core/loader', + 'ionicons', + 'ionicons/icons', ], treeshake: { - moduleSideEffects: false + moduleSideEffects: false, }, plugins: [ - // vue(), typescript({ useTsconfigDeclarationDir: true, objectHashIgnoreUnknownHack: false, clean: true, - transformers: [service => ({ - before: [ keysTransformer(service.getProgram()) ], - after: [] - })] - }) - ] + transformers: [ + service => ({ + before: [keysTransformer(service.getProgram())], + after: [], + }), + ], + }), + ], }; } @@ -74,7 +66,7 @@ export default args => { prodConfig.plugins.push(terser()); for (const item of prodConfig.output) { - item.file = item.file.replace(".js", ".min.js"); + item.file = item.file.replace('.js', '.min.js'); item.sourcemap = false; } diff --git a/package-lock.json b/package-lock.json index 2f29b93..a751d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,38 +5,44 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, "@babel/core": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", - "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.6", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.6", - "@babel/parser": "^7.9.6", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.6", - "@babel/types": "^7.9.6", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -46,14 +52,13 @@ } }, "@babel/generator": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", - "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "dev": true, "requires": { - "@babel/types": "^7.9.6", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { @@ -66,132 +71,140 @@ } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, "@babel/helper-replace-supers": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", - "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.9.6", - "@babel/types": "^7.9.6" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", - "dev": true + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, "@babel/helpers": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", - "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.6", - "@babel/types": "^7.9.6" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.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" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -202,14 +215,43 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", - "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", - "dev": true + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -230,12 +272,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", - "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -248,12 +299,12 @@ } }, "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", - "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -266,12 +317,12 @@ } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -302,41 +353,40 @@ } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", - "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.6", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", - "dev": true, + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, @@ -366,13 +416,14 @@ } }, "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", + "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } @@ -432,17 +483,14 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, "strip-ansi": { "version": "6.0.0", @@ -521,14 +569,6 @@ "string-length": "^3.1.0", "terminal-link": "^2.0.0", "v8-to-istanbul": "^4.1.3" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "@jest/source-map": { @@ -540,14 +580,6 @@ "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "@jest/test-result": { @@ -573,14 +605,6 @@ "jest-haste-map": "^25.5.1", "jest-runner": "^25.5.4", "jest-runtime": "^25.5.4" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "@jest/transform": { @@ -605,14 +629,6 @@ "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "@jest/types": { @@ -627,6 +643,20 @@ "chalk": "^3.0.0" } }, + "@rollup/plugin-node-resolve": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz", + "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.17.0" + } + }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -636,21 +666,29 @@ "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } } }, "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -680,9 +718,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", - "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -716,9 +754,9 @@ } }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "@types/istanbul-lib-report": { @@ -731,9 +769,9 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*", @@ -757,9 +795,9 @@ "dev": true }, "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", + "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==", "dev": true }, "@types/normalize-package-data": { @@ -774,6 +812,15 @@ "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", "dev": true }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -781,9 +828,9 @@ "dev": true }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -796,74 +843,57 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.0.tgz", - "integrity": "sha512-/vSHUDYizSOhrOJdjYxPNGfb4a3ibO8zd4nUKo/QBFOmxosT3cVUV7KIg8Dwi6TXlr667G7YPqFK9+VSZOorNA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.1.tgz", + "integrity": "sha512-lkiZ8iBBaYoyEKhCkkw4SAeatXyBq9Ece5bZXdLe1LWBUwTszGbmbiqmQbwWA8cSYDnjWXp9eDbXpf9Sn0hLAg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.9.0", - "@typescript-eslint/typescript-estree": "3.9.0", + "@typescript-eslint/types": "3.9.1", + "@typescript-eslint/typescript-estree": "3.9.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.9.0.tgz", - "integrity": "sha512-rDHOKb6uW2jZkHQniUQVZkixQrfsZGUCNWWbKWep4A5hGhN5dLHMUCNAWnC4tXRlHedXkTDptIpxs6e4Pz8UfA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.9.1.tgz", + "integrity": "sha512-y5QvPFUn4Vl4qM40lI+pNWhTcOWtpZAJ8pOEQ21fTTW4xTJkRplMjMRje7LYTXqVKKX9GJhcyweMz2+W1J5bMg==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.9.0", - "@typescript-eslint/types": "3.9.0", - "@typescript-eslint/typescript-estree": "3.9.0", + "@typescript-eslint/experimental-utils": "3.9.1", + "@typescript-eslint/types": "3.9.1", + "@typescript-eslint/typescript-estree": "3.9.1", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/types": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.9.0.tgz", - "integrity": "sha512-rb6LDr+dk9RVVXO/NJE8dT1pGlso3voNdEIN8ugm4CWM5w5GimbThCMiMl4da1t5u3YwPWEwOnKAULCZgBtBHg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.9.1.tgz", + "integrity": "sha512-15JcTlNQE1BsYy5NBhctnEhEoctjXOjOK+Q+rk8ugC+WXU9rAcS2BYhoh6X4rOaXJEpIYDl+p7ix+A5U0BqPTw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.0.tgz", - "integrity": "sha512-N+158NKgN4rOmWVfvKOMoMFV5n8XxAliaKkArm/sOypzQ0bUL8MSnOEBW3VFIeffb/K5ce/cAV0yYhR7U4ALAA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.1.tgz", + "integrity": "sha512-IqM0gfGxOmIKPhiHW/iyAEXwSVqMmR2wJ9uXHNdFpqVvPaQ3dWg302vW127sBpAiqM9SfHhyS40NKLsoMpN2KA==", "dev": true, "requires": { - "@typescript-eslint/types": "3.9.0", - "@typescript-eslint/visitor-keys": "3.9.0", + "@typescript-eslint/types": "3.9.1", + "@typescript-eslint/visitor-keys": "3.9.1", "debug": "^4.1.1", "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", "semver": "^7.3.2", "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } } }, "@typescript-eslint/visitor-keys": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.0.tgz", - "integrity": "sha512-O1qeoGqDbu0EZUC/MZ6F1WHTIzcBVhGqDj3LhTnj65WUA548RXVxUHbYhAW9bZWfb2rnX9QsbbP5nmeJ5Z4+ng==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.1.tgz", + "integrity": "sha512-zxdtUjeoSh+prCpogswMwVUJfEFmCOjdzK9rpNjNBfm6EyPt99x3RrJoBOGZO23FCt0WPKUCOL5mb/9D5LjdwQ==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -879,38 +909,6 @@ "@vue/shared": "3.0.0-rc.5", "estree-walker": "^2.0.1", "source-map": "^0.6.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/parser": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz", - "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "estree-walker": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", - "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==" - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } } }, "@vue/compiler-dom": { @@ -961,21 +959,15 @@ "dev": true }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", + "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", "dev": true }, "acorn": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, "acorn-globals": { @@ -1009,9 +1001,9 @@ "dev": true }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -1044,18 +1036,19 @@ } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "anymatch": { @@ -1153,9 +1146,9 @@ "dev": true }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, "babel-code-frame": { @@ -1343,14 +1336,6 @@ "chalk": "^3.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "babel-messages": { @@ -1698,14 +1683,15 @@ } }, "babel-preset-current-node-syntax": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", - "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", + "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1751,6 +1737,14 @@ "browserslist": "^3.2.6", "invariant": "^2.2.2", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "babel-preset-jest": { @@ -1998,76 +1992,6 @@ "node-int64": "^0.4.0" } }, - "buble": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.8.tgz", - "integrity": "sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA==", - "dev": true, - "requires": { - "acorn": "^6.1.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.0.1", - "chalk": "^2.4.2", - "magic-string": "^0.25.3", - "minimist": "^1.2.0", - "os-homedir": "^2.0.0", - "regexpu-core": "^4.5.4" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2075,9 +1999,9 @@ "dev": true }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, "cache-base": { @@ -2110,9 +2034,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001042", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001042.tgz", - "integrity": "sha512-igMQ4dlqnf4tWv0xjaaE02op9AJ2oQzXKjWf4EuAHFN694Uo9/EfPVIPJcmn2WkU9RqozCxx5e2KPcVClHDbDw==", + "version": "1.0.30001116", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001116.tgz", + "integrity": "sha512-f2lcYnmAI5Mst9+g0nkMIznFGsArRmZ0qU+dnq8l91hymdc2J3SFbiPhOJEeDqC1vtE8nc1qNQyklzB8veJefQ==", "dev": true }, "capture-exit": { @@ -2138,48 +2062,6 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "ci-info": { @@ -2222,12 +2104,29 @@ "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -2262,18 +2161,18 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "combined-stream": { @@ -2349,6 +2248,12 @@ "which": "^1.2.9" }, "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2507,27 +2412,12 @@ "dev": true }, "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - }, - "dependencies": { - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "esutils": "^2.0.2" } }, "domexception": { @@ -2550,15 +2440,15 @@ } }, "electron-to-chromium": { - "version": "1.3.412", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.412.tgz", - "integrity": "sha512-4bVdSeJScR8fT7ERveLWbxemY5uXEHVseqMRyORosiKcTUSGtVwBkV8uLjXCqoFLeImA57Z9hbz3TOid01U4Hw==", + "version": "1.3.539", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.539.tgz", + "integrity": "sha512-rM0LWDIstdqfaRUADZetNrL6+zd/0NBmavbMEhBXgc2u/CC1d1GaDyN5hho29fFvBiOVFwrSWZkzmNcZnCEDog==", "dev": true }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "emojis-list": { @@ -2577,26 +2467,14 @@ } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } } }, "enquirer": { @@ -2633,9 +2511,9 @@ "dev": true }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -2643,17 +2521,58 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" - } - }, - "eslint": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", - "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", + "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", @@ -2689,22 +2608,6 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -2715,21 +2618,6 @@ "supports-color": "^7.1.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2741,15 +2629,6 @@ "which": "^2.0.1" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -2759,60 +2638,12 @@ "type-fest": "^0.8.1" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2836,24 +2667,6 @@ "requires": { "ansi-regex": "^5.0.0" } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } } } }, @@ -2891,14 +2704,6 @@ "acorn": "^7.3.1", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - } } }, "esprima": { @@ -2940,10 +2745,9 @@ "dev": true }, "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", + "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==" }, "esutils": { "version": "2.0.3", @@ -3040,33 +2844,6 @@ "jest-matcher-utils": "^25.5.0", "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "extend": { @@ -3168,9 +2945,9 @@ "dev": true }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { @@ -3266,17 +3043,6 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "flatted": { @@ -3359,6 +3125,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -3413,9 +3185,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "growly": { @@ -3432,12 +3204,12 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -3448,12 +3220,20 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-value": { @@ -3712,9 +3492,9 @@ } }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true, "optional": true }, @@ -3731,9 +3511,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-generator-fn": { @@ -3751,6 +3531,12 @@ "is-extglob": "^2.1.1" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3825,15 +3611,12 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -3856,23 +3639,6 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "istanbul-lib-source-maps": { @@ -3907,12 +3673,6 @@ "jest-cli": "^25.5.4" }, "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, "jest-cli": { "version": "25.5.4", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", @@ -3978,9 +3738,9 @@ } }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -4055,14 +3815,6 @@ "micromatch": "^4.0.2", "pretty-format": "^25.5.0", "realpath-native": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-diff": { @@ -4160,14 +3912,6 @@ "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-jasmine2": { @@ -4231,14 +3975,6 @@ "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-mock": { @@ -4251,9 +3987,9 @@ } }, "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true }, "jest-regex-util": { @@ -4277,14 +4013,6 @@ "realpath-native": "^2.0.0", "resolve": "^1.17.0", "slash": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-resolve-dependencies": { @@ -4323,14 +4051,6 @@ "jest-worker": "^25.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-runtime": { @@ -4365,14 +4085,6 @@ "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.3.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-serializer": { @@ -4382,14 +4094,6 @@ "dev": true, "requires": { "graceful-fs": "^4.2.4" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-snapshot": { @@ -4415,12 +4119,6 @@ "semver": "^6.3.0" }, "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -4449,14 +4147,6 @@ "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } } }, "jest-validate": { @@ -4506,23 +4196,6 @@ "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "js-tokens": { @@ -4532,9 +4205,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4666,13 +4339,13 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lines-and-columns": { @@ -4713,10 +4386,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash.memoize": { "version": "4.1.2", @@ -4748,19 +4420,10 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -4804,6 +4467,16 @@ "object-visit": "^1.0.0" } }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4878,10 +4551,13 @@ } }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "ms": { "version": "2.1.2", @@ -4975,6 +4651,14 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "normalize-path": { @@ -5063,34 +4747,28 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "os-homedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz", - "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==", - "dev": true - }, "p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -5137,9 +4815,9 @@ } }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5227,9 +4905,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "pretty-format": { @@ -5242,39 +4920,6 @@ "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "private": { @@ -5339,6 +4984,15 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -5398,20 +5052,11 @@ "dev": true }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5538,21 +5183,21 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -5618,87 +5263,65 @@ "dev": true }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "rollup": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.62.0.tgz", - "integrity": "sha512-mZS0aIGfYzuJySJD78znu9/hCJsNfBzg4lDuZGMj0hFVcYHt2evNRHv8aqiu9/w6z6Qn8AQoVl4iyEjDmisGeA==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "@types/node": "*" - } - }, - "rollup-plugin-buble": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/rollup-plugin-buble/-/rollup-plugin-buble-0.19.8.tgz", - "integrity": "sha512-8J4zPk2DQdk3rxeZvxgzhHh/rm5nJkjwgcsUYisCQg1QbT5yagW+hehYEW7ZNns/NVbDCTv4JQ7h4fC8qKGOKw==", + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.4.tgz", + "integrity": "sha512-6+qsGuP0MXGd7vlYmk72utm1MrgZj5GfXibGL+cRkKQ9+ZL/BnFThDl0D5bcl7AqlzMjAQXRAwZX1HVm22M/4Q==", "dev": true, "requires": { - "buble": "^0.19.8", - "rollup-pluginutils": "^2.3.3" + "fsevents": "~2.1.2" } }, "rollup-plugin-terser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-1.0.1.tgz", - "integrity": "sha512-VC6chT7QnrV6JzdgkPE0hP/atRBxaa3CPbVXfZJ8nJLjcidSdWftOst098RasYRUTKxJWAgdaJN1+uiZM6iffA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0-beta.47", - "terser": "^3.7.5" - } - }, - "rollup-plugin-typescript2": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.1.tgz", - "integrity": "sha512-RJl77Bbj1EunAQDC3dK/O2HWuSUX3oJbRGzyLoS5o9W4Hs1Nix3Gavqj1Lzs5Y6Ff4H2xXfmZ1WWUQCYocSbzQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.0.tgz", + "integrity": "sha512-p/N3lLiFusCjYTLfVkoaiRTOGr5AESEaljMPH12MhOtoMkmTBhIAfuadrcWy4am1U0vU4WTxO9fi0K09O4CboQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.8", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.15.1", - "tslib": "1.11.2" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" }, "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "jest-worker": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", + "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" } - }, - "tslib": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", - "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", - "dev": true } } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "rollup-plugin-typescript2": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.2.tgz", + "integrity": "sha512-zarMH2F8oT/NO6p20gl/jkts+WxyzOlhOIUwUU/EDx5e6ewdDPS/flwLj5XFuijUCr64bZwqKuRVwCPdXXYefQ==", "dev": true, "requires": { - "estree-walker": "^0.6.1" + "@rollup/pluginutils": "^3.1.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "8.1.0", + "resolve": "1.17.0", + "tslib": "2.0.1" }, "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", "dev": true } } @@ -5881,11 +5504,20 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5966,10 +5598,28 @@ "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true } } @@ -6121,9 +5771,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6136,12 +5786,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -6267,29 +5911,29 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^4.1.0" } } } @@ -6310,6 +5954,14 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "strip-bom": { @@ -6337,12 +5989,12 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-hyperlinks": { @@ -6353,23 +6005,6 @@ "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "symbol-tree": { @@ -6388,46 +6023,6 @@ "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "tapable": { @@ -6447,14 +6042,14 @@ } }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.2.0.tgz", + "integrity": "sha512-nZ9TWhBznZdlww3borgJyfQDrxzpgd0RlRNoxR63tMVry01lIH/zKQDTTiaWRMGowydfvSHMgyiGyn6A9PSkCQ==", "dev": true, "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" } }, "test-exclude": { @@ -6553,11 +6148,12 @@ } }, "ts-jest": { - "version": "26.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.4.tgz", - "integrity": "sha512-Nd7diUX6NZWfWq6FYyvcIPR/c7GbEF75fH1R6coOp3fbNzbRJBZZAn0ueVS0r8r9ral1VcrpneAFAwB3TsVS1Q==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.2.0.tgz", + "integrity": "sha512-9+y2qwzXdAImgLSYLXAb/Rhq9+K4rbt0417b8ai987V60g2uoNWBBmMkYgutI7D8Zhu+IbCSHbBtrHxB9d7xyA==", "dev": true, "requires": { + "@types/jest": "26.x", "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", @@ -6571,26 +6167,35 @@ }, "dependencies": { "@jest/types": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.2.0.tgz", - "integrity": "sha512-lvm3rJvctxd7+wxKSxxbzpDbr4FXDLaC57WEKdUIZ2cjTYuxYSc0zlyD7Z4Uqr5VdKxRUrtwIkiqBuvgf8uKJA==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.10.tgz", + "integrity": "sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q==", + "dev": true, + "requires": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" } }, "chalk": { @@ -6603,40 +6208,13 @@ "supports-color": "^7.1.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "jest-util": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.2.0.tgz", - "integrity": "sha512-YmDwJxLZ1kFxpxPfhSJ0rIkiZOM0PQbRcfH0TzJOhqCisCAsI1WcmoQqO83My9xeVA2k4n+rzg2UuexVKzPpig==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", + "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", "dev": true, "requires": { - "@jest/types": "^26.2.0", + "@jest/types": "^26.3.0", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -6644,20 +6222,11 @@ "micromatch": "^4.0.2" } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -6674,6 +6243,15 @@ "semver": "^6.0.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" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6685,11 +6263,41 @@ "supports-color": "^5.3.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -6725,6 +6333,21 @@ "tsutils": "^2.29.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" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6736,13 +6359,49 @@ "supports-color": "^5.3.0" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "minimist": "^1.2.5" + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" } } } @@ -6758,20 +6417,33 @@ "tsutils": "^3.0.0" }, "dependencies": { + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "requires": { + "esutils": "^1.1.6", + "isarray": "0.0.1" + } + }, + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } } } }, @@ -6786,17 +6458,17 @@ }, "dependencies": { "@types/node": { - "version": "10.17.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", - "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==", + "version": "10.17.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==", "dev": true } } }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -6818,12 +6490,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -6853,34 +6525,6 @@ "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7029,9 +6673,9 @@ } }, "vue-class-component": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.3.tgz", - "integrity": "sha512-oEqYpXKaFN+TaXU+mRLEx8dX0ah85aAJEe61mpdoUrq0Bhe/6sWhyZX1JjMQLhVsHAkncyhedhmCdDVSasUtDw==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.5.tgz", + "integrity": "sha512-0CSftHY0bDTD+4FbYkuFf6+iKDjZ4h2in2YYJDRMk5daZIjrgT9LjFHvP7Rzqy9/s1pij3zDtTSLRUjsPWMwqg==", "dev": true }, "vue-property-decorator": { @@ -7044,9 +6688,9 @@ } }, "vue-router": { - "version": "4.0.0-beta.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.6.tgz", - "integrity": "sha512-zF+reWzcM0ivbIAbjfCpDVYlvc4iQAi7rx5abLNUcNiJxuTMR0lEBoxamQcaewV4sJ+zskX6PYW3QM5/fRkPqA==" + "version": "4.0.0-beta.7", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.7.tgz", + "integrity": "sha512-98CSf1ssIu0cZgdoBTqGWn9e17pueKOy4fzVyFyUhuJkjEwWNOsMMfKru6e0GTwZEtYOd6vhizvh7mkFGvdjVg==" }, "w3c-hr-time": { "version": "1.0.2", @@ -7141,37 +6785,29 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -7196,17 +6832,6 @@ "dev": true, "requires": { "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } } }, "write-file-atomic": { @@ -7222,9 +6847,9 @@ } }, "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", "dev": true }, "xml": { @@ -7252,9 +6877,9 @@ "dev": true }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -7267,7 +6892,41 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "yargs-parser": { diff --git a/package.json b/package.json index e0de90e..2194b44 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "jsdelivr": "dist/ionic-vue.js", "files": [ "types/", - "dist/" + "dist/", + "vetur/" ], "sideEffects": false, "bugs": { @@ -49,12 +50,13 @@ "vue3" ], "scripts": { - "dev": "rollup -c ./build/rollup.config.js", + "dev": "rollup -c ./build/rollup.config.js && npm run vetur", "watch": "rollup -w -c ./build/rollup.config.js", - "prod": "npm run lint && npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd", + "prod": "npm run lint && npm run clean && NODE_ENV=production rollup -c ./build/rollup.config.js --configProd npm run vetur", "lint": "eslint --ext .ts src/** --fix", "test": "jest --coverage --verbose", - "clean": "node ./scripts/clean.js" + "clean": "node ./scripts/clean.js", + "vetur": "node ./scripts/vetur.js" }, "devDependencies": { "@types/jest": "^25.2.3", @@ -67,10 +69,10 @@ "jest": "^25.5.4", "jest-sonar-reporter": "^2.0.0", "jest-vue-preprocessor": "^1.4.0", - "rollup": "^0.62.0", - "rollup-plugin-buble": "^0.19.2", - "rollup-plugin-terser": "^1.0.1", - "rollup-plugin-typescript2": "^0.27.1", + "rollup": "^2.26.4", + "rollup-plugin-terser": "^7.0.0", + "rollup-plugin-typescript2": "^0.27.2", + "@rollup/plugin-node-resolve": "^9.0.0", "ts-jest": "^26.1.4", "ts-loader": "^7.0.5", "ts-transformer-keys": "^0.4.2", @@ -88,5 +90,9 @@ "reportPath": "reports", "reportFile": "test-report.xml", "indent": 4 + }, + "vetur": { + "tags": "vetur/tags.json", + "attributes": "vetur/attributes.json" } } diff --git a/scripts/vetur.js b/scripts/vetur.js new file mode 100644 index 0000000..d568595 --- /dev/null +++ b/scripts/vetur.js @@ -0,0 +1,65 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const meta = require('@ionic/core/dist/html.html-data.json'); + +const tags = { + 'ion-page': { + description: + '`IonPage` is a specialized component that is meant to be the parent container for an Ionic Page, which typically consists of `IonHeader` and `IonContent` components.', + }, +}; +const attrs = { + replace: { + type: 'boolean', + description: + 'Setting replace prop will call `router.replace()` instead of `router.push()` when clicked, so the navigation will replace the current history entry.', + }, +}; + +for (const key of Object.keys(meta.tags)) { + const tag = meta.tags[key]; + tags[tag.name] = { + attributes: tag.attributes.map(attr => attr.name), + description: tag.description.value, + }; + + if ( + tags[tag.name].attributes.includes('href') && + tag.name !== 'ion-tab-button' + ) { + tags[tag.name].attributes.push('replace'); + } + + tag.attributes.map(attr => { + attrs[`${tag.name}/${attr.name}`] = { + description: attr.description, + ...(attr.values ? { options: attr.values.map(v => v.name) } : {}), + }; + }); +} + +fs.writeFile( + path.resolve(__dirname, '../vetur/tags.json'), + JSON.stringify(tags, null, 2), + err => { + if (err) { + console.error(err); + } else { + console.info('Generated vetur tags.json'); + } + } +); + +fs.writeFile( + path.resolve(__dirname, '../vetur/attributes.json'), + JSON.stringify(attrs, null, 2), + err => { + if (err) { + console.error(err); + } else { + console.info('Generated vetur attributes.json'); + } + } +); diff --git a/tsconfig.json b/tsconfig.json index d26e42c..2b1f0d2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,10 +12,7 @@ "forceConsistentCasingInFileNames": true, "jsx": "react", "jsxFactory": "h", - "lib": [ - "dom", - "es2017" - ], + "lib": ["dom", "es2017"], "module": "es2015", "moduleResolution": "node", "noImplicitAny": true, @@ -30,10 +27,6 @@ "strictPropertyInitialization": false, "target": "es5" }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/vetur/attributes.json b/vetur/attributes.json new file mode 100644 index 0000000..4fdeb19 --- /dev/null +++ b/vetur/attributes.json @@ -0,0 +1,1951 @@ +{ + "willPresent": { + "description": "asdasdasd", + "type": "event" + }, + "replace": { + "type": "boolean", + "description": "Setting replace prop will call `router.replace()` instead of `router.push()` when clicked, so the navigation will replace the current history entry." + }, + "ion-action-sheet/animated": { + "description": "If `true`, the action sheet will animate." + }, + "ion-action-sheet/backdrop-dismiss": { + "description": "If `true`, the action sheet will be dismissed when the backdrop is clicked." + }, + "ion-action-sheet/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-action-sheet/header": { + "description": "Title for the action sheet." + }, + "ion-action-sheet/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-action-sheet/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-action-sheet/sub-header": { + "description": "Subtitle for the action sheet." + }, + "ion-action-sheet/translucent": { + "description": "If `true`, the action sheet will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-alert/animated": { + "description": "If `true`, the alert will animate." + }, + "ion-alert/backdrop-dismiss": { + "description": "If `true`, the alert will be dismissed when the backdrop is clicked." + }, + "ion-alert/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-alert/header": { + "description": "The main title in the heading of the alert." + }, + "ion-alert/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-alert/message": { + "description": "The main message to be displayed in the alert.\n`message` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" + }, + "ion-alert/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-alert/sub-header": { + "description": "The subtitle in the heading of the alert. Displayed under the title." + }, + "ion-alert/translucent": { + "description": "If `true`, the alert will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-back-button/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-back-button/default-href": { + "description": "The url to navigate back to by default when there is no history." + }, + "ion-back-button/disabled": { + "description": "If `true`, the user cannot interact with the button." + }, + "ion-back-button/icon": { + "description": "The icon name to use for the back button." + }, + "ion-back-button/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-back-button/text": { + "description": "The text to display in the back button." + }, + "ion-back-button/type": { + "description": "The type of the button.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-backdrop/stop-propagation": { + "description": "If `true`, the backdrop will stop propagation on tap." + }, + "ion-backdrop/tappable": { + "description": "If `true`, the backdrop will can be clicked and will emit the `ionBackdropTap` event." + }, + "ion-backdrop/visible": { + "description": "If `true`, the backdrop will be visible." + }, + "ion-badge/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-badge/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-button/button-type": { + "description": "The type of button." + }, + "ion-button/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-button/disabled": { + "description": "If `true`, the user cannot interact with the button." + }, + "ion-button/download": { + "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." + }, + "ion-button/expand": { + "description": "Set to `\"block\"` for a full-width button or to `\"full\"` for a full-width button\nwithout left and right borders.", + "options": [ + "block", + "full" + ] + }, + "ion-button/fill": { + "description": "Set to `\"clear\"` for a transparent button, to `\"outline\"` for a transparent\nbutton with a border, or to `\"solid\"`. The default style is `\"solid\"` except inside of\na toolbar, where the default is `\"clear\"`.", + "options": [ + "clear", + "default", + "outline", + "solid" + ] + }, + "ion-button/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-button/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-button/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-button/router-direction": { + "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", + "options": [ + "back", + "forward", + "root" + ] + }, + "ion-button/shape": { + "description": "The button shape.", + "options": [ + "round" + ] + }, + "ion-button/size": { + "description": "The button size.", + "options": [ + "default", + "large", + "small" + ] + }, + "ion-button/strong": { + "description": "If `true`, activates a button with a heavier font weight." + }, + "ion-button/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-button/type": { + "description": "The type of the button.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-buttons/collapse": { + "description": "If true, buttons will disappear when its\nparent toolbar has fully collapsed if the toolbar\nis not the first toolbar. If the toolbar is the\nfirst toolbar, the buttons will be hidden and will\nonly be shown once all toolbars have fully collapsed.\n\nOnly applies in `ios` mode with `collapse` set to\n`true` on `ion-header`.\n\nTypically used for [Collapsible Large Titles](https://ionicframework.com/docs/api/title#collapsible-large-titles)" + }, + "ion-card/button": { + "description": "If `true`, a button tag will be rendered and the card will be tappable." + }, + "ion-card/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-card/disabled": { + "description": "If `true`, the user cannot interact with the card." + }, + "ion-card/download": { + "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." + }, + "ion-card/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-card/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-card/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-card/router-direction": { + "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", + "options": [ + "back", + "forward", + "root" + ] + }, + "ion-card/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-card/type": { + "description": "The type of the button. Only used when an `onclick` or `button` property is present.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-card-content/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-card-header/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-card-header/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-card-header/translucent": { + "description": "If `true`, the card header will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-card-subtitle/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-card-subtitle/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-card-title/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-card-title/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-checkbox/checked": { + "description": "If `true`, the checkbox is selected." + }, + "ion-checkbox/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-checkbox/disabled": { + "description": "If `true`, the user cannot interact with the checkbox." + }, + "ion-checkbox/indeterminate": { + "description": "If `true`, the checkbox will visually appear as indeterminate." + }, + "ion-checkbox/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-checkbox/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-checkbox/value": { + "description": "The value of the toggle does not mean if it's checked or not, use the `checked`\nproperty for that.\n\nThe value of a toggle is analogous to the value of a ``,\nit's only used when the toggle participates in a native `
`." + }, + "ion-chip/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-chip/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-chip/outline": { + "description": "Display an outline style button." + }, + "ion-col/offset": { + "description": "The amount to offset the column, in terms of how many columns it should shift to the end\nof the total available." + }, + "ion-col/offset-lg": { + "description": "The amount to offset the column for lg screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/offset-md": { + "description": "The amount to offset the column for md screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/offset-sm": { + "description": "The amount to offset the column for sm screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/offset-xl": { + "description": "The amount to offset the column for xl screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/offset-xs": { + "description": "The amount to offset the column for xs screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/pull": { + "description": "The amount to pull the column, in terms of how many columns it should shift to the start of\nthe total available." + }, + "ion-col/pull-lg": { + "description": "The amount to pull the column for lg screens, in terms of how many columns it should shift\nto the start of the total available." + }, + "ion-col/pull-md": { + "description": "The amount to pull the column for md screens, in terms of how many columns it should shift\nto the start of the total available." + }, + "ion-col/pull-sm": { + "description": "The amount to pull the column for sm screens, in terms of how many columns it should shift\nto the start of the total available." + }, + "ion-col/pull-xl": { + "description": "The amount to pull the column for xl screens, in terms of how many columns it should shift\nto the start of the total available." + }, + "ion-col/pull-xs": { + "description": "The amount to pull the column for xs screens, in terms of how many columns it should shift\nto the start of the total available." + }, + "ion-col/push": { + "description": "The amount to push the column, in terms of how many columns it should shift to the end\nof the total available." + }, + "ion-col/push-lg": { + "description": "The amount to push the column for lg screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/push-md": { + "description": "The amount to push the column for md screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/push-sm": { + "description": "The amount to push the column for sm screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/push-xl": { + "description": "The amount to push the column for xl screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/push-xs": { + "description": "The amount to push the column for xs screens, in terms of how many columns it should shift\nto the end of the total available." + }, + "ion-col/size": { + "description": "The size of the column, in terms of how many columns it should take up out of the total\navailable. If `\"auto\"` is passed, the column will be the size of its content." + }, + "ion-col/size-lg": { + "description": "The size of the column for lg screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." + }, + "ion-col/size-md": { + "description": "The size of the column for md screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." + }, + "ion-col/size-sm": { + "description": "The size of the column for sm screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." + }, + "ion-col/size-xl": { + "description": "The size of the column for xl screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." + }, + "ion-col/size-xs": { + "description": "The size of the column for xs screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." + }, + "ion-content/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-content/force-overscroll": { + "description": "If `true` and the content does not cause an overflow scroll, the scroll interaction will cause a bounce.\nIf the content exceeds the bounds of ionContent, nothing will change.\nNote, the does not disable the system bounce on iOS. That is an OS level setting." + }, + "ion-content/fullscreen": { + "description": "If `true`, the content will scroll behind the headers\nand footers. This effect can easily be seen by setting the toolbar\nto transparent." + }, + "ion-content/scroll-events": { + "description": "Because of performance reasons, ionScroll events are disabled by default, in order to enable them\nand start listening from (ionScroll), set this property to `true`." + }, + "ion-content/scroll-x": { + "description": "If you want to enable the content scrolling in the X axis, set this property to `true`." + }, + "ion-content/scroll-y": { + "description": "If you want to disable the content scrolling in the Y axis, set this property to `false`." + }, + "ion-datetime/cancel-text": { + "description": "The text to display on the picker's cancel button." + }, + "ion-datetime/day-names": { + "description": "Full day of the week names. This can be used to provide\nlocale names for each day in the week. Defaults to English." + }, + "ion-datetime/day-short-names": { + "description": "Short abbreviated day of the week names. This can be used to provide\nlocale names for each day in the week. Defaults to English.\nDefaults to: `['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']`" + }, + "ion-datetime/day-values": { + "description": "Values used to create the list of selectable days. By default\nevery day is shown for the given month. However, to control exactly which days of\nthe month to display, the `dayValues` input can take a number, an array of numbers, or\na string of comma separated numbers. Note that even if the array days have an invalid\nnumber for the selected month, like `31` in February, it will correctly not show\ndays which are not valid for the selected month." + }, + "ion-datetime/disabled": { + "description": "If `true`, the user cannot interact with the datetime." + }, + "ion-datetime/display-format": { + "description": "The display format of the date and time as text that shows\nwithin the item. When the `pickerFormat` input is not used, then the\n`displayFormat` is used for both display the formatted text, and determining\nthe datetime picker's columns. See the `pickerFormat` input description for\nmore info. Defaults to `MMM D, YYYY`." + }, + "ion-datetime/display-timezone": { + "description": "The timezone to use for display purposes only. See\n[Date.prototype.toLocaleString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString)\nfor a list of supported timezones. If no value is provided, the\ncomponent will default to displaying times in the user's local timezone." + }, + "ion-datetime/done-text": { + "description": "The text to display on the picker's \"Done\" button." + }, + "ion-datetime/hour-values": { + "description": "Values used to create the list of selectable hours. By default\nthe hour values range from `0` to `23` for 24-hour, or `1` to `12` for 12-hour. However,\nto control exactly which hours to display, the `hourValues` input can take a number, an\narray of numbers, or a string of comma separated numbers." + }, + "ion-datetime/max": { + "description": "The maximum datetime allowed. Value must be a date string\nfollowing the\n[ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),\n`1996-12-19`. The format does not have to be specific to an exact\ndatetime. For example, the maximum could just be the year, such as `1994`.\nDefaults to the end of this year." + }, + "ion-datetime/min": { + "description": "The minimum datetime allowed. Value must be a date string\nfollowing the\n[ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),\nsuch as `1996-12-19`. The format does not have to be specific to an exact\ndatetime. For example, the minimum could just be the year, such as `1994`.\nDefaults to the beginning of the year, 100 years ago from today." + }, + "ion-datetime/minute-values": { + "description": "Values used to create the list of selectable minutes. By default\nthe minutes range from `0` to `59`. However, to control exactly which minutes to display,\nthe `minuteValues` input can take a number, an array of numbers, or a string of comma\nseparated numbers. For example, if the minute selections should only be every 15 minutes,\nthen this input value would be `minuteValues=\"0,15,30,45\"`." + }, + "ion-datetime/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-datetime/month-names": { + "description": "Full names for each month name. This can be used to provide\nlocale month names. Defaults to English." + }, + "ion-datetime/month-short-names": { + "description": "Short abbreviated names for each month name. This can be used to provide\nlocale month names. Defaults to English." + }, + "ion-datetime/month-values": { + "description": "Values used to create the list of selectable months. By default\nthe month values range from `1` to `12`. However, to control exactly which months to\ndisplay, the `monthValues` input can take a number, an array of numbers, or a string of\ncomma separated numbers. For example, if only summer months should be shown, then this\ninput value would be `monthValues=\"6,7,8\"`. Note that month numbers do *not* have a\nzero-based index, meaning January's value is `1`, and December's is `12`." + }, + "ion-datetime/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-datetime/picker-format": { + "description": "The format of the date and time picker columns the user selects.\nA datetime input can have one or many datetime parts, each getting their\nown column which allow individual selection of that particular datetime part. For\nexample, year and month columns are two individually selectable columns which help\nchoose an exact date from the datetime picker. Each column follows the string\nparse format. Defaults to use `displayFormat`." + }, + "ion-datetime/placeholder": { + "description": "The text to display when there's no date selected yet.\nUsing lowercase to match the input attribute" + }, + "ion-datetime/readonly": { + "description": "If `true`, the datetime appears normal but is not interactive." + }, + "ion-datetime/value": { + "description": "The value of the datetime as a valid ISO 8601 datetime string." + }, + "ion-datetime/year-values": { + "description": "Values used to create the list of selectable years. By default\nthe year values range between the `min` and `max` datetime inputs. However, to\ncontrol exactly which years to display, the `yearValues` input can take a number, an array\nof numbers, or string of comma separated numbers. For example, to show upcoming and\nrecent leap years, then this input's value would be `yearValues=\"2024,2020,2016,2012,2008\"`." + }, + "ion-fab/activated": { + "description": "If `true`, both the `ion-fab-button` and all `ion-fab-list` inside `ion-fab` will become active.\nThat means `ion-fab-button` will become a `close` icon and `ion-fab-list` will become visible." + }, + "ion-fab/edge": { + "description": "If `true`, the fab will display on the edge of the header if\n`vertical` is `\"top\"`, and on the edge of the footer if\nit is `\"bottom\"`. Should be used with a `fixed` slot." + }, + "ion-fab/horizontal": { + "description": "Where to align the fab horizontally in the viewport.", + "options": [ + "center", + "end", + "start" + ] + }, + "ion-fab/vertical": { + "description": "Where to align the fab vertically in the viewport.", + "options": [ + "bottom", + "center", + "top" + ] + }, + "ion-fab-button/activated": { + "description": "If `true`, the fab button will be show a close icon." + }, + "ion-fab-button/close-icon": { + "description": "The icon name to use for the close icon. This will appear when the fab button\nis pressed. Only applies if it is the main button inside of a fab containing a\nfab list." + }, + "ion-fab-button/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-fab-button/disabled": { + "description": "If `true`, the user cannot interact with the fab button." + }, + "ion-fab-button/download": { + "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." + }, + "ion-fab-button/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-fab-button/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-fab-button/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-fab-button/router-direction": { + "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", + "options": [ + "back", + "forward", + "root" + ] + }, + "ion-fab-button/show": { + "description": "If `true`, the fab button will show when in a fab-list." + }, + "ion-fab-button/size": { + "description": "The size of the button. Set this to `small` in order to have a mini fab button.", + "options": [ + "small" + ] + }, + "ion-fab-button/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-fab-button/translucent": { + "description": "If `true`, the fab button will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-fab-button/type": { + "description": "The type of the button.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-fab-list/activated": { + "description": "If `true`, the fab list will show all fab buttons in the list." + }, + "ion-fab-list/side": { + "description": "The side the fab list will show on relative to the main fab button.", + "options": [ + "bottom", + "end", + "start", + "top" + ] + }, + "ion-footer/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-footer/translucent": { + "description": "If `true`, the footer will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility).\n\nNote: In order to scroll content behind the footer, the `fullscreen`\nattribute needs to be set on the content." + }, + "ion-grid/fixed": { + "description": "If `true`, the grid will have a fixed width based on the screen size." + }, + "ion-header/collapse": { + "description": "Describes the scroll effect that will be applied to the header\n`condense` only applies in iOS mode.\n\nTypically used for [Collapsible Large Titles](https://ionicframework.com/docs/api/title#collapsible-large-titles)", + "options": [ + "condense" + ] + }, + "ion-header/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-header/translucent": { + "description": "If `true`, the header will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility).\n\nNote: In order to scroll content behind the header, the `fullscreen`\nattribute needs to be set on the content." + }, + "ion-img/alt": { + "description": "This attribute defines the alternative text describing the image.\nUsers will see this text displayed if the image URL is wrong,\nthe image is not in one of the supported formats, or if the image is not yet downloaded." + }, + "ion-img/src": { + "description": "The image URL. This attribute is mandatory for the `` element." + }, + "ion-infinite-scroll/disabled": { + "description": "If `true`, the infinite scroll will be hidden and scroll event listeners\nwill be removed.\n\nSet this to true to disable the infinite scroll from actively\ntrying to receive new data while scrolling. This is useful\nwhen it is known that there is no more data that can be added, and\nthe infinite scroll is no longer needed." + }, + "ion-infinite-scroll/position": { + "description": "The position of the infinite scroll element.\nThe value can be either `top` or `bottom`.", + "options": [ + "bottom", + "top" + ] + }, + "ion-infinite-scroll/threshold": { + "description": "The threshold distance from the bottom\nof the content to call the `infinite` output event when scrolled.\nThe threshold value can be either a percent, or\nin pixels. For example, use the value of `10%` for the `infinite`\noutput event to get called when the user has scrolled 10%\nfrom the bottom of the page. Use the value `100px` when the\nscroll is within 100 pixels from the bottom of the page." + }, + "ion-infinite-scroll-content/loading-spinner": { + "description": "An animated SVG spinner that shows while loading.", + "options": [ + "bubbles", + "circles", + "circular", + "crescent", + "dots", + "lines", + "lines-small" + ] + }, + "ion-infinite-scroll-content/loading-text": { + "description": "Optional text to display while loading.\n`loadingText` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" + }, + "ion-input/accept": { + "description": "If the value of the type attribute is `\"file\"`, then this attribute will indicate the types of files that the server accepts, otherwise it will be ignored. The value must be a comma-separated list of unique content type specifiers." + }, + "ion-input/autocapitalize": { + "description": "Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user." + }, + "ion-input/autocomplete": { + "description": "Indicates whether the value of the control can be automatically completed by the browser.", + "options": [ + "on", + "off", + "name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "email", + "username", + "new-password", + "current-password", + "one-time-code", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-extension", + "impp", + "url", + "photo" + ] + }, + "ion-input/autocorrect": { + "description": "Whether auto correction should be enabled when the user is entering/editing the text value.", + "options": [ + "off", + "on" + ] + }, + "ion-input/autofocus": { + "description": "This Boolean attribute lets you specify that a form control should have input focus when the page loads." + }, + "ion-input/clear-input": { + "description": "If `true`, a clear icon will appear in the input when there is a value. Clicking it clears the input." + }, + "ion-input/clear-on-edit": { + "description": "If `true`, the value will be cleared after focus upon edit. Defaults to `true` when `type` is `\"password\"`, `false` for all other types." + }, + "ion-input/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-input/debounce": { + "description": "Set the amount of time, in milliseconds, to wait to trigger the `ionChange` event after each keystroke." + }, + "ion-input/disabled": { + "description": "If `true`, the user cannot interact with the input." + }, + "ion-input/enterkeyhint": { + "description": "A hint to the browser for which enter key to display.\nPossible values: `\"enter\"`, `\"done\"`, `\"go\"`, `\"next\"`,\n`\"previous\"`, `\"search\"`, and `\"send\"`.", + "options": [ + "done", + "enter", + "go", + "next", + "previous", + "search", + "send" + ] + }, + "ion-input/inputmode": { + "description": "A hint to the browser for which keyboard to display.\nPossible values: `\"none\"`, `\"text\"`, `\"tel\"`, `\"url\"`,\n`\"email\"`, `\"numeric\"`, `\"decimal\"`, and `\"search\"`.", + "options": [ + "decimal", + "email", + "none", + "numeric", + "search", + "tel", + "text", + "url" + ] + }, + "ion-input/max": { + "description": "The maximum value, which must not be less than its minimum (min attribute) value." + }, + "ion-input/maxlength": { + "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the maximum number of characters that the user can enter." + }, + "ion-input/min": { + "description": "The minimum value, which must not be greater than its maximum (max attribute) value." + }, + "ion-input/minlength": { + "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the minimum number of characters that the user can enter." + }, + "ion-input/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-input/multiple": { + "description": "If `true`, the user can enter more than one value. This attribute applies when the type attribute is set to `\"email\"` or `\"file\"`, otherwise it is ignored." + }, + "ion-input/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-input/pattern": { + "description": "A regular expression that the value is checked against. The pattern must match the entire value, not just some subset. Use the title attribute to describe the pattern to help the user. This attribute applies when the value of the type attribute is `\"text\"`, `\"search\"`, `\"tel\"`, `\"url\"`, `\"email\"`, `\"date\"`, or `\"password\"`, otherwise it is ignored. When the type attribute is `\"date\"`, `pattern` will only be used in browsers that do not support the `\"date\"` input type natively. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date for more information." + }, + "ion-input/placeholder": { + "description": "Instructional text that shows before the input has a value." + }, + "ion-input/readonly": { + "description": "If `true`, the user cannot modify the value." + }, + "ion-input/required": { + "description": "If `true`, the user must fill in a value before submitting a form." + }, + "ion-input/size": { + "description": "The initial size of the control. This value is in pixels unless the value of the type attribute is `\"text\"` or `\"password\"`, in which case it is an integer number of characters. This attribute applies only when the `type` attribute is set to `\"text\"`, `\"search\"`, `\"tel\"`, `\"url\"`, `\"email\"`, or `\"password\"`, otherwise it is ignored." + }, + "ion-input/spellcheck": { + "description": "If `true`, the element will have its spelling and grammar checked." + }, + "ion-input/step": { + "description": "Works with the min and max attributes to limit the increments at which a value can be set.\nPossible values are: `\"any\"` or a positive floating point number." + }, + "ion-input/type": { + "description": "The type of control to display. The default type is text.", + "options": [ + "date", + "datetime-local", + "email", + "month", + "number", + "password", + "search", + "tel", + "text", + "time", + "url", + "week" + ] + }, + "ion-input/value": { + "description": "The value of the input." + }, + "ion-item/button": { + "description": "If `true`, a button tag will be rendered and the item will be tappable." + }, + "ion-item/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-item/detail": { + "description": "If `true`, a detail arrow will appear on the item. Defaults to `false` unless the `mode`\nis `ios` and an `href` or `button` property is present." + }, + "ion-item/detail-icon": { + "description": "The icon to use when `detail` is set to `true`." + }, + "ion-item/disabled": { + "description": "If `true`, the user cannot interact with the item." + }, + "ion-item/download": { + "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." + }, + "ion-item/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-item/lines": { + "description": "How the bottom border should be displayed on the item.", + "options": [ + "full", + "inset", + "none" + ] + }, + "ion-item/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-item/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-item/router-direction": { + "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", + "options": [ + "back", + "forward", + "root" + ] + }, + "ion-item/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-item/type": { + "description": "The type of the button. Only used when an `onclick` or `button` property is present.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-item-divider/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-item-divider/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-item-divider/sticky": { + "description": "When it's set to `true`, the item-divider will stay visible when it reaches the top\nof the viewport until the next `ion-item-divider` replaces it.\n\nThis feature relies in `position:sticky`:\nhttps://caniuse.com/#feat=css-sticky" + }, + "ion-item-option/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-item-option/disabled": { + "description": "If `true`, the user cannot interact with the item option." + }, + "ion-item-option/download": { + "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." + }, + "ion-item-option/expandable": { + "description": "If `true`, the option will expand to take up the available width and cover any other options." + }, + "ion-item-option/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-item-option/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-item-option/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-item-option/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-item-option/type": { + "description": "The type of the button.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-item-options/side": { + "description": "The side the option button should be on. Possible values: `\"start\"` and `\"end\"`. If you have multiple `ion-item-options`, a side must be provided for each.", + "options": [ + "end", + "start" + ] + }, + "ion-item-sliding/disabled": { + "description": "If `true`, the user cannot interact with the sliding item." + }, + "ion-label/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-label/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-label/position": { + "description": "The position determines where and how the label behaves inside an item.", + "options": [ + "fixed", + "floating", + "stacked" + ] + }, + "ion-list/inset": { + "description": "If `true`, the list will have margin around it and rounded corners." + }, + "ion-list/lines": { + "description": "How the bottom border should be displayed on all items.", + "options": [ + "full", + "inset", + "none" + ] + }, + "ion-list/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-list-header/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-list-header/lines": { + "description": "How the bottom border should be displayed on the list header.", + "options": [ + "full", + "inset", + "none" + ] + }, + "ion-list-header/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-loading/animated": { + "description": "If `true`, the loading indicator will animate." + }, + "ion-loading/backdrop-dismiss": { + "description": "If `true`, the loading indicator will be dismissed when the backdrop is clicked." + }, + "ion-loading/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-loading/duration": { + "description": "Number of milliseconds to wait before dismissing the loading indicator." + }, + "ion-loading/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-loading/message": { + "description": "Optional text content to display in the loading indicator." + }, + "ion-loading/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-loading/show-backdrop": { + "description": "If `true`, a backdrop will be displayed behind the loading indicator." + }, + "ion-loading/spinner": { + "description": "The name of the spinner to display.", + "options": [ + "bubbles", + "circles", + "circular", + "crescent", + "dots", + "lines", + "lines-small" + ] + }, + "ion-loading/translucent": { + "description": "If `true`, the loading indicator will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-menu/content-id": { + "description": "The content's id the menu should use." + }, + "ion-menu/disabled": { + "description": "If `true`, the menu is disabled." + }, + "ion-menu/max-edge-start": { + "description": "The edge threshold for dragging the menu open.\nIf a drag/swipe happens over this value, the menu is not triggered." + }, + "ion-menu/menu-id": { + "description": "An id for the menu." + }, + "ion-menu/side": { + "description": "Which side of the view the menu should be placed.", + "options": [ + "end", + "start" + ] + }, + "ion-menu/swipe-gesture": { + "description": "If `true`, swiping the menu is enabled." + }, + "ion-menu/type": { + "description": "The display type of the menu.\nAvailable options: `\"overlay\"`, `\"reveal\"`, `\"push\"`." + }, + "ion-menu-button/auto-hide": { + "description": "Automatically hides the menu button when the corresponding menu is not active" + }, + "ion-menu-button/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-menu-button/disabled": { + "description": "If `true`, the user cannot interact with the menu button." + }, + "ion-menu-button/menu": { + "description": "Optional property that maps to a Menu's `menuId` prop. Can also be `start` or `end` for the menu side. This is used to find the correct menu to toggle" + }, + "ion-menu-button/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-menu-button/type": { + "description": "The type of the button.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-menu-toggle/auto-hide": { + "description": "Automatically hides the content when the corresponding menu is not active.\n\nBy default, it's `true`. Change it to `false` in order to\nkeep `ion-menu-toggle` always visible regardless the state of the menu." + }, + "ion-menu-toggle/menu": { + "description": "Optional property that maps to a Menu's `menuId` prop.\nCan also be `start` or `end` for the menu side.\nThis is used to find the correct menu to toggle.\n\nIf this property is not used, `ion-menu-toggle` will toggle the\nfirst menu that is active." + }, + "ion-modal/animated": { + "description": "If `true`, the modal will animate." + }, + "ion-modal/backdrop-dismiss": { + "description": "If `true`, the modal will be dismissed when the backdrop is clicked." + }, + "ion-modal/component": { + "description": "The component to display inside of the modal." + }, + "ion-modal/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-modal/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-modal/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-modal/show-backdrop": { + "description": "If `true`, a backdrop will be displayed behind the modal." + }, + "ion-modal/swipe-to-close": { + "description": "If `true`, the modal can be swiped to dismiss. Only applies in iOS mode." + }, + "ion-nav/animated": { + "description": "If `true`, the nav should animate the transition of components." + }, + "ion-nav/root": { + "description": "Root NavComponent to load" + }, + "ion-nav/swipe-gesture": { + "description": "If the nav component should allow for swipe-to-go-back." + }, + "ion-nav-link/component": { + "description": "Component to navigate to. Only used if the `routerDirection` is `\"forward\"` or `\"root\"`." + }, + "ion-nav-link/router-direction": { + "description": "The transition direction when navigating to another page.", + "options": [ + "back", + "forward", + "root" + ] + }, + "ion-note/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-note/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-picker/animated": { + "description": "If `true`, the picker will animate." + }, + "ion-picker/backdrop-dismiss": { + "description": "If `true`, the picker will be dismissed when the backdrop is clicked." + }, + "ion-picker/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-picker/duration": { + "description": "Number of milliseconds to wait before dismissing the picker." + }, + "ion-picker/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-picker/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-picker/show-backdrop": { + "description": "If `true`, a backdrop will be displayed behind the picker." + }, + "ion-popover/animated": { + "description": "If `true`, the popover will animate." + }, + "ion-popover/backdrop-dismiss": { + "description": "If `true`, the popover will be dismissed when the backdrop is clicked." + }, + "ion-popover/component": { + "description": "The component to display inside of the popover." + }, + "ion-popover/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-popover/event": { + "description": "The event to pass to the popover animation." + }, + "ion-popover/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-popover/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-popover/show-backdrop": { + "description": "If `true`, a backdrop will be displayed behind the popover." + }, + "ion-popover/translucent": { + "description": "If `true`, the popover will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-progress-bar/buffer": { + "description": "If the buffer and value are smaller than 1, the buffer circles will show.\nThe buffer should be between [0, 1]." + }, + "ion-progress-bar/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-progress-bar/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-progress-bar/reversed": { + "description": "If true, reverse the progress bar direction." + }, + "ion-progress-bar/type": { + "description": "The state of the progress bar, based on if the time the process takes is known or not.\nDefault options are: `\"determinate\"` (no animation), `\"indeterminate\"` (animate from left to right).", + "options": [ + "determinate", + "indeterminate" + ] + }, + "ion-progress-bar/value": { + "description": "The value determines how much of the active bar should display when the\n`type` is `\"determinate\"`.\nThe value should be between [0, 1]." + }, + "ion-radio/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-radio/disabled": { + "description": "If `true`, the user cannot interact with the radio." + }, + "ion-radio/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-radio/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-radio/value": { + "description": "the value of the radio." + }, + "ion-radio-group/allow-empty-selection": { + "description": "If `true`, the radios can be deselected." + }, + "ion-radio-group/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-radio-group/value": { + "description": "the value of the radio group." + }, + "ion-range/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-range/debounce": { + "description": "How long, in milliseconds, to wait to trigger the\n`ionChange` event after each change in the range value." + }, + "ion-range/disabled": { + "description": "If `true`, the user cannot interact with the range." + }, + "ion-range/dual-knobs": { + "description": "Show two knobs." + }, + "ion-range/max": { + "description": "Maximum integer value of the range." + }, + "ion-range/min": { + "description": "Minimum integer value of the range." + }, + "ion-range/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-range/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-range/pin": { + "description": "If `true`, a pin with integer value is shown when the knob\nis pressed." + }, + "ion-range/snaps": { + "description": "If `true`, the knob snaps to tick marks evenly spaced based\non the step property value." + }, + "ion-range/step": { + "description": "Specifies the value granularity." + }, + "ion-range/ticks": { + "description": "If `true`, tick marks are displayed based on the step value.\nOnly applies when `snaps` is `true`." + }, + "ion-range/value": { + "description": "the value of the range." + }, + "ion-refresher/close-duration": { + "description": "Time it takes to close the refresher.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." + }, + "ion-refresher/disabled": { + "description": "If `true`, the refresher will be hidden." + }, + "ion-refresher/pull-factor": { + "description": "How much to multiply the pull speed by. To slow the pull animation down,\npass a number less than `1`. To speed up the pull, pass a number greater\nthan `1`. The default value is `1` which is equal to the speed of the cursor.\nIf a negative value is passed in, the factor will be `1` instead.\n\nFor example: If the value passed is `1.2` and the content is dragged by\n`10` pixels, instead of `10` pixels the content will be pulled by `12` pixels\n(an increase of 20 percent). If the value passed is `0.8`, the dragged amount\nwill be `8` pixels, less than the amount the cursor has moved.\n\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." + }, + "ion-refresher/pull-max": { + "description": "The maximum distance of the pull until the refresher\nwill automatically go into the `refreshing` state.\nDefaults to the result of `pullMin + 60`.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." + }, + "ion-refresher/pull-min": { + "description": "The minimum distance the user must pull down until the\nrefresher will go into the `refreshing` state.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." + }, + "ion-refresher/snapback-duration": { + "description": "Time it takes the refresher to to snap back to the `refreshing` state.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." + }, + "ion-refresher-content/pulling-icon": { + "description": "A static icon or a spinner to display when you begin to pull down.\nA spinner name can be provided to gradually show tick marks\nwhen pulling down on iOS devices." + }, + "ion-refresher-content/pulling-text": { + "description": "The text you want to display when you begin to pull down.\n`pullingText` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" + }, + "ion-refresher-content/refreshing-spinner": { + "description": "An animated SVG spinner that shows when refreshing begins", + "options": [ + "bubbles", + "circles", + "circular", + "crescent", + "dots", + "lines", + "lines-small" + ] + }, + "ion-refresher-content/refreshing-text": { + "description": "The text you want to display when performing a refresh.\n`refreshingText` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" + }, + "ion-reorder-group/disabled": { + "description": "If `true`, the reorder will be hidden." + }, + "ion-ripple-effect/type": { + "description": "Sets the type of ripple-effect:\n\n- `bounded`: the ripple effect expands from the user's click position\n- `unbounded`: the ripple effect expands from the center of the button and overflows the container.\n\nNOTE: Surfaces for bounded ripples should have the overflow property set to hidden,\nwhile surfaces for unbounded ripples should have it set to visible.", + "options": [ + "bounded", + "unbounded" + ] + }, + "ion-route/component": { + "description": "Name of the component to load/select in the navigation outlet (`ion-tabs`, `ion-nav`)\nwhen the route matches.\n\nThe value of this property is not always the tagname of the component to load,\nin `ion-tabs` it actually refers to the name of the `ion-tab` to select." + }, + "ion-route/url": { + "description": "Relative path that needs to match in order for this route to apply.\n\nAccepts paths similar to expressjs so that you can define parameters\nin the url /foo/:bar where bar would be available in incoming props." + }, + "ion-route-redirect/from": { + "description": "A redirect route, redirects \"from\" a URL \"to\" another URL. This property is that \"from\" URL.\nIt needs to be an exact match of the navigated URL in order to apply.\n\nThe path specified in this value is always an absolute path, even if the initial `/` slash\nis not specified." + }, + "ion-route-redirect/to": { + "description": "A redirect route, redirects \"from\" a URL \"to\" another URL. This property is that \"to\" URL.\nWhen the defined `ion-route-redirect` rule matches, the router will redirect to the path\nspecified in this property.\n\nThe value of this property is always an absolute path inside the scope of routes defined in\n`ion-router` it can't be used with another router or to perform a redirection to a different domain.\n\nNote that this is a virtual redirect, it will not cause a real browser refresh, again, it's\na redirect inside the context of ion-router.\n\nWhen this property is not specified or his value is `undefined` the whole redirect route is noop,\neven if the \"from\" value matches." + }, + "ion-router/root": { + "description": "By default `ion-router` will match the routes at the root path (\"/\").\nThat can be changed when" + }, + "ion-router/use-hash": { + "description": "The router can work in two \"modes\":\n- With hash: `/index.html#/path/to/page`\n- Without hash: `/path/to/page`\n\nUsing one or another might depend in the requirements of your app and/or where it's deployed.\n\nUsually \"hash-less\" navigation works better for SEO and it's more user friendly too, but it might\nrequires additional server-side configuration in order to properly work.\n\nOn the otherside hash-navigation is much easier to deploy, it even works over the file protocol.\n\nBy default, this property is `true`, change to `false` to allow hash-less URLs." + }, + "ion-router-link/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-router-link/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-router-link/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-router-link/router-direction": { + "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", + "options": [ + "back", + "forward", + "root" + ] + }, + "ion-router-link/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-router-outlet/animated": { + "description": "If `true`, the router-outlet should animate the transition of components." + }, + "ion-router-outlet/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-searchbar/animated": { + "description": "If `true`, enable searchbar animation." + }, + "ion-searchbar/autocomplete": { + "description": "Set the input's autocomplete property.", + "options": [ + "on", + "off", + "name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "email", + "username", + "new-password", + "current-password", + "one-time-code", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-extension", + "impp", + "url", + "photo" + ] + }, + "ion-searchbar/autocorrect": { + "description": "Set the input's autocorrect property.", + "options": [ + "off", + "on" + ] + }, + "ion-searchbar/cancel-button-icon": { + "description": "Set the cancel button icon. Only applies to `md` mode.\nDefaults to `\"arrow-back-sharp\"`." + }, + "ion-searchbar/cancel-button-text": { + "description": "Set the the cancel button text. Only applies to `ios` mode." + }, + "ion-searchbar/clear-icon": { + "description": "Set the clear icon. Defaults to `\"close-circle\"` for `ios` and `\"close-sharp\"` for `md`." + }, + "ion-searchbar/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-searchbar/debounce": { + "description": "Set the amount of time, in milliseconds, to wait to trigger the `ionChange` event after each keystroke." + }, + "ion-searchbar/disabled": { + "description": "If `true`, the user cannot interact with the input." + }, + "ion-searchbar/enterkeyhint": { + "description": "A hint to the browser for which enter key to display.\nPossible values: `\"enter\"`, `\"done\"`, `\"go\"`, `\"next\"`,\n`\"previous\"`, `\"search\"`, and `\"send\"`.", + "options": [ + "done", + "enter", + "go", + "next", + "previous", + "search", + "send" + ] + }, + "ion-searchbar/inputmode": { + "description": "A hint to the browser for which keyboard to display.\nPossible values: `\"none\"`, `\"text\"`, `\"tel\"`, `\"url\"`,\n`\"email\"`, `\"numeric\"`, `\"decimal\"`, and `\"search\"`.", + "options": [ + "decimal", + "email", + "none", + "numeric", + "search", + "tel", + "text", + "url" + ] + }, + "ion-searchbar/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-searchbar/placeholder": { + "description": "Set the input's placeholder.\n`placeholder` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" + }, + "ion-searchbar/search-icon": { + "description": "The icon to use as the search icon. Defaults to `\"search-outline\"` in\n`ios` mode and `\"search-sharp\"` in `md` mode." + }, + "ion-searchbar/show-cancel-button": { + "description": "Sets the behavior for the cancel button. Defaults to `\"never\"`.\nSetting to `\"focus\"` shows the cancel button on focus.\nSetting to `\"never\"` hides the cancel button.\nSetting to `\"always\"` shows the cancel button regardless\nof focus state.", + "options": [ + "always", + "focus", + "never" + ] + }, + "ion-searchbar/spellcheck": { + "description": "If `true`, enable spellcheck on the input." + }, + "ion-searchbar/type": { + "description": "Set the type of the input.", + "options": [ + "email", + "number", + "password", + "search", + "tel", + "text", + "url" + ] + }, + "ion-searchbar/value": { + "description": "the value of the searchbar." + }, + "ion-segment/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-segment/disabled": { + "description": "If `true`, the user cannot interact with the segment." + }, + "ion-segment/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-segment/scrollable": { + "description": "If `true`, the segment buttons will overflow and the user can swipe to see them.\nIn addition, this will disable the gesture to drag the indicator between the buttons\nin order to swipe to see hidden buttons." + }, + "ion-segment/value": { + "description": "the value of the segment." + }, + "ion-segment-button/disabled": { + "description": "If `true`, the user cannot interact with the segment button." + }, + "ion-segment-button/layout": { + "description": "Set the layout of the text and icon in the segment.", + "options": [ + "icon-bottom", + "icon-end", + "icon-hide", + "icon-start", + "icon-top", + "label-hide" + ] + }, + "ion-segment-button/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-segment-button/type": { + "description": "The type of the button.", + "options": [ + "button", + "reset", + "submit" + ] + }, + "ion-segment-button/value": { + "description": "The value of the segment button." + }, + "ion-select/cancel-text": { + "description": "The text to display on the cancel button." + }, + "ion-select/compare-with": { + "description": "A property name or function used to compare object values" + }, + "ion-select/disabled": { + "description": "If `true`, the user cannot interact with the select." + }, + "ion-select/interface": { + "description": "The interface the select should use: `action-sheet`, `popover` or `alert`.", + "options": [ + "action-sheet", + "alert", + "popover" + ] + }, + "ion-select/interface-options": { + "description": "Any additional options that the `alert`, `action-sheet` or `popover` interface\ncan take. See the [ion-alert docs](../alert), the\n[ion-action-sheet docs](../action-sheet) and the\n[ion-popover docs](../popover) for the\ncreate options for each interface.\n\nNote: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface." + }, + "ion-select/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-select/multiple": { + "description": "If `true`, the select can accept multiple values." + }, + "ion-select/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-select/ok-text": { + "description": "The text to display on the ok button." + }, + "ion-select/placeholder": { + "description": "The text to display when the select is empty." + }, + "ion-select/selected-text": { + "description": "The text to display instead of the selected option's value." + }, + "ion-select/value": { + "description": "the value of the select." + }, + "ion-select-option/disabled": { + "description": "If `true`, the user cannot interact with the select option. This property does not apply when `interface=\"action-sheet\"` as `ion-action-sheet` does not allow for disabled buttons." + }, + "ion-select-option/value": { + "description": "The text value of the option." + }, + "ion-skeleton-text/animated": { + "description": "If `true`, the skeleton text will animate." + }, + "ion-slides/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-slides/options": { + "description": "Options to pass to the swiper instance.\nSee http://idangero.us/swiper/api/ for valid options" + }, + "ion-slides/pager": { + "description": "If `true`, show the pagination." + }, + "ion-slides/scrollbar": { + "description": "If `true`, show the scrollbar." + }, + "ion-spinner/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-spinner/duration": { + "description": "Duration of the spinner animation in milliseconds. The default varies based on the spinner." + }, + "ion-spinner/name": { + "description": "The name of the SVG spinner to use. If a name is not provided, the platform's default\nspinner will be used.", + "options": [ + "bubbles", + "circles", + "circular", + "crescent", + "dots", + "lines", + "lines-small" + ] + }, + "ion-spinner/paused": { + "description": "If `true`, the spinner's animation will be paused." + }, + "ion-split-pane/content-id": { + "description": "The content `id` of the split-pane's main content." + }, + "ion-split-pane/disabled": { + "description": "If `true`, the split pane will be hidden." + }, + "ion-split-pane/when": { + "description": "When the split-pane should be shown.\nCan be a CSS media query expression, or a shortcut expression.\nCan also be a boolean expression." + }, + "ion-tab/component": { + "description": "The component to display inside of the tab." + }, + "ion-tab/tab": { + "description": "A tab id must be provided for each `ion-tab`. It's used internally to reference\nthe selected tab or by the router to switch between them." + }, + "ion-tab-bar/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-tab-bar/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-tab-bar/selected-tab": { + "description": "The selected tab component" + }, + "ion-tab-bar/translucent": { + "description": "If `true`, the tab bar will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-tab-button/disabled": { + "description": "If `true`, the user cannot interact with the tab button." + }, + "ion-tab-button/download": { + "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." + }, + "ion-tab-button/href": { + "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." + }, + "ion-tab-button/layout": { + "description": "Set the layout of the text and icon in the tab bar.\nIt defaults to `'icon-top'`.", + "options": [ + "icon-bottom", + "icon-end", + "icon-hide", + "icon-start", + "icon-top", + "label-hide" + ] + }, + "ion-tab-button/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-tab-button/rel": { + "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." + }, + "ion-tab-button/selected": { + "description": "The selected tab component" + }, + "ion-tab-button/tab": { + "description": "A tab id must be provided for each `ion-tab`. It's used internally to reference\nthe selected tab or by the router to switch between them." + }, + "ion-tab-button/target": { + "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." + }, + "ion-text/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-text/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-textarea/auto-grow": { + "description": "If `true`, the element height will increase based on the value." + }, + "ion-textarea/autocapitalize": { + "description": "Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user." + }, + "ion-textarea/autofocus": { + "description": "This Boolean attribute lets you specify that a form control should have input focus when the page loads." + }, + "ion-textarea/clear-on-edit": { + "description": "If `true`, the value will be cleared after focus upon edit. Defaults to `true` when `type` is `\"password\"`, `false` for all other types." + }, + "ion-textarea/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-textarea/cols": { + "description": "The visible width of the text control, in average character widths. If it is specified, it must be a positive integer." + }, + "ion-textarea/debounce": { + "description": "Set the amount of time, in milliseconds, to wait to trigger the `ionChange` event after each keystroke." + }, + "ion-textarea/disabled": { + "description": "If `true`, the user cannot interact with the textarea." + }, + "ion-textarea/enterkeyhint": { + "description": "A hint to the browser for which enter key to display.\nPossible values: `\"enter\"`, `\"done\"`, `\"go\"`, `\"next\"`,\n`\"previous\"`, `\"search\"`, and `\"send\"`.", + "options": [ + "done", + "enter", + "go", + "next", + "previous", + "search", + "send" + ] + }, + "ion-textarea/inputmode": { + "description": "A hint to the browser for which keyboard to display.\nPossible values: `\"none\"`, `\"text\"`, `\"tel\"`, `\"url\"`,\n`\"email\"`, `\"numeric\"`, `\"decimal\"`, and `\"search\"`.", + "options": [ + "decimal", + "email", + "none", + "numeric", + "search", + "tel", + "text", + "url" + ] + }, + "ion-textarea/maxlength": { + "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the maximum number of characters that the user can enter." + }, + "ion-textarea/minlength": { + "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the minimum number of characters that the user can enter." + }, + "ion-textarea/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-textarea/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-textarea/placeholder": { + "description": "Instructional text that shows before the input has a value." + }, + "ion-textarea/readonly": { + "description": "If `true`, the user cannot modify the value." + }, + "ion-textarea/required": { + "description": "If `true`, the user must fill in a value before submitting a form." + }, + "ion-textarea/rows": { + "description": "The number of visible text lines for the control." + }, + "ion-textarea/spellcheck": { + "description": "If `true`, the element will have its spelling and grammar checked." + }, + "ion-textarea/value": { + "description": "The value of the textarea." + }, + "ion-textarea/wrap": { + "description": "Indicates how the control wraps text.", + "options": [ + "hard", + "off", + "soft" + ] + }, + "ion-title/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-title/size": { + "description": "The size of the toolbar title.", + "options": [ + "large", + "small" + ] + }, + "ion-toast/animated": { + "description": "If `true`, the toast will animate." + }, + "ion-toast/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-toast/css-class": { + "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." + }, + "ion-toast/duration": { + "description": "How many milliseconds to wait before hiding the toast. By default, it will show\nuntil `dismiss()` is called." + }, + "ion-toast/header": { + "description": "Header to be shown in the toast." + }, + "ion-toast/keyboard-close": { + "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." + }, + "ion-toast/message": { + "description": "Message to be shown in the toast." + }, + "ion-toast/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-toast/position": { + "description": "The position of the toast on the screen.", + "options": [ + "bottom", + "middle", + "top" + ] + }, + "ion-toast/translucent": { + "description": "If `true`, the toast will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." + }, + "ion-toggle/checked": { + "description": "If `true`, the toggle is selected." + }, + "ion-toggle/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-toggle/disabled": { + "description": "If `true`, the user cannot interact with the toggle." + }, + "ion-toggle/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-toggle/name": { + "description": "The name of the control, which is submitted with the form data." + }, + "ion-toggle/value": { + "description": "The value of the toggle does not mean if it's checked or not, use the `checked`\nproperty for that.\n\nThe value of a toggle is analogous to the value of a ``,\nit's only used when the toggle participates in a native ``." + }, + "ion-toolbar/color": { + "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." + }, + "ion-toolbar/mode": { + "description": "The mode determines which platform styles to use.", + "options": [ + "ios", + "md" + ] + }, + "ion-virtual-scroll/approx-footer-height": { + "description": "The approximate width of each footer template's cell.\nThis dimension is used to help determine how many cells should\nbe created when initialized, and to help calculate the height of\nthe scrollable area. This height value can only use `px` units.\nNote that the actual rendered size of each cell comes from the\napp's CSS, whereas this approximation is used to help calculate\ninitial dimensions before the item has been rendered." + }, + "ion-virtual-scroll/approx-header-height": { + "description": "The approximate height of each header template's cell.\nThis dimension is used to help determine how many cells should\nbe created when initialized, and to help calculate the height of\nthe scrollable area. This height value can only use `px` units.\nNote that the actual rendered size of each cell comes from the\napp's CSS, whereas this approximation is used to help calculate\ninitial dimensions before the item has been rendered." + }, + "ion-virtual-scroll/approx-item-height": { + "description": "It is important to provide this\nif virtual item height will be significantly larger than the default\nThe approximate height of each virtual item template's cell.\nThis dimension is used to help determine how many cells should\nbe created when initialized, and to help calculate the height of\nthe scrollable area. This height value can only use `px` units.\nNote that the actual rendered size of each cell comes from the\napp's CSS, whereas this approximation is used to help calculate\ninitial dimensions before the item has been rendered." + } +} \ No newline at end of file diff --git a/vetur/tags.json b/vetur/tags.json new file mode 100644 index 0000000..e98b23f --- /dev/null +++ b/vetur/tags.json @@ -0,0 +1,876 @@ +{ + "ion-page": { + "description": "`IonPage` is a specialized component that is meant to be the parent container for an Ionic Page, which typically consists of `IonHeader` and `IonContent` components.", + "attributes": [ + "willPresent" + ] + }, + "ion-action-sheet": { + "attributes": [ + "animated", + "backdrop-dismiss", + "css-class", + "header", + "keyboard-close", + "mode", + "sub-header", + "translucent" + ], + "description": "An Action Sheet is a dialog that displays a set of options. It appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. Destructive options are made obvious in `ios` mode. There are multiple ways to dismiss the action sheet, including tapping the backdrop or hitting the escape key on desktop." + }, + "ion-alert": { + "attributes": [ + "animated", + "backdrop-dismiss", + "css-class", + "header", + "keyboard-close", + "message", + "mode", + "sub-header", + "translucent" + ], + "description": "An Alert is a dialog that presents users with information or collects information from the user using inputs. An alert appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. It can also optionally have a `header`, `subHeader` and `message`." + }, + "ion-app": { + "attributes": [], + "description": "App is a container element for an Ionic application. There should only be one `` element per project. An app can have many Ionic components including menus, headers, content, and footers. The overlay components get appended to the `` when they are presented." + }, + "ion-avatar": { + "attributes": [], + "description": "Avatars are circular components that usually wrap an image or icon. They can be used to represent a person or an object.\n\nAvatars can be used by themselves or inside of any element. If placed inside of an `ion-chip` or `ion-item`, the avatar will resize to fit the parent component. To position an avatar on the left or right side of an item, set the slot to `start` or `end`, respectively." + }, + "ion-back-button": { + "attributes": [ + "color", + "default-href", + "disabled", + "icon", + "mode", + "text", + "type" + ], + "description": "The back button navigates back in the app's history upon click. It is smart enough to know what to render based on the mode and when to show based on the navigation stack.\n\nTo change what is displayed in the back button, use the `text` and `icon` properties." + }, + "ion-backdrop": { + "attributes": [ + "stop-propagation", + "tappable", + "visible" + ], + "description": "Backdrops are full screen components that overlay other components. They are useful behind components that transition in on top of other content and can be used to dismiss that component." + }, + "ion-badge": { + "attributes": [ + "color", + "mode" + ], + "description": "Badges are inline block elements that usually appear near another element. Typically they contain a number or other characters. They can be used as a notification that there are additional items associated with an element and indicate how many items there are." + }, + "ion-button": { + "attributes": [ + "button-type", + "color", + "disabled", + "download", + "expand", + "fill", + "href", + "mode", + "rel", + "router-direction", + "shape", + "size", + "strong", + "target", + "type", + "replace" + ], + "description": "Buttons provide a clickable element, which can be used in forms, or anywhere that needs simple, standard button functionality. They may display text, icons, or both. Buttons can be styled with several attributes to look a specific way." + }, + "ion-buttons": { + "attributes": [ + "collapse" + ], + "description": "The Buttons component is a container element. Buttons placed in a toolbar should be placed inside of the `` element.\n\nThe `` element can be positioned inside of the toolbar using a named slot. The below chart has a description of each slot.\n\n| Slot | Description |\n|--------------|----------------------------------------------------------------------------------------------------------|\n| `secondary` | Positions element to the `left` of the content in `ios` mode, and directly to the `right` in `md` mode. |\n| `primary` | Positions element to the `right` of the content in `ios` mode, and to the far `right` in `md` mode. |\n| `start` | Positions to the `left` of the content in LTR, and to the `right` in RTL. |\n| `end` | Positions to the `right` of the content in LTR, and to the `left` in RTL. |" + }, + "ion-card": { + "attributes": [ + "button", + "color", + "disabled", + "download", + "href", + "mode", + "rel", + "router-direction", + "target", + "type", + "replace" + ], + "description": "Cards are a standard piece of UI that serves as an entry point to more detailed\ninformation. A card can be a single component, but is often made up of some\nheader, title, subtitle, and content. `ion-card` is broken up into several\nsub-components to reflect this. Please see `ion-card-content`,\n`ion-card-header`, `ion-card-title`, `ion-card-subtitle`." + }, + "ion-card-content": { + "attributes": [ + "mode" + ], + "description": "`ion-card-content` is child component of `ion-card` that adds some content padding.\nIt is recommended that any text content for a card should be placed in an `ion-card-content`." + }, + "ion-card-header": { + "attributes": [ + "color", + "mode", + "translucent" + ], + "description": "`ion-card-header` is a header component for `ion-card`." + }, + "ion-card-subtitle": { + "attributes": [ + "color", + "mode" + ], + "description": "`ion-card-subtitle` is a child component of `ion-card`" + }, + "ion-card-title": { + "attributes": [ + "color", + "mode" + ], + "description": "`ion-card-title` is a child component of `ion-card`" + }, + "ion-checkbox": { + "attributes": [ + "checked", + "color", + "disabled", + "indeterminate", + "mode", + "name", + "value" + ], + "description": "Checkboxes allow the selection of multiple options from a set of options. They appear as checked (ticked) when activated. Clicking on a checkbox will toggle the `checked` property. They can also be checked programmatically by setting the `checked` property." + }, + "ion-chip": { + "attributes": [ + "color", + "mode", + "outline" + ], + "description": "Chips represent complex entities in small blocks, such as a contact. A chip can contain several different elements such as avatars, text, and icons." + }, + "ion-col": { + "attributes": [ + "offset", + "offset-lg", + "offset-md", + "offset-sm", + "offset-xl", + "offset-xs", + "pull", + "pull-lg", + "pull-md", + "pull-sm", + "pull-xl", + "pull-xs", + "push", + "push-lg", + "push-md", + "push-sm", + "push-xl", + "push-xs", + "size", + "size-lg", + "size-md", + "size-sm", + "size-xl", + "size-xs" + ], + "description": "Columns are cellular components of the [grid](../grid) system and go inside of a [row](../row).\nThey will expand to fill their row. All content within a grid should go inside of a column.\n\nSee [Grid Layout](/docs/layout/grid) for more information." + }, + "ion-content": { + "attributes": [ + "color", + "force-overscroll", + "fullscreen", + "scroll-events", + "scroll-x", + "scroll-y" + ], + "description": "The content component provides an easy to use content area with some useful methods\nto control the scrollable area. There should only be one content in a single\nview.\n\nContent, along with many other Ionic components, can be customized to modify its padding, margin, and more using the global styles provided in the [CSS Utilities](/docs/layout/css-utilities) or by individually styling it using CSS and the available [CSS Custom Properties](#css-custom-properties)." + }, + "ion-datetime": { + "attributes": [ + "cancel-text", + "day-names", + "day-short-names", + "day-values", + "disabled", + "display-format", + "display-timezone", + "done-text", + "hour-values", + "max", + "min", + "minute-values", + "mode", + "month-names", + "month-short-names", + "month-values", + "name", + "picker-format", + "placeholder", + "readonly", + "value", + "year-values" + ], + "description": "Datetimes present a picker interface from the bottom of a page, making it easy for\nusers to select dates and times. The picker displays scrollable columns that can be\nused to individually select years, months, days, hours and minute values. Datetimes\nare similar to the native `input` elements of type `datetime-local`, however, Ionic's\nDatetime component makes it easy to display the date and time in a preferred format,\nand manage the datetime values." + }, + "ion-fab": { + "attributes": [ + "activated", + "edge", + "horizontal", + "vertical" + ], + "description": "Fabs are container elements that contain one or more fab buttons. They should be placed in a fixed position that does not scroll with the content. Fab should have one main fab-button. Fabs can also contain fab-lists which contain related buttons that show when the main fab button is clicked. The same fab container can contain several [fab-list](../fab-list) elements with different side values." + }, + "ion-fab-button": { + "attributes": [ + "activated", + "close-icon", + "color", + "disabled", + "download", + "href", + "mode", + "rel", + "router-direction", + "show", + "size", + "target", + "translucent", + "type", + "replace" + ], + "description": "Floating Action Buttons (FABs) represent the primary action in an application. By default, they have a circular shape. When pressed, the button may open more related actions. As the name suggests, FABs generally float over the content in a fixed position. This is not achieved exclusively by using an `FAB`. They need to be wrapped with an `` component in order to be fixed over the content.\n\nIf the FAB button is not wrapped with ``, it will scroll with the content. FAB buttons have a default size, a mini size and can accept different colors:" + }, + "ion-fab-list": { + "attributes": [ + "activated", + "side" + ], + "description": "The `ion-fab-list` element is a container for multiple fab buttons. This collection of fab buttons contains actions related to the main fab button and is flung out on click. To specify what side the buttons should appear on, set the `side` property to 'start', 'end', 'top', 'bottom'" + }, + "ion-footer": { + "attributes": [ + "mode", + "translucent" + ], + "description": "Footer is a root component of a page that sits at the bottom of the page.\nFooter can be a wrapper for ion-toolbar to make sure the content area is sized correctly." + }, + "ion-grid": { + "attributes": [ + "fixed" + ], + "description": "The grid is a powerful mobile-first flexbox system for building custom layouts.\n\nIt is composed of three units — a grid, [row(s)](../row) and [column(s)](../col). Columns will expand to fill the row, and will resize to fit additional columns. It is based on a 12 column layout with different breakpoints based on the screen size. The number of columns can be customized using CSS.\n\nSee the [Responsive Grid documentation](/docs/layout/grid) for more information." + }, + "ion-header": { + "attributes": [ + "collapse", + "mode", + "translucent" + ], + "description": "Header is a parent component that holds the toolbar component.\nIt's important to note that ion-header needs to be the one of the three root elements of a page" + }, + "ion-img": { + "attributes": [ + "alt", + "src" + ], + "description": "Img is a tag that will lazily load an image when ever the tag is in the viewport. This is extremely useful when generating a large list as images are only loaded when they're visible. The component uses [Intersection Observer](https://caniuse.com/#feat=intersectionobserver) internally, which is supported in most modern browser, but falls back to a `setTimeout` when it is not supported." + }, + "ion-infinite-scroll": { + "attributes": [ + "disabled", + "position", + "threshold" + ], + "description": "The Infinite Scroll component calls an action to be performed when the user scrolls a specified distance from the bottom or top of the page.\n\nThe expression assigned to the `ionInfinite` event is called when the user reaches that defined distance. When this expression has finished any and all tasks, it should call the `complete()` method on the infinite scroll instance." + }, + "ion-infinite-scroll-content": { + "attributes": [ + "loading-spinner", + "loading-text" + ], + "description": "The `ion-infinite-scroll-content` component is the default child used by the `ion-infinite-scroll`. It displays an infinite scroll spinner that looks best based on the platform and changes the look depending on the infinite scroll's state. The default spinner can be changed and text can be added by setting the `loadingSpinner` and `loadingText` properties." + }, + "ion-input": { + "attributes": [ + "accept", + "autocapitalize", + "autocomplete", + "autocorrect", + "autofocus", + "clear-input", + "clear-on-edit", + "color", + "debounce", + "disabled", + "enterkeyhint", + "inputmode", + "max", + "maxlength", + "min", + "minlength", + "mode", + "multiple", + "name", + "pattern", + "placeholder", + "readonly", + "required", + "size", + "spellcheck", + "step", + "type", + "value" + ], + "description": "The input component is a wrapper to the HTML input element with custom styling and additional functionality. It accepts most of the same properties as the HTML input, but works great on desktop devices and integrates with the keyboard on mobile devices.\n\nIt is meant for text `type` inputs only, such as `\"text\"`, `\"password\"`, `\"email\"`, `\"number\"`, `\"search\"`, `\"tel\"`, and `\"url\"`. It supports all standard text input events including keyup, keydown, keypress, and more." + }, + "ion-item": { + "attributes": [ + "button", + "color", + "detail", + "detail-icon", + "disabled", + "download", + "href", + "lines", + "mode", + "rel", + "router-direction", + "target", + "type", + "replace" + ], + "description": "Items are elements that can contain text, icons, avatars, images, inputs, and any other native or custom elements. Generally they are placed in a list with other items. Items can be swiped, deleted, reordered, edited, and more." + }, + "ion-item-divider": { + "attributes": [ + "color", + "mode", + "sticky" + ], + "description": "Item Dividers are block elements that can be used to separate items in a list. They are similar to list headers, but instead of being placed at the top of a list, they should go in between groups of items." + }, + "ion-item-group": { + "attributes": [], + "description": "Item groups are containers that organize similar items together. They can contain item dividers to divide the items into multiple sections. They can also be used to group sliding items." + }, + "ion-item-option": { + "attributes": [ + "color", + "disabled", + "download", + "expandable", + "href", + "mode", + "rel", + "target", + "type", + "replace" + ], + "description": "The option button for an `ion-item-sliding`. Must be placed inside of an ``.\nYou can combine the `ionSwipe` event and the `expandable` directive to create a full swipe\naction for the item." + }, + "ion-item-options": { + "attributes": [ + "side" + ], + "description": "The option buttons for an `ion-item-sliding`. These buttons can be placed either on the [start or end side](#side-description).\nYou can combine the `ionSwipe` event plus the `expandable` directive to create a full swipe action for the item." + }, + "ion-item-sliding": { + "attributes": [ + "disabled" + ], + "description": "A sliding item contains an item that can be dragged to reveal buttons. It requires an [item](../item) component as a child. All options to reveal should be placed in the [item options](../item-options) element." + }, + "ion-label": { + "attributes": [ + "color", + "mode", + "position" + ], + "description": "Label is a wrapper element that can be used in combination with `ion-item`, `ion-input`, `ion-toggle`, and more. The position of the label inside of an item can be inline, fixed, stacked, or floating." + }, + "ion-list": { + "attributes": [ + "inset", + "lines", + "mode" + ], + "description": "Lists are made up of multiple rows of items which can contain text, buttons, toggles,\nicons, thumbnails, and much more. Lists generally contain items with similar data content, such as images and text.\n\nLists support several interactions including swiping items to reveal options, dragging to reorder items within the list, and deleting items." + }, + "ion-list-header": { + "attributes": [ + "color", + "lines", + "mode" + ], + "description": "ListHeader a header component for a list.\nUnlike ItemDivider, ListHeaders are styled to be stand-out from the rest of the list items." + }, + "ion-loading": { + "attributes": [ + "animated", + "backdrop-dismiss", + "css-class", + "duration", + "keyboard-close", + "message", + "mode", + "show-backdrop", + "spinner", + "translucent" + ], + "description": "An overlay that can be used to indicate activity while blocking user interaction. The loading indicator appears on top of the app's content, and can be dismissed by the app to resume user interaction with the app. It includes an optional backdrop, which can be disabled by setting `showBackdrop: false` upon creation." + }, + "ion-menu": { + "attributes": [ + "content-id", + "disabled", + "max-edge-start", + "menu-id", + "side", + "swipe-gesture", + "type" + ], + "description": "The Menu component is a navigation drawer that slides in from the side of the current view.\nBy default, it slides in from the left, but the side can be overridden.\nThe menu will be displayed differently based on the mode, however the display type can be changed to any of the available menu types.\nThe menu element should be a sibling to the root content element.\nThere can be any number of menus attached to the content.\nThese can be controlled from the templates, or programmatically using the MenuController." + }, + "ion-menu-button": { + "attributes": [ + "auto-hide", + "color", + "disabled", + "menu", + "mode", + "type" + ], + "description": "Menu Button is component that automatically creates the icon and functionality to open a menu on a page." + }, + "ion-menu-toggle": { + "attributes": [ + "auto-hide", + "menu" + ], + "description": "The MenuToggle component can be used to toggle a menu open or closed.\n\nBy default, it's only visible when the selected menu is active. A menu is active when it can be opened/closed. If the menu is disabled or it's being presented as a split-pane, the menu is marked as non-active and ion-menu-toggle hides itself.\n\nIn case it's desired to keep `ion-menu-toggle` always visible, the `autoHide` property can be set to `false`." + }, + "ion-modal": { + "attributes": [ + "animated", + "backdrop-dismiss", + "component", + "css-class", + "keyboard-close", + "mode", + "show-backdrop", + "swipe-to-close" + ], + "description": "A Modal is a dialog that appears on top of the app's content, and must be dismissed by the app before interaction can resume. It is useful as a select component when there are a lot of options to choose from, or when filtering items in a list, as well as many other use cases." + }, + "ion-nav": { + "attributes": [ + "animated", + "root", + "swipe-gesture" + ], + "description": "Nav is a standalone component for loading arbitrary components and pushing new components on to the stack.\n\nUnlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL." + }, + "ion-nav-link": { + "attributes": [ + "component", + "router-direction" + ], + "description": "A navigation link is used to navigate to a specified component. The component can be navigated to by going `forward`, `back` or as a `root` component.\n\nIt is the element form of calling the `push()`, `pop()`, and `setRoot()` methods on the navigation controller." + }, + "ion-note": { + "attributes": [ + "color", + "mode" + ], + "description": "Notes are text elements generally used as subtitles that provide more information. Notes are styled to appear grey by default. Notes can be used in an item as metadata text." + }, + "ion-picker": { + "attributes": [ + "animated", + "backdrop-dismiss", + "css-class", + "duration", + "keyboard-close", + "mode", + "show-backdrop" + ], + "description": "A Picker is a dialog that displays a row of buttons and columns underneath. It appears on top of the app's content, and at the bottom of the viewport." + }, + "ion-popover": { + "attributes": [ + "animated", + "backdrop-dismiss", + "component", + "css-class", + "event", + "keyboard-close", + "mode", + "show-backdrop", + "translucent" + ], + "description": "A Popover is a dialog that appears on top of the current page. It can be used for anything, but generally it is used for overflow actions that don't fit in the navigation bar." + }, + "ion-progress-bar": { + "attributes": [ + "buffer", + "color", + "mode", + "reversed", + "type", + "value" + ], + "description": "ion-progress-bar is a horizontal progress bar to visualize the progression of an operation and activity. You can choose between two types: `determinate` and `indeterminate`." + }, + "ion-radio": { + "attributes": [ + "color", + "disabled", + "mode", + "name", + "value" + ], + "description": "Radios should be used inside of an [`ion-radio-group`](../radio-group). Pressing on a radio will check it. They can also be checked programmatically by setting the value property of the parent `ion-radio-group` to the value of the radio.\n\nWhen radios are inside of a radio group, only one radio in the group will be checked at any time. Pressing a radio will check it and uncheck the previously selected radio, if there is one. If a radio is not in a group with another radio, then both radios will have the ability to be checked at the same time." + }, + "ion-radio-group": { + "attributes": [ + "allow-empty-selection", + "name", + "value" + ], + "description": "A radio group is a group of [radio buttons](../radio). It allows\na user to select at most one radio button from a set. Checking one radio\nbutton that belongs to a radio group unchecks any previous checked\nradio button within the same group." + }, + "ion-range": { + "attributes": [ + "color", + "debounce", + "disabled", + "dual-knobs", + "max", + "min", + "mode", + "name", + "pin", + "snaps", + "step", + "ticks", + "value" + ], + "description": "The Range slider lets users select from a range of values by moving\nthe slider knob. It can accept dual knobs, but by default one knob\ncontrols the value of the range." + }, + "ion-refresher": { + "attributes": [ + "close-duration", + "disabled", + "pull-factor", + "pull-max", + "pull-min", + "snapback-duration" + ], + "description": "The refresher provides pull-to-refresh functionality on a content component.\nThe pull-to-refresh pattern lets a user pull down on a list of data using touch\nin order to retrieve more data.\n\nData should be modified during the refresher's output events. Once the async\noperation has completed and the refreshing should end, call `complete()` on the\nrefresher." + }, + "ion-refresher-content": { + "attributes": [ + "pulling-icon", + "pulling-text", + "refreshing-spinner", + "refreshing-text" + ], + "description": "The refresher content contains the text, icon and spinner to display during a pull-to-refresh. Ionic provides the pulling icon and refreshing spinner based on the platform. However, the default icon, spinner, and text can be customized based on the state of the refresher." + }, + "ion-reorder": { + "attributes": [], + "description": "Reorder is a component that allows an item in a group of items to be dragged to change its order within that group. It must be used within an `ion-reorder-group` to provide a visual drag and drop interface.\n\n`ion-reorder` is the anchor used to drag and drop the items inside of the `ion-reorder-group`. See the [Reorder Group](../reorder-group) for more information on how to complete the reorder operation." + }, + "ion-reorder-group": { + "attributes": [ + "disabled" + ], + "description": "The reorder group is a wrapper component for items using the `ion-reorder` component. See the [Reorder documentation](../reorder/) for further information about the anchor component that is used to drag items within the `ion-reorder-group`.\n\nOnce the user drags an item and drops it in a new position, the `ionItemReorder` event is dispatched. A handler for it should be implemented that calls the `complete()` method.\n\nThe `detail` property of the `ionItemReorder` event includes all of the relevant information about the reorder operation, including the `from` and `to` indexes. In the context of reordering, an item moves `from` an index `to` a new index." + }, + "ion-ripple-effect": { + "attributes": [ + "type" + ], + "description": "The ripple effect component adds the [Material Design ink ripple interaction effect](https://material.io/develop/web/components/ripples/). This component can only be used inside of an `` and can be added to any component.\n\nIt's important to note that the parent should have [relative positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/position) because the ripple effect is absolutely positioned and will cover the closest parent with relative positioning. The parent element should also be given the `ion-activatable` class, which tells the ripple effect that the element is clickable.\n\nThe default type, `\"bounded\"`, will expand the ripple effect from the click position outwards. To add a ripple effect that always starts in the center of the element and expands in a circle, add an `\"unbounded\"` type. It's recommended to add `overflow: hidden` to the parent element to avoid the ripple overflowing its container, especially with an unbounded ripple." + }, + "ion-route": { + "attributes": [ + "component", + "url" + ], + "description": "The route component takes a component and renders it when the Browser URL matches the url property.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](../router-outlet) and the Angular router." + }, + "ion-route-redirect": { + "attributes": [ + "from", + "to" + ], + "description": "A route redirect can only be used with an `ion-router` as a direct child of it.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](../router-outlet) and the Angular router.\n\nThe route redirect has two configurable properties:\n - `from`\n - `to`\n\nIt redirects \"from\" a URL \"to\" another URL. When the defined `ion-route-redirect` rule matches, the router will redirect from the path specified in the `from` property to the path in the `to` property. In order for a redirect to occur the `from` path needs to be an exact match to the navigated URL." + }, + "ion-router": { + "attributes": [ + "root", + "use-hash" + ], + "description": "The router is a component for handling routing inside vanilla and Stencil JavaScript projects.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](../router-outlet) and the Angular router.\n\nApps should have a single `ion-router` component in the codebase.\nThis component controls all interactions with the browser history and it aggregates updates through an event system.\n\n`ion-router` is just a URL coordinator for the navigation outlets of ionic: `ion-nav` and `ion-tabs`.\n\nThat means the `ion-router` never touches the DOM, it does NOT show the components or emit any kind of lifecycle events, it just tells `ion-nav` and `ion-tabs` what and when to \"show\" based on the browser's URL.\n\nIn order to configure this relationship between components (to load/select) and URLs, `ion-router` uses a declarative syntax using JSX/HTML to define a tree of routes." + }, + "ion-router-link": { + "attributes": [ + "color", + "href", + "rel", + "router-direction", + "target", + "replace" + ], + "description": "The router link component is used for navigating to a specified link. Similar to the browser's anchor tag, it can accept a href for the location, and a direction for the transition animation.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use an `` and `routerLink` with the Angular router." + }, + "ion-router-outlet": { + "attributes": [ + "animated", + "mode" + ], + "description": "Router outlet is a component used in routing within an Angular app. It behaves in a similar way to Angular's built-in router outlet component, but contains the logic for providing a stacked navigation, and animating views in and out.\n\n> Note: this component should only be used with Angular projects. For vanilla or Stencil JavaScript projects, use [`ion-router`](../router) and [`ion-route`](../route).\n\nAlthough router outlet has methods for navigating around, it's recommended to use the navigation methods in Angular's router." + }, + "ion-row": { + "attributes": [], + "description": "Rows are horizontal components of the [grid](../grid) system and contain varying numbers of\n[columns](../col). They ensure the columns are positioned properly.\n\nSee [Grid Layout](/docs/layout/grid) for more information." + }, + "ion-searchbar": { + "attributes": [ + "animated", + "autocomplete", + "autocorrect", + "cancel-button-icon", + "cancel-button-text", + "clear-icon", + "color", + "debounce", + "disabled", + "enterkeyhint", + "inputmode", + "mode", + "placeholder", + "search-icon", + "show-cancel-button", + "spellcheck", + "type", + "value" + ], + "description": "Searchbars represent a text field that can be used to search through a collection. They can be displayed inside of a toolbar or the main content.\n\nA Searchbar should be used instead of an input to search lists. A clear button is displayed upon entering input in the searchbar's text field. Clicking on the clear button will erase the text field and the input will remain focused. A cancel button can be enabled which will clear the input and lose the focus upon click." + }, + "ion-segment": { + "attributes": [ + "color", + "disabled", + "mode", + "scrollable", + "value" + ], + "description": "Segments display a group of related buttons, sometimes known as segmented controls, in a horizontal row. They can be displayed inside of a toolbar or the main content.\n\nTheir functionality is similar to tabs, where selecting one will deselect all others. Segments are useful for toggling between different views inside of the content. Tabs should be used instead of a segment when clicking on a control should navigate between pages." + }, + "ion-segment-button": { + "attributes": [ + "disabled", + "layout", + "mode", + "type", + "value" + ], + "description": "Segment buttons are groups of related buttons inside of a [Segment](../segment). They are displayed in a horizontal row. A segment button can be checked by default by adding the `checked` attribute or by setting the `value` of the segment to the `value` of the segment button. Only one segment button should be selected at a time." + }, + "ion-select": { + "attributes": [ + "cancel-text", + "compare-with", + "disabled", + "interface", + "interface-options", + "mode", + "multiple", + "name", + "ok-text", + "placeholder", + "selected-text", + "value" + ], + "description": "Selects are form controls to select an option, or options, from a set of options, similar to a native ``,\nit's only used when the toggle participates in a native ``." - }, - "ion-chip/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-chip/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-chip/outline": { - "description": "Display an outline style button." - }, - "ion-col/offset": { - "description": "The amount to offset the column, in terms of how many columns it should shift to the end\nof the total available." - }, - "ion-col/offset-lg": { - "description": "The amount to offset the column for lg screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/offset-md": { - "description": "The amount to offset the column for md screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/offset-sm": { - "description": "The amount to offset the column for sm screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/offset-xl": { - "description": "The amount to offset the column for xl screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/offset-xs": { - "description": "The amount to offset the column for xs screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/pull": { - "description": "The amount to pull the column, in terms of how many columns it should shift to the start of\nthe total available." - }, - "ion-col/pull-lg": { - "description": "The amount to pull the column for lg screens, in terms of how many columns it should shift\nto the start of the total available." - }, - "ion-col/pull-md": { - "description": "The amount to pull the column for md screens, in terms of how many columns it should shift\nto the start of the total available." - }, - "ion-col/pull-sm": { - "description": "The amount to pull the column for sm screens, in terms of how many columns it should shift\nto the start of the total available." - }, - "ion-col/pull-xl": { - "description": "The amount to pull the column for xl screens, in terms of how many columns it should shift\nto the start of the total available." - }, - "ion-col/pull-xs": { - "description": "The amount to pull the column for xs screens, in terms of how many columns it should shift\nto the start of the total available." - }, - "ion-col/push": { - "description": "The amount to push the column, in terms of how many columns it should shift to the end\nof the total available." - }, - "ion-col/push-lg": { - "description": "The amount to push the column for lg screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/push-md": { - "description": "The amount to push the column for md screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/push-sm": { - "description": "The amount to push the column for sm screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/push-xl": { - "description": "The amount to push the column for xl screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/push-xs": { - "description": "The amount to push the column for xs screens, in terms of how many columns it should shift\nto the end of the total available." - }, - "ion-col/size": { - "description": "The size of the column, in terms of how many columns it should take up out of the total\navailable. If `\"auto\"` is passed, the column will be the size of its content." - }, - "ion-col/size-lg": { - "description": "The size of the column for lg screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." - }, - "ion-col/size-md": { - "description": "The size of the column for md screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." - }, - "ion-col/size-sm": { - "description": "The size of the column for sm screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." - }, - "ion-col/size-xl": { - "description": "The size of the column for xl screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." - }, - "ion-col/size-xs": { - "description": "The size of the column for xs screens, in terms of how many columns it should take up out\nof the total available. If `\"auto\"` is passed, the column will be the size of its content." - }, - "ion-content/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-content/force-overscroll": { - "description": "If `true` and the content does not cause an overflow scroll, the scroll interaction will cause a bounce.\nIf the content exceeds the bounds of ionContent, nothing will change.\nNote, the does not disable the system bounce on iOS. That is an OS level setting." - }, - "ion-content/fullscreen": { - "description": "If `true`, the content will scroll behind the headers\nand footers. This effect can easily be seen by setting the toolbar\nto transparent." - }, - "ion-content/scroll-events": { - "description": "Because of performance reasons, ionScroll events are disabled by default, in order to enable them\nand start listening from (ionScroll), set this property to `true`." - }, - "ion-content/scroll-x": { - "description": "If you want to enable the content scrolling in the X axis, set this property to `true`." - }, - "ion-content/scroll-y": { - "description": "If you want to disable the content scrolling in the Y axis, set this property to `false`." - }, - "ion-datetime/cancel-text": { - "description": "The text to display on the picker's cancel button." - }, - "ion-datetime/day-names": { - "description": "Full day of the week names. This can be used to provide\nlocale names for each day in the week. Defaults to English." - }, - "ion-datetime/day-short-names": { - "description": "Short abbreviated day of the week names. This can be used to provide\nlocale names for each day in the week. Defaults to English.\nDefaults to: `['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']`" - }, - "ion-datetime/day-values": { - "description": "Values used to create the list of selectable days. By default\nevery day is shown for the given month. However, to control exactly which days of\nthe month to display, the `dayValues` input can take a number, an array of numbers, or\na string of comma separated numbers. Note that even if the array days have an invalid\nnumber for the selected month, like `31` in February, it will correctly not show\ndays which are not valid for the selected month." - }, - "ion-datetime/disabled": { - "description": "If `true`, the user cannot interact with the datetime." - }, - "ion-datetime/display-format": { - "description": "The display format of the date and time as text that shows\nwithin the item. When the `pickerFormat` input is not used, then the\n`displayFormat` is used for both display the formatted text, and determining\nthe datetime picker's columns. See the `pickerFormat` input description for\nmore info. Defaults to `MMM D, YYYY`." - }, - "ion-datetime/display-timezone": { - "description": "The timezone to use for display purposes only. See\n[Date.prototype.toLocaleString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString)\nfor a list of supported timezones. If no value is provided, the\ncomponent will default to displaying times in the user's local timezone." - }, - "ion-datetime/done-text": { - "description": "The text to display on the picker's \"Done\" button." - }, - "ion-datetime/hour-values": { - "description": "Values used to create the list of selectable hours. By default\nthe hour values range from `0` to `23` for 24-hour, or `1` to `12` for 12-hour. However,\nto control exactly which hours to display, the `hourValues` input can take a number, an\narray of numbers, or a string of comma separated numbers." - }, - "ion-datetime/max": { - "description": "The maximum datetime allowed. Value must be a date string\nfollowing the\n[ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),\n`1996-12-19`. The format does not have to be specific to an exact\ndatetime. For example, the maximum could just be the year, such as `1994`.\nDefaults to the end of this year." - }, - "ion-datetime/min": { - "description": "The minimum datetime allowed. Value must be a date string\nfollowing the\n[ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),\nsuch as `1996-12-19`. The format does not have to be specific to an exact\ndatetime. For example, the minimum could just be the year, such as `1994`.\nDefaults to the beginning of the year, 100 years ago from today." - }, - "ion-datetime/minute-values": { - "description": "Values used to create the list of selectable minutes. By default\nthe minutes range from `0` to `59`. However, to control exactly which minutes to display,\nthe `minuteValues` input can take a number, an array of numbers, or a string of comma\nseparated numbers. For example, if the minute selections should only be every 15 minutes,\nthen this input value would be `minuteValues=\"0,15,30,45\"`." - }, - "ion-datetime/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-datetime/month-names": { - "description": "Full names for each month name. This can be used to provide\nlocale month names. Defaults to English." - }, - "ion-datetime/month-short-names": { - "description": "Short abbreviated names for each month name. This can be used to provide\nlocale month names. Defaults to English." - }, - "ion-datetime/month-values": { - "description": "Values used to create the list of selectable months. By default\nthe month values range from `1` to `12`. However, to control exactly which months to\ndisplay, the `monthValues` input can take a number, an array of numbers, or a string of\ncomma separated numbers. For example, if only summer months should be shown, then this\ninput value would be `monthValues=\"6,7,8\"`. Note that month numbers do *not* have a\nzero-based index, meaning January's value is `1`, and December's is `12`." - }, - "ion-datetime/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-datetime/picker-format": { - "description": "The format of the date and time picker columns the user selects.\nA datetime input can have one or many datetime parts, each getting their\nown column which allow individual selection of that particular datetime part. For\nexample, year and month columns are two individually selectable columns which help\nchoose an exact date from the datetime picker. Each column follows the string\nparse format. Defaults to use `displayFormat`." - }, - "ion-datetime/placeholder": { - "description": "The text to display when there's no date selected yet.\nUsing lowercase to match the input attribute" - }, - "ion-datetime/readonly": { - "description": "If `true`, the datetime appears normal but is not interactive." - }, - "ion-datetime/value": { - "description": "The value of the datetime as a valid ISO 8601 datetime string." - }, - "ion-datetime/year-values": { - "description": "Values used to create the list of selectable years. By default\nthe year values range between the `min` and `max` datetime inputs. However, to\ncontrol exactly which years to display, the `yearValues` input can take a number, an array\nof numbers, or string of comma separated numbers. For example, to show upcoming and\nrecent leap years, then this input's value would be `yearValues=\"2024,2020,2016,2012,2008\"`." - }, - "ion-fab/activated": { - "description": "If `true`, both the `ion-fab-button` and all `ion-fab-list` inside `ion-fab` will become active.\nThat means `ion-fab-button` will become a `close` icon and `ion-fab-list` will become visible." - }, - "ion-fab/edge": { - "description": "If `true`, the fab will display on the edge of the header if\n`vertical` is `\"top\"`, and on the edge of the footer if\nit is `\"bottom\"`. Should be used with a `fixed` slot." - }, - "ion-fab/horizontal": { - "description": "Where to align the fab horizontally in the viewport.", - "options": [ - "center", - "end", - "start" - ] - }, - "ion-fab/vertical": { - "description": "Where to align the fab vertically in the viewport.", - "options": [ - "bottom", - "center", - "top" - ] - }, - "ion-fab-button/activated": { - "description": "If `true`, the fab button will be show a close icon." - }, - "ion-fab-button/close-icon": { - "description": "The icon name to use for the close icon. This will appear when the fab button\nis pressed. Only applies if it is the main button inside of a fab containing a\nfab list." - }, - "ion-fab-button/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-fab-button/disabled": { - "description": "If `true`, the user cannot interact with the fab button." - }, - "ion-fab-button/download": { - "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." - }, - "ion-fab-button/href": { - "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." - }, - "ion-fab-button/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-fab-button/rel": { - "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." - }, - "ion-fab-button/router-direction": { - "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", - "options": [ - "back", - "forward", - "root" - ] - }, - "ion-fab-button/show": { - "description": "If `true`, the fab button will show when in a fab-list." - }, - "ion-fab-button/size": { - "description": "The size of the button. Set this to `small` in order to have a mini fab button.", - "options": [ - "small" - ] - }, - "ion-fab-button/target": { - "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." - }, - "ion-fab-button/translucent": { - "description": "If `true`, the fab button will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." - }, - "ion-fab-button/type": { - "description": "The type of the button.", - "options": [ - "button", - "reset", - "submit" - ] - }, - "ion-fab-list/activated": { - "description": "If `true`, the fab list will show all fab buttons in the list." - }, - "ion-fab-list/side": { - "description": "The side the fab list will show on relative to the main fab button.", - "options": [ - "bottom", - "end", - "start", - "top" - ] - }, - "ion-footer/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-footer/translucent": { - "description": "If `true`, the footer will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility).\n\nNote: In order to scroll content behind the footer, the `fullscreen`\nattribute needs to be set on the content." - }, - "ion-grid/fixed": { - "description": "If `true`, the grid will have a fixed width based on the screen size." - }, - "ion-header/collapse": { - "description": "Describes the scroll effect that will be applied to the header\n`condense` only applies in iOS mode.\n\nTypically used for [Collapsible Large Titles](https://ionicframework.com/docs/api/title#collapsible-large-titles)", - "options": [ - "condense" - ] - }, - "ion-header/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-header/translucent": { - "description": "If `true`, the header will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility).\n\nNote: In order to scroll content behind the header, the `fullscreen`\nattribute needs to be set on the content." - }, - "ion-img/alt": { - "description": "This attribute defines the alternative text describing the image.\nUsers will see this text displayed if the image URL is wrong,\nthe image is not in one of the supported formats, or if the image is not yet downloaded." - }, - "ion-img/src": { - "description": "The image URL. This attribute is mandatory for the `` element." - }, - "ion-infinite-scroll/disabled": { - "description": "If `true`, the infinite scroll will be hidden and scroll event listeners\nwill be removed.\n\nSet this to true to disable the infinite scroll from actively\ntrying to receive new data while scrolling. This is useful\nwhen it is known that there is no more data that can be added, and\nthe infinite scroll is no longer needed." - }, - "ion-infinite-scroll/position": { - "description": "The position of the infinite scroll element.\nThe value can be either `top` or `bottom`.", - "options": [ - "bottom", - "top" - ] - }, - "ion-infinite-scroll/threshold": { - "description": "The threshold distance from the bottom\nof the content to call the `infinite` output event when scrolled.\nThe threshold value can be either a percent, or\nin pixels. For example, use the value of `10%` for the `infinite`\noutput event to get called when the user has scrolled 10%\nfrom the bottom of the page. Use the value `100px` when the\nscroll is within 100 pixels from the bottom of the page." - }, - "ion-infinite-scroll-content/loading-spinner": { - "description": "An animated SVG spinner that shows while loading.", - "options": [ - "bubbles", - "circles", - "circular", - "crescent", - "dots", - "lines", - "lines-small" - ] - }, - "ion-infinite-scroll-content/loading-text": { - "description": "Optional text to display while loading.\n`loadingText` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" - }, - "ion-input/accept": { - "description": "If the value of the type attribute is `\"file\"`, then this attribute will indicate the types of files that the server accepts, otherwise it will be ignored. The value must be a comma-separated list of unique content type specifiers." - }, - "ion-input/autocapitalize": { - "description": "Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user." - }, - "ion-input/autocomplete": { - "description": "Indicates whether the value of the control can be automatically completed by the browser.", - "options": [ - "on", - "off", - "name", - "honorific-prefix", - "given-name", - "additional-name", - "family-name", - "honorific-suffix", - "nickname", - "email", - "username", - "new-password", - "current-password", - "one-time-code", - "organization-title", - "organization", - "street-address", - "address-line1", - "address-line2", - "address-line3", - "address-level4", - "address-level3", - "address-level2", - "address-level1", - "country", - "country-name", - "postal-code", - "cc-name", - "cc-given-name", - "cc-additional-name", - "cc-family-name", - "cc-number", - "cc-exp", - "cc-exp-month", - "cc-exp-year", - "cc-csc", - "cc-type", - "transaction-currency", - "transaction-amount", - "language", - "bday", - "bday-day", - "bday-month", - "bday-year", - "sex", - "tel", - "tel-country-code", - "tel-national", - "tel-area-code", - "tel-local", - "tel-extension", - "impp", - "url", - "photo" - ] - }, - "ion-input/autocorrect": { - "description": "Whether auto correction should be enabled when the user is entering/editing the text value.", - "options": [ - "off", - "on" - ] - }, - "ion-input/autofocus": { - "description": "This Boolean attribute lets you specify that a form control should have input focus when the page loads." - }, - "ion-input/clear-input": { - "description": "If `true`, a clear icon will appear in the input when there is a value. Clicking it clears the input." - }, - "ion-input/clear-on-edit": { - "description": "If `true`, the value will be cleared after focus upon edit. Defaults to `true` when `type` is `\"password\"`, `false` for all other types." - }, - "ion-input/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-input/debounce": { - "description": "Set the amount of time, in milliseconds, to wait to trigger the `ionChange` event after each keystroke." - }, - "ion-input/disabled": { - "description": "If `true`, the user cannot interact with the input." - }, - "ion-input/enterkeyhint": { - "description": "A hint to the browser for which enter key to display.\nPossible values: `\"enter\"`, `\"done\"`, `\"go\"`, `\"next\"`,\n`\"previous\"`, `\"search\"`, and `\"send\"`.", - "options": [ - "done", - "enter", - "go", - "next", - "previous", - "search", - "send" - ] - }, - "ion-input/inputmode": { - "description": "A hint to the browser for which keyboard to display.\nPossible values: `\"none\"`, `\"text\"`, `\"tel\"`, `\"url\"`,\n`\"email\"`, `\"numeric\"`, `\"decimal\"`, and `\"search\"`.", - "options": [ - "decimal", - "email", - "none", - "numeric", - "search", - "tel", - "text", - "url" - ] - }, - "ion-input/max": { - "description": "The maximum value, which must not be less than its minimum (min attribute) value." - }, - "ion-input/maxlength": { - "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the maximum number of characters that the user can enter." - }, - "ion-input/min": { - "description": "The minimum value, which must not be greater than its maximum (max attribute) value." - }, - "ion-input/minlength": { - "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the minimum number of characters that the user can enter." - }, - "ion-input/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-input/multiple": { - "description": "If `true`, the user can enter more than one value. This attribute applies when the type attribute is set to `\"email\"` or `\"file\"`, otherwise it is ignored." - }, - "ion-input/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-input/pattern": { - "description": "A regular expression that the value is checked against. The pattern must match the entire value, not just some subset. Use the title attribute to describe the pattern to help the user. This attribute applies when the value of the type attribute is `\"text\"`, `\"search\"`, `\"tel\"`, `\"url\"`, `\"email\"`, `\"date\"`, or `\"password\"`, otherwise it is ignored. When the type attribute is `\"date\"`, `pattern` will only be used in browsers that do not support the `\"date\"` input type natively. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date for more information." - }, - "ion-input/placeholder": { - "description": "Instructional text that shows before the input has a value." - }, - "ion-input/readonly": { - "description": "If `true`, the user cannot modify the value." - }, - "ion-input/required": { - "description": "If `true`, the user must fill in a value before submitting a form." - }, - "ion-input/size": { - "description": "The initial size of the control. This value is in pixels unless the value of the type attribute is `\"text\"` or `\"password\"`, in which case it is an integer number of characters. This attribute applies only when the `type` attribute is set to `\"text\"`, `\"search\"`, `\"tel\"`, `\"url\"`, `\"email\"`, or `\"password\"`, otherwise it is ignored." - }, - "ion-input/spellcheck": { - "description": "If `true`, the element will have its spelling and grammar checked." - }, - "ion-input/step": { - "description": "Works with the min and max attributes to limit the increments at which a value can be set.\nPossible values are: `\"any\"` or a positive floating point number." - }, - "ion-input/type": { - "description": "The type of control to display. The default type is text.", - "options": [ - "date", - "datetime-local", - "email", - "month", - "number", - "password", - "search", - "tel", - "text", - "time", - "url", - "week" - ] - }, - "ion-input/value": { - "description": "The value of the input." - }, - "ion-item/button": { - "description": "If `true`, a button tag will be rendered and the item will be tappable." - }, - "ion-item/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-item/detail": { - "description": "If `true`, a detail arrow will appear on the item. Defaults to `false` unless the `mode`\nis `ios` and an `href` or `button` property is present." - }, - "ion-item/detail-icon": { - "description": "The icon to use when `detail` is set to `true`." - }, - "ion-item/disabled": { - "description": "If `true`, the user cannot interact with the item." - }, - "ion-item/download": { - "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." - }, - "ion-item/href": { - "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." - }, - "ion-item/lines": { - "description": "How the bottom border should be displayed on the item.", - "options": [ - "full", - "inset", - "none" - ] - }, - "ion-item/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-item/rel": { - "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." - }, - "ion-item/router-direction": { - "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", - "options": [ - "back", - "forward", - "root" - ] - }, - "ion-item/target": { - "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." - }, - "ion-item/type": { - "description": "The type of the button. Only used when an `onclick` or `button` property is present.", - "options": [ - "button", - "reset", - "submit" - ] - }, - "ion-item-divider/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-item-divider/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-item-divider/sticky": { - "description": "When it's set to `true`, the item-divider will stay visible when it reaches the top\nof the viewport until the next `ion-item-divider` replaces it.\n\nThis feature relies in `position:sticky`:\nhttps://caniuse.com/#feat=css-sticky" - }, - "ion-item-option/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-item-option/disabled": { - "description": "If `true`, the user cannot interact with the item option." - }, - "ion-item-option/download": { - "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." - }, - "ion-item-option/expandable": { - "description": "If `true`, the option will expand to take up the available width and cover any other options." - }, - "ion-item-option/href": { - "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." - }, - "ion-item-option/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-item-option/rel": { - "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." - }, - "ion-item-option/target": { - "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." - }, - "ion-item-option/type": { - "description": "The type of the button.", - "options": [ - "button", - "reset", - "submit" - ] - }, - "ion-item-options/side": { - "description": "The side the option button should be on. Possible values: `\"start\"` and `\"end\"`. If you have multiple `ion-item-options`, a side must be provided for each.", - "options": [ - "end", - "start" - ] - }, - "ion-item-sliding/disabled": { - "description": "If `true`, the user cannot interact with the sliding item." - }, - "ion-label/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-label/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-label/position": { - "description": "The position determines where and how the label behaves inside an item.", - "options": [ - "fixed", - "floating", - "stacked" - ] - }, - "ion-list/inset": { - "description": "If `true`, the list will have margin around it and rounded corners." - }, - "ion-list/lines": { - "description": "How the bottom border should be displayed on all items.", - "options": [ - "full", - "inset", - "none" - ] - }, - "ion-list/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-list-header/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-list-header/lines": { - "description": "How the bottom border should be displayed on the list header.", - "options": [ - "full", - "inset", - "none" - ] - }, - "ion-list-header/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-loading/animated": { - "description": "If `true`, the loading indicator will animate." - }, - "ion-loading/backdrop-dismiss": { - "description": "If `true`, the loading indicator will be dismissed when the backdrop is clicked." - }, - "ion-loading/css-class": { - "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." - }, - "ion-loading/duration": { - "description": "Number of milliseconds to wait before dismissing the loading indicator." - }, - "ion-loading/keyboard-close": { - "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." - }, - "ion-loading/message": { - "description": "Optional text content to display in the loading indicator." - }, - "ion-loading/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-loading/show-backdrop": { - "description": "If `true`, a backdrop will be displayed behind the loading indicator." - }, - "ion-loading/spinner": { - "description": "The name of the spinner to display.", - "options": [ - "bubbles", - "circles", - "circular", - "crescent", - "dots", - "lines", - "lines-small" - ] - }, - "ion-loading/translucent": { - "description": "If `true`, the loading indicator will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." - }, - "ion-menu/content-id": { - "description": "The content's id the menu should use." - }, - "ion-menu/disabled": { - "description": "If `true`, the menu is disabled." - }, - "ion-menu/max-edge-start": { - "description": "The edge threshold for dragging the menu open.\nIf a drag/swipe happens over this value, the menu is not triggered." - }, - "ion-menu/menu-id": { - "description": "An id for the menu." - }, - "ion-menu/side": { - "description": "Which side of the view the menu should be placed.", - "options": [ - "end", - "start" - ] - }, - "ion-menu/swipe-gesture": { - "description": "If `true`, swiping the menu is enabled." - }, - "ion-menu/type": { - "description": "The display type of the menu.\nAvailable options: `\"overlay\"`, `\"reveal\"`, `\"push\"`." - }, - "ion-menu-button/auto-hide": { - "description": "Automatically hides the menu button when the corresponding menu is not active" - }, - "ion-menu-button/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-menu-button/disabled": { - "description": "If `true`, the user cannot interact with the menu button." - }, - "ion-menu-button/menu": { - "description": "Optional property that maps to a Menu's `menuId` prop. Can also be `start` or `end` for the menu side. This is used to find the correct menu to toggle" - }, - "ion-menu-button/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-menu-button/type": { - "description": "The type of the button.", - "options": [ - "button", - "reset", - "submit" - ] - }, - "ion-menu-toggle/auto-hide": { - "description": "Automatically hides the content when the corresponding menu is not active.\n\nBy default, it's `true`. Change it to `false` in order to\nkeep `ion-menu-toggle` always visible regardless the state of the menu." - }, - "ion-menu-toggle/menu": { - "description": "Optional property that maps to a Menu's `menuId` prop.\nCan also be `start` or `end` for the menu side.\nThis is used to find the correct menu to toggle.\n\nIf this property is not used, `ion-menu-toggle` will toggle the\nfirst menu that is active." - }, - "ion-modal/animated": { - "description": "If `true`, the modal will animate." - }, - "ion-modal/backdrop-dismiss": { - "description": "If `true`, the modal will be dismissed when the backdrop is clicked." - }, - "ion-modal/component": { - "description": "The component to display inside of the modal." - }, - "ion-modal/css-class": { - "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." - }, - "ion-modal/keyboard-close": { - "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." - }, - "ion-modal/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-modal/show-backdrop": { - "description": "If `true`, a backdrop will be displayed behind the modal." - }, - "ion-modal/swipe-to-close": { - "description": "If `true`, the modal can be swiped to dismiss. Only applies in iOS mode." - }, - "ion-nav/animated": { - "description": "If `true`, the nav should animate the transition of components." - }, - "ion-nav/root": { - "description": "Root NavComponent to load" - }, - "ion-nav/swipe-gesture": { - "description": "If the nav component should allow for swipe-to-go-back." - }, - "ion-nav-link/component": { - "description": "Component to navigate to. Only used if the `routerDirection` is `\"forward\"` or `\"root\"`." - }, - "ion-nav-link/router-direction": { - "description": "The transition direction when navigating to another page.", - "options": [ - "back", - "forward", - "root" - ] - }, - "ion-note/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-note/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-picker/animated": { - "description": "If `true`, the picker will animate." - }, - "ion-picker/backdrop-dismiss": { - "description": "If `true`, the picker will be dismissed when the backdrop is clicked." - }, - "ion-picker/css-class": { - "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." - }, - "ion-picker/duration": { - "description": "Number of milliseconds to wait before dismissing the picker." - }, - "ion-picker/keyboard-close": { - "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." - }, - "ion-picker/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-picker/show-backdrop": { - "description": "If `true`, a backdrop will be displayed behind the picker." - }, - "ion-popover/animated": { - "description": "If `true`, the popover will animate." - }, - "ion-popover/backdrop-dismiss": { - "description": "If `true`, the popover will be dismissed when the backdrop is clicked." - }, - "ion-popover/component": { - "description": "The component to display inside of the popover." - }, - "ion-popover/css-class": { - "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." - }, - "ion-popover/event": { - "description": "The event to pass to the popover animation." - }, - "ion-popover/keyboard-close": { - "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." - }, - "ion-popover/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-popover/show-backdrop": { - "description": "If `true`, a backdrop will be displayed behind the popover." - }, - "ion-popover/translucent": { - "description": "If `true`, the popover will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." - }, - "ion-progress-bar/buffer": { - "description": "If the buffer and value are smaller than 1, the buffer circles will show.\nThe buffer should be between [0, 1]." - }, - "ion-progress-bar/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-progress-bar/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-progress-bar/reversed": { - "description": "If true, reverse the progress bar direction." - }, - "ion-progress-bar/type": { - "description": "The state of the progress bar, based on if the time the process takes is known or not.\nDefault options are: `\"determinate\"` (no animation), `\"indeterminate\"` (animate from left to right).", - "options": [ - "determinate", - "indeterminate" - ] - }, - "ion-progress-bar/value": { - "description": "The value determines how much of the active bar should display when the\n`type` is `\"determinate\"`.\nThe value should be between [0, 1]." - }, - "ion-radio/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-radio/disabled": { - "description": "If `true`, the user cannot interact with the radio." - }, - "ion-radio/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-radio/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-radio/value": { - "description": "the value of the radio." - }, - "ion-radio-group/allow-empty-selection": { - "description": "If `true`, the radios can be deselected." - }, - "ion-radio-group/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-radio-group/value": { - "description": "the value of the radio group." - }, - "ion-range/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-range/debounce": { - "description": "How long, in milliseconds, to wait to trigger the\n`ionChange` event after each change in the range value." - }, - "ion-range/disabled": { - "description": "If `true`, the user cannot interact with the range." - }, - "ion-range/dual-knobs": { - "description": "Show two knobs." - }, - "ion-range/max": { - "description": "Maximum integer value of the range." - }, - "ion-range/min": { - "description": "Minimum integer value of the range." - }, - "ion-range/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-range/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-range/pin": { - "description": "If `true`, a pin with integer value is shown when the knob\nis pressed." - }, - "ion-range/snaps": { - "description": "If `true`, the knob snaps to tick marks evenly spaced based\non the step property value." - }, - "ion-range/step": { - "description": "Specifies the value granularity." - }, - "ion-range/ticks": { - "description": "If `true`, tick marks are displayed based on the step value.\nOnly applies when `snaps` is `true`." - }, - "ion-range/value": { - "description": "the value of the range." - }, - "ion-refresher/close-duration": { - "description": "Time it takes to close the refresher.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." - }, - "ion-refresher/disabled": { - "description": "If `true`, the refresher will be hidden." - }, - "ion-refresher/pull-factor": { - "description": "How much to multiply the pull speed by. To slow the pull animation down,\npass a number less than `1`. To speed up the pull, pass a number greater\nthan `1`. The default value is `1` which is equal to the speed of the cursor.\nIf a negative value is passed in, the factor will be `1` instead.\n\nFor example: If the value passed is `1.2` and the content is dragged by\n`10` pixels, instead of `10` pixels the content will be pulled by `12` pixels\n(an increase of 20 percent). If the value passed is `0.8`, the dragged amount\nwill be `8` pixels, less than the amount the cursor has moved.\n\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." - }, - "ion-refresher/pull-max": { - "description": "The maximum distance of the pull until the refresher\nwill automatically go into the `refreshing` state.\nDefaults to the result of `pullMin + 60`.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." - }, - "ion-refresher/pull-min": { - "description": "The minimum distance the user must pull down until the\nrefresher will go into the `refreshing` state.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." - }, - "ion-refresher/snapback-duration": { - "description": "Time it takes the refresher to to snap back to the `refreshing` state.\nDoes not apply when the refresher content uses a spinner,\nenabling the native refresher." - }, - "ion-refresher-content/pulling-icon": { - "description": "A static icon or a spinner to display when you begin to pull down.\nA spinner name can be provided to gradually show tick marks\nwhen pulling down on iOS devices." - }, - "ion-refresher-content/pulling-text": { - "description": "The text you want to display when you begin to pull down.\n`pullingText` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" - }, - "ion-refresher-content/refreshing-spinner": { - "description": "An animated SVG spinner that shows when refreshing begins", - "options": [ - "bubbles", - "circles", - "circular", - "crescent", - "dots", - "lines", - "lines-small" - ] - }, - "ion-refresher-content/refreshing-text": { - "description": "The text you want to display when performing a refresh.\n`refreshingText` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" - }, - "ion-reorder-group/disabled": { - "description": "If `true`, the reorder will be hidden." - }, - "ion-ripple-effect/type": { - "description": "Sets the type of ripple-effect:\n\n- `bounded`: the ripple effect expands from the user's click position\n- `unbounded`: the ripple effect expands from the center of the button and overflows the container.\n\nNOTE: Surfaces for bounded ripples should have the overflow property set to hidden,\nwhile surfaces for unbounded ripples should have it set to visible.", - "options": [ - "bounded", - "unbounded" - ] - }, - "ion-route/component": { - "description": "Name of the component to load/select in the navigation outlet (`ion-tabs`, `ion-nav`)\nwhen the route matches.\n\nThe value of this property is not always the tagname of the component to load,\nin `ion-tabs` it actually refers to the name of the `ion-tab` to select." - }, - "ion-route/url": { - "description": "Relative path that needs to match in order for this route to apply.\n\nAccepts paths similar to expressjs so that you can define parameters\nin the url /foo/:bar where bar would be available in incoming props." - }, - "ion-route-redirect/from": { - "description": "A redirect route, redirects \"from\" a URL \"to\" another URL. This property is that \"from\" URL.\nIt needs to be an exact match of the navigated URL in order to apply.\n\nThe path specified in this value is always an absolute path, even if the initial `/` slash\nis not specified." - }, - "ion-route-redirect/to": { - "description": "A redirect route, redirects \"from\" a URL \"to\" another URL. This property is that \"to\" URL.\nWhen the defined `ion-route-redirect` rule matches, the router will redirect to the path\nspecified in this property.\n\nThe value of this property is always an absolute path inside the scope of routes defined in\n`ion-router` it can't be used with another router or to perform a redirection to a different domain.\n\nNote that this is a virtual redirect, it will not cause a real browser refresh, again, it's\na redirect inside the context of ion-router.\n\nWhen this property is not specified or his value is `undefined` the whole redirect route is noop,\neven if the \"from\" value matches." - }, - "ion-router/root": { - "description": "By default `ion-router` will match the routes at the root path (\"/\").\nThat can be changed when" - }, - "ion-router/use-hash": { - "description": "The router can work in two \"modes\":\n- With hash: `/index.html#/path/to/page`\n- Without hash: `/path/to/page`\n\nUsing one or another might depend in the requirements of your app and/or where it's deployed.\n\nUsually \"hash-less\" navigation works better for SEO and it's more user friendly too, but it might\nrequires additional server-side configuration in order to properly work.\n\nOn the otherside hash-navigation is much easier to deploy, it even works over the file protocol.\n\nBy default, this property is `true`, change to `false` to allow hash-less URLs." - }, - "ion-router-link/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-router-link/href": { - "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." - }, - "ion-router-link/rel": { - "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." - }, - "ion-router-link/router-direction": { - "description": "When using a router, it specifies the transition direction when navigating to\nanother page using `href`.", - "options": [ - "back", - "forward", - "root" - ] - }, - "ion-router-link/target": { - "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." - }, - "ion-router-outlet/animated": { - "description": "If `true`, the router-outlet should animate the transition of components." - }, - "ion-router-outlet/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-searchbar/animated": { - "description": "If `true`, enable searchbar animation." - }, - "ion-searchbar/autocomplete": { - "description": "Set the input's autocomplete property.", - "options": [ - "on", - "off", - "name", - "honorific-prefix", - "given-name", - "additional-name", - "family-name", - "honorific-suffix", - "nickname", - "email", - "username", - "new-password", - "current-password", - "one-time-code", - "organization-title", - "organization", - "street-address", - "address-line1", - "address-line2", - "address-line3", - "address-level4", - "address-level3", - "address-level2", - "address-level1", - "country", - "country-name", - "postal-code", - "cc-name", - "cc-given-name", - "cc-additional-name", - "cc-family-name", - "cc-number", - "cc-exp", - "cc-exp-month", - "cc-exp-year", - "cc-csc", - "cc-type", - "transaction-currency", - "transaction-amount", - "language", - "bday", - "bday-day", - "bday-month", - "bday-year", - "sex", - "tel", - "tel-country-code", - "tel-national", - "tel-area-code", - "tel-local", - "tel-extension", - "impp", - "url", - "photo" - ] - }, - "ion-searchbar/autocorrect": { - "description": "Set the input's autocorrect property.", - "options": [ - "off", - "on" - ] - }, - "ion-searchbar/cancel-button-icon": { - "description": "Set the cancel button icon. Only applies to `md` mode.\nDefaults to `\"arrow-back-sharp\"`." - }, - "ion-searchbar/cancel-button-text": { - "description": "Set the the cancel button text. Only applies to `ios` mode." - }, - "ion-searchbar/clear-icon": { - "description": "Set the clear icon. Defaults to `\"close-circle\"` for `ios` and `\"close-sharp\"` for `md`." - }, - "ion-searchbar/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-searchbar/debounce": { - "description": "Set the amount of time, in milliseconds, to wait to trigger the `ionChange` event after each keystroke." - }, - "ion-searchbar/disabled": { - "description": "If `true`, the user cannot interact with the input." - }, - "ion-searchbar/enterkeyhint": { - "description": "A hint to the browser for which enter key to display.\nPossible values: `\"enter\"`, `\"done\"`, `\"go\"`, `\"next\"`,\n`\"previous\"`, `\"search\"`, and `\"send\"`.", - "options": [ - "done", - "enter", - "go", - "next", - "previous", - "search", - "send" - ] - }, - "ion-searchbar/inputmode": { - "description": "A hint to the browser for which keyboard to display.\nPossible values: `\"none\"`, `\"text\"`, `\"tel\"`, `\"url\"`,\n`\"email\"`, `\"numeric\"`, `\"decimal\"`, and `\"search\"`.", - "options": [ - "decimal", - "email", - "none", - "numeric", - "search", - "tel", - "text", - "url" - ] - }, - "ion-searchbar/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-searchbar/placeholder": { - "description": "Set the input's placeholder.\n`placeholder` can accept either plaintext or HTML as a string.\nTo display characters normally reserved for HTML, they\nmust be escaped. For example `` would become\n`<Ionic>`\n\nFor more information: [Security Documentation](https://ionicframework.com/docs/faq/security)" - }, - "ion-searchbar/search-icon": { - "description": "The icon to use as the search icon. Defaults to `\"search-outline\"` in\n`ios` mode and `\"search-sharp\"` in `md` mode." - }, - "ion-searchbar/show-cancel-button": { - "description": "Sets the behavior for the cancel button. Defaults to `\"never\"`.\nSetting to `\"focus\"` shows the cancel button on focus.\nSetting to `\"never\"` hides the cancel button.\nSetting to `\"always\"` shows the cancel button regardless\nof focus state.", - "options": [ - "always", - "focus", - "never" - ] - }, - "ion-searchbar/spellcheck": { - "description": "If `true`, enable spellcheck on the input." - }, - "ion-searchbar/type": { - "description": "Set the type of the input.", - "options": [ - "email", - "number", - "password", - "search", - "tel", - "text", - "url" - ] - }, - "ion-searchbar/value": { - "description": "the value of the searchbar." - }, - "ion-segment/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-segment/disabled": { - "description": "If `true`, the user cannot interact with the segment." - }, - "ion-segment/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-segment/scrollable": { - "description": "If `true`, the segment buttons will overflow and the user can swipe to see them.\nIn addition, this will disable the gesture to drag the indicator between the buttons\nin order to swipe to see hidden buttons." - }, - "ion-segment/value": { - "description": "the value of the segment." - }, - "ion-segment-button/disabled": { - "description": "If `true`, the user cannot interact with the segment button." - }, - "ion-segment-button/layout": { - "description": "Set the layout of the text and icon in the segment.", - "options": [ - "icon-bottom", - "icon-end", - "icon-hide", - "icon-start", - "icon-top", - "label-hide" - ] - }, - "ion-segment-button/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-segment-button/type": { - "description": "The type of the button.", - "options": [ - "button", - "reset", - "submit" - ] - }, - "ion-segment-button/value": { - "description": "The value of the segment button." - }, - "ion-select/cancel-text": { - "description": "The text to display on the cancel button." - }, - "ion-select/compare-with": { - "description": "A property name or function used to compare object values" - }, - "ion-select/disabled": { - "description": "If `true`, the user cannot interact with the select." - }, - "ion-select/interface": { - "description": "The interface the select should use: `action-sheet`, `popover` or `alert`.", - "options": [ - "action-sheet", - "alert", - "popover" - ] - }, - "ion-select/interface-options": { - "description": "Any additional options that the `alert`, `action-sheet` or `popover` interface\ncan take. See the [ion-alert docs](../alert), the\n[ion-action-sheet docs](../action-sheet) and the\n[ion-popover docs](../popover) for the\ncreate options for each interface.\n\nNote: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface." - }, - "ion-select/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-select/multiple": { - "description": "If `true`, the select can accept multiple values." - }, - "ion-select/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-select/ok-text": { - "description": "The text to display on the ok button." - }, - "ion-select/placeholder": { - "description": "The text to display when the select is empty." - }, - "ion-select/selected-text": { - "description": "The text to display instead of the selected option's value." - }, - "ion-select/value": { - "description": "the value of the select." - }, - "ion-select-option/disabled": { - "description": "If `true`, the user cannot interact with the select option. This property does not apply when `interface=\"action-sheet\"` as `ion-action-sheet` does not allow for disabled buttons." - }, - "ion-select-option/value": { - "description": "The text value of the option." - }, - "ion-skeleton-text/animated": { - "description": "If `true`, the skeleton text will animate." - }, - "ion-slides/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-slides/options": { - "description": "Options to pass to the swiper instance.\nSee http://idangero.us/swiper/api/ for valid options" - }, - "ion-slides/pager": { - "description": "If `true`, show the pagination." - }, - "ion-slides/scrollbar": { - "description": "If `true`, show the scrollbar." - }, - "ion-spinner/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-spinner/duration": { - "description": "Duration of the spinner animation in milliseconds. The default varies based on the spinner." - }, - "ion-spinner/name": { - "description": "The name of the SVG spinner to use. If a name is not provided, the platform's default\nspinner will be used.", - "options": [ - "bubbles", - "circles", - "circular", - "crescent", - "dots", - "lines", - "lines-small" - ] - }, - "ion-spinner/paused": { - "description": "If `true`, the spinner's animation will be paused." - }, - "ion-split-pane/content-id": { - "description": "The content `id` of the split-pane's main content." - }, - "ion-split-pane/disabled": { - "description": "If `true`, the split pane will be hidden." - }, - "ion-split-pane/when": { - "description": "When the split-pane should be shown.\nCan be a CSS media query expression, or a shortcut expression.\nCan also be a boolean expression." - }, - "ion-tab/component": { - "description": "The component to display inside of the tab." - }, - "ion-tab/tab": { - "description": "A tab id must be provided for each `ion-tab`. It's used internally to reference\nthe selected tab or by the router to switch between them." - }, - "ion-tab-bar/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-tab-bar/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-tab-bar/selected-tab": { - "description": "The selected tab component" - }, - "ion-tab-bar/translucent": { - "description": "If `true`, the tab bar will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." - }, - "ion-tab-button/disabled": { - "description": "If `true`, the user cannot interact with the tab button." - }, - "ion-tab-button/download": { - "description": "This attribute instructs browsers to download a URL instead of navigating to\nit, so the user will be prompted to save it as a local file. If the attribute\nhas a value, it is used as the pre-filled file name in the Save prompt\n(the user can still change the file name if they want)." - }, - "ion-tab-button/href": { - "description": "Contains a URL or a URL fragment that the hyperlink points to.\nIf this property is set, an anchor tag will be rendered." - }, - "ion-tab-button/layout": { - "description": "Set the layout of the text and icon in the tab bar.\nIt defaults to `'icon-top'`.", - "options": [ - "icon-bottom", - "icon-end", - "icon-hide", - "icon-start", - "icon-top", - "label-hide" - ] - }, - "ion-tab-button/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-tab-button/rel": { - "description": "Specifies the relationship of the target object to the link object.\nThe value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)." - }, - "ion-tab-button/selected": { - "description": "The selected tab component" - }, - "ion-tab-button/tab": { - "description": "A tab id must be provided for each `ion-tab`. It's used internally to reference\nthe selected tab or by the router to switch between them." - }, - "ion-tab-button/target": { - "description": "Specifies where to display the linked URL.\nOnly applies when an `href` is provided.\nSpecial keywords: `\"_blank\"`, `\"_self\"`, `\"_parent\"`, `\"_top\"`." - }, - "ion-text/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-text/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-textarea/auto-grow": { - "description": "If `true`, the element height will increase based on the value." - }, - "ion-textarea/autocapitalize": { - "description": "Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user." - }, - "ion-textarea/autofocus": { - "description": "This Boolean attribute lets you specify that a form control should have input focus when the page loads." - }, - "ion-textarea/clear-on-edit": { - "description": "If `true`, the value will be cleared after focus upon edit. Defaults to `true` when `type` is `\"password\"`, `false` for all other types." - }, - "ion-textarea/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-textarea/cols": { - "description": "The visible width of the text control, in average character widths. If it is specified, it must be a positive integer." - }, - "ion-textarea/debounce": { - "description": "Set the amount of time, in milliseconds, to wait to trigger the `ionChange` event after each keystroke." - }, - "ion-textarea/disabled": { - "description": "If `true`, the user cannot interact with the textarea." - }, - "ion-textarea/enterkeyhint": { - "description": "A hint to the browser for which enter key to display.\nPossible values: `\"enter\"`, `\"done\"`, `\"go\"`, `\"next\"`,\n`\"previous\"`, `\"search\"`, and `\"send\"`.", - "options": [ - "done", - "enter", - "go", - "next", - "previous", - "search", - "send" - ] - }, - "ion-textarea/inputmode": { - "description": "A hint to the browser for which keyboard to display.\nPossible values: `\"none\"`, `\"text\"`, `\"tel\"`, `\"url\"`,\n`\"email\"`, `\"numeric\"`, `\"decimal\"`, and `\"search\"`.", - "options": [ - "decimal", - "email", - "none", - "numeric", - "search", - "tel", - "text", - "url" - ] - }, - "ion-textarea/maxlength": { - "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the maximum number of characters that the user can enter." - }, - "ion-textarea/minlength": { - "description": "If the value of the type attribute is `text`, `email`, `search`, `password`, `tel`, or `url`, this attribute specifies the minimum number of characters that the user can enter." - }, - "ion-textarea/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-textarea/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-textarea/placeholder": { - "description": "Instructional text that shows before the input has a value." - }, - "ion-textarea/readonly": { - "description": "If `true`, the user cannot modify the value." - }, - "ion-textarea/required": { - "description": "If `true`, the user must fill in a value before submitting a form." - }, - "ion-textarea/rows": { - "description": "The number of visible text lines for the control." - }, - "ion-textarea/spellcheck": { - "description": "If `true`, the element will have its spelling and grammar checked." - }, - "ion-textarea/value": { - "description": "The value of the textarea." - }, - "ion-textarea/wrap": { - "description": "Indicates how the control wraps text.", - "options": [ - "hard", - "off", - "soft" - ] - }, - "ion-title/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-title/size": { - "description": "The size of the toolbar title.", - "options": [ - "large", - "small" - ] - }, - "ion-toast/animated": { - "description": "If `true`, the toast will animate." - }, - "ion-toast/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-toast/css-class": { - "description": "Additional classes to apply for custom CSS. If multiple classes are\nprovided they should be separated by spaces." - }, - "ion-toast/duration": { - "description": "How many milliseconds to wait before hiding the toast. By default, it will show\nuntil `dismiss()` is called." - }, - "ion-toast/header": { - "description": "Header to be shown in the toast." - }, - "ion-toast/keyboard-close": { - "description": "If `true`, the keyboard will be automatically dismissed when the overlay is presented." - }, - "ion-toast/message": { - "description": "Message to be shown in the toast." - }, - "ion-toast/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-toast/position": { - "description": "The position of the toast on the screen.", - "options": [ - "bottom", - "middle", - "top" - ] - }, - "ion-toast/translucent": { - "description": "If `true`, the toast will be translucent.\nOnly applies when the mode is `\"ios\"` and the device supports\n[`backdrop-filter`](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter#Browser_compatibility)." - }, - "ion-toggle/checked": { - "description": "If `true`, the toggle is selected." - }, - "ion-toggle/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-toggle/disabled": { - "description": "If `true`, the user cannot interact with the toggle." - }, - "ion-toggle/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-toggle/name": { - "description": "The name of the control, which is submitted with the form data." - }, - "ion-toggle/value": { - "description": "The value of the toggle does not mean if it's checked or not, use the `checked`\nproperty for that.\n\nThe value of a toggle is analogous to the value of a ``,\nit's only used when the toggle participates in a native ``." - }, - "ion-toolbar/color": { - "description": "The color to use from your application's color palette.\nDefault options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`.\nFor more information on colors, see [theming](/docs/theming/basics)." - }, - "ion-toolbar/mode": { - "description": "The mode determines which platform styles to use.", - "options": [ - "ios", - "md" - ] - }, - "ion-virtual-scroll/approx-footer-height": { - "description": "The approximate width of each footer template's cell.\nThis dimension is used to help determine how many cells should\nbe created when initialized, and to help calculate the height of\nthe scrollable area. This height value can only use `px` units.\nNote that the actual rendered size of each cell comes from the\napp's CSS, whereas this approximation is used to help calculate\ninitial dimensions before the item has been rendered." - }, - "ion-virtual-scroll/approx-header-height": { - "description": "The approximate height of each header template's cell.\nThis dimension is used to help determine how many cells should\nbe created when initialized, and to help calculate the height of\nthe scrollable area. This height value can only use `px` units.\nNote that the actual rendered size of each cell comes from the\napp's CSS, whereas this approximation is used to help calculate\ninitial dimensions before the item has been rendered." - }, - "ion-virtual-scroll/approx-item-height": { - "description": "It is important to provide this\nif virtual item height will be significantly larger than the default\nThe approximate height of each virtual item template's cell.\nThis dimension is used to help determine how many cells should\nbe created when initialized, and to help calculate the height of\nthe scrollable area. This height value can only use `px` units.\nNote that the actual rendered size of each cell comes from the\napp's CSS, whereas this approximation is used to help calculate\ninitial dimensions before the item has been rendered." - } -} \ No newline at end of file diff --git a/vetur/tags.json b/vetur/tags.json deleted file mode 100644 index d5515b6..0000000 --- a/vetur/tags.json +++ /dev/null @@ -1,873 +0,0 @@ -{ - "ion-page": { - "description": "`IonPage` is a specialized component that is meant to be the parent container for an Ionic Page, which typically consists of `IonHeader` and `IonContent` components." - }, - "ion-action-sheet": { - "attributes": [ - "animated", - "backdrop-dismiss", - "css-class", - "header", - "keyboard-close", - "mode", - "sub-header", - "translucent" - ], - "description": "An Action Sheet is a dialog that displays a set of options. It appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. Destructive options are made obvious in `ios` mode. There are multiple ways to dismiss the action sheet, including tapping the backdrop or hitting the escape key on desktop." - }, - "ion-alert": { - "attributes": [ - "animated", - "backdrop-dismiss", - "css-class", - "header", - "keyboard-close", - "message", - "mode", - "sub-header", - "translucent" - ], - "description": "An Alert is a dialog that presents users with information or collects information from the user using inputs. An alert appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. It can also optionally have a `header`, `subHeader` and `message`." - }, - "ion-app": { - "attributes": [], - "description": "App is a container element for an Ionic application. There should only be one `` element per project. An app can have many Ionic components including menus, headers, content, and footers. The overlay components get appended to the `` when they are presented." - }, - "ion-avatar": { - "attributes": [], - "description": "Avatars are circular components that usually wrap an image or icon. They can be used to represent a person or an object.\n\nAvatars can be used by themselves or inside of any element. If placed inside of an `ion-chip` or `ion-item`, the avatar will resize to fit the parent component. To position an avatar on the left or right side of an item, set the slot to `start` or `end`, respectively." - }, - "ion-back-button": { - "attributes": [ - "color", - "default-href", - "disabled", - "icon", - "mode", - "text", - "type" - ], - "description": "The back button navigates back in the app's history upon click. It is smart enough to know what to render based on the mode and when to show based on the navigation stack.\n\nTo change what is displayed in the back button, use the `text` and `icon` properties." - }, - "ion-backdrop": { - "attributes": [ - "stop-propagation", - "tappable", - "visible" - ], - "description": "Backdrops are full screen components that overlay other components. They are useful behind components that transition in on top of other content and can be used to dismiss that component." - }, - "ion-badge": { - "attributes": [ - "color", - "mode" - ], - "description": "Badges are inline block elements that usually appear near another element. Typically they contain a number or other characters. They can be used as a notification that there are additional items associated with an element and indicate how many items there are." - }, - "ion-button": { - "attributes": [ - "button-type", - "color", - "disabled", - "download", - "expand", - "fill", - "href", - "mode", - "rel", - "router-direction", - "shape", - "size", - "strong", - "target", - "type", - "replace" - ], - "description": "Buttons provide a clickable element, which can be used in forms, or anywhere that needs simple, standard button functionality. They may display text, icons, or both. Buttons can be styled with several attributes to look a specific way." - }, - "ion-buttons": { - "attributes": [ - "collapse" - ], - "description": "The Buttons component is a container element. Buttons placed in a toolbar should be placed inside of the `` element.\n\nThe `` element can be positioned inside of the toolbar using a named slot. The below chart has a description of each slot.\n\n| Slot | Description |\n|--------------|----------------------------------------------------------------------------------------------------------|\n| `secondary` | Positions element to the `left` of the content in `ios` mode, and directly to the `right` in `md` mode. |\n| `primary` | Positions element to the `right` of the content in `ios` mode, and to the far `right` in `md` mode. |\n| `start` | Positions to the `left` of the content in LTR, and to the `right` in RTL. |\n| `end` | Positions to the `right` of the content in LTR, and to the `left` in RTL. |" - }, - "ion-card": { - "attributes": [ - "button", - "color", - "disabled", - "download", - "href", - "mode", - "rel", - "router-direction", - "target", - "type", - "replace" - ], - "description": "Cards are a standard piece of UI that serves as an entry point to more detailed\ninformation. A card can be a single component, but is often made up of some\nheader, title, subtitle, and content. `ion-card` is broken up into several\nsub-components to reflect this. Please see `ion-card-content`,\n`ion-card-header`, `ion-card-title`, `ion-card-subtitle`." - }, - "ion-card-content": { - "attributes": [ - "mode" - ], - "description": "`ion-card-content` is child component of `ion-card` that adds some content padding.\nIt is recommended that any text content for a card should be placed in an `ion-card-content`." - }, - "ion-card-header": { - "attributes": [ - "color", - "mode", - "translucent" - ], - "description": "`ion-card-header` is a header component for `ion-card`." - }, - "ion-card-subtitle": { - "attributes": [ - "color", - "mode" - ], - "description": "`ion-card-subtitle` is a child component of `ion-card`" - }, - "ion-card-title": { - "attributes": [ - "color", - "mode" - ], - "description": "`ion-card-title` is a child component of `ion-card`" - }, - "ion-checkbox": { - "attributes": [ - "checked", - "color", - "disabled", - "indeterminate", - "mode", - "name", - "value" - ], - "description": "Checkboxes allow the selection of multiple options from a set of options. They appear as checked (ticked) when activated. Clicking on a checkbox will toggle the `checked` property. They can also be checked programmatically by setting the `checked` property." - }, - "ion-chip": { - "attributes": [ - "color", - "mode", - "outline" - ], - "description": "Chips represent complex entities in small blocks, such as a contact. A chip can contain several different elements such as avatars, text, and icons." - }, - "ion-col": { - "attributes": [ - "offset", - "offset-lg", - "offset-md", - "offset-sm", - "offset-xl", - "offset-xs", - "pull", - "pull-lg", - "pull-md", - "pull-sm", - "pull-xl", - "pull-xs", - "push", - "push-lg", - "push-md", - "push-sm", - "push-xl", - "push-xs", - "size", - "size-lg", - "size-md", - "size-sm", - "size-xl", - "size-xs" - ], - "description": "Columns are cellular components of the [grid](../grid) system and go inside of a [row](../row).\nThey will expand to fill their row. All content within a grid should go inside of a column.\n\nSee [Grid Layout](/docs/layout/grid) for more information." - }, - "ion-content": { - "attributes": [ - "color", - "force-overscroll", - "fullscreen", - "scroll-events", - "scroll-x", - "scroll-y" - ], - "description": "The content component provides an easy to use content area with some useful methods\nto control the scrollable area. There should only be one content in a single\nview.\n\nContent, along with many other Ionic components, can be customized to modify its padding, margin, and more using the global styles provided in the [CSS Utilities](/docs/layout/css-utilities) or by individually styling it using CSS and the available [CSS Custom Properties](#css-custom-properties)." - }, - "ion-datetime": { - "attributes": [ - "cancel-text", - "day-names", - "day-short-names", - "day-values", - "disabled", - "display-format", - "display-timezone", - "done-text", - "hour-values", - "max", - "min", - "minute-values", - "mode", - "month-names", - "month-short-names", - "month-values", - "name", - "picker-format", - "placeholder", - "readonly", - "value", - "year-values" - ], - "description": "Datetimes present a picker interface from the bottom of a page, making it easy for\nusers to select dates and times. The picker displays scrollable columns that can be\nused to individually select years, months, days, hours and minute values. Datetimes\nare similar to the native `input` elements of type `datetime-local`, however, Ionic's\nDatetime component makes it easy to display the date and time in a preferred format,\nand manage the datetime values." - }, - "ion-fab": { - "attributes": [ - "activated", - "edge", - "horizontal", - "vertical" - ], - "description": "Fabs are container elements that contain one or more fab buttons. They should be placed in a fixed position that does not scroll with the content. Fab should have one main fab-button. Fabs can also contain fab-lists which contain related buttons that show when the main fab button is clicked. The same fab container can contain several [fab-list](../fab-list) elements with different side values." - }, - "ion-fab-button": { - "attributes": [ - "activated", - "close-icon", - "color", - "disabled", - "download", - "href", - "mode", - "rel", - "router-direction", - "show", - "size", - "target", - "translucent", - "type", - "replace" - ], - "description": "Floating Action Buttons (FABs) represent the primary action in an application. By default, they have a circular shape. When pressed, the button may open more related actions. As the name suggests, FABs generally float over the content in a fixed position. This is not achieved exclusively by using an `FAB`. They need to be wrapped with an `` component in order to be fixed over the content.\n\nIf the FAB button is not wrapped with ``, it will scroll with the content. FAB buttons have a default size, a mini size and can accept different colors:" - }, - "ion-fab-list": { - "attributes": [ - "activated", - "side" - ], - "description": "The `ion-fab-list` element is a container for multiple fab buttons. This collection of fab buttons contains actions related to the main fab button and is flung out on click. To specify what side the buttons should appear on, set the `side` property to 'start', 'end', 'top', 'bottom'" - }, - "ion-footer": { - "attributes": [ - "mode", - "translucent" - ], - "description": "Footer is a root component of a page that sits at the bottom of the page.\nFooter can be a wrapper for ion-toolbar to make sure the content area is sized correctly." - }, - "ion-grid": { - "attributes": [ - "fixed" - ], - "description": "The grid is a powerful mobile-first flexbox system for building custom layouts.\n\nIt is composed of three units — a grid, [row(s)](../row) and [column(s)](../col). Columns will expand to fill the row, and will resize to fit additional columns. It is based on a 12 column layout with different breakpoints based on the screen size. The number of columns can be customized using CSS.\n\nSee the [Responsive Grid documentation](/docs/layout/grid) for more information." - }, - "ion-header": { - "attributes": [ - "collapse", - "mode", - "translucent" - ], - "description": "Header is a parent component that holds the toolbar component.\nIt's important to note that ion-header needs to be the one of the three root elements of a page" - }, - "ion-img": { - "attributes": [ - "alt", - "src" - ], - "description": "Img is a tag that will lazily load an image when ever the tag is in the viewport. This is extremely useful when generating a large list as images are only loaded when they're visible. The component uses [Intersection Observer](https://caniuse.com/#feat=intersectionobserver) internally, which is supported in most modern browser, but falls back to a `setTimeout` when it is not supported." - }, - "ion-infinite-scroll": { - "attributes": [ - "disabled", - "position", - "threshold" - ], - "description": "The Infinite Scroll component calls an action to be performed when the user scrolls a specified distance from the bottom or top of the page.\n\nThe expression assigned to the `ionInfinite` event is called when the user reaches that defined distance. When this expression has finished any and all tasks, it should call the `complete()` method on the infinite scroll instance." - }, - "ion-infinite-scroll-content": { - "attributes": [ - "loading-spinner", - "loading-text" - ], - "description": "The `ion-infinite-scroll-content` component is the default child used by the `ion-infinite-scroll`. It displays an infinite scroll spinner that looks best based on the platform and changes the look depending on the infinite scroll's state. The default spinner can be changed and text can be added by setting the `loadingSpinner` and `loadingText` properties." - }, - "ion-input": { - "attributes": [ - "accept", - "autocapitalize", - "autocomplete", - "autocorrect", - "autofocus", - "clear-input", - "clear-on-edit", - "color", - "debounce", - "disabled", - "enterkeyhint", - "inputmode", - "max", - "maxlength", - "min", - "minlength", - "mode", - "multiple", - "name", - "pattern", - "placeholder", - "readonly", - "required", - "size", - "spellcheck", - "step", - "type", - "value" - ], - "description": "The input component is a wrapper to the HTML input element with custom styling and additional functionality. It accepts most of the same properties as the HTML input, but works great on desktop devices and integrates with the keyboard on mobile devices.\n\nIt is meant for text `type` inputs only, such as `\"text\"`, `\"password\"`, `\"email\"`, `\"number\"`, `\"search\"`, `\"tel\"`, and `\"url\"`. It supports all standard text input events including keyup, keydown, keypress, and more." - }, - "ion-item": { - "attributes": [ - "button", - "color", - "detail", - "detail-icon", - "disabled", - "download", - "href", - "lines", - "mode", - "rel", - "router-direction", - "target", - "type", - "replace" - ], - "description": "Items are elements that can contain text, icons, avatars, images, inputs, and any other native or custom elements. Generally they are placed in a list with other items. Items can be swiped, deleted, reordered, edited, and more." - }, - "ion-item-divider": { - "attributes": [ - "color", - "mode", - "sticky" - ], - "description": "Item Dividers are block elements that can be used to separate items in a list. They are similar to list headers, but instead of being placed at the top of a list, they should go in between groups of items." - }, - "ion-item-group": { - "attributes": [], - "description": "Item groups are containers that organize similar items together. They can contain item dividers to divide the items into multiple sections. They can also be used to group sliding items." - }, - "ion-item-option": { - "attributes": [ - "color", - "disabled", - "download", - "expandable", - "href", - "mode", - "rel", - "target", - "type", - "replace" - ], - "description": "The option button for an `ion-item-sliding`. Must be placed inside of an ``.\nYou can combine the `ionSwipe` event and the `expandable` directive to create a full swipe\naction for the item." - }, - "ion-item-options": { - "attributes": [ - "side" - ], - "description": "The option buttons for an `ion-item-sliding`. These buttons can be placed either on the [start or end side](#side-description).\nYou can combine the `ionSwipe` event plus the `expandable` directive to create a full swipe action for the item." - }, - "ion-item-sliding": { - "attributes": [ - "disabled" - ], - "description": "A sliding item contains an item that can be dragged to reveal buttons. It requires an [item](../item) component as a child. All options to reveal should be placed in the [item options](../item-options) element." - }, - "ion-label": { - "attributes": [ - "color", - "mode", - "position" - ], - "description": "Label is a wrapper element that can be used in combination with `ion-item`, `ion-input`, `ion-toggle`, and more. The position of the label inside of an item can be inline, fixed, stacked, or floating." - }, - "ion-list": { - "attributes": [ - "inset", - "lines", - "mode" - ], - "description": "Lists are made up of multiple rows of items which can contain text, buttons, toggles,\nicons, thumbnails, and much more. Lists generally contain items with similar data content, such as images and text.\n\nLists support several interactions including swiping items to reveal options, dragging to reorder items within the list, and deleting items." - }, - "ion-list-header": { - "attributes": [ - "color", - "lines", - "mode" - ], - "description": "ListHeader a header component for a list.\nUnlike ItemDivider, ListHeaders are styled to be stand-out from the rest of the list items." - }, - "ion-loading": { - "attributes": [ - "animated", - "backdrop-dismiss", - "css-class", - "duration", - "keyboard-close", - "message", - "mode", - "show-backdrop", - "spinner", - "translucent" - ], - "description": "An overlay that can be used to indicate activity while blocking user interaction. The loading indicator appears on top of the app's content, and can be dismissed by the app to resume user interaction with the app. It includes an optional backdrop, which can be disabled by setting `showBackdrop: false` upon creation." - }, - "ion-menu": { - "attributes": [ - "content-id", - "disabled", - "max-edge-start", - "menu-id", - "side", - "swipe-gesture", - "type" - ], - "description": "The Menu component is a navigation drawer that slides in from the side of the current view.\nBy default, it slides in from the left, but the side can be overridden.\nThe menu will be displayed differently based on the mode, however the display type can be changed to any of the available menu types.\nThe menu element should be a sibling to the root content element.\nThere can be any number of menus attached to the content.\nThese can be controlled from the templates, or programmatically using the MenuController." - }, - "ion-menu-button": { - "attributes": [ - "auto-hide", - "color", - "disabled", - "menu", - "mode", - "type" - ], - "description": "Menu Button is component that automatically creates the icon and functionality to open a menu on a page." - }, - "ion-menu-toggle": { - "attributes": [ - "auto-hide", - "menu" - ], - "description": "The MenuToggle component can be used to toggle a menu open or closed.\n\nBy default, it's only visible when the selected menu is active. A menu is active when it can be opened/closed. If the menu is disabled or it's being presented as a split-pane, the menu is marked as non-active and ion-menu-toggle hides itself.\n\nIn case it's desired to keep `ion-menu-toggle` always visible, the `autoHide` property can be set to `false`." - }, - "ion-modal": { - "attributes": [ - "animated", - "backdrop-dismiss", - "component", - "css-class", - "keyboard-close", - "mode", - "show-backdrop", - "swipe-to-close" - ], - "description": "A Modal is a dialog that appears on top of the app's content, and must be dismissed by the app before interaction can resume. It is useful as a select component when there are a lot of options to choose from, or when filtering items in a list, as well as many other use cases." - }, - "ion-nav": { - "attributes": [ - "animated", - "root", - "swipe-gesture" - ], - "description": "Nav is a standalone component for loading arbitrary components and pushing new components on to the stack.\n\nUnlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL." - }, - "ion-nav-link": { - "attributes": [ - "component", - "router-direction" - ], - "description": "A navigation link is used to navigate to a specified component. The component can be navigated to by going `forward`, `back` or as a `root` component.\n\nIt is the element form of calling the `push()`, `pop()`, and `setRoot()` methods on the navigation controller." - }, - "ion-note": { - "attributes": [ - "color", - "mode" - ], - "description": "Notes are text elements generally used as subtitles that provide more information. Notes are styled to appear grey by default. Notes can be used in an item as metadata text." - }, - "ion-picker": { - "attributes": [ - "animated", - "backdrop-dismiss", - "css-class", - "duration", - "keyboard-close", - "mode", - "show-backdrop" - ], - "description": "A Picker is a dialog that displays a row of buttons and columns underneath. It appears on top of the app's content, and at the bottom of the viewport." - }, - "ion-popover": { - "attributes": [ - "animated", - "backdrop-dismiss", - "component", - "css-class", - "event", - "keyboard-close", - "mode", - "show-backdrop", - "translucent" - ], - "description": "A Popover is a dialog that appears on top of the current page. It can be used for anything, but generally it is used for overflow actions that don't fit in the navigation bar." - }, - "ion-progress-bar": { - "attributes": [ - "buffer", - "color", - "mode", - "reversed", - "type", - "value" - ], - "description": "ion-progress-bar is a horizontal progress bar to visualize the progression of an operation and activity. You can choose between two types: `determinate` and `indeterminate`." - }, - "ion-radio": { - "attributes": [ - "color", - "disabled", - "mode", - "name", - "value" - ], - "description": "Radios should be used inside of an [`ion-radio-group`](../radio-group). Pressing on a radio will check it. They can also be checked programmatically by setting the value property of the parent `ion-radio-group` to the value of the radio.\n\nWhen radios are inside of a radio group, only one radio in the group will be checked at any time. Pressing a radio will check it and uncheck the previously selected radio, if there is one. If a radio is not in a group with another radio, then both radios will have the ability to be checked at the same time." - }, - "ion-radio-group": { - "attributes": [ - "allow-empty-selection", - "name", - "value" - ], - "description": "A radio group is a group of [radio buttons](../radio). It allows\na user to select at most one radio button from a set. Checking one radio\nbutton that belongs to a radio group unchecks any previous checked\nradio button within the same group." - }, - "ion-range": { - "attributes": [ - "color", - "debounce", - "disabled", - "dual-knobs", - "max", - "min", - "mode", - "name", - "pin", - "snaps", - "step", - "ticks", - "value" - ], - "description": "The Range slider lets users select from a range of values by moving\nthe slider knob. It can accept dual knobs, but by default one knob\ncontrols the value of the range." - }, - "ion-refresher": { - "attributes": [ - "close-duration", - "disabled", - "pull-factor", - "pull-max", - "pull-min", - "snapback-duration" - ], - "description": "The refresher provides pull-to-refresh functionality on a content component.\nThe pull-to-refresh pattern lets a user pull down on a list of data using touch\nin order to retrieve more data.\n\nData should be modified during the refresher's output events. Once the async\noperation has completed and the refreshing should end, call `complete()` on the\nrefresher." - }, - "ion-refresher-content": { - "attributes": [ - "pulling-icon", - "pulling-text", - "refreshing-spinner", - "refreshing-text" - ], - "description": "The refresher content contains the text, icon and spinner to display during a pull-to-refresh. Ionic provides the pulling icon and refreshing spinner based on the platform. However, the default icon, spinner, and text can be customized based on the state of the refresher." - }, - "ion-reorder": { - "attributes": [], - "description": "Reorder is a component that allows an item in a group of items to be dragged to change its order within that group. It must be used within an `ion-reorder-group` to provide a visual drag and drop interface.\n\n`ion-reorder` is the anchor used to drag and drop the items inside of the `ion-reorder-group`. See the [Reorder Group](../reorder-group) for more information on how to complete the reorder operation." - }, - "ion-reorder-group": { - "attributes": [ - "disabled" - ], - "description": "The reorder group is a wrapper component for items using the `ion-reorder` component. See the [Reorder documentation](../reorder/) for further information about the anchor component that is used to drag items within the `ion-reorder-group`.\n\nOnce the user drags an item and drops it in a new position, the `ionItemReorder` event is dispatched. A handler for it should be implemented that calls the `complete()` method.\n\nThe `detail` property of the `ionItemReorder` event includes all of the relevant information about the reorder operation, including the `from` and `to` indexes. In the context of reordering, an item moves `from` an index `to` a new index." - }, - "ion-ripple-effect": { - "attributes": [ - "type" - ], - "description": "The ripple effect component adds the [Material Design ink ripple interaction effect](https://material.io/develop/web/components/ripples/). This component can only be used inside of an `` and can be added to any component.\n\nIt's important to note that the parent should have [relative positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/position) because the ripple effect is absolutely positioned and will cover the closest parent with relative positioning. The parent element should also be given the `ion-activatable` class, which tells the ripple effect that the element is clickable.\n\nThe default type, `\"bounded\"`, will expand the ripple effect from the click position outwards. To add a ripple effect that always starts in the center of the element and expands in a circle, add an `\"unbounded\"` type. It's recommended to add `overflow: hidden` to the parent element to avoid the ripple overflowing its container, especially with an unbounded ripple." - }, - "ion-route": { - "attributes": [ - "component", - "url" - ], - "description": "The route component takes a component and renders it when the Browser URL matches the url property.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](../router-outlet) and the Angular router." - }, - "ion-route-redirect": { - "attributes": [ - "from", - "to" - ], - "description": "A route redirect can only be used with an `ion-router` as a direct child of it.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](../router-outlet) and the Angular router.\n\nThe route redirect has two configurable properties:\n - `from`\n - `to`\n\nIt redirects \"from\" a URL \"to\" another URL. When the defined `ion-route-redirect` rule matches, the router will redirect from the path specified in the `from` property to the path in the `to` property. In order for a redirect to occur the `from` path needs to be an exact match to the navigated URL." - }, - "ion-router": { - "attributes": [ - "root", - "use-hash" - ], - "description": "The router is a component for handling routing inside vanilla and Stencil JavaScript projects.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](../router-outlet) and the Angular router.\n\nApps should have a single `ion-router` component in the codebase.\nThis component controls all interactions with the browser history and it aggregates updates through an event system.\n\n`ion-router` is just a URL coordinator for the navigation outlets of ionic: `ion-nav` and `ion-tabs`.\n\nThat means the `ion-router` never touches the DOM, it does NOT show the components or emit any kind of lifecycle events, it just tells `ion-nav` and `ion-tabs` what and when to \"show\" based on the browser's URL.\n\nIn order to configure this relationship between components (to load/select) and URLs, `ion-router` uses a declarative syntax using JSX/HTML to define a tree of routes." - }, - "ion-router-link": { - "attributes": [ - "color", - "href", - "rel", - "router-direction", - "target", - "replace" - ], - "description": "The router link component is used for navigating to a specified link. Similar to the browser's anchor tag, it can accept a href for the location, and a direction for the transition animation.\n\n> Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use an `` and `routerLink` with the Angular router." - }, - "ion-router-outlet": { - "attributes": [ - "animated", - "mode" - ], - "description": "Router outlet is a component used in routing within an Angular app. It behaves in a similar way to Angular's built-in router outlet component, but contains the logic for providing a stacked navigation, and animating views in and out.\n\n> Note: this component should only be used with Angular projects. For vanilla or Stencil JavaScript projects, use [`ion-router`](../router) and [`ion-route`](../route).\n\nAlthough router outlet has methods for navigating around, it's recommended to use the navigation methods in Angular's router." - }, - "ion-row": { - "attributes": [], - "description": "Rows are horizontal components of the [grid](../grid) system and contain varying numbers of\n[columns](../col). They ensure the columns are positioned properly.\n\nSee [Grid Layout](/docs/layout/grid) for more information." - }, - "ion-searchbar": { - "attributes": [ - "animated", - "autocomplete", - "autocorrect", - "cancel-button-icon", - "cancel-button-text", - "clear-icon", - "color", - "debounce", - "disabled", - "enterkeyhint", - "inputmode", - "mode", - "placeholder", - "search-icon", - "show-cancel-button", - "spellcheck", - "type", - "value" - ], - "description": "Searchbars represent a text field that can be used to search through a collection. They can be displayed inside of a toolbar or the main content.\n\nA Searchbar should be used instead of an input to search lists. A clear button is displayed upon entering input in the searchbar's text field. Clicking on the clear button will erase the text field and the input will remain focused. A cancel button can be enabled which will clear the input and lose the focus upon click." - }, - "ion-segment": { - "attributes": [ - "color", - "disabled", - "mode", - "scrollable", - "value" - ], - "description": "Segments display a group of related buttons, sometimes known as segmented controls, in a horizontal row. They can be displayed inside of a toolbar or the main content.\n\nTheir functionality is similar to tabs, where selecting one will deselect all others. Segments are useful for toggling between different views inside of the content. Tabs should be used instead of a segment when clicking on a control should navigate between pages." - }, - "ion-segment-button": { - "attributes": [ - "disabled", - "layout", - "mode", - "type", - "value" - ], - "description": "Segment buttons are groups of related buttons inside of a [Segment](../segment). They are displayed in a horizontal row. A segment button can be checked by default by adding the `checked` attribute or by setting the `value` of the segment to the `value` of the segment button. Only one segment button should be selected at a time." - }, - "ion-select": { - "attributes": [ - "cancel-text", - "compare-with", - "disabled", - "interface", - "interface-options", - "mode", - "multiple", - "name", - "ok-text", - "placeholder", - "selected-text", - "value" - ], - "description": "Selects are form controls to select an option, or options, from a set of options, similar to a native `