diff --git a/package-lock.json b/package-lock.json index 143f01e..3e4f889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, "requires": { "@babel/highlight": "^7.0.0" } @@ -201,7 +200,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -210,7 +208,6 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", @@ -232,8 +229,7 @@ "@babel/helper-plugin-utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-regex": { "version": "7.5.5", @@ -273,7 +269,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, "requires": { "@babel/template": "^7.1.0", "@babel/types": "^7.0.0" @@ -283,7 +278,6 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, "requires": { "@babel/types": "^7.4.4" } @@ -315,7 +309,6 @@ "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -325,8 +318,7 @@ "@babel/parser": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", @@ -638,7 +630,6 @@ "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.4.4", "@babel/helper-plugin-utils": "^7.0.0", @@ -947,7 +938,6 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.4.4", @@ -992,7 +982,6 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", - "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1123,32 +1112,32 @@ "dev": true }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz", - "integrity": "sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ==" + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.21.tgz", + "integrity": "sha512-iJtcrU2BtF9Wyr0zm3tHEJy3HqA6sADExhCqCv3SKaJJKKp4ORJ40t4nyHvcWXSVFtd7r1gcdqcRsAfoREGTFA==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.19", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz", - "integrity": "sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA==", + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.21.tgz", + "integrity": "sha512-EhrgMZLJS0tTYZhUbodurZBqDgAFLDNdxJP/q5unrZJwiFo8Dd7xGvJdhAhY5WcX4khzkPQcbLTCMPHBtutD7Q==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.19" + "@fortawesome/fontawesome-common-types": "^0.2.21" } }, "@fortawesome/free-regular-svg-icons": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.9.0.tgz", - "integrity": "sha512-6ZO0jLhk/Yrso0u5pXeYYSfZiHCNoCF7SgtqStdlEX8WtWD4IOfAB1N+MlSnMo12P5KR4cmucX/K0NCOPrhJwg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.10.1.tgz", + "integrity": "sha512-2qU3IE4PeqZjMrVuHsE5sjgK64HlpijMhBv66TEhFEGCLpB2bwRdGvies6vpUvmTRRHhUat4IcRayLUWuGbKXQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.19" + "@fortawesome/fontawesome-common-types": "^0.2.21" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz", - "integrity": "sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.10.1.tgz", + "integrity": "sha512-MKH+SCt0DnVoXdemxf6JEdTRtCPwYLMCWZcwgGccYU/ab6QcDtbAMn6Xm4Zub6YqQCcaiy0hU294YdHOldSBRA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.19" + "@fortawesome/fontawesome-common-types": "^0.2.21" } }, "@fortawesome/vue-fontawesome": { @@ -1196,9 +1185,9 @@ }, "dependencies": { "@hapi/hoek": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", - "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.1.0.tgz", + "integrity": "sha512-b1J4jxYnW+n6lC91V6Pqg9imP9BZq0HNCeM+3sbXg05rQsE9cGYrKFpZjyztVesGmNRE6R+QaEoWGATeIiUVjA==", "dev": true } } @@ -1339,16 +1328,16 @@ } }, "@storybook/addon-actions": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-5.1.9.tgz", - "integrity": "sha512-h/csHPotBESyEUYlML3yyF2jUlDChB+u3TUNC3Ztzh/x7HzLqy88SL0INSIdY0dCBGx4TK5Gh+rMI7z28Hfdyw==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-5.1.10.tgz", + "integrity": "sha512-njl2AHBGi27NvisOB8LFnWH/3RcyJT/CW7tl1cvV2j5FH2oBjq5MsjxKyJIcKwC677k1Wr8G8fw/zSEHrPpmgA==", "dev": true, "requires": { - "@storybook/addons": "5.1.9", - "@storybook/api": "5.1.9", - "@storybook/components": "5.1.9", - "@storybook/core-events": "5.1.9", - "@storybook/theming": "5.1.9", + "@storybook/addons": "5.1.10", + "@storybook/api": "5.1.10", + "@storybook/components": "5.1.10", + "@storybook/core-events": "5.1.10", + "@storybook/theming": "5.1.10", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -1369,14 +1358,14 @@ } }, "@storybook/addon-links": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-5.1.9.tgz", - "integrity": "sha512-mwNxbXX9eI6G7iBk/1BJ2bSsLOv+/zek7BbF8x5LGTXgrp9bVB6dUxjPFHOmiUFqrLheHxUTsBlwZDFQdMdHBg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-5.1.10.tgz", + "integrity": "sha512-LDDcIU4ae76063baWuoi7dWI8YeSCq595siUlxM+aNydxHsIdQhi7vH1GRJL1oqCvvYLykdopcjKofO5EiTVdw==", "dev": true, "requires": { - "@storybook/addons": "5.1.9", - "@storybook/core-events": "5.1.9", - "@storybook/router": "5.1.9", + "@storybook/addons": "5.1.10", + "@storybook/core-events": "5.1.10", + "@storybook/router": "5.1.10", "common-tags": "^1.8.0", "core-js": "^3.0.1", "global": "^4.3.2", @@ -1393,14 +1382,14 @@ } }, "@storybook/addons": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.1.9.tgz", - "integrity": "sha512-1bavbcS/NiE65DwyKj8c0DmWmz9VekOinB+has2Pqt2bOffZoZwVnbmepcz9hH3GUyvp5fQBYbxTEmTDvF2lLA==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.1.10.tgz", + "integrity": "sha512-M9b2PCp9RZxDC6wL7vVt2SCKCGXrrEAOsdpMvU569yB1zoUPEiiqElVDwb91O2eAGPnmd2yjImp90kOpKUW0EA==", "dev": true, "requires": { - "@storybook/api": "5.1.9", - "@storybook/channels": "5.1.9", - "@storybook/client-logger": "5.1.9", + "@storybook/api": "5.1.10", + "@storybook/channels": "5.1.10", + "@storybook/client-logger": "5.1.10", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" @@ -1415,16 +1404,16 @@ } }, "@storybook/api": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.1.9.tgz", - "integrity": "sha512-d1HhpOkW+706/WJ9lP5nCqOrp/icvbm0o+6jFFOGJ35AW5O9D8vDBxzvgMEO45jjN4I+rtbcNHQCxshSbPvP9w==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.1.10.tgz", + "integrity": "sha512-YeZe/71zLMmgT95IMAEZOc9AwL6Y23mWvkZMwFbkokxS9+bU/qmVlQ0B9c3JBzO3OSs7sXaRqyP1o3QkQgVsiw==", "dev": true, "requires": { - "@storybook/channels": "5.1.9", - "@storybook/client-logger": "5.1.9", - "@storybook/core-events": "5.1.9", - "@storybook/router": "5.1.9", - "@storybook/theming": "5.1.9", + "@storybook/channels": "5.1.10", + "@storybook/client-logger": "5.1.10", + "@storybook/core-events": "5.1.10", + "@storybook/router": "5.1.10", + "@storybook/theming": "5.1.10", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -1448,13 +1437,13 @@ } }, "@storybook/channel-postmessage": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.1.9.tgz", - "integrity": "sha512-H71PsnDKW81eflOS48Lv9yK4O8AcoqXL6ohsWvLdrHWIBsH4zpjOIhdWHtmAaT3hyfMy+l49DQ+uCHLECEt55g==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.1.10.tgz", + "integrity": "sha512-kQZIwltN2cWDXluhCfdModFDK1LHV9ZhNQ1b/uD9vn1c65rQ9u7r4lRajCfS0X1dmAWqz48cBcEurAubNgmswg==", "dev": true, "requires": { - "@storybook/channels": "5.1.9", - "@storybook/client-logger": "5.1.9", + "@storybook/channels": "5.1.10", + "@storybook/client-logger": "5.1.10", "core-js": "^3.0.1", "global": "^4.3.2", "telejson": "^2.2.1" @@ -1469,9 +1458,9 @@ } }, "@storybook/channels": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.1.9.tgz", - "integrity": "sha512-R6i7859FsXgY9XFFErVe7gS37wGYpQEEWsO1LzUW7YptGuFTUa8yLgKkNkgfy7Zs61Xm+GiBq8PvS/CWxjotPw==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.1.10.tgz", + "integrity": "sha512-w7n/bV1BLu51KI1eLc75lN9H1ssBc3PZMXk88GkMiKyBVRzPlJA5ixnzH86qwYGReE0dhRpsgHXZ5XmoKaVmPA==", "dev": true, "requires": { "core-js": "^3.0.1" @@ -1486,15 +1475,15 @@ } }, "@storybook/client-api": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.1.9.tgz", - "integrity": "sha512-J5HDtOS7x5YRpF/CMiHdxywV5NIh1i/03Xh2RhG15lmPy87VStIGpLzhF71uCRPLEJinYelcjuXRNAJgRzUOlg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.1.10.tgz", + "integrity": "sha512-v2PqiNUhwDlVDLYL94f6LFjdYMToTpuwWh9aeqzt/4PAJUnIcA+2P8+qXiYdJTqQy/u7P72HFMlc9Ru4tl3QFg==", "dev": true, "requires": { - "@storybook/addons": "5.1.9", - "@storybook/client-logger": "5.1.9", - "@storybook/core-events": "5.1.9", - "@storybook/router": "5.1.9", + "@storybook/addons": "5.1.10", + "@storybook/client-logger": "5.1.10", + "@storybook/core-events": "5.1.10", + "@storybook/router": "5.1.10", "common-tags": "^1.8.0", "core-js": "^3.0.1", "eventemitter3": "^3.1.0", @@ -1529,9 +1518,9 @@ } }, "@storybook/client-logger": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.9.tgz", - "integrity": "sha512-1+Otcn0EFgWNviDPNCR5LtUViADlboz9fmpZc7UY7bgaY5FVNIUO01E4T43tO7fduiRZoEvdltwTuQRm260Vjw==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.10.tgz", + "integrity": "sha512-vB1NoFWRTgcERwodhbgoDwI00eqU8++nXI7GhMS1CY8haZaSp3gyKfHRWyfH+M+YjQuGBRUcvIk4gK6OtSrDOw==", "dev": true, "requires": { "core-js": "^3.0.1" @@ -1546,13 +1535,13 @@ } }, "@storybook/components": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.1.9.tgz", - "integrity": "sha512-F4xcRlifSAfqkuFWtCKRvQDahXyfWBWV2Wa+kYy4YGwEfm3kKtIHVlgdgARL22g9BdYpRFEOJ+42juOu5YvIeQ==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.1.10.tgz", + "integrity": "sha512-QUQeeQp1xNWiL4VlxFAea0kqn2zvBfmfPlUddOFO9lBhT6pVy0xYPjXjbTVWjVcYzZpyUNWw5GplqrR5jhlaCA==", "dev": true, "requires": { - "@storybook/client-logger": "5.1.9", - "@storybook/theming": "5.1.9", + "@storybook/client-logger": "5.1.10", + "@storybook/theming": "5.1.10", "core-js": "^3.0.1", "global": "^4.3.2", "markdown-to-jsx": "^6.9.1", @@ -1580,9 +1569,9 @@ } }, "@storybook/core": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.1.9.tgz", - "integrity": "sha512-P3aavCnl3Cl3WMXVERjQqnqV1Z8tN0tyOTqqiGb1fMxITSE8uZNvp33Dl0K3jr1PBl9trW+2t7eHH4h0sguLlQ==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.1.10.tgz", + "integrity": "sha512-zkNjufOFrLpFpmr73F/gaJh0W0vWqXIo5zrKvQt1LqmMeCU/v8MstHi4XidlK43UpeogfaXl5tjNCQDO/bd0Dw==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.3.3", @@ -1590,15 +1579,15 @@ "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-env": "^7.4.5", - "@storybook/addons": "5.1.9", - "@storybook/channel-postmessage": "5.1.9", - "@storybook/client-api": "5.1.9", - "@storybook/client-logger": "5.1.9", - "@storybook/core-events": "5.1.9", - "@storybook/node-logger": "5.1.9", - "@storybook/router": "5.1.9", - "@storybook/theming": "5.1.9", - "@storybook/ui": "5.1.9", + "@storybook/addons": "5.1.10", + "@storybook/channel-postmessage": "5.1.10", + "@storybook/client-api": "5.1.10", + "@storybook/client-logger": "5.1.10", + "@storybook/core-events": "5.1.10", + "@storybook/node-logger": "5.1.10", + "@storybook/router": "5.1.10", + "@storybook/theming": "5.1.10", + "@storybook/ui": "5.1.10", "airbnb-js-shims": "^1 || ^2", "autoprefixer": "^9.4.9", "babel-plugin-add-react-displayname": "^0.0.5", @@ -1780,9 +1769,9 @@ } }, "@storybook/core-events": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.1.9.tgz", - "integrity": "sha512-jHe2uyoLj9i6fntHtOj5azfGdLOb75LF0e1xXE8U2SX7Zp3uwbLAcfJ+dPStdc/q+f/wBiip3tH1dIjaNuUiMw==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.1.10.tgz", + "integrity": "sha512-Lvu/rNcgS+XCkQKSGdNpUSWjpFF9AOSHPXsvkwHbRwJYdMDn3FznlXfDUiubOWtsziXHB6vl3wkKDlH+ckb32Q==", "dev": true, "requires": { "core-js": "^3.0.1" @@ -1797,9 +1786,9 @@ } }, "@storybook/node-logger": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.1.9.tgz", - "integrity": "sha512-rcSuI5n53hDMHW83gl5TR0Yn885/i2XY0AzX1DsbTeGOl3x5LhrCSZsZWetKGcx7zsO4n7o5mQszLuN1JlyE8A==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.1.10.tgz", + "integrity": "sha512-Z4UKh7QBOboQhUF5S/dKOx3OWWCNZGwYu8HZa/O+P68+XnQDhuZCYwqWG49xFhZd0Jb0W9gdUL2mWJw5POG9PA==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -1824,9 +1813,9 @@ } }, "@storybook/router": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.1.9.tgz", - "integrity": "sha512-eAmeerE/OTIwCV7WBnb1BPINVN1GTSMsUXLNWpqSISuyWJ+NZAJlObFkvXoc57QSQlv0cvXlm1FMkmRt8ku1Hw==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.1.10.tgz", + "integrity": "sha512-BdG6/essPZFHCP2ewCG0gYFQfmuuTSHXAB5fd/rwxLSYj1IzNznC5OxkvnSaTr4rgoxxaW/z1hbN1NuA0ivlFA==", "dev": true, "requires": { "@reach/router": "^1.2.1", @@ -1845,14 +1834,14 @@ } }, "@storybook/theming": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.1.9.tgz", - "integrity": "sha512-4jIFJwTWVf9tsv27noLoFHlKC2Jl9DHV3q+rxGPU8bTNbufCu4oby82SboO5GAKuS3eu1cxL1YY9pYad9WxfHg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.1.10.tgz", + "integrity": "sha512-5cN1lmdVUwAR8U3T49Lfb8JW5RBvxBSPGZpUmbLGz1zi0tWBJgYXoGtw4RbTBjV9kCQOXkHGH12AsdDxHh931w==", "dev": true, "requires": { "@emotion/core": "^10.0.9", "@emotion/styled": "^10.0.7", - "@storybook/client-logger": "5.1.9", + "@storybook/client-logger": "5.1.10", "common-tags": "^1.8.0", "core-js": "^3.0.1", "deep-object-diff": "^1.1.0", @@ -1879,19 +1868,19 @@ } }, "@storybook/ui": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.1.9.tgz", - "integrity": "sha512-guzKv4VYM+06BzMXeO3QqlX0IwUHyeS6lwdPCL8Oy2V4Gi2IYHHiD6Hr1NgnBO18j9luxE38f4Ii7gEIzXMFbQ==", - "dev": true, - "requires": { - "@storybook/addons": "5.1.9", - "@storybook/api": "5.1.9", - "@storybook/channels": "5.1.9", - "@storybook/client-logger": "5.1.9", - "@storybook/components": "5.1.9", - "@storybook/core-events": "5.1.9", - "@storybook/router": "5.1.9", - "@storybook/theming": "5.1.9", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.1.10.tgz", + "integrity": "sha512-ezkoVtzoKh93z2wzkqVIqyrIzTkj8tizgAkoPa7mUAbLCxu6LErHITODQoyEiJWI4Epy3yU9GYXFWwT71hdwsA==", + "dev": true, + "requires": { + "@storybook/addons": "5.1.10", + "@storybook/api": "5.1.10", + "@storybook/channels": "5.1.10", + "@storybook/client-logger": "5.1.10", + "@storybook/components": "5.1.10", + "@storybook/core-events": "5.1.10", + "@storybook/router": "5.1.10", + "@storybook/theming": "5.1.10", "copy-to-clipboard": "^3.0.8", "core-js": "^3.0.1", "core-js-pure": "^3.0.1", @@ -1941,12 +1930,12 @@ } }, "@storybook/vue": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@storybook/vue/-/vue-5.1.9.tgz", - "integrity": "sha512-ssBQOHdArHFn/FXVsXqi+FiiSvnulux6CIjmaZTjWMgktDa1Hp7TWFN3rlYCM+WxO2KBtydK5AyRWd8+r9YelQ==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@storybook/vue/-/vue-5.1.10.tgz", + "integrity": "sha512-UeRbQ5bOWUTx5oBMfPf+ZtP5E5X74nFFhrkg0yNakohW6pLuTVoci/G8hDJ4wsjT7PgNjoE1/dggf4JKCU9tjA==", "dev": true, "requires": { - "@storybook/core": "5.1.9", + "@storybook/core": "5.1.10", "common-tags": "^1.8.0", "core-js": "^3.0.1", "global": "^4.3.2", @@ -2011,9 +2000,9 @@ "dev": true }, "@types/node": { - "version": "12.6.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", - "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", + "version": "12.6.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.9.tgz", + "integrity": "sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw==", "dev": true }, "@types/normalize-package-data": { @@ -2054,9 +2043,9 @@ "dev": true }, "tsutils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", - "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.1.tgz", + "integrity": "sha512-kiuZzD1uUA5DxGj/uxbde+ymp6VVdAxdzOIlAFbYKrPyla8/uiJ9JLBm1QsPhOm4Muj0/+cWEDP99yoCUcSl6Q==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -2206,9 +2195,9 @@ } }, "@vue/babel-preset-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0.tgz", - "integrity": "sha512-5CbDu/QHS+TtQNw5aYAffiMxBBB2Eo9+RJpS8X+6FJbdG5Rvc4TVipEqkrg0pJviWadNg7TEy0Uz4o7VNXeIZw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.0.tgz", + "integrity": "sha512-EeZ9gwEmu79B4A6LMLAw5cPCVYIcbKWgJgJafWtLzh1S+SgERUmTkVQ9Vx4k8zYBiCuxHK3XziZ3VJIMau7THA==", "dev": true, "requires": { "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", @@ -2216,7 +2205,7 @@ "@vue/babel-sugar-functional-vue": "^1.0.0", "@vue/babel-sugar-inject-h": "^1.0.0", "@vue/babel-sugar-v-model": "^1.0.0", - "@vue/babel-sugar-v-on": "^1.0.0" + "@vue/babel-sugar-v-on": "^1.1.0" } }, "@vue/babel-sugar-functional-vue": { @@ -2252,9 +2241,9 @@ } }, "@vue/babel-sugar-v-on": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0.tgz", - "integrity": "sha512-2aqJaDLKdSSGlxZU+GjFERaSNUaa6DQreV+V/K4W/6Lxj8520/r1lChWEa/zuAoPD2Vhy0D2QrqqO+I0D6CkKw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.0.tgz", + "integrity": "sha512-8DwAj/RLpmrDP4eZ3erJcKcyuLArLUYagNODTsSQrMdG5zmLJoFFtEjODfYRh/XxM2wXv9Wxe+HAB41FQxxwQA==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", @@ -2709,6 +2698,19 @@ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -2762,16 +2764,6 @@ "path-type": "^3.0.0" } }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "optional": true, - "requires": { - "esutils": "^2.0.2" - } - }, "eslint": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", @@ -2817,39 +2809,6 @@ "strip-json-comments": "~2.0.1", "table": "4.0.2", "text-table": "~0.2.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "optional": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true, - "optional": true - } } }, "eslint-plugin-vue": { @@ -2862,6 +2821,17 @@ "vue-eslint-parser": "^2.0.3" } }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "optional": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -2881,30 +2851,6 @@ "dev": true, "optional": true }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "optional": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "optional": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, "globby": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", @@ -2919,14 +2865,16 @@ "ignore": "^4.0.3", "pify": "^4.0.1", "slash": "^2.0.0" + }, + "dependencies": { + "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 + } } }, - "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 - }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -2993,13 +2941,6 @@ "util-deprecate": "~1.0.1" } }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true, - "optional": true - }, "schema-utils": { "version": "0.4.7", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", @@ -3008,6 +2949,32 @@ "requires": { "ajv": "^6.1.0", "ajv-keywords": "^3.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "semver": { @@ -3023,16 +2990,6 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3064,43 +3021,6 @@ "ansi-regex": "^3.0.0" } }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true, - "optional": true - } - } - }, "webpack": { "version": "4.28.4", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", @@ -3131,16 +3051,42 @@ "terser-webpack-plugin": "^1.1.0", "watchpack": "^1.5.0", "webpack-sources": "^1.3.0" - } - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "^0.5.1" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } } } @@ -4427,9 +4373,9 @@ } }, "@vue/preload-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-8VCoJeeH8tCkzhkpfOkt+abALQkS11OIHhte5MBzYaKMTqK0A3ZAKEUVAffsOklhEv7t0yrQt696Opnu9oAx+w==", "dev": true }, "@vue/test-utils": { @@ -4676,7 +4622,7 @@ }, "acorn-jsx": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "optional": true, @@ -4686,7 +4632,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true, "optional": true @@ -4723,9 +4669,9 @@ } }, "ag-grid-community": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-21.1.0.tgz", - "integrity": "sha512-giWg653lxihzRulz4tiiSAewaZVeSvA3GN+uIY5LEHfJ8Eb2FWbI2IZ1n+KMhnuvMy7936dOflTYm8m0sxXplA==" + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-21.1.1.tgz", + "integrity": "sha512-SYgNAe62zvG2CR1O8aEa/5lqDoh2lyNk1/2+nMXsY+rjjTqQgpuq0Zq/eJ43wbmvchgplt+H8alkj4a2pwa8vg==" }, "airbnb-js-shims": { "version": "2.2.0", @@ -5142,9 +5088,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -5412,7 +5358,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -5620,7 +5566,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -6485,15 +6430,16 @@ } }, "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", @@ -6666,9 +6612,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000985", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz", - "integrity": "sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w==", + "version": "1.0.30000988", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000988.tgz", + "integrity": "sha512-lPj3T8poYrRc/bniW5SQPND3GRtSrQdUM/R4mCYTbZxyi3jQiggLvZH4+BYUuX0t4TXjU+vMM7KFDQg+rSzZUQ==", "dev": true }, "capture-stack-trace": { @@ -7616,13 +7562,13 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "corejs-upgrade-webpack-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/corejs-upgrade-webpack-plugin/-/corejs-upgrade-webpack-plugin-2.1.0.tgz", - "integrity": "sha512-gc+S4t8VT9YFSgOPrhZlD6kDoGZtUq71QwXxS2neGNPhli0veKhbzzilODIpy73TjXGUrCHCpevK8vBnzUPuhw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/corejs-upgrade-webpack-plugin/-/corejs-upgrade-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-J0QMp9GNoiw91Kj/dkIQFZeiCXgXoja/Wlht1SPybxerBWh4NCmb0pOgCv61lrlQZETwvVVfAFAA3IqoEO9aqQ==", "dev": true, "requires": { "resolve-from": "^5.0.0", - "webpack": "^4.33.0" + "webpack": "^4.38.0" }, "dependencies": { "resolve-from": { @@ -7828,7 +7774,7 @@ }, "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true }, @@ -8412,7 +8358,7 @@ "dependencies": { "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } @@ -8491,7 +8437,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } @@ -8607,7 +8553,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -8812,10 +8757,11 @@ } }, "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "optional": true, "requires": { "esutils": "^2.0.2" } @@ -8836,13 +8782,21 @@ "dev": true }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } } }, "dom-walk": { @@ -8962,7 +8916,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "prepend-http": { @@ -9068,9 +9022,9 @@ "dev": true }, "electron": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/electron/-/electron-3.1.12.tgz", - "integrity": "sha512-3OfvhzD7gJlSKgsvKFxHNzZpG0rt8qwRqP07rSKKQU+TdLl7NkWAdWFVqhkebdj6QgnxOJffZDkosva67KZjRA==", + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/electron/-/electron-3.1.13.tgz", + "integrity": "sha512-aRNywoUSO1Va/lpU4nz3K6GDyFqYtlOnHGLcERAAHfhB+IJrJ34cUJW4FVBpm43AwvUdAeuCkVKRLtOmrgx5CA==", "dev": true, "requires": { "@types/node": "^10.1.4", @@ -9079,9 +9033,9 @@ }, "dependencies": { "@types/node": { - "version": "10.14.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.13.tgz", - "integrity": "sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==", + "version": "10.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.14.tgz", + "integrity": "sha512-xXD08vZsvpv4xptQXj1+ky22f7ZoKu5ZNI/4l+/BXG3X+XaeZsmaFbbTKuhSE3NjjvRuZFxFf9sQBMXIcZNFMQ==", "dev": true } } @@ -9147,9 +9101,9 @@ } }, "electron-to-chromium": { - "version": "1.3.199", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz", - "integrity": "sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA==", + "version": "1.3.211", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.211.tgz", + "integrity": "sha512-GZAiK3oHrs0K+LwH+HD+bdjZ17v40oQQdXbbd3dgrwgbENvazrGpcuIADSAREWnxzo9gADB1evuizrbXsnoU2Q==", "dev": true }, "elliptic": { @@ -9225,9 +9179,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true }, "env-paths": { @@ -9417,6 +9371,15 @@ "ms": "^2.1.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" + } + }, "espree": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", @@ -9428,6 +9391,26 @@ "eslint-visitor-keys": "^1.0.0" } }, + "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" + } + }, + "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" + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -9450,6 +9433,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -9462,6 +9451,17 @@ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "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" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -9470,6 +9470,27 @@ "requires": { "ansi-regex": "^3.0.0" } + }, + "table": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.5.tgz", + "integrity": "sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "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" + } } } }, @@ -9615,10 +9636,9 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -10092,12 +10112,14 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, + "optional": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-loader": { @@ -10290,14 +10312,16 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, + "optional": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" } }, "flatted": { @@ -11042,18 +11066,18 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", + "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", "dev": true, "requires": { - "define-properties": "^1.1.2", + "define-properties": "^1.1.3", "function-bind": "^1.1.1", - "is-callable": "^1.1.3" + "functions-have-names": "^1.1.1", + "is-callable": "^1.1.4" } }, "functional-red-black-tree": { @@ -11062,6 +11086,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "functions-have-names": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz", + "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", + "dev": true + }, "fuse.js": { "version": "3.4.5", "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.4.5.tgz", @@ -11112,7 +11142,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -11505,8 +11535,7 @@ "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, "has-to-string-tag-x": { "version": "1.4.1", @@ -11866,6 +11895,14 @@ "entities": "^1.1.1", "inherits": "^2.0.1", "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } } }, "http-cache-semantics": { @@ -12055,6 +12092,11 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "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==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12121,9 +12163,9 @@ } }, "inspecjs": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/inspecjs/-/inspecjs-0.0.3.tgz", - "integrity": "sha512-+IjfbeQjJPfvbfVciIAul8vLfg9ljnTon7kogPcHiZXrfODtjlb8vycvAC/jLmZ4oFzmnFGi7l64rMMn5zo96w==" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/inspecjs/-/inspecjs-0.1.0.tgz", + "integrity": "sha512-EQUfHLmuNovcfyUosRyKh+fdlJ9KnzryrppHuBYgXZpO8OrkJJ50jLd6l5lQl3LLYOh7+VH8BcSrHRLXBJDJTQ==" }, "internal-ip": { "version": "4.3.0", @@ -12734,8 +12776,7 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-xlsx": { "version": "0.8.22", @@ -13000,12 +13041,12 @@ } }, "lazy-universal-dotenv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.0.tgz", - "integrity": "sha512-Mbf5AeGOs74lE5BdQXHFJ7Rt383jxnWKNfW2EWL0Pibnhea5JRStRIiUpdTenyMxCGuCjlMpYQhhay1XZBSSQA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", + "integrity": "sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==", "dev": true, "requires": { - "@babel/runtime": "^7.0.0", + "@babel/runtime": "^7.5.0", "app-root-dir": "^1.0.2", "core-js": "^3.0.4", "dotenv": "^8.0.0", @@ -13074,7 +13115,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } @@ -13189,12 +13230,6 @@ "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -13526,9 +13561,9 @@ } }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", + "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", "dev": true }, "metalsmith": { @@ -13578,7 +13613,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -14746,9 +14781,9 @@ } }, "node-releases": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", - "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", "dev": true, "requires": { "semver": "^5.3.0" @@ -15337,8 +15372,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -15352,7 +15386,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -15685,14 +15718,14 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-json": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.4.0.tgz", - "integrity": "sha512-bd1T8OBG7hcvMd9c/udgv6u5v9wISP3Oyl9Cm7Weop8EFwrtcQDnS2sb6zhwqus2WslSr5wSTIPiTTpxxmPm7Q==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "requires": { "got": "^9.6.0", - "registry-auth-token": "^3.4.0", + "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", - "semver": "^6.1.1" + "semver": "^6.2.0" } }, "pako": { @@ -16053,9 +16086,9 @@ "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" }, "portal-vue": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.5.tgz", - "integrity": "sha512-vZmdMn0mOo7puvxoMQ5zju6S29aFD+9yygJxyWQtPaMXS9xunAeoYdnx6yzfL9J8HD8pMZYgSieEIbioAKhrSQ==" + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.6.tgz", + "integrity": "sha512-lvCF85D4e8whd0nN32D8FqKwwkk7nYUI3Ku8UAEx4Z1reomu75dv5evRUTZNaj1EalxxWNXiNl0EHRq36fG8WA==" }, "portfinder": { "version": "1.0.21", @@ -16990,9 +17023,9 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", - "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" }, "public-encrypt": { "version": "4.0.3", @@ -17178,9 +17211,9 @@ } }, "react-clientside-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.1.tgz", - "integrity": "sha512-foSwZatJak6r+F4OqJ8a+MOWcBi3jwa7/RPdJIDZI1Ck0dn/FJZkkFu7YK+SiZxsCZIrotolxHSobcnBHgIjfw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz", + "integrity": "sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A==", "dev": true, "requires": { "@babel/runtime": "^7.0.0" @@ -17595,7 +17628,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -17722,25 +17755,14 @@ } }, "refractor": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.9.0.tgz", - "integrity": "sha512-lCnCYvXpqd8hC7ksuvo516rz5q4NwzBbq0X5qjH5pxRfcQKiQxKZ8JctrSQmrR/7pcV2TRrs9TT+Whmq/wtluQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.10.0.tgz", + "integrity": "sha512-maW2ClIkm9IYruuFYGTqKzj+m31heq92wlheW4h7bOstP+gf8bocmMec+j7ljLcaB1CAID85LMB3moye31jH1g==", "dev": true, "requires": { "hastscript": "^5.0.0", "parse-entities": "^1.1.2", - "prismjs": "~1.16.0" - }, - "dependencies": { - "prismjs": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.16.0.tgz", - "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", - "dev": true, - "requires": { - "clipboard": "^2.0.0" - } - } + "prismjs": "~1.17.0" } }, "regenerate": { @@ -17825,10 +17847,11 @@ } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true, + "optional": true }, "regexpu-core": { "version": "4.5.4", @@ -17845,11 +17868,11 @@ } }, "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", + "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", "requires": { - "rc": "^1.1.6", + "rc": "^1.2.8", "safe-buffer": "^5.0.1" } }, @@ -17878,7 +17901,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -17916,7 +17939,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -18068,9 +18091,9 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -18509,9 +18532,9 @@ } }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "semver-compare": { "version": "1.0.0", @@ -18842,7 +18865,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -18858,13 +18881,12 @@ "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, + "optional": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -19051,9 +19073,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19103,9 +19125,9 @@ "dev": true }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -19332,9 +19354,9 @@ } }, "store2": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.7.1.tgz", - "integrity": "sha512-zzzP5ZY6QWumnAFV6kBRbS44pUMcpZBNER5DWUe1HETlaKXqLcCQxbNu6IHaKr1pUsjuhUGBdOy8sWKmMkL6pQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.8.0.tgz", + "integrity": "sha512-FBJpcOEZQLZBIGL4Yp7W5RgZ0ejaURmcfUjIpyOb64BpI8z/iJXw7zd/NTBeq304dVMxuWVDZEUUCGn7llaVrA==", "dev": true }, "stream-browserify": { @@ -19716,21 +19738,95 @@ } }, "table": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.4.tgz", - "integrity": "sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, + "optional": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "optional": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "tailwindcss": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.0.5.tgz", - "integrity": "sha512-e5edrSKqNOvWAVEutXN5czeJSXjQQxO7zNN4RDd5vQF/JTxnKdndcMFIC6p6YkRvcGFKPCZ/0rY1zZvPeq9V4A==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.0.6.tgz", + "integrity": "sha512-hhdvXpnlYNnxfZCpldMypSWRzgmoQbKBy3namGlsP0Gs+qM8EwF3DBVUPoq8wJYbBFjzrgatE4czWJ6f12Y9+Q==", "dev": true, "requires": { "autoprefixer": "^9.4.5", @@ -19830,9 +19926,9 @@ } }, "telejson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-2.2.1.tgz", - "integrity": "sha512-JtFAnITek+Z9t+uQjVl4Fxur9Z3Bi3flytBLc3KZVXmMUHLXdtAxiP0g8IBkHvKn1kQIYZC57IG0jjGH1s64HQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-2.2.2.tgz", + "integrity": "sha512-YyNwnKY0ilabOwYgC/J754En1xOe5PBIUIw+C9e0+5HjVVcnQE5/gdu2yET2pmSbp5bxIDqYNjvndj2PUkIiYA==", "dev": true, "requires": { "global": "^4.3.2", @@ -19840,7 +19936,7 @@ "is-regex": "^1.0.4", "is-symbol": "^1.0.2", "isobject": "^3.0.1", - "lodash.get": "^4.4.2", + "lodash": "^4.17.11", "memoizerific": "^1.11.3" } }, @@ -19863,19 +19959,18 @@ } }, "terser-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "requires": { - "cacache": "^11.3.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", - "loader-utils": "^1.2.3", "schema-utils": "^1.0.0", "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^4.0.0", - "webpack-sources": "^1.3.0", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" } }, @@ -20037,8 +20132,7 @@ "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 + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -20800,7 +20894,7 @@ }, "vue-eslint-parser": { "version": "2.0.3", - "resolved": "http://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==", "dev": true, "optional": true, @@ -21102,39 +21196,39 @@ "dev": true }, "webpack": { - "version": "4.36.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.36.1.tgz", - "integrity": "sha512-Ej01/N9W8DVyhEpeQnbUdGvOECw0L46FxS12cCOs8gSK7bhUlrbHRnWkjiXckGlHjUrmL89kDpTRIkUk6Y+fKg==", + "version": "4.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", + "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" } }, "webpack-bundle-analyzer": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", - "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz", + "integrity": "sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==", "dev": true, "requires": { "acorn": "^6.0.7", @@ -21146,7 +21240,7 @@ "express": "^4.16.3", "filesize": "^3.6.1", "gzip-size": "^5.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.15", "mkdirp": "^0.5.1", "opener": "^1.5.1", "ws": "^6.0.0" @@ -21383,7 +21477,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -21512,9 +21606,9 @@ } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.1.tgz", + "integrity": "sha512-XSz38193PTo/1csJabKaV4b53uRVotlMgqJXm3s3eje0Bu6gQTxYDqpD38CmQfDBA+gN+QqaGjasuC8I/7eW3Q==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -21707,10 +21801,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, + "optional": true, "requires": { "mkdirp": "^0.5.1" } diff --git a/package.json b/package.json index 7b3a4e0..808495d 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "datatables.net": "^1.10.19", "feather-icons": "^4.22.1", "file-saver": "^2.0.2", - "inspecjs": "^0.0.3", + "inspecjs": "0.1.0", "js-xlsx": "^0.8.22", "json-server": "^0.15.0", "material-icons": "^0.3.1", diff --git a/src/store/README.md b/src/store/README.md new file mode 100644 index 0000000..37a999a --- /dev/null +++ b/src/store/README.md @@ -0,0 +1,105 @@ +# How is inspec data read/stored? + +## FileReader Component + +The entry point to our data flow is the FileReader.vue component. +The file reader doesn't actually do any data handling of its own; it simply accepts files and routes them to an appropraite location. +In this case, it dispatches a "loadFile" action with the file as a payload. +This action is (currently) only handled by the report_intake.ts Vuex module. + +## Report Intake Module + +Upon receiving a "loadFile" action, the report intake attempts to read the file's text. +When the file is loaded, a callback is fired that attempts to read it as an Inspec data object. +This utilizes the InspecJS module's "convertFile" object which tries to match the provided text against every known Inspec output schema. +From here there are essentially three possible cases: + +### InspecJS does not recognize the schema. + +This can often happen with outdated versions of the Inspec client generating incompatible schema data. +Though the Inspec team hopes to eventually version the output, for now if you have this issue ensure Inspec is up to date. +A versioned schema would allow more backwards compatibility but for now this is out of our hands. + +Anyways, convertFile will throw an error. +There is little we can do at this point; the file simply isn't compatible, and we must inform the user of this error. + +### InspecJS recognizes the schema -- but we don't know what to do with it. + +The only case where this currently happens is if the data is in the JSON-MIN output format, in which controls are cut down to a very minimal dataform. +We might eventually add support for it, but for now we just error out. + +### InspecJS recognizes and successfully parses the schema. + +The success case! +We are left with either an ExecJSON or ProfileJSON object. + + - A ProfileJSON corresponds to the result of calling `inspec json `. + In essence, it is a "dry" run of a profile, containing only the controls but no results. + It also will not actually pull in any profile dependencies - only controls from this specific profile are loaded. + Note that this means the base code of overlayed controls will NOT be present. + At this point I am uncertain the exact extents of what is properly loaded and what isn't. + + - An ExecJSON corresponds to, as one might guess, the result of calling `inspec exec --reporter json`. + The primary difference between this and a Profile are simply that this will have results, and will also include profile dependencies. + +Since there are multipe versions of the schema, we may end up with a plethora of types to actually deal with. +Fortunately, since Execution/Profile data are for the most part identical across versions, we simply use the AnyExec, AnyProfile, and AnyControl union types to handle general cases. + +We bundle these into a dict with the structure designated by the `ExecutionFile` and `ProfileFile` data structures, as found in `data_store.ts`. +If you don't feel like looking, essentially these both contain a `unique_id` property and a `filename` property, as well as a property for ExecJSON data or ProfileJSON data, as appropriate. +Unique id just lets us uniquely referred to the file. +Think of it like a file handle in Unix - an arbitrary but unique number. +Filename is just that; a filename (string). +Finally, depending on the type, they have a `execution` or `profile`, as previously described. +Now, we build our additional data structures + +## Contextual Data + +Though we could theoretically at this point just use the data straight out of the ExecJSON/ProfileJSON items, that would be really annoying for several reasons.m + +- For one, any time you'd want a control you'd have to trawl through every Execution -> Profile(s) -> Control(s) item, as well as the Profile -> Controls (for ProfileJSON data). Gross! +- Looking up overlay data can become very expensive very quickly if not cached properly. +- Furthermore, it quickly becomes baffling as to what data is coming from where. +You have a control - great. What profile is it coming from? What platform was it run on? These require data from Profile and Execution objects. + +One solution would be to pass these as a bundled context of [AnyExec, AnyProfile, AnyControl], but this swiftly becomes unwieldy. +What if there is no Execution (in the case of a ProfileJSON file)? +Our type signature for a list of these things would end up looking like `Array<[null | AnyExec, AnyProfile, AnyControl]>` but I don't think anyone would be particularly happy with that. + +As our solution, we introduce the concept of a `ContextualizedItem` (see typing in data_store). +Essentially, a contextualized item is a simplified graph node wrapper around a type of data with the following elements: + - `data` is, self-evidently, the wrapped data. + - `sourced_from` is the object or resource from which a piece of data originates. A control is sourced from a Profile, a Profile an Execution or a File, etc. + - `contains` is the inverse edge of `sourced_from`. It is what a resource contains as its contextual descendants. + - `extends_from` is the set of objects that this data builds on. This is more explicitly used to relate Profiles by which overlays which. An overlay profile "extends_from" the base profile. Any controls modified by an overlay have an "extends" relationship with the base profile's corresponding control. + - `extended_by` is the inverse edge of `extends_from`. A base profile is "extended_by" its overlay. + +Contextualized Controls, Profiles, and Executions are accessible in three interconnected array getters in the data_store module. +They can be accessed as a group by the (private) method `getContextStore`, but are better accessed individually via getters `contextualExecutions`, `contextualProfiles`, and `contextualControls`. + +The old functionality for filtering still exists, but under a new name: `filteredProfiles` and `filteredControls`. +See the `Filter` type for possible filter values. + +# Examples / common problems and their solutions + +> I have a control; how do I know if another control overrides it in an overlay? + +Given a ContextualControl `ctrl`, you can check + if(ctrl.extended_by.length) {} + // It has been overridden! Access ctrl.extended_by to see which control has done so. + } + +> I plan on accessing \[data\] frequently, using some lookup criteria \[criteria\] and I need to be able to quickly access it! Add this to data_store please! + +No. +Haha just kidding. I mean the answer is still no, but only because this doesn't need to be in data_store! +It should instead go in a store module to keep things tidy. +As an example to work off of, see the `lookup_hashes.ts` module. +Any such module using getters will be handily kept up to date by Vuex, and separating them into modules makes it clearer what files are using what features. +The data_store module is already fairly crowded - compartmentalization is the best path forward! + + + + + + diff --git a/src/store/data_filters.ts b/src/store/data_filters.ts new file mode 100644 index 0000000..90097b8 --- /dev/null +++ b/src/store/data_filters.ts @@ -0,0 +1,113 @@ +import { Module, VuexModule, getModule } from "vuex-module-decorators"; +import DataModule, {ContextualizedProfile, ContextualizedControl, ContextualizedExecution} from "./data_store"; +import { ControlStatus, Severity, hdfWrapControl as hdf, HDFControl } from 'inspecjs'; +import { FileID, isInspecFile } from "./report_intake"; +import Store from "./store"; + +/** Contains common filters on data from the store. */ +export interface Filter { + // General + /** Which file these objects came from. Undefined => any */ + fromFile?: FileID; + + // Control specific + /** What status the controls can have. Undefined => any */ + status?: ControlStatus; + + /** What severity the controls can have. Undefined => any */ + severity?: Severity; + + /** Whether or not to allow/include overlayed controls */ + omit_overlayed_controls?: boolean; + + // Add more as necessary +} + +@Module({ + namespaced: true, + name: "filteredData", +}) +class FilteredDataModule extends VuexModule { + private get dataStore(): DataModule { + return getModule(DataModule, Store); + } + + /** + * Parameterized getter. + * Get all profiles from the specified file id. + */ + get profiles(): (filter: Filter) => ContextualizedProfile[] { + // const localCache: {[key: string]: Control[]} = {}; + // Establish to vue that we depend on this.contextStore + // let _depends: any = this.contextStore; + return (filter: Filter = {}) => { + // If there is no filter, just return all + if(filter.fromFile === undefined) { + return this.dataStore.contextualProfiles; + } + + // Initialize our list to add valid profiles to + let profiles: ContextualizedProfile[] = []; + + // Filter to those that match our filter. In this case that just means come from the right file id + this.dataStore.contextualProfiles.forEach(prof => { + if(isInspecFile(prof.sourced_from)) { + if(prof.sourced_from.unique_id === filter.fromFile) { + profiles.push(prof); + } + } else { + // Its a report; go two levels up to get its file + if(prof.sourced_from.sourced_from.unique_id === filter.fromFile) { + profiles.push(prof); + } + } + }); + + return profiles; + } + } + + /** + * Parameterized getter. + * Get all controls from all profiles from the specified file id. + */ + get controls(): (filter: Filter) => ContextualizedControl[] { + const localCache: {[key: string]: ContextualizedControl[]} = {}; + // Establish to vue that we depend on this.contextStore + let _depends: any = this.dataStore.contextStore; + return (filter: Filter = {}) => { + // Generate a hash. TODO: Make more efficient + let id = JSON.stringify(filter); + + // Check if we have this cached: + if(id in localCache) { + return [...localCache[id]]; + } + + // First get all of the profiles using the same filter + let controls = this.profiles(filter).flatMap(profile => profile.contains); + + // Filter by status, if necessary + if(filter.status !== undefined) { + controls = controls.filter(control => hdf(control.data).status === filter.status); + } + + // Filter by severity, if necessary + if(filter.severity !== undefined) { + controls = controls.filter(control => hdf(control.data).severity === filter.severity); + } + + // Filter by overlay + if(filter.omit_overlayed_controls) { + controls = controls.filter(control => control.extended_by.length === 0); + } + + // Save to cache + localCache[id] = controls; + return [...controls]; // Return a shallow copy + } + } +} + +export default FilteredDataModule; + diff --git a/src/store/data_store.ts b/src/store/data_store.ts index 9c964de..e6f7bff 100644 --- a/src/store/data_store.ts +++ b/src/store/data_store.ts @@ -3,138 +3,215 @@ */ import { Module, VuexModule, Mutation, Action } from "vuex-module-decorators"; -import { Control, Profile, InspecOutput } from "inspecjs"; +import { AnyExec as Execution, AnyProfile as Profile, AnyFullControl as Control, HDFControl } from "inspecjs"; +import { FileID, ExecutionFile, ProfileFile, InspecFile } from "./report_intake"; import Store from "./store"; -import { ControlStatus, ControlResult, Severity } from 'inspecjs/dist/types'; +import { ExecJSONProfile } from 'inspecjs/dist/generated-parsers/exec-json'; +/** + * Mixin type to express that this type wraps another data type to add additional fields, + * without modifying the inner type. + */ +interface WrapsType { + data: Data; +} -/** Each FileID corresponds to a unique File in this store */ -export type FileID = number +/** + * Mixin type to express that this type has some sort "parent". + * Sort of an inverse to the Contains mixin. + * E.g. A control is sourced from a profile, and an execution is from a file. + */ +interface Sourced { + sourced_from: From; +} -/** Represents the minimum data to represent an uploaded file handle. */ -export type InspecFile = { +/** + * Mixin type to express that this type has some sort of directional dependency-graph with members of a (usually the same) type. + * For instance, profiles overlay/are overlayed by profiles. + * Controls override behavior/are overrideen by other controls + */ +interface Extendable { /** - * Unique identifier for this file. Used to encode which file is currently selected, etc. - * - * Note that in general one can assume that if a file A is loaded AFTER a file B, then - * A.unique_id > B.unique_id. - * Using this property, one might order files by order in which they were added. + * What is this data extended by? + * E.g. a profile that overlays this profile. + * Can be empty. */ - unique_id: FileID, - /** The filename that this file was uploaded under. */ - filename: string + extended_by: By[]; + + /** + * What data is this node extending? + * E.g. is this overlaying a profile? Another control? + * Can be empty. + */ + extends_from: By[]; } -/** Represents a file containing an Inspec Report output */ -export type ReportFile = InspecFile & { report: InspecOutput }; -/** Represents a file containing an Inspec Profile (not run) */ -export type ProfileFile = InspecFile & { profile: Profile }; - -/** Represents the set of potential filters a */ -export interface Filter { - // General - /** Which file these objects came from. Undefined => any */ - fromFile?: FileID; - - // Control specific - /** What status the controls can have. Undefined => any */ - status?: ControlStatus; - - /** What severity the controls can have. Undefined => any */ - severity?: Severity; - - // Add more as necessary + +/** + * Mixin type to express that this type is primarily a parent to some other data. + * For instance, profiles are most directly a parent of controls . + * What objects/resources does this item contain? + */ +interface Contains { + contains: Item; } +// Create our three primary data types from the above mixins +export interface ContextualizedExecution extends WrapsType, + Sourced, + Contains { } +export interface ContextualizedProfile extends WrapsType, + Sourced, + Contains, + Extendable { } +export interface ContextualizedControl extends WrapsType, + Sourced, + Extendable { } + @Module({ namespaced: true, name: "data", }) class InspecDataModule extends VuexModule { - /** State var containing all report files that have been added */ - reportFiles: ReportFile[] = []; + /** State var containing all execution files that have been added */ + executionFiles: ExecutionFile[] = []; /** State var containing all profile files that have been added */ profileFiles: ProfileFile[] = []; /** Return all of the files that we currently have. */ - get allFiles(): (ReportFile | ProfileFile)[] { - let result: (ReportFile | ProfileFile)[] = []; - result.push(...this.reportFiles); + get allFiles(): (ExecutionFile | ProfileFile)[] { + let result: (ExecutionFile | ProfileFile)[] = []; + result.push(...this.executionFiles); result.push(...this.profileFiles); return result; } - /** - * Parameterized getter. - * Get all profiles from the specified file id. + /** + * Recompute all contextual data */ - get allProfiles(): (filter: Filter) => Profile[] { - return (filter: Filter = {}) => { - // Initialize our lists - let profiles: Profile[] = []; - - // First find the relevant profile files - let profileFiles = this.profileFiles; - // Filter unmatching files - if(filter.fromFile !== undefined) { - let profileFiles = this.profileFiles.filter(file => file.unique_id === filter.fromFile); - } - // Add them all to the list - profiles.push(...profileFiles.map(f => f.profile)); - - // Next go to the report files - let reportFiles = this.reportFiles; - // Filter unmatching files - if(filter.fromFile !== undefined) { - reportFiles = reportFiles.filter(file => file.unique_id === filter.fromFile); - } - // Add each of their profiles to the list - profiles.push(...reportFiles.flatMap(f => f.report.profiles)); - - // Return the result - return profiles; - } + get contextStore(): [ContextualizedExecution[], ContextualizedProfile[], ContextualizedControl[]] { + // Initialize all our arrays + let executions: ContextualizedExecution[] = []; + let profiles: ContextualizedProfile[] = []; + let controls: ContextualizedControl[] = []; + + // First thing: initialize all of our data + this.executionFiles.forEach(exec_file => { + // Save the execution, initially empty and unrelated + let exec_file_context: ContextualizedExecution = { + data: exec_file.execution, + sourced_from: exec_file, + contains: [], + }; + executions.push(exec_file_context); + + // Save its profiles, again initially empty BUT related mutually to their containing execution + exec_file.execution.profiles.forEach(exec_files_profile => { + let exec_files_profile_context: ContextualizedProfile = { + data: exec_files_profile, + sourced_from: exec_file_context, + extended_by: [], + extends_from: [], + contains: [] + }; + profiles.push(exec_files_profile_context); + + // Add it to our parent + exec_file_context.contains.push(exec_files_profile_context); + }); + + // After our initial save of profiles, we go over them _again_ to establish parentage/dependency + exec_file_context.contains.forEach(exec_files_profile => { + // We know these are from a report; label as such + let as_exec = exec_files_profile.data as ExecJSONProfile; + // If it has a parent profile then we link them by extendedby/extendsfrom + if(as_exec.parent_profile !== undefined) { + // Look it up + let parent = exec_file_context.contains.find(p => p.data.name === as_exec.parent_profile); + + // Link it up + if(parent) { + parent.extended_by.push(exec_files_profile); + exec_files_profile.extends_from.push(parent); + } else { + console.warn(`Warning: Unable to find parent profile for profile ${as_exec.name} in spite of its attribute parent_profile: ${as_exec.parent_profile}. Verify data is properly structured`); + } + } + }); + }); + + // Now we handle the independent profile (IE those in their own files, generated by inspec json). + // These are slightly simpler because they do not actually include their overlays (even if they depend on them) + // as a separate data structure. + this.profileFiles.forEach(profile_file => { + let profile_file_context: ContextualizedProfile = { + data: profile_file.profile, + sourced_from: profile_file, + extended_by: [], + extends_from: [], + contains: [], + }; + profiles.push(profile_file_context); + }); + + // At this point all executions/profiles are in, but none of their controls are. + // Add them first, establishing the parent/child relationship while we do so + profiles.forEach(profile_context => { + profile_context.data.controls.forEach(profile_control => { + let profile_control_context: ContextualizedControl = { + data: profile_control, + sourced_from: profile_context, + extended_by: [], + extends_from: [], + }; + profile_context.contains.push(profile_control_context); + controls.push(profile_control_context); + }); + }); + + // Now one final step: pair up controls by their overlays. + controls.forEach(control_context => { + // We only care about controls who's profiles extend another profile. + // What about if it is extended? Doesn't matter; handled elsewhere. + let this_id = control_context.data.id; + let parent_profile = control_context.sourced_from; + parent_profile.extends_from.forEach(overlayed_profile => { + // We want to find a control in overlayed_profile with the same id as + let matching_control = overlayed_profile.contains.find(cc => cc.data.id === this_id); + if(matching_control !== undefined) { + // We've found one; interlink + matching_control.extended_by.push(control_context); + control_context.extends_from.push(matching_control); + } + }); + }); + + return [executions, profiles, controls]; } - /** - * Parameterized getter. - * Get all controls from all profiles from the specified file id. + /** + * Get executions as contextual items */ - get allControls(): (filter: Filter) => Control[] { - const localCache: {[key: string]: Control[]} = {}; - let _depends: (ReportFile[] | ProfileFile[])[] = [this.profileFiles, this.reportFiles]; - return (filter: Filter = {}) => { - // Generate a hash. TODO: Make more efficient - let id = JSON.stringify(filter); - - // Check if we have this cached: - if(id in localCache) { - return [...localCache[id]]; - } - - // First get all of the profiles using the same filter - let controls = this.allProfiles(filter).flatMap(profile => profile.controls); - - // Filter by status, if necessary - if(filter.status !== undefined) { - controls = controls.filter(control => control.status === filter.status); - } - - // Filter by severity, if necessary - if(filter.severity !== undefined) { - controls = controls.filter(control => control.severity === filter.severity); - } - - // Save to cache - // localCache[id] = controls; - - return [...controls]; // Return a shallow copy - } + get contextualExecutions(): ContextualizedExecution[] { + return this.contextStore[0]; + } + + /** + * Get overlay profiles, etc. + */ + get contextualProfiles(): ContextualizedProfile[] { + return this.contextStore[1]; + } + + /** + * Get overlayed controls, etc. + */ + get contextualControls(): ContextualizedControl[] { + return this.contextStore[2]; } /** * Yields a guaranteed currently free file ID - * TODO: Verify stability under async */ get nextFreeFileID(): FileID { let currentMax = 0; @@ -155,12 +232,12 @@ class InspecDataModule extends VuexModule { } /** - * Adds a report file to the store - * @param newReport The report to add + * Adds an execution file to the store. + * @param newExecution The execution to add */ @Mutation - addReport(newReport: ReportFile) { - this.reportFiles.push(newReport); + addExecution(newExecution: ExecutionFile) { + this.executionFiles.push(newExecution); } /** @@ -169,7 +246,7 @@ class InspecDataModule extends VuexModule { @Mutation reset() { this.profileFiles = []; - this.reportFiles = []; + this.executionFiles = []; } } diff --git a/src/store/lookup_hashes.ts b/src/store/lookup_hashes.ts new file mode 100644 index 0000000..31340ea --- /dev/null +++ b/src/store/lookup_hashes.ts @@ -0,0 +1,36 @@ +import { Module, VuexModule, getModule } from "vuex-module-decorators"; +import DataModule, {ContextualizedControl} from "./data_store"; +import Store from "./store"; + +@Module({ + namespaced: true, + name: "lookup", +}) +class HashLookupModule extends VuexModule { + private get dataStore(): DataModule { + return getModule(DataModule, Store); + } + + /** + * Returns a hash of all controls keyed by their ids + */ + get controls(): {[key:string]: ContextualizedControl[]} { + // Make the hash + const final: {[key:string]: ContextualizedControl[]} = {}; + + // Add every control to it. + this.dataStore.contextualControls.forEach(c => { + if(c.data.id in final) { + final[c.data.id].push(c); + } else { + final[c.data.id] = [c]; + } + }); + + // Return + return final; + } +} + +export default HashLookupModule; + diff --git a/src/store/report_intake.ts b/src/store/report_intake.ts index 1adc1f0..37e9c0a 100644 --- a/src/store/report_intake.ts +++ b/src/store/report_intake.ts @@ -2,11 +2,39 @@ * Counts the severities of controls. */ -import { InspecOutput, Profile, Control } from "inspecjs"; +import { convertFile, ConversionResult } from "inspecjs"; import { Module, VuexModule, getModule, Action } from "vuex-module-decorators"; -import DataModule, { FileID } from "./data_store"; +import { AnyExec, AnyProfile, AnyFullControl } from "inspecjs"; +import DataModule from "./data_store"; import Store from "./store"; + +/** Each FileID corresponds to a unique File in this store */ +export type FileID = number; + +/** Represents the minimum data to represent an uploaded file handle. */ +export type InspecFile = { + /** + * Unique identifier for this file. Used to encode which file is currently selected, etc. + * + * Note that in general one can assume that if a file A is loaded AFTER a file B, then + * A.unique_id > B.unique_id. + * Using this property, one might order files by order in which they were added. + */ + unique_id: FileID, + /** The filename that this file was uploaded under. */ + filename: string +} +export function isInspecFile(f: any): f is InspecFile { + const t = f as InspecFile; + return t.filename !== undefined && t.unique_id !== undefined; +} + +/** Represents a file containing an Inspec Execution output */ +export type ExecutionFile = InspecFile & { execution: AnyExec }; +/** Represents a file containing an Inspec Profile (not run) */ +export type ProfileFile = InspecFile & { profile: AnyProfile }; + export type LoadOptions = { /** The file to load */ file: File; @@ -30,45 +58,51 @@ class InspecIntakeModule extends VuexModule { // Setup the callback reader.onload = (event: ProgressEvent) => { // Get our text - let text = reader.result as string; - - // Parse as json - let json = JSON.parse(text); - - // TODO: Verify that no errors occurred + const text = reader.result as string; // Fetch our data store - let data = getModule(DataModule, Store); + const data = getModule(DataModule, Store); // Retrieve common elements for either case (profile or report) - let filename = options.file.name; + const filename = options.file.name; + + // Convert it + let result: ConversionResult; + try { + result = convertFile(text); + } catch(e) { + console.log(`Failed to convert file ${filename} due to error "${e}". We should display this as an error modal.`); + return; + } // Determine what sort of file we (hopefully) have, then add it - if("profiles" in json) { - // It must be a report - let report = Object.freeze(new InspecOutput(json)); + if(result["1_0_ExecJson"]) { + // Handle as exec + let execution = result["1_0_ExecJson"]; + execution = Object.freeze(execution); let reportFile = { unique_id: options.unique_id, filename, - report, + execution, } - data.addReport(reportFile); - } else { - // It must be a profile - let profile = Object.freeze(new Profile(null, json)); + data.addExecution(reportFile); + } else if(result["1_0_ProfileJson"]) { + // Handle as profile + let profile = result["1_0_ProfileJson"]; let profileFile = { unique_id: options.unique_id, filename, profile } data.addProfile(profileFile); + } else { + console.log(`Unhandled file type ${Object.keys(result)}`); } - } // Dispatch the read reader.readAsText(options.file); - } + } } export default InspecIntakeModule; diff --git a/src/store/severity_counts.ts b/src/store/severity_counts.ts index 4d30c86..1177c4a 100644 --- a/src/store/severity_counts.ts +++ b/src/store/severity_counts.ts @@ -3,9 +3,9 @@ */ import { Module, VuexModule, getModule } from "vuex-module-decorators"; -import DataModule, {Filter} from "./data_store"; +import FilteredData, {Filter} from "./data_filters"; import Store from "./store"; -import { Severity } from 'inspecjs/dist/types'; +import { Severity, hdfWrapControl } from 'inspecjs'; // Helper function for counting a severity in a list of controls function countSeverity(filter: Filter, severity: Severity): number { @@ -15,11 +15,11 @@ function countSeverity(filter: Filter, severity: Severity): number { } // Get the controls - let data = getModule(DataModule, Store); - let controls = data.allControls(filter); + let data = getModule(FilteredData, Store); + let controls = data.controls(filter); // Refine our filter to the severity, and return length - return controls.filter(c => c.severity === severity).length; + return controls.filter(c => hdfWrapControl(c.data).severity === severity).length; } @Module({ diff --git a/src/store/sidebar.ts b/src/store/sidebar.ts index 52c5ee3..4ea8354 100644 --- a/src/store/sidebar.ts +++ b/src/store/sidebar.ts @@ -3,11 +3,10 @@ */ import { Module, VuexModule, Mutation, Action, getModule } from "vuex-module-decorators"; -import { Control, Profile, InspecOutput } from "inspecjs"; import Store from "./store"; import DataStore from "./data_store"; import router from "../../src/router.js"; -import { InspecFile } from "./data_store"; +import { InspecFile } from "./report_intake"; type SidebarItem = { /** Router path */ @@ -73,7 +72,7 @@ class SidebarModule extends VuexModule { // Convert all other open files to sidebar options let data = getModule(DataStore, Store); - let reportOptions = data.reportFiles.map(makeFileItem); + let reportOptions = data.executionFiles.map(makeFileItem); let profileOptions = data.profileFiles.map(makeFileItem); let submenu: SidebarItem[] = [allResults, ...reportOptions, ...profileOptions]; diff --git a/src/store/status_counts.ts b/src/store/status_counts.ts index 9acbe5b..910c916 100644 --- a/src/store/status_counts.ts +++ b/src/store/status_counts.ts @@ -3,9 +3,9 @@ */ import { Module, VuexModule, getModule } from "vuex-module-decorators"; -import DataModule, {Filter} from "./data_store"; +import FilteredData, {Filter} from "./data_filters"; import Store from "./store"; -import { ControlStatus } from 'inspecjs/dist/types'; +import { ControlStatus, hdfWrapControl } from 'inspecjs'; // Helper function for counting a status in a list of controls function countStatus(filter: Filter, status: ControlStatus): number { @@ -15,11 +15,11 @@ function countStatus(filter: Filter, status: ControlStatus): number { } // Get the controls - let data = getModule(DataModule, Store); - let controls = data.allControls(filter); + let data = getModule(FilteredData, Store); + let controls = data.controls(filter); // Refine our filter to the severity, and return length - return controls.filter(c => c.status === status).length; + return controls.filter(c => hdfWrapControl(c.data).status === status).length; } @Module({ @@ -46,6 +46,14 @@ class StatusCountModule extends VuexModule { get profileError(): (filter: Filter) => number { return (filter) => countStatus(filter, "Profile Error"); } + + get fromProfile(): (filter: Filter) => number { + return (filter) => countStatus(filter, "From Profile") + } + + get noData(): (filter: Filter) => number { + return (filter) => countStatus(filter, "No Data"); + } } export default StatusCountModule; diff --git a/src/store/store.ts b/src/store/store.ts index 9c9548b..29a8f15 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -1,6 +1,8 @@ import Vue from "vue"; import Vuex from "vuex"; import Data from "./data_store"; +import Filtered from "./data_filters"; +import Lookup from "./lookup_hashes"; import Theme from "./theme"; import SeverityCounts from "./severity_counts"; import Sidebar from "./sidebar"; @@ -26,12 +28,15 @@ Vue.use(Vuex); const store = new Vuex.Store({ modules: { data: Data, + filteredData: Filtered, theme: Theme, statusCounts: StatusCounts, severityCounts: SeverityCounts, + lookup: Lookup, intake: Intake, sidebar: Sidebar }, }); +console.log(store); export default store; diff --git a/src/views/results.vue b/src/views/results.vue index cea6178..8f7c813 100755 --- a/src/views/results.vue +++ b/src/views/results.vue @@ -113,12 +113,13 @@ export default { }, /** Construct a filter object that matches the current file(s) */ fileFilter() { + // We don't want overlays! Ever! + let base = { omit_overlayed_controls: true }; if(this.$route.params.id !== undefined) { // If theres an id, set it as the filter - return { fromFile: parseInt(this.$route.params.id) }; - } else { - return {}; - } + base.fromFile = parseInt(this.$route.params.id); + } + return base; }, /** Construct a filter dict based on current status/severity selections (on top of file filters) */ filter(){