diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4799e..8d01f73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.4.0 (20-01-2019) + +* Updated `discovery` to `1.0.0-beta.6` +* New feature "View Presets". Now you can preset custom view for any host you need. + ## 1.3.0 (26-12-2018) * Updated `discovery` (new stunning `jora` suggestions on report page) diff --git a/core/settings.ejs b/core/settings.ejs index d3f02ae..3e0be03 100644 --- a/core/settings.ejs +++ b/core/settings.ejs @@ -4,18 +4,20 @@ <%= htmlWebpackPlugin.options.title %> -

Settings

- Expand level + Expand level +
+
+

Presets:

+
+
+
    +
diff --git a/package-lock.json b/package-lock.json index 64f6377..59f2d90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "jsondiscovery", - "version": "1.3.0", + "version": "1.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -146,9 +146,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -166,9 +166,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -421,9 +421,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -441,9 +441,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -564,9 +564,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -718,9 +718,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -738,9 +738,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -957,9 +957,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1157,9 +1157,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1177,9 +1177,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -1340,9 +1340,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1360,9 +1360,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -1462,9 +1462,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1627,9 +1627,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1647,9 +1647,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -1809,9 +1809,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1829,9 +1829,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -2178,9 +2178,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2189,9 +2189,9 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "js-tokens": { @@ -2393,9 +2393,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2699,32 +2699,32 @@ }, "dependencies": { "browserslist": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.6.tgz", - "integrity": "sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", + "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000921", - "electron-to-chromium": "^1.3.92", - "node-releases": "^1.1.1" + "caniuse-lite": "^1.0.30000929", + "electron-to-chromium": "^1.3.103", + "node-releases": "^1.1.3" } }, "caniuse-lite": { - "version": "1.0.30000923", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz", - "integrity": "sha512-j5ur7eeluOFjjPUkydtXP4KFAsmH3XaQNch5tvWSO+dLHYt5PE+VgJZLWtbVOodfWij6m6zas28T4gB/cLYq1w==", + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", "dev": true }, "electron-to-chromium": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz", - "integrity": "sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q==", + "version": "1.3.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz", + "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==", "dev": true }, "node-releases": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.2.tgz", - "integrity": "sha512-j1gEV/zX821yxdWp/1vBMN0pSUjuH9oGUdLCb4PfUko6ZW7KdRs3Z+QGGwDUhYtSpQvdVVyLd2V0YvLsmdg5jQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", "dev": true, "requires": { "semver": "^5.3.0" @@ -2819,9 +2819,9 @@ } }, "@discoveryjs/discovery": { - "version": "1.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/discovery/-/discovery-1.0.0-beta.5.tgz", - "integrity": "sha512-hKqT33c3Q2DBWX/Qe/MVb/SmOjzF+jFECJfgloKW4aRpk9Kqj+tXIjxjTU2pE+4xAvHlQouvy5rdbGE8SNBMfw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/discovery/-/discovery-1.0.0-beta.6.tgz", + "integrity": "sha512-n8FQLggpBl1h6Zhe3OHW4uByrFbzX2weoc14ukIQ8/hlnbEVGoZLviOVJ8VQOA4YsFl856MX6iKugJ9gM8q6Qg==", "dev": true, "requires": { "@babel/core": "^7.1.6", @@ -3120,9 +3120,9 @@ }, "dependencies": { "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", "dev": true }, "acorn-dynamic-import": { @@ -4322,7 +4322,7 @@ }, "browser-pack": { "version": "6.1.0", - "resolved": "http://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "dev": true, "requires": { @@ -4345,7 +4345,7 @@ "dependencies": { "resolve": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true } @@ -4421,7 +4421,7 @@ }, "timers-browserify": { "version": "1.4.2", - "resolved": "http://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", "dev": true, "requires": { @@ -6061,7 +6061,7 @@ }, "deps-sort": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", "dev": true, "requires": { @@ -6104,7 +6104,7 @@ }, "detective": { "version": "5.1.0", - "resolved": "http://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", "dev": true, "requires": { @@ -8909,9 +8909,9 @@ } }, "js-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", - "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, "js-tokens": { @@ -9058,7 +9058,7 @@ }, "labeled-stream-splicer": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", "dev": true, "requires": { @@ -13265,7 +13265,7 @@ }, "stream-splicer": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", "dev": true, "requires": { @@ -13505,7 +13505,7 @@ }, "syntax-error": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dev": true, "requires": { @@ -13974,7 +13974,7 @@ }, "underscore": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", "integrity": "sha1-QLq4S60Z0jAJbo1u9ii/8FXYPbA=", "dev": true }, diff --git a/package.json b/package.json index 9f513e7..8e79cf8 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,17 @@ { "name": "jsondiscovery", - "version": "1.3.0", + "version": "1.4.0", "description": "DiscoveryJson", "author": "exsdis@gmail.com", "license": "MIT", "private": false, - "dependencies": {}, "scripts": { "lint": "eslint --ext .js src core", "dev": "webpack --config ./core/webpack.dev.js --hide-modules", "build": "rimraf build && webpack --config ./core/webpack.prod.js -p --progress --hide-modules --colors --info-verbosity verbose && node core/zip.js" }, "devDependencies": { - "@discoveryjs/discovery": "^1.0.0-beta.5", + "@discoveryjs/discovery": "^1.0.0-beta.6", "archiver": "^2.1.0", "babel-core": "^6.26.0", "babel-eslint": "^8.0.1", @@ -23,6 +22,7 @@ "buble": "^0.16.0", "buble-loader": "^0.4.1", "clean-webpack-plugin": "^0.1.19", + "codemirror": "^5.42.2", "copy-webpack-plugin": "^4.5.4", "cross-env": "^5.1.0", "css-loader": "^1.0.1", diff --git a/src/content/index.js b/src/content/index.js index 65164da..0fe79f9 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -10,7 +10,9 @@ require('./index.css'); * @returns {Discovery} */ function initDiscovery(settings) { - const discovery = new Widget(document.body); + const discovery = new Widget(document.body, { + viewPresets: settings.viewPresets || [] + }); discovery.apply(router); discovery.apply(complexViews); diff --git a/src/content/inject.js b/src/content/inject.js index 2be672f..3bdd654 100644 --- a/src/content/inject.js +++ b/src/content/inject.js @@ -4,7 +4,8 @@ */ function getSettings(cb) { chrome.storage.sync.get({ - expandLevel: 3 + expandLevel: 3, + viewPresets: [] }, settings => { cb(settings); }); @@ -48,6 +49,20 @@ if (json) { iframe.addEventListener('load', () => { getSettings(settings => { + let viewPresets = []; + + for (const item of settings.viewPresets) { + const { host, presets } = item; + + const hostRe = new RegExp(host); + + if (hostRe.test(document.location.toString())) { + viewPresets = viewPresets.concat(presets); + } + } + + settings.viewPresets = viewPresets; + iframe.contentWindow.postMessage({ json, raw, diff --git a/src/manifest.js b/src/manifest.js index a906ac2..286c2fc 100644 --- a/src/manifest.js +++ b/src/manifest.js @@ -11,7 +11,7 @@ module.exports = { ], options_ui: { // eslint-disable-line camelcase page: 'pages/settings.html', - chrome_style: true, // eslint-disable-line camelcase + chrome_style: false, // eslint-disable-line camelcase open_in_tab: false // eslint-disable-line camelcase }, content_scripts: [{ // eslint-disable-line camelcase diff --git a/src/settings.css b/src/settings.css new file mode 100644 index 0000000..eb7618c --- /dev/null +++ b/src/settings.css @@ -0,0 +1,89 @@ +body { + font-family: Tahoma,Verdana,Arial,sans-serif; + font-size: 14px; + line-height: 1.6; +} + +*:focus { + outline: none; +} + +h2 button { + margin-left: 10px; +} + +.row { + margin-bottom: 10px; +} + +#status.error { + color: red; +} + +button, input[type=submit] { + display: inline-block; + vertical-align: middle; + padding: 4px 24px; + border-radius: 4px; + border: none; + background: #0af; + color: #fff; + font: inherit; + cursor: pointer; +} + +input[type=text], input[type=number] { + display: inline-block; + vertical-align: middle; + width: 300px; + border: 1px solid #aaa; + border-radius: 4px; + height: 28px; + margin-right: 10px; + padding: 0 6px 0 6px; +} + +input[type=text]:focus, input[type=number]:focus { + border-color: #0af; + box-shadow: 0 0 1px 3px rgba(0,170,255,.2),inset 0 1px 1px hsla(0,0%,55.7%,.2) !important; +} + +input.error, textarea.error, #presets .CodeMirror.error { + border: 1px solid red; +} + +ul ul { + margin-top: 10px; +} + +li { + margin-bottom: 10px; +} + +#presets .CodeMirror { + width: 446px; + height: auto; + padding: 4px 8px; + margin-top: 10px; + font-family: Consolas, Monaco, monospace; + font-size: 12px; + border: 1px solid #aaa; + border-radius: 3px; + box-shadow: inset 0 1px 1px rgba(142, 142, 142, .2); +} + +#presets .CodeMirror-scroll { + min-height: 6.5em; + cursor: text; +} + +#presets .CodeMirror-focused { + border-color: #0af; + box-shadow: 0 0 1px 3px rgba(0, 170, 255, .2), inset 0 1px 1px rgba(142, 142, 142, .2) !important; +} + +#presets .CodeMirror-cursor { + border-left: 1px solid black; + background: none; + width: 0; +} diff --git a/src/settings.js b/src/settings.js index dff29b3..4b2adeb 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1,34 +1,253 @@ +const CodeMirror = require('codemirror'); + +require('codemirror/lib/codemirror.css'); +require('codemirror/theme/neo.css'); +require('./settings.css'); + const settingsForm = document.getElementById('settings-form'); const expand = document.getElementById('expand'); +const addHost = document.getElementById('add-host'); +const presetsNode = document.getElementById('presets'); const save = document.getElementById('save'); const status = document.getElementById('status'); +const errors = new Set(); + +const examplePresets = [ + { + host: '*', + presets: [{ name: 'table', content: '"table"' }] + } +]; + +/** + * Creates preset node + * @param {Object} preset + * @param {HTMLElement} parentNode + */ +function createPresetNode(preset, parentNode) { + const { name, content } = preset; + const presetNode = document.createElement('li'); + const presetInput = document.createElement('input'); + const presetTextarea = document.createElement('textarea'); + const removePreset = document.createElement('button'); + + presetNode.classList.add('preset-item'); + + presetInput.value = name; + presetInput.type = 'text'; + presetInput.placeholder = 'Preset Name'; + presetInput.classList.add('preset-name'); + presetTextarea.textContent = content; + + removePreset.innerHTML = 'Remove preset'; + + removePreset.addEventListener('click', () => { + parentNode.removeChild(presetNode); + }); + + presetNode.appendChild(presetInput); + presetNode.appendChild(removePreset); + presetNode.appendChild(presetTextarea); + + const editor = CodeMirror.fromTextArea(presetTextarea, { + mode: { name: 'javascript', json: true }, + theme: 'neo' + }); + + editor.getWrapperElement().classList.add('preset-content'); + + presetTextarea.dataset.editor = editor; + + editor.on('change', codemirror => { + presetTextarea.textContent = codemirror.getValue(); + }); + + const { editors = [] } = parentNode; + + editors.push(editor); + + parentNode.editors = editors; + + parentNode.appendChild(presetNode); +} + +/** + * Creates host preset node + * @param {Object} hostPreset + */ +function createHostPresetNode(hostPreset) { + const { host, presets = [] } = hostPreset; + const presetNode = document.createElement('li'); + const removeHost = document.createElement('button'); + const hostInput = document.createElement('input'); + const presetsList = document.createElement('ul'); + + presetNode.classList.add('preset'); + + hostInput.type = 'text'; + hostInput.value = host; + hostInput.placeholder = 'Preset Host (RegExp)'; + hostInput.classList.add('preset-host'); + removeHost.innerHTML = 'Remove host'; + + removeHost.addEventListener('click', () => { + presetsNode.removeChild(presetNode); + }); + + presets.forEach(el => createPresetNode(el, presetsList)); + + presetNode.appendChild(hostInput); + presetNode.appendChild(removeHost); + presetNode.appendChild(presetsList); + presetsNode.appendChild(presetNode); + + if (presetsList.editors) { + presetsList.editors.forEach(editor => editor.refresh()); + } + + const addPreset = document.createElement('button'); + + addPreset.innerHTML = 'Add Preset'; + + addPreset.addEventListener('click', () => { + createPresetNode({ name: '', content: '""' }, presetsList); + + if (presetsList.editors) { + presetsList.editors.forEach(editor => editor.refresh()); + } + }); + + presetNode.appendChild(addPreset); +} + /** * Restores settings from storage */ function restoreSettings() { chrome.storage.sync.get({ - expandLevel: 3 + expandLevel: 3, + viewPresets: examplePresets }, settings => { expand.value = settings.expandLevel; + settings.viewPresets.forEach(createHostPresetNode); }); } +/** + * Gets view presets from DOM + * @returns {Object} + */ +function getViewPresets() { + const presetsResult = []; + const presetElements = presetsNode.querySelectorAll('.preset'); + + presetElements.forEach(el => { + const presetHost = { presets: [] }; + const host = el.querySelector('.preset-host'); + + if (!host.value) { + errors.add('Host is required!'); + host.classList.add('error'); + } else { + host.classList.remove('error'); + } + + try { + new RegExp(host.value); + } catch (_) { + errors.add('Host must be a valid RegExp!'); + host.classList.add('error'); + } + + presetHost.host = host.value; + + const presetItems = el.querySelectorAll('.preset-item'); + + presetItems.forEach(item => { + const presetName = item.querySelector('.preset-name'); + + if (!presetName.value) { + errors.add('Name is required!'); + presetName.classList.add('error'); + } else { + presetName.classList.remove('error'); + } + + const presetContent = item.querySelector('.preset-content'); + const value = presetContent.CodeMirror && presetContent.CodeMirror.getValue(); + + if (!value) { + errors.add('Content is required!'); + presetContent.classList.add('error'); + } else { + presetContent.classList.remove('error'); + } + + try { + JSON.parse(value); + } catch (_) { + errors.add('Content must be a valid JSON!'); + presetContent.classList.add('error'); + } + + presetHost.presets.push({ + name: presetName.value, + content: value + }); + }); + + presetsResult.push(presetHost); + }); + + if (errors.size) { + return null; + } + + return presetsResult; +} + document.addEventListener('DOMContentLoaded', () => { restoreSettings(); }); +addHost.addEventListener('click', () => { + createHostPresetNode({ + host: '', + presets: [] + }); +}); + save.addEventListener('click', () => { + errors.clear(); + const expandLevel = expand.value; - chrome.storage.sync.set({ - expandLevel - }, () => { - status.textContent = 'Options saved.'; - setTimeout(() => { - status.textContent = ''; - }, 750); - }); + if (!expandLevel) { + expand.classList.add('error'); + errors.add('Expand level is required!'); + } else { + expand.classList.remove('error'); + } + + const viewPresets = getViewPresets(); + + if (!expandLevel || !viewPresets) { + status.classList.add('error'); + status.textContent = [...errors].join(' '); + } else { + status.classList.remove('error'); + chrome.storage.sync.set({ + expandLevel, + viewPresets + }, () => { + status.textContent = 'Options saved.'; + status.classList.remove('error'); + setTimeout(() => { + status.textContent = ''; + }, 750); + }); + } }); settingsForm.addEventListener('submit', event => event.preventDefault());