diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..63190aca9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +**/lib/* +node_modules diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..d262d9909 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,6 @@ +module.exports = { + "extends": "airbnb-base", + "rules": { + "no-param-reassign": 0 + } +}; diff --git a/.gitignore b/.gitignore index 9e926bfbc..4c54d94c3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ /npm-debug.log /npm-debug.log +package-lock.json + !.gitkeep # Junk files @@ -13,3 +15,5 @@ Desktop.ini ._* tags tags.* +.idea +/nbproject/private/ diff --git a/Dockerfile b/Dockerfile index f2a28e638..e7c9e6806 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM alpine -MAINTAINER Elbert Alias +LABEL maintainer="elbert@alias.io" ENV WAPPALYZER_DIR=/opt/wappalyzer @@ -8,7 +8,6 @@ RUN apk update && apk add --no-cache \ bash \ curl \ fontconfig \ - nodejs \ nodejs-npm \ optipng \ zip @@ -17,14 +16,15 @@ RUN apk update && apk add --no-cache \ # https://github.com/dustinblackman/phantomized RUN curl -Ls "https://github.com/dustinblackman/phantomized/releases/download/2.1.1a/dockerized-phantomjs.tar.gz" | tar xz -C / -RUN apk del \ - curl +RUN apk del curl -RUN npm i -g \ +RUN npm i -g n npm@latest + +RUN n stable + +RUN npm i --unsafe-perm --silent -g \ jsonlint-cli \ - manifoldjs \ - svg2png-many \ - yarn + svg2png-many RUN mkdir -p $WAPPALYZER_DIR diff --git a/README.md b/README.md index 79b36246e..29e837b4b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Wappalyzer [![Travis](https://img.shields.io/travis/AliasIO/Wappalyzer.svg)](https://travis-ci.org/AliasIO/Wappalyzer/) [![Scrutinizer](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/?branch=master) +# Wappalyzer [![Travis](https://travis-ci.org/AliasIO/Wappalyzer.svg?branch=master)](https://travis-ci.org/AliasIO/Wappalyzer/) [![Scrutinizer](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/?branch=master) [Wappalyzer](https://www.wappalyzer.com/) is a [cross-platform](https://github.com/AliasIO/Wappalyzer/wiki/Drivers) utility that uncovers the diff --git a/bin/build b/bin/build index 2bdd89fa1..e39752ccc 100755 --- a/bin/build +++ b/bin/build @@ -22,7 +22,7 @@ find . -name ".DS_Store" -exec rm {} \; echo "Prettifying apps.json..." -jsonlint-cli -ist $'\t' src/apps.json +sed -e 's/\\\\/{{ESCAPE}}/g' src/apps.json | jsonlint-cli -ps | sed -e 's/{{ESCAPE}}/\\\\/g' > /tmp/apps.json && cat /tmp/apps.json > src/apps.json echo "Converting SVG icons to PNG..." @@ -60,6 +60,7 @@ zip -qr ../../../build/wappalyzer_webextension.zip . \ -x \*.gitkeep \ -x \*.js.map \ -x \*.min.js \ + -x \*.spec.js \ -x \*.yarn-integrity \ -x \*package.json \ -x \*LICENSE \ diff --git a/bin/validate b/bin/validate index dd9b12729..2c60e5b90 100755 --- a/bin/validate +++ b/bin/validate @@ -6,7 +6,7 @@ set -eu echo "Validating apps.json..." -jsonlint-cli -tps schema.json src/apps.json > /tmp/apps.json && mv /tmp/apps.json src/apps.json +jsonlint-cli -s schema.json src/apps.json echo "Validating regular expressions..." @@ -15,3 +15,7 @@ echo "Validating regular expressions..." echo "Validating icons..." ./bin/validate-icons + +echo "Running tests..." + +npm run test diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json new file mode 100644 index 000000000..221001f31 --- /dev/null +++ b/npm-shrinkwrap.json @@ -0,0 +1,1781 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.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 + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + } + }, + "eslint-config-airbnb-base": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.0.0.tgz", + "integrity": "sha512-hUFXRlE6AY84z0qYh4wKdtSF4EqDnyT8sxrvTpcXCV4ENSLF8li5yNA1yDM26iinH8Ierbpc4lv8Rp62uX6VSQ==", + "dev": true, + "requires": { + "eslint-restricted-globals": "^0.1.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz", + "integrity": "sha512-t6hGKQDMIt9N8R7vLepsYXgDfeuhp6ZJSgtrLEDxonpSubyxUZHjhm6LsAaZX8q6GYVxkbT3kTsV9G5mBCFR6A==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "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, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "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 + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-type": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz", + "integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY=" + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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 + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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 + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object.assign": { + "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", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", + "requires": { + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "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, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": 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, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": 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" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4fcb441c4..000000000 --- a/package-lock.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "file-type": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz", - "integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "1.1.1" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz", - "integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "read-chunk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", - "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", - "requires": { - "pify": "3.0.0", - "safe-buffer": "5.1.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } -} diff --git a/package.json b/package.json index 2d49eb014..e7bee5930 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,14 @@ }, "devDependencies": { "chai": "^4.1.2", - "mocha": "^5.0.1" + "eslint": "^4.19.1", + "eslint-config-airbnb-base": "^13.0.0", + "eslint-plugin-import": "^2.13.0", + "mocha": "^5.2.0" }, "scripts": { - "test": "mocha -R spec ./test" + "test": "mocha -R spec src", + "lint": "eslint src", + "lint:fix": "eslint src --fix" } } diff --git a/patches/zombie-vm-timeout.patch b/patches/zombie-vm-timeout.patch index dcc62d7d4..27313611a 100644 --- a/patches/zombie-vm-timeout.patch +++ b/patches/zombie-vm-timeout.patch @@ -1,11 +1,11 @@ ---- src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:36:04.097829977 +1000 -+++ src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:34:25.699317000 +1000 -@@ -281,7 +281,7 @@ - // The current window, postMessage and window.close need this +--- src/drivers/npm/node_modules/zombie/lib/document.js ++++ src/drivers/npm/node_modules/zombie/lib/document.js +@@ -247,7 +247,7 @@ function setupWindow(window, args) { browser._windowInScope = window; - var result = undefined; -- if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename });else if (code) result = code.call(window); -+ if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename, timeout: 1000 });else if (code) result = code.call(window); + let result; + if (typeof code == 'buffer' || code instanceof Buffer) code = code.toString(); +- if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, context, { filename });else if (code) result = code.call(window); ++ if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, context, { filename, timeout: 1000 });else if (code) result = code.call(window); browser.emit('evaluated', code, result, filename); return result; } catch (error) { diff --git a/run b/run index ae85b6344..06556bb07 100755 --- a/run +++ b/run @@ -10,7 +10,16 @@ fi cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev" -$cmd sh -c "yarn install; cd src/drivers/webextension; yarn install" +$cmd sh -c "\ + npm i; \ + npm shrinkwrap; \ + cd src/drivers/webextension; \ + npm i; \ + npm shrinkwrap; \ + cd ../npm; \ + npm i; \ + npm shrinkwrap" + $cmd sh -c "cat patches/*.patch | patch -p0" $cmd ./bin/run links diff --git a/schema.json b/schema.json index e66f71303..1d4ddb67d 100644 --- a/schema.json +++ b/schema.json @@ -38,6 +38,12 @@ }, "required": true }, + "cookies": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, "js": { "type": "object", "additionalProperties": { diff --git a/src/apps.json b/src/apps.json index de11cdb63..504c4c5af 100644 --- a/src/apps.json +++ b/src/apps.json @@ -1,24 +1,13 @@ { "$schema": "../schema.json", "apps": { - "1&1": { - "cats": [ - 6 - ], - "icon": "1and1.svg", - "implies": "PHP", - "url": "/shop/catalog/browse\\?sessid=", - "website": "http://1and1.com" - }, "1C-Bitrix": { "cats": [ 1 ], - "cookies": { - "BITRIX_": "" - }, "headers": { - "X-Powered-CMS": "^Bitrix Site Manager" + "Set-Cookie": "BITRIX_", + "X-Powered-CMS": "Bitrix Site Manager" }, "html": "(?:]+components/bitrix|(?:src|href)=\"/bitrix/(?:js|templates))", "icon": "1C-Bitrix.png", @@ -26,15 +15,13 @@ "script": "1c-bitrix", "website": "http://www.1c-bitrix.ru" }, - "2z Project": { + "91App": { "cats": [ - 1 + 6 ], - "icon": "2z Project.png", - "meta": { - "generator": "2z project ([\\d.]+)\\;version:\\1" - }, - "website": "http://2zproject-cms.ru" + "icon": "91app.png", + "script": "https\\:\\/\\/track\\.91app\\.io\\/track\\.js\\?", + "website": "https://www.91app.com/" }, "3dCart": { "cats": [ @@ -51,25 +38,6 @@ "script": "(?:twlh(?:track)?\\.asp|3d_upsell\\.js)", "website": "http://www.3dcart.com" }, - "3DM": { - "cats": [ - 19 - ], - "html": "3ware 3DM([\\d\\.]+)?\\;version:\\1", - "icon": "3DM.png", - "implies": "3ware", - "website": "http://www.3ware.com" - }, - "3ware": { - "cats": [ - 22 - ], - "headers": { - "Server": "3ware\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "3ware.png", - "website": "http://www.3ware.com" - }, "A-Frame": { "cats": [ 25 @@ -78,7 +46,7 @@ "icon": "A-Frame.svg", "implies": "three.js", "js": { - "AFRAME.version": "(.*)\\;version:\\1" + "AFRAME.version": "^(.+)$\\;version:\\1" }, "script": "/?([\\d.]+)?/aframe(?:\\.min)?\\.js\\;version:\\1", "website": "https://aframe.io" @@ -96,62 +64,6 @@ "icon": "ebis.png", "website": "http://www.ebis.ne.jp" }, - "Accelerated Mobile Pages": { - "cats": [ - 12 - ], - "html": "<html[^>]* (?:amp|⚡)", - "icon": "Accelerated-Mobile-Pages.svg", - "website": "https://www.ampproject.org" - }, - "Acquia Cloud": { - "cats": [ - "22" - ], - "headers": { - "X-AH-Environment": "^\\w+$" - }, - "icon": "acquia-cloud.png", - "implies": "Drupal\\;confidence:95", - "website": "https://www.acquia.com/" - }, - "Amber": { - "cats": [ - 18, - 22 - ], - "headers": { - "X-Powered-By": "^Amber$" - }, - "icon": "amber.png", - "website": "https://amberframework.org" - }, - "AMPcms": { - "cats": [ - 1 - ], - "js": { - "amp_js_init": "" - }, - "cookies": { - "AMP": "" - }, - "headers": { - "X-AMP-Version": "([\\d.]+)\\;version:\\1" - }, - "icon": "AMPcms.png", - "implies": "PHP", - "website": "http://www.ampcms.org" - }, - "animate.css": { - "cats": [ - 18 - ], - "html": [ - "<link [^>]+(?:/([\\d.]+)/)?animate\\.(?:min\\.)?css\\;version:\\1" - ], - "website": "https://daneden.github.io/animate.css/" - }, "AOLserver": { "cats": [ 22 @@ -166,34 +78,24 @@ "cats": [ 10 ], + "icon": "AT Internet.png", "js": { - "xtsite": "", - "ATInternet": "" + "ATInternet": "", + "xtsite": "" }, - "icon": "AT Internet.png", "website": "http://atinternet.com/en" }, "AT Internet XiTi": { "cats": [ 10 ], + "icon": "AT Internet.png", "js": { "xt_click": "" }, - "icon": "AT Internet.png", "script": "xiti\\.com/hit\\.xiti", "website": "http://atinternet.com/en" }, - "ATEN": { - "cats": [ - 22 - ], - "headers": { - "Server": "ATEN HTTP Server(?:\\(?V?([\\d\\.]+)\\)?)?\\;version:\\1" - }, - "icon": "ATEN.png", - "website": "http://www.aten.com" - }, "AWStats": { "cats": [ 10 @@ -205,25 +107,80 @@ }, "website": "http://awstats.sourceforge.net" }, - "Accessible Portal": { + "AMP": { "cats": [ - 1 + 12 + ], + "html": "<html[^>]* (?:amp|⚡)[^-]", + "icon": "Accelerated-Mobile-Pages.svg", + "website": "https://www.amp.dev" + }, + "AMP Plugin": { + "cats": [ + 1, + 5 + ], + "icon": "Accelerated-Mobile-Pages.svg", + "implies": [ + "WordPress" ], - "icon": "Accessible Portal.png", - "implies": "PHP", "meta": { - "generator": "Accessible Portal" + "generator": "^AMP Plugin v(\\d+\\.\\d+.*)$\\;version:\\1" + }, + "website": "https://amp-wp.org" + }, + "Azure": { + "cats": [ + 62 + ], + "headers": { + "azure-regionname": "", + "azure-sitename": "", + "azure-slotname": "", + "azure-version": "" + }, + "cookies": { + "ARRAffinity": "", + "TiPMix": "" }, - "website": "http://www.accessibleportal.com" + "icon": "azure.svg", + "website": "https://azure.microsoft.com" + }, + "Azure CDN": { + "cats": [ + 31 + ], + "headers": { + "server": "^(?:ECAcc|ECS|ECD)", + "X-EC-Debug": "" + }, + "icon": "azure.svg", + "website": "https://azure.microsoft.com/en-us/services/cdn/" + }, + "Acquia Cloud": { + "cats": [ + 62 + ], + "headers": { + "X-AH-Environment": "^\\w+$" + }, + "icon": "acquia-cloud.png", + "implies": [ + "Drupal\\;confidence:95", + "Apache", + "Percona", + "Amazon EC2" + ], + "website": "https://www.acquia.com/" }, "Act-On": { "cats": [ 32 ], + "icon": "ActOn.png", "js": { "ActOn": "" }, - "icon": "ActOn.png", "website": "http://act-on.com" }, "AdInfinity": { @@ -238,11 +195,11 @@ "cats": [ 36 ], + "html": "(?:<embed[^>]+(?:src=\"https?://mh\\d?\\.adriver\\.ru/|flashvars=\"[^\"]*(?:http:%3A//(?:ad|mh\\d?)\\.adriver\\.ru/|adriver_banner))|<(?:(?:iframe|img)[^>]+src|a[^>]+href)=\"https?://ad\\.adriver\\.ru/)", + "icon": "AdRiver.png", "js": { "adriver": "" }, - "html": "(?:<embed[^>]+(?:src=\"https?://mh\\d?\\.adriver\\.ru/|flashvars=\"[^\"]*(?:http:%3A//(?:ad|mh\\d?)\\.adriver\\.ru/|adriver_banner))|<(?:(?:iframe|img)[^>]+src|a[^>]+href)=\"https?://ad\\.adriver\\.ru/)", - "icon": "AdRiver.png", "script": "(?:adriver\\.core\\.\\d\\.js|https?://(?:content|ad|masterh\\d)\\.adriver\\.ru/)", "website": "http://adriver.ru" }, @@ -250,11 +207,11 @@ "cats": [ 36 ], + "icon": "AdRoll.svg", "js": { "adroll_adv_id": "", "adroll_pix_id": "" }, - "icon": "AdRoll.svg", "script": "(?:a|s)\\.adroll\\.com", "website": "http://adroll.com" }, @@ -262,16 +219,16 @@ "cats": [ 36 ], + "icon": "Adcash.svg", "js": { + "SuLoaded": "", + "SuUrl": "", "ac_bgclick_URL": "", - "ct_siteunder": "", - "ct_tag": "", - "ct_nSuUrl": "", "ct_nOpp": "", - "SuLoaded": "", - "SuUrl": "" + "ct_nSuUrl": "", + "ct_siteunder": "", + "ct_tag": "" }, - "icon": "Adcash.svg", "script": "^[^\\/]*//(?:[^\\/]+\\.)?adcash\\.com/(?:script|ad)/", "url": "^https?://(?:[^\\/]+\\.)?adcash\\.com/script/pop_", "website": "http://adcash.com" @@ -288,10 +245,10 @@ "cats": [ 5 ], + "icon": "AddThis.svg", "js": { "addthis": "" }, - "icon": "AddThis.svg", "script": "addthis\\.com/js/", "website": "http://www.addthis.com" }, @@ -299,10 +256,10 @@ "cats": [ 5 ], + "icon": "AddToAny.png", "js": { "a2apage_init": "" }, - "icon": "AddToAny.png", "script": "addtoany\\.com/menu/page\\.js", "website": "http://www.addtoany.com" }, @@ -334,31 +291,44 @@ "cats": [ 18 ], - "js": { - "_cfEmails": "" - }, "headers": { "Cookie": "CFTOKEN=" }, "html": "<!-- START headerTags\\.cfm", "icon": "Adobe ColdFusion.svg", "implies": "CFML", + "js": { + "_cfEmails": "" + }, "script": "/cfajax/", "url": "\\.cfm(?:$|\\?)", "website": "http://adobe.com/products/coldfusion-family.html" }, + "Adobe DTM": { + "cats": [ + 42 + ], + "script": "//assets.adobedtm.com/", + "icon": "adobedmt.png", + "website": "https://marketing.adobe.com/resources/help/en_US/dtm/c_overview.html" + }, "Adobe Experience Manager": { "cats": [ 1 ], "html": [ "<div class=\"[^\"]*parbase", - "<div[^>]+data-component-path=\"[^\"+]jcr:" + "<div[^>]+data-component-path=\"[^\"+]jcr:", + "<div class=\"[^\"]*aem-Grid" ], "icon": "Adobe Experience Manager.svg", "implies": "Java", - "script": "/etc/designs/", - "website": "http://www.adobe.com/au/marketing-cloud/enterprise-content-management.html" + "script": [ + "/etc/designs/", + "/etc/clientlibs/", + "/etc.clientlibs/" + ], + "website": "https://www.adobe.com/marketing/experience-manager.html" }, "Adobe GoLive": { "cats": [ @@ -384,20 +354,31 @@ "cats": [ 4 ], + "icon": "Adobe RoboHelp.svg", "js": { - "gbWhVer": "", "gbWhLang": "", "gbWhMsg": "", + "gbWhProxy": "", "gbWhUtil": "", - "gbWhProxy": "" + "gbWhVer": "" }, - "icon": "Adobe RoboHelp.svg", "meta": { "generator": "^Adobe RoboHelp(?: ([\\d]+))?\\;version:\\1" }, "script": "(?:wh(?:utils|ver|proxy|lang|topic|msg)|ehlpdhtm)\\.js", "website": "http://adobe.com/products/robohelp.html" }, + "ADPLAN": { + "cats": [ + 10 + ], + "icon": "ADPLAN.png", + "script": [ + "^https?://[^.]+\\.adplan7\\.com/\\;version:7", + "^https?://(?!o\\.)\\w+\\.advg\\.jp/" + ], + "website": "https://www.adplan7.com/" + }, "Advanced Web Stats": { "cats": [ 10 @@ -411,23 +392,33 @@ "cats": [ 36 ], + "icon": "Advert Stream.png", "js": { "advst_is_above_the_fold": "" }, - "icon": "Advert Stream.png", "script": "(?:ad\\.advertstream\\.com|adxcore\\.com)", "website": "http://www.advertstream.com" }, + "Adyen": { + "cats": [ + 41 + ], + "icon": "Adyen.svg", + "js": { + "adyen.encrypt.version": "^(.+)$\\;version:\\1" + }, + "website": "https://www.adyen.com" + }, "Adzerk": { "cats": [ 36 ], + "html": "<iframe [^>]*src=\"[^\"]+adzerk\\.net", + "icon": "Adzerk.png", "js": { "ados": "", "adosResults": "" }, - "html": "<iframe [^>]*src=\"[^\"]+adzerk\\.net", - "icon": "Adzerk.png", "script": "adzerk\\.net/ados\\.js", "website": "http://adzerk.com" }, @@ -445,6 +436,16 @@ ], "website": "http://blogengine.ru" }, + "Afosto": { + "cats": [ + 6 + ], + "headers": { + "X-Powered-By": "Afosto SaaS BV" + }, + "icon": "Afosto.svg", + "website": "http://afosto.com" + }, "AfterBuy": { "cats": [ 6 @@ -456,15 +457,19 @@ "script": "shop-static\\.afterbuy\\.de", "website": "http://www.afterbuy.de" }, - "Afosto": { + "Ahoy": { "cats": [ - 6 + 10 ], - "headers": { - "X-Powered-By": "Afosto SaaS BV" + "js": { + "ahoy": "" }, - "icon": "Afosto.svg", - "website": "http://afosto.com" + "cookies": { + "ahoy_track": "", + "ahoy_visit": "", + "ahoy_visitor": "" + }, + "website": "https://github.com/ankane/ahoy" }, "Aircall": { "cats": [ @@ -479,7 +484,7 @@ 31 ], "headers": { - "Server": "Airee" + "Server": "^Airee" }, "icon": "Airee.png", "website": "http://xn--80aqc2a.xn--p1ai" @@ -494,6 +499,21 @@ "icon": "akamai.svg", "website": "http://akamai.com" }, + "Akaunting": { + "cats": [ + 55 + ], + "headers": { + "X-Akaunting": "^Free Accounting Software$" + }, + "html": [ + "<link[^>]+akaunting-green\\.css", + "Powered By Akaunting: <a [^>]*href=\"https?://(?:www\\.)?akaunting\\.com[^>]+>" + ], + "icon": "akaunting.svg", + "implies": "Laravel", + "website": "https://akaunting.com" + }, "Akka HTTP": { "cats": [ 18, @@ -509,13 +529,22 @@ "cats": [ 29 ], + "icon": "Algolia Realtime Search.svg", "js": { "AlgoliaSearch": "", - "algoliasearch.version": "(.*)\\;version:\\1" + "algoliasearch.version": "^(.+)$\\;version:\\1" }, - "icon": "Algolia Realtime Search.svg", "website": "http://www.algolia.com" }, + "All in One SEO Pack": { + "cats": [ + 54 + ], + "html": "<!-- All in One SEO Pack ([\\d.]+) \\;version:\\1", + "icon": "all-in-One-SEO-Pack.png", + "implies": "WordPress", + "website": "https://wordpress.org/plugins/all-in-one-seo-pack/" + }, "Allegro RomPager": { "cats": [ 22 @@ -530,14 +559,14 @@ "cats": [ 12 ], - "js": { - "AUI": "" - }, "icon": "AlloyUI.png", "implies": [ "Bootstrap", "YUI" ], + "js": { + "AUI": "" + }, "script": "^https?://cdn\\.alloyui\\.com/", "website": "http://www.alloyui.com" }, @@ -556,10 +585,11 @@ 31 ], "headers": { - "X-Amz-Cf-Id": "", - "Via": "\\(CloudFront\\)$" + "Via": "\\(CloudFront\\)$", + "X-Amz-Cf-Id": "" }, "icon": "Amazon-Cloudfront.svg", + "implies": "Amazon Web Services", "website": "http://aws.amazon.com/cloudfront/" }, "Amazon EC2": { @@ -570,18 +600,63 @@ "Server": "\\(Amazon\\)" }, "icon": "aws-ec2.svg", + "implies": "Amazon Web Services", "website": "http://aws.amazon.com/ec2/" }, + "Amazon Web Services": { + "cats": [ + 62 + ], + "icon": "aws.svg", + "website": "https://aws.amazon.com/" + }, + "Amazon ECS": { + "cats": [ + 63 + ], + "headers": { + "Server": "^ECS" + }, + "icon": "aws.svg", + "implies": [ + "Amazon Web Services", + "Docker" + ], + "website": "https://aws.amazon.com/elasticloadbalancing/" + }, + "Amazon ELB": { + "cats": [ + 65 + ], + "cookies": { + "AWSELB": "" + }, + "icon": "aws-elb.png", + "implies": "Amazon Web Services", + "website": "https://aws.amazon.com/elasticloadbalancing/" + }, "Amazon S3": { "cats": [ 19 ], "headers": { - "Server": "AmazonS3" + "Server": "^AmazonS3$" }, "icon": "aws-s3.svg", + "implies": "Amazon Web Services", "website": "http://aws.amazon.com/s3/" }, + "Amber": { + "cats": [ + 18, + 22 + ], + "headers": { + "X-Powered-By": "^Amber$" + }, + "icon": "amber.png", + "website": "https://amberframework.org" + }, "Ametys": { "cats": [ 1 @@ -605,20 +680,37 @@ }, "website": "http://amirocms.com" }, - "Angular Material": { + "Amplitude": { "cats": [ - 18 + 10 ], - "js": { - "ngMaterial": "" - }, - "icon": "AngularJS.svg", - "implies": "AngularJS", + "icon": "amplitude.png", "script": [ - "/([\\d.]+(?:\\-?rc[.\\d]*)*)/angular-material(?:\\.min)?\\.js\\;version:\\1", - "angular-material.*\\.js" + "cdn\\.amplitude\\.com" ], - "website": "https://material.angularjs.org" + "website": "https://amplitude.com/" + }, + "Analysys Ark": { + "cats": [ + 10 + ], + "js": { + "AnalysysAgent": "" + }, + "cookies": { + "ARK_ID": "" + }, + "icon": "Analysys Ark.svg", + "script": "AnalysysFangzhou_JS_SDK\\.min\\.js\\?v=([\\d.]+)\\;version:\\1", + "website": "https://ark.analysys.cn" + }, + "Anetwork": { + "cats": [ + 36 + ], + "icon": "Anetwork.png", + "script": "static-cdn\\.anetwork\\.ir/", + "website": "https://www.anetwork.ir" }, "Angular": { "cats": [ @@ -630,22 +722,38 @@ ], "html": "<[^>]+ ng-version=\"([\\d.]+)\"\\;version:\\1", "icon": "Angular.svg", + "js": { + "ng.coreTokens": "", + "ng.probe": "" + }, "website": "https://angular.io" }, + "Angular Material": { + "cats": [ + 18 + ], + "icon": "AngularJS.svg", + "implies": "AngularJS", + "js": { + "ngMaterial": "" + }, + "script": "/([\\d.rc-]+)?/angular-material(?:\\.min)?\\.js\\;version:\\1", + "website": "https://material.angularjs.org" + }, "AngularDart": { "cats": [ 18 ], - "implies": "Dart", "excludes": [ "Angular", "AngularJS" ], "icon": "AngularDart.svg", - "website": "https://webdev.dartlang.org/angular/", + "implies": "Dart", "js": { "ngTestabilityRegistries": "" - } + }, + "website": "https://webdev.dartlang.org/angular/" }, "AngularJS": { "cats": [ @@ -655,24 +763,42 @@ "Angular", "AngularDart" ], + "icon": "AngularJS.svg", + "html": [ + "<(?:div|html)[^>]+ng-app=", + "<ng-app" + ], "js": { "angular": "", - "angular.version.full": "(.*)\\;version:\\1" + "angular.version.full": "^(.+)$\\;version:\\1" }, - "icon": "AngularJS.svg", "script": [ - "angular(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", - "/([\\d.]+(?:\\-?rc[.\\d]*)*)/angular(?:\\.min)?\\.js\\;version:\\1", + "angular[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+(?:-?rc[.\\d]*)*)/angular(?:\\.min)?\\.js\\;version:\\1", "angular.*\\.js" ], "website": "https://angularjs.org" }, + "Ant Design": { + "cats": [ + 12 + ], + "html": [ + "<[^>]*class=\"ant-(?:btn|col|row|layout|breadcrumb|menu|pagination|steps|select|cascader|checkbox|calendar|form|input-number|input|mention|rate|radio|slider|switch|tree-select|time-picker|transfer|upload|avatar|badge|card|carousel|collapse|list|popover|tooltip|table|tabs|tag|timeline|tree|alert|modal|message|notification|progress|popconfirm|spin|anchor|back-top|divider|drawer)", + "<i class=\"anticon anticon-" + ], + "icon": "Ant Design.svg", + "js": { + "antd": "" + }, + "website": "https://ant.design" + }, "Apache": { "cats": [ 22 ], "headers": { - "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\b)HTTPD)\\;version:\\1" + "Server": "(?:Apache(?:$|/([\\d.]+)|[^/-])|(?:^|\\b)HTTPD)\\;version:\\1" }, "icon": "Apache.svg", "website": "http://apache.org" @@ -710,8 +836,8 @@ 22 ], "headers": { - "Server": "^Apache-Coyote(/1\\.1)?$\\;version:\\1?4.1+:", - "X-Powered-By": "\bTomcat\b(?:-([\\d.]+))?\\;version:\\1" + "Server": "^Apache-Coyote(?:/([\\d.]+))?\\;version:\\1", + "X-Powered-By": "\\bTomcat\\b(?:-([\\d.]+))?\\;version:\\1" }, "icon": "Apache Tomcat.svg", "implies": "Java", @@ -731,11 +857,11 @@ "cats": [ 18 ], + "icon": "Apache Wicket.svg", + "implies": "Java", "js": { "Wicket": "" }, - "icon": "Apache Wicket.svg", - "implies": "Java", "website": "http://wicket.apache.org" }, "ApexPages": { @@ -749,6 +875,15 @@ "implies": "Salesforce", "website": "https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_intro.htm" }, + "Apigee": { + "cats": [ + 4 + ], + "script": "/profiles/apigee", + "html": "<script>[^>]{0,50}script src=[^>]/profiles/apigee", + "icon": "apigee.svg", + "website": "https://cloud.google.com/apigee/" + }, "Apostrophe CMS": { "cats": [ 1 @@ -767,13 +902,21 @@ "script": "adnxs\\.(?:net|com)", "website": "http://appnexus.com" }, + "Appcues": { + "cats": [ + 58 + ], + "icon": "Appcues.svg", + "script": "fast\\.appcues.com*\\.js", + "website": "https://appcues.com" + }, "Arastta": { "cats": [ 6 ], "excludes": "OpenCart", "headers": { - "Arastta": "(.*)\\;version:\\1", + "Arastta": "^(.+)$\\;version:\\1", "X-Arastta": "" }, "html": "Powered by <a [^>]*href=\"https?://(?:www\\.)?arastta\\.org[^>]+>Arastta", @@ -782,36 +925,28 @@ "script": "arastta\\.js", "website": "http://arastta.org" }, - "Arc Forum": { - "cats": [ - 2 - ], - "html": "ping\\.src = node\\.href;\\s+[^>]+\\s+}\\s+</script>", - "icon": "Arc Forum.png", - "website": "http://arclanguage.org" - }, "ArcGIS API for JavaScript": { "cats": [ 35 ], + "icon": "arcgis_icon.png", "script": [ "js\\.arcgis\\.com", "basemaps\\.arcgis\\.com" ], - "icon": "arcgis_icon.png", "website": "https://developers.arcgis.com/javascript/" }, "Artifactory": { "cats": [ 47 ], - "js": { - "ArtifactoryUpdates": "" - }, "html": [ "<span class=\"version\">Artifactory(?: Pro)?(?: Power Pack)?(?: ([\\d.]+))?\\;version:\\1" ], "icon": "Artifactory.svg", + "js": { + "ArtifactoryUpdates": "" + }, "script": [ "wicket/resource/org\\.artifactory\\." ], @@ -834,13 +969,13 @@ "cats": [ 31 ], - "js": { - "ArvanCloud": "" - }, "headers": { "AR-PoweredBy": "Arvan Cloud \\(arvancloud\\.com\\)" }, "icon": "ArvanCloud.png", + "js": { + "ArvanCloud": "" + }, "website": "http://www.ArvanCloud.com" }, "AsciiDoc": { @@ -849,10 +984,10 @@ 20, 27 ], + "icon": "AsciiDoc.png", "js": { "asciidoc": "" }, - "icon": "AsciiDoc.png", "meta": { "generator": "^AsciiDoc ([\\d.]+)\\;version:\\1" }, @@ -862,24 +997,24 @@ "cats": [ 14 ], + "html": "<asciinema-player", + "icon": "asciinema.png", "js": { "asciinema": "" }, "script": "asciinema\\.org/", - "icon": "asciinema.png", - "html": "<asciinema-player", "website": "https://asciinema.org/" }, "Atlassian Bitbucket": { "cats": [ 47 ], + "html": "<li>Atlassian Bitbucket <span title=\"[a-z0-9]+\" id=\"product-version\" data-commitid=\"[a-z0-9]+\" data-system-build-number=\"[a-z0-9]+\"> v([\\d.]+)<\\;version:\\1", + "icon": "Atlassian Bitbucket.svg", + "implies": "Python", "js": { "bitbucket": "" }, - "icon": "Atlassian Bitbucket.svg", - "implies": "Python", - "html": "<li>Atlassian Bitbucket <span title=\"[a-z0-9]+\" id=\"product-version\" data-commitid=\"[a-z0-9]+\" data-system-build-number=\"[a-z0-9]+\"> v([\\d.]+)<\\;version:\\1", "meta": { "application-name": "Bitbucket" }, @@ -915,14 +1050,14 @@ "cats": [ 13 ], - "js": { - "jira": "" - }, "html": "Powered by\\s+<a href=[^>]+atlassian\\.com/(?:software/jira|jira-bug-tracking/)[^>]+>Atlassian\\s+JIRA(?:[^v]*v(?:ersion: )?(\\d+\\.\\d+(?:\\.\\d+)?))?\\;version:\\1", "icon": "Atlassian Jira.svg", "implies": "Java", + "js": { + "jira": "" + }, "meta": { - "ajs-version-number": "([\\d\\.]+)\\;version:\\1", + "ajs-version-number": "^(.+)$\\;version:\\1", "application-name": "JIRA" }, "website": "http://www.atlassian.com/software/jira/overview/" @@ -958,12 +1093,12 @@ "cats": [ 6 ], - "js": { - "avng8_": "", - "__avng8_": "" - }, "html": "<link[^>]* href=\"^https?://edge\\.avangate\\.net/", "icon": "Avangate.svg", + "js": { + "__avng8_": "", + "avng8_": "" + }, "script": "^https?://edge\\.avangate\\.net/", "website": "http://avangate.com" }, @@ -971,10 +1106,10 @@ "cats": [ 29 ], + "html": "<link[^>]+href=\"[^>]*awesomplete(?:\\.min)?\\.css", "js": { "awesomplete": "" }, - "html": "<link[^>]+href=\"[^>]*awesomplete(?:\\.min)?\\.css", "script": "/awesomplete\\.js(?:$|\\?)", "website": "https://leaverou.github.io/awesomplete/" }, @@ -1003,22 +1138,22 @@ 3, 9 ], - "website": "https://www.bablic.com/", + "icon": "bablic.png", "js": { "bablic": "" }, - "icon": "bablic.png" + "website": "https://www.bablic.com/" }, "Backbone.js": { "cats": [ 12 ], + "icon": "Backbone.js.png", + "implies": "Underscore.js", "js": { "Backbone": "", - "Backbone.VERSION": "(.*)\\;version:\\1" + "Backbone.VERSION": "^(.+)$\\;version:\\1" }, - "icon": "Backbone.js.png", - "implies": "Underscore.js", "script": "backbone.*\\.js", "website": "http://backbonejs.org" }, @@ -1026,17 +1161,28 @@ "cats": [ 1 ], - "js": { - "Backdrop": "" - }, "excludes": "Drupal", "icon": "Backdrop.png", "implies": "PHP", + "js": { + "Backdrop": "" + }, "meta": { "generator": "Backdrop CMS(?: (\\d))?\\;version:\\1" }, "website": "http://backdropcms.org" }, + "Backpack": { + "cats": [ + 47 + ], + "cookies": { + "backpack_session=": "" + }, + "icon": "Backpack.png", + "implies": "Laravel", + "website": "https://backpackforlaravel.com" + }, "Backtory": { "cats": [ 31 @@ -1071,6 +1217,16 @@ "implies": "Python", "website": "http://docs.python.org/2/library/basehttpserver.html" }, + "BigBangShop": { + "cats": [ + 6 + ], + "headers": { + "X-SERVER": "BIGBANGSHOP" + }, + "icon": "bigbangshop.svg", + "website": "https://www.bigbangshop.com.br" + }, "BigDump": { "cats": [ 3 @@ -1082,33 +1238,6 @@ ], "website": "http://www.ozerov.de/bigdump.php" }, - "Ant Design": { - "cats": [ - 12 - ], - "implies": [ - "React" - ], - "icon": "Ant Design.svg", - "js": { - "antd": "" - }, - "html": [ - "<(?:div|button) class=\"ant-(?:btn|col|row|layout|breadcrumb|menu|pagination|steps|select|cascader|checkbox|calendar|form|input-number|input|mention|rate|radio|slider|switch|tree-select|time-picker|transfer|upload|avatar|badge|card|carousel|collapse|list|popover|tooltip|table|tabs|tag|timeline|tree|alert|modal|message|notification|progress|popconfirm|spin|anchor|back-top|divider)", - "<i class=\"anticon anticon-" - ], - "website": "https://ant.design" - }, - "Sqreen": { - "cats": [ - 19 - ], - "headers": { - "X-Protected-By": "^Sqreen$" - }, - "icon": "Sqreen.png", - "website": "https://sqreen.io" - }, "Bigcommerce": { "cats": [ 6 @@ -1124,8 +1253,8 @@ 6 ], "cookies": { - "bigwareCsid": "", - "bigWAdminID": "" + "bigWAdminID": "", + "bigwareCsid": "" }, "html": "(?:Diese <a href=[^>]+bigware\\.de|<a href=[^>]+/main_bigware_\\d+\\.php)", "icon": "Bigware.png", @@ -1137,10 +1266,10 @@ "cats": [ 36 ], + "icon": "BittAds.png", "js": { "bitt": "" }, - "icon": "BittAds.png", "script": "bittads\\.com/js/bitt\\.js$", "website": "http://bittads.com" }, @@ -1148,10 +1277,10 @@ "cats": [ 6 ], + "icon": "bizweb.png", "js": { "Bizweb": "" }, - "icon": "bizweb.png", "website": "https://www.bizweb.vn" }, "Blade": { @@ -1189,6 +1318,7 @@ 11 ], "icon": "Blogger.png", + "implies": "Python", "meta": { "generator": "^Blogger$" }, @@ -1216,7 +1346,7 @@ }, "Boba.js": { "cats": [ - 12 + 59 ], "implies": "Google Analytics", "script": "boba(?:\\.min)?\\.js", @@ -1230,6 +1360,20 @@ "script": "^https?://vmss\\.boldchat\\.com/aid/\\d{18}/bc\\.vms4/vms\\.js", "website": "https://www.boldchat.com/" }, + "BoldGrid": { + "cats": [ + 1, + 11 + ], + "html": [ + "<link rel=[\"']stylesheet[\"'] [^>]+boldgrid", + "<link rel=[\"']stylesheet[\"'] [^>]+post-and-page-builder", + "<link[^>]+s\\d+\\.boldgrid\\.com" + ], + "script": "/wp-content/plugins/post-and-page-builder", + "implies": "WordPress", + "website": "https://boldgrid.com" + }, "Bolt": { "cats": [ 1 @@ -1253,9 +1397,31 @@ "implies": "CodeIgniter", "website": "http://cibonfire.com" }, + "Bootstrap": { + "cats": [ + 18 + ], + "html": [ + "<style>/\\*!\\* Bootstrap v(\\d\\.\\d\\.\\d)\\;version:\\1", + "<link[^>]+?href=[^\"]/css/([\\d.]+)/bootstrap\\.(?:min\\.)?css\\;version:\\1", + "<link[^>]+?href=\"[^\"]*bootstrap(?:\\.min)?\\.css", + "<div[^>]+class=\"[^\"]*glyphicon glyphicon-" + ], + "icon": "Bootstrap.png", + "js": { + "bootstrap.Alert.VERSION": "^(.+)$\\;version:\\1", + "jQuery.fn.tooltip.Constructor.VERSION": "^(.+)$\\;version:\\1" + }, + "script": [ + "twitter\\.github\\.com/bootstrap", + "bootstrap[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "(?:/([\\d.]+))?(?:/js)?/bootstrap(?:\\.min)?\\.js\\;version:\\1" + ], + "website": "https://getbootstrap.com" + }, "Bootstrap Table": { "cats": [ - 12 + 59 ], "html": "<link[^>]+href=\"[^>]*bootstrap-table(?:\\.min)?\\.css", "icon": "Bootstrap Table.svg", @@ -1270,24 +1436,34 @@ "cats": [ 32 ], + "script": "^https?://tag\\.bounceexchange\\.com/", + "icon": "Bounce Exchange.svg", "js": { "bouncex": "" }, - "html": "<script[^>]*>[^>]+\\.src\\s*=\\s*['\"](?:https?:)?//tag\\.bounceexchange\\.com/", - "icon": "Bounce Exchange.svg", - "script": "^https?://tag\\.bounceexchange\\.com/", "website": "http://www.bounceexchange.com" }, - "Brother": { + "Braintree": { "cats": [ - 40 + 41 ], - "html": [ - "(?:<!--|<BR>)Copyright\\(C\\) [\\d-]+ Brother Industries", - "<TITLE>\n\\s*BROTHER " + "icon": "Braintree.svg", + "js": { + "Braintree": "", + "Braintree.version": "^(.+)$\\;version:\\1" + }, + "website": "https://www.braintreepayments.com" + }, + "Brightspot": { + "cats": [ + 1 ], - "icon": "Brother.png", - "website": "http://www.brother.com" + "headers": { + "X-Powered-By": "^Brightspot$" + }, + "icon": "Brightspot.svg", + "implies": "Java", + "website": "https://www.brightspot.com" }, "BrowserCMS": { "cats": [ @@ -1307,33 +1483,24 @@ 18, 22 ], - "js": { - "appquery": "" - }, "icon": "bubble.png", "implies": "Node.js", - "website": "http://bubble.is" - }, - "BugSense": { - "cats": [ - 10 - ], "js": { - "Bugsense": "" + "appquery": "" }, - "icon": "BugSense.png", - "script": "bugsense\\.js", - "website": "http://bugsense.com" + "website": "http://bubble.is" }, "BugSnag": { "cats": [ 10 ], + "icon": "BugSnag.png", "js": { - "Bugsnag": "" + "Bugsnag": "", + "bugsnag": "", + "bugsnagClient": "" }, - "icon": "BugSnag.png", - "script": "bugsnag.*\\.js", + "script": "/bugsnag.*\\.js", "website": "http://bugsnag.com" }, "Bugzilla": { @@ -1342,16 +1509,21 @@ ], "html": [ "href=\"enter_bug\\.cgi\">", - "<main id=\"bugzilla-body\"" + "<main id=\"bugzilla-body\"", + "<a href=\"https?://www\\.bugzilla\\.org/docs/([0-9.]+)/[^>]+>Help<\\;version:\\1", + "<span id=\"information\" class=\"header_addl_info\">version ([\\d.]+)<\\;version:\\1" ], - "meta": { - "generator": "Bugzilla ?([\\d.]+)?\\;version:\\1" + "cookies": { + "Bugzilla_login_request_cookie": "" }, + "icon": "Bugzilla.png", + "implies": "Perl", "js": { "BUGZILLA": "" }, - "icon": "Bugzilla.png", - "implies": "Perl", + "meta": { + "generator": "Bugzilla ?([\\d.]+)?\\;version:\\1" + }, "website": "http://www.bugzilla.org" }, "Bulma": { @@ -1387,23 +1559,25 @@ "cats": [ 36 ], + "script": "^https?://s\\d\\.buysellads\\.com/", + "icon": "BuySellAds.png", "js": { "_bsa": "", - "_bsap": "", "_bsaPRO": "", + "_bsap": "", "_bsap_serving_callback": "" }, - "html": "<script[^>]*>[^<]+?bsa\\.src\\s*=\\s*['\"](?:https?:)?\\/{2}\\w\\d\\.buysellads\\.com\\/[\\w\\d\\/]+?bsa\\.js['\"]", - "icon": "BuySellAds.png", - "script": "^https?://s\\d\\.buysellads\\.com/", "website": "http://buysellads.com" }, - "C++": { + "CDN77": { "cats": [ - 27 + 31 ], - "icon": "C++.png", - "website": "http://isocpp.org" + "headers": { + "Server": "^CDN77-Turbo$" + }, + "icon": "CDN77.png", + "website": "https://www.cdn77.com" }, "CFML": { "cats": [ @@ -1416,11 +1590,12 @@ "cats": [ 24 ], + "icon": "CKEditor.png", "js": { "CKEDITOR": "", - "CKEDITOR.version": "(.*)\\;version:\\1" + "CKEDITOR.version": "^(.+)$\\;version:\\1", + "CKEDITOR_BASEPATH": "" }, - "icon": "CKEditor.png", "website": "http://ckeditor.com" }, "CMS Made Simple": { @@ -1447,14 +1622,6 @@ }, "website": "http://www.cmsimple.org/en" }, - "CO2Stats": { - "cats": [ - 10 - ], - "html": "src=[^>]+co2stats\\.com/propres\\.php", - "icon": "CO2Stats.png", - "website": "http://co2stats.com" - }, "CPG Dragonfly": { "cats": [ 1 @@ -1473,15 +1640,15 @@ "cats": [ 6 ], - "js": { - "fn_compare_strings": "" - }, "html": [ " Powered by (?:<a href=[^>]+cs-cart\\.com|CS-Cart)", "\\.cm-noscript[^>]+</style>" ], "icon": "CS Cart.png", "implies": "PHP", + "js": { + "fn_compare_strings": "" + }, "website": "http://www.cs-cart.com" }, "CacheFly": { @@ -1521,33 +1688,15 @@ }, "website": "http://cakephp.org" }, - "Canon": { + "Captch Me": { "cats": [ - 40 - ], - "icon": "Canon.png", - "website": "http://www.canon.com" - }, - "Canon HTTP Server": { - "cats": [ - 22 - ], - "headers": { - "Server": "CANON HTTP Server(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Canon.png", - "implies": "Canon", - "website": "http://www.canon.com" - }, - "Captch Me": { - "cats": [ - 16, - 36 + 16, + 36 ], + "icon": "Captch Me.svg", "js": { "Captchme": "" }, - "icon": "Captch Me.svg", "script": "^https?://api\\.captchme\\.net/", "website": "http://captchme.com" }, @@ -1555,11 +1704,11 @@ "cats": [ 36 ], + "html": "<[a-z]+ [^>]*id=\"carbonads-container\"", + "icon": "Carbon Ads.png", "js": { "_carbonads": "" }, - "html": "<[a-z]+ [^>]*id=\"carbonads-container\"", - "icon": "Carbon Ads.png", "script": "//(?:engine|srv)\\.carbonads\\.com\\/", "website": "http://carbonads.net" }, @@ -1581,38 +1730,16 @@ 12, 18 ], - "js": { - "catberry": "", - "catberry.version": "(.*)\\;version:\\1" - }, "headers": { "X-Powered-By": "Catberry" }, "icon": "Catberry.js.png", "implies": "Node.js", - "website": "http://catberry.org" - }, - "Catwalk": { - "cats": [ - 22 - ], - "headers": { - "Server": "Catwalk\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "Catwalk.png", - "implies": "Canon", - "website": "http://www.canon.com" - }, - "CDN77": { - "cats": [ - 31 - ], - "headers": { - "server": "^CDN77-Turbo$", - "Server": "^CDN77-Turbo$" + "js": { + "catberry": "", + "catberry.version": "^(.+)$\\;version:\\1" }, - "icon": "CDN77.png", - "website": "https://www.cdn77.com" + "website": "http://catberry.org" }, "CentOS": { "cats": [ @@ -1625,16 +1752,6 @@ "icon": "CentOS.png", "website": "http://centos.org" }, - "CenteHTTPd": { - "cats": [ - 22 - ], - "headers": { - "Server": "CenteHTTPd(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "CenteHTTPd.png", - "website": "http://cente.jp/cente/app/HTTPdc.html" - }, "Chameleon": { "cats": [ 1 @@ -1668,29 +1785,29 @@ "cats": [ 25 ], + "icon": "Chart.js.svg", "js": { "Chart": "\\;confidence:50", + "Chart.defaults.doughnut": "", "chart.ctx.bezierCurveTo": "" }, - "icon": "Chart.js.svg", "script": [ - "Chart(?:\\.bundle)?(?:\\.min)?\\.js\\;confidence:50", + "/Chart(?:\\.bundle)?(?:\\.min)?\\.js\\;confidence:75", "chartjs\\.org/dist/([\\d.]+(?:-[^/]+)?|master|latest)/Chart.*\\.js\\;version:\\1", "cdnjs\\.cloudflare\\.com/ajax/libs/Chart\\.js/([\\d.]+(?:-[^/]+)?)/Chart.*\\.js\\;version:\\1", - "cdn\\.jsdelivr\\.net/npm/chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1", - "cdn\\.jsdelivr\\.net/gh/chartjs/Chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1" + "cdn\\.jsdelivr\\.net/(?:npm|gh/chartjs)/chart\\.js@([\\d.]+(?:-[^/]+)?|latest)/dist/Chart.*\\.js\\;version:\\1" ], - "website": "http://www.chartjs.org" + "website": "https://www.chartjs.org" }, "Chartbeat": { "cats": [ 10 ], + "icon": "Chartbeat.png", "js": { - "_sf_endpt": "", - "_sf_async_config": "" + "_sf_async_config": "", + "_sf_endpt": "" }, - "icon": "Chartbeat.png", "script": "chartbeat\\.js", "website": "http://chartbeat.com" }, @@ -1699,7 +1816,7 @@ 22 ], "headers": { - "Server": "Cherokee(?:/([\\d.]+))?\\;version:\\1" + "Server": "^Cherokee(?:/([\\d.]+))?\\;version:\\1" }, "icon": "Cherokee.png", "website": "http://www.cherokee-project.com" @@ -1716,15 +1833,28 @@ "implies": "Python", "website": "http://www.cherrypy.org" }, + "Chevereto": { + "cats": [ + 7 + ], + "meta": { + "generator": "^Chevereto ?([0-9.]+)?$\\;version:\\1" + }, + "script": "/chevereto\\.js", + "html": "Powered by <a href=\"https?://chevereto\\.com\">", + "icon": "chevereto.png", + "implies": "PHP", + "website": "https://chevereto.com/" + }, "Chitika": { "cats": [ 36 ], + "icon": "Chitika.png", "js": { "ch_client": "", "ch_color_site_link": "" }, - "icon": "Chitika.png", "script": "scripts\\.chitika\\.net/", "website": "http://chitika.com" }, @@ -1744,19 +1874,37 @@ "PostgreSQL" ], "meta": { - "generator": ".*ckan.*" + "generator": "^ckan ?([0-9.]+)$\\;version:\\1" }, "website": "http://ckan.org/" }, + "Clarity": { + "cats": [ + 18 + ], + "html": [ + "<clr-main-container", + "<link [^>]*href=\"[^\"]*clr-ui(?:\\.min)?\\.css" + ], + "js": { + "ClarityIcons": "" + }, + "script": "clr-angular(?:\\.umd)?(?:\\.min)?\\.js", + "icon": "clarity.svg", + "implies": [ + "Angular" + ], + "website": "https://clarity.design/" + }, "ClickHeat": { "cats": [ 10 ], + "icon": "ClickHeat.png", + "implies": "PHP", "js": { "clickHeatServer": "" }, - "icon": "ClickHeat.png", - "implies": "PHP", "script": "clickheat.*\\.js", "website": "http://www.labsmedia.com/clickheat/index.html" }, @@ -1764,20 +1912,20 @@ "cats": [ 10 ], + "icon": "ClickTale.png", "js": { "clickTaleStartEventSignal": "" }, - "icon": "ClickTale.png", "website": "http://www.clicktale.com" }, "Clicky": { "cats": [ 10 ], + "icon": "Clicky.png", "js": { "clicky": "" }, - "icon": "Clicky.png", "script": "static\\.getclicky\\.com", "website": "http://getclicky.com" }, @@ -1808,28 +1956,33 @@ "script": "/cloudcart-(?:assets|storage)/", "website": "http://cloudcart.com" }, - "Cloudcoins": { + "CloudFlare": { "cats": [ - 56 + 31 ], + "headers": { + "Server": "^cloudflare$", + "cf-cache-status": "", + "cf-ray": "" + }, + "icon": "CloudFlare.svg", + "cookies": { + "__cfduid": "" + }, "js": { - "CLOUDCOINS": "" + "CloudFlare": "" }, - "script": "https?://cdn\\.cloudcoins\\.co/javascript/cloudcoins\\.min\\.js", - "website": "https://cloudcoins.co" + "website": "http://www.cloudflare.com" }, - "CloudFlare": { + "Cloudcoins": { "cats": [ - 31 + 56 ], "js": { - "CloudFlare": "" - }, - "headers": { - "Server": "cloudflare" + "CLOUDCOINS": "" }, - "icon": "CloudFlare.svg", - "website": "http://www.cloudflare.com" + "script": "https?://cdn\\.cloudcoins\\.co/javascript/cloudcoins\\.min\\.js", + "website": "https://cloudcoins.co" }, "Cloudera": { "cats": [ @@ -1841,26 +1994,26 @@ "icon": "Cloudera.png", "website": "http://www.cloudera.com" }, - "CNV Platform": { + "Coaster CMS": { "cats": [ 1 ], - "cookies": { - "cnv_session": "" - }, - "icon": "CNV.png", + "icon": "coaster-cms.png", "implies": "Laravel", - "website": "https://cnv.vn" + "meta": { + "generator": "^Coaster CMS v([\\d.]+)$\\;version:\\1" + }, + "website": "https://www.coastercms.org" }, "CodeIgniter": { "cats": [ 18 ], "cookies": { - "exp_last_activity": "", - "exp_tracker": "", + "ci_csrf_token": "^(.+)$\\;version:\\1?2+:", "ci_session": "", - "ci_csrf_token": "(.*)\\;version:\\1?2+:" + "exp_last_activity": "", + "exp_tracker": "" }, "html": "<input[^>]+name=\"ci_csrf_token\"\\;version:2+", "icon": "CodeIgniter.png", @@ -1871,23 +2024,26 @@ "cats": [ 19 ], + "icon": "CodeMirror.png", "js": { "CodeMirror": "", - "CodeMirror.version": "(.*)\\;version:\\1" + "CodeMirror.version": "^(.+)$\\;version:\\1" }, - "icon": "CodeMirror.png", "website": "http://codemirror.net" }, "CoinHive": { "cats": [ 56 ], + "icon": "CoinHive.svg", "js": { "CoinHive": "" }, - "script": "\\/(?:coinhive|(authedmine))(?:\\.min)?\\.js\\;version:\\1?opt-in:", + "script": [ + "\\/(?:coinhive|(authedmine))(?:\\.min)?\\.js\\;version:\\1?opt-in:", + "coinhive\\.com/lib" + ], "url": "https?://cnhv\\.co/", - "icon": "CoinHive.svg", "website": "https://coinhive.com" }, "CoinHive Captcha": { @@ -1896,43 +2052,69 @@ 56 ], "html": "(?:<div[^>]+class=\"coinhive-captcha[^>]+data-key|<div[^>]+data-key[^>]+class=\"coinhive-captcha)", - "script": "https?://authedmine\\.com/(?:lib/captcha|captcha)", "icon": "CoinHive.svg", + "script": "https?://authedmine\\.com/(?:lib/captcha|captcha)", "website": "https://coinhive.com" }, + "Coinhave": { + "cats": [ + 56 + ], + "icon": "coinhave.png", + "script": "https?://coin-have\\.com/c/[0-9a-zA-Z]{4}\\.js", + "website": "https://coin-have.com/" + }, "Coinimp": { "cats": [ 56 ], + "icon": "coinimp.png", "js": { "Client.Anonymous": "\\;confidence:50" }, "script": "https?://www\\.hashing\\.win/scripts/min\\.js", - "icon": "coinimp.png", "website": "https://www.coinimp.com" }, "Coinlab": { "cats": [ 56 ], + "icon": "coinlab.png", "js": { "Coinlab": "" }, "script": "https?://coinlab\\.biz/lib/coinlab\\.js\\?id=", - "icon": "coinlab.png", "website": "https://coinlab.biz/en" }, - "Comandia": { + "ColorMeShop": { "cats": [ 6 ], + "icon": "colormeshop.png", "js": { - "Comandia": "" + "Colorme": "" }, + "website": "https://shop-pro.jp" + }, + "Comandia": { + "cats": [ + 6 + ], "html": "<link[^>]+=['\"]//cdn\\.mycomandia\\.com", "icon": "Comandia.svg", + "js": { + "Comandia": "" + }, "website": "http://comandia.com" }, + "Combeenation": { + "cats": [ + 6 + ], + "html": "<iframe[^>]+src=\"[^>]+portal\\.combeenation\\.com", + "icon": "Combeenation.png", + "website": "https://www.combeenation.com" + }, "Commerce Server": { "cats": [ 6 @@ -1958,11 +2140,14 @@ "cats": [ 1 ], + "icon": "Concrete5.png", + "implies": "PHP", "js": { "CCM_IMAGE_PATH": "" }, - "icon": "Concrete5.png", - "implies": "PHP", + "cookies": { + "CONCRETE5": "" + }, "meta": { "generator": "^concrete5 - ([\\d.]+)$\\;version:\\1" }, @@ -2006,11 +2191,11 @@ }, "website": "http://contenido.org/en" }, - "Contens": { + "Contensis": { "cats": [ 1 ], - "icon": "Contens.png", + "icon": "Contensis.png", "implies": [ "Java", "CFML" @@ -2018,7 +2203,7 @@ "meta": { "generator": "Contensis CMS Version ([\\d.]+)\\;version:\\1" }, - "website": "http://www.contens.com/en/pub/index.cfm" + "website": "https://zengenti.com/en-gb/products/contensis" }, "ContentBox": { "cats": [ @@ -2086,13 +2271,23 @@ "icon": "CouchDB.png", "website": "http://couchdb.apache.org" }, + "Countly": { + "cats": [ + 10 + ], + "icon": "Countly.png", + "js": { + "Countly": "" + }, + "website": "https://count.ly" + }, "Cowboy": { "cats": [ 18, 22 ], "headers": { - "Server": "Cowboy" + "Server": "^Cowboy$" }, "icon": "Cowboy.png", "implies": "Erlang", @@ -2117,7 +2312,7 @@ "CraftSessionId": "" }, "headers": { - "X-Powered-By": "\bCraft CMS\b" + "X-Powered-By": "\\bCraft CMS\\b" }, "icon": "Craft CMS.svg", "implies": "Yii", @@ -2128,7 +2323,7 @@ 6 ], "headers": { - "X-Powered-By": "\bCraft Commerce\b" + "X-Powered-By": "\\bCraft Commerce\\b" }, "icon": "Craft CMS.svg", "implies": "Craft CMS", @@ -2138,10 +2333,10 @@ "cats": [ 10 ], + "icon": "Crazy Egg.png", "js": { "CE2": "" }, - "icon": "Crazy Egg.png", "script": "script\\.crazyegg\\.com/pages/scripts/\\d+/\\d+\\.js", "website": "http://crazyegg.com" }, @@ -2149,33 +2344,45 @@ "cats": [ 36 ], + "icon": "Criteo.svg", "js": { "Criteo": "", "criteo_pubtag": "", "criteo_q": "" }, - "icon": "Criteo.svg", - "script": "//(?:cas\\.criteo\\.com|(?:[^/]\\.)?criteo\\.net)/", + "script": [ + "//(?:cas\\.criteo\\.com|(?:[^/]\\.)?criteo\\.net)/", + "//static.criteo.net/js/ld/ld.js" + ], "website": "http://criteo.com" }, "Cross Pixel": { "cats": [ 10 ], + "icon": "Cross Pixel.png", "js": { "cp_C4w1ldN2d9PmVrkN": "" }, - "icon": "Cross Pixel.png", "script": "tag\\.crsspxl\\.com/s1\\.js", "website": "http://datadesk.crsspxl.com" }, + "CrossBox": { + "cats": [ + 30 + ], + "icon": "CrossBox.png", + "html": "<span class=\"product-name-loading\">CrossBox Premium Webmail", + "website": "https://crossbox.io" + }, "Crypto-Loot": { "cats": [ 56 ], + "icon": "Crypto-Loot.png", "js": { - "CryptoLoot": "", - "CRLT.CONFIG.ASMJS_NAME": "" + "CRLT.CONFIG.ASMJS_NAME": "", + "CryptoLoot": "" }, "script": [ "^/crypto-loot\\.com/lib/", @@ -2183,7 +2390,6 @@ "^/cryptoloot\\.pro/", "/crlt\\.js\\;confidence:75" ], - "icon": "Crypto-Loot.png", "website": "https://crypto-loot.com/" }, "CubeCart": { @@ -2202,10 +2408,10 @@ "cats": [ 17 ], + "icon": "Cufon.png", "js": { "Cufon": "" }, - "icon": "Cufon.png", "script": "cufon-yui\\.js", "website": "http://cufon.shoqolate.com" }, @@ -2213,21 +2419,39 @@ "cats": [ 25 ], + "icon": "D3.png", "js": { - "d3.version": "(.*)\\;version:\\1" + "d3.version": "^(.+)$\\;version:\\1" }, - "icon": "D3.png", "script": "/d3(?:\\. v\\d+)?(?:\\.min)?\\.js", "website": "http://d3js.org" }, "DHTMLX": { "cats": [ - 12 + 59 ], "icon": "DHTMLX.png", "script": "dhtmlxcommon\\.js", "website": "http://dhtmlx.com" }, + "DERAK.CLOUD": { + "cats": [ + 31 + ], + "headers": { + "Server": "^DERAK.CLOUD$", + "Derak-Umbrage": "" + }, + "icon": "DerakCloud.png", + "cookies": { + "__derak_auth": "", + "__derak_user": "" + }, + "js": { + "derakCloud.init": "" + }, + "website": "https://derak.cloud/" + }, "DM Polopoly": { "cats": [ 1 @@ -2241,10 +2465,6 @@ "cats": [ 1 ], - "js": { - "DotNetNuke": "", - "dnn.apiversion": "(.*)\\;version:\\1" - }, "cookies": { "DotNetNukeAnonymous": "" }, @@ -2259,6 +2479,10 @@ ], "icon": "DNN.png", "implies": "Microsoft ASP.NET", + "js": { + "DotNetNuke": "", + "dnn.apiversion": "^(.+)$\\;version:\\1" + }, "meta": { "generator": "DotNetNuke" }, @@ -2268,20 +2492,6 @@ ], "website": "http://dnnsoftware.com" }, - "Docusaurus": { - "cats": [ - 4 - ], - "meta": { - "generator": "^Docusaurus$" - }, - "icon": "docusaurus.svg", - "implies": [ - "React", - "webpack" - ], - "website": "https://docusaurus.io/" - }, "DTG": { "cats": [ 1 @@ -2291,7 +2501,7 @@ ], "icon": "DTG.png", "implies": "Mono.net", - "website": "http://www.dtg.nl" + "website": "https://www.dtg.nl" }, "Dancer": { "cats": [ @@ -2326,22 +2536,22 @@ "cats": [ 27 ], - "icon": "Dart.svg", - "implies": "AngularDart", "excludes": [ "Angular", "AngularJS" ], - "website": "https://www.dartlang.org", - "script": [ - "/(?:\\.)?(?:dart)(?:\\.js)?/", - "packages/browser/dart\\.js" - ], "html": "/(?:<script)[^>]+(?:type=\"application/dart\")/", + "icon": "Dart.svg", + "implies": "AngularDart", "js": { "___dart__$dart_dartObject_ZxYxX_0_": "", "___dart_dispatch_record_ZxYxX_0_": "" - } + }, + "script": [ + "/(?:\\.)?(?:dart)(?:\\.js)?/", + "packages/browser/dart\\.js" + ], + "website": "https://www.dartlang.org" }, "Darwin": { "cats": [ @@ -2352,43 +2562,59 @@ "X-Powered-By": "Darwin" }, "icon": "Apple.svg", - "website": "http://opensource.apple.com" + "website": "https://opensource.apple.com" + }, + "Datadome": { + "cats": [ + 19 + ], + "cookies": { + "datadome": "" + }, + "script": "^https://ct\\.datadome\\.co/[a-z]\\.js$", + "headers": { + "X-DataDome": "", + "Server": "^DataDome$", + "X-DataDome-CID": "" + }, + "icon": "datadome.png", + "website": "https://datadome.co/" }, "DataLife Engine": { "cats": [ 1 ], - "js": { - "dle_root": "" - }, "icon": "DataLife Engine.png", "implies": [ "PHP", "Apache" ], + "js": { + "dle_root": "" + }, "meta": { "generator": "DataLife Engine" }, - "website": "http://dle-news.ru" + "website": "https://dle-news.ru" }, "DataTables": { "cats": [ - 12 + 59 ], "icon": "DataTables.png", "implies": "jQuery", "script": "dataTables.*\\.js", "website": "http://datatables.net" }, - "David Webbox": { + "Day.js": { "cats": [ - 22 + 59 ], - "headers": { - "Server": "David-WebBox/([\\d.a]+ \\(\\d+\\))\\;version:\\1" + "icon": "Day.js.svg", + "js": { + "dayjs": "" }, - "icon": "David Webbox.png", - "website": "http://www.tobit.com" + "website": "https://github.com/iamkun/dayjs" }, "Debian": { "cats": [ @@ -2399,64 +2625,26 @@ "X-Powered-By": "(?:Debian|dotdeb|(potato|woody|sarge|etch|lenny|squeeze|wheezy|jessie|stretch|buster|sid))\\;version:\\1" }, "icon": "Debian.png", - "website": "http://debian.org" - }, - "Decorum": { - "cats": [ - 22 - ], - "headers": { - "Server": "DECORUM(?:/([\\d.]+))?\\;version:\\1" - }, - "website": "http://example.com" + "website": "https://debian.org" }, "DedeCMS": { "cats": [ 1 ], + "icon": "DedeCMS.png", + "implies": "PHP", "js": { "DedeContainer": "" }, - "icon": "DedeCMS.png", - "implies": "PHP", "script": "dedeajax", "website": "http://dedecms.com" }, - "deepMiner": { + "DirectAdmin": { "cats": [ - 56 + 9 ], - "js": { - "deepMiner": "" - }, - "script": "deepMiner\\.js", - "icon": "deepminer.png", - "website": "https://github.com/deepwn/deepMiner" - }, - "Dell": { - "cats": [ - 40 - ], - "icon": "Dell.svg", - "website": "http://dell.com" - }, - "Deployd": { - "cats": [ - 12 - ], - "js": { - "dpd": "" - }, - "icon": "Deployd.png", - "script": "dpd\\.js", - "website": "http://deployd.com" - }, - "DirectAdmin": { - "cats": [ - 9 - ], - "headers": { - "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" + "headers": { + "Server": "DirectAdmin Daemon v([\\d.]+)\\;version:\\1" }, "html": "<a[^>]+>DirectAdmin</a> Web Control Panel", "icon": "DirectAdmin.png", @@ -2464,64 +2652,64 @@ "PHP", "Apache" ], - "website": "http://www.directadmin.com" + "website": "https://www.directadmin.com" }, "Discourse": { "cats": [ 2 ], + "icon": "Discourse.png", + "implies": "Ruby on Rails", "js": { "Discourse": "" }, - "icon": "Discourse.png", - "implies": "Ruby on Rails", "meta": { "generator": "Discourse(?: ?/?([\\d.]+\\d))?\\;version:\\1" }, - "website": "http://discourse.org" + "website": "https://discourse.org" }, "Discuz! X": { "cats": [ 2 ], - "js": { - "discuz_uid": "", - "discuzVersion": "(.*)\\;version:\\1", - "DISCUZCODE": "" - }, "icon": "Discuz X.png", "implies": "PHP", + "js": { + "DISCUZCODE": "", + "discuzVersion": "^(.+)$\\;version:\\1", + "discuz_uid": "" + }, "meta": { "generator": "Discuz! X([\\d\\.]+)?\\;version:\\1" }, - "website": "http://discuz.com" + "website": "http://www.discuz.net" }, "Disqus": { "cats": [ 15 ], + "html": "<div[^>]+id=\"disqus_thread\"", + "icon": "Disqus.svg", "js": { "DISQUS": "", "disqus_shortname": "", "disqus_url": "" }, - "html": "<div[^>]+id=\"disqus_thread\"", - "icon": "Disqus.svg", "script": "disqus_url", - "website": "http://disqus.com" + "website": "https://disqus.com" }, "Django": { "cats": [ 18 ], - "js": { - "django": "", - "__admin_media_prefix__": "" - }, - "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?|<input[^>]*name=[\"']csrfmiddlewaretoken[\"'][^>]*>)\\;version:\\1", + "html": "(?:powered by <a[^>]+>Django ?([\\d.]+)?<\\/a>|<input[^>]*name=[\"']csrfmiddlewaretoken[\"'][^>]*>)\\;version:\\1", "icon": "Django.png", "implies": "Python", - "website": "http://djangoproject.com" + "js": { + "__admin_media_prefix__": "", + "django": "" + }, + "website": "https://djangoproject.com" }, "Django CMS": { "cats": [ @@ -2529,19 +2717,45 @@ ], "icon": "Django CMS.png", "implies": "Django", - "website": "http://django-cms.org" + "website": "https://django-cms.org" + }, + "Docusaurus": { + "cats": [ + 4 + ], + "icon": "docusaurus.svg", + "implies": [ + "React", + "webpack" + ], + "js": { + "search.indexName": "" + }, + "meta": { + "generator": "^Docusaurus$" + }, + "website": "https://docusaurus.io/" + }, + "Docker": { + "cats": [ + 60 + ], + "icon": "Docker.svg", + "implies": "Linux", + "html": "<!-- This comment is expected by the docker HEALTHCHECK -->", + "website": "https://www.docker.com/" }, "Dojo": { "cats": [ - 12 + 59 ], + "icon": "Dojo.png", "js": { "dojo": "", - "dojo.version.major": "(.*)\\;version:\\1" + "dojo.version.major": "^(.+)$\\;version:\\1" }, - "icon": "Dojo.png", "script": "([\\d.]+)/dojo/dojo(?:\\.xd)?\\.js\\;version:\\1", - "website": "http://dojotoolkit.org" + "website": "https://dojotoolkit.org" }, "Dokeos": { "cats": [ @@ -2561,7 +2775,7 @@ "meta": { "generator": "Dokeos" }, - "website": "http://dokeos.com" + "website": "https://dokeos.com" }, "DokuWiki": { "cats": [ @@ -2570,12 +2784,16 @@ "cookies": { "DokuWiki": "" }, + "html": [ + "<div[^>]+id=\"dokuwiki__>", + "<a[^>]+href=\"#dokuwiki__" + ], "icon": "DokuWiki.png", "implies": "PHP", "meta": { - "generator": "^DokuWiki( Release [\\-\\d]+)?\\;version:\\1" + "generator": "^DokuWiki( Release [\\d-]+)?\\;version:\\1" }, - "website": "http://www.dokuwiki.org" + "website": "https://www.dokuwiki.org" }, "Dotclear": { "cats": [ @@ -2643,36 +2861,41 @@ "meta": { "generator": "Doxygen ([\\d.]+)\\;version:\\1" }, - "website": "http://www.stack.nl/~dimitri/doxygen/" + "website": "http://www.doxygen.nl/" }, "DreamWeaver": { "cats": [ 20 ], - "html": "(?:<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)|function MM_preloadImages\\(\\) \\{)\\;version:\\1", + "html": "<!--[^>]*(?:InstanceBeginEditable|Dreamweaver([^>]+)target|DWLayoutDefaultTable)\\;version:\\1", + "js": { + "MM_showMenu": "", + "MM_preloadImages": "", + "MM_showHideLayers": "" + }, "icon": "DreamWeaver.png", - "website": "http://www.adobe.com/products/dreamweaver" + "website": "https://www.adobe.com/products/dreamweaver.html" }, "Drupal": { "cats": [ 1 ], - "js": { - "Drupal": "" - }, "headers": { "Expires": "19 Nov 1978", "X-Drupal-Cache": "", - "X-Generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1" + "X-Generator": "^Drupal(?:\\s([\\d.]+))?\\;version:\\1" }, - "html": "<(?:link|style)[^>]+sites/(?:default|all)/(?:themes|modules)/", + "html": "<(?:link|style)[^>]+\"/sites/(?:default|all)/(?:themes|modules)/", "icon": "Drupal.svg", "implies": "PHP", + "js": { + "Drupal": "" + }, "meta": { - "generator": "Drupal(?:\\s([\\d.]+))?\\;version:\\1" + "generator": "^Drupal(?:\\s([\\d.]+))?\\;version:\\1" }, "script": "drupal\\.js", - "website": "http://drupal.org" + "website": "https://drupal.org" }, "Drupal Commerce": { "cats": [ @@ -2703,25 +2926,26 @@ "cats": [ 10 ], + "headers": { + "X-dynaTrace-JS-Agent": "" + }, "icon": "Dynatrace.png", "script": "dtagent.*\\.js", "website": "http://dynatrace.com" }, - "E-Commerce Paraguay": { + "EasyEngine": { "cats": [ - 6 + 47, + 9 ], - "icon": "eCommercePy.png", - "script": "cdn\\.e-commerceparaguay\\.com", - "website": "http://e-commerceparaguay.com" - }, - "E-Merchant": { - "cats": [ - 6 + "icon": "EasyEngine.png", + "implies": [ + "Docker" ], - "icon": "E-Merchant.png", - "script": "cdn\\.e-merchant\\.com", - "website": "http://e-merchant.com" + "headers": { + "x-powered-by": "^EasyEngine (.*)$\\;version:\\1" + }, + "website": "https://easyengine.io" }, "EC-CUBE": { "cats": [ @@ -2735,17 +2959,23 @@ ], "website": "http://www.ec-cube.net" }, - "ef.js": { + "Elementor": { "cats": [ - 12 + 51 + ], + "html": [ + "<div class=(?:\"|')[^\"']*elementor", + "<section class=(?:\"|')[^\"']*elementor", + "<link [^>]*href=(?:\"|')[^\"']*elementor/assets", + "<link [^>]*href=(?:\"|')[^\"']*uploads/elementor/css" ], - "icon": "ef.js.svg", "js": { - "ef.version": "(.*)\\;version:\\1", - "efCore": "" + "elementorFrontend.getElements": "" }, - "script": "/ef(?:-core)?(?:\\.min|\\.dev)?\\.js", - "website": "http://ef.js.org" + "script": "elementor/assets/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", + "icon": "Elementor.png", + "implies": "WordPress", + "website": "https://elementor.com" }, "ELOG": { "cats": [ @@ -2760,7 +2990,7 @@ 22 ], "headers": { - "Server": "ELOG HTTP( \\d[\\-\\d\\.]+)?\\;version:\\1" + "Server": "ELOG HTTP ?([\\d.-]+)?\\;version:\\1" }, "icon": "ELOG.png", "implies": "ELOG", @@ -2782,8 +3012,8 @@ 1 ], "cookies": { - "EPiTrace": "", - "EPiServer": "" + "EPiServer": "", + "EPiTrace": "" }, "icon": "EPiServer.png", "implies": "Microsoft ASP.NET", @@ -2796,38 +3026,17 @@ "cats": [ 19 ], - "js": { - "EPrints": "", - "EPJS_menu_template": "" - }, "icon": "EPrints.png", "implies": "Perl", + "js": { + "EPJS_menu_template": "", + "EPrints": "" + }, "meta": { "generator": "EPrints ([\\d.]+)\\;version:\\1" }, "website": "http://www.eprints.org" }, - "ESERV-10": { - "cats": [ - 22 - ], - "headers": { - "Server": "ESERV-10(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "ESERV-10.png", - "website": "http://www.violasystems.com" - }, - "EWS-NIC4": { - "cats": [ - 22 - ], - "headers": { - "Server": "EWS-NIC4(?:\\/([\\d\\.a-z]+))?\\;version:\\1" - }, - "icon": "EWS-NIC4.png", - "implies": "Dell", - "website": "http://dell.com" - }, "EdgeCast": { "cats": [ 31 @@ -2864,17 +3073,30 @@ }, "website": "http://eleanor-cms.ru" }, + "Element UI": { + "cats": [ + 12 + ], + "icon": "ElementUI.svg", + "implies": [ + "Vue" + ], + "html": [ + "<(?:div|button) class=\"el-(?:table-column|table-filter|popper|pagination|pager|select-group|form|form-item|color-predefine|color-hue-slider|color-svpanel|color-alpha-slider|color-dropdown|color-picker|badge|tree|tree-node|select|message|dialog|checkbox|checkbox-button|checkbox-group|container|steps|carousel|menu|menu-item|submenu|menu-item-group|button|button-group|card|table|select-dropdown|row|tabs|notification|radio|progress|progress-bar|tag|popover|tooltip|cascader|cascader-menus|cascader-menu|time-spinner|spinner|spinner-inner|transfer|transfer-panel|rate|slider|dropdown|dropdown-menu|textarea|input|input-group|popup-parent|radio-group|main|breadcrumb|time-range-picker|date-range-picker|year-table|date-editor|range-editor|time-spinner|date-picker|time-panel|date-table|month-table|picker-panel|collapse|collapse-item|alert|select-dropdown|select-dropdown__empty|select-dropdown__wrap|select-dropdown__list|scrollbar|switch|carousel|upload|upload-dragger|upload-list|upload-cover|aside|input-number|header|message-box|footer|radio-button|step|autocomplete|autocomplete-suggestion|loading-parent|loading-mask|loading-spinner|)" + ], + "website": "https://element.eleme.io/" + }, "Eloqua": { "cats": [ 32 ], + "icon": "Oracle.png", "js": { - "elqSiteID": "", - "elqLoad": "", "elqCurESite": "", + "elqLoad": "", + "elqSiteID": "", "elq_global": "" }, - "icon": "Oracle.png", "script": "elqCfg\\.js", "website": "http://eloqua.com" }, @@ -2888,37 +3110,46 @@ "icon": "Embedthis.png", "website": "http://embedthis.com/appweb" }, - "Embedthis-http": { - "cats": [ - 22 - ], - "headers": { - "Server": "Embedthis-http(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Embedthis.png", - "website": "http://github.com/embedthis/http" - }, "Ember.js": { "cats": [ 12 ], + "icon": "Ember.js.png", + "implies": "Handlebars", "js": { "Ember": "", - "Ember.VERSION": "(.*)\\;version:\\1" + "Ember.VERSION": "^(.+)$\\;version:\\1" }, - "icon": "Ember.js.png", - "implies": "Handlebars", "website": "http://emberjs.com" }, + "Ensighten": { + "cats": [ + 42 + ], + "script": "//nexus\\.ensighten\\.com/", + "icon": "ensighten.png", + "website": "https://success.ensighten.com/hc/en-us" + }, + "Envoy": { + "cats": [ + 64 + ], + "icon": "Envoy.png", + "headers": { + "Server": "^envoy$", + "x-envoy-upstream-service-time": "" + }, + "website": "https://www.envoyproxy.io/" + }, "Enyo": { "cats": [ 12, 26 ], + "icon": "Enyo.png", "js": { "enyo": "" }, - "icon": "Enyo.png", "script": "enyo\\.js", "website": "http://enyojs.com" }, @@ -2929,16 +3160,16 @@ "html": "<link[^>]+?href=\"[^\"]+epoch(?:\\.min)?\\.css", "implies": "D3", "script": "epoch(?:\\.min)?\\.js", - "website": "http://fastly.github.io/epoch" + "website": "https://fastly.github.io/epoch" }, "Epom": { "cats": [ 36 ], + "icon": "Epom.png", "js": { "epomCustomParams": "" }, - "icon": "Epom.png", "url": "^https?://(?:[^/]+\\.)?ad(?:op)?shost1\\.com/", "website": "http://epom.com" }, @@ -2947,48 +3178,51 @@ 27 ], "headers": { - "Server": "Erlang( OTP/(?:[\\-\\d\\.ABR]+))?\\;version:\\1" + "Server": "Erlang( OTP/(?:[\\d.ABR-]+))?\\;version:\\1" }, "icon": "Erlang.png", "website": "http://www.erlang.org" }, - "Etherpad": { + "Essential JS 2": { "cats": [ - 24 + 12, + 18, + 59 ], + "icon": "syncfusion.svg", + "website": "https://www.syncfusion.com/javascript-ui-controls", "js": { - "padeditbar": "", - "padimpexp": "" + "ej.base": "" }, + "html": "<[^<]* class=\"[^<]*\be-control\b[^-][^<]*\be-lib\b[^>]*\"[^>]*>" + }, + "Etherpad": { + "cats": [ + 24 + ], "headers": { "Server": "^Etherpad" }, "icon": "etherpad.png", "implies": "Node.js", + "js": { + "padeditbar": "", + "padimpexp": "" + }, "script": [ "/ep_etherpad-lite/" ], "website": "https://etherpad.org" }, - "Exagon Concept": { - "cats": [ - 1 - ], - "headers": { - "Server": "Exagon Server" - }, - "icon": "ExagonConcept.svg", - "website": "http://www.exagon-concept.com" - }, "Exhibit": { "cats": [ 25 ], + "icon": "Exhibit.png", "js": { "Exhibit": "", - "Exhibit.version": "(.*)\\;version:\\1" + "Exhibit.version": "^(.+)$\\;version:\\1" }, - "icon": "Exhibit.png", "script": "exhibit.*\\.js", "website": "http://simile-widgets.org/exhibit/" }, @@ -3009,9 +3243,9 @@ 1 ], "cookies": { + "exp_csrf_token": "", "exp_last_activity": "", - "exp_tracker": "", - "exp_csrf_token": "" + "exp_tracker": "" }, "icon": "ExpressionEngine.png", "implies": "PHP", @@ -3021,13 +3255,34 @@ "cats": [ 12 ], + "icon": "ExtJS.png", "js": { "Ext": "", - "Ext.versions.extjs.version": "(.*)\\;version:\\1" + "Ext.version": "^(.+)$\\;version:\\1", + "Ext.versions.extjs.version": "^(.+)$\\;version:\\1" }, - "icon": "ExtJS.png", "script": "ext-base\\.js", - "website": "http://www.extjs.com" + "website": "https://www.sencha.com" + }, + "F5 BigIP": { + "cats": [ + 64 + ], + "headers": { + "server": "^big-?ip$" + }, + "cookies": { + "F5_ST": "", + "MRHSHint": "", + "F5_HT_shrinked": "", + "F5_fullWT": "", + "MRHSequence": "", + "MRHSession": "", + "LastMRH_Session": "", + "TIN": "" + }, + "icon": "F5.png", + "website": "https://www.f5.com/products/big-ip-services" }, "FAST ESP": { "cats": [ @@ -3081,16 +3336,26 @@ }, "FancyBox": { "cats": [ - 12 + 59 ], "icon": "FancyBox.png", + "implies": "jQuery", "js": { - "$.fancybox.version": "(.*)\\;version:\\1" + "$.fancybox.version": "^(.+)$\\;version:\\1" }, - "implies": "jQuery", "script": "jquery\\.fancybox(?:\\.pack|\\.min)?\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1", "website": "http://fancyapps.com/fancybox" }, + "Fastcommerce": { + "cats": [ + 6 + ], + "icon": "Fastcommerce.png", + "meta": { + "generator": "^Fastcommerce" + }, + "website": "https://www.fastcommerce.com.br" + }, "Fastly": { "cats": [ 31 @@ -3098,6 +3363,7 @@ "headers": { "Fastly-Debug-Digest": "", "Vary": "Fastly-SSL", + "x-via-fastly:": "", "X-Fastly-Request-ID": "" }, "icon": "Fastly.svg", @@ -3114,6 +3380,16 @@ "implies": "PHP", "website": "http://fatfreeframework.com" }, + "Fbits": { + "cats": [ + 6 + ], + "icon": "Fbits.png", + "js": { + "fbits": "" + }, + "website": "https://www.traycorp.com.br" + }, "Fedora": { "cats": [ 28 @@ -3126,12 +3402,12 @@ }, "Fingerprintjs": { "cats": [ - 12 + 59 ], "js": { "Fingerprint": "(\\d)?$\\;version:\\1", "Fingerprint2": "", - "Fingerprint2.VERSION": "(.*)\\;version:\\1" + "Fingerprint2.VERSION": "^(.+)$\\;version:\\1" }, "script": "fingerprint(\\d)?(?:\\.min)?\\.js\\;version:\\1", "website": "https://valve.github.io/fingerprintjs2/" @@ -3140,10 +3416,10 @@ "cats": [ 34 ], + "icon": "Firebase.png", "js": { "firebase.SDK_VERSION": "([\\d.]+)$\\;version:\\1" }, - "icon": "Firebase.png", "script": "/(?:([\\d.]+)/)?firebase(?:\\.min)?\\.js\\;version:\\1", "website": "https://firebase.com" }, @@ -3157,14 +3433,21 @@ "icon": "Fireblade.png", "website": "http://fireblade.com" }, - "FlashCom": { + "Flarum": { "cats": [ - 22 + 2 ], - "headers": { - "Server": "FlashCom/?([\\d\\.]+)?\\;version:\\1" + "html": "<div id=\"flarum-loading\"", + "icon": "flarum.png", + "implies": [ + "PHP", + "MySQL" + ], + "js": { + "app.cache.discussionList": "", + "app.forum.freshness": "" }, - "website": "http://example.com" + "website": "http://flarum.org/" }, "Flask": { "cats": [ @@ -3182,9 +3465,9 @@ "cats": [ 18 ], + "html": "<link[^>]* href=[^>]+flat-ui(?:\\.min)?\\.css", "icon": "Flat UI.png", "implies": "Bootstrap", - "html": "<link[^>]* href=[^>]+flat-ui(?:\\.min)?\\.css", "website": "https://designmodo.github.io/Flat-UI/" }, "FlexCMP": { @@ -3215,7 +3498,7 @@ }, "Flickity": { "cats": [ - 12 + 59 ], "js": { "Flickity": "" @@ -3227,10 +3510,10 @@ "cats": [ 2 ], - "html": "Powered by (?:<strong>)?<a href=\"[^>]+fluxbb", + "html": "<p id=\"poweredby\">[^<]+<a href=\"https?://fluxbb\\.org/\">", "icon": "FluxBB.png", "implies": "PHP", - "website": "http://fluxbb.org" + "website": "https://fluxbb.org" }, "Flyspray": { "cats": [ @@ -3249,7 +3532,7 @@ 17 ], "html": [ - "<link[^>]* href=[^>]+font-awesome(?:\\.min)?\\.css", + "<link[^>]* href=[^>]+(?:([\\d.]+)/)?(?:css/)?font-awesome(?:\\.min)?\\.css\\;version:\\1", "<script[^>]* src=[^>]+fontawesome(?:\\.js)?" ], "icon": "Font Awesome.png", @@ -3279,9 +3562,6 @@ "cats": [ 8 ], - "js": { - "foswiki": "" - }, "cookies": { "FOSWIKISTRIKEONE": "", "SFOSWIKISID": "" @@ -3295,6 +3575,9 @@ ], "icon": "foswiki.png", "implies": "Perl", + "js": { + "foswiki": "" + }, "meta": { "foswiki.SERVERTIME": "", "foswiki.WIKINAME": "" @@ -3311,27 +3594,43 @@ "icon": "FreeBSD.png", "website": "http://freebsd.org" }, - "Freespee": { - "cats": [ - 10 - ], - "script": "analytics\\.freespee\\.com/js/external/fs\\.(?:min\\.)?js", - "icon": "Freespee.svg", - "website": "https://www.freespee.com" - }, "FreeTextBox": { "cats": [ 24 ], + "html": "/<!--\\s*\\*\\s*FreeTextBox v\\d+ \\(([.\\d]+)(?:(?:.|\\n)+?<!--\\s*\\*\\s*License Type: (Distribution|Professional)License)?/i\\;version:\\1 \\2", + "icon": "FreeTextBox.png", + "implies": "Microsoft ASP.NET", "js": { "FTB_API": "", "FTB_AddEvent": "" }, - "html": "/<!--\\s*\\*\\s*FreeTextBox v\\d+ \\(([.\\d]+)(?:(?:.|\n)+?<!--\\s*\\*\\s*License Type: (Distribution|Professional)License)?/i\\;version:\\1 \\2", - "icon": "FreeTextBox.png", - "implies": "Microsoft ASP.NET", "website": "http://freetextbox.com" }, + "Freespee": { + "cats": [ + 10 + ], + "icon": "Freespee.svg", + "script": "analytics\\.freespee\\.com/js/external/fs\\.(?:min\\.)?js", + "website": "https://www.freespee.com" + }, + "Freshchat": { + "cats": [ + 52 + ], + "icon": "freshchat.png", + "script": "wchat\\.freshchat\\.com/js/widget\\.js", + "website": "https://www.freshworks.com/live-chat-software/" + }, + "Freshmarketer": { + "cats": [ + 10 + ], + "icon": "freshmarketer.png", + "script": "cdn\\.freshmarketer\\.com", + "website": "https://www.freshworks.com/marketing-automation/conversion-rate-optimization/" + }, "Froala Editor": { "cats": [ 24 @@ -3350,8 +3649,8 @@ ], "icon": "FrontPage.png", "meta": { - "generator": "Microsoft FrontPage(?:\\s((?:Express )?[\\d.]+))?\\;version:\\1", - "ProgId": "^FrontPage\\." + "ProgId": "^FrontPage\\.", + "generator": "Microsoft FrontPage(?:\\s((?:Express )?[\\d.]+))?\\;version:\\1" }, "website": "http://office.microsoft.com/frontpage" }, @@ -3359,13 +3658,21 @@ "cats": [ 36 ], + "icon": "Fusion Ads.png", "js": { "_fusion": "" }, - "icon": "Fusion Ads.png", "script": "^[^\\/]*//[ac]dn\\.fusionads\\.net/(?:api/([\\d.]+)/)?\\;version:\\1", "website": "http://fusionads.net" }, + "Future Shop": { + "cats": [ + 6 + ], + "icon": "futureshop.png", + "script": "future-shop.*\\.js", + "website": "https://www.future-shop.jp" + }, "G-WAN": { "cats": [ 22 @@ -3391,27 +3698,27 @@ "cats": [ 7 ], - "js": { - "galleryAuthToken": "", - "$.fn.gallery_valign": "" - }, "html": [ "<div id=\"gsNavBar\" class=\"gcBorder1\">", "<a href=\"http://gallery\\.sourceforge\\.net\"><img[^>]+Powered by Gallery\\s*(?:(?:v|Version)\\s*([0-9.]+))?\\;version:\\1" ], "icon": "Gallery.png", + "js": { + "$.fn.gallery_valign": "", + "galleryAuthToken": "" + }, "website": "http://galleryproject.org/" }, "Gambio": { "cats": [ 6 ], - "js": { - "gambio": "" - }, "html": "(?:<link[^>]* href=\"templates/gambio/|<a[^>]content\\.php\\?coID=\\d|<!-- gambio eof -->|<!--[\\s=]+Shopsoftware by Gambio GmbH \\(c\\))", "icon": "Gambio.png", "implies": "PHP", + "js": { + "gambio": "" + }, "script": "gm_javascript\\.js\\.php", "website": "http://gambio.de" }, @@ -3424,6 +3731,9 @@ "<div id=\"___gatsby\">", "<style id=\"gatsby-inlined-css\">" ], + "meta": { + "generator": "^Gatsby(?: ([0-9.]+))?$\\;version:\\1" + }, "icon": "Gatsby.svg", "implies": [ "React", @@ -3435,40 +3745,14 @@ "cats": [ 10 ], - "js": { - "_gauges": "" - }, "cookies": { "_gauges_": "" }, "icon": "Gauges.png", - "website": "https://get.gaug.es" - }, - "Gazelle": { - "cats": [ - 29 - ], - "html": [ - "<!-- Extra divs, for stylesheet developers to add imagery -->", - "<link rel=\"alternate\" type=\"application/rss+xml\" href=\"[^\"]+\" title=\"[^\"]+ - Gazelle Change Log\"" - ], - "js": { - "GazURL": "" - }, - "website": "https://whatcd.github.io/Gazelle/" - }, - "Genexus": { - "cats": [ - 18, - 19 - ], - "icon": "genexus.png", - "website": "https://www.genexus.com", "js": { - "gx.evt": "" + "_gauges": "" }, - "html": "<[^>]+class=\"gxp-page\"", - "script": "/gxp\\.js" + "website": "https://get.gaug.es" }, "Gentoo": { "cats": [ @@ -3484,10 +3768,6 @@ "cats": [ 47 ], - "js": { - "gerrit_ui": "", - "Gerrit": "" - }, "html": [ ">Gerrit Code Review</a>\\s*\"\\s*\\(([0-9.]+)\\)\\;version:\\1", "<(?:div|style) id=\"gerrit_" @@ -3497,6 +3777,10 @@ "Java", "git" ], + "js": { + "Gerrit": "", + "gerrit_ui": "" + }, "meta": { "title": "^Gerrit Code Review$" }, @@ -3507,10 +3791,10 @@ "cats": [ 13 ], + "icon": "Get Satisfaction.png", "js": { "GSFN": "" }, - "icon": "Get Satisfaction.png", "website": "https://getsatisfaction.com/corp/" }, "GetSimple CMS": { @@ -3546,19 +3830,20 @@ "meta": { "generator": "GitBook(?:.([\\d.]+))?\\;version:\\1" }, - "website": "http://gitbook.io" + "url": "^https?://[^/]+\\.gitbook\\.com/", + "website": "https://www.gitbook.com" }, "GitHub Pages": { "cats": [ 31 ], - "url": "^https?://[^/]+\\.github\\.io/", "headers": { "Server": "^GitHub\\.com$", "X-GitHub-Request-Id": "" }, "icon": "GitHub.svg", "implies": "Ruby on Rails", + "url": "^https?://[^/]+\\.github\\.io/", "website": "https://pages.github.com/" }, "GitLab": { @@ -3566,10 +3851,6 @@ 13, 47 ], - "js": { - "GitLab": "", - "gl.dashboardOptions": "" - }, "cookies": { "_gitlab_session": "" }, @@ -3579,6 +3860,10 @@ ], "icon": "GitLab.svg", "implies": "Ruby on Rails", + "js": { + "GitLab": "", + "gl.dashboardOptions": "" + }, "meta": { "og:site_name": "^GitLab$" }, @@ -3596,6 +3881,22 @@ }, "website": "http://about.gitlab.com/gitlab-ci" }, + "Gitea": { + "cats": [ + 47 + ], + "cookies": { + "i_like_gitea": "" + }, + "html": [ + "<div class=\"ui left\">\\n\\s+© Gitea Version: ([\\d.]+)\\;version:\\1" + ], + "icon": "gitea.svg", + "meta": { + "keywords": "^go,git,self-hosted,gitea$" + }, + "website": "https://gitea.io" + }, "Gitiles": { "cats": [ 47 @@ -3645,16 +3946,39 @@ "icon": "GoAhead.png", "website": "http://embedthis.com/products/goahead/index.html" }, + "GoJS": { + "cats": [ + 25 + ], + "icon": "GoJS.png", + "website": "https://gojs.net/", + "js": { + "go.version": "(.*)\\;version:\\1", + "go.GraphObject": "" + } + }, + "GoSquared": { + "cats": [ + 10, + 52, + 53 + ], + "icon": "gosquared.png", + "js": { + "_gs": "\\;confidence:30" + }, + "website": "https://www.gosquared.com/" + }, "GoStats": { "cats": [ 10 ], + "icon": "GoStats.png", "js": { "_goStatsRun": "", "_go_track_src": "", "go_msie": "" }, - "icon": "GoStats.png", "website": "http://gostats.com/" }, "Gogs": { @@ -3665,7 +3989,7 @@ "i_like_gogits": "" }, "html": [ - "<div class=\"ui left\">\n\\s+© \\d{4} Gogs Version: ([\\d.]+) Page:\\;version:\\1", + "<div class=\"ui left\">\\n\\s+© \\d{4} Gogs Version: ([\\d.]+) Page:\\;version:\\1", "<button class=\"ui basic clone button\" id=\"repo-clone-ssh\" data-link=\"gogs@" ], "icon": "gogs.png", @@ -3675,32 +3999,16 @@ "script": "js/gogs\\.js", "website": "http://gogs.io" }, - "Gitea": { - "cats": [ - 47 - ], - "cookies": { - "i_like_gitea": "" - }, - "html": [ - "<div class=\"ui left\">\n\\s+© Gitea Version: ([\\d.]+)\\;version:\\1" - ], - "icon": "gitea.svg", - "meta": { - "keywords": "^go,git,self-hosted,gitea$" - }, - "website": "https://gitea.io" - }, "Google AdSense": { "cats": [ 36 ], + "icon": "Google AdSense.svg", "js": { - "google_ad_": "", + "Goog_AdSense_": "", "__google_ad_urls": "", - "Goog_AdSense_": "" + "google_ad_": "" }, - "icon": "Google AdSense.svg", "script": [ "googlesyndication\\.com/", "ad\\.ca\\.doubleclick\\.net", @@ -3713,29 +4021,30 @@ "cats": [ 10 ], - "js": { - "gaGlobal": "", - "GoogleAnalyticsObject": "" - }, "cookies": { + "__utma": "", "_ga": "", - "_gat": "", - "__utma": "" + "_gat": "" }, "icon": "Google Analytics.svg", - "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:", + "html": "<amp-analytics [^>]*type=[\"']googleanalytics[\"']", + "js": { + "GoogleAnalyticsObject": "", + "gaGlobal": "" + }, + "script": "google-analytics\\.com\\/(?:ga|urchin|analytics)\\.js", "website": "http://google.com/analytics" }, "Google Analytics Enhanced eCommerce": { "cats": [ 10 ], + "icon": "Google Analytics.svg", + "implies": "Google Analytics", "js": { "gaplugins.EC": "" }, - "icon": "Google Analytics.svg", "script": "google-analytics\\.com\\/plugins\\/ua\\/(?:ec|ecommerce)\\.js", - "implies": "Google Analytics", "website": "https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce" }, "Google App Engine": { @@ -3752,32 +4061,42 @@ "cats": [ 25 ], + "icon": "Google Charts.png", "js": { "__googleVisualizationAbstractRendererElementsCount__": "", "__gvizguard__": "" }, - "icon": "Google Charts.png", "website": "http://developers.google.com/chart/" }, + "Google Cloud": { + "cats": [ + 31 + ], + "headers": { + "Via": "^1\\.1 google$" + }, + "icon": "google_cloud.svg", + "website": "https://cloud.google.com" + }, "Google Code Prettify": { "cats": [ 19 ], + "icon": "Google.svg", "js": { "prettyPrint": "" }, - "icon": "Google.svg", "website": "http://code.google.com/p/google-code-prettify" }, "Google Font API": { "cats": [ 17 ], + "html": "<link[^>]* href=[^>]+fonts\\.(?:googleapis|google)\\.com", + "icon": "Google Font API.png", "js": { "WebFonts": "" }, - "html": "<link[^>]* href=[^>]+fonts\\.(?:googleapis|google)\\.com", - "icon": "Google Font API.png", "script": "googleapis\\.com/.+webfont", "website": "http://google.com/fonts" }, @@ -3812,17 +4131,6 @@ "script": "apis\\.google\\.com/js/[a-z]*\\.js", "website": "http://plus.google.com" }, - "Google Search Appliance": { - "cats": [ - 22, - 29 - ], - "headers": { - "Server": "^Google\\sSearch\\sAppliance$" - }, - "icon": "Google Search Appliance.png", - "website": "https://enterprise.google.com/search" - }, "Google Sites": { "cats": [ 1 @@ -3835,15 +4143,15 @@ "cats": [ 42 ], - "js": { - "googletag": "", - "google_tag_manager": "" - }, "html": [ "googletagmanager\\.com/ns\\.html[^>]+></iframe>", "<!-- (?:End )?Google Tag Manager -->" ], "icon": "Google Tag Manager.png", + "js": { + "google_tag_manager": "", + "googletag": "" + }, "website": "http://www.google.com/tagmanager" }, "Google Wallet": { @@ -3871,11 +4179,11 @@ "cats": [ 18 ], + "icon": "Google Web Toolkit.png", + "implies": "Java", "js": { "__gwt_": "" }, - "icon": "Google Web Toolkit.png", - "implies": "Java", "meta": { "gwt:property": "" }, @@ -3896,17 +4204,6 @@ "script": "/graffiti\\.js", "website": "http://graffiticms.codeplex.com" }, - "Grandstream": { - "cats": [ - 22, - 39 - ], - "headers": { - "Server": "Grandstream\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "Grandstream.png", - "website": "http://www.grandstream.com" - }, "Grav": { "cats": [ 1 @@ -3922,11 +4219,11 @@ "cats": [ 19 ], + "html": "<[^>]+gravatar\\.com/avatar/", + "icon": "Gravatar.png", "js": { "Gravatar": "" }, - "html": "<[^>]+gravatar\\.com/avatar/", - "icon": "Gravatar.png", "website": "http://gravatar.com" }, "Gravity Forms": { @@ -3939,21 +4236,11 @@ "<ul [^>]*class=(?:\"|')[^>]*gform_fields", "<link [^>]*href=(?:\"|')[^>]*wp-content/plugins/gravityforms/css/" ], - "script": "/wp-content/plugins/gravityforms/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", "icon": "gravityforms.svg", "implies": "WordPress", + "script": "/wp-content/plugins/gravityforms/js/[^/]+\\.js\\?ver=([\\d.]+)$\\;version:\\1", "website": "http://gravityforms.com" }, - "Gravity Insights": { - "cats": [ - 10 - ], - "js": { - "gravityInsightsParams": "" - }, - "icon": "Gravity Insights.png", - "website": "http://insights.gravity.com" - }, "Green Valley CMS": { "cats": [ 1 @@ -3966,6 +4253,32 @@ }, "website": "http://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, + "Gridsome": { + "cats": [ + 57 + ], + "icon": "Gridsome.svg", + "implies": "Vue.js", + "meta": { + "generator": "^Gridsome v([\\d.]+)$\\;version:\\1" + }, + "website": "https://gridsome.org" + }, + "GrowingIO": { + "cats": [ + 10 + ], + "js": { + "gio": "" + }, + "cookies": { + "grwng_uid": "", + "gr_user_id": "" + }, + "icon": "GrowingIO.png", + "script": "assets\\.growingio\\.com/([\\d.]+)/gio.js\\;version:\\1", + "website": "https://www.growingio.com/" + }, "HERE": { "cats": [ 35 @@ -3985,13 +4298,6 @@ "implies": "PHP\\;confidence:75", "website": "http://hhvm.com" }, - "HP": { - "cats": [ - 40 - ], - "icon": "HP.svg", - "website": "http://hp.com" - }, "HP ChaiServer": { "cats": [ 22 @@ -4000,7 +4306,6 @@ "Server": "HP-Chai(?:Server|SOE)(?:/([\\d.]+))?\\;version:\\1" }, "icon": "HP.svg", - "implies": "HP", "website": "http://hp.com" }, "HP Compact Server": { @@ -4041,25 +4346,6 @@ "icon": "HP.svg", "website": "http://hp.com" }, - "HTTP Kit": { - "cats": [ - 22 - ], - "headers": { - "Server": "^http-kit" - }, - "implies": "Java", - "website": "http://http-kit.org" - }, - "HTTP-Server": { - "cats": [ - 22 - ], - "headers": { - "Server": "(?:^|[^-])\bHTTP-Server(?: ?/?V?([\\d.]+))?\\;version:\\1" - }, - "website": "http://example.com" - }, "HTTP/2": { "cats": [ 19 @@ -4069,7 +4355,7 @@ "X-Firefox-Spdy": "h2" }, "icon": "http2.png", - "website": "http://http2.github.io" + "website": "https://http2.github.io" }, "Haddock": { "cats": [ @@ -4081,14 +4367,14 @@ }, "Hammer.js": { "cats": [ - 12 + 59 ], + "icon": "Hammer.js.png", "js": { + "Ha.VERSION": "^(.+)$\\;version:\\1", "Hammer": "", - "Hammer.VERSION": "(.*)\\;version:\\1", - "Ha.VERSION": "(.*)\\;version:\\1" + "Hammer.VERSION": "^(.+)$\\;version:\\1" }, - "icon": "Hammer.js.png", "script": "hammer(?:\\.min)?\\.js", "website": "https://hammerjs.github.io" }, @@ -4096,33 +4382,23 @@ "cats": [ 12 ], + "html": "<[^>]*type=[^>]text\\/x-handlebars-template", + "icon": "Handlebars.png", "js": { "Handlebars": "", - "Handlebars.VERSION": "(.*)\\;version:\\1" + "Handlebars.VERSION": "^(.+)$\\;version:\\1" }, - "html": "<[^>]*type=[^>]text\\/x-handlebars-template", - "icon": "Handlebars.png", "script": "handlebars(?:\\.runtime)?(?:-v([\\d.]+?))?(?:\\.min)?\\.js\\;version:\\1", "website": "http://handlebarsjs.com" }, - "Happy ICS Server": { - "cats": [ - 22 - ], - "headers": { - "Server": "Happy ICS Server(?:/([\\d.]+))?\\;version:\\1" - }, - "implies": "OmniTouch 8660 My Teamwork", - "website": "http://example.com" - }, "Haravan": { "cats": [ 6 ], + "icon": "Haravan.png", "js": { "Haravan": "" }, - "icon": "Haravan.png", "script": "haravan.*\\.js", "website": "https://www.haravan.com" }, @@ -4135,13 +4411,13 @@ }, "HeadJS": { "cats": [ - 12 + 59 ], + "html": "<[^>]*data-headjs-load", + "icon": "HeadJS.png", "js": { "head.browser.name": "" }, - "html": "<[^>]*data-headjs-load", - "icon": "HeadJS.png", "script": "head\\.(?:core|load)(?:\\.min)?\\.js", "website": "http://headjs.com" }, @@ -4149,10 +4425,10 @@ "cats": [ 10 ], + "icon": "Heap.png", "js": { "heap": "" }, - "icon": "Heap.png", "script": "heap-\\d+\\.js", "website": "http://heapanalytics.com" }, @@ -4160,10 +4436,10 @@ "cats": [ 5 ], + "icon": "Hello Bar.png", "js": { "HelloBar": "" }, - "icon": "Hello Bar.png", "script": "hellobar\\.js", "website": "http://hellobar.com" }, @@ -4171,10 +4447,10 @@ "cats": [ 57 ], - "icon": "Hexo.png", "html": [ "Powered by <a href=\"https?://hexo\\.io/?\"[^>]*>Hexo</" ], + "icon": "Hexo.png", "meta": { "generator": "Hexo(?: v?([\\d.]+))?\\;version:\\1" }, @@ -4194,12 +4470,12 @@ "cats": [ 25 ], + "html": "<svg[^>]*><desc>Created with Highcharts ([\\d.]*)\\;version:\\1", + "icon": "Highcharts.png", "js": { "Highcharts": "", - "Highcharts.version": "(.*)\\;version:\\1" + "Highcharts.version": "^(.+)$\\;version:\\1" }, - "html": "<svg[^>]*><desc>Created with Highcharts ([\\d.]*)\\;version:\\1", - "icon": "Highcharts.png", "script": "highcharts.*\\.js", "website": "https://www.highcharts.com" }, @@ -4207,10 +4483,11 @@ "cats": [ 19 ], + "icon": "Highlight.js.png", "js": { + "hljs.highlightBlock": "", "hljs.listLanguages": "" }, - "icon": "Highlight.js.png", "script": "/(?:([\\d.])+/)?highlight(?:\\.min)?\\.js\\;version:\\1", "website": "https://highlightjs.org/" }, @@ -4220,27 +4497,39 @@ ], "html": "<svg[^>]*><desc>Created with Highstock ([\\d.]*)\\;version:\\1", "icon": "Highcharts.png", - "script": "highstock(?:\\-|\\.)?([\\d\\.]*\\d).*\\.js\\;version:\\1", + "script": "highstock[.-]?([\\d\\.]*\\d).*\\.js\\;version:\\1", "website": "http://highcharts.com/products/highstock" }, - "Hippo": { + "Hinza Advanced CMS": { + "cats": [ + 1, + 6 + ], + "icon": "hinza_advanced_cms.svg", + "implies": "Laravel", + "meta": { + "generator": "hinzacms" + }, + "website": "http://hinzaco.com" + }, + "Bloomreach": { "cats": [ 1 ], "html": "<[^>]+/binaries/(?:[^/]+/)*content/gallery/", - "icon": "Hippo.png", - "website": "http://onehippo.org" + "icon": "Bloomreach.png", + "website": "https://developers.bloomreach.com" }, "Hogan.js": { "cats": [ 12 ], + "icon": "Hogan.js.png", "js": { "Hogan": "" }, - "icon": "Hogan.js.png", "script": [ - "hogan-(?:-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "hogan-[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "([\\d.]+)/hogan(?:\\.min)?\\.js\\;version:\\1" ], "website": "https://twitter.github.io/hogan.js/" @@ -4275,12 +4564,12 @@ "cats": [ 10 ], + "icon": "Hotjar.png", "js": { "HotLeadfactory": "", "HotleadController": "", "hj.apiUrlBase": "" }, - "icon": "Hotjar.png", "script": "^//static\\.hotjar\\.com/c/hotjar-", "website": "https://www.hotjar.com" }, @@ -4288,23 +4577,23 @@ "cats": [ 32 ], + "html": "<!-- Start of Async HubSpot", + "icon": "HubSpot.png", "js": { "_hsq": "", "hubspot": "" }, - "html": "<!-- Start of Async HubSpot", - "icon": "HubSpot.png", "website": "https://www.hubspot.com" }, "Hugo": { "cats": [ 57 ], + "html": "powered by <a [^>]*href=\"http://hugo.spf13.com", "icon": "Hugo.png", "meta": { "generator": "Hugo ([\\d.]+)?\\;version:\\1" }, - "html": "powered by <a [^>]*href=\"http://hugo.spf13.com", "website": "http://gohugo.io" }, "Hybris": { @@ -4327,6 +4616,17 @@ "script": "cmdatatagutils\\.js", "website": "http://ibm.com/software/marketing-solutions/coremetrics" }, + "IBM DataPower": { + "cats": [ + 64 + ], + "headers": { + "X-Backside-Transport": "", + "X-Global-Transaction-ID": "" + }, + "icon": "DataPower.png", + "website": "https://www.ibm.com/products/datapower-gateway" + }, "IBM HTTP Server": { "cats": [ 22 @@ -4370,61 +4670,45 @@ "url": "/wps/", "website": "http://ibm.com/software/websphere/portal" }, - "Ideasoft": { - "cats": [ - 6 - ], - "icon": "Ideasoft.png", - "script": [ - "\\.myideasoft\\.com/" - ], - "website": "https://www.ideasoft.com" - }, "IIS": { "cats": [ 22 ], "headers": { - "Server": "IIS(?:/([\\d.]+))?\\;version:\\1" + "Server": "^(?:Microsoft-)?IIS(?:/([\\d.]+))?\\;version:\\1" }, "icon": "IIS.png", "implies": "Windows Server", "website": "http://www.iis.net" }, - "Includable": { + "INFOnline": { "cats": [ - 18 + 10 ], - "headers": { - "X-Includable-Version": "" + "icon": "INFOnline.png", + "js": { + "iam_data": "", + "szmvars": "" }, - "icon": "Includable.svg", - "website": "http://includable.com" + "script": "^https?://(?:[^/]+\\.)?i(?:oam|v)wbox\\.de/", + "website": "https://www.infonline.de" }, - "INFOnline": { + "INTI": { "cats": [ - 10 + 6, + 53 ], - "js": { - "szmvars": "", - "iam_data": "" - }, - "icon": "INFOnline.png", - "script": "^https?://(?:[^/]+\\.)?i(?:oam|v)wbox\\.de/", - "website": "https://www.infonline.de" + "icon": "byINTI.svg", + "url": "\\.byinti\\.com", + "website": "https://byinti.com" }, "IPB": { "cats": [ 2 ], "cookies": { - "ipbWWLsession_id": "", - "ipbWWLmodpids": "" - }, - "js": { - "IPBoard": "", - "ipb_var": "", - "ipsSettings": "" + "ipbWWLmodpids": "", + "ipbWWLsession_id": "" }, "html": "<link[^>]+ipb_[^>]+\\.css", "icon": "IPB.png", @@ -4432,34 +4716,45 @@ "PHP", "MySQL" ], + "js": { + "IPBoard": "", + "ipb_var": "", + "ipsSettings": "" + }, "script": "jscripts/ips_", "website": "https://invisioncommunity.com/" }, - "Immutable.js": { + "Ideasoft": { "cats": [ - 12 + 6 + ], + "icon": "Ideasoft.png", + "script": [ + "\\.myideasoft\\.com/" ], + "website": "https://www.ideasoft.com" + }, + "IdoSell Shop": { + "cats": [ + 6 + ], + "icon": "idosellshop.png", "js": { - "Immutable": "", - "Immutable.version": "(.*)\\;version:\\1" + "IAI_Ajax": "" }, - "icon": "Immutable.js.png", - "script": "^immutable\\.(?:min\\.)?js$", - "website": "https://facebook.github.io/immutable-js/" + "website": "https://www.idosell.com" }, - "imperia CMS": { + "Immutable.js": { "cats": [ - 1 + 59 ], - "meta": { - "X-Imperia-Live-Info": "", - "GENERATOR": "^IMPERIA ([0-9.]{2,})+$\\;version:\\1" + "icon": "Immutable.js.png", + "js": { + "Immutable": "", + "Immutable.version": "^(.+)$\\;version:\\1" }, - "html": "<imp:live-info sysid=\"[0-9a-f-]+\"(?: node_id=\"[0-9/]*\")? *\\/>", - "icon": "imperiaCMS.svg", - "implies": "Perl", - "url": "imperia/md/", - "website": "https://www.pirobase-imperia.com/de/produkte/produktuebersicht/imperia-cms" + "script": "^immutable\\.(?:min\\.)?js$", + "website": "https://facebook.github.io/immutable-js/" }, "ImpressCMS": { "cats": [ @@ -4484,7 +4779,7 @@ "icon": "ImpressPages.png", "implies": "PHP", "meta": { - "generator": "ImpressPages(?: CMS)?( [\\d.]*)\\;version:\\1" + "generator": "ImpressPages(?: CMS)?( [\\d.]*)?\\;version:\\1" }, "website": "http://impresspages.org" }, @@ -4507,6 +4802,16 @@ "icon": "Incapsula.png", "website": "http://www.incapsula.com" }, + "Includable": { + "cats": [ + 18 + ], + "headers": { + "X-Includable-Version": "" + }, + "icon": "Includable.svg", + "website": "http://includable.com" + }, "Indexhibit": { "cats": [ 1 @@ -4546,11 +4851,11 @@ "cats": [ 12 ], + "icon": "InfernoJS.png", "js": { "Inferno": "", - "Inferno.version": "(.*)\\;version:\\1" + "Inferno.version": "^(.+)$\\;version:\\1" }, - "icon": "InfernoJS.png", "website": "https://infernojs.org" }, "Infusionsoft": { @@ -4564,6 +4869,38 @@ "icon": "infusionsoft.svg", "website": "http://infusionsoft.com" }, + "Inspectlet": { + "cats": [ + 10 + ], + "html": [ + "<!-- (?:Begin|End) Inspectlet Embed Code -->" + ], + "icon": "inspectlet.png", + "js": { + "__insp": "", + "__inspld": "" + }, + "script": [ + "cdn\\.inspectlet\\.com" + ], + "website": "https://www.inspectlet.com/" + }, + "Instabot": { + "cats": [ + 5, + 10, + 32, + 52, + 58 + ], + "icon": "Instabot.png", + "js": { + "Instabot": "" + }, + "script": "/rokoInstabot\\.js", + "website": "https://instabot.io/" + }, "InstantCMS": { "cats": [ 1 @@ -4601,10 +4938,10 @@ "cats": [ 10 ], + "icon": "Intercom.png", "js": { "Intercom": "" }, - "icon": "Intercom.png", "script": "(?:api\\.intercom\\.io/api|static\\.intercomcdn\\.com/intercom\\.v1)", "website": "https://www.intercom.com" }, @@ -4616,15 +4953,6 @@ "script": "(?:is-bin|INTERSHOP)", "website": "http://intershop.com" }, - "INTI": { - "cats": [ - 6, - 53 - ], - "icon": "byINTI.svg", - "url": "^https?//.+\\.byinti\\.com", - "website": "http://byinti.com" - }, "Invenio": { "cats": [ 50 @@ -4640,13 +4968,25 @@ "cats": [ 56 ], + "icon": "inwemo.png", "js": { "Inwemo": "" }, "script": "https?://cdn\\.inwemo\\.com/inwemo\\.min\\.js", - "icon": "inwemo.png", "website": "https://inwemo.com/" }, + "Ionic": { + "cats": [ + 18 + ], + "icon": "ionic.png", + "implies": "Angular", + "js": { + "Ionic.config": "", + "Ionic.version": "^(.+)$\\;version:\\1" + }, + "website": "https://ionicframework.com" + }, "Ionicons": { "cats": [ 17 @@ -4655,17 +4995,6 @@ "icon": "Ionicons.png", "website": "http://ionicons.com" }, - "ip-label": { - "cats": [ - 10 - ], - "script": "clobs\\.js", - "js": { - "clobs": "" - }, - "icon": "iplabel.svg", - "website": "http://www.ip-label.com" - }, "JAlbum": { "cats": [ 7 @@ -4699,18 +5028,6 @@ "implies": "JBoss Application Server", "website": "http://jboss.org/jbossweb" }, - "JC-HTTPD": { - "cats": [ - 22 - ], - "excludes": "Apache", - "headers": { - "Server": "JC-HTTPD(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "JC-HTTPD.png", - "implies": "Canon", - "website": "http://canon.com" - }, "JET Enterprise": { "cats": [ 6 @@ -4725,13 +5042,24 @@ "cats": [ 25 ], + "icon": "JS Charts.png", "js": { "JSChart": "" }, - "icon": "JS Charts.png", "script": "jscharts.*\\.js", "website": "http://www.jscharts.com" }, + "JSEcoin": { + "cats": [ + 56 + ], + "icon": "JSEcoin.png", + "js": { + "jseMine": "" + }, + "script": "^(?:https):?//load\\.jsecoin\\.com/load/", + "website": "https://jsecoin.com/" + }, "JTL Shop": { "cats": [ 6 @@ -4743,6 +5071,15 @@ "icon": "JTL Shop.png", "website": "http://www.jtl-software.de/produkte/jtl-shop3" }, + "Jahia DX": { + "cats": [ + 1, + 47 + ], + "html": "<script id=\"staticAssetAggregatedJavascrip", + "icon": "JahiaDX.svg", + "website": "http://www.jahia.com/dx" + }, "Jalios": { "cats": [ 1 @@ -4753,15 +5090,6 @@ }, "website": "http://www.jalios.com" }, - "Jahia DX": { - "cats": [ - 1, - 47 - ], - "html": "<script id=\"staticAssetAggregatedJavascrip", - "icon": "JahiaDX.svg", - "website": "http://www.jahia.com/dx" - }, "Java": { "cats": [ 27 @@ -4787,11 +5115,11 @@ "cats": [ 25 ], + "icon": "JavaScript Infovis Toolkit.png", "js": { "$jit": "", - "$jit.version": "(.*)\\;version:\\1" + "$jit.version": "^(.+)$\\;version:\\1" }, - "icon": "JavaScript Infovis Toolkit.png", "script": "jit(?:-yc)?\\.js", "website": "https://philogb.github.io/jit/" }, @@ -4821,12 +5149,12 @@ "cats": [ 57 ], - "icon": "Jekyll.png", "html": [ "Powered by <a href=\"https?://jekyllrb\\.com\"[^>]*>Jekyll</", "<!-- Created with Jekyll Now -", "<!-- Begin Jekyll SEO tag" ], + "icon": "Jekyll.png", "meta": { "generator": "Jekyll (v[\\d.]+)?\\;version:\\1" }, @@ -4837,11 +5165,27 @@ 44 ], "headers": { - "X-Jenkins": "([\\d\\.]+)\\;version:\\1" + "X-Jenkins": "([\\d.]+)\\;version:\\1" }, + "html": "<span class=\"jenkins_ver\"><a href=\"https://jenkins\\.io/\">Jenkins ver\\. ([\\d.]+)\\;version:\\1", "icon": "Jenkins.png", "implies": "Java", - "website": "http://jenkins-ci.org" + "js": { + "jenkinsCIGlobal": "", + "jenkinsRules": "" + }, + "website": "https://jenkins.io/" + }, + "Jetshop": { + "cats": [ + 6 + ], + "html": "<(?:div|aside) id=\"jetshop-branding\">", + "icon": "Jetshop.png", + "js": { + "JetshopData": "" + }, + "website": "http://jetshop.se" }, "Jetty": { "cats": [ @@ -4858,15 +5202,16 @@ "cats": [ 1 ], - "js": { - "jimdo_Data": "", - "jimdoData": "" - }, "headers": { "X-Jimdo-Instance": "", "X-Jimdo-Wid": "" }, "icon": "jimdo.png", + "url": "\\.jimdo\\.com/", + "js": { + "jimdoData": "", + "jimdo_Data": "" + }, "website": "https://www.jimdo.com" }, "Jirafe": { @@ -4874,10 +5219,10 @@ 10, 32 ], + "icon": "Jirafe.png", "js": { "jirafe": "" }, - "icon": "Jirafe.png", "script": "/jirafe\\.js", "website": "https://docs.jirafe.com" }, @@ -4899,11 +5244,11 @@ "cats": [ 19 ], + "icon": "JobberBase.png", + "implies": "PHP", "js": { "Jobber": "" }, - "icon": "JobberBase.png", - "implies": "PHP", "meta": { "generator": "Jobberbase" }, @@ -4913,77 +5258,55 @@ "cats": [ 1 ], - "js": { - "jcomments": "", - "Joomla": "" - }, "headers": { "X-Content-Encoded-By": "Joomla! ([\\d.]+)\\;version:\\1" }, "html": "(?:<div[^>]+id=\"wrapper_r\"|<(?:link|script)[^>]+(?:feed|components)/com_|<table[^>]+class=\"pill)\\;confidence:50", "icon": "Joomla.svg", "implies": "PHP", + "js": { + "Joomla": "", + "jcomments": "" + }, "meta": { "generator": "Joomla!(?: ([\\d.]+))?\\;version:\\1" }, "url": "option=com_", "website": "https://www.joomla.org" }, - "JSEcoin": { - "cats": [ - 56 - ], - "js": { - "jseMine": "" - }, - "script": "^(?:https):?//load\\.jsecoin\\.com/server/load/", - "icon": "JSEcoin.png", - "website": "https://jsecoin.com/" - }, "K2": { "cats": [ 19 ], - "js": { - "K2RatingURL": "" - }, "html": "<!--(?: JoomlaWorks \"K2\"| Start K2)", "icon": "K2.png", "implies": "Joomla", + "js": { + "K2RatingURL": "" + }, "website": "https://getk2.org" }, "KISSmetrics": { "cats": [ 10 ], + "icon": "KISSmetrics.png", "js": { "KM_COOKIE_DOMAIN": "" }, - "icon": "KISSmetrics.png", "website": "https://www.kissmetrics.com" }, - "KS_HTTP": { - "cats": [ - 22 - ], - "headers": { - "Server": "KS_HTTP\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "KS_HTTP.png", - "implies": "Canon", - "website": "http://www.canon.com" - }, "Kajabi": { "cats": [ 6 ], - "js": { - "Kajabi": "" - }, "cookies": { "_kjb_session": "" }, "icon": "Kajabi.svg", + "js": { + "Kajabi": "" + }, "website": "https://newkajabi.com" }, "Kampyle": { @@ -4991,15 +5314,15 @@ 10, 13 ], - "js": { - "kampyle": "", - "k_track": "", - "KAMPYLE_COMMON": "" - }, "cookies": { "k_visit": "" }, "icon": "Kampyle.png", + "js": { + "KAMPYLE_COMMON": "", + "k_track": "", + "kampyle": "" + }, "script": "cf\\.kampyle\\.com/k_button\\.js", "website": "http://www.kampyle.com" }, @@ -5007,39 +5330,38 @@ "cats": [ 6 ], + "icon": "Kamva.svg", "js": { "Kamva": "" }, - "icon": "Kamva.svg", "meta": { "generator": "[CK]amva" }, "script": "cdn\\.mykamva\\.ir", "website": "https://kamva.ir" }, - "Hinza Advanced CMS": { + "Kemal": { "cats": [ - 1, - 6 + 18, + 22 ], - "icon": "hinza_advanced_cms.svg", - "meta": { - "generator": "hinzacms" + "headers": { + "X-Powered-By": "Kemal" }, - "implies": "Laravel", - "website": "http://hinzaco.com" + "icon": "kemalcr.png", + "website": "http://kemalcr.com" }, "Kendo UI": { "cats": [ 18 ], - "js": { - "kendo": "", - "kendo.version": "(.*)\\;version:\\1" - }, "html": "<link[^>]*\\s+href=[^>]*styles/kendo\\.common(?:\\.min)?\\.css[^>]*/>", "icon": "Kendo UI.png", "implies": "jQuery", + "js": { + "kendo": "", + "kendo.version": "^(.+)$\\;version:\\1" + }, "website": "https://www.telerik.com/kendo-ui" }, "Kentico CMS": { @@ -5055,6 +5377,19 @@ }, "website": "http://www.kentico.com" }, + "Kestrel": { + "cats": [ + 22 + ], + "headers": { + "Server": "^Kestrel" + }, + "implies": [ + "Microsoft ASP.NET" + ], + "icon": "kestrel.svg", + "website": "https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel" + }, "KeyCDN": { "cats": [ 31 @@ -5065,17 +5400,6 @@ "icon": "KeyCDN.png", "website": "http://www.keycdn.com" }, - "Kemal": { - "cats": [ - 18, - 22 - ], - "headers": { - "X-Powered-By": "Kemal" - }, - "icon": "kemalcr.png", - "website": "http://kemalcr.com" - }, "Kibana": { "cats": [ 29, @@ -5095,11 +5419,11 @@ "cats": [ 25 ], + "icon": "KineticJS.png", "js": { "Kinetic": "", - "Kinetic.version": "(.*)\\;version:\\1" + "Kinetic.version": "^(.+)$\\;version:\\1" }, - "icon": "KineticJS.png", "script": "kinetic(?:-v?([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1", "website": "https://github.com/ericdrowell/KineticJS/" }, @@ -5109,20 +5433,20 @@ 6, 5 ], + "icon": "Klarna.svg", "js": { "_klarnaCheckout": "" }, - "icon": "Klarna.svg", "website": "https://www.klarna.com/international/" }, "Knockout.js": { "cats": [ 12 ], + "icon": "Knockout.js.png", "js": { - "ko.version": "(.*)\\;version:\\1" + "ko.version": "^(.+)$\\;version:\\1" }, - "icon": "Knockout.js.png", "website": "http://knockoutjs.com" }, "Koa": { @@ -5157,8 +5481,8 @@ "icon": "Kobimaster.png", "implies": "Microsoft ASP.NET", "js": { - "kmPageInfo": "", - "kmGetSession": "" + "kmGetSession": "", + "kmPageInfo": "" }, "website": "https://www.kobimaster.com.tr" }, @@ -5166,18 +5490,18 @@ "cats": [ 21 ], - "meta": { - "generator": "^Koha ([\\d.]+)$\\;version:\\1" - }, - "js": { - "KOHA": "" - }, "html": [ "<input name=\"koha_login_context\" value=\"intranet\" type=\"hidden\">", "<a href=\"/cgi-bin/koha/" ], "icon": "koha.png", "implies": "Perl", + "js": { + "KOHA": "" + }, + "meta": { + "generator": "^Koha ([\\d.]+)$\\;version:\\1" + }, "website": "https://koha-community.org/" }, "Kohana": { @@ -5263,7 +5587,7 @@ 1 ], "headers": { - "X-KoobooCMS-Version": "(.*)\\;version:\\1" + "X-KoobooCMS-Version": "^(.+)$\\;version:\\1" }, "icon": "Kooboo CMS.png", "implies": "Microsoft ASP.NET", @@ -5278,6 +5602,14 @@ "script": "kotisivukone(?:\\.min)?\\.js", "website": "http://www.kotisivukone.fi" }, + "Kubernetes Dashboard": { + "cats": [ + 47 + ], + "html": "<html ng-app=\"kubernetesDashboard\">", + "icon": "Kubernetes.svg", + "website": "https://kubernetes.io/" + }, "LEPTON": { "cats": [ 1 @@ -5308,34 +5640,25 @@ }, "icon": "Laravel.png", "implies": "PHP", - "website": "http://laravel.com" + "js": { + "Laravel": "" + }, + "website": "https://laravel.com" }, "Laterpay": { "cats": [ 41 ], + "icon": "laterpay.png", "meta": { "laterpay:connector:callbacks:on_user_has_access": "deobfuscateText" }, - "script": "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-zA-z\\-]*/live/[\\w-]+\\.js\\;version:\\1", - "icon": "laterpay.png", + "script": "https?://connectormwi\\.laterpay\\.net/([0-9.]+)[a-zA-z-]*/live/[\\w-]+\\.js\\;version:\\1", "website": "https://www.laterpay.net/" }, - "MYPAGE Platform": { - "cats": [ - 1, - 6 - ], - "cookies": { - "botble_session": "" - }, - "icon": "mypage-platform.png", - "implies": "Laravel", - "website": "https://www.mypage.vn" - }, "Lazy.js": { "cats": [ - 12 + 59 ], "script": "lazy(?:\\.browser)?(?:\\.min)?\\.js", "website": "http://danieltao.com/lazy.js" @@ -5344,12 +5667,12 @@ "cats": [ 35 ], + "icon": "Leaflet.png", "js": { - "L.version": "(.*)\\;version:\\1\\;confidence:0", + "L.DistanceGrid": "", "L.PosAnimation": "", - "L.DistanceGrid": "" + "L.version": "^(.+)$\\;version:\\1\\;confidence:0" }, - "icon": "Leaflet.png", "script": "leaflet.*\\.js", "website": "http://leafletjs.com" }, @@ -5365,13 +5688,13 @@ "cats": [ 1 ], - "js": { - "Liferay": "" - }, "headers": { "Liferay-Portal": "[a-z\\s]+([\\d.]+)\\;version:\\1" }, "icon": "Liferay.png", + "js": { + "Liferay": "" + }, "website": "https://www.liferay.com" }, "Lift": { @@ -5402,7 +5725,7 @@ }, "Lightbox": { "cats": [ - 12 + 59 ], "html": "<link [^>]*href=\"[^\"]+lightbox(?:\\.min)?\\.css", "icon": "Lightbox.png", @@ -5428,7 +5751,7 @@ }, "icon": "Lighty.png", "implies": "PHP", - "website": "http://gitlab.com/lighty/framework" + "website": "https://gitlab.com/lighty/framework" }, "LimeSurvey": { "cats": [ @@ -5444,12 +5767,12 @@ "cats": [ 36 ], + "icon": "LinkSmart.png", "js": { - "_mb_site_guid": "", "LS_JSON": "", - "LinkSmart": "" + "LinkSmart": "", + "_mb_site_guid": "" }, - "icon": "LinkSmart.png", "script": "^https?://cdn\\.linksmart\\.com/linksmart_([\\d.]+?)(?:\\.min)?\\.js\\;version:\\1", "website": "http://linksmart.com" }, @@ -5463,12 +5786,12 @@ }, "List.js": { "cats": [ - 12 + 59 ], + "icon": "List.js.png", "js": { "List": "" }, - "icon": "List.js.png", "script": "^list\\.(?:min\\.)?js$", "website": "http://listjs.com" }, @@ -5486,25 +5809,25 @@ "cats": [ 1 ], - "js": { - "LITHIUM": "" - }, "cookies": { "LithiumVisitor": "" }, "html": " <a [^>]+Powered by Lithium", "icon": "Lithium.png", "implies": "PHP", + "js": { + "LITHIUM": "" + }, "website": "https://www.lithium.com" }, "LiveAgent": { "cats": [ 52 ], + "icon": "LiveAgent.png", "js": { "LiveAgent": "" }, - "icon": "LiveAgent.png", "website": "https://www.ladesk.com" }, "LiveChat": { @@ -5515,6 +5838,15 @@ "script": "cdn\\.livechatinc\\.com/.*tracking\\.js", "website": "http://livechatinc.com" }, + "LiveHelp": { + "cats": [ + 52, + 53 + ], + "icon": "LiveHelp.png", + "script": "^https?://server\\.livehelp\\.it/widgetjs/[0-9]{5}/[0-9]{1,3}\\.js", + "website": "http://www.livehelp.it" + }, "LiveJournal": { "cats": [ 11 @@ -5535,28 +5867,28 @@ "cats": [ 1 ], - "js": { - "LIVESTREET_SECURITY_KEY": "" - }, "headers": { "X-Powered-By": "LiveStreet CMS" }, "icon": "LiveStreet CMS.png", "implies": "PHP", + "js": { + "LIVESTREET_SECURITY_KEY": "" + }, "website": "http://livestreetcms.com" }, "Livefyre": { "cats": [ 15 ], + "html": "<[^>]+(?:id|class)=\"livefyre", + "icon": "Livefyre.png", "js": { - "fyre": "", "FyreLoader": "", + "L.version": "^(.+)$\\;confidence:0\\;version:\\1", "LF.CommentCount": "", - "L.version": "(.*)\\;confidence:0\\;version:\\1" + "fyre": "" }, - "html": "<[^>]+(?:id|class)=\"livefyre", - "icon": "Livefyre.png", "script": "livefyre_init\\.js", "website": "http://livefyre.com" }, @@ -5574,16 +5906,17 @@ "script": "/js/al/common\\.js\\?[0-9_]+", "website": "http://liveinternet.ru/rating/" }, - "Lo-dash": { + "LocalFocus": { "cats": [ - 12 + 61 ], - "icon": "Lo-dash.png", - "js": { - "_.VERSION": "(.*)\\;version:\\1" - }, - "script": "lodash.*\\.js", - "website": "http://www.lodash.com" + "html": "<iframe[^>]+localfocus", + "icon": "LocalFocus.png", + "implies": [ + "Angular", + "D3" + ], + "website": "https://www.localfocus.nl/en/" }, "Locomotive": { "cats": [ @@ -5597,6 +5930,19 @@ ], "website": "http://www.locomotivecms.com" }, + "Lodash": { + "cats": [ + 59 + ], + "excludes": "Underscore.js", + "icon": "Lo-dash.png", + "js": { + "_.VERSION": "^(.+)$\\;confidence:0\\;version:\\1", + "_.differenceBy": "" + }, + "script": "lodash.*\\.js", + "website": "http://www.lodash.com" + }, "Logitech Media Server": { "cats": [ 22, @@ -5619,12 +5965,20 @@ "implies": "Java", "website": "http://www-01.ibm.com/software/lotus/products/domino" }, + "LOU": { + "cats": [ + 58 + ], + "icon": "LOU.png", + "script": "cdn\\.louassist\\.com*", + "website": "https://www.louassist.com" + }, "Lua": { "cats": [ 27 ], "headers": { - "X-Powered-By": "\bLua(?: ([\\d.]+))?\\;version:\\1" + "X-Powered-By": "\\bLua(?: ([\\d.]+))?\\;version:\\1" }, "icon": "Lua.png", "website": "http://www.lua.org" @@ -5642,10 +5996,10 @@ 10, 29 ], + "icon": "Luigisbox.svg", "js": { "Luigis": "" }, - "icon": "Luigisbox.svg", "website": "https://www.luigisbox.com" }, "M.R. Inc BoxyOS": { @@ -5686,37 +6040,10 @@ "icon": "mhonarc.png", "website": "http://www.mhonarc.at" }, - "MkDocs": { - "cats": [ - 4 - ], - "meta": { - "generator": "^mkdocs-([\\d.]+)\\;version:\\1" - }, - "icon": "mkdocs.png", - "website": "http://www.mkdocs.org/" - }, - "MOBOTIX": { - "cats": [ - 39 - ], - "icon": "MOBOTIX.png", - "meta": { - "author": "MOBOTIX AG\\;confidence:40", - "copyright": "MOBOTIX AG\\;confidence:40", - "publisher": "MOBOTIX AG\\;confidence:40" - }, - "url": "control/userimage\\.html\\;confidence:70", - "website": "http://mobotix.com" - }, "MODX": { "cats": [ 1 ], - "js": { - "MODX": "", - "MODX_MEDIA_PATH": "" - }, "headers": { "X-Powered-By": "^MODX" }, @@ -5728,20 +6055,54 @@ ], "icon": "MODX.png", "implies": "PHP", + "js": { + "MODX": "", + "MODX_MEDIA_PATH": "" + }, "meta": { "generator": "MODX[^\\d.]*([\\d.]+)?\\;version:\\1" }, "website": "http://modx.com" }, + "MYPAGE Platform": { + "cats": [ + 1, + 6 + ], + "cookies": { + "mypage_session": "" + }, + "headers": { + "CMS-Version": "^(.+)$\\;version:\\1\\;confidence:0" + }, + "icon": "mypage-platform.png", + "implies": "Laravel", + "website": "https://www.mypage.vn" + }, + "Botble CMS": { + "cats": [ + 1, + 6 + ], + "cookies": { + "botble_session": "" + }, + "headers": { + "CMS-Version": "^(.+)$\\;version:\\1\\;confidence:0" + }, + "icon": "Botble-CMS.png", + "implies": "Laravel", + "website": "https://botble.com" + }, "MadAdsMedia": { "cats": [ 36 ], + "icon": "MadAdsMedia.png", "js": { "setMIframe": "", "setMRefURL": "" }, - "icon": "MadAdsMedia.png", "script": "^https?://(?:ads-by|pixel)\\.madadsmedia\\.com/", "website": "http://madadsmedia.com" }, @@ -5749,10 +6110,6 @@ "cats": [ 6 ], - "js": { - "Mage": "", - "VarienForm": "" - }, "cookies": { "frontend": "\\;confidence:50" }, @@ -5762,7 +6119,14 @@ "<script type=\"text/x-magento-init\">" ], "icon": "Magento.png", - "implies": "PHP", + "implies": [ + "PHP", + "MySQL" + ], + "js": { + "Mage": "", + "VarienForm": "" + }, "script": [ "js/mage", "skin/frontend/(?:default|(enterprise))\\;version:\\1?Enterprise:Community", @@ -5788,6 +6152,17 @@ ], "website": "http://mailchimp.com" }, + "MakeShopKorea": { + "cats": [ + 6 + ], + "icon": "MakeShopKorea.png", + "js": { + "Makeshop": "", + "MakeshopLogUniqueId": "" + }, + "website": "https://www.makeshop.co.kr" + }, "Mambo": { "cats": [ 1 @@ -5816,41 +6191,48 @@ "script": "\\/assets\\/js\\/manycontacts\\.min\\.js", "website": "http://www.manycontacts.com" }, - "Marked": { + "MariaDB": { "cats": [ - 12 + 34 ], - "js": { - "marked": "" - }, - "icon": "marked.svg", - "script": "/marked(?:\\.min)?\\.js", - "website": "https://marked.js.org" + "icon": "mariadb.svg", + "website": "https://mariadb.org" }, "Marionette.js": { "cats": [ 12 ], - "js": { - "Marionette": "", - "Marionette.VERSION": "(.*)\\;version:\\1" - }, "icon": "Marionette.js.svg", "implies": [ "Underscore.js", "Backbone.js" ], + "js": { + "Marionette": "", + "Marionette.VERSION": "^(.+)$\\;version:\\1" + }, "script": "backbone\\.marionette.*\\.js", "website": "https://marionettejs.com" }, + "Marked": { + "cats": [ + 59 + ], + "icon": "marked.svg", + "js": { + "marked": "" + }, + "script": "/marked(?:\\.min)?\\.js", + "website": "https://marked.js.org" + }, "Marketo": { "cats": [ 32 ], + "icon": "Marketo.png", "js": { "Munchkin": "" }, - "icon": "Marketo.png", "script": "munchkin\\.marketo\\.net/munchkin\\.js", "website": "https://www.marketo.com" }, @@ -5860,10 +6242,10 @@ ], "html": "<link[^>]* href=\"[^\"]*material(?:\\.[\\w]+-[\\w]+)?(?:\\.min)?\\.css", "icon": "Material Design Lite.png", - "script": "(?:/([\\d.]+))?/material(?:\\.min)?\\.js\\;version:\\1", "js": { "MaterialIconToggle": "" }, + "script": "(?:/([\\d.]+))?/material(?:\\.min)?\\.js\\;version:\\1", "website": "https://getmdl.io" }, "Materialize CSS": { @@ -5880,32 +6262,64 @@ "cats": [ 25 ], + "icon": "MathJax.png", "js": { "MathJax": "", - "MathJax.version": "(.*)\\;version:\\1" + "MathJax.version": "^(.+)$\\;version:\\1" }, - "icon": "MathJax.png", "script": "([\\d.]+)?/mathjax\\.js\\;version:\\1", "website": "https://www.mathjax.org" }, - "Mattermost": { + "Matomo": { "cats": [ - 2 + 10 ], + "cookies": { + "PIWIK_SESSID": "" + }, + "icon": "Piwik.png", "js": { - "mm_config": "", - "mm_license": "", - "mm_user": "", - "mm_current_user_id": "" + "Matomo": "", + "Piwik": "", + "_paq": "" + }, + "meta": { + "apple-itunes-app": "app-id=737216887", + "generator": "(?:Matomo|Piwik) - Open Source Web Analytics", + "google-play-app": "app-id=org\\.piwik\\.mobile2" }, + "script": "piwik\\.js|piwik\\.php", + "website": "http://piwik.org" + }, + "Mattermost": { + "cats": [ + 2 + ], "html": "<noscript> To use Mattermost, please enable JavaScript\\. </noscript>", "icon": "mattermost.png", "implies": [ "Go", "React" ], + "js": { + "mm_config": "", + "mm_current_user_id": "", + "mm_license": "", + "mm_user": "" + }, "website": "https://about.mattermost.com" }, + "Mautic": { + "cats": [ + 32 + ], + "icon": "mautic.svg", + "js": { + "MauticTrackingObject": "" + }, + "script": "[^a-z]mtc.*\\.js", + "website": "https://www.mautic.org/" + }, "MaxCDN": { "cats": [ 31 @@ -5947,11 +6361,11 @@ "cats": [ 14 ], + "icon": "MediaElement.js.png", "js": { "mejs": "", - "mejs.version": "(.*)\\;version:\\1" + "mejs.version": "^(.+)$\\;version:\\1" }, - "icon": "MediaElement.js.png", "website": "http://www.mediaelementjs.com" }, "MediaTomb": { @@ -5968,13 +6382,20 @@ "cats": [ 8 ], - "html": "(?:<a[^>]+>Powered by MediaWiki</a>|<[^>]+id=\"t-specialpages)", + "html": [ + "<body[^>]+class=\"mediawiki\"", + "<(?:a|img)[^>]+>Powered by MediaWiki</a>", + "<a[^>]+/Special:WhatLinksHere/" + ], "icon": "MediaWiki.png", "implies": "PHP", + "js": { + "mw.util.toggleToc": "" + }, "meta": { "generator": "^MediaWiki ?(.+)$\\;version:\\1" }, - "website": "http://www.mediawiki.org" + "website": "https://www.mediawiki.org" }, "Medium": { "cats": [ @@ -5983,8 +6404,8 @@ "headers": { "X-Powered-By": "^Medium$" }, - "implies": "Node.js", "icon": "Medium.svg", + "implies": "Node.js", "script": "medium\\.com", "url": "^https?://(?:www\\.)?medium\\.com", "website": "https://medium.com" @@ -6013,27 +6434,27 @@ "cats": [ 25 ], + "html": "<div [^>]*class=[\"']mermaid[\"']>\\;confidence:90", "js": { "mermaid": "" }, "script": "/mermaid(?:\\.min)?\\.js", - "html": "<div [^>]*class=[\"']mermaid[\"']>\\;confidence:90", "website": "https://mermaidjs.github.io/" }, "Meteor": { "cats": [ 12 ], - "js": { - "Meteor": "", - "Meteor.release": "^METEOR@([\\d.]+)\\;version:\\1" - }, "html": "<link[^>]+__meteor-css__", "icon": "Meteor.png", "implies": [ "MongoDB", "Node.js" ], + "js": { + "Meteor": "", + "Meteor.release": "^METEOR@([\\d.]+)\\;version:\\1" + }, "website": "https://www.meteor.com" }, "Methode": { @@ -6056,50 +6477,50 @@ 18 ], "cookies": { - "ASPSESSION": "", - "ASP.NET_SessionId": "" + "ASP.NET_SessionId": "", + "ASPSESSION": "" }, "headers": { "X-AspNet-Version": "(.+)\\;version:\\1", - "X-Powered-By": "ASP\\.NET\\;confidence:50" + "X-Powered-By": "^ASP\\.NET" }, "html": "<input[^>]+name=\"__VIEWSTATE", "icon": "Microsoft ASP.NET.png", "implies": "IIS\\;confidence:50", - "url": "\\.aspx(?:$|\\?)", - "website": "http://www.asp.net" - }, - "Microsoft HTTPAPI": { - "cats": [ - 22 - ], - "headers": { - "Server": "Microsoft-HTTPAPI(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Microsoft.svg", - "website": "http://microsoft.com" + "url": "\\.aspx?(?:$|\\?)", + "website": "https://www.asp.net" }, "Microsoft Excel": { "cats": [ 20 ], - "icon": "Microsoft Excel.svg", "html": "(?:<html [^>]*xmlns:w=\"urn:schemas-microsoft-com:office:excel\"|<!--\\s*(?:START|END) OF OUTPUT FROM EXCEL PUBLISH AS WEB PAGE WIZARD\\s*-->|<div [^>]*x:publishsource=\"?Excel\"?)", + "icon": "Microsoft Excel.svg", "meta": { - "generator": "Microsoft Excel( [\\d.]+)?\\;version:\\1", - "ProgId": "^Excel\\." + "ProgId": "^Excel\\.", + "generator": "Microsoft Excel( [\\d.]+)?\\;version:\\1" }, "website": "https://office.microsoft.com/excel" }, + "Microsoft HTTPAPI": { + "cats": [ + 22 + ], + "headers": { + "Server": "Microsoft-HTTPAPI(?:/([\\d.]+))?\\;version:\\1" + }, + "icon": "Microsoft.png", + "website": "http://microsoft.com" + }, "Microsoft PowerPoint": { "cats": [ 20 ], - "icon": "Microsoft PowerPoint.svg", "html": "(?:<html [^>]*xmlns:w=\"urn:schemas-microsoft-com:office:powerpoint\"|<link rel=\"?Presentation-XML\"? href=\"?[^\"]+\\.xml\"?>|<o:PresentationFormat>[^<]+</o:PresentationFormat>[^!]+<o:Slides>\\d+</o:Slides>(?:[^!]+<o:Version>([\\d.]+)</o:Version>)?)\\;version:\\1", + "icon": "Microsoft PowerPoint.svg", "meta": { - "generator": "Microsoft PowerPoint ( [\\d.]+)?\\;version:\\1", - "ProgId": "^PowerPoint\\." + "ProgId": "^PowerPoint\\.", + "generator": "Microsoft PowerPoint ( [\\d.]+)?\\;version:\\1" }, "website": "https://office.microsoft.com/powerpoint" }, @@ -6107,11 +6528,11 @@ "cats": [ 20 ], - "icon": "Microsoft Publisher.svg", "html": "(?:<html [^>]*xmlns:w=\"urn:schemas-microsoft-com:office:publisher\"|<!--[if pub]><xml>)", + "icon": "Microsoft Publisher.svg", "meta": { - "generator": "Microsoft Publisher( [\\d.]+)?\\;version:\\1", - "ProgId": "^Publisher\\." + "ProgId": "^Publisher\\.", + "generator": "Microsoft Publisher( [\\d.]+)?\\;version:\\1" }, "website": "https://office.microsoft.com/publisher" }, @@ -6119,17 +6540,17 @@ "cats": [ 1 ], - "js": { - "_spBodyOnLoadCalled": "", - "SPDesignerProgID": "" - }, "headers": { - "MicrosoftSharePointTeamServices": "(.*)\\;version:\\1", + "MicrosoftSharePointTeamServices": "^(.+)$\\;version:\\1", "SPRequestGuid": "", "SharePointHealthScore": "", "X-SharePointHealthScore": "" }, "icon": "Microsoft SharePoint.png", + "js": { + "SPDesignerProgID": "", + "_spBodyOnLoadCalled": "" + }, "meta": { "generator": "Microsoft SharePoint" }, @@ -6139,11 +6560,11 @@ "cats": [ 20 ], - "icon": "Microsoft Word.svg", "html": "(?:<html [^>]*xmlns:w=\"urn:schemas-microsoft-com:office:word\"|<w:WordDocument>|<div [^>]*class=\"?WordSection1[\" >]|<style[^>]*>[^>]*@page WordSection1)", + "icon": "Microsoft Word.svg", "meta": { - "generator": "Microsoft Word( [\\d.]+)?\\;version:\\1", - "ProgId": "^Word\\." + "ProgId": "^Word\\.", + "generator": "Microsoft Word( [\\d.]+)?\\;version:\\1" }, "website": "https://office.microsoft.com/word" }, @@ -6166,13 +6587,22 @@ "<link[^>]+?href=\"[^\"]+milligram(?:\\.min)?\\.css" ], "icon": "Milligram.png", - "website": "http://milligram.github.io" + "website": "https://milligram.github.io" + }, + "Minero.cc": { + "cats": [ + 56 + ], + "script": [ + "//minero\\.cc/lib/minero(?:-miner|-hidden)?\\.min\\.js" + ], + "website": "http://minero.cc/" }, "MiniBB": { "cats": [ 2 ], - "html": "<a href=\"[^\"]+minibb[^<]+</a>[^<]+\n<!--End of copyright link", + "html": "<a href=\"[^\"]+minibb[^<]+</a>[^<]+\\n<!--End of copyright link", "icon": "MiniBB.png", "website": "http://www.minibb.com" }, @@ -6189,32 +6619,50 @@ "cats": [ 10 ], + "icon": "Mint.png", "js": { "Mint": "" }, - "icon": "Mint.png", "script": "mint/\\?js", "website": "https://haveamint.com" }, + "Mithril": { + "cats": [ + 12 + ], + "icon": "Mithril.svg", + "script": "mithril/\\?js", + "website": "https://mithril.js.org" + }, "Mixpanel": { "cats": [ 10 ], + "icon": "Mixpanel.png", "js": { "mixpanel": "" }, - "icon": "Mixpanel.png", "script": "api\\.mixpanel\\.com/track", "website": "https://mixpanel.com" }, + "MkDocs": { + "cats": [ + 4 + ], + "icon": "mkdocs.png", + "meta": { + "generator": "^mkdocs-([\\d.]+)\\;version:\\1" + }, + "website": "http://www.mkdocs.org/" + }, "Mobify": { "cats": [ 26 ], + "icon": "Mobify.png", "js": { "Mobify": "" }, - "icon": "Mobify.png", "script": "//cdn\\.mobify\\.com/", "website": "https://www.mobify.com" }, @@ -6222,24 +6670,24 @@ "cats": [ 51 ], - "meta": { - "generator": "^Mobirise v([\\d.]+)\\;version:\\1" - }, "html": [ "<!-- Site made with Mobirise Website Builder v([\\d.]+)\\;version:\\1" ], "icon": "mobirise.png", + "meta": { + "generator": "^Mobirise v([\\d.]+)\\;version:\\1" + }, "website": "https://mobirise.com" }, "MochiKit": { "cats": [ - 12 + 59 ], + "icon": "MochiKit.png", "js": { "MochiKit": "", - "MochiKit.MochiKit.VERSION": "(.*)\\;version:\\1" + "MochiKit.MochiKit.VERSION": "^(.+)$\\;version:\\1" }, - "icon": "MochiKit.png", "script": "MochiKit(?:\\.min)?\\.js", "website": "https://mochi.github.io/mochikit/" }, @@ -6250,19 +6698,18 @@ "headers": { "Server": "MochiWeb(?:/([\\d.]+))?\\;version:\\1" }, - "website": "http://github.com/mochi/mochiweb" + "website": "https://github.com/mochi/mochiweb" }, "Modernizr": { "cats": [ - 12 + 59 ], + "icon": "Modernizr.svg", "js": { - "Modernizr._version": "(.*)\\;version:\\1" + "Modernizr._version": "^(.+)$\\;version:\\1" }, - "icon": "Modernizr.svg", "script": [ - "modernizr(?:-([\\d.]*[\\d]))?.*\\.js\\;version:\\1", - "/([\\d.]+)/modernizr(?:\\.min)?\\.js\\;version:\\1" + "([\\d.]+)?/modernizr(?:.([\\d.]+))?.*\\.js\\;version:\\1?\\1:\\2" ], "website": "https://modernizr.com" }, @@ -6281,20 +6728,24 @@ 1, 6 ], - "html": "(?:<script|link)[^>]*(?:src=|href=)[\"'][^\"]*mg-(?:core|plugins|templates)", + "html": "<link[^>]+href=[\"'][^\"]+mg-(?:core|plugins|templates)/", + "script": "mg-(?:core|plugins|templates)/", "icon": "Moguta.CMS.png", "implies": "PHP", - "website": "http://moguta.ru" + "website": "https://moguta.ru" }, "MoinMoin": { "cats": [ 8 ], - "js": { - "show_switch2gui": "" + "cookies": { + "MOIN_SESSION": "" }, "icon": "MoinMoin.png", "implies": "Python", + "js": { + "show_switch2gui": "" + }, "script": "moin(?:_static(\\d)(\\d)(\\d)|.+)/common/js/common\\.js\\;version:\\1.\\2.\\3", "website": "https://moinmo.in" }, @@ -6303,8 +6754,8 @@ 18 ], "headers": { - "x-powered-by": "mojolicious", - "server": "^mojolicious" + "server": "^mojolicious", + "x-powered-by": "mojolicious" }, "icon": "Mojolicious.png", "implies": "Perl", @@ -6321,22 +6772,22 @@ }, "Moment Timezone": { "cats": [ - 12 + 59 ], "icon": "Moment.js.svg", "implies": "Moment.js", - "script": "moment-timezone(?:\\-data)?(?:\\.min)?\\.js", + "script": "moment-timezone(?:-data)?(?:\\.min)?\\.js", "website": "http://momentjs.com/timezone/" }, "Moment.js": { "cats": [ - 12 + 59 ], + "icon": "Moment.js.svg", "js": { "moment": "", - "moment.version": "(.*)\\;version:\\1" + "moment.version": "^(.+)$\\;version:\\1" }, - "icon": "Moment.js.svg", "script": "moment(?:\\.min)?\\.js", "website": "https://momentjs.com" }, @@ -6350,6 +6801,14 @@ }, "website": "http://mondo-media.de" }, + "Monerominer": { + "cats": [ + 56 + ], + "html": "<iframe[^>]+src=[\\'\"]https?://monerominer\\.rocks/miner\\.php\\?siteid=", + "icon": "monerominer.png", + "website": "https://monerominer.rocks/" + }, "MongoDB": { "cats": [ 34 @@ -6378,14 +6837,6 @@ "icon": "Monkey HTTP Server.png", "website": "http://monkey-project.com" }, - "Monerominer": { - "cats": [ - 56 - ], - "html": "<iframe[^>]+src=[\\'\"]https?://monerominer\\.rocks/miner\\.php\\?siteid=", - "icon": "monerominer.png", - "website": "https://monerominer.rocks/" - }, "Mono": { "cats": [ 18 @@ -6400,11 +6851,11 @@ "cats": [ 1 ], + "icon": "Mono.net.png", + "implies": "Matomo", "js": { "_monoTracker": "" }, - "icon": "Mono.net.png", - "implies": "Piwik", "script": "monotracker(?:\\.min)?\\.js", "website": "https://www.mono.net/en" }, @@ -6412,11 +6863,11 @@ "cats": [ 12 ], + "icon": "MooTools.png", "js": { "MooTools": "", - "MooTools.version": "(.*)\\;version:\\1" + "MooTools.version": "^(.+)$\\;version:\\1" }, - "icon": "MooTools.png", "script": "mootools.*\\.js", "website": "https://mootools.net" }, @@ -6424,17 +6875,17 @@ "cats": [ 21 ], - "js": { - "Y.Moodle": "", - "M.core": "" - }, "cookies": { - "MoodleSession": "", - "MOODLEID_": "" + "MOODLEID_": "", + "MoodleSession": "" }, "html": "<img[^>]+moodlelogo", "icon": "Moodle.png", "implies": "PHP", + "js": { + "M.core": "", + "Y.Moodle": "" + }, "meta": { "keywords": "^moodle" }, @@ -6446,17 +6897,7 @@ ], "icon": "moon.svg", "script": "/moon(?:\\.min)?\\.js$", - "website": "http://moonjs.ga/" - }, - "Motion-httpd": { - "cats": [ - 22 - ], - "excludes": "Apache", - "headers": { - "Server": "Motion-httpd(?:/([\\d.]+))?\\;version:\\1" - }, - "website": "http://lavrsen.dk/foswiki/bin/view/Motion" + "website": "https://kbrsh.github.io/moon/" }, "MotoCMS": { "cats": [ @@ -6472,6 +6913,19 @@ "script": "/mt-includes/js/website(?:assets)?\\.(?:min)?\\.js", "website": "http://motocms.com" }, + "Mouse Flow": { + "cats": [ + 10 + ], + "icon": "mouseflow.png", + "js": { + "_mfq": "" + }, + "script": [ + "cdn\\.mouseflow\\.com" + ], + "website": "https://mouseflow.com/" + }, "Movable Type": { "cats": [ 1 @@ -6482,16 +6936,6 @@ }, "website": "http://movabletype.org" }, - "Moxa": { - "cats": [ - 37 - ], - "headers": { - "Server": "MoxaHttp(?:/([\\d.]+))?\\;version:\\1" - }, - "icon": "Moxa.png", - "website": "http://moxa.com" - }, "Mozard Suite": { "cats": [ 1 @@ -6519,10 +6963,10 @@ "cats": [ 12 ], + "icon": "Mustache.png", "js": { - "Mustache.version": "(.*)\\;version:\\1" + "Mustache.version": "^(.+)$\\;version:\\1" }, - "icon": "Mustache.png", "script": "mustache(?:\\.min)?\\.js", "website": "https://mustache.github.io" }, @@ -6530,15 +6974,15 @@ "cats": [ 2 ], - "js": { - "MyBB": "" - }, "html": "(?:<script [^>]+\\s+<!--\\s+lang\\.no_new_posts|<a[^>]* title=\"Powered By MyBB)", "icon": "MyBB.png", "implies": [ "PHP", "MySQL" ], + "js": { + "MyBB": "" + }, "website": "https://mybb.com" }, "MyBlogLog": { @@ -6566,25 +7010,27 @@ }, "website": "http://www.netcap-creation.fr" }, - "NOIX": { + "NEO - Omnichannel Commerce Platform": { "cats": [ - 19 + 6 ], - "html": "(?:<[^>]+(?:src|href)=[^>]*/media/noix|<!-- NOIX)", - "icon": "NOIX.png", - "website": "http://www.noix.com.br/tecnologias/joomla" + "headers": { + "powered": "jet-neo" + }, + "icon": "Plataforma NEO.svg", + "website": "http://www.jetecommerce.com.br/" }, "NVD3": { "cats": [ 25 ], - "js": { - "nv.addGraph": "", - "nv.version": "(.*)\\;confidence:0\\;version:\\1" - }, "html": "<link[^>]* href=[^>]+nv\\.d3(?:\\.min)?\\.css", "icon": "NVD3.png", "implies": "D3", + "js": { + "nv.addGraph": "", + "nv.version": "^(.+)$\\;confidence:0\\;version:\\1" + }, "script": "nv\\.d3(?:\\.min)?\\.js", "website": "http://nvd3.org" }, @@ -6596,16 +7042,6 @@ "script": "tag\\.navdmp\\.com", "website": "https://www.navegg.com/" }, - "NEO - Omnichannel Commerce Platform": { - "cats": [ - 6 - ], - "headers": { - "powered": "jet-neo" - }, - "icon": "Plataforma NEO.svg", - "website": "http://www.jetecommerce.com.br/" - }, "Neos CMS": { "cats": [ 1 @@ -6647,30 +7083,20 @@ 31 ], "headers": { - "Server": "Netlify" + "X-NF-Request-ID": "", + "Server": "^Netlify" }, "icon": "Netlify.svg", "website": "https://www.netlify.com/" }, - "Netmonitor": { - "cats": [ - 10 - ], - "js": { - "netmonitor": "" - }, - "icon": "Netmonitor.png", - "script": "netmonitor\\.fi/nmtracker\\.js", - "website": "http://netmonitor.fi/en" - }, "Neto": { "cats": [ 6 ], + "icon": "Neto.svg", "js": { "NETO": "" }, - "icon": "Neto.svg", "script": "jquery\\.neto.*\\.js", "website": "https://www.neto.com.au" }, @@ -6688,10 +7114,6 @@ "cats": [ 18 ], - "js": { - "Nette": "", - "Nette.version": "(.*)\\;version:\\1" - }, "cookies": { "nette-browser": "" }, @@ -6705,33 +7127,23 @@ ], "icon": "Nette Framework.png", "implies": "PHP", + "js": { + "Nette": "", + "Nette.version": "^(.+)$\\;version:\\1" + }, "website": "https://nette.org" }, "New Relic": { "cats": [ 10 ], + "icon": "New Relic.png", "js": { "NREUM": "", "newrelic": "" }, - "icon": "New Relic.png", "website": "https://newrelic.com" }, - "NextGEN Gallery": { - "cats": [ - 7 - ], - "icon": "NextGEN Gallery.png", - "html": [ - "<!-- <meta name=\"NextGEN\" version=\"([\\d.]+)\" /> -->\\;version:\\1" - ], - "script": "/nextgen-gallery/js/", - "implies": [ - "WordPress" - ], - "website": "https://www.imagely.com/wordpress-gallery-plugin" - }, "Next.js": { "cats": [ 18, @@ -6740,23 +7152,39 @@ "headers": { "x-powered-by": "^Next\\.js ?([0-9.]+)?\\;version:\\1" }, - "js": { - "__NEXT_DATA__": "" - }, "icon": "zeit.svg", "implies": [ "React", "webpack", "Node.js" ], + "js": { + "__NEXT_DATA__": "" + }, "website": "https://github.com/zeit/next.js" }, + "NextGEN Gallery": { + "cats": [ + 7 + ], + "html": [ + "<!-- <meta name=\"NextGEN\" version=\"([\\d.]+)\" /> -->\\;version:\\1" + ], + "icon": "NextGEN Gallery.png", + "implies": [ + "WordPress" + ], + "script": "/nextgen-gallery/js/", + "website": "https://www.imagely.com/wordpress-gallery-plugin" + }, "Nginx": { "cats": [ - 22 + 22, + 64 ], "headers": { - "Server": "nginx(?:/([\\d.]+))?\\;version:\\1" + "Server": "nginx(?:/([\\d.]+))?\\;version:\\1", + "X-Fastcgi-Cache": "" }, "icon": "Nginx.svg", "website": "http://nginx.org/en" @@ -6785,7 +7213,10 @@ 22 ], "headers": { - "server": "^now$" + "server": "^now$", + "x-now-trace": "", + "x-now-id": "", + "x-now-cache": "" }, "icon": "zeit.svg", "website": "https://zeit.co/now" @@ -6804,15 +7235,15 @@ "cats": [ 6 ], + "html": "<!--[^-]*OXID eShop", + "icon": "OXID eShop.png", "js": { - "oxTopMenu": "", - "oxModalPopup": "", - "oxLoginBox": "", + "oxCookieNote": "", "oxInputValidator": "", - "oxCookieNote": "" + "oxLoginBox": "", + "oxModalPopup": "", + "oxTopMenu": "" }, - "html": "<!--[^-]*OXID eShop", - "icon": "OXID eShop.png", "website": "https://en.oxid-esales.com/en/home.html" }, "October CMS": { @@ -6828,16 +7259,15 @@ }, "Octopress": { "cats": [ - 1, - 11 + 57 ], "html": "Powered by <a href=\"http://octopress\\.org\">", "icon": "octopress.png", "implies": "Jekyll", - "script": "/octopress\\.js", "meta": { "generator": "Octopress" }, + "script": "/octopress\\.js", "website": "http://octopress.org" }, "Odoo": { @@ -6867,41 +7297,34 @@ "script": "^https?:\\/\\/static\\.olark\\.com\\/jsclient\\/loader1\\.js", "website": "https://www.olark.com/" }, - "OmniTouch 8660 My Teamwork": { - "cats": [ - 19 - ], - "icon": "OmniTouch 8660 My Teamwork.png", - "website": "http://enterprise.alcatel-lucent.com" - }, "OneAPM": { "cats": [ 10 ], + "icon": "OneAPM.png", "js": { "BWEUM": "" }, - "icon": "OneAPM.png", "website": "http://www.oneapm.com" }, "OneStat": { "cats": [ 10 ], + "icon": "OneStat.png", "js": { "OneStat_Pageview": "" }, - "icon": "OneStat.png", "website": "http://www.onestat.com" }, "Open AdStream": { "cats": [ 36 ], + "icon": "Open AdStream.png", "js": { "OAS_AD": "" }, - "icon": "Open AdStream.png", "website": "https://www.xaxis.com" }, "Open Classifieds": { @@ -6933,13 +7356,13 @@ "cats": [ 10 ], + "html": "<!-- (?:Start|End) Open Web Analytics Tracker -->", + "icon": "Open Web Analytics.png", "js": { + "OWA.config.baseUrl": "", "owa_baseUrl": "", - "owa_cmds": "", - "OWA.config.baseUrl": "" + "owa_cmds": "" }, - "html": "<!-- (?:Start|End) Open Web Analytics Tracker -->", - "icon": "Open Web Analytics.png", "website": "http://www.openwebanalytics.com" }, "Open eShop": { @@ -6958,7 +7381,9 @@ "cats": [ 6 ], - "html": "(?:index\\.php\\?route=[a-z]+/|Powered By <a href=\"[^>]+OpenCart)", + "cookies": { + "OCSESSID": "" + }, "icon": "OpenCart.png", "implies": "PHP", "website": "http://www.opencart.com" @@ -7005,11 +7430,11 @@ "cats": [ 35 ], + "icon": "OpenLayers.png", "js": { - "ol.CanvasMap": "", - "OpenLayers.VERSION_NUMBER": "([\\d.]+)\\;version:\\1" + "OpenLayers.VERSION_NUMBER": "([\\d.]+)\\;version:\\1", + "ol.CanvasMap": "" }, - "icon": "OpenLayers.png", "script": "openlayers", "website": "https://openlayers.org" }, @@ -7065,40 +7490,11 @@ ], "icon": "OpenUI5.png", "js": { - "sap.ui.version": "(.*)\\;version:\\1" + "sap.ui.version": "^(.+)$\\;version:\\1" }, "script": "sap-ui-core\\.js", "website": "http://openui5.org/" }, - "Minero.cc": { - "cats": [ - 56 - ], - "script": [ - "//minero\\.cc/lib/minero(?:-miner|-hidden)?\\.min\\.js" - ], - "website": "http://minero.cc/" - }, - "Coinhave": { - "cats": [ - 56 - ], - "script": "https?://coin-have\\.com/c/[0-9a-zA-Z]{4}\\.js", - "icon": "coinhave.png", - "website": "https://coin-have.com/" - }, - "Revslider": { - "cats": [ - 19 - ], - "icon": "revslider.png", - "html": [ - "<link[^>]* href=[\\'\"][^']+revslider[/\\w-]+\\.css\\?ver=([0-9.]+)[\\'\"]\\;version:\\1" - ], - "script": "/revslider/[/\\w-]+/js", - "implies": "WordPress", - "website": "https://revolution.themepunch.com/" - }, "OpenX": { "cats": [ 36 @@ -7117,12 +7513,12 @@ 18 ], "headers": { - "X-Powered-By": "Ophal(?: (.*))? \\(ophal\\.org\\)\\;version:\\1" + "X-Powered-By": "Ophal(?: (.+))? \\(ophal\\.org\\)\\;version:\\1" }, "icon": "Ophal.png", "implies": "Lua", "meta": { - "generator": "Ophal(?: (.*))? \\(ophal\\.org\\)\\;version:\\1" + "generator": "Ophal(?: (.+))? \\(ophal\\.org\\)\\;version:\\1" }, "script": "ophal\\.js", "website": "http://ophal.org" @@ -7131,10 +7527,10 @@ "cats": [ 10 ], + "icon": "Optimizely.png", "js": { "optimizely": "" }, - "icon": "Optimizely.png", "script": "optimizely\\.com.*\\.js", "website": "https://www.optimizely.com" }, @@ -7164,7 +7560,7 @@ 6 ], "headers": { - "OracleCommerceCloud-Version": "(.*)\\;version:\\1" + "OracleCommerceCloud-Version": "^(.+)$\\;version:\\1" }, "html": "<[^>]+id=\"oracle-cc\"", "icon": "Oracle.png", @@ -7223,11 +7619,11 @@ "cats": [ 5 ], + "icon": "Outbrain.png", "js": { - "OutbrainPermaLink": "", - "OB_releaseVer": "(.*)\\;version:\\1" + "OB_releaseVer": "^(.+)$\\;version:\\1", + "OutbrainPermaLink": "" }, - "icon": "Outbrain.png", "script": "widgets\\.outbrain\\.com/outbrain\\.js", "website": "https://www.outbrain.com" }, @@ -7235,12 +7631,12 @@ "cats": [ 30 ], - "js": { - "IsOwaPremiumBrowser": "" - }, "html": "<link\\s[^>]*href=\"[^\"]*?([\\d.]+)/themes/resources/owafont\\.css\\;version:\\1", "icon": "Outlook.svg", "implies": "Microsoft ASP.NET", + "js": { + "IsOwaPremiumBrowser": "" + }, "url": "/owa/auth/log(?:on|off)\\.aspx", "website": "http://help.outlook.com" }, @@ -7254,35 +7650,16 @@ }, "website": "http://panvision.de/Produkte/Content_Management/index.asp" }, - "Paper.js": { - "cats": [ - 25 - ], - "icon": "paperjs.png", - "js": { - "paper.version": "(.*)\\;version:\\1" - }, - "website": "http://paperjs.org/" - }, - "Pelican": { - "cats": [ - 1 - ], - "implies": "Python", - "icon": "pelican.png", - "html": "powered by <a href=\"[^>]+getpelican\\.com", - "website": "https://blog.getpelican.com/" - }, "PDF.js": { "cats": [ 19 ], + "html": "<\\/div>\\s*<!-- outerContainer -->\\s*<div\\s*id=\"printContainer\"><\\/div>", + "icon": "PDF.js.svg", "js": { "PDFJS": "", - "PDFJS.version": "(.*)\\;version:\\1" + "PDFJS.version": "^(.+)$\\;version:\\1" }, - "html": "<\\/div>\\s*<!-- outerContainer -->\\s*<div\\s*id=\"printContainer\"><\\/div>", - "icon": "PDF.js.svg", "url": "/web/viewer\\.html?file=[^&]\\.pdf", "website": "https://mozilla.github.io/pdf.js/" }, @@ -7306,9 +7683,15 @@ 1 ], "html": "Powered by <a href=\"[^>]+php-fusion", + "headers": { + "X-Powered-By": "PHP-Fusion (.+)$\\;version:\\1" + }, "icon": "PHP-Fusion.png", - "implies": "PHP", - "website": "http://www.php-fusion.co.uk" + "implies": [ + "PHP", + "MySQL" + ], + "website": "https://www.php-fusion.co.uk" }, "PHP-Nuke": { "cats": [ @@ -7322,6 +7705,30 @@ }, "website": "http://phpnuke.org" }, + "PHPDebugBar": { + "cats": [ + 47 + ], + "icon": "phpdebugbar.png", + "js": { + "PhpDebugBar": "", + "phpdebugbar": "" + }, + "script": [ + "debugbar.*\\.js" + ], + "website": "http://phpdebugbar.com/" + }, + "Cecil": { + "cats": [ + 57 + ], + "icon": "Cecil.png", + "meta": { + "generator": "^Cecil|PHPoole$" + }, + "website": "https://cecil.app" + }, "Pagekit": { "cats": [ 1 @@ -7332,33 +7739,90 @@ }, "website": "http://pagekit.com" }, - "Pardot": { + "Pagevamp": { "cats": [ - 32 + 1 ], + "headers": { + "X-ServedBy": "pagevamp" + }, + "icon": "Pagevamp.png", "js": { - "piTracker": "", - "piHostname": "", - "piProtocol": "", - "piCId": "", - "piAId": "" + "Pagevamp": "" }, + "website": "https://www.pagevamp.com" + }, + "Pantheon": { + "cats": [ + 62 + ], + "headers": { + "x-pantheon-styx-hostname": "", + "Server": "^Pantheon" + }, + "implies": [ + "PHP", + "Nginx", + "MariaDB" + ], + "icon": "pantheon.svg", + "website": "https://pantheon.io/" + }, + "Paper.js": { + "cats": [ + 25 + ], + "icon": "paperjs.png", + "js": { + "paper.version": "^(.+)$\\;version:\\1" + }, + "website": "http://paperjs.org/" + }, + "Pardot": { + "cats": [ + 32 + ], "headers": { "X-Pardot-LB": "", "X-Pardot-Route": "", "X-Pardot-Rsp": "" }, "icon": "Pardot.png", + "js": { + "piAId": "", + "piCId": "", + "piHostname": "", + "piProtocol": "", + "piTracker": "" + }, "website": "https://www.pardot.com" }, + "Pars Elecom Portal": { + "cats": [ + 1 + ], + "headers": { + "X-Powered-By": "Pars Elecom Portal" + }, + "icon": "parselecom.png", + "implies": [ + "Microsoft ASP.NET", + "IIS", + "Windows Server" + ], + "meta": { + "copyright": "Pars Elecom Portal" + }, + "website": "http://parselecom.net" + }, "Parse.ly": { "cats": [ 10 ], + "icon": "Parse.ly.png", "js": { "PARSELY": "" }, - "icon": "Parse.ly.png", "website": "https://www.parse.ly" }, "Paths.js": { @@ -7368,39 +7832,30 @@ "script": "paths(?:\\.min)?\\.js", "website": "https://github.com/andreaferretti/paths-js" }, - "Braintree": { - "cats": [ - 41 - ], - "js": { - "Braintree": "", - "Braintree.version": "(.*)\\;version:\\1" - }, - "icon": "Braintree.svg", - "website": "https://www.braintreepayments.com" - }, - "Adyen": { - "cats": [ - 41 - ], - "js": { - "adyen.encrypt.version": "(.*)\\;version:\\1" - }, - "icon": "Adyen.svg", - "website": "https://www.adyen.com" - }, "PayPal": { "cats": [ 41 ], + "html": "<input[^>]+_s-xclick", + "icon": "PayPal.svg", "js": { "PAYPAL": "" }, - "html": "<input[^>]+_s-xclick", - "icon": "PayPal.svg", "script": "paypalobjects\\.com/js", "website": "https://paypal.com" }, + "Pelican": { + "cats": [ + 57 + ], + "html": [ + "powered by <a href=\"[^>]+getpelican\\.com", + "powered by <a href=\"https?://pelican\\.notmyidea\\.org" + ], + "icon": "pelican.png", + "implies": "Python", + "website": "https://blog.getpelican.com/" + }, "PencilBlue": { "cats": [ 1, @@ -7413,6 +7868,21 @@ "implies": "Node.js", "website": "http://pencilblue.org" }, + "Pendo": { + "cats": [ + 58 + ], + "icon": "Pendo.svg", + "script": "cdn\\.pendo\\.io*\\.js", + "website": "https://pendo.io" + }, + "Percona": { + "cats": [ + 34 + ], + "icon": "percona.svg", + "website": "https://www.percona.com" + }, "Percussion": { "cats": [ 1 @@ -7424,22 +7894,12 @@ }, "website": "http://percussion.com" }, - "PerfSONAR-PS": { - "cats": [ - 19 - ], - "headers": { - "User-agent": "perfSONAR-PS/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "PerfSONAR-PS.png", - "website": "http://psps.perfsonar.net" - }, "Perl": { "cats": [ 27 ], "headers": { - "Server": "\bPerl\b(?: ?/?v?([\\d.]+))?\\;version:\\1" + "Server": "\\bPerl\\b(?: ?/?v?([\\d.]+))?\\;version:\\1" }, "icon": "Perl.png", "website": "http://perl.org" @@ -7464,11 +7924,11 @@ "cats": [ 12 ], + "icon": "Phaser.png", "js": { "Phaser": "", - "Phaser.VERSION": "(.*)\\;version:\\1" + "Phaser.VERSION": "^(.+)$\\;version:\\1" }, - "icon": "Phaser.png", "website": "https://phaser.io" }, "Phenomic": { @@ -7485,40 +7945,16 @@ "script": "/phenomic\\.browser\\.[a-f0-9]+\\.js", "website": "https://phenomic.io/" }, - "PHPDebugBar": { - "cats": [ - 47 - ], - "js": { - "phpdebugbar": "", - "PhpDebugBar": "" - }, - "script": [ - "debugbar.*\\.js" - ], - "icon": "phpdebugbar.png", - "website": "http://phpdebugbar.com/" - }, - "PHPoole": { - "cats": [ - 57 - ], - "icon": "PHPoole.png", - "meta": { - "generator": "^PHPoole$" - }, - "website": "https://phpoole.org" - }, "Phusion Passenger": { "cats": [ 22 ], "headers": { - "X-Powered-By": "^Phusion Passenger ?([\\d.]+)?\\;version:\\1", - "Server": "Phusion Passenger ([\\d.]+)\\;version:\\1" + "Server": "Phusion Passenger ([\\d.]+)\\;version:\\1", + "X-Powered-By": "Phusion Passenger ?([\\d.]+)?\\;version:\\1" }, "icon": "Phusion Passenger.png", - "website": "http://phusionpassenger.com" + "website": "https://phusionpassenger.com" }, "Pimcore": { "cats": [ @@ -7533,6 +7969,17 @@ "implies": "PHP", "website": "http://pimcore.org" }, + "Pingoteam": { + "cats": [ + 1 + ], + "icon": "Pingoteam.svg", + "implies": "PHP", + "meta": { + "designer": "Pingoteam" + }, + "website": "https://www.pingoteam.ir/" + }, "Pinterest": { "cats": [ 5 @@ -7541,38 +7988,6 @@ "script": "//assets\\.pinterest\\.com/js/pinit\\.js", "website": "http://pinterest.com" }, - "pirobase CMS": { - "cats": [ - 1 - ], - "html": [ - "<(?:script|link)[^>]/site/[a-z0-9/._-]+/resourceCached/[a-z0-9/._-]+", - "<input[^>]+cbi:///cms/" - ], - "icon": "pirobaseCMS.svg", - "implies": "Java", - "website": "https://www.pirobase-imperia.com/de/produkte/produktuebersicht/pirobase-cms" - }, - "Piwik": { - "cats": [ - 10 - ], - "js": { - "Piwik": "", - "_paq": "" - }, - "cookies": { - "PIWIK_SESSID": "" - }, - "icon": "Piwik.png", - "meta": { - "apple-itunes-app": "app-id=737216887", - "generator": "Piwik - Open Source Web Analytics", - "google-play-app": "app-id=org\\.piwik\\.mobile2" - }, - "script": "piwik\\.js|piwik\\.php", - "website": "http://piwik.org" - }, "Planet": { "cats": [ 49 @@ -7583,14 +7998,38 @@ }, "website": "http://planetplanet.org" }, - "Play": { + "PlatformOS": { "cats": [ - 18 + 1, + 62 ], - "cookies": { - "PLAY_SESSION": "" + "icon": "PlatformOS.svg", + "headers": { + "x-powered-by": "^platformOS$" }, - "icon": "Play.svg", + "website": "https://www.platform-os.com" + }, + "Platform.sh": { + "cats": [ + 62 + ], + "icon": "platformsh.svg", + "headers": { + "x-platform-cluster": "", + "x-platform-processor": "", + "x-platform-router": "", + "x-platform-server": "" + }, + "website": "https://platform.sh" + }, + "Play": { + "cats": [ + 18 + ], + "cookies": { + "PLAY_SESSION": "" + }, + "icon": "Play.svg", "implies": "Scala", "website": "https://www.playframework.com" }, @@ -7609,22 +8048,22 @@ 9 ], "headers": { - "X-Powered-By": "PleskLin", - "X-Powered-By-Plesk": "Plesk" + "X-Powered-By": "^Plesk(?:L|W)in", + "X-Powered-By-Plesk": "^Plesk" }, "icon": "Plesk.png", "script": "common\\.js\\?plesk", - "website": "http://plesk.com" + "website": "https://www.plesk.com/" }, "Pligg": { "cats": [ 1 ], + "html": "<span[^>]+id=\"xvotes-0", + "icon": "Pligg.png", "js": { "pligg_": "" }, - "html": "<span[^>]+id=\"xvotes-0", - "icon": "Pligg.png", "meta": { "generator": "Pligg" }, @@ -7645,41 +8084,44 @@ "cats": [ 25 ], - "js": { - "Plotly": "" - }, "icon": "Plotly.png", "implies": "D3", + "js": { + "Plotly.version": "([\\d.])\\;version:\\1" + }, "script": "https?://cdn\\.plot\\.ly/plotly", - "website": "http://plot.ly/javascript/" - }, - "Plura": { - "cats": [ - 19 - ], - "html": "<iframe src=\"[^>]+pluraserver\\.com", - "icon": "Plura.png", - "website": "http://www.pluraprocessing.com" + "website": "https://plot.ly/javascript/" }, "Po.st": { "cats": [ 5 ], + "icon": "Po.st.png", "js": { "pwidget_config": "" }, - "icon": "Po.st.png", "website": "http://www.po.st/" }, + "Polyfill": { + "cats": [ + 59 + ], + "icon": "polyfill.svg", + "script": [ + "^https?://cdn\\.polyfill\\.io/", + "/polyfill\\.min\\.js" + ], + "website": "https://polyfill.io" + }, "Polymer": { "cats": [ 12 ], - "js": { - "Polymer.version": "(.*)\\;version:\\1" - }, "html": "(?:<polymer-[^>]+|<link[^>]+rel=\"import\"[^>]+/polymer\\.html\")", "icon": "Polymer.png", + "js": { + "Polymer.version": "^(.+)$\\;version:\\1" + }, "script": "polymer\\.js", "website": "http://polymer-project.org" }, @@ -7688,11 +8130,11 @@ 1, 11 ], + "html": "<div class=\"posterous", + "icon": "Posterous.png", "js": { "Posterous": "" }, - "html": "<div class=\"posterous", - "icon": "Posterous.png", "website": "http://posterous.com" }, "PostgreSQL": { @@ -7719,8 +8161,8 @@ ], "icon": "Prebid.png", "js": { - "pbjs": "", - "PREBID_TIMEOUT": "" + "PREBID_TIMEOUT": "", + "pbjs": "" }, "script": [ "/prebid\\.js", @@ -7732,22 +8174,17 @@ "cats": [ 19 ], + "icon": "Prefix-Free.png", "js": { "PrefixFree": "" }, - "icon": "Prefix-Free.png", "script": "prefixfree\\.js", - "website": "http://leaverou.github.io/prefixfree/" + "website": "https://leaverou.github.io/prefixfree/" }, "PrestaShop": { "cats": [ 6 ], - "js": { - "freeProductTranslation": "\\;confidence:25", - "priceDisplayMethod": "\\;confidence:25", - "priceDisplayPrecision": "\\;confidence:25" - }, "cookies": { "PrestaShop": "" }, @@ -7760,7 +8197,15 @@ "<!-- /Module Block [a-z ]+ -->" ], "icon": "PrestaShop.svg", - "implies": "PHP", + "implies": [ + "PHP", + "MySQL" + ], + "js": { + "freeProductTranslation": "\\;confidence:25", + "priceDisplayMethod": "\\;confidence:25", + "priceDisplayPrecision": "\\;confidence:25" + }, "meta": { "generator": "PrestaShop" }, @@ -7770,10 +8215,10 @@ "cats": [ 19 ], + "icon": "Prism.svg", "js": { "Prism": "" }, - "icon": "Prism.svg", "script": "prism\\.js", "website": "http://prismjs.com" }, @@ -7781,11 +8226,11 @@ "cats": [ 36 ], + "html": "<div[^>]+id=\"pw_adbox_", + "icon": "Project Wonderful.png", "js": { "pw_adloader": "" }, - "html": "<div[^>]+id=\"pw_adbox_", - "icon": "Project Wonderful.png", "script": "^https?://(?:www\\.)?projectwonderful\\.com/(?:pwa\\.js|gen\\.php)", "website": "http://projectwonderful.com" }, @@ -7793,30 +8238,31 @@ "cats": [ 56 ], + "icon": "ProjectPoi.png", "js": { "ProjectPoi": "" }, "script": "^(?:https):?//ppoi\\.org/lib/", - "icon": "ProjectPoi.png", "website": "https://ppoi.org/" }, - "Prospector": { + "Projesoft": { "cats": [ - 36 + 6 ], - "html": "<[^>]+data-name=['\"]prospectscript", - "icon": "Prospector.png", - "script": "processprospector\\.js", - "website": "http://prospector.io" + "icon": "projesoft.png", + "script": [ + "projesoft\\.js" + ], + "website": "https://www.projesoft.com.tr" }, "Prototype": { "cats": [ 12 ], + "icon": "Prototype.png", "js": { - "Prototype.Version": "(.*)\\;version:\\1" + "Prototype.Version": "^(.+)$\\;version:\\1" }, - "icon": "Prototype.png", "script": "(?:prototype|protoaculous)(?:-([\\d.]*[\\d]))?.*\\.js\\;version:\\1", "website": "http://www.prototypejs.org" }, @@ -7828,22 +8274,22 @@ "protovis": "" }, "script": "protovis.*\\.js", - "website": "http://mbostock.github.com/protovis" + "website": "http://mbostock.github.io/protovis" }, "Proximis Omnichannel": { "cats": [ 6, 1 ], - "js": { - "__change": "" - }, "html": "<html[^>]+data-ng-app=\"RbsChangeApp\"", "icon": "Proximis Omnichannel.png", "implies": [ "PHP", "AngularJS" ], + "js": { + "__change": "" + }, "meta": { "generator": "Proximis Omnichannel" }, @@ -7874,7 +8320,7 @@ "PUBLICCMS_USER": "" }, "headers": { - "X-Powered-PublicCMS": "(.*)\\;version:\\1" + "X-Powered-PublicCMS": "^(.+)$\\;version:\\1" }, "icon": "Public CMS.png", "implies": "Java", @@ -7927,10 +8373,10 @@ "cats": [ 10 ], + "icon": "Quantcast.png", "js": { "quantserve": "" }, - "icon": "Quantcast.png", "script": "\\.quantserve\\.com/quant\\.js", "website": "http://www.quantcast.com" }, @@ -7970,21 +8416,12 @@ "cats": [ 24 ], + "icon": "Quill.png", "js": { "Quill": "" }, - "icon": "Quill.png", "website": "http://quilljs.com" }, - "RAID HTTPServer": { - "cats": [ - 22 - ], - "headers": { - "Server": "RAID HTTPServer(?:/([\\d.]+))?\\;version:\\1" - }, - "website": "http://example.com" - }, "RBS Change": { "cats": [ 1, @@ -8012,10 +8449,10 @@ "cats": [ 32 ], + "icon": "RD Station.png", "js": { "RDStation": "" }, - "icon": "RD Station.png", "script": "d335luupugsy2\\.cloudfront\\.net/js/loader-scripts/.*-loader\\.js", "website": "http://rdstation.com.br" }, @@ -8029,7 +8466,7 @@ ], "icon": "RDoc.png", "implies": "Ruby", - "website": "http://github.com/RDoc/RDoc" + "website": "https://github.com/RDoc/RDoc" }, "RackCache": { "cats": [ @@ -8040,26 +8477,29 @@ }, "icon": "RackCache.png", "implies": "Ruby", - "website": "http://github.com/rtomayko/rack-cache" + "website": "https://github.com/rtomayko/rack-cache" }, "RainLoop": { "cats": [ 30 ], - "js": { - "rainloop": "" - }, "headers": { - "Server": "RainLoop" + "Server": "^RainLoop" }, "html": [ - "<meta [^>]*(?:content=\"([^\"]+)[^>]+ id=\"rlAppVersion\"|id=\"rlAppVersion\"[^>]+ content=\"([^\"]+))\\;version:\\1?\\1:\\2", - "<link[^>]* href=\"[^\"]*rainloop/v/([^/]+)\\;version:\\1" + "<link[^>]href=\"rainloop/v/([0-9.]+)/static/apple-touch-icon\\.png/>\\;version:\\1" ], + "meta": { + "rlAppVersion": "^([0-9.]+)$\\;version:\\1" + }, "icon": "RainLoop.png", "implies": "PHP", - "script": "rainloop/v/([^/]+)\\;version:\\1", - "website": "http://rainloop.net" + "js": { + "rainloopI18N": "", + "rainloop": "" + }, + "script": "^rainloop/v/([0-9.]+)/\\;version:\\1", + "website": "https://www.rainloop.net/" }, "Rakuten DBCore": { "cats": [ @@ -8072,9 +8512,19 @@ }, "website": "http://ecservice.rakuten.com.br" }, + "Rakuten Digital Commerce": { + "cats": [ + 6 + ], + "icon": "RakutenDigitalCommerce.png", + "js": { + "RakutenApplication": "" + }, + "website": "https://digitalcommerce.rakuten.com.br" + }, "Ramda": { "cats": [ - 12 + 59 ], "icon": "Ramda.png", "script": "ramda.*\\.js", @@ -8084,21 +8534,12 @@ "cats": [ 25 ], + "icon": "Raphael.png", "js": { - "Raphael.version": "(.*)\\;version:\\1" + "Raphael.version": "^(.+)$\\;version:\\1" }, - "icon": "Raphael.png", "script": "raphael(?:-([\\d.]+))?(?:\\.min)?\\.js\\;version:\\1", - "website": "http://dmitrybaranovskiy.github.io/raphael/" - }, - "Rapid Logic": { - "cats": [ - 22 - ], - "headers": { - "Server": "Rapid Logic(?:/([\\d.]+))?\\;version:\\1" - }, - "website": "http://example.com" + "website": "https://dmitrybaranovskiy.github.io/raphael/" }, "Raspbian": { "cats": [ @@ -8111,18 +8552,29 @@ "icon": "Raspbian.svg", "website": "https://www.raspbian.org/" }, - "Rayo": { + "Raychat": { "cats": [ - 1 + 52 ], + "icon": "raychat.png", "js": { - "Rayo": "" + "Raychat": "" }, + "script": "app\\.raychat\\.io/scripts/js", + "website": "https://raychat.io" + }, + "Rayo": { + "cats": [ + 1 + ], "icon": "Rayo.png", "implies": [ "AngularJS", "Microsoft ASP.NET" ], + "js": { + "Rayo": "" + }, "meta": { "generator": "^Rayo" }, @@ -8134,22 +8586,35 @@ ], "website": "https://www.w3.org/RDF/" }, - "React": { + "ReDoc": { "cats": [ - 12 + 4 ], + "html": "<redoc ", + "icon": "redoc.png", + "implies": "React", "js": { - "react.version": "(.*)\\;version:\\1", - "React.version": "(.*)\\;version:\\1" + "Redoc.version": "^(.+)$\\;version:\\1" }, + "script": "/redoc\\.(?:min\\.)?js", + "website": "https://github.com/Rebilly/ReDoc" + }, + "React": { + "cats": [ + 12 + ], "html": "<[^>]+data-react", "icon": "React.png", + "js": { + "React.version": "^(.+)$\\;version:\\1", + "react.version": "^(.+)$\\;version:\\1" + }, "script": [ - "react(?:\\-with\\-addons)?(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "react(?:-with-addons)?[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+)/react(?:\\.min)?\\.js\\;version:\\1", "react.*\\.js" ], - "website": "http://facebook.github.io/react" + "website": "https://reactjs.org" }, "Red Hat": { "cats": [ @@ -8166,12 +8631,12 @@ "cats": [ 2 ], - "js": { - "reddit": "" - }, "html": "(?:<a[^>]+Powered by Reddit|powered by <a[^>]+>reddit<)", "icon": "Reddit.png", "implies": "Python", + "js": { + "reddit": "" + }, "url": "^https?://(?:www\\.)?reddit\\.com", "website": "http://code.reddit.com" }, @@ -8190,37 +8655,24 @@ }, "website": "http://www.redmine.org" }, - "ReDoc": { - "cats": [ - 4 - ], - "html": "<redoc ", - "script": "/redoc\\.(?:min\\.)?js", - "js": { - "Redoc.version": "(.*)\\;version:\\1" - }, - "icon": "redoc.png", - "implies": "React", - "website": "https://github.com/Rebilly/ReDoc" - }, "Reinvigorate": { "cats": [ 10 ], + "icon": "Reinvigorate.png", "js": { "reinvigorate": "" }, - "icon": "Reinvigorate.png", "website": "http://www.reinvigorate.net" }, "RequireJS": { "cats": [ 12 ], + "icon": "RequireJS.png", "js": { - "requirejs.version": "(.*)\\;version:\\1" + "requirejs.version": "^(.+)$\\;version:\\1" }, - "icon": "RequireJS.png", "script": "require.*\\.js", "website": "http://requirejs.org" }, @@ -8239,11 +8691,11 @@ "cats": [ 12 ], - "js": { - "Reveal.VERSION": "(.*)\\;version:\\1" - }, "icon": "Reveal.js.png", "implies": "Highlight.js", + "js": { + "Reveal.VERSION": "^(.+)$\\;version:\\1" + }, "script": "(?:^|/)reveal(?:\\.min)?\\.js", "website": "http://lab.hakim.se/reveal-js" }, @@ -8257,16 +8709,28 @@ }, "icon": "Revel.png", "implies": "Go", - "website": "http://revel.github.io" + "website": "https://revel.github.io" + }, + "Revslider": { + "cats": [ + 19 + ], + "html": [ + "<link[^>]* href=[\\'\"][^']+revslider[/\\w-]+\\.css\\?ver=([0-9.]+)[\\'\"]\\;version:\\1" + ], + "icon": "revslider.png", + "implies": "WordPress", + "script": "/revslider/[/\\w-]+/js", + "website": "https://revolution.themepunch.com/" }, "Rickshaw": { "cats": [ 25 ], + "implies": "D3", "js": { "Rickshaw": "" }, - "implies": "D3", "script": "rickshaw(?:\\.min)?\\.js", "website": "http://code.shutterstock.com/rickshaw/" }, @@ -8274,10 +8738,10 @@ "cats": [ 12 ], + "icon": "RightJS.png", "js": { "RightJS": "" }, - "icon": "RightJS.png", "script": "right\\.js", "website": "http://rightjs.org" }, @@ -8285,12 +8749,12 @@ "cats": [ 12 ], + "icon": "Riot.png", "js": { "riot": "" }, - "icon": "Riot.png", "script": "riot(?:\\+compiler)?(?:\\.min)?\\.js", - "website": "http://muut.com/riotjs" + "website": "https://riot.js.org/" }, "RiteCMS": { "cats": [ @@ -8328,12 +8792,12 @@ "cats": [ 6 ], + "icon": "Robin.png", "js": { "_robin_getRobinJs": "", "robin_settings": "", "robin_storage_settings": "" }, - "icon": "Robin.png", "website": "http://www.robinhq.com" }, "RockRMS": { @@ -8349,7 +8813,7 @@ "Microsoft ASP.NET" ], "meta": { - "generator": "^Rock v.*" + "generator": "^Rock v([0-9.]+)\\;version:\\1" }, "website": "http://www.rockrms.com" }, @@ -8357,13 +8821,13 @@ "cats": [ 30 ], + "html": "<title>RoundCube", + "icon": "RoundCube.png", + "implies": "PHP", "js": { "rcmail": "", "roundcube": "" }, - "html": "<title>RoundCube", - "icon": "RoundCube.png", - "implies": "PHP", "website": "http://roundcube.net" }, "Rubicon Project": { @@ -8389,16 +8853,19 @@ 18 ], "headers": { - "Server": "(?:mod_rails|mod_rack|Phusion(?:\\.|_)Passenger)\\;confidence:50", - "X-Powered-By": "(?:mod_rails|mod_rack|Phusion[\\._ ]Passenger)(?: \\(mod_rails/mod_rack\\))?\\;confidence:50" + "Server": "mod_(?:rails|rack)", + "X-Powered-By": "mod_(?:rails|rack)" }, "icon": "Ruby on Rails.png", "implies": "Ruby", "meta": { "csrf-param": "^authenticity_token$\\;confidence:50" }, + "cookies": { + "_session_id": "\\;confidence:75" + }, "script": "/assets/application-[a-z\\d]{32}/\\.js\\;confidence:50", - "website": "http://rubyonrails.org" + "website": "https://rubyonrails.org" }, "Ruxit": { "cats": [ @@ -8412,11 +8879,11 @@ "cats": [ 12 ], + "icon": "RxJS.png", "js": { "Rx.CompositeDisposable": "", "Rx.Symbol": "" }, - "icon": "RxJS.png", "script": "rx(?:\\.\\w+)?(?:\\.compat|\\.global)?(?:\\.min)?\\.js", "website": "http://reactivex.io" }, @@ -8448,6 +8915,36 @@ "icon": "SDL Tridion.png", "website": "http://www.sdl.com/products/tridion" }, + "Sensors Data": { + "cats": [ + 10 + ], + "js": { + "sa.lib_version": "([\\d.]+)\\;version:\\1", + "sensorsdata_app_js_bridge_call_js": "" + }, + "cookies": { + "sensorsdata2015session": "", + "sensorsdata2015jssdkcross": "" + }, + "icon": "Sensors Data.svg", + "script": "sensorsdata", + "website": "https://www.sensorsdata.cn" + }, + "Sentry": { + "cats": [ + 13 + ], + "html": "<script[^>]*>\\s*Raven\\.config\\('[^']*', {\\s+release: '([0-9\\.]+)'\\;version:\\1", + "js": { + "Sentry": "", + "Sentry.SDK_VERSION": "(.+)\\;version:\\1", + "Raven.config": "", + "ravenOptions.whitelistUrls": "" + }, + "icon": "Sentry.svg", + "website": "https://sentry.io/" + }, "SIMsite": { "cats": [ 1 @@ -8463,12 +8960,12 @@ "cats": [ 2 ], + "html": "credits/?\" title=\"Simple Machines Forum\" target=\"_blank\" class=\"new_win\">SMF ([0-9.]+)</a>\\;version:\\1", + "icon": "SMF.png", + "implies": "PHP", "js": { "smf_": "" }, - "icon": "SMF.png", - "implies": "PHP", - "html": "credits/?\" title=\"Simple Machines Forum\" target=\"_blank\" class=\"new_win\">SMF ([0-9.]+)</a>\\;version:\\1", "website": "http://www.simplemachines.org" }, "SOBI 2": { @@ -8496,10 +8993,10 @@ 1 ], "headers": { - "X-Spip-Cache": "", - "Composed-By": "SPIP ([\\d.]+) @\\;version:\\1" + "Composed-By": "SPIP ([\\d.]+) @\\;version:\\1", + "X-Spip-Cache": "" }, - "icon": "SPIP.png", + "icon": "spip.svg", "implies": "PHP", "meta": { "generator": "(?:^|\\s)SPIP(?:\\s([\\d.]+(?:\\s\\[\\d+\\])?))?\\;version:\\1" @@ -8537,12 +9034,12 @@ "cats": [ 19 ], + "icon": "SWFObject.png", "js": { "SWFObject": "" }, - "icon": "SWFObject.png", "script": "swfobject.*\\.js", - "website": "http://github.com/swfobject/swfobject" + "website": "https://github.com/swfobject/swfobject" }, "Saia PCD": { "cats": [ @@ -8572,32 +9069,32 @@ "cats": [ 53 ], + "cookies": { + "com.salesforce": "" + }, + "html": "<[^>]+=\"brandQuaternaryFgrs\"", + "icon": "Salesforce.svg", "js": { "SFDCApp": "", "SFDCCmp": "", "SFDCPage": "", "SFDCSessionVars": "" }, - "cookies": { - "com.salesforce": "" - }, - "html": "<[^>]+=\"brandQuaternaryFgrs\"", - "icon": "Salesforce.svg", "website": "https://www.salesforce.com" }, "Salesforce Commerce Cloud": { "cats": [ 6 ], - "js": { - "dwAnalytics": "" - }, "headers": { "Server": "Demandware eCommerce Server" }, "html": "<[^>]+demandware\\.edgesuite", - "script": "/demandware\\.static/", "icon": "Salesforce.svg", + "js": { + "dwAnalytics": "" + }, + "script": "/demandware\\.static/", "website": "http://demandware.com" }, "Sarka-SPIP": { @@ -8615,10 +9112,10 @@ "cats": [ 6 ], + "icon": "Sazito.svg", "js": { "Sazito": "" }, - "icon": "Sazito.svg", "meta": { "generator": "^Sazito" }, @@ -8666,17 +9163,16 @@ "cats": [ 10 ], + "icon": "Segment.png", "js": { "analytics": "" }, - "html": "<script[\\s\\S]*cdn\\.segment\\.com/analytics\\.js[\\s\\S]*script>", - "icon": "Segment.png", "script": "cdn\\.segment\\.com/analytics\\.js", - "website": "http://segment.com" + "website": "https://segment.com" }, "Select2": { "cats": [ - 12 + 59 ], "icon": "Select2.png", "implies": "jQuery", @@ -8706,38 +9202,10 @@ "script": "sencha-touch.*\\.js", "website": "http://sencha.com/products/touch" }, - "Sentinel Keys Server": { + "Serendipity": { "cats": [ - 22 - ], - "headers": { - "Server": "SentinelKeysServer\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "Sentinel.png", - "website": "http://www.safenet-inc.com/software-monetization/sentinel-rms" - }, - "Sentinel License Monitor": { - "cats": [ - 19 - ], - "html": "<title>Sentinel (?:Keys )?License Monitor", - "icon": "Sentinel.png", - "website": "http://www.safenet-inc.com/software-monetization/sentinel-rms/" - }, - "Sentinel Protection Server": { - "cats": [ - 22 - ], - "headers": { - "Server": "SentinelProtectionServer\\/?([\\d\\.]+)?\\;version:\\1" - }, - "icon": "Sentinel.png", - "website": "http://www.safenet-inc.com/software-monetization/sentinel-rms/" - }, - "Serendipity": { - "cats": [ - 1, - 11 + 1, + 11 ], "icon": "Serendipity.png", "implies": "PHP", @@ -8762,11 +9230,11 @@ "cats": [ 18 ], + "html": "]* href=\"[^\"]*shapecss(?:\\.min)?\\.css", + "icon": "Shapecss.svg", "js": { "Shapecss": "" }, - "html": "]* href=\"[^\"]*shapecss(?:\\.min)?\\.css", - "icon": "Shapecss.svg", "script": [ "shapecss[-.]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "/([\\d.]+)/shapecss(?:\\.min)?\\.js\\;version:\\1", @@ -8778,10 +9246,10 @@ "cats": [ 5 ], + "icon": "ShareThis.png", "js": { "SHARETHIS": "" }, - "icon": "ShareThis.png", "script": "w\\.sharethis\\.com/", "website": "http://sharethis.com" }, @@ -8789,51 +9257,50 @@ "cats": [ 46 ], - "js": { - "ShellInABox": "" - }, "html": [ "Shell In A Box", "must be enabled for ShellInABox" ], "icon": "ShellInABox.png", + "js": { + "ShellInABox": "" + }, "website": "http://shellinabox.com" }, - "ShinyStat": { + "Shiny": { "cats": [ - 10 + 18 ], + "icon": "Shiny.png", "js": { - "SSsdk": "" + "Shiny.addCustomMessageHandler": "" }, - "html": "]*\\s+src=['\"]?https?://www\\.shinystat\\.com/cgi-bin/shinystat\\.cgi\\?[^'\"\\s>]*['\"\\s/>]", - "icon": "ShinyStat.png", - "script": "^https?://codice(?:business|ssl|pro|isp)?\\.shinystat\\.com/cgi-bin/getcod\\.cgi", - "website": "http://shinystat.com" + "website": "https://shiny.rstudio.com" }, - "Shopalize": { + "ShinyStat": { "cats": [ - 5, 10 ], + "html": "]*\\s+src=['\"]?https?://www\\.shinystat\\.com/cgi-bin/shinystat\\.cgi\\?[^'\"\\s>]*['\"\\s/>]", + "icon": "ShinyStat.png", "js": { - "Shopalize": "" + "SSsdk": "" }, - "icon": "Shopalize.png", - "website": "http://shopalize.com" + "script": "^https?://codice(?:business|ssl|pro|isp)?\\.shinystat\\.com/cgi-bin/getcod\\.cgi", + "website": "http://shinystat.com" }, "Shopatron": { "cats": [ 6 ], - "js": { - "shptUrl": "" - }, "html": [ "]+mediacdn\\.shopatron\\.com\\;confidence:50" ], "icon": "Shopatron.png", + "js": { + "shptUrl": "" + }, "meta": { "keywords": "Shopatron" }, @@ -8844,20 +9311,20 @@ "cats": [ 6 ], + "icon": "Shopcada.png", "js": { "Shopcada": "" }, - "icon": "Shopcada.png", "website": "http://shopcada.com" }, "Shoper": { "cats": [ 6 ], + "icon": "Shoper.svg", "js": { "shoper": "" }, - "icon": "Shoper.svg", "website": "https://www.shoper.pl" }, "Shopery": { @@ -8882,6 +9349,9 @@ "js": { "shopfa": "" }, + "headers": { + "X-Powered-By": "^ShopFA ([\\d.]+)$\\;version:\\1" + }, "meta": { "generator": "^ShopFA ([\\d.]+)$\\;version:\\1" }, @@ -8892,23 +9362,38 @@ "cats": [ 6 ], + "html": "]+=['\"]//cdn\\.shopify\\.com\\;confidence:25", + "icon": "Shopify.svg", "js": { - "Shopify": "" + "Shopify": "\\;confidence:25" }, - "html": "]+=['\"]//cdn\\.shopify\\.com", - "icon": "Shopify.svg", + "headers": { + "x-shopid": "\\;confidence:50", + "x-shopify-stage": "\\;confidence:50" + }, + "url": "^https?//.+\\.myshopify\\.com", "website": "http://shopify.com" }, - "Shoptet": { + "Shopline": { "cats": [ 6 ], - "js": { - "shoptet": "" + "icon": "shopline.png", + "meta": { + "og:image": "https\\:\\/\\/img\\.shoplineapp\\.com" }, + "website": "https://shoplineapp.com/" + }, + "Shoptet": { + "cats": [ + 6 + ], "html": "]*href=\"https?://cdn\\.myshoptet\\.com/", "icon": "Shoptet.svg", "implies": "PHP", + "js": { + "shoptet": "" + }, "meta": { "web_author": "^Shoptet" }, @@ -8938,6 +9423,20 @@ ], "website": "http://shopware.com" }, + "Signal": { + "cats": [ + 32 + ], + "script": [ + "//s\\.btstatic\\.com/tag\\.js", + "//s\\.thebrighttag\\.com/iframe\\?" + ], + "js": { + "signalData": "" + }, + "icon": "signal.png", + "website": "https://www.signal.co/" + }, "Silva": { "cats": [ 1 @@ -8955,28 +9454,29 @@ "html": "Powered by ]+SilverStripe", "icon": "SilverStripe.svg", "meta": { - "generator": "SilverStripe" + "generator": "^SilverStripe" }, - "website": "http://www.silverstripe.org" + "implies": "PHP", + "website": "https://www.silverstripe.org" }, - "Simplébo": { + "SimpleHTTP": { "cats": [ - 1 + 22 ], "headers": { - "X-ServedBy": "simplebo" + "Server": "SimpleHTTP(?:/([\\d.]+))?\\;version:\\1" }, - "icon": "Simplebo.png", - "website": "https://www.simplebo.fr" + "website": "http://example.com" }, - "SimpleHTTP": { + "Simplébo": { "cats": [ - 22 + 1 ], "headers": { - "Server": "SimpleHTTP(?:/([\\d.]+))?\\;version:\\1" + "X-ServedBy": "simplebo" }, - "website": "http://example.com" + "icon": "Simplebo.png", + "website": "https://www.simplebo.fr" }, "Site Meter": { "cats": [ @@ -8990,13 +9490,13 @@ "cats": [ 10 ], + "icon": "SiteCatalyst.png", "js": { + "s_INST": "", "s_account": "", - "s_objectID": "", "s_code": "", - "s_INST": "" + "s_objectID": "" }, - "icon": "SiteCatalyst.png", "script": "/s[_-]code.*\\.js", "website": "http://www.adobe.com/solutions/digital-marketing.html" }, @@ -9053,16 +9553,16 @@ }, "Slick": { "cats": [ - 12 + 59 ], "html": "]+(?:/([\\d.]+)/)?slick-theme\\.css\\;version:\\1", "implies": "jQuery", "script": "(?:/([\\d.]+))?/slick(?:\\.min)?\\.js\\;version:\\1", - "website": "http://kenwheeler.github.io/slick" + "website": "https://kenwheeler.github.io/slick" }, "Slimbox": { "cats": [ - 12 + 59 ], "html": "]*href=\"[^/]*slimbox(?:-rtl)?\\.css", "icon": "Slimbox.png", @@ -9072,7 +9572,7 @@ }, "Slimbox 2": { "cats": [ - 12 + 59 ], "html": "]*href=\"[^/]*slimbox2(?:-rtl)?\\.css", "icon": "Slimbox 2.png", @@ -9084,11 +9584,11 @@ "cats": [ 36 ], + "html": "]+smartadserver\\.com\\/call", + "icon": "Smart Ad Server.png", "js": { "SmartAdServer": "" }, - "html": "]+smartadserver\\.com\\/call", - "icon": "Smart Ad Server.png", "website": "http://smartadserver.com" }, "SmartSite": { @@ -9124,12 +9624,12 @@ }, "Snap.svg": { "cats": [ - 12 + 59 ], + "icon": "Snap.svg.png", "js": { - "Snap.version": "(.*)\\;version:\\1" + "Snap.version": "^(.+)$\\;version:\\1" }, - "icon": "Snap.svg.png", "script": "snap\\.svg(?:-min)?\\.js", "website": "http://snapsvg.io" }, @@ -9137,10 +9637,10 @@ "cats": [ 10 ], + "icon": "Snoobi.png", "js": { "snoobi": "" }, - "icon": "Snoobi.png", "script": "snoobi\\.com/snoop\\.php", "website": "http://www.snoobi.com" }, @@ -9148,26 +9648,36 @@ "cats": [ 19 ], + "icon": "SobiPro.png", + "implies": "Joomla", "js": { "SobiProUrl": "" }, - "icon": "SobiPro.png", - "implies": "Joomla", "website": "http://sigsiu.net/sobipro.html" }, "Socket.io": { "cats": [ 12 ], + "icon": "Socket.io.png", + "implies": "Node.js", "js": { "io.Socket": "", - "io.version": "(.*)\\;version:\\1" + "io.version": "^(.+)$\\;version:\\1" }, - "icon": "Socket.io.png", - "implies": "Node.js", "script": "socket\\.io.*\\.js", "website": "https://socket.io" }, + "SoftTr": { + "cats": [ + 6 + ], + "icon": "softtr.png", + "meta": { + "author": "SoftTr E-Ticaret Sitesi Yazılımı" + }, + "website": "http://www.softtr.com" + }, "Solodev": { "cats": [ 1 @@ -9195,11 +9705,11 @@ "cookies": { "_solusquare": "" }, + "icon": "Solusquare.png", + "implies": "Adobe ColdFusion", "meta": { "generator": "^Solusquare$" }, - "icon": "Solusquare.png", - "implies": "Adobe ColdFusion", "website": "https://www.solusquare.com" }, "Solve Media": { @@ -9207,13 +9717,13 @@ 16, 36 ], + "icon": "Solve Media.png", "js": { - "_ACPuzzle": "", "ACPuzzle": "", + "_ACPuzzle": "", "_adcopy-puzzle-image-image": "", "adcopy-puzzle-image-image": "" }, - "icon": "Solve Media.png", "script": "^https?://api\\.solvemedia\\.com/", "website": "http://solvemedia.com" }, @@ -9221,16 +9731,16 @@ "cats": [ 47 ], - "js": { - "SonarMeasures": "", - "SonarRequest": "" - }, "html": [ "SonarQube" ], "icon": "sonar.png", "implies": "Java", + "js": { + "SonarMeasures": "", + "SonarRequest": "" + }, "meta": { "application-name": "^SonarQubes$" }, @@ -9239,32 +9749,25 @@ }, "SoundManager": { "cats": [ - 12 + 59 ], + "icon": "SoundManager.png", "js": { + "BaconPlayer": "", "SoundManager": "", - "soundManager.version": "V(.+) \\;version:\\1", - "BaconPlayer": "" + "soundManager.version": "V(.+) \\;version:\\1" }, - "icon": "SoundManager.png", "website": "http://www.schillmania.com/projects/soundmanager2" }, - "Sparql": { - "cats": [ - 27 - ], - "website": "https://www.w3.org/TR/sparql11-overview/" - }, "Sphinx": { "cats": [ 4 ], + "html": "Created using Sphinx ([0-9.]+)\\.\\;version:\\1", + "icon": "Sphinx.png", "js": { "DOCUMENTATION_OPTIONS": "" }, - "html": "Created using Sphinx ([.\\d+])+\\.\\;version:\\1", - "icon": "Sphinx.png", - "implies": "Python", "website": "http://sphinx.pocoo.org" }, "SpiderControl iniNet": { @@ -9318,43 +9821,40 @@ "implies": "Ruby on Rails", "website": "http://spreecommerce.com" }, - "Squarespace": { + "Sqreen": { "cats": [ - 1 + 19 ], - "js": { - "Squarespace": "" - }, - "html": "", "headers": { - "X-ServedBy": "squarespace" + "X-Protected-By": "^Sqreen$" }, - "icon": "Squarespace.png", - "website": "http://www.squarespace.com" + "icon": "Sqreen.png", + "website": "https://sqreen.io" }, - "Pagevamp": { + "Squarespace": { "cats": [ 1 ], - "js": { - "Pagevamp": "" - }, "headers": { - "X-ServedBy": "pagevamp" + "X-ServedBy": "squarespace" }, - "icon": "Pagevamp.png", - "website": "https://www.pagevamp.com" + "html": "", + "icon": "Squarespace.png", + "js": { + "Squarespace": "" + }, + "website": "http://www.squarespace.com" }, "SquirrelMail": { "cats": [ 30 ], - "js": { - "squirrelmail_loginpage_onload": "" - }, "html": "SquirrelMail version ([.\\d]+)[^<]*
]+store-systems\\.de\"|\\.mws_boxTop", + "icon": "Store Systems.png", + "website": "http://store-systems.de" + }, "Storeden": { "cats": [ 6 @@ -9428,14 +9926,6 @@ "icon": "storeden.svg", "website": "https://www.storeden.com" }, - "Store Systems": { - "cats": [ - 6 - ], - "html": "Shopsystem von ]+store-systems\\.de\"|\\.mws_boxTop", - "icon": "Store Systems.png", - "website": "http://store-systems.de" - }, "Storyblok": { "cats": [ 1 @@ -9458,6 +9948,16 @@ "script": "strapdown\\.js", "website": "http://strapdownjs.com" }, + "Strapi": { + "cats": [ + 1 + ], + "headers": { + "X-Powered-By": "^Strapi" + }, + "icon": "Strapi.png", + "website": "https://strapi.io" + }, "Strato": { "cats": [ 6 @@ -9470,37 +9970,22 @@ "cats": [ 41 ], - "js": { - "Stripe.version": "(.*)\\;version:\\1" - }, "html": "]+data-stripe", "icon": "Stripe.png", + "js": { + "Stripe.version": "^(.+)$\\;version:\\1" + }, "script": "js\\.stripe\\.com", "website": "http://stripe.com" }, - "styled-components": { - "cats": [ - 12, - 47 - ], - "implies": [ - "React" - ], - "icon": "styled-components.png", - "website": "https://styled-components.com", - "html": "]*data-styled-components", - "js": { - "styled": "" - } - }, "SublimeVideo": { "cats": [ 14 ], + "icon": "SublimeVideo.png", "js": { "sublimevideo": "" }, - "icon": "SublimeVideo.png", "script": "cdn\\.sublimevideo\\.net/js/[a-z\\d]+\\.js", "website": "http://sublimevideo.net" }, @@ -9518,6 +10003,17 @@ }, "website": "http://subrion.com" }, + "Sucuri": { + "cats": [ + 31 + ], + "headers": { + "x-sucuri-cache:": "", + "x-sucuri-id": "" + }, + "icon": "sucuri.png", + "website": "https://sucuri.net/" + }, "Sulu": { "cats": [ 1 @@ -9568,25 +10064,36 @@ "url": "^https?://[^/]+\\.svbtle\\.com", "website": "https://www.svbtle.com" }, - "SweetAlert": { + "Svelte": { "cats": [ 12 ], + "html": "<[^>]+class=\"[^\"]*svelte-", + "icon": "Svelte.svg", + "website": "https://svelte.dev" + }, + "SweetAlert": { + "cats": [ + 59 + ], + "html": "]+?href=\"[^\"]+sweet-alert(?:\\.min)?\\.css", + "icon": "SweetAlert.png", "js": { "swal": "" }, - "html": "]+?href=\"[^\"]+sweet-alert(?:\\.min)?\\.css", - "icon": "SweetAlert.png", "script": "sweet-alert(?:\\.min)?\\.js", - "website": "http://t4t5.github.io/sweetalert/" + "website": "https://t4t5.github.io/sweetalert/" }, "SweetAlert2": { "cats": [ - 12 + 59 ], "excludes": "SweetAlert", "html": "]+?href=\"[^\"]+sweetalert2(?:\\.min)?\\.css", "icon": "SweetAlert2.png", + "js": { + "Sweetalert2": "" + }, "script": "sweetalert2(?:\\.all)?(?:\\.min)?\\.js", "website": "https://sweetalert2.github.io/" }, @@ -9611,10 +10118,10 @@ "cats": [ 29 ], + "icon": "swiftype.png", "js": { "Swiftype": "" }, - "icon": "swiftype.png", "script": "swiftype\\.com/embed\\.js$", "website": "http://swiftype.com" }, @@ -9626,6 +10133,18 @@ "implies": "PHP", "website": "http://symfony.com" }, + "Sympa": { + "cats": [ + 30 + ], + "meta": { + "generator": "^Sympa$" + }, + "html": "\\s*Powered by Sympa\\s*", + "icon": "sympa.png", + "implies": "Perl", + "website": "https://www.sympa.org/" + }, "Synology DiskStation": { "cats": [ 48 @@ -9643,12 +10162,12 @@ "cats": [ 19 ], + "html": "<(?:script|link)[^>]*sh(?:Core|Brush|ThemeDefault)", + "icon": "SyntaxHighlighter.png", "js": { "SyntaxHighlighter": "" }, - "html": "<(?:script|link)[^>]*sh(?:Core|Brush|ThemeDefault)", - "icon": "SyntaxHighlighter.png", - "website": "http://github.com/syntaxhighlighter" + "website": "https://github.com/syntaxhighlighter" }, "TWiki": { "cats": [ @@ -9663,31 +10182,43 @@ "script": "(?:TWikiJavascripts|twikilib(?:\\.min)?\\.js)", "website": "http://twiki.org" }, + "tailwindcss": { + "cats": [ + 18 + ], + "html": "]+?href=\"[^\"]+tailwindcss(?:\\.min)?\\.css", + "icon": "tailwindcss.svg", + "website": "https://tailwindcss.com/" + }, "TYPO3 CMS": { "cats": [ 1 ], - "html": "<(?:script[^>]+ src|link[^>]+ href)=[^>]+typo3temp/", + "html": [ + "]+ href=\"typo3(?:conf|temp)/", + "]+ src=\"typo3(?:conf|temp)/" + ], "icon": "TYPO3.svg", "implies": "PHP", + "script": "^typo3(?:conf|temp)/", "meta": { "generator": "TYPO3\\s+(?:CMS\\s+)?([\\d.]+)?(?:\\s+CMS)?\\;version:\\1" }, "url": "/typo3/", - "website": "http://www.typo3.org" + "website": "https://typo3.org/" }, "Taiga": { "cats": [ 13 ], - "js": { - "taigaConfig": "" - }, "icon": "Taiga.png", "implies": [ "Django", "AngularJS" ], + "js": { + "taigaConfig": "" + }, "website": "http://taiga.io" }, "Tawk.to": { @@ -9702,22 +10233,22 @@ "cats": [ 10 ], + "icon": "Tealeaf.png", "js": { "TeaLeaf": "" }, - "icon": "Tealeaf.png", "website": "http://www.tealeaf.com" }, "Tealium": { "cats": [ 36 ], + "icon": "Tealium.png", "js": { "TEALIUMENABLED": "" }, - "icon": "Tealium.png", "script": [ - "^//tags\\.tiqcdn\\.com/", + "^(?:https?:)?//tags\\.tiqcdn\\.com/", "/tealium/utag\\.js$" ], "website": "http://tealium.com" @@ -9746,16 +10277,42 @@ "cats": [ 1 ], - "js": { - "Telescope": "" - }, "icon": "Telescope.png", "implies": [ "Meteor", "React" ], + "js": { + "Telescope": "" + }, "website": "http://telescopeapp.org" }, + "TN Express Web": { + "cats": [ + 1 + ], + "cookies": { + "TNEW": "" + }, + "implies": [ + "Tessitura" + ], + "icon": "tessitura.svg", + "website": "https://www.tessituranetwork.com" + }, + "Tessitura": { + "cats": [ + 53 + ], + "html": "" + ], + "icon": "vwo.svg", + "js": { + "VWO": "", + "__vwo": "" + }, + "script": [ + "dev\\.visualwebsiteoptimizer\\.com" + ], + "website": "https://vwo.com/" + }, "VisualPath": { "cats": [ 10 @@ -10558,33 +11107,61 @@ "script": "visualpath[^/]*\\.trackset\\.it/[^/]+/track/include\\.js", "website": "http://www.trackset.com/web-analytics-software/visualpath" }, - "Volusion": { + "Volusion (V1)": { "cats": [ 6 ], + "html": "]*href=\"[^\"]*/vspfiles/", + "icon": "Volusion.svg", + "implies": "Microsoft ASP.NET", "js": { "volusion": "" }, - "html": "]*href=\"[^\"]*/vspfiles/", - "icon": "Volusion.png", "script": "/volusion\\.js(?:\\?([\\d.]*))?\\;version:\\1", - "website": "http://volusion.com" + "website": "https://www.volusion.com" + }, + "Volusion (V2)": { + "cats": [ + 6 + ], + "html": "]*data-vn-page-name", + "icon": "Volusion.svg", + "implies": "AngularJS", + "website": "https://www.volusion.com" }, "Vue.js": { "cats": [ 12 ], + "html": "<[^>]+data-v(?:ue)-", + "icon": "Vue.js.png", "js": { - "Vue.version": "(.*)\\;version:\\1" + "Vue.version": "^(.+)$\\;version:\\1" }, - "html": "<[^>]+data-v-", - "icon": "Vue.js.png", "script": [ - "vue(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "vue[.-]([\\d.]*\\d)[^/]*\\.js\\;version:\\1", "(?:/([\\d.]+))?/vue(?:\\.min)?\\.js\\;version:\\1" ], "website": "http://vuejs.org" }, + "Nuxt.js": { + "cats": [ + 12 + ], + "html": [ + "
]*id=\"__nuxt\"", + " - + diff --git a/src/drivers/webextension/html/popup.html b/src/drivers/webextension/html/popup.html index 9fc0278ad..2a7d662dc 100644 --- a/src/drivers/webextension/html/popup.html +++ b/src/drivers/webextension/html/popup.html @@ -7,7 +7,7 @@ - + @@ -17,6 +17,16 @@
-
+
+
+
+
+ + + + +
+
+
diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index 061830705..82713d79b 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -1,17 +1,34 @@ /** global: browser */ /** global: XMLSerializer */ -if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) { +/* global browser */ +/* eslint-env browser */ + +const port = browser.runtime.connect({ + name: 'content.js', +}); + +if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { try { - sendMessage('init', {}); + port.postMessage({ id: 'init' }); // HTML - var html = new XMLSerializer().serializeToString(document).split('\n'); + let html = new XMLSerializer().serializeToString(document); + + const chunks = []; + const maxCols = 2000; + const maxRows = 3000; + const rows = html.length / maxCols; + + let i; - html = html - .slice(0, 1000).concat(html.slice(html.length - 1000)) - .map(line => line.substring(0, 1000)) - .join('\n'); + for (i = 0; i < rows; i += 1) { + if (i < maxRows / 2 || i > rows - maxRows / 2) { + chunks.push(html.slice(i * maxCols, (i + 1) * maxCols)); + } + } + + html = chunks.join('\n'); // Scripts const scripts = Array.prototype.slice @@ -20,52 +37,51 @@ if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) { .map(script => script.src) .filter(script => script.indexOf('data:text/javascript;') !== 0); - sendMessage('analyze', { html, scripts }); + port.postMessage({ id: 'analyze', subject: { html, scripts } }); // JavaScript variables const script = document.createElement('script'); script.onload = () => { - const onMessage = event => { - if ( event.data.id !== 'js' ) { + const onMessage = (event) => { + if (event.data.id !== 'js') { return; } - removeEventListener('message', onMessage); + window.removeEventListener('message', onMessage); - sendMessage('analyze', { js: event.data.js }); + port.postMessage({ id: 'analyze', subject: { js: event.data.js } }); script.remove(); }; - addEventListener('message', onMessage); + window.addEventListener('message', onMessage); - sendMessage('get_js_patterns', {}, response => { - if ( response ) { - postMessage({ - id: 'patterns', - patterns: response.patterns - }, '*'); - } - }); + port.postMessage({ id: 'get_js_patterns' }); }; script.setAttribute('src', browser.extension.getURL('js/inject.js')); document.body.appendChild(script); - } catch (e) { - sendMessage('log', e); + } catch (error) { + port.postMessage({ id: 'log', subject: error }); } } -function sendMessage(id, subject, callback) { - ( chrome || browser ).runtime.sendMessage({ - id, - subject, - source: 'content.js' - }, callback || ( () => {} )); -} +port.onMessage.addListener((message) => { + switch (message.id) { + case 'get_js_patterns': + postMessage({ + id: 'patterns', + patterns: message.response.patterns, + }, window.location.href); + + break; + default: + // Do nothing + } +}); // https://stackoverflow.com/a/44774834 // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value -undefined; +undefined; // eslint-disable-line no-unused-expressions diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index a08a0580e..327d31717 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -2,34 +2,61 @@ * WebExtension driver */ +/* eslint-env browser */ +/* global browser, chrome, fetch, Wappalyzer */ + /** global: browser */ +/** global: chrome */ +/** global: fetch */ /** global: Wappalyzer */ const wappalyzer = new Wappalyzer(); -var tabCache = {}; -var categoryOrder = []; -var options = {}; -var robotsTxtQueue = {}; +const tabCache = {}; +const robotsTxtQueue = {}; + +let categoryOrder = []; -browser.tabs.onRemoved.addListener(tabId => { +browser.tabs.onRemoved.addListener((tabId) => { tabCache[tabId] = null; }); +function userAgent() { + const url = chrome.extension.getURL('/'); + + if (url.match(/^chrome-/)) { + return 'chrome'; + } + + if (url.match(/^moz-/)) { + return 'firefox'; + } + + if (url.match(/^ms-browser-/)) { + return 'edge'; + } +} + /** * Get a value from localStorage */ function getOption(name, defaultValue = null) { - return new Promise((resolve, reject) => { - const callback = item => { - options[name] = item.hasOwnProperty(name) ? item[name] : defaultValue; + return new Promise(async (resolve, reject) => { + let value = defaultValue; + + try { + const option = await browser.storage.local.get(name); + + if (option[name] !== undefined) { + value = option[name]; + } + } catch (error) { + wappalyzer.log(error.message, 'driver', 'error'); - resolve(options[name]); - }; + return reject(error.message); + } - browser.storage.local.get(name) - .then(callback) - .catch(error => wappalyzer.log(error, 'driver', 'error')); + return resolve(value); }); } @@ -37,13 +64,17 @@ function getOption(name, defaultValue = null) { * Set a value in localStorage */ function setOption(name, value) { - var option = {}; - - option[name] = value; + return new Promise(async (resolve, reject) => { + try { + await browser.storage.local.set({ [name]: value }); + } catch (error) { + wappalyzer.log(error.message, 'driver', 'error'); - browser.storage.local.set(option); + return reject(error.message); + } - options[name] = value; + return resolve(); + }); } /** @@ -52,135 +83,88 @@ function setOption(name, value) { function openTab(args) { browser.tabs.create({ url: args.url, - active: args.background === undefined || !args.background + active: args.background === undefined || !args.background, }); } /** * Make a POST request */ -function post(url, body) { - fetch(url, { - method: 'POST', - body: JSON.stringify(body) - }) - .then(response => { - wappalyzer.log('POST ' + url + ': ' + response.status, 'driver'); - }) - .catch(error => { - wappalyzer.log('POST ' + url + ': ' + error, 'driver', 'error'); +async function post(url, body) { + try { + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(body), }); -} -fetch('../apps.json') - .then(response => { - return response.json(); - }) - .then(json => { - wappalyzer.apps = json.apps; - wappalyzer.categories = json.categories; + wappalyzer.log(`POST ${url}: ${response.status}`, 'driver'); + } catch (error) { + wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error'); + } +} - wappalyzer.parseJsPatterns(); +// Capture response headers +browser.webRequest.onCompleted.addListener(async (request) => { + const headers = {}; - categoryOrder = Object.keys(wappalyzer.categories) - .map(categoryId => parseInt(categoryId, 10)) - .sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority); - }) - .catch(error => { - wappalyzer.log('GET apps.json: ' + error, 'driver', 'error'); - }); + if (request.responseHeaders) { + const url = wappalyzer.parseUrl(request.url); -// Version check -var version = browser.runtime.getManifest().version; + let tab; -getOption('version') - .then(previousVersion => { - if ( previousVersion === null ) { - openTab({ - url: wappalyzer.config.websiteURL + 'installed' - }); - } else if ( version !== previousVersion ) { - getOption('upgradeMessage', true) - .then(upgradeMessage => { - if ( upgradeMessage ) { - openTab({ - url: wappalyzer.config.websiteURL + 'upgraded?v' + version, - background: true - }); - } - }); + try { + [tab] = await browser.tabs.query({ url: [url.href] }); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); } - setOption('version', version); - }); + if (tab) { + request.responseHeaders.forEach((header) => { + const name = header.name.toLowerCase(); -getOption('dynamicIcon', true); -getOption('pinnedCategory'); + headers[name] = headers[name] || []; -// Run content script on all tabs -browser.tabs.query({ url: [ 'http://*/*', 'https://*/*' ] }) - .then(tabs => { - tabs.forEach(tab => { - browser.tabs.executeScript(tab.id, { - file: '../js/content.js' + headers[name].push((header.value || header.binaryValue || '').toString()); }); - }) - }) - .catch(error => wappalyzer.log(error, 'driver', 'error')); - -// Capture response headers -browser.webRequest.onCompleted.addListener(request => { - const headers = {}; - - if ( request.responseHeaders ) { - const url = wappalyzer.parseUrl(request.url); - browser.tabs.query({ url: [ url.href ] }) - .then(tabs => { - const tab = tabs[0] || null; + if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) { + wappalyzer.analyze(url, { headers }, { tab }); + } + } + } +}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']); - console.log({ url: url.canonical, tab }); +browser.runtime.onConnect.addListener((port) => { + port.onMessage.addListener(async (message) => { + if (message.id === undefined) { + return; + } - if ( tab ) { - request.responseHeaders.forEach(header => { - const name = header.name.toLowerCase(); + if (message.id !== 'log') { + wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver'); + } - headers[name] = headers[name] || []; + const pinnedCategory = await getOption('pinnedCategory'); - headers[name].push(header.value || header.binaryValue.toString()); - }); + const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : ''); - if ( headers['content-type'] && /\/x?html/.test(headers['content-type'][0]) ) { - wappalyzer.analyze(url, { headers }, { tab }); - } - } - }) - .catch(error => wappalyzer.log(error, 'driver', 'error')); - } -}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]); + const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` }); -// Listen for messages -( chrome || browser ).runtime.onMessage.addListener((message, sender, sendResponse) => { - if ( typeof message.id != 'undefined' ) { - if ( message.id !== 'log' ) { - wappalyzer.log('Message' + ( message.source ? ' from ' + message.source : '' ) + ': ' + message.id, 'driver'); - } + let response; - var url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : ''); - var response; - - switch ( message.id ) { + switch (message.id) { case 'log': wappalyzer.log(message.subject, message.source); break; case 'init': - browser.cookies.getAll({ domain: '.' + url.hostname }) - .then(cookies => wappalyzer.analyze(url, { cookies }, { tab: sender.tab })); + wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab }); break; case 'analyze': - wappalyzer.analyze(url, message.subject, { tab: sender.tab }); + wappalyzer.analyze(url, message.subject, { tab: port.sender.tab }); + + await setOption('hostnameCache', wappalyzer.hostnameCache); break; case 'ad_log': @@ -192,27 +176,32 @@ browser.webRequest.onCompleted.addListener(request => { tabCache: tabCache[message.tab.id], apps: wappalyzer.apps, categories: wappalyzer.categories, - pinnedCategory: options.pinnedCategory, + pinnedCategory, + termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false), }; break; case 'set_option': - setOption(message.key, message.value); + await setOption(message.key, message.value); break; case 'get_js_patterns': response = { - patterns: wappalyzer.jsPatterns + patterns: wappalyzer.jsPatterns, }; break; default: + // Do nothing } - sendResponse(response); - } - - return true; + if (response) { + port.postMessage({ + id: message.id, + response, + }); + } + }); }); wappalyzer.driver.document = document; @@ -221,50 +210,51 @@ wappalyzer.driver.document = document; * Log messages to console */ wappalyzer.driver.log = (message, source, type) => { - console.log('[wappalyzer ' + type + ']', '[' + source + ']', message); + const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log'; + + console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console }; /** * Display apps */ -wappalyzer.driver.displayApps = (detected, meta, context) => { - var tab = context.tab; +wappalyzer.driver.displayApps = async (detected, meta, context) => { + const { tab } = context; - if ( tab === undefined ) { + if (tab === undefined) { return; } tabCache[tab.id] = tabCache[tab.id] || { - detected: [] + detected: [], }; tabCache[tab.id].detected = detected; - var appName, found = false; + const pinnedCategory = await getOption('pinnedCategory'); + const dynamicIcon = await getOption('dynamicIcon', true); - // Find the main application to display - [ options.pinnedCategory ].concat(categoryOrder).forEach(match => { - Object.keys(detected).forEach(appName => { - var app = detected[appName]; + let found = false; - app.props.cats.forEach(category => { - if ( category === match && !found ) { - var icon = app.props.icon || 'default.svg'; + // Find the main application to display + [pinnedCategory].concat(categoryOrder).forEach((match) => { + Object.keys(detected).forEach((appName) => { + const app = detected[appName]; - if ( !options.dynamicIcon ) { - icon = 'default.svg'; - } + app.props.cats.forEach((category) => { + if (category === match && !found) { + let icon = app.props.icon && dynamicIcon ? app.props.icon : 'default.svg'; - if ( /\.svg$/i.test(icon) ) { - icon = 'converted/' + icon.replace(/\.svg$/, '.png'); + if (/\.svg$/i.test(icon)) { + icon = `converted/${icon.replace(/\.svg$/, '.png')}`; } try { browser.pageAction.setIcon({ tabId: tab.id, - path: '../images/icons/' + icon + path: `../images/icons/${icon}`, }); - } catch(e) { + } catch (e) { // Firefox for Android does not support setIcon see https://bugzilla.mozilla.org/show_bug.cgi?id=1331746 } @@ -274,57 +264,53 @@ wappalyzer.driver.displayApps = (detected, meta, context) => { }); }); - if ( typeof chrome !== 'undefined' ) { - // Browser polyfill doesn't seem to work here - chrome.pageAction.show(tab.id); - } else { - browser.pageAction.show(tab.id); - } + browser.pageAction.show(tab.id); }; /** * Fetch and cache robots.txt for host */ -wappalyzer.driver.getRobotsTxt = (host, secure = false) => { - if ( robotsTxtQueue.hasOwnProperty(host) ) { +wappalyzer.driver.getRobotsTxt = async (host, secure = false) => { + if (robotsTxtQueue[host]) { return robotsTxtQueue[host]; } - robotsTxtQueue[host] = new Promise((resolve, reject) => { - getOption('tracking', true) - .then(tracking => { - if ( !tracking ) { - return resolve([]); - } + const tracking = await getOption('tracking', true); + const robotsTxtCache = await getOption('robotsTxtCache', {}); + + robotsTxtQueue[host] = new Promise(async (resolve) => { + if (!tracking) { + return resolve([]); + } + + if (host in robotsTxtCache) { + return resolve(robotsTxtCache[host]); + } - getOption('robotsTxtCache') - .then(robotsTxtCache => { - robotsTxtCache = robotsTxtCache || {}; + const timeout = setTimeout(() => resolve([]), 3000); - if ( host in robotsTxtCache ) { - return resolve(robotsTxtCache[host]); - } + let response; - const timeout = setTimeout(() => resolve([]), 3000); + try { + response = await fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' }); + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); - fetch('http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt', { redirect: 'follow' }) - .then(response => { - clearTimeout(timeout); + return resolve([]); + } - return response.ok ? response.text() : ''; - }) - .then(robotsTxt => { - robotsTxtCache[host] = wappalyzer.parseRobotsTxt(robotsTxt); + clearTimeout(timeout); - setOption('robotsTxtCache', robotsTxtCache); + const robotsTxt = response.ok ? await response.text() : ''; - resolve(robotsTxtCache[host]); - }) - .catch(err => resolve([])); - }); - }); - }) - .finally(() => delete robotsTxtQueue[host]); + robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt); + + await setOption('robotsTxtCache', robotsTxtCache); + + delete robotsTxtQueue[host]; + + return resolve(robotsTxtCache[host]); + }); return robotsTxtQueue[host]; }; @@ -332,19 +318,77 @@ wappalyzer.driver.getRobotsTxt = (host, secure = false) => { /** * Anonymously track detected applications for research purposes */ -wappalyzer.driver.ping = (hostnameCache, adCache) => { - getOption('tracking', true) - .then(tracking => { - if ( tracking ) { - if ( Object.keys(hostnameCache).length ) { - post('https://api.wappalyzer.com/ping/v1/', hostnameCache); - } +wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { + const tracking = await getOption('tracking', true); + const termsAccepted = userAgent() === 'chrome' || await getOption('termsAccepted', false); - if ( adCache.length ) { - post('https://ad.wappalyzer.com/log/wp/', adCache); - } + if (tracking && termsAccepted) { + if (Object.keys(hostnameCache).length) { + post('https://api.wappalyzer.com/ping/v1/', hostnameCache); + } - setOption('robotsTxtCache', {}); + if (adCache.length) { + post('https://ad.wappalyzer.com/log/wp/', adCache); + } + + await setOption('robotsTxtCache', {}); + } +}; + +// Init +(async () => { + // Technologies + try { + const response = await fetch('../apps.json'); + const json = await response.json(); + + wappalyzer.apps = json.apps; + wappalyzer.categories = json.categories; + } catch (error) { + wappalyzer.log(`GET apps.json: ${error.message}`, 'driver', 'error'); + } + + wappalyzer.parseJsPatterns(); + + categoryOrder = Object.keys(wappalyzer.categories) + .map(categoryId => parseInt(categoryId, 10)) + .sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority); + + // Version check + const { version } = browser.runtime.getManifest(); + const previousVersion = await getOption('version'); + const upgradeMessage = await getOption('upgradeMessage', true); + + if (previousVersion === null) { + openTab({ + url: `${wappalyzer.config.websiteURL}installed`, + }); + } else if (version !== previousVersion && upgradeMessage) { + openTab({ + url: `${wappalyzer.config.websiteURL}upgraded?v${version}`, + background: true, + }); + } + + await setOption('version', version); + + // Hostname cache + wappalyzer.hostnameCache = await getOption('hostnameCache', {}); + + // Run content script on all tabs + try { + const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] }); + + tabs.forEach(async (tab) => { + try { + await browser.tabs.executeScript(tab.id, { + file: '../js/content.js', + }); + } catch (error) { + // } }); -}; + } catch (error) { + wappalyzer.log(error, 'driver', 'error'); + } +})(); diff --git a/src/drivers/webextension/js/inject.js b/src/drivers/webextension/js/inject.js index d3dab8135..3e9a6658f 100644 --- a/src/drivers/webextension/js/inject.js +++ b/src/drivers/webextension/js/inject.js @@ -1,9 +1,29 @@ +/* eslint-env browser */ + (() => { - try { - addEventListener('message', onMessage); + try { + const detectJs = (chain) => { + const properties = chain.split('.'); + + let value = properties.length ? window : null; + + for (let i = 0; i < properties.length; i++) { + const property = properties[i]; + + if (value && value.hasOwnProperty(property)) { + value = value[property]; + } else { + value = null; + + break; + } + } + + return typeof value === 'string' || typeof value === 'number' ? value : !!value; + }; - function onMessage(event) { - if ( event.data.id !== 'patterns' ) { + const onMessage = (event) => { + if (event.data.id !== 'patterns') { return; } @@ -13,18 +33,18 @@ const js = {}; - for ( let appName in patterns ) { - if ( patterns.hasOwnProperty(appName) ) { + for (const appName in patterns) { + if (patterns.hasOwnProperty(appName)) { js[appName] = {}; - for ( let chain in patterns[appName] ) { - if ( patterns[appName].hasOwnProperty(chain) ) { + for (const chain in patterns[appName]) { + if (patterns[appName].hasOwnProperty(chain)) { js[appName][chain] = {}; - for ( let index in patterns[appName][chain] ) { + for (const index in patterns[appName][chain]) { const value = detectJs(chain); - if ( value && patterns[appName][chain].hasOwnProperty(index) ) { + if (value && patterns[appName][chain].hasOwnProperty(index)) { js[appName][chain][index] = value; } } @@ -33,29 +53,11 @@ } } - postMessage({ id: 'js', js }, '*'); - } + postMessage({ id: 'js', js }, window.location.href); + }; - function detectJs(chain) { - const properties = chain.split('.'); - - var value = properties.length ? window : null; - - for ( let i = 0; i < properties.length; i ++ ) { - var property = properties[i]; - - if ( value && value.hasOwnProperty(property) ) { - value = value[property]; - } else { - value = null; - - break; - } - } - - return typeof value === 'string' || typeof value === 'number' ? value : !!value; - } - } catch(e) { + addEventListener('message', onMessage); + } catch (e) { // Fail quietly } })(); diff --git a/src/drivers/webextension/js/jsontodom.js b/src/drivers/webextension/js/jsontodom.js deleted file mode 100644 index c6506c4fb..000000000 --- a/src/drivers/webextension/js/jsontodom.js +++ /dev/null @@ -1,63 +0,0 @@ -jsonToDOM.namespaces = { - html: "http://www.w3.org/1999/xhtml", - xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" -}; - -jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html; - -function jsonToDOM(jsonTemplate, doc, nodes) { - function namespace(name) { - var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name); - return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] }; - } - - // Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation - function tag(elemNameOrArray, elemAttr) { - // Array of elements? Parse each one... - if (Array.isArray(elemNameOrArray)) { - var frag = doc.createDocumentFragment(); - Array.prototype.forEach.call(arguments, function(thisElem) { - frag.appendChild(tag.apply(null, thisElem)); - }); - return frag; - } - - // Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element - var elemNs = namespace(elemNameOrArray); - var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName); - - // Set element's attributes and/or callback functions (eg. onclick) - for (var key in elemAttr) { - var val = elemAttr[key]; - if (nodes && key == "key") { - nodes[val] = elem; - continue; - } - - var attrNs = namespace(key); - if (typeof val == "function") { - // Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener - elem.addEventListener(key.replace(/^on/, ""), val, false); - } - else { - // Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace) - elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val); - } - } - - // Create and append this element's children - var childElems = Array.prototype.slice.call(arguments, 2); - childElems.forEach(function(childElem) { - if (childElem != null) { - elem.appendChild( - childElem instanceof doc.defaultView.Node ? childElem : - Array.isArray(childElem) ? tag.apply(null, childElem) : - doc.createTextNode(childElem)); - } - }); - - return elem; - } - - return tag.apply(null, jsonTemplate); -} diff --git a/src/drivers/webextension/js/iframe.js b/src/drivers/webextension/js/lib/iframe.js similarity index 96% rename from src/drivers/webextension/js/iframe.js rename to src/drivers/webextension/js/lib/iframe.js index 883ebea71..b50e63629 100644 --- a/src/drivers/webextension/js/iframe.js +++ b/src/drivers/webextension/js/lib/iframe.js @@ -6,6 +6,7 @@ var exports = {}; (function(exports) { + var port = browser.runtime.connect({name:"adparser"}); var utils = { normalizeUrl: function(url) { @@ -119,12 +120,9 @@ var exports = {}; } return dict; }, - sendToBackground: function(message, event, responseMessage, onResponse) { - if ( typeof browser !== 'undefined' ) { - var response = browser.runtime.sendMessage(message); - response.then(onResponse); - } else if ( typeof chrome !== 'undefined' ) { - chrome.runtime.sendMessage(message, onResponse); + sendToBackground: function(message, event, responseMessage) { + if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) { + port.postMessage(message); } else if ( window.self.port ) { window.self.port.on(responseMessage, onResponse); window.self.port.emit(event, message); @@ -132,25 +130,28 @@ var exports = {}; }, askIfTrackingEnabled: function(callback, elseCallback) { + utilCallback = callback; + utilElseCallback = elseCallback; this.sendToBackground( 'is_tracking_enabled', '', - 'tracking_enabled_response', - function(message) { - if ( message && message.tracking_enabled ) { - - callback(); - } else { - - elseCallback(); - } - } + 'tracking_enabled_response' ); } }; + port.onMessage.addListener((message) => { + if ( message && message.tracking_enabled ) { + + utilCallback(); + } else { + + utilElseCallback(); + } + }); + utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME; @@ -181,7 +182,7 @@ var exports = {}; video_assets: opt_video_assets, assets: opt_assets, version: '3', - mrev: '4aeaa5a-c', + mrev: '15a9f21-d', msgNum: this.msgNum, timestamp: new Date().getTime(), pageVis: document.visibilityState, @@ -195,6 +196,8 @@ var exports = {}; utils.LogGenerator = LogGenerator; + let utilCallback, utilElseCallback; + exports.utils = utils; })(exports); @@ -890,7 +893,7 @@ var exports = {}; var _pageTags; var INIT_MS_BW_SEARCHES = 2000; var PAGE_TAG_RE = new RegExp('gpt|oascentral'); - var POST_MSG_ID = '1519242200-10756-12873-1462-13403'; + var POST_MSG_ID = '1554456894-8541-12665-19466-15909'; var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); function getPageTags(doc) { @@ -1028,13 +1031,17 @@ var exports = {}; myWin = window.document.defaultView, ifrTag; - try { + if ( typeof event.data === "string" && event.data.indexOf(POST_MSG_ID) != -1 ) { + try { - adData = JSON.parse(event.data); - } catch(e) { + adData = JSON.parse(event.data); + } catch (e) { - return; + return; + } } + else + return; if ( adData.postMessageId === POST_MSG_ID ) { @@ -1080,19 +1087,14 @@ var exports = {}; } function addBackgroundListener(event, callback) { - if ( typeof browser !== 'undefined' ) { + if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) { browser.runtime.onMessage.addListener(function(msg) { if ( msg.event === event ) { callback(msg); } }); - } else if ( typeof chrome !== 'undefined' ) { - chrome.runtime.onMessage.addListener(function(msg) { - if ( msg.event === event ) { - callback(msg); - } - }); - } else if ( window.self.port ) { + } + else if (window.self.port) { window.self.port.on(event, callback); } } diff --git a/src/drivers/webextension/js/lib/jsontodom.js b/src/drivers/webextension/js/lib/jsontodom.js new file mode 100644 index 000000000..24d9e4c29 --- /dev/null +++ b/src/drivers/webextension/js/lib/jsontodom.js @@ -0,0 +1,63 @@ +jsonToDOM.namespaces = { + html: 'http://www.w3.org/1999/xhtml', + xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', +}; + +jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html; + +function jsonToDOM(jsonTemplate, doc, nodes) { + function namespace(name) { + const reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name); + return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] }; + } + + // Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation + function tag(elemNameOrArray, elemAttr) { + // Array of elements? Parse each one... + if (Array.isArray(elemNameOrArray)) { + const frag = doc.createDocumentFragment(); + Array.prototype.forEach.call(arguments, (thisElem) => { + frag.appendChild(tag(...thisElem)); + }); + return frag; + } + + // Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element + const elemNs = namespace(elemNameOrArray); + const elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName); + + // Set element's attributes and/or callback functions (eg. onclick) + for (const key in elemAttr) { + const val = elemAttr[key]; + if (nodes && key == 'key') { + nodes[val] = elem; + continue; + } + + const attrNs = namespace(key); + if (typeof val === 'function') { + // Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener + elem.addEventListener(key.replace(/^on/, ''), val, false); + } else { + // Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace) + elem.setAttributeNS(attrNs.namespace || '', attrNs.shortName, val); + } + } + + // Create and append this element's children + const childElems = Array.prototype.slice.call(arguments, 2); + childElems.forEach((childElem) => { + if (childElem != null) { + elem.appendChild( + childElem instanceof doc.defaultView.Node ? childElem + : Array.isArray(childElem) ? tag(...childElem) + : doc.createTextNode(childElem), + ); + } + }); + + return elem; + } + + return tag(...jsonTemplate); +} diff --git a/src/drivers/webextension/js/network.js b/src/drivers/webextension/js/lib/network.js similarity index 88% rename from src/drivers/webextension/js/network.js rename to src/drivers/webextension/js/lib/network.js index 6df8237ca..7c46fcf9f 100644 --- a/src/drivers/webextension/js/network.js +++ b/src/drivers/webextension/js/lib/network.js @@ -1,3 +1,4 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i { + port.onMessage.addListener((message) => { + if ( message === 'is_browser_valid' ) { + ifBrowserValid( + port.postMessage({'browser_valid': true}), + port.postMessage({'browser_valid': false}) + ); + } + }); }); - browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { - if ( request === 'is_tracking_enabled' ) { - ifTrackingEnabled( - sender.tab, - function() { - try {sendResponse({'tracking_enabled': true});} - catch(err) {} }, - function() { - try {sendResponse({'tracking_enabled': false});} - catch(err) {}} - ); - } - return true; + browser.runtime.onConnect.addListener((port) => { + port.onMessage.addListener((message) => { + if ( message === 'is_tracking_enabled' ) { + ifTrackingEnabled( + port.sender.tab, + function() { + try {port.postMessage({'tracking_enabled': true});} + catch(err) {} }, + function() { + try {port.postMessage({'tracking_enabled': false});} + catch(err) {} } + ); + } + return true; + }); }); })(); + +},{}]},{},[1]); diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index fc69619f8..4666b0045 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -1,69 +1,96 @@ /** global: browser */ /** global: Wappalyzer */ +/* globals browser Wappalyzer */ +/* eslint-env browser */ const wappalyzer = new Wappalyzer(); -function getOption(name, defaultValue, callback) { - browser.storage.local.get(name) - .then(item => { - callback(item.hasOwnProperty(name) ? item[name] : defaultValue); - }); +/** + * Get a value from localStorage + */ +function getOption(name, defaultValue = null) { + return new Promise(async (resolve, reject) => { + let value = defaultValue; + + try { + const option = await browser.storage.local.get(name); + + if (option[name] !== undefined) { + value = option[name]; + } + } catch (error) { + wappalyzer.log(error.message, 'driver', 'error'); + + return reject(error.message); + } + + return resolve(value); + }); } +/** + * Set a value in localStorage + */ function setOption(name, value) { - var option = {}; + return new Promise(async (resolve, reject) => { + try { + await browser.storage.local.set({ [name]: value }); + } catch (error) { + wappalyzer.log(error.message, 'driver', 'error'); - option[name] = value; + return reject(error.message); + } - browser.storage.local.set(option); + return resolve(); + }); } -document.addEventListener('DOMContentLoaded', () => { - var nodes = document.querySelectorAll('[data-i18n]'); +document.addEventListener('DOMContentLoaded', async () => { + const nodes = document.querySelectorAll('[data-i18n]'); - Array.prototype.forEach.call(nodes, node => { + Array.prototype.forEach.call(nodes, (node) => { node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n); }); document.querySelector('#github').addEventListener('click', () => { - open(wappalyzer.config.githubURL); + window.open(wappalyzer.config.githubURL); }); document.querySelector('#twitter').addEventListener('click', () => { - open(wappalyzer.config.twitterURL); + window.open(wappalyzer.config.twitterURL); }); document.querySelector('#wappalyzer').addEventListener('click', () => { - open(wappalyzer.config.websiteURL); + window.open(wappalyzer.config.websiteURL); }); - getOption('upgradeMessage', true, value => { - const el = document.querySelector('#option-upgrade-message'); + let el; + let value; - el.checked = value; + // Upgrade message + value = await getOption('upgradeMessage', true); - el.addEventListener('change', () => { - setOption('upgradeMessage', el.checked); - }); - }); + el = document.querySelector('#option-upgrade-message'); - getOption('dynamicIcon', true, value => { - const el = document.querySelector('#option-dynamic-icon'); + el.checked = value; - el.checked = value; + el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked)); - el.addEventListener('change', () => { - setOption('dynamicIcon', el.checked); - }); - }); + // Dynamic icon + value = await getOption('dynamicIcon', true); - getOption('tracking', true, value => { - const el = document.querySelector('#option-tracking'); + el = document.querySelector('#option-dynamic-icon'); - el.checked = value; + el.checked = value; - el.addEventListener('change', () => { - setOption('tracking', el.checked); - }); - }); + el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked)); + + // Tracking + value = await getOption('tracking', true); + + el = document.querySelector('#option-tracking'); + + el.checked = value; + + el.addEventListener('change', e => setOption('tracking', e.target.checked)); }); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 47d507bf1..42ed70089 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -1,61 +1,51 @@ -/** global: chrome */ +/* eslint-env browser */ +/* global browser, jsonToDOM */ + /** global: browser */ +/** global: jsonToDOM */ -var pinnedCategory = null; +let pinnedCategory = null; +let termsAccepted = false; -var func = tabs => { - ( chrome || browser ).runtime.sendMessage({ - id: 'get_apps', - tab: tabs[0], - source: 'popup.js' - }, response => { - pinnedCategory = response.pinnedCategory; +const port = browser.runtime.connect({ + name: 'popup.js', +}); - replaceDomWhenReady(appsToDomTemplate(response)); - }); -}; +function slugify(string) { + return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); +} -browser.tabs.query({ active: true, currentWindow: true }) - .then(func) - .catch(console.error); +function i18n() { + const nodes = document.querySelectorAll('[data-i18n]'); -function replaceDomWhenReady(dom) { - if ( /complete|interactive|loaded/.test(document.readyState) ) { - replaceDom(dom); - } else { - document.addEventListener('DOMContentLoaded', () => { - replaceDom(dom); - }); - } + Array.prototype.forEach.call(nodes, (node) => { + node.innerHTML = browser.i18n.getMessage(node.dataset.i18n); + }); } function replaceDom(domTemplate) { - var container = document.getElementsByClassName('container')[0]; + const container = document.getElementsByClassName('container')[0]; - while ( container.firstChild ) { + while (container.firstChild) { container.removeChild(container.firstChild); } container.appendChild(jsonToDOM(domTemplate, document, {})); - var nodes = document.querySelectorAll('[data-i18n]'); - - Array.prototype.forEach.call(nodes, node => { - node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n); - }); + i18n(); - Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach(pin => { - pin.addEventListener('click', event => { + Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach((pin) => { + pin.addEventListener('click', () => { const categoryId = parseInt(pin.dataset.categoryId, 10); - if ( categoryId === pinnedCategory ) { + if (categoryId === pinnedCategory) { pin.className = 'detected__category-pin-wrapper'; pinnedCategory = null; } else { const active = document.querySelector('.detected__category-pin-wrapper--active'); - if ( active ) { + if (active) { active.className = 'detected__category-pin-wrapper'; } @@ -64,7 +54,7 @@ function replaceDom(domTemplate) { pinnedCategory = categoryId; } - ( chrome || browser ).runtime.sendMessage({ + port.postMessage({ id: 'set_option', key: 'pinnedCategory', value: pinnedCategory, @@ -73,118 +63,125 @@ function replaceDom(domTemplate) { }); } +function replaceDomWhenReady(dom) { + if (/complete|interactive|loaded/.test(document.readyState)) { + replaceDom(dom); + } else { + document.addEventListener('DOMContentLoaded', () => { + replaceDom(dom); + }); + } +} + function appsToDomTemplate(response) { - var - appName, confidence, version, categories, - template = []; + let template = []; - if ( response.tabCache && Object.keys(response.tabCache.detected).length > 0 ) { + if (response.tabCache && Object.keys(response.tabCache.detected).length > 0) { const categories = {}; // Group apps by category - for ( appName in response.tabCache.detected ) { - response.apps[appName].cats.forEach(cat => { + for (const appName in response.tabCache.detected) { + response.apps[appName].cats.forEach((cat) => { categories[cat] = categories[cat] || { apps: [] }; categories[cat].apps[appName] = appName; }); } - for ( cat in categories ) { + for (const cat in categories) { const apps = []; - for ( appName in categories[cat].apps ) { - confidence = response.tabCache.detected[appName].confidenceTotal; - version = response.tabCache.detected[appName].version; + for (const appName in categories[cat].apps) { + const { confidence, version } = response.tabCache.detected[appName]; apps.push( [ 'a', { class: 'detected__app', target: '_blank', - href: 'https://www.wappalyzer.com/technologies/' + slugify(appName) + href: `https://www.wappalyzer.com/technologies/${slugify(appName)}`, }, [ 'img', { class: 'detected__app-icon', - src: '../images/icons/' + ( response.apps[appName].icon || 'default.svg' ) + src: `../images/icons/${response.apps[appName].icon || 'default.svg'}`, }, ], [ 'span', { - class: 'detected__app-name' + class: 'detected__app-name', }, appName, ], version ? [ 'span', { - class: 'detected__app-version' + class: 'detected__app-version', }, - version + version, ] : null, confidence < 100 ? [ 'span', { - class: 'detected__app-confidence' + class: 'detected__app-confidence', }, - confidence + '% sure' - ] : null - ] + `${confidence}% sure`, + ] : null, + ], ); } template.push( [ 'div', { - class: 'detected__category' + class: 'detected__category', }, [ 'div', { - class: 'detected__category-name' + class: 'detected__category-name', }, [ 'a', { class: 'detected__category-link', target: '_blank', - href: 'https://www.wappalyzer.com/categories/' + slugify(response.categories[cat].name) + href: `https://www.wappalyzer.com/categories/${slugify(response.categories[cat].name)}`, }, - browser.i18n.getMessage('categoryName' + cat), + browser.i18n.getMessage(`categoryName${cat}`), ], [ 'span', { - class: 'detected__category-pin-wrapper' + ( pinnedCategory == cat ? ' detected__category-pin-wrapper--active' : '' ), + class: `detected__category-pin-wrapper${pinnedCategory == cat ? ' detected__category-pin-wrapper--active' : ''}`, 'data-category-id': cat, - 'title': browser.i18n.getMessage('categoryPin'), + title: browser.i18n.getMessage('categoryPin'), }, [ 'img', { class: 'detected__category-pin detected__category-pin--active', - src: '../images/pin-active.svg' + src: '../images/pin-active.svg', }, ], [ 'img', { class: 'detected__category-pin detected__category-pin--inactive', - src: '../images/pin.svg' - } - ] - ] + src: '../images/pin.svg', + }, + ], + ], ], [ 'div', { - class: 'detected__apps' + class: 'detected__apps', }, - apps - ] - ] + apps, + ], + ], ); } template = [ 'div', { - class: 'detected' + class: 'detected', }, - template + template, ]; } else { template = [ 'div', { - class: 'empty' + class: 'empty', }, [ 'span', { - class: 'empty__text' + class: 'empty__text', }, - browser.i18n.getMessage('noAppsDetected') + browser.i18n.getMessage('noAppsDetected'), ], ]; } @@ -192,6 +189,58 @@ function appsToDomTemplate(response) { return template; } -function slugify(string) { - return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); +async function getApps() { + try { + const tabs = await browser.tabs.query({ + active: true, + currentWindow: true, + }); + + port.postMessage({ + id: 'get_apps', + tab: tabs[0], + }); + } catch (error) { + console.error(error); // eslint-disable-line no-console + } } + +function displayApps(response) { + pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring + termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring + + if (termsAccepted) { + replaceDomWhenReady(appsToDomTemplate(response)); + } else { + i18n(); + + const wrapper = document.querySelector('.terms__wrapper'); + + document.querySelector('.terms__accept').addEventListener('click', () => { + port.postMessage({ + id: 'set_option', + key: 'termsAccepted', + value: true, + }); + + wrapper.classList.remove('terms__wrapper--active'); + + getApps(); + }); + + wrapper.classList.add('terms__wrapper--active'); + } +} + +port.onMessage.addListener((message) => { + switch (message.id) { + case 'get_apps': + displayApps(message.response); + + break; + default: + // Do nothing + } +}); + +getApps(); diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 2f4dff398..81e1cc918 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -1,74 +1,84 @@ { - "name": "Wappalyzer", - "short_name": "Wappalyzer", - "author": "Elbert Alias", - "homepage_url": "https://www.wappalyzer.com", - "description": "Identify web technologies", - "version": "5.4.14", - "default_locale": "en", - "manifest_version": 2, - "icons": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", - "128": "images/icon_128.png" - }, - "page_action": { - "default_icon": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", - "128": "images/icon_128.png" - }, - "default_title": "Wappalyzer", - "default_popup": "html/popup.html" - }, - "background": { - "page": "html/background.html" + "name": "Wappalyzer", + "short_name": "Wappalyzer", + "author": "Elbert Alias", + "homepage_url": "https://www.wappalyzer.com", + "description": "Identify web technologies", + "version": "5.8.3", + "default_locale": "en", + "manifest_version": 2, + "icons": { + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", + "128": "images/icon_128.png" + }, + "page_action": { + "default_icon": { + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", + "128": "images/icon_128.png" + }, + "default_title": "Wappalyzer", + "default_popup": "html/popup.html" + }, + "background": { + "page": "html/background.html" - }, - "content_scripts": [ - { - "matches": [ - "http://*/*", - "https://*/*" - ], - "js": [ - "node_modules/webextension-polyfill/dist/browser-polyfill.js", - "js/content.js" - ], - "run_at": "document_idle" - }, - { - "matches": [ + }, + "content_scripts": [ + { + "matches": [ "http://*/*", - "https://*/*" - ], - "js": [ - "js/iframe.js" - ], - "run_at": "document_start", - "all_frames": true - } - ], - "web_accessible_resources": [ - "js/inject.js" - ], - "options_page": "html/options.html", - "options_ui": { - "page": "html/options.html", - "open_in_tab": false - }, - "permissions": [ + "https://*/*" + ], + "js": [ + "node_modules/webextension-polyfill/dist/browser-polyfill.js", + "js/content.js" + ], + "run_at": "document_idle" + }, + { + "matches": [ + "http://*/*", + "https://*/*" + ], + "exclude_matches": [ + "https://*.modirum.com/*", + "https://www.alphaecommerce.gr/*" + ], + "js": [ + "node_modules/webextension-polyfill/dist/browser-polyfill.js", + "js/lib/iframe.js" + ], + "run_at": "document_start", + "all_frames": true + } + ], + "web_accessible_resources": [ + "js/inject.js" + ], + "options_ui": { + "page": "html/options.html", + "open_in_tab": false + }, + "permissions": [ "cookies", - "storage", - "tabs", - "webRequest", - "webNavigation", - "http://*/*", - "https://*/*" - ], - "content_security_policy": "script-src 'self'; object-src 'self'" + "storage", + "tabs", + "webRequest", + "webNavigation", + "http://*/*", + "https://*/*" + ], + "content_security_policy": "script-src 'self'; object-src 'self'", + "applications": { + "gecko": { + "id": "wappalyzer@crunchlabz.com", + "strict_min_version": "60.0" + } + } } diff --git a/src/drivers/webextension/npm-shrinkwrap.json b/src/drivers/webextension/npm-shrinkwrap.json new file mode 100644 index 000000000..9934b3a1c --- /dev/null +++ b/src/drivers/webextension/npm-shrinkwrap.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "webextension-polyfill": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz", + "integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag==" + } + } +} diff --git a/src/drivers/webextension/package.json b/src/drivers/webextension/package.json index 9b344ae21..837c5acf8 100644 --- a/src/drivers/webextension/package.json +++ b/src/drivers/webextension/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "webextension-polyfill": "^0.2.1" + "webextension-polyfill": "^0.4.0" } } diff --git a/src/icons/1C-Bitrix.png b/src/icons/1C-Bitrix.png index 0d9b16acf..d0236f87f 100644 Binary files a/src/icons/1C-Bitrix.png and b/src/icons/1C-Bitrix.png differ diff --git a/src/icons/1and1.svg b/src/icons/1and1.svg deleted file mode 100644 index 7fc5b1ed7..000000000 --- a/src/icons/1and1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/icons/2z Project.png b/src/icons/2z Project.png deleted file mode 100644 index edc1f21e2..000000000 Binary files a/src/icons/2z Project.png and /dev/null differ diff --git a/src/icons/3DM.png b/src/icons/3DM.png deleted file mode 100644 index f3115c788..000000000 Binary files a/src/icons/3DM.png and /dev/null differ diff --git a/src/icons/3ware.png b/src/icons/3ware.png deleted file mode 100644 index f3115c788..000000000 Binary files a/src/icons/3ware.png and /dev/null differ diff --git a/src/icons/91app.png b/src/icons/91app.png new file mode 100644 index 000000000..3963238b1 Binary files /dev/null and b/src/icons/91app.png differ diff --git a/src/icons/ADPLAN.png b/src/icons/ADPLAN.png new file mode 100644 index 000000000..2252edbb8 Binary files /dev/null and b/src/icons/ADPLAN.png differ diff --git a/src/icons/AMPcms.png b/src/icons/AMPcms.png deleted file mode 100644 index 1d528c84b..000000000 Binary files a/src/icons/AMPcms.png and /dev/null differ diff --git a/src/icons/ATEN.png b/src/icons/ATEN.png deleted file mode 100644 index 512bd415f..000000000 Binary files a/src/icons/ATEN.png and /dev/null differ diff --git a/src/icons/Accessible Portal.png b/src/icons/Accessible Portal.png deleted file mode 100644 index 688c1122e..000000000 Binary files a/src/icons/Accessible Portal.png and /dev/null differ diff --git a/src/icons/Analysys Ark.svg b/src/icons/Analysys Ark.svg new file mode 100644 index 000000000..3e8322823 --- /dev/null +++ b/src/icons/Analysys Ark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/Appcues.svg b/src/icons/Appcues.svg new file mode 100644 index 000000000..20a1a545e --- /dev/null +++ b/src/icons/Appcues.svg @@ -0,0 +1,13 @@ + + + + Group + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/icons/Arc Forum.png b/src/icons/Arc Forum.png deleted file mode 100644 index c01f4e466..000000000 Binary files a/src/icons/Arc Forum.png and /dev/null differ diff --git a/src/icons/Backpack.png b/src/icons/Backpack.png new file mode 100644 index 000000000..5095bf4f2 Binary files /dev/null and b/src/icons/Backpack.png differ diff --git a/src/icons/Bloomreach.png b/src/icons/Bloomreach.png new file mode 100644 index 000000000..25b13e808 Binary files /dev/null and b/src/icons/Bloomreach.png differ diff --git a/src/icons/Bootstrap.png b/src/icons/Bootstrap.png new file mode 100644 index 000000000..44230c442 Binary files /dev/null and b/src/icons/Bootstrap.png differ diff --git a/src/icons/Bootstrap.svg b/src/icons/Bootstrap.svg deleted file mode 100644 index 2ee62447c..000000000 --- a/src/icons/Bootstrap.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/icons/Botble-CMS.png b/src/icons/Botble-CMS.png new file mode 100755 index 000000000..9704f5d7a Binary files /dev/null and b/src/icons/Botble-CMS.png differ diff --git a/src/icons/Brightspot.svg b/src/icons/Brightspot.svg new file mode 100644 index 000000000..2720d780d --- /dev/null +++ b/src/icons/Brightspot.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/icons/Brother.png b/src/icons/Brother.png deleted file mode 100644 index 737a03288..000000000 Binary files a/src/icons/Brother.png and /dev/null differ diff --git a/src/icons/BugSense.png b/src/icons/BugSense.png deleted file mode 100644 index 13eafe257..000000000 Binary files a/src/icons/BugSense.png and /dev/null differ diff --git a/src/icons/C++.png b/src/icons/C++.png deleted file mode 100644 index bfb1f9856..000000000 Binary files a/src/icons/C++.png and /dev/null differ diff --git a/src/icons/CNV.png b/src/icons/CNV.png deleted file mode 100644 index d7e259224..000000000 Binary files a/src/icons/CNV.png and /dev/null differ diff --git a/src/icons/CO2Stats.png b/src/icons/CO2Stats.png deleted file mode 100644 index 47689c3be..000000000 Binary files a/src/icons/CO2Stats.png and /dev/null differ diff --git a/src/icons/CakePHP.png b/src/icons/CakePHP.png index baece763b..a3f838b9b 100644 Binary files a/src/icons/CakePHP.png and b/src/icons/CakePHP.png differ diff --git a/src/icons/Canon.png b/src/icons/Canon.png deleted file mode 100644 index 1f55e03b3..000000000 Binary files a/src/icons/Canon.png and /dev/null differ diff --git a/src/icons/Catwalk.png b/src/icons/Catwalk.png deleted file mode 100644 index 1f55e03b3..000000000 Binary files a/src/icons/Catwalk.png and /dev/null differ diff --git a/src/icons/PHPoole.png b/src/icons/Cecil.png similarity index 100% rename from src/icons/PHPoole.png rename to src/icons/Cecil.png diff --git a/src/icons/CenteHTTPd.png b/src/icons/CenteHTTPd.png deleted file mode 100644 index 4bf3a2707..000000000 Binary files a/src/icons/CenteHTTPd.png and /dev/null differ diff --git a/src/icons/Combeenation.png b/src/icons/Combeenation.png new file mode 100644 index 000000000..86792253e Binary files /dev/null and b/src/icons/Combeenation.png differ diff --git a/src/icons/Contens.png b/src/icons/Contensis.png similarity index 100% rename from src/icons/Contens.png rename to src/icons/Contensis.png diff --git a/src/icons/Countly.png b/src/icons/Countly.png new file mode 100644 index 000000000..ae9d8db96 Binary files /dev/null and b/src/icons/Countly.png differ diff --git a/src/icons/CrossBox.png b/src/icons/CrossBox.png new file mode 100644 index 000000000..c907d010b Binary files /dev/null and b/src/icons/CrossBox.png differ diff --git a/src/icons/DataPower.png b/src/icons/DataPower.png new file mode 100644 index 000000000..0cee484aa Binary files /dev/null and b/src/icons/DataPower.png differ diff --git a/src/icons/David Webbox.png b/src/icons/David Webbox.png deleted file mode 100644 index 16e72fa12..000000000 Binary files a/src/icons/David Webbox.png and /dev/null differ diff --git a/src/icons/Day.js.svg b/src/icons/Day.js.svg new file mode 100644 index 000000000..6ceade70d --- /dev/null +++ b/src/icons/Day.js.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/Dell.svg b/src/icons/Dell.svg deleted file mode 100644 index a6863301c..000000000 --- a/src/icons/Dell.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/icons/Deployd.png b/src/icons/Deployd.png deleted file mode 100644 index f715e47b4..000000000 Binary files a/src/icons/Deployd.png and /dev/null differ diff --git a/src/icons/DerakCloud.png b/src/icons/DerakCloud.png new file mode 100644 index 000000000..377b223f2 Binary files /dev/null and b/src/icons/DerakCloud.png differ diff --git a/src/icons/Docker.svg b/src/icons/Docker.svg new file mode 100644 index 000000000..b8b16676e --- /dev/null +++ b/src/icons/Docker.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/icons/E-Merchant.png b/src/icons/E-Merchant.png deleted file mode 100644 index 6c49851af..000000000 Binary files a/src/icons/E-Merchant.png and /dev/null differ diff --git a/src/icons/ESERV-10.png b/src/icons/ESERV-10.png deleted file mode 100644 index 3e2c434ef..000000000 Binary files a/src/icons/ESERV-10.png and /dev/null differ diff --git a/src/icons/EWS-NIC4.png b/src/icons/EWS-NIC4.png deleted file mode 100644 index 5803d6385..000000000 Binary files a/src/icons/EWS-NIC4.png and /dev/null differ diff --git a/src/icons/EasyEngine.png b/src/icons/EasyEngine.png new file mode 100644 index 000000000..737ecd1b7 Binary files /dev/null and b/src/icons/EasyEngine.png differ diff --git a/src/icons/ElementUI.svg b/src/icons/ElementUI.svg new file mode 100644 index 000000000..4c05f8d2b --- /dev/null +++ b/src/icons/ElementUI.svg @@ -0,0 +1,11 @@ + + + + element-logo + Created with Sketch. + + + + \ No newline at end of file diff --git a/src/icons/Elementor.png b/src/icons/Elementor.png new file mode 100644 index 000000000..87fc23e01 Binary files /dev/null and b/src/icons/Elementor.png differ diff --git a/src/icons/Envoy.png b/src/icons/Envoy.png new file mode 100644 index 000000000..5d69d481c Binary files /dev/null and b/src/icons/Envoy.png differ diff --git a/src/icons/ExagonConcept.svg b/src/icons/ExagonConcept.svg deleted file mode 100644 index baaae65d8..000000000 --- a/src/icons/ExagonConcept.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/icons/F5.png b/src/icons/F5.png new file mode 100644 index 000000000..fba894586 Binary files /dev/null and b/src/icons/F5.png differ diff --git a/src/icons/Fastcommerce.png b/src/icons/Fastcommerce.png new file mode 100644 index 000000000..6ba20a3f3 Binary files /dev/null and b/src/icons/Fastcommerce.png differ diff --git a/src/icons/Fbits.png b/src/icons/Fbits.png new file mode 100644 index 000000000..f5253019e Binary files /dev/null and b/src/icons/Fbits.png differ diff --git a/src/icons/GoJS.png b/src/icons/GoJS.png new file mode 100644 index 000000000..5a91ade54 Binary files /dev/null and b/src/icons/GoJS.png differ diff --git a/src/icons/Google Maps.png b/src/icons/Google Maps.png index 1f90c694b..ecf471ef0 100644 Binary files a/src/icons/Google Maps.png and b/src/icons/Google Maps.png differ diff --git a/src/icons/Google Search Appliance.png b/src/icons/Google Search Appliance.png deleted file mode 100644 index 71bb47077..000000000 Binary files a/src/icons/Google Search Appliance.png and /dev/null differ diff --git a/src/icons/Google Sites.png b/src/icons/Google Sites.png index 6f74a7a75..3bcb4f4cc 100644 Binary files a/src/icons/Google Sites.png and b/src/icons/Google Sites.png differ diff --git a/src/icons/Grandstream.png b/src/icons/Grandstream.png deleted file mode 100644 index a347c58c9..000000000 Binary files a/src/icons/Grandstream.png and /dev/null differ diff --git a/src/icons/Gravity Insights.png b/src/icons/Gravity Insights.png deleted file mode 100644 index 57aeabc13..000000000 Binary files a/src/icons/Gravity Insights.png and /dev/null differ diff --git a/src/icons/Gridsome.svg b/src/icons/Gridsome.svg new file mode 100644 index 000000000..8fa8b0d89 --- /dev/null +++ b/src/icons/Gridsome.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/GrowingIO.png b/src/icons/GrowingIO.png new file mode 100644 index 000000000..c96be59fc Binary files /dev/null and b/src/icons/GrowingIO.png differ diff --git a/src/icons/Halo.svg b/src/icons/Halo.svg new file mode 100644 index 000000000..cce2a59db --- /dev/null +++ b/src/icons/Halo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/src/icons/Hippo.png b/src/icons/Hippo.png deleted file mode 100644 index 3b2b5adbd..000000000 Binary files a/src/icons/Hippo.png and /dev/null differ diff --git a/src/icons/Instabot.png b/src/icons/Instabot.png new file mode 100644 index 000000000..3b49095d3 Binary files /dev/null and b/src/icons/Instabot.png differ diff --git a/src/icons/Ionicons.png b/src/icons/Ionicons.png index ace620764..67497c434 100644 Binary files a/src/icons/Ionicons.png and b/src/icons/Ionicons.png differ diff --git a/src/icons/JC-HTTPD.png b/src/icons/JC-HTTPD.png deleted file mode 100644 index 1f55e03b3..000000000 Binary files a/src/icons/JC-HTTPD.png and /dev/null differ diff --git a/src/icons/KS_HTTP.png b/src/icons/KS_HTTP.png deleted file mode 100644 index 1f55e03b3..000000000 Binary files a/src/icons/KS_HTTP.png and /dev/null differ diff --git a/src/icons/Klarna.svg b/src/icons/Klarna.svg index 0bb061c85..56524058c 100644 --- a/src/icons/Klarna.svg +++ b/src/icons/Klarna.svg @@ -1 +1,15 @@ -klarna \ No newline at end of file + + + + + + + + + + + diff --git a/src/icons/Kubernetes.svg b/src/icons/Kubernetes.svg new file mode 100644 index 000000000..bedd3b88e --- /dev/null +++ b/src/icons/Kubernetes.svg @@ -0,0 +1,84 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/icons/LOU.png b/src/icons/LOU.png new file mode 100644 index 000000000..c2836cab4 Binary files /dev/null and b/src/icons/LOU.png differ diff --git a/src/icons/LocalFocus.png b/src/icons/LocalFocus.png new file mode 100644 index 000000000..0571a349b Binary files /dev/null and b/src/icons/LocalFocus.png differ diff --git a/src/icons/MOBOTIX.png b/src/icons/MOBOTIX.png deleted file mode 100644 index a4574629c..000000000 Binary files a/src/icons/MOBOTIX.png and /dev/null differ diff --git a/src/icons/MakeShopKorea.png b/src/icons/MakeShopKorea.png new file mode 100644 index 000000000..5cf20bd0a Binary files /dev/null and b/src/icons/MakeShopKorea.png differ diff --git a/src/icons/Medium.svg b/src/icons/Medium.svg old mode 100644 new mode 100755 index afaa40a70..c8b251dde --- a/src/icons/Medium.svg +++ b/src/icons/Medium.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + Monogram + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/icons/Microsoft.png b/src/icons/Microsoft.png new file mode 100644 index 000000000..d6c37c10f Binary files /dev/null and b/src/icons/Microsoft.png differ diff --git a/src/icons/Microsoft.svg b/src/icons/Microsoft.svg deleted file mode 100644 index ecb0ac592..000000000 --- a/src/icons/Microsoft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/icons/Mithril.svg b/src/icons/Mithril.svg new file mode 100644 index 000000000..04cb102f1 --- /dev/null +++ b/src/icons/Mithril.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/icons/Moxa.png b/src/icons/Moxa.png deleted file mode 100644 index 03a2e6f93..000000000 Binary files a/src/icons/Moxa.png and /dev/null differ diff --git a/src/icons/NOIX.png b/src/icons/NOIX.png deleted file mode 100644 index ae6f9fee6..000000000 Binary files a/src/icons/NOIX.png and /dev/null differ diff --git a/src/icons/Netmonitor.png b/src/icons/Netmonitor.png deleted file mode 100644 index 45da0d733..000000000 Binary files a/src/icons/Netmonitor.png and /dev/null differ diff --git a/src/icons/Nuxt.js.svg b/src/icons/Nuxt.js.svg new file mode 100644 index 000000000..cc279743f --- /dev/null +++ b/src/icons/Nuxt.js.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/icons/OmniTouch 8660 My Teamwork.png b/src/icons/OmniTouch 8660 My Teamwork.png deleted file mode 100644 index 012c09d7d..000000000 Binary files a/src/icons/OmniTouch 8660 My Teamwork.png and /dev/null differ diff --git a/src/icons/PHP-Fusion.png b/src/icons/PHP-Fusion.png index 0ccdba169..59aa99d6d 100644 Binary files a/src/icons/PHP-Fusion.png and b/src/icons/PHP-Fusion.png differ diff --git a/src/icons/Parcel.png b/src/icons/Parcel.png new file mode 100644 index 000000000..f3028060f Binary files /dev/null and b/src/icons/Parcel.png differ diff --git a/src/icons/Pendo.svg b/src/icons/Pendo.svg new file mode 100644 index 000000000..fe7d070c0 --- /dev/null +++ b/src/icons/Pendo.svg @@ -0,0 +1,16 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + diff --git a/src/icons/PerfSONAR-PS.png b/src/icons/PerfSONAR-PS.png deleted file mode 100644 index f5e1402ff..000000000 Binary files a/src/icons/PerfSONAR-PS.png and /dev/null differ diff --git a/src/icons/PhotoShelter.png b/src/icons/PhotoShelter.png new file mode 100644 index 000000000..b8d282d2e Binary files /dev/null and b/src/icons/PhotoShelter.png differ diff --git a/src/icons/Pingoteam.svg b/src/icons/Pingoteam.svg new file mode 100644 index 000000000..9bb795276 --- /dev/null +++ b/src/icons/Pingoteam.svg @@ -0,0 +1 @@ +Pingoteam \ No newline at end of file diff --git a/src/icons/PlatformOS.svg b/src/icons/PlatformOS.svg new file mode 100644 index 000000000..d0f4281e2 --- /dev/null +++ b/src/icons/PlatformOS.svg @@ -0,0 +1 @@ + diff --git a/src/icons/Plura.png b/src/icons/Plura.png deleted file mode 100644 index de3113639..000000000 Binary files a/src/icons/Plura.png and /dev/null differ diff --git a/src/icons/Prospector.png b/src/icons/Prospector.png deleted file mode 100644 index 2a694ae38..000000000 Binary files a/src/icons/Prospector.png and /dev/null differ diff --git a/src/icons/Public CMS.png b/src/icons/Public CMS.png index 9a8e084ed..e5e51c364 100644 Binary files a/src/icons/Public CMS.png and b/src/icons/Public CMS.png differ diff --git a/src/icons/RXWeb.svg b/src/icons/RXWeb.svg new file mode 100644 index 000000000..030f86794 --- /dev/null +++ b/src/icons/RXWeb.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/icons/RakutenDigitalCommerce.png b/src/icons/RakutenDigitalCommerce.png new file mode 100644 index 000000000..8784b5b3c Binary files /dev/null and b/src/icons/RakutenDigitalCommerce.png differ diff --git a/src/icons/Rocket.svg b/src/icons/Rocket.svg new file mode 100644 index 000000000..feadcf82b --- /dev/null +++ b/src/icons/Rocket.svg @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/src/icons/SPIP.png b/src/icons/SPIP.png deleted file mode 100644 index 6054c483d..000000000 Binary files a/src/icons/SPIP.png and /dev/null differ diff --git a/src/icons/Sensors Data.svg b/src/icons/Sensors Data.svg new file mode 100644 index 000000000..7250e013c --- /dev/null +++ b/src/icons/Sensors Data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/Sentinel.png b/src/icons/Sentinel.png deleted file mode 100644 index 9fa007fc2..000000000 Binary files a/src/icons/Sentinel.png and /dev/null differ diff --git a/src/icons/Sentry.svg b/src/icons/Sentry.svg new file mode 100644 index 000000000..53b613be4 --- /dev/null +++ b/src/icons/Sentry.svg @@ -0,0 +1 @@ +sentry-glyph-black \ No newline at end of file diff --git a/src/icons/Shiny.png b/src/icons/Shiny.png new file mode 100644 index 000000000..612d350d3 Binary files /dev/null and b/src/icons/Shiny.png differ diff --git a/src/icons/Shopalize.png b/src/icons/Shopalize.png deleted file mode 100644 index c73389954..000000000 Binary files a/src/icons/Shopalize.png and /dev/null differ diff --git a/src/icons/Shoperfa.png b/src/icons/Shoperfa.png new file mode 100644 index 000000000..b6bc62af8 Binary files /dev/null and b/src/icons/Shoperfa.png differ diff --git a/src/icons/Strapi.png b/src/icons/Strapi.png new file mode 100644 index 000000000..065887ab7 Binary files /dev/null and b/src/icons/Strapi.png differ diff --git a/src/icons/Svelte.svg b/src/icons/Svelte.svg new file mode 100644 index 000000000..4bf279659 --- /dev/null +++ b/src/icons/Svelte.svg @@ -0,0 +1,20 @@ + + + + + + + diff --git a/src/icons/Tsoft.png b/src/icons/Tsoft.png deleted file mode 100644 index 04cc84c96..000000000 Binary files a/src/icons/Tsoft.png and /dev/null differ diff --git a/src/icons/UserEngage.png b/src/icons/UserEngage.png deleted file mode 100644 index 49f2d16af..000000000 Binary files a/src/icons/UserEngage.png and /dev/null differ diff --git a/src/icons/UserGuiding.svg b/src/icons/UserGuiding.svg new file mode 100644 index 000000000..f01fa5fbc --- /dev/null +++ b/src/icons/UserGuiding.svg @@ -0,0 +1,42 @@ + + + + + UserGuiding .svg logo icon + + + + + diff --git a/src/icons/VTEX Enterprise.png b/src/icons/VTEX Enterprise.png deleted file mode 100644 index 767831811..000000000 Binary files a/src/icons/VTEX Enterprise.png and /dev/null differ diff --git a/src/icons/VTEX.svg b/src/icons/VTEX.svg new file mode 100644 index 000000000..08a6671cf --- /dev/null +++ b/src/icons/VTEX.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/Virgool.svg b/src/icons/Virgool.svg new file mode 100644 index 000000000..40367e96c --- /dev/null +++ b/src/icons/Virgool.svg @@ -0,0 +1,14 @@ + + + Group 2 + Created with Sketch. + + + + + + + + + + diff --git a/src/icons/Volusion.png b/src/icons/Volusion.png deleted file mode 100644 index 20e6d109a..000000000 Binary files a/src/icons/Volusion.png and /dev/null differ diff --git a/src/icons/Volusion.svg b/src/icons/Volusion.svg new file mode 100644 index 000000000..34dd13831 --- /dev/null +++ b/src/icons/Volusion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/WP-Statistics.png b/src/icons/WP-Statistics.png new file mode 100644 index 000000000..22d1c580f Binary files /dev/null and b/src/icons/WP-Statistics.png differ diff --git a/src/icons/Web Optimizer.png b/src/icons/Web Optimizer.png deleted file mode 100644 index 64fe47fae..000000000 Binary files a/src/icons/Web Optimizer.png and /dev/null differ diff --git a/src/icons/WebsiteCreator.png b/src/icons/WebsiteCreator.png new file mode 100644 index 000000000..3c25e14aa Binary files /dev/null and b/src/icons/WebsiteCreator.png differ diff --git a/src/icons/Webzi.svg b/src/icons/Webzi.svg new file mode 100644 index 000000000..fe3ed90d6 --- /dev/null +++ b/src/icons/Webzi.svg @@ -0,0 +1,18 @@ + + + + + logo + + + + + + + + + diff --git a/src/icons/Weglot.png b/src/icons/Weglot.png new file mode 100644 index 000000000..33da33a8a Binary files /dev/null and b/src/icons/Weglot.png differ diff --git a/src/icons/Wikispaces.png b/src/icons/Wikispaces.png deleted file mode 100644 index 91034ccf2..000000000 Binary files a/src/icons/Wikispaces.png and /dev/null differ diff --git a/src/icons/WindowsServer.png b/src/icons/WindowsServer.png new file mode 100644 index 000000000..31f92d9e8 Binary files /dev/null and b/src/icons/WindowsServer.png differ diff --git a/src/icons/Zipkin.png b/src/icons/Zipkin.png new file mode 100644 index 000000000..e783a2ca1 Binary files /dev/null and b/src/icons/Zipkin.png differ diff --git a/src/icons/adobedmt.png b/src/icons/adobedmt.png new file mode 100644 index 000000000..0a74d4d36 Binary files /dev/null and b/src/icons/adobedmt.png differ diff --git a/src/icons/all-in-One-SEO-Pack.png b/src/icons/all-in-One-SEO-Pack.png new file mode 100644 index 000000000..16afdfa1b Binary files /dev/null and b/src/icons/all-in-One-SEO-Pack.png differ diff --git a/src/icons/apigee.svg b/src/icons/apigee.svg new file mode 100644 index 000000000..6c535462c --- /dev/null +++ b/src/icons/apigee.svg @@ -0,0 +1,24 @@ + + + + diff --git a/src/icons/aws-elb.png b/src/icons/aws-elb.png new file mode 100644 index 000000000..8db611796 Binary files /dev/null and b/src/icons/aws-elb.png differ diff --git a/src/icons/aws.svg b/src/icons/aws.svg new file mode 100644 index 000000000..48209aef8 --- /dev/null +++ b/src/icons/aws.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/azure.svg b/src/icons/azure.svg new file mode 100644 index 000000000..2ff63c104 --- /dev/null +++ b/src/icons/azure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/bigbangshop.svg b/src/icons/bigbangshop.svg new file mode 100644 index 000000000..cfbeefd7b --- /dev/null +++ b/src/icons/bigbangshop.svg @@ -0,0 +1 @@ +logo_bbs diff --git a/src/icons/bubble.png b/src/icons/bubble.png index 16ec01d91..a5d9479eb 100644 Binary files a/src/icons/bubble.png and b/src/icons/bubble.png differ diff --git a/src/icons/chevereto.png b/src/icons/chevereto.png new file mode 100644 index 000000000..81e189814 Binary files /dev/null and b/src/icons/chevereto.png differ diff --git a/src/icons/clarity.svg b/src/icons/clarity.svg new file mode 100644 index 000000000..29f217c2d --- /dev/null +++ b/src/icons/clarity.svg @@ -0,0 +1,17 @@ + + + + logo + Created with Sketch. + + + + + diff --git a/src/icons/coaster-cms.png b/src/icons/coaster-cms.png new file mode 100644 index 000000000..9ec4dcf1a Binary files /dev/null and b/src/icons/coaster-cms.png differ diff --git a/src/icons/colormeshop.png b/src/icons/colormeshop.png new file mode 100644 index 000000000..af70496d8 Binary files /dev/null and b/src/icons/colormeshop.png differ diff --git a/src/icons/datadome.png b/src/icons/datadome.png new file mode 100644 index 000000000..9c19fb1d7 Binary files /dev/null and b/src/icons/datadome.png differ diff --git a/src/icons/eCommercePy.png b/src/icons/eCommercePy.png deleted file mode 100644 index ae9d304fb..000000000 Binary files a/src/icons/eCommercePy.png and /dev/null differ diff --git a/src/icons/eDevice SmartStack.png b/src/icons/eDevice SmartStack.png deleted file mode 100644 index efb8bac3f..000000000 Binary files a/src/icons/eDevice SmartStack.png and /dev/null differ diff --git a/src/icons/ensighten.png b/src/icons/ensighten.png new file mode 100644 index 000000000..935be0caa Binary files /dev/null and b/src/icons/ensighten.png differ diff --git a/src/icons/flarum.png b/src/icons/flarum.png new file mode 100644 index 000000000..fc3840330 Binary files /dev/null and b/src/icons/flarum.png differ diff --git a/src/icons/freshchat.png b/src/icons/freshchat.png new file mode 100644 index 000000000..b79a05767 Binary files /dev/null and b/src/icons/freshchat.png differ diff --git a/src/icons/futureshop.png b/src/icons/futureshop.png new file mode 100644 index 000000000..da3bdf84b Binary files /dev/null and b/src/icons/futureshop.png differ diff --git a/src/icons/genexus.png b/src/icons/genexus.png deleted file mode 100644 index b4525d4cf..000000000 Binary files a/src/icons/genexus.png and /dev/null differ diff --git a/src/icons/google_cloud.svg b/src/icons/google_cloud.svg new file mode 100644 index 000000000..37faf439a --- /dev/null +++ b/src/icons/google_cloud.svg @@ -0,0 +1 @@ +Cloud_Logo_Nav diff --git a/src/icons/iEXExchanger.png b/src/icons/iEXExchanger.png new file mode 100644 index 000000000..c237a2513 Binary files /dev/null and b/src/icons/iEXExchanger.png differ diff --git a/src/icons/idosellshop.png b/src/icons/idosellshop.png new file mode 100644 index 000000000..f7e921195 Binary files /dev/null and b/src/icons/idosellshop.png differ diff --git a/src/icons/ionic.png b/src/icons/ionic.png new file mode 100644 index 000000000..f1b7f2ec5 Binary files /dev/null and b/src/icons/ionic.png differ diff --git a/src/icons/kestrel.svg b/src/icons/kestrel.svg new file mode 100644 index 000000000..43a66f8c8 --- /dev/null +++ b/src/icons/kestrel.svg @@ -0,0 +1 @@ +logo_NETcore \ No newline at end of file diff --git a/src/icons/mariadb.svg b/src/icons/mariadb.svg new file mode 100644 index 000000000..119938104 --- /dev/null +++ b/src/icons/mariadb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/icons/pantheon.svg b/src/icons/pantheon.svg new file mode 100644 index 000000000..baf01b5f8 --- /dev/null +++ b/src/icons/pantheon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/icons/percona.svg b/src/icons/percona.svg new file mode 100644 index 000000000..383ae281d --- /dev/null +++ b/src/icons/percona.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/icons/platformsh.svg b/src/icons/platformsh.svg new file mode 100644 index 000000000..2491fb8c3 --- /dev/null +++ b/src/icons/platformsh.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/icons/polyfill.svg b/src/icons/polyfill.svg new file mode 100644 index 000000000..cfa655abb --- /dev/null +++ b/src/icons/polyfill.svg @@ -0,0 +1,6 @@ + diff --git a/src/icons/projesoft.png b/src/icons/projesoft.png new file mode 100644 index 000000000..77b9293da Binary files /dev/null and b/src/icons/projesoft.png differ diff --git a/src/icons/scrollreveal.svg b/src/icons/scrollreveal.svg new file mode 100644 index 000000000..8e0dd8e82 --- /dev/null +++ b/src/icons/scrollreveal.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/icons/shopline.png b/src/icons/shopline.png new file mode 100644 index 000000000..ebdb09d14 Binary files /dev/null and b/src/icons/shopline.png differ diff --git a/src/icons/signal.png b/src/icons/signal.png new file mode 100644 index 000000000..56ac41aa5 Binary files /dev/null and b/src/icons/signal.png differ diff --git a/src/icons/softtr.png b/src/icons/softtr.png new file mode 100644 index 000000000..65637e777 Binary files /dev/null and b/src/icons/softtr.png differ diff --git a/src/icons/spip.svg b/src/icons/spip.svg new file mode 100644 index 000000000..6650df09c --- /dev/null +++ b/src/icons/spip.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/sucuri.png b/src/icons/sucuri.png new file mode 100644 index 000000000..ec4be30a3 Binary files /dev/null and b/src/icons/sucuri.png differ diff --git a/src/icons/sympa.png b/src/icons/sympa.png new file mode 100644 index 000000000..288e92224 Binary files /dev/null and b/src/icons/sympa.png differ diff --git a/src/icons/syncfusion.svg b/src/icons/syncfusion.svg new file mode 100644 index 000000000..a40170983 --- /dev/null +++ b/src/icons/syncfusion.svg @@ -0,0 +1,19 @@ + + + + Syncfusion Logo + Created with Sketch. + + \ No newline at end of file diff --git a/src/icons/tailwindcss.svg b/src/icons/tailwindcss.svg new file mode 100644 index 000000000..5b0424030 --- /dev/null +++ b/src/icons/tailwindcss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/tessitura.svg b/src/icons/tessitura.svg new file mode 100644 index 000000000..96be0cdc1 --- /dev/null +++ b/src/icons/tessitura.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/icons/tray.png b/src/icons/tray.png new file mode 100644 index 000000000..66d510765 Binary files /dev/null and b/src/icons/tray.png differ diff --git a/src/icons/user.com.svg b/src/icons/user.com.svg new file mode 100644 index 000000000..b6defbe05 --- /dev/null +++ b/src/icons/user.com.svg @@ -0,0 +1,9 @@ + + + + logo wap + Created with Sketch. + + + + \ No newline at end of file diff --git a/src/icons/webdev.png b/src/icons/webdev.png new file mode 100644 index 000000000..a37ce3ec8 Binary files /dev/null and b/src/icons/webdev.png differ diff --git a/src/icons/websocket.png b/src/icons/websocket.png new file mode 100644 index 000000000..7d94f1073 Binary files /dev/null and b/src/icons/websocket.png differ diff --git a/src/icons/wisyCMS.svg b/src/icons/wisyCMS.svg new file mode 100644 index 000000000..8063affdc --- /dev/null +++ b/src/icons/wisyCMS.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/src/icons/wpCache.png b/src/icons/wpCache.png index 7f24b9d35..85ef209d9 100644 Binary files a/src/icons/wpCache.png and b/src/icons/wpCache.png differ diff --git a/src/icons/wpengine.svg b/src/icons/wpengine.svg new file mode 100644 index 000000000..d759de179 --- /dev/null +++ b/src/icons/wpengine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/yepcomm.png b/src/icons/yepcomm.png new file mode 100644 index 000000000..4b987b382 Binary files /dev/null and b/src/icons/yepcomm.png differ diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 1a4e1137b..7a2c3e368 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -6,13 +6,117 @@ * License: GPLv3 http://www.gnu.org/licenses/gpl-3.0.txt */ -'use strict'; - const validation = { hostname: /(www.)?((.+?)\.(([a-z]{2,3}\.)?[a-z]{2,6}))$/, - hostnameBlacklist: /((local|dev(elopment)?|stag(e|ing)?|test(ing)?|demo(shop)?|admin|google|cache)\.|\/admin|\.local)/ + hostnameBlacklist: /((local|dev(elopment)?|stag(e|ing)?|test(ing)?|demo(shop)?|admin|google|cache)\.|\/admin|\.local)/, }; +/** + * Enclose string in array + */ +function asArray(value) { + return value instanceof Array ? value : [value]; +} + +/** + * + */ +function asyncForEach(iterable, iterator) { + return Promise.all((iterable || []) + .map(item => new Promise(resolve => setTimeout(() => resolve(iterator(item)), 1)))); +} + +/** + * Mark application as detected, set confidence and version + */ +function addDetected(app, pattern, type, value, key) { + app.detected = true; + + // Set confidence level + app.confidence[`${type} ${key ? `${key} ` : ''}${pattern.regex}`] = pattern.confidence === undefined ? 100 : parseInt(pattern.confidence, 10); + + // Detect version number + if (pattern.version) { + const versions = []; + const matches = pattern.regex.exec(value); + + let { version } = pattern; + + if (matches) { + matches.forEach((match, i) => { + // Parse ternary operator + const ternary = new RegExp(`\\\\${i}\\?([^:]+):(.*)$`).exec(version); + + if (ternary && ternary.length === 3) { + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + } + + // Replace back references + version = version.trim().replace(new RegExp(`\\\\${i}`, 'g'), match || ''); + }); + + if (version && versions.indexOf(version) === -1) { + versions.push(version); + } + + if (versions.length) { + // Use the longest detected version number + app.version = versions.reduce((a, b) => (a.length > b.length ? a : b)); + } + } + } +} + +function resolveExcludes(apps, detected) { + const excludes = []; + const detectedApps = Object.assign({}, apps, detected); + + // Exclude app in detected apps only + Object.keys(detectedApps).forEach((appName) => { + const app = detectedApps[appName]; + + if (app.props.excludes) { + asArray(app.props.excludes).forEach((excluded) => { + excludes.push(excluded); + }); + } + }); + + // Remove excluded applications + Object.keys(apps).forEach((appName) => { + if (excludes.indexOf(appName) > -1) { + delete apps[appName]; + } + }); +} + +class Application { + constructor(name, props, detected) { + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.excludes = []; + this.name = name; + this.props = props; + this.version = ''; + } + + /** + * Calculate confidence total + */ + getConfidence() { + let total = 0; + + Object.keys(this.confidence).forEach((id) => { + total += this.confidence[id]; + }); + + this.confidenceTotal = Math.min(total, 100); + + return this.confidenceTotal; + } +} + class Wappalyzer { constructor() { this.apps = {}; @@ -34,99 +138,117 @@ class Wappalyzer { * Log messages to console */ log(message, source, type) { - this.driver.log(message, source || '', type || 'debug'); - } - - asyncForEach(iterable, iterator) { - return Promise.all(( iterable || [] ).map(item => new Promise(resolve => setTimeout(() => resolve(iterator(item)), 1)))); + if (this.driver.log) { + this.driver.log(message, source || '', type || 'debug'); + } } analyze(url, data, context) { - const startTime = new Date(); - + const apps = {}; const promises = []; + const startTime = new Date(); + const { + scripts, + cookies, + headers, + js, + } = data; - var apps = {}; + let { html } = data; - if ( this.detected[url.canonical] === undefined ) { + if (this.detected[url.canonical] === undefined) { this.detected[url.canonical] = {}; } + const metaTags = []; + // Additional information - var language = null; + let language = null; - if ( data.html ) { - if ( typeof data.html !== 'string' ) { - data.html = ''; + if (html) { + if (typeof html !== 'string') { + html = ''; } - const matches = data.html.match(/]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); + let matches = data.html.match(new RegExp(']*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"', 'i')); language = matches && matches.length ? matches[1] : null; - } - Object.keys(this.apps).forEach(appName => { - apps[appName] = this.detected[url.canonical] && this.detected[url.canonical][appName] ? this.detected[url.canonical][appName] : new Application(appName, this.apps[appName]); + // Meta tags + const regex = /]+>/ig; + + do { + matches = regex.exec(html); - var app = apps[appName]; + if (!matches) { + break; + } - this.analyzeUrl(app, url); + metaTags.push(matches[0]); + } while (matches); + } - if ( data.html ) { - promises.push(this.analyzeHtml(app, data.html)); - promises.push(this.analyzeMeta(app, data.html)); - } + Object.keys(this.apps).forEach((appName) => { + apps[appName] = this.detected[url.canonical] && this.detected[url.canonical][appName] + ? this.detected[url.canonical][appName] + : new Application(appName, this.apps[appName]); - if ( data.scripts ) { - promises.push(this.analyzeScripts(app, data.scripts)); + const app = apps[appName]; + + promises.push(this.analyzeUrl(app, url)); + + if (html) { + promises.push(this.analyzeHtml(app, html)); + promises.push(this.analyzeMeta(app, metaTags)); } - if ( data.cookies ) { - promises.push(this.analyzeCookies(app, data.cookies)); + if (scripts) { + promises.push(this.analyzeScripts(app, scripts)); } - if ( data.headers ) { - promises.push(this.analyzeHeaders(app, data.headers)); + if (cookies) { + promises.push(this.analyzeCookies(app, cookies)); } - if ( data.env ) { - promises.push(this.analyzeEnv(app, data.env)); + if (headers) { + promises.push(this.analyzeHeaders(app, headers)); } }); - if ( data.js ) { - Object.keys(data.js).forEach(appName => { - promises.push(this.analyzeJs(apps[appName], data.js[appName])); + if (js) { + Object.keys(js).forEach((appName) => { + if (typeof js[appName] !== 'function') { + promises.push(this.analyzeJs(apps[appName], js[appName])); + } }); } - return new Promise(resolve => { - Promise.all(promises) - .then(() => { - Object.keys(apps).forEach(appName => { - var app = apps[appName]; + return new Promise(async (resolve) => { + await Promise.all(promises); - if ( !app.detected || !app.getConfidence() ) { - delete apps[app.name]; - } - }); + Object.keys(apps).forEach((appName) => { + const app = apps[appName]; - this.resolveExcludes(apps); - this.resolveImplies(apps, url.canonical); + if (!app.detected || !app.getConfidence()) { + delete apps[app.name]; + } + }); - this.cacheDetectedApps(apps, url.canonical); - this.trackDetectedApps(apps, url, language); + resolveExcludes(apps, this.detected[url]); + this.resolveImplies(apps, url.canonical); - this.log('Processing ' + Object.keys(data).join(', ') + ' took ' + (( new Date() - startTime ) / 1000).toFixed(2) + 's (' + url.hostname + ')', 'core'); + this.cacheDetectedApps(apps, url.canonical); + this.trackDetectedApps(apps, url, language); - if ( Object.keys(apps).length ) { - this.log('Identified ' + Object.keys(apps).join(', ') + ' (' + url.hostname + ')', 'core'); - } + this.log(`Processing ${Object.keys(data).join(', ')} took ${((new Date() - startTime) / 1000).toFixed(2)}s (${url.hostname})`, 'core'); - this.driver.displayApps(this.detected[url.canonical], { language }, context); + if (Object.keys(apps).length) { + this.log(`Identified ${Object.keys(apps).join(', ')} (${url.hostname})`, 'core'); + } - resolve(); - }); + this.driver.displayApps(this.detected[url.canonical], { language }, context); + + return resolve(); }); } @@ -141,33 +263,32 @@ class Wappalyzer { * */ robotsTxtAllows(url) { - return new Promise((resolve, reject) => { - var parsed = this.parseUrl(url); + return new Promise(async (resolve, reject) => { + const parsed = this.parseUrl(url); - if ( parsed.protocol !== 'http:' && parsed.protocol !== 'https:' ) { + if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { return reject(); } - this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') - .then(robotsTxt => { - if ( robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0) ) { - return reject(); - } + const robotsTxt = await this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:'); + + if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) { + return reject(); + } - return resolve(); - }, () => resolve()); + return resolve(); }); - }; + } /** * Parse a URL */ parseUrl(url) { - var a = this.driver.document.createElement('a'); + const a = this.driver.document.createElement('a'); a.href = url; - a.canonical = a.protocol + '//' + a.host + a.pathname; + a.canonical = `${a.protocol}//${a.host}${a.pathname}`; return a; } @@ -175,22 +296,21 @@ class Wappalyzer { /** * */ - parseRobotsTxt(robotsTxt) { - var userAgent; - var disallow = []; + static parseRobotsTxt(robotsTxt) { + const disallow = []; + + let userAgent; - robotsTxt.split('\n').forEach(line => { - var matches = /^User-agent:\s*(.+)$/i.exec(line); + robotsTxt.split('\n').forEach((line) => { + let matches = /^User-agent:\s*(.+)$/i.exec(line.trim()); - if ( matches ) { + if (matches) { userAgent = matches[1].toLowerCase(); - } else { - if ( userAgent === '*' || userAgent === 'wappalyzer' ) { - matches = /^Disallow:\s*(.+)$/i.exec(line); + } else if (userAgent === '*' || userAgent === 'wappalyzer') { + matches = /^Disallow:\s*(.+)$/i.exec(line.trim()); - if ( matches ) { - disallow.push(matches[1]); - } + if (matches) { + disallow.push(matches[1]); } } }); @@ -202,50 +322,48 @@ class Wappalyzer { * */ ping() { - if ( Object.keys(this.hostnameCache).length + this.adCache.length > 50 ) { - this.driver.ping(this.hostnameCache, this.adCache); + if (Object.keys(this.hostnameCache).length > 100) { + this.driver.ping(this.hostnameCache); this.hostnameCache = {}; - this.adCache = []; } - } - /** - * Enclose string in array - */ - asArray(value) { - return value instanceof Array ? value : [ value ]; + if (this.adCache.length > 50) { + this.driver.ping({}, this.adCache); + + this.adCache = []; + } } /** * Parse apps.json patterns */ parsePatterns(patterns) { - if ( !patterns ) { + if (!patterns) { return []; } - var parsed = {}; + let parsed = {}; // Convert string to object containing array containing string - if ( typeof patterns === 'string' || patterns instanceof Array ) { + if (typeof patterns === 'string' || patterns instanceof Array) { patterns = { - main: this.asArray(patterns) + main: asArray(patterns), }; } - Object.keys(patterns).forEach(key => { + Object.keys(patterns).forEach((key) => { parsed[key] = []; - this.asArray(patterns[key]).forEach(pattern => { - var attrs = {}; + asArray(patterns[key]).forEach((pattern) => { + const attrs = {}; pattern.split('\\;').forEach((attr, i) => { - if ( i ) { + if (i) { // Key value pairs attr = attr.split(':'); - if ( attr.length > 1 ) { + if (attr.length > 1) { attrs[attr.shift()] = attr.join(':'); } } else { @@ -253,10 +371,10 @@ class Wappalyzer { try { attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression - } catch (e) { + } catch (error) { attrs.regex = new RegExp(); - this.log(e + ': ' + attr, 'error', 'core'); + this.log(`${error.message}: ${attr}`, 'error', 'core'); } } }); @@ -266,7 +384,7 @@ class Wappalyzer { }); // Convert back to array if the original pattern list was an array (or string) - if ( 'main' in parsed ) { + if ('main' in parsed) { parsed = parsed.main; } @@ -277,69 +395,51 @@ class Wappalyzer { * Parse JavaScript patterns */ parseJsPatterns() { - Object.keys(this.apps).forEach(appName => { - if ( this.apps[appName].js ) { + Object.keys(this.apps).forEach((appName) => { + if (this.apps[appName].js) { this.jsPatterns[appName] = this.parsePatterns(this.apps[appName].js); } }); } - resolveExcludes(apps) { - var excludes = []; - - // Exclude app in detected apps only - Object.keys(apps).forEach(appName => { - var app = apps[appName]; - - if ( app.props.excludes ) { - this.asArray(app.props.excludes).forEach(excluded => { - excludes.push(excluded); - }); - } - }) - - // Remove excluded applications - Object.keys(apps).forEach(appName => { - if ( excludes.indexOf(appName) !== -1 ) { - delete apps[appName]; - } - }) - } - resolveImplies(apps, url) { - var checkImplies = true; - - // Implied applications - // Run several passes as implied apps may imply other apps - while ( checkImplies ) { - checkImplies = false; + let checkImplies = true; - Object.keys(apps).forEach(appName => { - var app = apps[appName]; + const resolve = (appName) => { + const app = apps[appName]; - if ( app && app.props.implies ) { - this.asArray(app.props.implies).forEach(implied => { - implied = this.parsePatterns(implied)[0]; + if (app && app.props.implies) { + asArray(app.props.implies).forEach((implied) => { + [implied] = this.parsePatterns(implied); - if ( !this.apps[implied.string] ) { - this.log('Implied application ' + implied.string + ' does not exist', 'core', 'warn'); + if (!this.apps[implied.string]) { + this.log(`Implied application ${implied.string} does not exist`, 'core', 'warn'); - return; - } + return; + } - if ( !( implied.string in apps ) ) { - apps[implied.string] = this.detected[url] && this.detected[url][implied.string] ? this.detected[url][implied.string] : new Application(implied.string, this.apps[implied.string], true); + if (!(implied.string in apps)) { + apps[implied.string] = this.detected[url] && this.detected[url][implied.string] + ? this.detected[url][implied.string] + : new Application(implied.string, this.apps[implied.string], true); - checkImplies = true; - } + checkImplies = true; + } - // Apply app confidence to implied app - Object.keys(app.confidence).forEach(id => { - apps[implied.string].confidence[id + ' implied by ' + appName] = app.confidence[id] * ( implied.confidence ? implied.confidence / 100 : 1 ); - }); + // Apply app confidence to implied app + Object.keys(app.confidence).forEach((id) => { + apps[implied.string].confidence[`${id} implied by ${appName}`] = app.confidence[id] * (implied.confidence === undefined ? 1 : implied.confidence / 100); }); - } - }); + }); + } + }; + + // Implied applications + // Run several passes as implied apps may imply other apps + while (checkImplies) { + checkImplies = false; + + Object.keys(apps).forEach(resolve); } } @@ -347,18 +447,19 @@ class Wappalyzer { * Cache detected applications */ cacheDetectedApps(apps, url) { - Object.keys(apps).forEach(appName => { - var app = apps[appName]; + Object.keys(apps).forEach((appName) => { + const app = apps[appName]; // Per URL this.detected[url][appName] = app; - Object.keys(app.confidence).forEach(id => { - this.detected[url][appName].confidence[id] = app.confidence[id]; - }); - }) + Object.keys(app.confidence) + .forEach((id) => { + this.detected[url][appName].confidence[id] = app.confidence[id]; + }); + }); - if ( this.driver.ping instanceof Function ) { + if (this.driver.ping instanceof Function) { this.ping(); } } @@ -367,41 +468,44 @@ class Wappalyzer { * Track detected applications */ trackDetectedApps(apps, url, language) { - if ( !( this.driver.ping instanceof Function ) ) { + if (!(this.driver.ping instanceof Function)) { return; } - const hostname = url.protocol + '//' + url.hostname; + const hostname = `${url.protocol}//${url.hostname}`; - Object.keys(apps).forEach(appName => { + Object.keys(apps).forEach((appName) => { const app = apps[appName]; - if ( this.detected[url.canonical][appName].getConfidence() >= 100 ) { - if ( validation.hostname.test(url.hostname) && !validation.hostnameBlacklist.test(url.hostname) ) { - if ( !( hostname in this.hostnameCache ) ) { + if (this.detected[url.canonical][appName].getConfidence() >= 100) { + if ( + validation.hostname.test(url.hostname) + && !validation.hostnameBlacklist.test(url.hostname) + ) { + if (!(hostname in this.hostnameCache)) { this.hostnameCache[hostname] = { applications: {}, - meta: {} + meta: {}, }; } - if ( !( appName in this.hostnameCache[hostname].applications ) ) { + if (!(appName in this.hostnameCache[hostname].applications)) { this.hostnameCache[hostname].applications[appName] = { - hits: 0 + hits: 0, }; } - this.hostnameCache[hostname].applications[appName].hits ++; + this.hostnameCache[hostname].applications[appName].hits += 1; - if ( apps[appName].version ) { + if (apps[appName].version) { this.hostnameCache[hostname].applications[appName].version = app.version; } } } }); - if ( hostname in this.hostnameCache ) { - this.hostnameCache[hostname].meta['language'] = language; + if (hostname in this.hostnameCache) { + this.hostnameCache[hostname].meta.language = language; } this.ping(); @@ -411,15 +515,15 @@ class Wappalyzer { * Analyze URL */ analyzeUrl(app, url) { - var patterns = this.parsePatterns(app.props.url); + const patterns = this.parsePatterns(app.props.url); - if ( !patterns.length ) { + if (!patterns.length) { return Promise.resolve(); } - return this.asyncForEach(patterns, pattern => { - if ( pattern.regex.test(url.canonical) ) { - this.addDetected(app, pattern, 'url', url.canonical); + return asyncForEach(patterns, (pattern) => { + if (pattern.regex.test(url.canonical)) { + addDetected(app, pattern, 'url', url.canonical); } }); } @@ -428,15 +532,15 @@ class Wappalyzer { * Analyze HTML */ analyzeHtml(app, html) { - var patterns = this.parsePatterns(app.props.html); + const patterns = this.parsePatterns(app.props.html); - if ( !patterns.length ) { + if (!patterns.length) { return Promise.resolve(); } - return this.asyncForEach(patterns, pattern => { - if ( pattern.regex.test(html) ) { - this.addDetected(app, pattern, 'html', html); + return asyncForEach(patterns, (pattern) => { + if (pattern.regex.test(html)) { + addDetected(app, pattern, 'html', html); } }); } @@ -445,18 +549,16 @@ class Wappalyzer { * Analyze script tag */ analyzeScripts(app, scripts) { - var patterns = this.parsePatterns(app.props.script); + const patterns = this.parsePatterns(app.props.script); - if ( !patterns.length ) { + if (!patterns.length) { return Promise.resolve(); } - return this.asyncForEach(patterns, pattern => { - var match; - - scripts.forEach(uri => { - if ( pattern.regex.test(uri) ) { - this.addDetected(app, pattern, 'script', uri); + return asyncForEach(patterns, (pattern) => { + scripts.forEach((uri) => { + if (pattern.regex.test(uri)) { + addDetected(app, pattern, 'script', uri); } }); }); @@ -465,31 +567,31 @@ class Wappalyzer { /** * Analyze meta tag */ - analyzeMeta(app, html) { - const regex = /]+>/ig; + analyzeMeta(app, metaTags) { const patterns = this.parsePatterns(app.props.meta); const promises = []; - var content = ''; - var matches = []; + if (!app.props.meta) { + return Promise.resolve(); + } - while ( patterns && ( matches = regex.exec(html) ) ) { - for ( var meta in patterns ) { - const r = new RegExp('(?:name|property)=["\']' + meta + '["\']', 'i'); + metaTags.forEach((match) => { + Object.keys(patterns).forEach((meta) => { + const r = new RegExp(`(?:name|property)=["']${meta}["']`, 'i'); - if ( r.test(matches[0]) ) { - content = matches[0].match(/content=("|')([^"']+)("|')/i); + if (r.test(match)) { + const content = match.match(/content=("|')([^"']+)("|')/i); - promises.push(this.asyncForEach(patterns[meta], pattern => { - if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { - this.addDetected(app, pattern, 'meta', content[2], meta); + promises.push(asyncForEach(patterns[meta], (pattern) => { + if (content && content.length === 4 && pattern.regex.test(content[2])) { + addDetected(app, pattern, 'meta', content[2], meta); } })); } - } - } + }); + }); - return promises ? Promise.all(promises) : Promise.resolve(); + return Promise.all(promises); } /** @@ -499,18 +601,20 @@ class Wappalyzer { const patterns = this.parsePatterns(app.props.headers); const promises = []; - Object.keys(patterns).forEach(headerName => { - promises.push(this.asyncForEach(patterns[headerName], pattern => { - headerName = headerName.toLowerCase(); + Object.keys(patterns).forEach((headerName) => { + if (typeof patterns[headerName] !== 'function') { + promises.push(asyncForEach(patterns[headerName], (pattern) => { + headerName = headerName.toLowerCase(); - if ( headerName in headers ) { - headers[headerName].forEach(headerValue => { - if ( pattern.regex.test(headerValue) ) { - this.addDetected(app, pattern, 'headers', headerValue, headerName); - } - }); - } - })); + if (headerName in headers) { + headers[headerName].forEach((headerValue) => { + if (pattern.regex.test(headerValue)) { + addDetected(app, pattern, 'headers', headerValue, headerName); + } + }); + } + })); + } }); return promises ? Promise.all(promises) : Promise.resolve(); @@ -523,129 +627,46 @@ class Wappalyzer { const patterns = this.parsePatterns(app.props.cookies); const promises = []; - Object.keys(patterns).forEach(cookieName => { - cookieName = cookieName.toLowerCase(); + Object.keys(patterns).forEach((cookieName) => { + if (typeof patterns[cookieName] !== 'function') { + const cookieNameLower = cookieName.toLowerCase(); - promises.push(this.asyncForEach(patterns[cookieName], pattern => { - const cookie = cookies.find(cookie => cookie.name.toLowerCase() === cookieName); + promises.push(asyncForEach(patterns[cookieName], (pattern) => { + const cookie = cookies.find(_cookie => _cookie.name.toLowerCase() === cookieNameLower); - if ( cookie && pattern.regex.test(cookie.value) ) { - this.addDetected(app, pattern, 'cookies', cookie.value, cookieName); - } - })); + if (cookie && pattern.regex.test(cookie.value)) { + addDetected(app, pattern, 'cookies', cookie.value, cookieName); + } + })); + } }); return promises ? Promise.all(promises) : Promise.resolve(); } - /** - * Analyze environment variables - */ - analyzeEnv(app, envs) { - var patterns = this.parsePatterns(app.props.env); - - if ( patterns.length ) { - return Promise.resolve(); - } - - return this.asyncForEach(patterns, pattern => { - Object.keys(envs).forEach(env => { - if ( pattern.regex.test(envs[env]) ) { - this.addDetected(app, pattern, 'env', envs[env]); - } - }) - }); - } - /** * Analyze JavaScript variables */ analyzeJs(app, results) { const promises = []; - Object.keys(results).forEach(string => { - promises.push(this.asyncForEach(Object.keys(results[string]), index => { - const pattern = this.jsPatterns[app.name][string][index]; - const value = results[string][index]; - - if ( pattern && pattern.regex.test(value) ) { - this.addDetected(app, pattern, 'js', value); - } - })); - }); - - return promises ? Promise.all(promises) : Promise.resolve(); - } - - /** - * Mark application as detected, set confidence and version - */ - addDetected(app, pattern, type, value, key) { - app.detected = true; - - // Set confidence level - app.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence || 100; - - // Detect version number - if ( pattern.version ) { - var versions = []; - var version = pattern.version; - var matches = pattern.regex.exec(value); - - if ( matches ) { - matches.forEach((match, i) => { - // Parse ternary operator - var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.*)$').exec(version); + Object.keys(results).forEach((string) => { + if (typeof results[string] !== 'function') { + promises.push(asyncForEach(Object.keys(results[string]), (index) => { + const pattern = this.jsPatterns[app.name][string][index]; + const value = results[string][index]; - if ( ternary && ternary.length === 3 ) { - version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + if (pattern && pattern.regex.test(value)) { + addDetected(app, pattern, 'js', value, string); } - - // Replace back references - version = version.trim().replace(new RegExp('\\\\' + i, 'g'), match || ''); - }); - - if ( version && versions.indexOf(version) === -1 ) { - versions.push(version); - } - - if ( versions.length ) { - // Use the longest detected version number - app.version = versions.reduce((a, b) => a.length > b.length ? a : b); - } + })); } - } - } -} - -/** - * Application class - */ -class Application { - constructor(name, props, detected) { - this.confidence = {}; - this.confidenceTotal = 0; - this.detected = Boolean(detected); - this.excludes = []; - this.name = name; - this.props = props; - this.version = ''; - } - - /** - * Calculate confidence total - */ - getConfidence() { - var total = 0; - - for ( var id in this.confidence ) { - total += this.confidence[id]; - } + }); - return this.confidenceTotal = Math.min(total, 100); + return promises ? Promise.all(promises) : Promise.resolve(); } } -if ( typeof module === 'object' ) { +if (typeof module === 'object') { module.exports = Wappalyzer; } diff --git a/src/wappalyzer.spec.js b/src/wappalyzer.spec.js new file mode 100644 index 000000000..f51d7fb10 --- /dev/null +++ b/src/wappalyzer.spec.js @@ -0,0 +1,278 @@ +/* eslint-env mocha */ + +const { assert, expect } = require('chai'); +const Wappalyzer = require('../src/wappalyzer'); + +const appsJson = { + appUrl: { + url: 'test', + }, + appCookies: { + cookies: { + test: 'test', + }, + }, + appUppercaseCookies: { + cookies: { + Test: 'Test', + }, + }, + appHeaders: { + headers: { + 'X-Powered-By': 'test', + }, + }, + appHtml: { + html: 'test v(\\d)\\;confidence:50\\;version:\\1', + implies: 'appImplies', + excludes: 'appExcludes', + }, + appMeta: { + meta: { + generator: 'test', + }, + }, + appScript: { + script: 'test', + }, + appJs: { + js: { + key: 'value', + }, + }, + appImplies: { + }, + appExcludes: { + html: 'test', + }, +}; + +const driverData = { + cookies: [ + { + name: 'test', + value: 'test', + domain: '', + path: '', + }, + ], + headers: { + 'x-powered-by': [ + 'test', + ], + }, + html: ' html test v1', + scripts: [ + 'test', + ], + js: { + appJs: { + key: [ + 'value', + ], + }, + }, +}; + +describe('Wappalyzer', () => { + describe('#analyze()', () => { + let apps; + + before(async () => { + const wappalyzer = new Wappalyzer(); + + wappalyzer.apps = appsJson; + + wappalyzer.parseJsPatterns(); + + wappalyzer.driver.displayApps = (detected) => { + apps = detected; + }; + + await wappalyzer.analyze({ canonical: 'test' }, driverData); + }); + + it('should identify technologies using URLs', () => { + expect(apps).to.have.any.keys('appUrl'); + }); + + it('should identify technologies using HTML', () => { + expect(apps).to.have.any.keys('appHtml'); + }); + + it('should identify technologies using meta tags', () => { + expect(apps).to.have.any.keys('appMeta'); + }); + + it('should identify technologies using script URLs', () => { + expect(apps).to.have.any.keys('appScript'); + }); + + it('should identify technologies using headers', () => { + expect(apps).to.have.any.keys('appHeaders'); + }); + + it('should identify technologies using cookies', () => { + expect(apps).to.have.any.keys('appCookies'); + }); + + it('should identify technologies using uppercase named cookies', () => { + expect(apps).to.have.any.keys('appUppercaseCookies'); + }); + + it('should identify technologies using JavaScript', () => { + expect(apps).to.have.any.keys('appJs'); + }); + + it('should return the implied technology', () => { + expect(apps).to.have.any.keys('appImplies'); + }); + + it('should not return the excluded technology', () => { + expect(apps).to.not.have.any.keys('appExcludes'); + }); + + it('should return the confidence value', () => { + assert.equal(apps.appHtml.confidenceTotal, 50); + }); + + it('should return the version number', () => { + assert.equal(apps.appHtml.version, '1'); + }); + + it('should analyze html', async () => { + const html = ` + + + + Page title | Html detection + + + +

Technologies Test Page | Html detection

+ + + + + + `; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Tag Manager": { + "html": [ + "googletagmanager\\.com/ns\\.html[^>]+>", + "" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { html }); + assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager'); + }); + + it('should analyze scripts', async () => { + const scripts = [ + 'http://www.google-analytics.com/analytics.js', + 'http://example.com/assets/js/jquery.min.js' + ]; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Google Analytics": { + "cats": [ + 10 + ], + "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:" + }, + "jQuery": { + "script": [ + "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", + "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", + "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" + ] + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { scripts }); + assert.equal(applications['Google Analytics'].name, 'Google Analytics'); + assert.equal(applications['jQuery'].name, 'jQuery'); + }); + + it('should analyze headers', async () => { + const headers = { + 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ], + 'connection': [ 'keep-alive' ], + 'x-powered-by': [ 'Express'], + 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ], + 'content-length': [ '293' ], + 'content-type': [ 'text/html; charset=utf-8' ] + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Express": { + "headers": { + "X-Powered-By": "^Express$" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + await wappalyzer.analyze({ canonical: 'example.com' }, { headers }); + assert.equal(applications['Express'].name, 'Express'); + }); + + it('should analyze js globals', async () => { + const js = { + 'Moment.js': { 'moment': { '0': true } }, + 'Google Font API': { 'WebFonts': { '0': true } } + }; + const wappalyzer = new Wappalyzer(); + wappalyzer.apps = { + "Moment.js": { + "js": { + "moment": "", + "moment.version": "(.*)\\;version:\\1" + } + }, + "Google Font API": { + "js": { + "WebFonts": "" + } + } + }; + var applications = null; + wappalyzer.driver = { + log () {}, + displayApps (detectedMap) { + applications = detectedMap; + } + }; + + wappalyzer.parseJsPatterns(); + await wappalyzer.analyze({ canonical: 'example.com' }, { js }); + + assert.equal(applications['Google Font API'].name, 'Google Font API'); + assert.equal(applications['Moment.js'].name, 'Moment.js'); + }); + }); +}); diff --git a/test/analyze.spec.js b/test/analyze.spec.js deleted file mode 100644 index 99cf6a516..000000000 --- a/test/analyze.spec.js +++ /dev/null @@ -1,144 +0,0 @@ -/* eslint-env mocha */ - -'use strict'; - -const assert = require('chai').assert; -const Wappalyzer = require('../src/wappalyzer'); - -describe('should analyze website elements properly', function () { - - it('should analyze html', async () => { - const html = ` - - - - Page title | Html detection - - - -

Technologies Test Page | Html detection

- - - - - - `; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Google Tag Manager": { - "html": [ - "googletagmanager\\.com/ns\\.html[^>]+>", - "" - ] - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - await wappalyzer.analyze({ canonical: 'example.com' }, { html }); - assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager'); - }); - - it('should analyze scripts', async () => { - const scripts = [ - 'http://www.google-analytics.com/analytics.js', - 'http://example.com/assets/js/jquery.min.js' - ]; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Google Analytics": { - "cats": [ - 10 - ], - "script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:" - }, - "jQuery": { - "script": [ - "jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1", - "/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1", - "jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1" - ] - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - await wappalyzer.analyze({ canonical: 'example.com' }, { scripts }); - assert.equal(applications['Google Analytics'].name, 'Google Analytics'); - assert.equal(applications['jQuery'].name, 'jQuery'); - }); - - it('should analyze headers', async () => { - const headers = { - 'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ], - 'connection': [ 'keep-alive' ], - 'x-powered-by': [ 'Express'], - 'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ], - 'content-length': [ '293' ], - 'content-type': [ 'text/html; charset=utf-8' ] - }; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Express": { - "headers": { - "X-Powered-By": "^Express$" - } - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - await wappalyzer.analyze({ canonical: 'example.com' }, { headers }); - assert.equal(applications['Express'].name, 'Express'); - }); - - it('should analyze js globals', async () => { - const js = { - 'Moment.js': { 'moment': { '0': true } }, - 'Google Font API': { 'WebFonts': { '0': true } } - }; - const wappalyzer = new Wappalyzer(); - wappalyzer.apps = { - "Moment.js": { - "js": { - "moment": "", - "moment.version": "(.*)\\;version:\\1" - } - }, - "Google Font API": { - "js": { - "WebFonts": "" - } - } - }; - var applications = null; - wappalyzer.driver = { - log () {}, - displayApps (detectedMap) { - applications = detectedMap; - } - }; - - wappalyzer.parseJsPatterns(); - await wappalyzer.analyze({ canonical: 'example.com' }, { js }); - - assert.equal(applications['Google Font API'].name, 'Google Font API'); - assert.equal(applications['Moment.js'].name, 'Moment.js'); - }); -}); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index e261850cd..000000000 --- a/yarn.lock +++ /dev/null @@ -1,199 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - -chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - -commander@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - dependencies: - type-detect "^4.0.0" - -diff@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" - -escape-string-regexp@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -file-type@7.4.*: - version "7.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.4.0.tgz#2a7c94f62a0030150bb7d9b6c70cfa1d3e759c86" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -growl@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -is-svg@2.1.*: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - dependencies: - html-comment-regex "^1.1.0" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.1.tgz#759b62c836b0732382a62b6b1fb245ec1bc943ac" - dependencies: - browser-stdout "1.3.0" - commander "2.11.0" - debug "3.1.0" - diff "3.3.1" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.3" - he "1.1.1" - mkdirp "0.5.1" - supports-color "4.4.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -read-chunk@2.1.*: - version "2.1.0" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655" - dependencies: - pify "^3.0.0" - safe-buffer "^5.1.1" - -safe-buffer@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -supports-color@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - dependencies: - has-flag "^2.0.0" - -type-detect@^4.0.0: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"