diff --git a/README.md b/README.md index 9d8c4f7ac..5f8ddaf08 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Patterns (regular expressions) are kept in [`src/technologies/`](https://github. "X-Powered-By": "Example" }, "html": "]example\\.css", + "text": "\bexample\b", "css": "\\.example-class", "robots": "Disallow: /unique-path/", "implies": "PHP\\;confidence:50", @@ -343,6 +344,14 @@ Plus any of: "<a [^>]*href=\"index.html" + + text + String | Array + + Matches plain text. Should only be used in very specific cases where other methods can't be used. + + \bexample\b + css String | Array diff --git a/schema.json b/schema.json index 1ee29fb7a..4dccf1808 100644 --- a/schema.json +++ b/schema.json @@ -113,6 +113,19 @@ } ] }, + "text": { + "oneOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/non-empty-non-blank-string" + } + }, + { + "$ref": "#/definitions/non-empty-non-blank-string" + } + ] + }, "css": { "oneOf": [ { @@ -204,6 +217,19 @@ } ] }, + "requiresCategory": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "number" + } + }, + { + "type": "number" + } + ] + }, "meta": { "type": "object", "additionalProperties": false, diff --git a/src/categories.json b/src/categories.json index d6e8c8bf7..fd877e01d 100644 --- a/src/categories.json +++ b/src/categories.json @@ -677,5 +677,12 @@ ], "name": "Cart abandonment", "priority": 9 + }, + "99": { + "groups": [ + 1 + ], + "name": "Shipping carriers", + "priority": 9 } -} \ No newline at end of file +} diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index 3a345e60d..a8441831b 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -1,3 +1,4 @@ +/* eslint-disable unicorn/prefer-text-content */ const { URL } = require('url') const fs = require('fs') const dns = require('dns').promises @@ -692,6 +693,7 @@ class Site { } let links = [] + let text = '' let css = '' let scriptSrc = [] let scripts = [] @@ -726,6 +728,21 @@ class Site { 'Timeout (links)' ) + // Text + text = await this.promiseTimeout( + ( + await this.promiseTimeout( + page.evaluateHandle(() => + document.body.innerText.replace(/\s+/g, ' ') + ), + { jsonValue: () => '' }, + 'Timeout (text)' + ) + ).jsonValue(), + '', + 'Timeout (text)' + ) + // CSS css = await this.promiseTimeout( ( @@ -829,6 +846,7 @@ class Site { this.cache[url.href] = { page, html, + text, cookies, scripts, scriptSrc, @@ -845,6 +863,7 @@ class Site { url, cookies, html, + text, css, scripts, scriptSrc, @@ -1120,19 +1139,30 @@ class Site { if (this.cache[url.href]) { const resolved = resolve(this.detections) - const requires = Wappalyzer.requires.filter(({ name, technologies }) => - resolved.some(({ name: _name }) => _name === name) - ) + const requires = [ + ...Wappalyzer.requires.filter(({ name }) => + resolved.some(({ name: _name }) => _name === name) + ), + ...Wappalyzer.categoryRequires.filter(({ categoryId }) => + resolved.some(({ categories }) => + categories.some(({ id }) => id === categoryId) + ) + ), + ] await Promise.all( - requires.map(async ({ name, technologies }) => { + requires.map(async ({ name, categoryId, technologies }) => { + const id = categoryId + ? `category:${categoryId}` + : `technology:${name}` + this.analyzedRequires[url.href] = this.analyzedRequires[url.href] || [] - if (!this.analyzedRequires[url.href].includes(name)) { - this.analyzedRequires[url.href].push(name) + if (!this.analyzedRequires[url.href].includes(id)) { + this.analyzedRequires[url.href].push(id) - const { page, cookies, html, css, scripts, scriptSrc, meta } = + const { page, cookies, html, text, css, scripts, scriptSrc, meta } = this.cache[url.href] const js = await this.promiseTimeout( @@ -1157,6 +1187,7 @@ class Site { url, cookies, html, + text, css, scripts, scriptSrc, diff --git a/src/drivers/webextension/_locales/ca/messages.json b/src/drivers/webextension/_locales/ca/messages.json index 6a527728e..c541a783c 100644 --- a/src/drivers/webextension/_locales/ca/messages.json +++ b/src/drivers/webextension/_locales/ca/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index 0d43ffce7..5f2cb397f 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index 9088e833e..1018ef77a 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -188,5 +188,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 2ab7c71f1..13435c873 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -190,5 +190,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index 090af5f4f..a080da570 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json index eb5c482f5..47fb224e1 100644 --- a/src/drivers/webextension/_locales/fa/messages.json +++ b/src/drivers/webextension/_locales/fa/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index ba013e99f..59e91a111 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/gl_ES/messages.json b/src/drivers/webextension/_locales/gl_ES/messages.json index 56db3d701..8c561e4db 100644 --- a/src/drivers/webextension/_locales/gl_ES/messages.json +++ b/src/drivers/webextension/_locales/gl_ES/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index 3289d605f..dcbf12f89 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -188,5 +188,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json index 654bcd42e..1b5074750 100644 --- a/src/drivers/webextension/_locales/id/messages.json +++ b/src/drivers/webextension/_locales/id/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index 9666b2646..46e7d32c9 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/ja/messages.json b/src/drivers/webextension/_locales/ja/messages.json index f01defde3..3f2c9b2bc 100644 --- a/src/drivers/webextension/_locales/ja/messages.json +++ b/src/drivers/webextension/_locales/ja/messages.json @@ -190,5 +190,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/ko/messages.json b/src/drivers/webextension/_locales/ko/messages.json index 983ea1906..bbacf366d 100644 --- a/src/drivers/webextension/_locales/ko/messages.json +++ b/src/drivers/webextension/_locales/ko/messages.json @@ -190,5 +190,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/nl/messages.json b/src/drivers/webextension/_locales/nl/messages.json index 09bcd02a1..4b451d9a2 100644 --- a/src/drivers/webextension/_locales/nl/messages.json +++ b/src/drivers/webextension/_locales/nl/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index 8305ca91d..663be5092 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index d1043bd3c..2a2620ab3 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json index 840fd058c..ad36017e7 100644 --- a/src/drivers/webextension/_locales/pt_BR/messages.json +++ b/src/drivers/webextension/_locales/pt_BR/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index 7d0b5f351..d61f2d843 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -188,5 +188,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json index 6195791bc..253661c8d 100644 --- a/src/drivers/webextension/_locales/ru/messages.json +++ b/src/drivers/webextension/_locales/ru/messages.json @@ -190,5 +190,6 @@ "categoryName95": { "message": "Управление цифровыми активами" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json index e1b4cfe56..e83b5f9f8 100644 --- a/src/drivers/webextension/_locales/sk/messages.json +++ b/src/drivers/webextension/_locales/sk/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json index d44e7458a..389e20683 100644 --- a/src/drivers/webextension/_locales/tr/messages.json +++ b/src/drivers/webextension/_locales/tr/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json index fef9913a5..7c91cfe5c 100644 --- a/src/drivers/webextension/_locales/uk/messages.json +++ b/src/drivers/webextension/_locales/uk/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json index d35f65272..67bb87640 100644 --- a/src/drivers/webextension/_locales/uz/messages.json +++ b/src/drivers/webextension/_locales/uz/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json index 6bbc8af7c..2ec846c36 100644 --- a/src/drivers/webextension/_locales/zh_CN/messages.json +++ b/src/drivers/webextension/_locales/zh_CN/messages.json @@ -188,5 +188,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index 4882a8e52..5d007922e 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -192,5 +192,6 @@ "categoryName95": { "message": "Digital asset management" }, "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, - "categoryName98": { "message": "Cart abandonment" } + "categoryName98": { "message": "Cart abandonment" }, + "categoryName99": { "message": "Shipping carriers" } } diff --git a/src/drivers/webextension/images/icons/Apollo13Themes.png b/src/drivers/webextension/images/icons/Apollo13Themes.png new file mode 100644 index 000000000..9fa4782d7 Binary files /dev/null and b/src/drivers/webextension/images/icons/Apollo13Themes.png differ diff --git a/src/drivers/webextension/images/icons/Blocksy.svg b/src/drivers/webextension/images/icons/Blocksy.svg new file mode 100644 index 000000000..c48adbcfb --- /dev/null +++ b/src/drivers/webextension/images/icons/Blocksy.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/drivers/webextension/images/icons/Contently.png b/src/drivers/webextension/images/icons/Contently.png new file mode 100644 index 000000000..ea3b99581 Binary files /dev/null and b/src/drivers/webextension/images/icons/Contently.png differ diff --git a/src/drivers/webextension/images/icons/Copypoison.png b/src/drivers/webextension/images/icons/Copypoison.png new file mode 100644 index 000000000..4b98883d7 Binary files /dev/null and b/src/drivers/webextension/images/icons/Copypoison.png differ diff --git a/src/drivers/webextension/images/icons/CyberChimps.png b/src/drivers/webextension/images/icons/CyberChimps.png new file mode 100644 index 000000000..965867fad Binary files /dev/null and b/src/drivers/webextension/images/icons/CyberChimps.png differ diff --git a/src/drivers/webextension/images/icons/DHL.svg b/src/drivers/webextension/images/icons/DHL.svg new file mode 100644 index 000000000..4bc4afdba --- /dev/null +++ b/src/drivers/webextension/images/icons/DHL.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/drivers/webextension/images/icons/Errorception.png b/src/drivers/webextension/images/icons/Errorception.png new file mode 100644 index 000000000..08ef91c47 Binary files /dev/null and b/src/drivers/webextension/images/icons/Errorception.png differ diff --git a/src/drivers/webextension/images/icons/Futurio.png b/src/drivers/webextension/images/icons/Futurio.png new file mode 100644 index 000000000..dd4e5e51f Binary files /dev/null and b/src/drivers/webextension/images/icons/Futurio.png differ diff --git a/src/drivers/webextension/images/icons/Geo Targetly.svg b/src/drivers/webextension/images/icons/Geo Targetly.svg new file mode 100644 index 000000000..7c13af354 --- /dev/null +++ b/src/drivers/webextension/images/icons/Geo Targetly.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/drivers/webextension/images/icons/Google Core Web Vitals.svg b/src/drivers/webextension/images/icons/Google Core Web Vitals.svg deleted file mode 100644 index 11ee94816..000000000 --- a/src/drivers/webextension/images/icons/Google Core Web Vitals.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/drivers/webextension/images/icons/Loqate.svg b/src/drivers/webextension/images/icons/Loqate.svg new file mode 100644 index 000000000..e302559d4 --- /dev/null +++ b/src/drivers/webextension/images/icons/Loqate.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/drivers/webextension/images/icons/Mews.png b/src/drivers/webextension/images/icons/Mews.png new file mode 100644 index 000000000..d3f545835 Binary files /dev/null and b/src/drivers/webextension/images/icons/Mews.png differ diff --git a/src/drivers/webextension/images/icons/Phlox.png b/src/drivers/webextension/images/icons/Phlox.png new file mode 100644 index 000000000..f2307418d Binary files /dev/null and b/src/drivers/webextension/images/icons/Phlox.png differ diff --git a/src/drivers/webextension/images/icons/Salonist.png b/src/drivers/webextension/images/icons/Salonist.png new file mode 100644 index 000000000..222268cf4 Binary files /dev/null and b/src/drivers/webextension/images/icons/Salonist.png differ diff --git a/src/drivers/webextension/images/icons/Sub2Tech.png b/src/drivers/webextension/images/icons/Sub2Tech.png new file mode 100644 index 000000000..0250a902f Binary files /dev/null and b/src/drivers/webextension/images/icons/Sub2Tech.png differ diff --git a/src/drivers/webextension/images/icons/Think Up Themes.png b/src/drivers/webextension/images/icons/Think Up Themes.png new file mode 100644 index 000000000..36c6cfef1 Binary files /dev/null and b/src/drivers/webextension/images/icons/Think Up Themes.png differ diff --git a/src/drivers/webextension/images/icons/aThemes.svg b/src/drivers/webextension/images/icons/aThemes.svg new file mode 100644 index 000000000..4e32bdf6c --- /dev/null +++ b/src/drivers/webextension/images/icons/aThemes.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/drivers/webextension/images/icons/athemes.png b/src/drivers/webextension/images/icons/athemes.png deleted file mode 100644 index 7c58b0542..000000000 Binary files a/src/drivers/webextension/images/icons/athemes.png and /dev/null differ diff --git a/src/drivers/webextension/images/icons/elasticsuite.svg b/src/drivers/webextension/images/icons/elasticsuite.svg new file mode 100644 index 000000000..8bd1513fa --- /dev/null +++ b/src/drivers/webextension/images/icons/elasticsuite.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff --git a/src/drivers/webextension/images/icons/web-vitals.svg b/src/drivers/webextension/images/icons/web-vitals.svg new file mode 100644 index 000000000..6dbca5eba --- /dev/null +++ b/src/drivers/webextension/images/icons/web-vitals.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/technologies/a.json b/src/technologies/a.json index 371fcc344..6faf02cee 100644 --- a/src/technologies/a.json +++ b/src/technologies/a.json @@ -239,7 +239,8 @@ "description": "AccessTrade is an affiliate marketing platform based on the CPA model developed by Interspace Co.", "dom": "img[src*='.accesstrade.net'],img[data-src*='.accesstrade.net']", "icon": "AccessTrade.png", - "website": "https://www.accesstrade.ne.jp" + "scriptSrc": ["accesstrade\\.net/js/", "click\\.accesstra\\.de/js/nct/lp\\.js"], + "website": "https://accesstrade.global/" }, "AccessiBe": { "cats": [ @@ -1741,7 +1742,7 @@ "saas": true, "scriptSrc": [ "/amazonpayments(?:\\.min)?\\.js", - "\\.payments-amazon\\.com/OffAmazonPayments" + "\\.payments-amazon\\.com/" ], "website": "https://pay.amazon.com", "xhr": "payments\\.amazon\\.com" @@ -2182,6 +2183,21 @@ }, "website": "https://www.apollographql.com" }, + "Apollo13Themes Rife": { + "cats": [ + 80 + ], + "description": "Apollo13Themes Rife is a great portfolio and photography WordPress theme with 7 ready-to-use demo layouts.", + "icon": "Apollo13Themes.png", + "requires": "WordPress", + "scriptSrc": "/wp-content/themes/rife(?:-free)?/(?:.+script\\.min\\.js(?:\\?ver=([\\d\\.]+)))?\\;version:\\1", + "pricing": [ + "freemium", + "low", + "recurring" + ], + "website": "https://apollo13themes.com/rife" + }, "ApostropheCMS": { "cats": [ 1 @@ -2526,6 +2542,39 @@ "scriptSrc": "\\.iperceptions\\.com", "website": "https://astutesolutions.com" }, + "aThemes Airi": { + "cats": [ + 80 + ], + "description": "aThemes Airi is a powerful yet lightweight and flexible WordPress theme for organization or freelancer.", + "icon": "aThemes.svg", + "requires": "WordPress", + "dom": "link#airi-style-css", + "scriptSrc": "/wp-content/themes/airi/", + "pricing": [ + "freemium", + "low", + "recurring" + ], + "website": "https://athemes.com/theme/airi" + }, + "aThemes Sydney": { + "cats": [ + 80 + ], + "description": "aThemes Sydney is a powerful business WordPress theme that provides a fast way for companies or freelancers to create an online presence.", + "icon": "aThemes.svg", + "requires": "WordPress", + "dom": "link#sydney-style-css", + "scriptSrc": "/wp-content/themes/sydney(?:-pro-ii)?/", + "pricing": [ + "low", + "recurring", + "onetime", + "freemium" + ], + "website": "https://athemes.com/theme/sydney" + }, "Athena Search": { "cats": [ 29 @@ -3018,4 +3067,4 @@ "oss": true, "website": "http://augmented-ui.com" } -} +} \ No newline at end of file diff --git a/src/technologies/b.json b/src/technologies/b.json index 965a0dc74..6fbfb2a63 100644 --- a/src/technologies/b.json +++ b/src/technologies/b.json @@ -472,6 +472,27 @@ ], "website": "https://putyourlightson.com/plugins/blitz" }, + "Blocksy": { + "cats": [ + 80 + ], + "description": "Blocksy is a blazing fast and lightweight WordPress theme.", + "icon": "Blocksy.svg", + "requires": "WordPress", + "dom": "link[href*='/wp-content/themes/blocksy/']", + "js": { + "blocksyJsonP": "", + "blocksyResponsiveMenuCache": "" + }, + "scriptSrc": "/wp-content/themes/blocksy/(?:.+main\\.js(?:\\?ver=([\\d\\.]+)))?\\;version:\\1", + "pricing": [ + "freemium", + "low", + "recurring", + "onetime" + ], + "website": "https://creativethemes.com/blocksy" + }, "Blogger": { "cats": [ 11 diff --git a/src/technologies/c.json b/src/technologies/c.json index 9321be760..49ea962c0 100644 --- a/src/technologies/c.json +++ b/src/technologies/c.json @@ -1655,6 +1655,21 @@ "website": "http://www.contentful.com", "xhr": "cdn\\.contentful\\.com" }, + "Contently": { + "cats": [ + 96 + ], + "description": "Contently is a SaaS content marketing platform from the company of the same name headquartered in New York.", + "icon": "Contently.png", + "js": { + "_contently.siteId": "" + }, + "pricing": [ + "poa" + ], + "saas": true, + "website": "https://contently.com" + }, "Contentstack": { "cats": [ 1 @@ -1898,6 +1913,15 @@ "implies": "PHP", "website": "http://coppermine-gallery.net" }, + "CopyPoison": { + "cats": [ + 19 + ], + "description": "Copypoison is a plagarism protection tool that protects content by replacing text with symbols that are visually similar.", + "icon": "Copypoison.png", + "scriptSrc": "copypoison\\.com/cp\\.js", + "website": "https://copypoison.com/" + }, "Corebine": { "cats": [ 1 @@ -2260,6 +2284,22 @@ "scriptSrc": "(?:cdn|app)\\.customily\\.com/", "website": "https://www.customily.com" }, + "CyberChimps Responsive": { + "cats": [ + 80 + ], + "description": "CyberChimps Responsive is a modern, lightweight, fully customizable, fast and responsive WordPress theme.", + "icon": "CyberChimps.png", + "requires": "WordPress", + "dom": "link[href*='/wp-content/themes/responsive/'], link[href*='/wp-content/themes/responsivepro/']", + "scriptSrc": "/wp-content/themes/responsive(?:pro)?/", + "pricing": [ + "freemium", + "low", + "recurring" + ], + "website": "https://cyberchimps.com/responsive" + }, "Cybersource": { "cats": [ 41 diff --git a/src/technologies/d.json b/src/technologies/d.json index db7358325..b32179031 100644 --- a/src/technologies/d.json +++ b/src/technologies/d.json @@ -30,6 +30,15 @@ }, "website": "https://derak.cloud" }, + "DHL": { + "cats": [ + 99 + ], + "text": "\\bDHL\\b", + "icon": "DHL.svg", + "requiresCategory": 6, + "website": "https://www.dhl.com" + }, "DHTMLX": { "cats": [ 59 @@ -417,7 +426,7 @@ "Digital Showroom": { "cats": [ 6 - ], + ], "description": "Digital Showroom is an ecommerce platform.", "icon": "Digital Showroom.png", "dom": "div.dd-showrom__layout", @@ -1075,4 +1084,4 @@ "scriptSrc": "deepMiner\\.js", "website": "https://github.com/deepwn/deepMiner" } -} \ No newline at end of file +} diff --git a/src/technologies/e.json b/src/technologies/e.json index 9f90dc860..fde9ad808 100644 --- a/src/technologies/e.json +++ b/src/technologies/e.json @@ -502,6 +502,22 @@ "icon": "Erlang.png", "website": "http://www.erlang.org" }, + "Errorception": { + "cats": [ + 10 + ], + "description": "Errorception is a error reporting service for client-side in-browser JavaScript errors.", + "icon": "Errorception.png", + "js": { + "_errs": "" + }, + "saas": true, + "pricing": [ + "low", + "recurring" + ], + "website": "https://errorception.com" + }, "Essent SiteBuilder Pro": { "cats": [ 1, @@ -738,6 +754,75 @@ ], "website": "https://extendthemes.com/mesmerize" }, + "ExtendThemes Materialis": { + "cats": [ + 80 + ], + "description": "ExtendThemes Materialis is an flexible, multipurpose WordPress theme.", + "icon": "ExtendThemes.svg", + "requires": "WordPress", + "dom": "link#materialis-style-css", + "js": { + "MaterialisTheme": "", + "materialisSetHeaderTopSpacing": "", + "materialis_theme_pro_settings": "" + }, + "scriptSrc": "/wp-content/themes/materialis(?:-pro)?/", + "pricing": [ + "freemium", + "low", + "recurring", + "onetime" + ], + "website": "https://extendthemes.com/materialis" + }, + "ExtendThemes EmpowerWP": { + "cats": [ + 80 + ], + "description": "ExtendThemes EmpowerWP is an flexible, multipurpose WordPress theme.", + "icon": "ExtendThemes.svg", + "requires": "WordPress", + "excludes": "ExtendThemes Mesmerize", + "dom": "link[href*='/wp-content/themes/empowerwp']", + "scriptSrc": "/wp-content/themes/empowerwp(?:-pro)?/", + "pricing": [ + "freemium", + "low", + "recurring", + "onetime" + ], + "website": "https://extendthemes.com/empowerwp" + } + "ExtendThemes Highlight": { + "cats": [ + 80 + ], + "description": "ExtendThemes Highlight is an flexible, multipurpose WordPress theme.", + "icon": "ExtendThemes.svg", + "requires": "WordPress", + "excludes": "ExtendThemes Mesmerize", + "dom": "link[href*='/wp-content/themes/highlight/'], link[href*='/wp-content/themes/highlight-pro/']", + "scriptSrc": "/wp-content/themes/highlight(?:-pro)?/", + "pricing": [ + "freemium", + "low", + "recurring", + "onetime" + ], + "website": "https://extendthemes.com/highlight" + }, + "ExtendThemes Calliope": { + "cats": [ + 80 + ], + "description": "ExtendThemes Calliope is an flexible, multipurpose WordPress child theme of Colibri WP.", + "icon": "ExtendThemes.svg", + "requires": "WordPress", + "dom": "link[href*='/wp-content/themes/calliope/']", + "scriptSrc": "/wp-content/themes/calliope/", + "website": "https://wordpress.org/themes/calliope" + }, "ExtJS": { "cats": [ 12 @@ -1034,5 +1119,33 @@ "generator": "^experiencedCMS$" }, "website": "https://experiencedcms.berkearas.de" + }, + "ElasticSuite": { + "cats": [ + 6, + 29 + ], + "cookies": { + "STUID": "\\;confidence:50", + "STVID": "\\;confidence:50" + }, + "html": [ + "]*Smile_Elasticsuite[^>]*>", + "]*(Smile_Elasticsuite)[\\S\\s]*", + "<[\\S\\s]*(.*)Smile_Elasticsuite(.*)[\\S\\s]" + ], + "js": { + "smileTracker": "" + }, + "oss": true, + "scriptSrc": [ + "Smile_ElasticsuiteTracker/js/tracking\\.js" + ], + "icon": "elasticsuite.svg", + "implies": [ + "PHP", + "Elasticsearch" + ], + "website": "https://elasticsuite.io" } } diff --git a/src/technologies/f.json b/src/technologies/f.json index 92eb8c771..b9916c93f 100644 --- a/src/technologies/f.json +++ b/src/technologies/f.json @@ -1175,5 +1175,22 @@ "icon": "futureshop.png", "scriptSrc": "future-shop.*\\.js", "website": "https://www.future-shop.jp" + }, + "Futurio": { + "cats": [ + 80 + ], + "description": "Futurio is a lightweight and customizable multi-purpose and WooCommerce WordPress theme.", + "icon": "Futurio.png", + "requires": "WordPress", + "dom": "link[href*='/wp-content/themes/futurio/']", + "scriptSrc": "/wp-content/themes/futurio/.+customscript\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1", + "pricing": [ + "freemium", + "low", + "recurring", + "onetime" + ], + "website": "https://futuriowp.com" } } diff --git a/src/technologies/g.json b/src/technologies/g.json index b1df999ce..b5b5c113a 100644 --- a/src/technologies/g.json +++ b/src/technologies/g.json @@ -277,6 +277,19 @@ "icon": "Gentoo.png", "website": "http://www.gentoo.org" }, + "Geo Targetly": { + "cats": [ + 79 + ], + "description": "Geo Targetly is a website geo personalisation software.", + "icon": "Geo Targetly.svg", + "scriptSrc": "geotargetly\\.co/", + "saas": true, + "pricing": [ + "payg" + ], + "website": "https://geotargetly.com" + }, "Gerrit": { "cats": [ 47 @@ -906,20 +919,6 @@ }, "website": "http://code.google.com/p/google-code-prettify" }, - "Google Core Web Vitals": { - "cats": [ - 78 - ], - "description": "Google Core Web Vitals is a tiny, modular library for measuring all the web vitals metrics on real users.", - "icon": "Google Core Web Vitals.svg", - "scripts": "(8999999999999[\\s\\S]+1e12[\\s\\S]+(largest-contentful-paint|first-input|layout-shift)|(largest-contentful-paint|first-input|layout-shift)[\\s\\S]+8999999999999[\\s\\S]+1e12)", - "js": { - "webVitals.getCLS": "" - }, - "oss": true, - "scriptSrc": "web-vitals@([\\d.]+)/dist/web-vitals.*\\.js\\;version:\\1", - "website": "https://github.com/GoogleChrome/web-vitals" - }, "Google Font API": { "cats": [ 17 diff --git a/src/technologies/j.json b/src/technologies/j.json index 2d3e20362..cb069f4ae 100644 --- a/src/technologies/j.json +++ b/src/technologies/j.json @@ -547,7 +547,7 @@ "scriptSrc": [ "jquery", "/jquery(?:-(\\d+\\.\\d+\\.\\d+))[/.-]\\;version:\\1", - "/(\\d+\\.\\d+\\.\\d+)/jquery[/.-]\\;version:\\1" + "/(\\d+\\.\\d+\\.\\d+)/jquery[/.-][^u]\\;version:\\1" ], "website": "https://jquery.com" }, diff --git a/src/technologies/k.json b/src/technologies/k.json index 5285a79e4..8b53d7b93 100644 --- a/src/technologies/k.json +++ b/src/technologies/k.json @@ -32,6 +32,22 @@ ], "website": "https://www.kadencewp.com/kadence-theme" }, + "Kadence WP Virtue": { + "cats": [ + 80 + ], + "description": "Kadence WP Virtue is a multipurpose WordPress theme that is available for free download and also offers a pro version.", + "icon": "Kadence WP.svg", + "requires": "WordPress", + "dom": "link[href*='/wp-content/themes/virtue/']", + "scriptSrc": "/wp-content/themes/virtue/.+main-min\\.js(?:\\?ver=([\\d\\.]+))?\\;version:\\1", + "pricing": [ + "freemium", + "low", + "recurring" + ], + "website": "https://www.kadencewp.com/product/virtue-free-theme" + }, "KISSmetrics": { "cats": [ 10 diff --git a/src/technologies/l.json b/src/technologies/l.json index 3eaeabb37..cb8088c7e 100644 --- a/src/technologies/l.json +++ b/src/technologies/l.json @@ -972,6 +972,22 @@ "scriptSrc": "loox\\.io/widget", "website": "https://loox.app" }, + "Loqate": { + "cats": [ + 19 + ], + "description": "Loqate is an address verification solution.", + "icon": "Loqate.svg", + "js": { + "pca.platform.productList": "", + "loqateAccountCode": "" + }, + "saas": true, + "pricing": [ + "payg" + ], + "website": "https://www.loqate.com" + }, "Lotus Domino": { "cats": [ 22 diff --git a/src/technologies/m.json b/src/technologies/m.json index 96158641e..87046566c 100644 --- a/src/technologies/m.json +++ b/src/technologies/m.json @@ -867,6 +867,24 @@ "scriptSrc": "\\.metrilo\\.com/", "website": "https://www.metrilo.com" }, + "Mews": { + "cats": [ + 72 + ], + "description": "Mews is a hospitalitions service that enables hotels to track their bookings.", + "icon": "Mews.png", + "dom": "a[href*='.mews.li/'][target='_blank']", + "js": { + "Mews": "" + }, + "scriptSrc": "\\.mews\\.li/", + "saas": true, + "pricing": [ + "low", + "recurring" + ], + "website": "https://www.mews.com" + }, "Microsoft 365": { "cats": [ 30, diff --git a/src/technologies/p.json b/src/technologies/p.json index 30d153f3a..15df9d93d 100644 --- a/src/technologies/p.json +++ b/src/technologies/p.json @@ -761,6 +761,22 @@ }, "website": "https://github.com/Sazito/phoenix/" }, + "Phlox": { + "cats": [ + 80 + ], + "description": "Phlox is a modern, lightweight and customizable WordPress theme gratify for almost any type of website.", + "icon": "Phlox.png", + "requires": "WordPress", + "dom": "link[href*='/wp-content/themes/phlox/'], link[href*='/wp-content/themes/phlox-pro/']", + "scriptSrc": "/wp-content/themes/phlox(?:-pro)?/", + "pricing": [ + "freemium", + "low", + "onetime" + ], + "website": "https://www.phlox.pro" + }, "PhotoShelter": { "cats": [ 1, diff --git a/src/technologies/s.json b/src/technologies/s.json index d085778e3..f25737fdb 100644 --- a/src/technologies/s.json +++ b/src/technologies/s.json @@ -375,6 +375,21 @@ "scriptSrc": "api\\.salesreps\\.io/", "website": "https://salesreps.io" }, + "Salonist": { + "cats": [ + 72 + ], + "description": "Salonist is a salon management software.", + "icon": "Salonist.png", + "dom": "iframe[src*='.salonist.io/'], a[href*='.salonist.io/'][target='_blank']", + "pricing": [ + "freemium", + "low", + "recurring" + ], + "saas": true, + "website": "https://salonist.io" + }, "Salesfloor": { "cats": [ 5, @@ -1340,6 +1355,9 @@ } }, "icon": "Shopify.svg", + "js": { + "ShopifyPay.apiHost": "" + }, "scriptSrc": [ "cdn\\.shopify\\.com/shopifycloud/shopify_pay/" ], @@ -3629,6 +3647,22 @@ ], "website": "https://stylitics.com" }, + "Sub2Tech": { + "cats": [ + 97 + ], + "description": "Sub2Tech is combining real time customer data with industry-leading technology.", + "icon": "Sub2Tech.png", + "js": { + "SUB2.codebaseversion": "^([\\d\\.]+)$\\;version:\\1" + }, + "scriptSrc": "cdn\\.sub2tech\\.com/", + "saas": true, + "pricing": [ + "poa" + ], + "website": "https://www.sub2tech.com" + }, "Subbly": { "cats": [ 6 @@ -3908,26 +3942,6 @@ "scriptSrc": "swiper(?:\\.min)?\\.js", "website": "https://swiperjs.com" }, - "Sydney": { - "cats": [ - 80 - ], - "description": "Sydney is a powerful business theme that provides a fast way for companies or freelancers to create an online presence. Built by aThemes.", - "dom": { - "body[class*='sydney-theme']": { - "text": "" - }, - "link[id*='sydney']": { - "attributes": { - "href": "sydney\\S*\\.css(?:\\?ver=([0-9.]+))?\\;version:\\1" - } - } - }, - "icon": "athemes.png", - "requires": "WordPress", - "scriptSrc": "themes/sydney\\S*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1", - "website": "https://athemes.com/theme/sydney/" - }, "Sylius": { "cats": [ 6 diff --git a/src/technologies/t.json b/src/technologies/t.json index 3f14ab4c7..c742de5e3 100644 --- a/src/technologies/t.json +++ b/src/technologies/t.json @@ -679,6 +679,21 @@ "implies": "PHP", "website": "http://www.thinkphp.cn" }, + "Think Up Themes Consulting": { + "cats": [ + 80 + ], + "description": "Think Up Themes Consulting is a multipurpose WordPress theme that is available for free download and also offers a pro version.", + "icon": "Think Up Themes.png", + "requires": "WordPress", + "dom": "link#consulting-style-css", + "scriptSrc": "/wp-content/themes/consulting(?:-pro)?/", + "pricing": [ + "freemium", + "onetime" + ], + "website": "https://www.thinkupthemes.com/themes/consulting" + }, "Thinkific": { "cats": [ 21 diff --git a/src/technologies/w.json b/src/technologies/w.json index 18a638f6b..01acce024 100644 --- a/src/technologies/w.json +++ b/src/technologies/w.json @@ -21,6 +21,21 @@ "scriptSrc": "w3counter\\.com/tracker\\.js", "website": "http://www.w3counter.com" }, + "web-vitals": { + "cats": [ + 59, + 78 + ], + "description": "The web-vitals JavaScript is a tiny, modular library for measuring all the web vitals metrics on real users.", + "icon": "web-vitals.svg", + "scripts": "(8999999999999[\\s\\S]+1e12[\\s\\S]+(largest-contentful-paint|first-input|layout-shift)|(largest-contentful-paint|first-input|layout-shift)[\\s\\S]+8999999999999[\\s\\S]+1e12)", + "js": { + "webVitals": "" + }, + "oss": true, + "scriptSrc": "web-vitals@([\\d.]+)/dist/web-vitals.*\\.js\\;version:\\1", + "website": "https://github.com/GoogleChrome/web-vitals" + }, "WEBDEV": { "cats": [ 20 @@ -113,6 +128,21 @@ ], "website": "https://wp-royal.com/themes/item-ashe-free" }, + "WP-Royal Bard": { + "cats": [ + 80 + ], + "description": "WP-Royal Bard is a personal and multi-author WordPress blog theme.", + "icon": "WP-Royal.png", + "requires": "WordPress", + "dom": "link#bard-style-css, style#bard_predefined_custom_css", + "scriptSrc": "/wp-content/themes/bard(?:-pro-premium)?/", + "pricing": [ + "freemium", + "onetime" + ], + "website": "https://wp-royal.com/themes/item-bard-free" + }, "WP-Statistics": { "cats": [ 10, diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 252fae5ca..fbc77625d 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -12,6 +12,7 @@ const Wappalyzer = { technologies: [], categories: [], requires: [], + categoryRequires: [], slugify: (string) => string @@ -24,6 +25,9 @@ const Wappalyzer = { [ ...Wappalyzer.technologies, ...Wappalyzer.requires.map(({ technologies }) => technologies).flat(), + ...Wappalyzer.categoryRequires + .map(({ technologies }) => technologies) + .flat(), ].find(({ name: _name }) => name === _name), getCategory: (id) => Wappalyzer.categories.find(({ id: _id }) => id === _id), @@ -205,6 +209,7 @@ const Wappalyzer = { url, xhr, html, + text, scripts, css, robots, @@ -234,6 +239,7 @@ const Wappalyzer = { oo(technology, 'url', url), oo(technology, 'xhr', xhr), oo(technology, 'html', html), + oo(technology, 'text', text), oo(technology, 'scripts', scripts), oo(technology, 'css', css), oo(technology, 'robots', robots), @@ -269,6 +275,7 @@ const Wappalyzer = { xhr, dom, html, + text, scripts, css, robots, @@ -283,6 +290,7 @@ const Wappalyzer = { implies, excludes, requires, + requiresCategory, icon, website, cpe, @@ -311,6 +319,7 @@ const Wappalyzer = { false ), html: transform(html), + text: transform(text), scripts: transform(scripts), css: transform(css), certIssuer: transform(certIssuer), @@ -329,6 +338,9 @@ const Wappalyzer = { requires: transform(requires).map(({ value }) => ({ name: value, })), + requiresCategory: transform(requiresCategory).map(({ value }) => ({ + id: value, + })), icon: icon || 'default.svg', website: website || null, cpe: cpe || null, @@ -356,8 +368,27 @@ const Wappalyzer = { technologies: Wappalyzer.requires[name], })) + Wappalyzer.technologies + .filter(({ requiresCategory }) => requiresCategory.length) + .forEach((technology) => + technology.requiresCategory.forEach(({ id }) => { + Wappalyzer.categoryRequires[id] = + Wappalyzer.categoryRequires[id] || [] + + Wappalyzer.categoryRequires[id].push(technology) + }) + ) + + Wappalyzer.categoryRequires = Object.keys(Wappalyzer.categoryRequires).map( + (id) => ({ + categoryId: parseInt(id, 10), + technologies: Wappalyzer.categoryRequires[id], + }) + ) + Wappalyzer.technologies = Wappalyzer.technologies.filter( - ({ requires }) => !requires.length + ({ requires, requiresCategory }) => + !requires.length && !requiresCategory.length ) }, @@ -391,7 +422,11 @@ const Wappalyzer = { return [] } - if (typeof patterns === 'string' || Array.isArray(patterns)) { + if ( + typeof patterns === 'string' || + typeof patterns === 'number' || + Array.isArray(patterns) + ) { patterns = { main: patterns } } @@ -421,6 +456,7 @@ const Wappalyzer = { ) } else { const { value, regex, confidence, version } = pattern + .toString() .split('\\;') .reduce((attrs, attr, i) => { if (i) { @@ -431,7 +467,7 @@ const Wappalyzer = { attrs[attr.shift()] = attr.join(':') } } else { - attrs.value = attr + attrs.value = typeof pattern === 'number' ? pattern : attr // Escape slashes in regular expression attrs.regex = new RegExp( diff --git a/yarn.lock b/yarn.lock index adb411e0f..bfe7a6371 100644 --- a/yarn.lock +++ b/yarn.lock @@ -475,9 +475,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001219: - version "1.0.30001228" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" - integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== + version "1.0.30001271" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz" + integrity sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA== chalk@^2.0.0, chalk@^2.4.1: version "2.4.2"