diff --git a/schema.json b/schema.json index 4dccf1808..829864074 100644 --- a/schema.json +++ b/schema.json @@ -268,7 +268,17 @@ ] }, "url": { - "$ref": "#/definitions/non-empty-non-blank-string" + "oneOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/non-empty-non-blank-string" + } + }, + { + "$ref": "#/definitions/non-empty-non-blank-string" + } + ] }, "website": { "$ref": "#/definitions/non-empty-non-blank-string" diff --git a/src/categories.json b/src/categories.json index 9aba087a7..af9ea823c 100644 --- a/src/categories.json +++ b/src/categories.json @@ -684,5 +684,12 @@ ], "name": "Shipping carriers", "priority": 9 + }, + "100": { + "groups": [ + 15 + ], + "name": "Shopify apps", + "priority": 9 } } \ No newline at end of file diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js index 254dd65e7..14102ad02 100644 --- a/src/drivers/npm/driver.js +++ b/src/drivers/npm/driver.js @@ -476,12 +476,23 @@ class Site { if (!this.browser) { await this.initDriver() + if (!this.browser) { throw new Error('Browser closed') } } - const page = await this.browser.newPage() + let page + + try { + page = await this.browser.newPage() + } catch (error) { + this.error(error) + + await this.initDriver() + + page = await this.browser.newPage() + } this.pages.push(page) @@ -632,13 +643,19 @@ class Site { // page.on('console', (message) => this.log(message.text())) // Cookies - const cookies = (await page.cookies()).reduce( - (cookies, { name, value }) => ({ - ...cookies, - [name.toLowerCase()]: [value], - }), - {} - ) + let cookies = [] + + try { + cookies = (await page.cookies()).reduce( + (cookies, { name, value }) => ({ + ...cookies, + [name.toLowerCase()]: [value], + }), + {} + ) + } catch (error) { + this.error(error) + } // HTML let html = await this.promiseTimeout(page.content(), '', 'Timeout (html)') @@ -707,7 +724,7 @@ class Site { page.evaluateHandle( () => // eslint-disable-next-line unicorn/prefer-text-content - document.body.innerText // .replace(/\s+/g, ' ').slice(0, 25000) + document.body && document.body.innerText ), { jsonValue: () => '' }, 'Timeout (text)' diff --git a/src/drivers/npm/package.json b/src/drivers/npm/package.json index ff912fb08..3f41db6ff 100644 --- a/src/drivers/npm/package.json +++ b/src/drivers/npm/package.json @@ -13,7 +13,7 @@ "software" ], "homepage": "https://www.wappalyzer.com/", - "version": "6.9.11", + "version": "6.9.12", "author": "Wappalyzer", "license": "MIT", "repository": { diff --git a/src/drivers/webextension/_locales/ca/messages.json b/src/drivers/webextension/_locales/ca/messages.json index 5a0a550fb..16a801e5b 100644 --- a/src/drivers/webextension/_locales/ca/messages.json +++ b/src/drivers/webextension/_locales/ca/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json index 4c034a066..86c67da90 100644 --- a/src/drivers/webextension/_locales/de/messages.json +++ b/src/drivers/webextension/_locales/de/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index 549bfd0cc..20519e45b 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -190,5 +190,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index eb97996b8..6deff3517 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -194,5 +194,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index c7ce8604e..3b2446b93 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json index 948b71a38..bc498ab65 100644 --- a/src/drivers/webextension/_locales/fa/messages.json +++ b/src/drivers/webextension/_locales/fa/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index 843e8886f..7ebc62e8e 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/gl_ES/messages.json b/src/drivers/webextension/_locales/gl_ES/messages.json index 22a3b68b9..3d4abfe72 100644 --- a/src/drivers/webextension/_locales/gl_ES/messages.json +++ b/src/drivers/webextension/_locales/gl_ES/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index f047ec055..a630bc825 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -192,5 +192,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json index 852e66e0a..45d516c7c 100644 --- a/src/drivers/webextension/_locales/id/messages.json +++ b/src/drivers/webextension/_locales/id/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index 122897fa7..c885c13f7 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/ja/messages.json b/src/drivers/webextension/_locales/ja/messages.json index 123633e41..9aa4db3f2 100644 --- a/src/drivers/webextension/_locales/ja/messages.json +++ b/src/drivers/webextension/_locales/ja/messages.json @@ -194,5 +194,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/ko/messages.json b/src/drivers/webextension/_locales/ko/messages.json index 7ebd6686b..9c407ec1a 100644 --- a/src/drivers/webextension/_locales/ko/messages.json +++ b/src/drivers/webextension/_locales/ko/messages.json @@ -194,5 +194,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/nl/messages.json b/src/drivers/webextension/_locales/nl/messages.json index 47f799acf..987001d95 100644 --- a/src/drivers/webextension/_locales/nl/messages.json +++ b/src/drivers/webextension/_locales/nl/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index 38cf0116c..2c63b4106 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json index b21d0afc1..78062485a 100644 --- a/src/drivers/webextension/_locales/pt/messages.json +++ b/src/drivers/webextension/_locales/pt/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json index 3db7910b4..884cc6291 100644 --- a/src/drivers/webextension/_locales/pt_BR/messages.json +++ b/src/drivers/webextension/_locales/pt_BR/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index c0174593d..10878cfdf 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -192,5 +192,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json index ff30dab0d..08ad68aa5 100644 --- a/src/drivers/webextension/_locales/ru/messages.json +++ b/src/drivers/webextension/_locales/ru/messages.json @@ -191,8 +191,9 @@ "categoryName93": { "message": "Резервирование & доставка" }, "categoryName94": { "message": "Реферальный маркетинг" }, "categoryName95": { "message": "Управление цифровыми активами" }, - "categoryName96": { "message": "Content curation" }, - "categoryName97": { "message": "Customer data platform" }, + "categoryName96": { "message": "Курирование контента" }, + "categoryName97": { "message": "Платформа клиентских данных" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Службы доставки" }, + "categoryName100": { "message": "Приложении для Shopify" } } diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json index 7747809ae..ba8d64a79 100644 --- a/src/drivers/webextension/_locales/sk/messages.json +++ b/src/drivers/webextension/_locales/sk/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json index f53239f72..c84302a34 100644 --- a/src/drivers/webextension/_locales/tr/messages.json +++ b/src/drivers/webextension/_locales/tr/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json index 4e84f21f4..119d55c96 100644 --- a/src/drivers/webextension/_locales/uk/messages.json +++ b/src/drivers/webextension/_locales/uk/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json index 4db8be9db..b02908d55 100644 --- a/src/drivers/webextension/_locales/uz/messages.json +++ b/src/drivers/webextension/_locales/uz/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/zh_CN/messages.json b/src/drivers/webextension/_locales/zh_CN/messages.json index 38f96bbf2..d66693164 100644 --- a/src/drivers/webextension/_locales/zh_CN/messages.json +++ b/src/drivers/webextension/_locales/zh_CN/messages.json @@ -192,5 +192,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json index 9e82cebc6..79ae1ce51 100644 --- a/src/drivers/webextension/_locales/zh_TW/messages.json +++ b/src/drivers/webextension/_locales/zh_TW/messages.json @@ -196,5 +196,6 @@ "categoryName96": { "message": "Content curation" }, "categoryName97": { "message": "Customer data platform" }, "categoryName98": { "message": "Cart abandonment" }, - "categoryName99": { "message": "Shipping carriers" } + "categoryName99": { "message": "Shipping carriers" }, + "categoryName100": { "message": "Shopify apps" } } diff --git a/src/drivers/webextension/images/icons/8base-logo.png b/src/drivers/webextension/images/icons/8base-logo.png new file mode 100644 index 000000000..c9bcb2517 Binary files /dev/null and b/src/drivers/webextension/images/icons/8base-logo.png differ diff --git a/src/drivers/webextension/images/icons/ADFOX.svg b/src/drivers/webextension/images/icons/ADFOX.svg new file mode 100644 index 000000000..9f2c0322c --- /dev/null +++ b/src/drivers/webextension/images/icons/ADFOX.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/drivers/webextension/images/icons/Adnegah.png b/src/drivers/webextension/images/icons/Adnegah.png new file mode 100644 index 000000000..5369d8f71 Binary files /dev/null and b/src/drivers/webextension/images/icons/Adnegah.png differ diff --git a/src/drivers/webextension/images/icons/Adzerk.png b/src/drivers/webextension/images/icons/Adzerk.png deleted file mode 100644 index f16159bc0..000000000 Binary files a/src/drivers/webextension/images/icons/Adzerk.png and /dev/null differ diff --git a/src/drivers/webextension/images/icons/Affilae.png b/src/drivers/webextension/images/icons/Affilae.png new file mode 100644 index 000000000..2201fd7ab Binary files /dev/null and b/src/drivers/webextension/images/icons/Affilae.png differ diff --git a/src/drivers/webextension/images/icons/Asana.svg b/src/drivers/webextension/images/icons/Asana.svg new file mode 100644 index 000000000..3d3c7c7a0 --- /dev/null +++ b/src/drivers/webextension/images/icons/Asana.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/drivers/webextension/images/icons/Astro.svg b/src/drivers/webextension/images/icons/Astro.svg new file mode 100644 index 000000000..9c1ced0bb --- /dev/null +++ b/src/drivers/webextension/images/icons/Astro.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/drivers/webextension/images/icons/Boost Commerce.png b/src/drivers/webextension/images/icons/Boost Commerce.png new file mode 100644 index 000000000..1f290ed36 Binary files /dev/null and b/src/drivers/webextension/images/icons/Boost Commerce.png differ diff --git a/src/drivers/webextension/images/icons/Hamechio.svg b/src/drivers/webextension/images/icons/Hamechio.svg new file mode 100644 index 000000000..840d849dc --- /dev/null +++ b/src/drivers/webextension/images/icons/Hamechio.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/drivers/webextension/images/icons/Imber.png b/src/drivers/webextension/images/icons/Imber.png new file mode 100644 index 000000000..66fedd09e Binary files /dev/null and b/src/drivers/webextension/images/icons/Imber.png differ diff --git a/src/drivers/webextension/images/icons/Kevel.svg b/src/drivers/webextension/images/icons/Kevel.svg new file mode 100644 index 000000000..2ca9fef90 --- /dev/null +++ b/src/drivers/webextension/images/icons/Kevel.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/drivers/webextension/images/icons/MDUI.png b/src/drivers/webextension/images/icons/MDUI.png new file mode 100644 index 000000000..42724c7f5 Binary files /dev/null and b/src/drivers/webextension/images/icons/MDUI.png differ diff --git a/src/drivers/webextension/images/icons/Rotic.svg b/src/drivers/webextension/images/icons/Rotic.svg new file mode 100644 index 000000000..1f4562184 --- /dev/null +++ b/src/drivers/webextension/images/icons/Rotic.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/drivers/webextension/images/icons/Sellsy.svg b/src/drivers/webextension/images/icons/Sellsy.svg new file mode 100644 index 000000000..29bf7baa6 --- /dev/null +++ b/src/drivers/webextension/images/icons/Sellsy.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/drivers/webextension/images/icons/VAPTCHA.svg b/src/drivers/webextension/images/icons/VAPTCHA.svg new file mode 100644 index 000000000..0ebe9270b --- /dev/null +++ b/src/drivers/webextension/images/icons/VAPTCHA.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/drivers/webextension/images/icons/adnegah.png b/src/drivers/webextension/images/icons/adnegah.png deleted file mode 100644 index 360efa8e7..000000000 Binary files a/src/drivers/webextension/images/icons/adnegah.png and /dev/null differ diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index ef096ee69..01d35d3ee 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -201,6 +201,34 @@ function parseEmail(fullEmail) { return { email, name, title } } +function getTechnologySpend(technologies) { + const totals = technologies.reduce( + (totals, { pricing }) => { + pricing.forEach((price) => totals[price]++) + + return totals + }, + { low: 0, poa: 0, mid: 0, high: 0 } + ) + + totals.mid += Math.floor(totals.low / 3) + totals.high += Math.floor(totals.poa / 2) + totals.high += Math.floor(totals.mid / 3) + totals.xhigh = Math.floor(totals.high / 3) + + const spend = totals.xhigh + ? 'Very high' + : totals.high + ? 'High' + : totals.mid + ? 'Medium' + : totals.low + ? 'Low' + : 'Very low' + + return spend +} + const Popup = { /** * Initialise popup @@ -697,6 +725,14 @@ const Popup = { const { attributes, creditsRemaining, crawl } = data + if (Popup.cache.detections.length) { + attributes.signals = attributes.signals || [] + + attributes.signals.technologySpend = getTechnologySpend( + Popup.cache.detections + ) + } + el.creditsRemaining.textContent = parseInt( creditsRemaining || 0, 10 @@ -766,11 +802,20 @@ const Popup = { a.href = value.to a.textContent = value.text - if (['email', 'verifiedEmail', 'safeEmail'].includes(key)) { + if (key === 'keywords') { + a.style = 'padding-right: .3rem;' + + const space = document.createTextNode(' ') + + td.append(a, space) + } else if ( + ['email', 'verifiedEmail', 'safeEmail'].includes(key) + ) { const { email, name, title } = parseEmail(value.text) a.textContent = email + const div = document.createElement('div') const elName = document.createElement('span') const elTitle = document.createElement('span') const elBreak1 = document.createElement('br') @@ -781,17 +826,19 @@ const Popup = { elTitle.className = 'light-text' - td.appendChild(a) + div.append(a) - if (name) { - td.appendChild(elBreak1) - td.appendChild(elName) + if (name && name !== email) { + div.appendChild(elBreak1) + div.appendChild(elName) if (title) { - td.appendChild(elBreak2) - td.appendChild(elTitle) + div.appendChild(elBreak2) + div.appendChild(elTitle) } } + + td.append(div) } else { div.appendChild(a) td.appendChild(div) diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 7c61aa625..bb840fc02 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -4,7 +4,7 @@ "author": "Wappalyzer", "homepage_url": "https://www.wappalyzer.com/", "description": "Identify web technologies", - "version": "6.9.11", + "version": "6.9.12", "default_locale": "en", "manifest_version": 2, "icons": { diff --git a/src/package.json b/src/package.json index 97fa304c1..54c2b2190 100644 --- a/src/package.json +++ b/src/package.json @@ -13,7 +13,7 @@ "software" ], "homepage": "https://www.wappalyzer.com/", - "version": "6.9.11", + "version": "6.9.12", "author": "Wappalyzer", "license": "MIT", "repository": { diff --git a/src/technologies/_.json b/src/technologies/_.json index dfadb447e..3ccfb80e6 100644 --- a/src/technologies/_.json +++ b/src/technologies/_.json @@ -116,6 +116,20 @@ "scriptSrc": "4tellcdn\\.azureedge\\.net", "website": "https://4-tell.com" }, + "8base": { + "cats": [ + 3, 62 + ], + "description": "8base is a Backend-as-a-Service. It lets front-end developers focus more on what they love and backend developers expedite their workflow", + "icon": "8base-logo.png", + "pricing": [ + "low", "freemium", "recurring" + ], + "saas": true, + "requires": ["GraphQL"], + "website": "https://8base.com", + "xhr": "api\\.8base\\.com" + }, "@sulu/web": { "cats": [ 59 @@ -126,4 +140,4 @@ }, "website": "https://github.com/sulu/web-js" } -} \ No newline at end of file +} diff --git a/src/technologies/a.json b/src/technologies/a.json index fe979d072..133e24f0c 100644 --- a/src/technologies/a.json +++ b/src/technologies/a.json @@ -610,12 +610,19 @@ }, "pricing": [ "low", - "recurring" + "recurring", + "poa" ], "saas": true, "scriptSrc": [ "plugins/activecampaign-subscription-forms/site_tracking\\.js", - "\\.activehosted\\.com/" + "\\.activehosted\\.com", + "\\.app-us1\\.com", + "\\.ac-page\\.com" + ], + "url": [ + "\\.activehosted\\.com", + "\\.ac-page\\.com" ], "website": "https://www.activecampaign.com" }, @@ -713,12 +720,20 @@ "cats": [ 36 ], - "html": "(?:]+(?:src=\"https?://mh\\d?\\.adriver\\.ru/|flashvars=\"[^\"]*(?:http:%3A//(?:ad|mh\\d?)\\.adriver\\.ru/|adriver_banner))|<(?:(?:iframe|img)[^>]+src|a[^>]+href)=\"https?://ad\\.adriver\\.ru/)", + "description": "AdRiver is a company which provide internet advertising management and audit software.", "icon": "AdRiver.png", + "dom": "link[href*='.adriver.ru'], img[src*='.adriver.ru'], iframe[src*='.adriver.ru']", "js": { - "adriver": "" + "adriver": "", + "AdriverCounter": "", + "AdriverPrebid": "", + "adfoxBiddersMap.adriver": "" }, - "scriptSrc": "(?:adriver\\.core\\.\\d\\.js|https?://(?:content|ad|masterh\\d)\\.adriver\\.ru/)", + "scriptSrc": "\\.adriver\\.ru/", + "saas": true, + "pricing": [ + "payg" + ], "website": "http://adriver.ru" }, "AdRoll": { @@ -973,6 +988,26 @@ "scriptSrc": "\\.adform\\.net/", "website": "https://site.adform.com" }, + "ADFOX": { + "cats": [ + 36 + ], + "description": "ADFOX is an advertising management platform for media publishers.", + "icon": "ADFOX.svg", + "js": { + "Site.adFoxParams": "", + "adfoxAsyncParams": "", + "AdFox_getCodeScript": "", + "adfoxBiddersMap": "", + "adFoxParams": "" + }, + "pricing": [ + "mid", + "recurring" + ], + "saas": true, + "website": "https://adfox.yandex.ru" + }, "Adloox": { "cats": [ 36 @@ -1058,13 +1093,14 @@ "cats": [ 36 ], + "description": "Adnegah is a digital marketing and internet advertising agency.", + "icon": "Adnegah.png", + "dom": "iframe[scr*='adnegah.net']", "headers": { "X-Advertising-By": "adnegah\\.net" }, - "html": "]*src=\"[^\"]+adnegah\\.net", - "icon": "adnegah.png", - "scriptSrc": "[^a-z]adnegah.*\\.js$", - "website": "https://Adnegah.net" + "scriptSrc": "\\.adnegah\\.net/", + "website": "https://adnegah.net" }, "Adobe Analytics": { "cats": [ @@ -1312,9 +1348,14 @@ "cats": [ 36 ], - "html": "]*src=\"[^\"]+adzerk\\.net", - "icon": "Adzerk.png", - "js": { - "ados": "", - "adosResults": "" - }, - "scriptSrc": "adzerk\\.net/ados\\.js", - "website": "http://adzerk.com" - }, "Aegea": { "cats": [ 11 @@ -1370,6 +1398,20 @@ "saas": true, "website": "https://www.aerocommerce.com" }, + "Affilae": { + "cats": [ + 71 + ], + "description": "Affilae is an affiliate marketing platform that enables brands to connect, collaborate with influencers and affiliates.", + "icon": "Affilae.png", + "scriptSrc": "static\\.affilae\\.com/(?:.+v([\\d\\.]+)|.+)?\\.js\\;version:\\1", + "saas": true, + "pricing": [ + "mid", + "recurring" + ], + "website": "https://affilae.com" + }, "Affiliate B": { "cats": [ 71, @@ -1794,7 +1836,8 @@ }, "Ali Reviews": { "cats": [ - 90 + 90, + 100 ], "description": "Ali reviews is a shopify app to collect reviews from customers.", "icon": "Alireviews.svg", @@ -2990,6 +3033,26 @@ "scriptSrc": "themes/astra\\S*\\.js(?:\\?ver=([0-9.]+))?\\;version:\\1", "website": "https://wpastra.com/" }, + "Astro": { + "cats": [ + 57, + 12 + ], + "description": "Astro is a new JavaScript-based static site builder.", + "icon": "Astro.svg", + "dom": { + "link[href*='/_astro/']": { + "attributes": { + "href": "/_astro/(?:common|index)-[\\d\\w]+\\.css" + } + } + }, + "oss": true, + "pricing": [ + "freemium" + ], + "website": "https://astro.build" + }, "Astra Widgets": { "cats": [ 87, @@ -3672,5 +3735,15 @@ "icon": "augmented-ui.png", "oss": true, "website": "http://augmented-ui.com" + }, + "Asana": { + "cats": [ + 13 + ], + "description": "Asana is a web and mobile application designed to help teams organize, track, and manage their work.", + "dom": "a[href*='form.asana.com'], a[href*='app.asana.com']", + "icon": "Asana.svg", + "saas": true, + "website": "https://asana.com" } -} \ No newline at end of file +} diff --git a/src/technologies/b.json b/src/technologies/b.json index e3138a491..b98fc18f7 100644 --- a/src/technologies/b.json +++ b/src/technologies/b.json @@ -1001,6 +1001,25 @@ "oss": true, "website": "https://akamai.github.io/boomerang" }, + "Boost Commerce": { + "cats": [ + 29, + 100 + ], + "description": "Boost Commerce provides beautiful and advanced product filter and smart site search for Shopify stores to boost sales.", + "icon": "Boost Commerce.png", + "requires": "Shopify", + "js": { + "bcSfFilterConfig.api.filterUrl": "services\\.mybcapps\\.com/", + "boostPFSAppConfig.api.filterUrl": "services\\.mybcapps\\.com/" + }, + "saas": true, + "pricing": [ + "payg", + "recurring" + ], + "website": "https://boostcommerce.net" + }, "Bootstrap": { "cats": [ 66 diff --git a/src/technologies/c.json b/src/technologies/c.json index 864332c0f..7a347a475 100644 --- a/src/technologies/c.json +++ b/src/technologies/c.json @@ -2415,7 +2415,8 @@ }, "Covet.pics": { "cats": [ - 5 + 5, + 100 ], "description": "Covet.pics is a customizable Shopify app for Instagram and Lookbook shoppable galleries.", "icon": "Covet.pics.svg", diff --git a/src/technologies/d.json b/src/technologies/d.json index 940e7ba2e..90ca52195 100644 --- a/src/technologies/d.json +++ b/src/technologies/d.json @@ -1127,7 +1127,8 @@ "driftt": "" }, "pricing": [ - "poa" + "poa", + "mid" ], "saas": true, "website": "https://www.drift.com/" @@ -1338,4 +1339,4 @@ "scriptSrc": "deepMiner\\.js", "website": "https://github.com/deepwn/deepMiner" } -} \ No newline at end of file +} diff --git a/src/technologies/h.json b/src/technologies/h.json index d1a4ee69c..3e30ce2a0 100644 --- a/src/technologies/h.json +++ b/src/technologies/h.json @@ -82,6 +82,22 @@ "scriptSrc": "haddock-util\\.js", "website": "http://www.haskell.org/haddock/" }, + "Hamechio": { + "cats": [ + 18 + ], + "description": "Hamechio is a web application framework.", + "icon": "Hamechio.svg", + "implies": "PHP", + "meta": { + "generator": "hamech\\.io/" + }, + "oss": true, + "pricing": [ + "freemium" + ], + "website": "https://hamech.io" + }, "Halo": { "cats": [ 1, @@ -817,6 +833,8 @@ "_hsq": "", "hubspot": "" }, + "pricing": ["recurring", "high"], + "saas": true, "website": "https://www.hubspot.com" }, "HubSpot Analytics": { @@ -1122,4 +1140,4 @@ "scriptSrc": "merchant\\.cdn\\.hoolah\\.co/", "website": "https://www.hoolah.co" } -} \ No newline at end of file +} diff --git a/src/technologies/i.json b/src/technologies/i.json index 127965ac3..1fe28b33a 100644 --- a/src/technologies/i.json +++ b/src/technologies/i.json @@ -208,6 +208,25 @@ "scriptSrc": "/wp-content/plugins/nextgen-gallery(?:-pro|-plus)?/", "website": "https://www.imagely.com/wordpress-gallery-plugin" }, + "Imber": { + "cats": [ + 52 + ], + "description": "Imber is an all-in-one marketing automation platform built for customer support (live chat), sales, and marketing.", + "icon": "Imber.png", + "js": { + "IMBER_ID": "", + "$imber.getVisitor": "", + "IMBER_SOCKET": "" + }, + "saas": true, + "pricing": [ + "freemium", + "low", + "recurring" + ], + "website": "https://imber.live" + }, "Immutable.js": { "cats": [ 59 diff --git a/src/technologies/k.json b/src/technologies/k.json index 8f7f0ad18..f7f937082 100644 --- a/src/technologies/k.json +++ b/src/technologies/k.json @@ -330,6 +330,24 @@ "implies": "Microsoft ASP.NET", "website": "https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel" }, + "Kevel": { + "cats": [ + 36 + ], + "description": "Kevel (formerly Adzerk) is a developer of ad-serving APIs to help developers build server-side ad platforms.", + "icon": "Kevel.svg", + "dom": "iframe[src*='adzerk.net'], link[href*='adzerk.net']", + "js": { + "ados": "", + "adosResults": "" + }, + "scriptSrc": "adzerk\\.net/", + "saas": true, + "pricing": [ + "poa" + ], + "website": "https://www.kevel.com" + }, "KeyCDN": { "cats": [ 31 diff --git a/src/technologies/m.json b/src/technologies/m.json index 9622bebc2..13c1efb65 100644 --- a/src/technologies/m.json +++ b/src/technologies/m.json @@ -710,6 +710,22 @@ }, "website": "https://maxemail.xtremepush.com" }, + "MDUI": { + "cats": [ + 66 + ], + "description": "MDUI is a CSS Framework based on material design.", + "icon": "MDUI.png", + "js": { + "mdui.Drawer": "", + "_mduiEventId": "" + }, + "oss": true, + "pricing": [ + "freemium" + ], + "website": "https://www.mdui.org" + }, "Medallia": { "cats": [ 10, diff --git a/src/technologies/r.json b/src/technologies/r.json index b9506fb0a..0234ff451 100644 --- a/src/technologies/r.json +++ b/src/technologies/r.json @@ -554,7 +554,8 @@ }, "RecoverMyCart": { "cats": [ - 76 + 76, + 100 ], "description": "RecoverMyCart is a shopify app for abandoned basket recovery.", "icon": "RecoverMyCart.png", @@ -1359,6 +1360,22 @@ ], "website": "https://rollbar.com/" }, + "Rotic": { + "cats": [ + 52 + ], + "description": "Rotic is a conversion chatbot that answers questions, captures contacts, and books meetings.", + "icon": "Rotic.svg", + "js": { + "Rotic.setting": "" + }, + "saas": true, + "pricing": [ + "low", + "recurring" + ], + "website": "https://rotic.ir" + }, "RoundCube": { "cats": [ 30 diff --git a/src/technologies/s.json b/src/technologies/s.json index 05c38c99a..af46487c0 100644 --- a/src/technologies/s.json +++ b/src/technologies/s.json @@ -1120,6 +1120,23 @@ "scriptSrc": "cdn\\.sellix\\.io/static/js/embed\\.js", "website": "https://sellix.io/" }, + "Sellsy": { + "cats": [ + 53 + ], + "description": "Sellsy is a cloud-based sales management solution for small to midsize businesses", + "icon": "Sellsy.svg", + "js": { + "SellsySnippet": "" + }, + "pricing": [ + "payg", + "recurring" + ], + "saas": true, + "scriptSrc": "\\.sellsy\\.com/", + "website": "https://go.sellsy.com" + }, "Selly": { "cats": [ 6 diff --git a/src/technologies/t.json b/src/technologies/t.json index b132fc18f..5458eefc7 100644 --- a/src/technologies/t.json +++ b/src/technologies/t.json @@ -1190,7 +1190,8 @@ }, "Thimatic": { "cats": [ - 90 + 90, + 100 ], "description": "Thimatic is a Shopify app for product reviews.", "icon": "Thimatic.png", diff --git a/src/technologies/v.json b/src/technologies/v.json index c3bf6fb80..bd9691431 100644 --- a/src/technologies/v.json +++ b/src/technologies/v.json @@ -159,6 +159,23 @@ "implies": "PHP", "website": "http://vanillaforums.org" }, + "VAPTCHA": { + "cats": [ + 16 + ], + "description": "VAPTCHA is the abbreviation of (Variation Analysis based Public Turing Test to Tell Computers and Humans Apart), also known as gesture verification code, is a human-machine verification solution based on artificial intelligence and big data.", + "icon": "VAPTCHA.svg", + "js": { + "vaptcha": "" + }, + "scriptSrc": "\\.vaptcha\\.com/v([\\d\\.]+)\\.js\\;version:\\1", + "saas": true, + "pricing": [ + "poa", + "freemium" + ], + "website": "https://en.vaptcha.com" + }, "Varbase": { "cats": [ 1 diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 6f1f861c2..65bbae6c0 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -140,7 +140,7 @@ const Wappalyzer = { .sort((a, b) => (priority(a) > priority(b) ? 1 : -1)) .map( ({ - technology: { name, slug, categories, icon, website, cpe }, + technology: { name, slug, categories, icon, website, pricing, cpe }, confidence, version, lastUrl, @@ -152,6 +152,7 @@ const Wappalyzer = { version, icon, website, + pricing, cpe, lastUrl, }) @@ -340,6 +341,7 @@ const Wappalyzer = { requiresCategory, icon, website, + pricing, cpe, } = data[name] @@ -390,6 +392,7 @@ const Wappalyzer = { })), icon: icon || 'default.svg', website: website || null, + pricing: pricing || [], cpe: cpe || null, })