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"