Merge branch 'master' into highlight

main
Elbert Alias 3 years ago committed by GitHub
commit 059f08bdd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -91,6 +91,7 @@ Patterns (regular expressions) are kept in [`src/technologies/`](https://github.
"X-Powered-By": "Example" "X-Powered-By": "Example"
}, },
"html": "<link[^>]example\\.css", "html": "<link[^>]example\\.css",
"text": "\bexample\b",
"css": "\\.example-class", "css": "\\.example-class",
"robots": "Disallow: /unique-path/", "robots": "Disallow: /unique-path/",
"implies": "PHP\\;confidence:50", "implies": "PHP\\;confidence:50",
@ -343,6 +344,14 @@ Plus any of:
</td> </td>
<td><code>"&lt;a [^&gt;]*href=\"index.html"</code></td> <td><code>"&lt;a [^&gt;]*href=\"index.html"</code></td>
</tr> </tr>
<tr>
<td><code>text</code></td>
<td>String | Array</td>
<td>
Matches plain text. Should only be used in very specific cases where other methods can't be used.
</td>
<td><code>\bexample\b</code></td>
</tr>
<tr> <tr>
<td><code>css</code></td> <td><code>css</code></td>
<td>String | Array</td> <td>String | Array</td>

@ -113,6 +113,19 @@
} }
] ]
}, },
"text": {
"oneOf": [
{
"type": "array",
"items": {
"$ref": "#/definitions/non-empty-non-blank-string"
}
},
{
"$ref": "#/definitions/non-empty-non-blank-string"
}
]
},
"css": { "css": {
"oneOf": [ "oneOf": [
{ {
@ -204,6 +217,19 @@
} }
] ]
}, },
"requiresCategory": {
"oneOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "number"
}
]
},
"meta": { "meta": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,

@ -677,5 +677,12 @@
], ],
"name": "Cart abandonment", "name": "Cart abandonment",
"priority": 9 "priority": 9
},
"99": {
"groups": [
1
],
"name": "Shipping carriers",
"priority": 9
} }
} }

@ -1,3 +1,4 @@
/* eslint-disable unicorn/prefer-text-content */
const { URL } = require('url') const { URL } = require('url')
const fs = require('fs') const fs = require('fs')
const dns = require('dns').promises const dns = require('dns').promises
@ -692,6 +693,7 @@ class Site {
} }
let links = [] let links = []
let text = ''
let css = '' let css = ''
let scriptSrc = [] let scriptSrc = []
let scripts = [] let scripts = []
@ -726,6 +728,21 @@ class Site {
'Timeout (links)' '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
css = await this.promiseTimeout( css = await this.promiseTimeout(
( (
@ -829,6 +846,7 @@ class Site {
this.cache[url.href] = { this.cache[url.href] = {
page, page,
html, html,
text,
cookies, cookies,
scripts, scripts,
scriptSrc, scriptSrc,
@ -845,6 +863,7 @@ class Site {
url, url,
cookies, cookies,
html, html,
text,
css, css,
scripts, scripts,
scriptSrc, scriptSrc,
@ -1120,19 +1139,30 @@ class Site {
if (this.cache[url.href]) { if (this.cache[url.href]) {
const resolved = resolve(this.detections) const resolved = resolve(this.detections)
const requires = Wappalyzer.requires.filter(({ name, technologies }) => const requires = [
...Wappalyzer.requires.filter(({ name }) =>
resolved.some(({ name: _name }) => _name === name) resolved.some(({ name: _name }) => _name === name)
),
...Wappalyzer.categoryRequires.filter(({ categoryId }) =>
resolved.some(({ categories }) =>
categories.some(({ id }) => id === categoryId)
) )
),
]
await Promise.all( 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] =
this.analyzedRequires[url.href] || [] this.analyzedRequires[url.href] || []
if (!this.analyzedRequires[url.href].includes(name)) { if (!this.analyzedRequires[url.href].includes(id)) {
this.analyzedRequires[url.href].push(name) 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] this.cache[url.href]
const js = await this.promiseTimeout( const js = await this.promiseTimeout(
@ -1157,6 +1187,7 @@ class Site {
url, url,
cookies, cookies,
html, html,
text,
css, css,
scripts, scripts,
scriptSrc, scriptSrc,

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -188,5 +188,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -190,5 +190,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -188,5 +188,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -190,5 +190,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -190,5 +190,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -188,5 +188,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -190,5 +190,6 @@
"categoryName95": { "message": "Управление цифровыми активами" }, "categoryName95": { "message": "Управление цифровыми активами" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -188,5 +188,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

@ -192,5 +192,6 @@
"categoryName95": { "message": "Digital asset management" }, "categoryName95": { "message": "Digital asset management" },
"categoryName96": { "message": "Content curation" }, "categoryName96": { "message": "Content curation" },
"categoryName97": { "message": "Customer data platform" }, "categoryName97": { "message": "Customer data platform" },
"categoryName98": { "message": "Cart abandonment" } "categoryName98": { "message": "Cart abandonment" },
"categoryName99": { "message": "Shipping carriers" }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16 0C24.8363 0 32 7.16373 32 16C32 24.8363 24.8363 32 16 32C7.16373 32 0 24.8363 0 16C0 7.16373 7.16373 0 16 0ZM19.9872 16.5568C19.9508 16.5234 19.9033 16.5048 19.8539 16.5048C19.8045 16.5048 19.7569 16.5234 19.7205 16.5568L11.0507 24.7182C10.9916 24.7751 11.0336 24.8704 11.1175 24.8704H19.2313C19.3308 24.8704 19.4268 24.8327 19.4972 24.7659L23.3017 21.1833C23.4062 21.0876 23.4896 20.9711 23.5467 20.8414C23.6037 20.7117 23.6332 20.5716 23.6332 20.4299C23.6332 20.2882 23.6037 20.148 23.5467 20.0183C23.4896 19.8886 23.4062 19.7722 23.3017 19.6764L19.9872 16.5568ZM19.9872 7.67716C19.9508 7.64372 19.9033 7.62517 19.8539 7.62517C19.8045 7.62517 19.7569 7.64372 19.7205 7.67716L10.0658 16.7652C10.0312 16.7973 10.0035 16.8363 9.98457 16.8796C9.96561 16.9229 9.95574 16.9696 9.95556 17.0169V23.7767C9.95556 23.8549 10.0572 23.8955 10.1163 23.8393L22.6283 12.0007C23.0699 11.584 23.0706 10.5892 22.6283 10.1732L19.9872 7.67716ZM18.2258 7.11111H10.144C10.0402 7.11111 9.95556 7.19076 9.95556 7.28889V14.8971C9.95556 14.976 10.0572 15.0158 10.117 14.9596L18.2919 7.26258C18.3509 7.20711 18.309 7.11111 18.2251 7.11111H18.2258Z" fill="#115CFA"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,5 @@
<svg width="195" height="195" viewBox="0 0 195 195" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="195" height="195" fill="#FFCC00"/>
<path d="M195 47H0V148H195V47Z" fill="#FFCC00"/>
<path d="M41.3993 106.919H0V115.018H35.4487L41.3993 106.919ZM0 130H24.4138L30.3376 121.957H0V130ZM52.4685 91.8922H0V99.98H46.506L52.4685 91.8922ZM122.322 89.169C120.315 91.886 116.952 96.619 114.907 99.379C113.869 100.779 111.992 103.335 118.213 103.335H149.751C149.751 103.335 155.026 96.1552 159.45 90.1541C165.467 81.9877 159.97 65 138.462 65H53.7609L39.0756 84.9525H120.307C124.352 84.9525 124.299 86.4894 122.322 89.169V89.169ZM166.902 91.8927L160.979 99.936H195V91.8927H166.902ZM144.582 110.274H108.24L94.44 110.273C88.22 110.273 90.0972 107.717 91.1353 106.314C93.1805 103.552 96.623 98.8267 98.6307 96.1066C100.607 93.4271 101.833 91.8917 97.7862 91.8917H61.1823L33.1328 130H105.063C126.393 130 139.231 116.978 144.582 110.274ZM149.917 114.973H195V106.875H155.868L149.917 114.973ZM138.875 130H195V121.912H144.818L138.875 130Z" fill="#D40511"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.1877 0.516113C23.5973 0.516113 25.8063 4.11766 24.3178 7.14321C23.5973 8.67973 21.1962 10.9848 20.1877 12.0893C19.1312 10.8888 16.8742 8.77573 16.1057 7.19121C14.5211 4.21366 16.7302 0.516113 20.1877 0.516113ZM12.2027 9.12463C16.2703 9.12463 18.9057 13.4214 17.1297 17.0307C16.2703 18.864 13.4058 21.6139 12.2027 22.9316C10.9423 21.4993 8.24966 18.9786 7.33302 17.088C5.44244 13.536 8.07779 9.12463 12.2027 9.12463ZM20.1877 19.9107C23.5973 19.9107 25.8063 23.5122 24.3178 26.5378C23.5973 28.0743 21.1962 30.3793 20.1877 31.4839C19.1312 30.2833 16.8742 28.1703 16.1057 26.5858C14.5211 23.6082 16.7302 19.9107 20.1877 19.9107Z" fill="#5762FF"/>
<path d="M22.7152 24.5208C22.7152 25.9107 21.5782 27.0477 20.1883 27.0477C18.7983 27.0477 17.6613 25.9107 17.6613 24.5208C17.6613 23.9164 17.8853 23.3667 18.243 22.9306L13.6649 17.2573C13.2314 17.4999 12.7333 17.6392 12.2038 17.6392C10.5454 17.6392 9.18903 16.2823 9.18903 14.6245C9.18903 12.9667 10.5459 11.6098 12.2038 11.6098C12.755 11.6098 13.2706 11.7621 13.7165 12.0232L18.211 6.67715C17.8724 6.24722 17.6618 5.71302 17.6618 5.1267C17.6618 3.73676 18.7989 2.59973 20.1888 2.59973C21.5787 2.59973 22.7158 3.73676 22.7158 5.1267C22.7158 6.51663 21.5787 7.65367 20.1888 7.65367C19.7568 7.65367 19.3558 7.53392 18.9991 7.34089L14.5057 12.6859C14.949 13.2113 15.2185 13.888 15.2185 14.625C15.2185 15.3837 14.932 16.0774 14.4649 16.6085L19.044 22.2823C19.3898 22.1042 19.7754 21.9938 20.1888 21.9938C21.5777 21.9933 22.7152 23.1308 22.7152 24.5208Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -1,17 +0,0 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.8723 21.9058H18.3241C18.2056 21.9058 17.9686 21.9058 17.8501 22.0243L9.90932 28.3058C9.7908 28.4243 9.7908 28.5428 9.90932 28.6613C9.90932 28.7798 10.0278 28.7798 10.1464 28.7798H28.9908C30.8871 28.7798 32.5464 27.1206 32.4278 25.1058C32.3093 23.2095 30.6501 21.9058 28.8723 21.9058Z" fill="#00C9DB"/>
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="1" y="2" width="20" height="27">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.18518 2.37036H20.2667V28.8H1.18518V2.37036Z" fill="white"/>
</mask>
<g mask="url(#mask0)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2666 15.2889C20.1481 14.3407 19.674 13.3926 18.9629 12.8L6.75553 3.08145C5.21479 1.89627 3.08146 2.13331 1.89627 3.67405C0.711089 5.21479 0.948126 7.34812 2.48887 8.53331L11.3778 15.6444L2.48887 22.7555C0.948126 23.9407 0.711089 26.074 1.89627 27.6148C3.08146 29.1555 5.21479 29.3926 6.75553 28.2074L18.9629 18.2518C19.7926 17.5407 20.2666 16.5926 20.2666 15.5259V15.2889Z" fill="#0D55FF"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.4279 25.3428C32.4279 27.2391 30.8872 28.7798 28.9909 28.7798C27.0946 28.7798 25.5538 27.2391 25.5538 25.3428C25.5538 23.4465 27.0946 21.9058 28.9909 21.9058C30.8872 21.9058 32.4279 23.4465 32.4279 25.3428Z" fill="#7000F2"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M32 22.8782L16.0368 32L0 22.8782V18.3172L16.0368 27.4391L32 18.3172V22.8782Z" fill="#14C5BD"/>
<path d="M32 13.6828V9.12184L16.0368 0L0 9.12184V13.6828L16.0368 22.8782L23.9816 18.3172V13.6828L16.0368 18.3172L4.04598 11.4023L16.0368 4.56092L32 13.6828Z" fill="#14C5BD"/>
</svg>

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M32 0.213837L10.9161 18.7445L0 5.2055L32 0.213837Z" fill="#335EEA"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M31.7542 0L10.6141 18.461L21.5302 32L31.7542 0Z" fill="#BECCF9"/>
</svg>

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 87.4 68.4" style="enable-background:new 0 0 87.4 68.4;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_2_);}
</style>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="21.569" y1="60.6577" x2="67.2189" y2="13.3948">
<stop offset="0" style="stop-color:#2C4D9D"/>
<stop offset="1" style="stop-color:#3A8FCE"/>
</linearGradient>
<path class="st0" d="M85.1,35c-2.7-1.7-3.4-3.7-3.4-3.8l0-0.1c-2.5-7-8.1-9.5-12.6-9.6C65.5,7.1,47.5,2.5,42.4,3.2
c-4.6,0.5-8.4-1-8.5-1l-0.8-0.3c0,0-2.8-1.5-3.3-1.3c-0.6,0.2,1.1,4.4,1.6,5.4c0,0,0,0,0,0c0.1,0.1,0.1,0.2,0.1,0.2l0,0
c2.6,5.6,12,12.6,20.6,13.5c3.6,0.4,3.9,2.7,4.1,5.1c0.1,0.5,0.1,1.3,0.2,1.7l-4-0.1c-11.1-6.5-20.8-8.6-29-6.3
c-8.8,2.6-11.8,8.2-12.4,9.8l-0.1,0.2c0,0.1-0.3,0.9-0.7,2.1c-0.6-0.4-1.3-0.6-2.1-0.7c-1.7-0.3-3.4,0.3-4.8,1.5
C2.1,34,1.2,35.6,1,37.3c-0.3,1.8,0.1,3.6,1,5.1c1,1.5,2.4,2.5,4.1,2.7c1.1,0.2,2.1,0,3.1-0.4c0.4,2.3,1.3,4.3,2.5,5.9
c3.1,3.8,8.3,5.2,15.6,4.2L37.8,53c1.2-0.3,1.9-1.4,1.7-2.5c-0.1-0.6-0.5-1.1-1.1-1.4c-0.6-0.3-1.2-0.3-1.9-0.2c0,0-0.1,0-0.1,0
l-9.7,1.6c-5.6,0.8-9.5-0.1-11.5-2.6C13.6,46,13,43,13.3,39.2c0-0.1,0-0.1,0-0.3c0.4-3.7,1.5-6.9,1.6-7.3c1.4-3.2,3.3-5.5,9.8-7.4
c7.1-2,15.8,0,26,6.2l0.5,0.3l10.3,0L61.3,28c-0.1-0.5-0.1-1-0.2-1.6c-0.5-4.1-1.2-10.3-8.6-11.1C47,14.6,41.2,11,37.8,7.5
c1.7,0.2,3.5,0.2,5.1,0C45,7.2,50.2,8.2,55.2,11c4,2.3,9,6.4,10,13.2l0.3,2.2l2.2-0.4c0.3-0.1,7-1.2,9.9,6.6
c0.2,0.6,1.2,3.3,4.5,5.7c-1.8,1.5-7.9,4.6-12.5,4.1l-1.3-0.1l-0.4,0.9c-0.9,1.6-4,6.9-9.3,7.2c-4.9,0.3-8.2,2.4-10.2,4.3l-1.2-0.6
c1.9-5.2,1.9-9.5-0.2-12.8c-3.3-5.1-10.1-5.7-11.3-5.7l-0.2,0c0,0-0.4,0-0.7,0.1c-1.2,0.2-2.1,1-2.1,2c0,1,0.8,1.9,2,2.1l0.6,0.1
c0.1,0,5.7,0.2,8,3.7c1.5,2.4,1.2,6-0.9,10.6l-0.9,1.9l21.3,10.4l0.6,0.2c0.3,0.1,0.6,0.1,0.8,0.1c0.9,0,1.7-0.4,2-1.1
c0.4-0.9,0-2.1-1.1-2.9l-12.6-6.2c1.8-1.2,3.8-1.9,6.2-2.1c6.1-0.4,10.1-5,11.9-8c5.7-0.2,13.8-3.5,15.6-7.1
c0.3-0.6,0.4-1.2,0.4-1.2C87,37.1,86.3,35.8,85.1,35z M9.1,38.1L9,38.7C8.8,40,7.7,41,6.8,40.8c-0.5-0.1-0.9-0.4-1.2-0.9
c-0.3-0.6-0.4-1.3-0.3-2c0.1-0.8,0.5-1.4,1-1.8c0.3-0.3,0.7-0.5,1.1-0.5c0.1,0,0.1,0,0.2,0C8,35.8,8.4,36,8.7,36.5
C8.9,37,9.1,37.5,9.1,38.1z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="29.2433" y1="67.9192" x2="44.9438" y2="59.7463">
<stop offset="0" style="stop-color:#2C4D9D"/>
<stop offset="1" style="stop-color:#3A8FCE"/>
</linearGradient>
<path class="st1" d="M44.8,60c-0.4-0.5-1-0.8-1.7-0.7c-0.5,0-1.1,0.2-1.6,0.5l-0.2,0.1L41,60.2c-0.1,0.1-2.5,2.6-7.8,2.6
c-1.6,0-2.9,0.9-2.9,2.2s1.3,2.2,2.9,2.2c6.3,0,9.8-2.8,10.7-3.7c0.5-0.6,1-1,1.1-1.6C45.2,61.2,45.1,60.5,44.8,60z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs><style>.cls-6{stroke:#222;fill:#3fc4ff}</style></defs>
<rect x=".5" y=".5" width="63" height="63" rx="4" style="stroke:#222;fill:#fff"/>
<ellipse cx="10.941" cy="5.471" rx="1.705" ry="1.71" style="fill:#2979ff"/>
<ellipse cx="5.251" cy="5.471" rx="1.705" ry="1.71" style="fill:#3740ff"/>
<ellipse cx="16.637" cy="5.471" rx="1.705" ry="1.71" style="fill:#3fc4ff"/>
<path d="M.651 47.574h62.7M.651 55.5h62.7m-55.39 7.315V48.024m8.1 14.791V48.024m7.924 14.791V48.024m7.592 14.791V48.024m8.094 14.791V48.024m7.76 14.791V48.024m8.094 14.791V48.024" style="stroke-linecap:square;fill:none;stroke:#222"/>
<ellipse class="cls-6" cx="47.431" cy="55.674" rx="1.768" ry="1.773"/>
<ellipse cx="31.577" cy="55.674" rx="1.768" ry="1.773" style="fill:#2979ff;stroke:#222"/>
<path d="M11.428 26.56h6.358l3.1-5.7 2.922 13.165 3.748-6.58 3.51 6.58 3.268-12.785 4.637 12.789L43.9 21.335l2.906 5.225h6.1" style="stroke:#3fc4ff;stroke-linecap:round;stroke-linejoin:round;stroke-width:3px;fill:none"/>
<ellipse class="cls-6" cx="16.061" cy="55.674" rx="1.768" ry="1.773"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -239,7 +239,8 @@
"description": "AccessTrade is an affiliate marketing platform based on the CPA model developed by Interspace Co.", "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']", "dom": "img[src*='.accesstrade.net'],img[data-src*='.accesstrade.net']",
"icon": "AccessTrade.png", "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": { "AccessiBe": {
"cats": [ "cats": [
@ -1741,7 +1742,7 @@
"saas": true, "saas": true,
"scriptSrc": [ "scriptSrc": [
"/amazonpayments(?:\\.min)?\\.js", "/amazonpayments(?:\\.min)?\\.js",
"\\.payments-amazon\\.com/OffAmazonPayments" "\\.payments-amazon\\.com/"
], ],
"website": "https://pay.amazon.com", "website": "https://pay.amazon.com",
"xhr": "payments\\.amazon\\.com" "xhr": "payments\\.amazon\\.com"
@ -2182,6 +2183,21 @@
}, },
"website": "https://www.apollographql.com" "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": { "ApostropheCMS": {
"cats": [ "cats": [
1 1
@ -2526,6 +2542,39 @@
"scriptSrc": "\\.iperceptions\\.com", "scriptSrc": "\\.iperceptions\\.com",
"website": "https://astutesolutions.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": { "Athena Search": {
"cats": [ "cats": [
29 29

@ -472,6 +472,27 @@
], ],
"website": "https://putyourlightson.com/plugins/blitz" "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": { "Blogger": {
"cats": [ "cats": [
11 11

@ -1655,6 +1655,21 @@
"website": "http://www.contentful.com", "website": "http://www.contentful.com",
"xhr": "cdn\\.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": { "Contentstack": {
"cats": [ "cats": [
1 1
@ -1898,6 +1913,15 @@
"implies": "PHP", "implies": "PHP",
"website": "http://coppermine-gallery.net" "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": { "Corebine": {
"cats": [ "cats": [
1 1
@ -2260,6 +2284,22 @@
"scriptSrc": "(?:cdn|app)\\.customily\\.com/", "scriptSrc": "(?:cdn|app)\\.customily\\.com/",
"website": "https://www.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": { "Cybersource": {
"cats": [ "cats": [
41 41

@ -30,6 +30,15 @@
}, },
"website": "https://derak.cloud" "website": "https://derak.cloud"
}, },
"DHL": {
"cats": [
99
],
"text": "\\bDHL\\b",
"icon": "DHL.svg",
"requiresCategory": 6,
"website": "https://www.dhl.com"
},
"DHTMLX": { "DHTMLX": {
"cats": [ "cats": [
59 59

@ -502,6 +502,22 @@
"icon": "Erlang.png", "icon": "Erlang.png",
"website": "http://www.erlang.org" "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": { "Essent SiteBuilder Pro": {
"cats": [ "cats": [
1, 1,
@ -733,6 +749,17 @@
], ],
"website": "https://extendthemes.com/highlight" "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": { "ExtJS": {
"cats": [ "cats": [
12 12
@ -1029,5 +1056,33 @@
"generator": "^experiencedCMS$" "generator": "^experiencedCMS$"
}, },
"website": "https://experiencedcms.berkearas.de" "website": "https://experiencedcms.berkearas.de"
},
"ElasticSuite": {
"cats": [
6,
29
],
"cookies": {
"STUID": "\\;confidence:50",
"STVID": "\\;confidence:50"
},
"html": [
"<input [^>]*Smile_Elasticsuite[^>]*>",
"<input [\\S\\s]*[^>]*(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"
} }
} }

@ -1175,5 +1175,22 @@
"icon": "futureshop.png", "icon": "futureshop.png",
"scriptSrc": "future-shop.*\\.js", "scriptSrc": "future-shop.*\\.js",
"website": "https://www.future-shop.jp" "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"
} }
} }

@ -277,6 +277,19 @@
"icon": "Gentoo.png", "icon": "Gentoo.png",
"website": "http://www.gentoo.org" "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": { "Gerrit": {
"cats": [ "cats": [
47 47
@ -906,20 +919,6 @@
}, },
"website": "http://code.google.com/p/google-code-prettify" "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": { "Google Font API": {
"cats": [ "cats": [
17 17

@ -547,7 +547,7 @@
"scriptSrc": [ "scriptSrc": [
"jquery", "jquery",
"/jquery(?:-(\\d+\\.\\d+\\.\\d+))[/.-]\\;version:\\1", "/jquery(?:-(\\d+\\.\\d+\\.\\d+))[/.-]\\;version:\\1",
"/(\\d+\\.\\d+\\.\\d+)/jquery[/.-]\\;version:\\1" "/(\\d+\\.\\d+\\.\\d+)/jquery[/.-][^u]\\;version:\\1"
], ],
"website": "https://jquery.com" "website": "https://jquery.com"
}, },

@ -32,6 +32,22 @@
], ],
"website": "https://www.kadencewp.com/kadence-theme" "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": { "KISSmetrics": {
"cats": [ "cats": [
10 10

@ -972,6 +972,22 @@
"scriptSrc": "loox\\.io/widget", "scriptSrc": "loox\\.io/widget",
"website": "https://loox.app" "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": { "Lotus Domino": {
"cats": [ "cats": [
22 22

@ -867,6 +867,24 @@
"scriptSrc": "\\.metrilo\\.com/", "scriptSrc": "\\.metrilo\\.com/",
"website": "https://www.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": { "Microsoft 365": {
"cats": [ "cats": [
30, 30,

@ -761,6 +761,22 @@
}, },
"website": "https://github.com/Sazito/phoenix/" "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": { "PhotoShelter": {
"cats": [ "cats": [
1, 1,

@ -375,6 +375,21 @@
"scriptSrc": "api\\.salesreps\\.io/", "scriptSrc": "api\\.salesreps\\.io/",
"website": "https://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": { "Salesfloor": {
"cats": [ "cats": [
5, 5,
@ -1340,6 +1355,9 @@
} }
}, },
"icon": "Shopify.svg", "icon": "Shopify.svg",
"js": {
"ShopifyPay.apiHost": ""
},
"scriptSrc": [ "scriptSrc": [
"cdn\\.shopify\\.com/shopifycloud/shopify_pay/" "cdn\\.shopify\\.com/shopifycloud/shopify_pay/"
], ],
@ -3629,6 +3647,22 @@
], ],
"website": "https://stylitics.com" "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": { "Subbly": {
"cats": [ "cats": [
6 6
@ -3908,26 +3942,6 @@
"scriptSrc": "swiper(?:\\.min)?\\.js", "scriptSrc": "swiper(?:\\.min)?\\.js",
"website": "https://swiperjs.com" "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": { "Sylius": {
"cats": [ "cats": [
6 6

@ -679,6 +679,21 @@
"implies": "PHP", "implies": "PHP",
"website": "http://www.thinkphp.cn" "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": { "Thinkific": {
"cats": [ "cats": [
21 21

@ -21,6 +21,21 @@
"scriptSrc": "w3counter\\.com/tracker\\.js", "scriptSrc": "w3counter\\.com/tracker\\.js",
"website": "http://www.w3counter.com" "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": { "WEBDEV": {
"cats": [ "cats": [
20 20
@ -113,6 +128,21 @@
], ],
"website": "https://wp-royal.com/themes/item-ashe-free" "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": { "WP-Statistics": {
"cats": [ "cats": [
10, 10,

@ -12,6 +12,7 @@ const Wappalyzer = {
technologies: [], technologies: [],
categories: [], categories: [],
requires: [], requires: [],
categoryRequires: [],
slugify: (string) => slugify: (string) =>
string string
@ -24,6 +25,9 @@ const Wappalyzer = {
[ [
...Wappalyzer.technologies, ...Wappalyzer.technologies,
...Wappalyzer.requires.map(({ technologies }) => technologies).flat(), ...Wappalyzer.requires.map(({ technologies }) => technologies).flat(),
...Wappalyzer.categoryRequires
.map(({ technologies }) => technologies)
.flat(),
].find(({ name: _name }) => name === _name), ].find(({ name: _name }) => name === _name),
getCategory: (id) => Wappalyzer.categories.find(({ id: _id }) => id === _id), getCategory: (id) => Wappalyzer.categories.find(({ id: _id }) => id === _id),
@ -205,6 +209,7 @@ const Wappalyzer = {
url, url,
xhr, xhr,
html, html,
text,
scripts, scripts,
css, css,
robots, robots,
@ -234,6 +239,7 @@ const Wappalyzer = {
oo(technology, 'url', url), oo(technology, 'url', url),
oo(technology, 'xhr', xhr), oo(technology, 'xhr', xhr),
oo(technology, 'html', html), oo(technology, 'html', html),
oo(technology, 'text', text),
oo(technology, 'scripts', scripts), oo(technology, 'scripts', scripts),
oo(technology, 'css', css), oo(technology, 'css', css),
oo(technology, 'robots', robots), oo(technology, 'robots', robots),
@ -269,6 +275,7 @@ const Wappalyzer = {
xhr, xhr,
dom, dom,
html, html,
text,
scripts, scripts,
css, css,
robots, robots,
@ -283,6 +290,7 @@ const Wappalyzer = {
implies, implies,
excludes, excludes,
requires, requires,
requiresCategory,
icon, icon,
website, website,
cpe, cpe,
@ -311,6 +319,7 @@ const Wappalyzer = {
false false
), ),
html: transform(html), html: transform(html),
text: transform(text),
scripts: transform(scripts), scripts: transform(scripts),
css: transform(css), css: transform(css),
certIssuer: transform(certIssuer), certIssuer: transform(certIssuer),
@ -329,6 +338,9 @@ const Wappalyzer = {
requires: transform(requires).map(({ value }) => ({ requires: transform(requires).map(({ value }) => ({
name: value, name: value,
})), })),
requiresCategory: transform(requiresCategory).map(({ value }) => ({
id: value,
})),
icon: icon || 'default.svg', icon: icon || 'default.svg',
website: website || null, website: website || null,
cpe: cpe || null, cpe: cpe || null,
@ -356,8 +368,27 @@ const Wappalyzer = {
technologies: Wappalyzer.requires[name], 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( Wappalyzer.technologies = Wappalyzer.technologies.filter(
({ requires }) => !requires.length ({ requires, requiresCategory }) =>
!requires.length && !requiresCategory.length
) )
}, },
@ -391,7 +422,11 @@ const Wappalyzer = {
return [] return []
} }
if (typeof patterns === 'string' || Array.isArray(patterns)) { if (
typeof patterns === 'string' ||
typeof patterns === 'number' ||
Array.isArray(patterns)
) {
patterns = { main: patterns } patterns = { main: patterns }
} }
@ -421,6 +456,7 @@ const Wappalyzer = {
) )
} else { } else {
const { value, regex, confidence, version } = pattern const { value, regex, confidence, version } = pattern
.toString()
.split('\\;') .split('\\;')
.reduce((attrs, attr, i) => { .reduce((attrs, attr, i) => {
if (i) { if (i) {
@ -431,7 +467,7 @@ const Wappalyzer = {
attrs[attr.shift()] = attr.join(':') attrs[attr.shift()] = attr.join(':')
} }
} else { } else {
attrs.value = attr attrs.value = typeof pattern === 'number' ? pattern : attr
// Escape slashes in regular expression // Escape slashes in regular expression
attrs.regex = new RegExp( attrs.regex = new RegExp(

@ -475,9 +475,9 @@ callsites@^3.0.0:
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
caniuse-lite@^1.0.30001219: caniuse-lite@^1.0.30001219:
version "1.0.30001228" version "1.0.30001271"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz"
integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== integrity sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA==
chalk@^2.0.0, chalk@^2.4.1: chalk@^2.0.0, chalk@^2.4.1:
version "2.4.2" version "2.4.2"