From daa805f4f478cf7cf42a37ee2ed6bed01c100867 Mon Sep 17 00:00:00 2001 From: wanhose Date: Fri, 18 Oct 2024 16:18:52 +0200 Subject: [PATCH] refactor(database): improve naming to add exclude_matches to it --- README.md | 2 +- database.json | 713 +++++++++++---------- packages/api/src/index.ts | 6 + packages/api/src/routes/v2/data.ts | 19 +- packages/api/src/routes/v3/data.ts | 13 +- packages/api/src/routes/v4/data.ts | 25 +- packages/api/src/routes/v6/data.ts | 39 ++ packages/api/src/routes/v6/issues.ts | 1 + packages/api/src/routes/v6/report.ts | 1 + packages/api/src/services/compatibility.ts | 33 +- 10 files changed, 462 insertions(+), 390 deletions(-) create mode 100644 packages/api/src/routes/v6/data.ts create mode 100644 packages/api/src/routes/v6/issues.ts create mode 100644 packages/api/src/routes/v6/report.ts diff --git a/README.md b/README.md index 38c565a..cfd6245 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ # Cookie Dialog Monster -Cookie Dialog Monster is a browser extension that hides cookie consent dialogs without changing user preferences. By default, we do NOT accept cookies (except in [a few cases](https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/database.json#L248) where the pages do not function without accepting them). You can report broken sites with a single click, which will create an issue in this repository to be fixed promptly. +Cookie Dialog Monster is a browser extension that hides cookie consent dialogs without changing user preferences. By default, we do NOT accept cookies (except in [a few cases](https://git.wanhose.dev/wanhose/cookie-dialog-monster/src/branch/main/database.json) where the pages do not function without accepting them). You can report broken sites with a single click, which will create an issue in this repository to be fixed promptly. ## Contributing diff --git a/database.json b/database.json index 8436145..349a2ae 100644 --- a/database.json +++ b/database.json @@ -1,547 +1,257 @@ { - "commonWords": [ - "ablehnen", - "accept", - "accepta", - "accepter", - "accettare", - "accordo", - "aceitar", - "aceptar", - "acuerdo", - "advertising", - "agree", - "akzeptieren", - "analitica", - "analítica", - "analitice", - "analityka", - "analyse", - "analytics", - "analytique", - "baner", - "banner", - "bannière", - "cc", - "cerrar", - "chiudere", - "close", - "cmp", - "compliance", - "concordar", - "confidențialitate", - "confidentialité", - "configuraciones", - "configurações", - "conformidade", - "conformità", - "conformitate", - "conformité", - "consenso", - "consent", - "consentement", - "consentimento", - "consentimiento", - "consimțământ", - "cookie", - "cumplimiento", - "d'accord", - "dados", - "dane", - "data", - "date", - "daten", - "datenschutz", - "dati", - "datos", - "de acord", - "declinar", - "declinare", - "decline", - "décliner", - "déni", - "descargo de responsabilidad", - "desempenho", - "dialog", - "dialogo", - "diálogo", - "dialogue", - "disclaimer", - "disconoscimento", - "données", - "dritte", - "einstellungen", - "einwilligung", - "fechar", - "fermer", - "fonctionnel", - "funcional", - "functional", - "funcțional", - "funkcjonalny", - "funktional", - "funzionale", - "gdpr", - "gerenciar", - "gérer", - "gesetz", - "gestiona", - "gestionar", - "gestire", - "guardar", - "haftungsausschluss", - "impostazioni", - "închide", - "informação", - "información", - "informacja", - "informații", - "information", - "informazione", - "isenção de responsabilidade", - "konformität", - "konieczny", - "law", - "lege", - "legge", - "lei", - "leistung", - "ley", - "loi", - "manage", - "necesar", - "necesario", - "nécessaire", - "necessario", - "necessário", - "necessary", - "notwendig", - "nutzung", - "odmówić", - "odrzucić", - "opcional", - "opcjonalny", - "optional", - "opțional", - "optionnel", - "opzionale", - "paramètres", - "performance", - "performanță", - "personalisierung", - "personalização", - "personalización", - "personalizacja", - "personalizare", - "personalization", - "personalizzazione", - "personnalisation", - "policy", - "politica", - "politică", - "política", - "politik", - "politique", - "polityka", - "popup", - "präferenzen", - "prawo", - "preferences", - "préférences", - "preferencias", - "preferências", - "preferencje", - "preferenze", - "preferințe", - "prestazioni", - "privacidad", - "privacidade", - "privacy", - "prywatność", - "pubblicità", - "publicidad", - "publicidade", - "publicitate", - "publicité", - "rastreamento", - "rechazar", - "refuza", - "reject", - "rejeitar", - "rejeter", - "reklama", - "rendimiento", - "respinge", - "rifiutare", - "salva", - "salvar", - "salvare", - "sauvegarder", - "save", - "schließen", - "seguimiento", - "setări", - "settings", - "śledzenie", - "speichern", - "strona trzecia", - "suivi", - "terceiro", - "tercero", - "terță parte", - "terza parte", - "third-party", - "tiers", - "tracciamento", - "tracking", - "urmărire", - "usage", - "uso", - "ustawienia", - "utilisation", - "utilizare", - "użycie", - "verfolgung", - "verwalten", - "werbung", - "wydajność", - "zaakceptować", - "zamknij", - "zapisz", - "zarządzać", - "zgoda", - "zgodność", - "zgodzić się", - "zrzeczenie się", - "zustimmen", - "аналитика", - "баннер", - "всплывающее окно", - "данные", - "диалог", - "закон", - "закрыть", - "информация", - "использование", - "конфиденциальность", - "настройки", - "необходимо", - "опционально", - "отказ", - "отказаться", - "отклонить", - "отслеживание", - "персонализация", - "политика", - "предпочтения", - "принять", - "производительность", - "реклама", - "согласен", - "согласие", - "соответствие", - "сохранить", - "третья сторона", - "управлять", - "функциональный" - ], - "fixes": [ + "actions": [ { - "action": "click", "domain": "action.com", + "name": "click", "selector": "#CybotCookiebotDialogBodyLevelButtonLevelOptinDeclineAll" }, { - "action": "resetAll", "domain": "automobielmanagement.nl", + "name": "resetAll", "property": "filter", "selector": "body > *" }, { - "action": "click", "domain": "bilbaomuseoa.eus", + "name": "click", "selector": ".alert_message .btn-confirm" }, { - "action": "resetAll", "domain": "breitbart.com", + "name": "resetAll", "property": "display", "selector": ".twitter-tweet" }, { - "action": "resetAll", "domain": "breitbart.com", + "name": "resetAll", "property": "visibility", "selector": ".twitter-tweet" }, { - "action": "click", "domain": "buscotelefonosgratis.es", + "name": "click", "selector": "#cookie_action_close_header_reject" }, { - "action": "click", "domain": "chollometro.com", + "name": "click", "selector": "[data-t=\"continueWithoutAccepting\"]" }, { - "action": "click", "domain": "classicube.net", + "name": "click", "selector": "#acceptcookies" }, { - "action": "click", "domain": "compact-online.de", + "name": "click", "selector": "[id*=\"bnnr-body-rightSide-\"] div + div > span" }, { - "action": "click", "domain": "consent.google", + "name": "click", "selector": "[aria-label=\"Alle ablehnen\"], [aria-label=\"Odrzuć wszystko\"], [aria-label=\"Rechazar todo\"], [aria-label=\"Recusar tudo\"], [aria-label=\"Reject all\"], [aria-label=\"Rejeitar tudo\"], [aria-label=\"Respinge tot\"], [aria-label=\"Rifiuta tutto\"], [aria-label=\"Tout refuser\"], [aria-label=\"Отклонить все\"]" }, { - "action": "click", "domain": "consent.yahoo", + "name": "click", "selector": ".reject-all" }, { - "action": "click", "domain": "consent.youtube", + "name": "click", "selector": "[aria-label=\"Alle ablehnen\"], [aria-label=\"Odrzuć wszystko\"], [aria-label=\"Rechazar todo\"], [aria-label=\"Recusar tudo\"], [aria-label=\"Reject all\"], [aria-label=\"Rejeitar tudo\"], [aria-label=\"Respinge tot\"], [aria-label=\"Rifiuta tutto\"], [aria-label=\"Tout refuser\"], [aria-label=\"Отклонить все\"]" }, { - "action": "click", "domain": "dailymotion.com", + "name": "click", "selector": "[aria-label=\"Continue without accepting\"]" }, { - "action": "click", "domain": "dealabs.com", + "name": "click", "selector": "[data-t=\"continueWithoutAccepting\"]" }, { - "action": "click", "domain": "derstandard", + "name": "click", "selector": "[aria-label=\"Einverstanden\"]" }, { - "action": "click", "domain": "fiberplane.dev", + "name": "click", "selector": "button[aria-label=\"Close Banner\"]" }, { - "action": "click", "domain": "foto-erhardt.de", + "name": "click", "selector": "[class=\"modal show\"]" }, { - "action": "reset", "domain": "gamestar.de", + "name": "reset", "property": "filter", "selector": "#content" }, { - "action": "click", "domain": "gettr.com", + "name": "click", "selector": "button.bold" }, { - "action": "click", "domain": "gib-uns-deinen-gebrauchten.de", + "name": "click", "selector": "#cookie-banner-accept-selected-button" }, { - "action": "click", "domain": "gmx.com", + "name": "click", "selector": "#onetrust-accept-btn-handler" }, { - "action": "click", "domain": "gmx.net", + "name": "click", "selector": "[data-id=\"save-all-pur\"]" }, { - "action": "click", "domain": "golem.de", + "name": "click", "selector": "[title=\"Zustimmen und weiter\"]" }, { - "action": "click", "domain": "google", + "name": "click", "selector": "[aria-modal=\"true\"][role=\"dialog\"]:has([href*=\"policies.google.com/technologies/cookies\"]) button:not([aria-label]):not([role=\"link\"])" }, { - "action": "click", "domain": "hagglezon.com", + "name": "click", "selector": "[data-test=\"cookie-submit\"]" }, { - "action": "click", "domain": "instagram.com", + "name": "click", "selector": "[role=\"dialog\"] > [style=\"display: flex; flex-direction: column; height: 100%; max-width: 100%;\"] > button" }, { - "action": "click", "domain": "motorolasound.com", + "name": "click", "selector": "#cookie-btn-denied" }, { - "action": "click", "domain": "mydealz.de", + "name": "click", "selector": "[data-t=\"continueWithoutAccepting\"]" }, { - "action": "reload", - "domain": "myprivacy.dpgmedia" + "domain": "myprivacy.dpgmedia", + "name": "reload" }, { - "action": "click", "domain": "off-campers.com", + "name": "click", "selector": "[form=\"cookie-consent-form\"][value=\"deny\"]" }, { - "action": "reset", "domain": "orcd.co", + "name": "reset", "property": "opacity", "selector": ".player-container.box-shadow" }, { - "action": "resetAll", "domain": ".pl", + "name": "resetAll", "property": "filter", "selector": "body:has(.advertisement.contentAds.ads.adsbygoogle.top-banners.adbanner.bannerAd.ad-google.AdSense:first-child) > *" }, { - "action": "reset", "domain": "play.google", + "name": "reset", "property": "z-index", "selector": "body > div" }, { - "action": "click", "domain": "popeyes.es", + "name": "click", "selector": ".cookie-buttons > .cookie-buttons-column > div:last-child" }, { - "action": "click", "domain": "producthunt.com", + "name": "click", "selector": "[data-test=\"dismiss-CookiePopup\"] button" }, { - "action": "click", "domain": "reddit.com", + "name": "click", "selector": "#SHORTCUT_FOCUSABLE_DIV [style*=\"--Toaster\"] section:last-child section:last-child button" }, { - "action": "reset", "domain": "resonanz-labor.de", + "name": "reset", "property": "overflow", "selector": "#wrapwrap" }, { - "action": "click", "domain": "staylibere.com", + "name": "click", "selector": "[class*=\"LayoutCookieBanner_buttons\"] > button:last-child" }, { - "action": "reset", "domain": "thetvdb.com", + "name": "reset", "property": "overflow", "selector": "body" }, { - "action": "click", "domain": "twitch.tv", + "name": "click", "selector": "[data-a-target=\"consent-banner-accept\"]" }, { - "action": "click", "domain": "usnews.com", + "name": "click", "selector": "#gdpr-modal-agree" }, { - "action": "click", "domain": "web.de", + "name": "click", "selector": "#reminder" }, { - "action": "click", "domain": "web.dev", + "name": "click", "selector": "a[href*=\"cookies\"] + button" }, { - "action": "click", "domain": "youtube.com", + "name": "click", "selector": "[aria-label*=\"ablehnen\"], [aria-label*=\"Reject\"], [aria-label*=\"Rechazar\"], [aria-label*=\"refuser\"], [aria-label*=\"Rifiuta\"], [aria-label*=\"Nie wyrażaj zgody\"], [aria-label*=\"Rejeitar\"], [aria-label*=\"Recusar\"], [aria-label*=\"Resping\"], [aria-label*=\"Запретить\"]" }, { - "action": "click", "domain": "zdf.de", + "name": "click", "selector": "#aria-dialog-cmp-error-dialog > .dialog-close" }, { - "action": "click", "domain": "zeit.de", + "name": "click", "selector": "[title=\"ACCEPT AND CONTINUE\"]" } ], - "rules": [ - "||app.usercentrics.eu^", - "||b2brouter.net/de/wp-content/plugins/cookies-and-content-security-policy^", - "||benno-gymnasium.de/plugins/system/gdpr^", - "||c.evidon.com^", - "||cdn-cookieyes.com^", - "||cdn.consentmanager.net^", - "||cdn.cookielaw.org^", - "||cdn.optable.co^", - "||cdn.trustcommander.net/privacy^", - "||cdntranscend.eventbrite.com^", - "||chollometro.com/assets/js/CookiesMessage*.js^", - "||city-bahn.de/wp-content/plugins/borlabs-cookie^", - "||cmp.huffingtonpost.fr^", - "||cmp.inmobi.com^", - "||cmp.prisa.com^", - "||cmp.uniconsent.com^", - "||cms.static-bahn.de/cms/consent-layer^", - "||consent.cookiebot.com^", - "||consent.cookiefirst.com^", - "||consent.pdf24.org^", - "||consent.trustarc.com^", - "||consent.up.welt.de^", - "||consentbar.interencheres.com^", - "||consentcdn.cookiebot.com^", - "||cookiehub.net^", - "||cp.as.com^", - "||cp.inside-digital.de^", - "||download.amd.com/OneTrust^", - "||driftingchef.com/static/*/Sticky2,ConsentManager", - "||emp.bbci.co.uk^", - "||eu.fastcmp.com^", - "||forum.vorondesign.com/js/xf/notice.min.js^", - "||gdpr-tcfv2.sp-prod.net^", - "||get.optad360.io/sf/*/plugin.min.js", - "||ilims.de/typo3conf/ext/nb_cookie_banner^", - "||itkadmin.de/_javascripts/cookiesolution/es_cookie_solution_sources_v2.js^", - "||js.vxcdn.com/usercentrics-sdk^", - "||lensois.com/wp-admin/admin-ajax.php", - "||media.bzcompany.cz/scookies^", - "||myprivacy-static.dpgmedia.net/consent.js^", - "||myprivacy.dpgmedia.*/consent^", - "||optanon.blob.core.windows.net^", - "||privacy.wetransfer.com/fides.js^", - "||prod.widgets.burgerprofiel.vlaanderen.be/*/js.cookie.js^", - "||redditstatic.com/onetrust.*.js", - "||s.nitropay.com/gpp-*.min.js", - "||s.p7s1.io/cmp^", - "||sdk.privacy-center.org^", - "||static.fastcmp.com^", - "||transcend-cdn.com^", - "||wcpstatic.microsoft.com^", - "||webtools.europa.eu/js/webtools.cck.js^", - "||widgets.marketcat.net^" - ], - "skips": { + "exclusions": { "domains": [ + "*.bauhaus.cz", + "*.codesandbox.io", + "*.cookie-dialog-monster.com", + "*.facebook.com", + "*.googleapis.com", + "*.olympics.com", + "translate.google.*", + "www.youtube-nocookie.com", + "www.youtube.com" + ], + "overflows": [ "app.diagrams.net", "blog.sapegin.me", "buyagift.co.uk", @@ -964,6 +674,307 @@ "YTD-YOODLE-RENDERER" ] }, + "keywords": [ + "ablehnen", + "accept", + "accepta", + "accepter", + "accettare", + "accordo", + "aceitar", + "aceptar", + "acuerdo", + "advertising", + "agree", + "akzeptieren", + "analitica", + "analítica", + "analitice", + "analityka", + "analyse", + "analytics", + "analytique", + "baner", + "banner", + "bannière", + "cc", + "cerrar", + "chiudere", + "close", + "cmp", + "compliance", + "concordar", + "confidențialitate", + "confidentialité", + "configuraciones", + "configurações", + "conformidade", + "conformità", + "conformitate", + "conformité", + "consenso", + "consent", + "consentement", + "consentimento", + "consentimiento", + "consimțământ", + "cookie", + "cumplimiento", + "d'accord", + "dados", + "dane", + "data", + "date", + "daten", + "datenschutz", + "dati", + "datos", + "de acord", + "declinar", + "declinare", + "decline", + "décliner", + "déni", + "descargo de responsabilidad", + "desempenho", + "dialog", + "dialogo", + "diálogo", + "dialogue", + "disclaimer", + "disconoscimento", + "données", + "dritte", + "einstellungen", + "einwilligung", + "fechar", + "fermer", + "fonctionnel", + "funcional", + "functional", + "funcțional", + "funkcjonalny", + "funktional", + "funzionale", + "gdpr", + "gerenciar", + "gérer", + "gesetz", + "gestiona", + "gestionar", + "gestire", + "guardar", + "haftungsausschluss", + "impostazioni", + "închide", + "informação", + "información", + "informacja", + "informații", + "information", + "informazione", + "isenção de responsabilidade", + "konformität", + "konieczny", + "law", + "lege", + "legge", + "lei", + "leistung", + "ley", + "loi", + "manage", + "necesar", + "necesario", + "nécessaire", + "necessario", + "necessário", + "necessary", + "notwendig", + "nutzung", + "odmówić", + "odrzucić", + "opcional", + "opcjonalny", + "optional", + "opțional", + "optionnel", + "opzionale", + "paramètres", + "performance", + "performanță", + "personalisierung", + "personalização", + "personalización", + "personalizacja", + "personalizare", + "personalization", + "personalizzazione", + "personnalisation", + "policy", + "politica", + "politică", + "política", + "politik", + "politique", + "polityka", + "popup", + "präferenzen", + "prawo", + "preferences", + "préférences", + "preferencias", + "preferências", + "preferencje", + "preferenze", + "preferințe", + "prestazioni", + "privacidad", + "privacidade", + "privacy", + "prywatność", + "pubblicità", + "publicidad", + "publicidade", + "publicitate", + "publicité", + "rastreamento", + "rechazar", + "refuza", + "reject", + "rejeitar", + "rejeter", + "reklama", + "rendimiento", + "respinge", + "rifiutare", + "salva", + "salvar", + "salvare", + "sauvegarder", + "save", + "schließen", + "seguimiento", + "setări", + "settings", + "śledzenie", + "speichern", + "strona trzecia", + "suivi", + "terceiro", + "tercero", + "terță parte", + "terza parte", + "third-party", + "tiers", + "tracciamento", + "tracking", + "urmărire", + "usage", + "uso", + "ustawienia", + "utilisation", + "utilizare", + "użycie", + "verfolgung", + "verwalten", + "werbung", + "wydajność", + "zaakceptować", + "zamknij", + "zapisz", + "zarządzać", + "zgoda", + "zgodność", + "zgodzić się", + "zrzeczenie się", + "zustimmen", + "аналитика", + "баннер", + "всплывающее окно", + "данные", + "диалог", + "закон", + "закрыть", + "информация", + "использование", + "конфиденциальность", + "настройки", + "необходимо", + "опционально", + "отказ", + "отказаться", + "отклонить", + "отслеживание", + "персонализация", + "политика", + "предпочтения", + "принять", + "производительность", + "реклама", + "согласен", + "согласие", + "соответствие", + "сохранить", + "третья сторона", + "управлять", + "функциональный" + ], + "rules": [ + "||app.usercentrics.eu^", + "||b2brouter.net/de/wp-content/plugins/cookies-and-content-security-policy^", + "||benno-gymnasium.de/plugins/system/gdpr^", + "||c.evidon.com^", + "||cdn-cookieyes.com^", + "||cdn.consentmanager.net^", + "||cdn.cookielaw.org^", + "||cdn.optable.co^", + "||cdn.trustcommander.net/privacy^", + "||cdntranscend.eventbrite.com^", + "||chollometro.com/assets/js/CookiesMessage*.js^", + "||city-bahn.de/wp-content/plugins/borlabs-cookie^", + "||cmp.huffingtonpost.fr^", + "||cmp.inmobi.com^", + "||cmp.prisa.com^", + "||cmp.uniconsent.com^", + "||cms.static-bahn.de/cms/consent-layer^", + "||consent.cookiebot.com^", + "||consent.cookiefirst.com^", + "||consent.pdf24.org^", + "||consent.trustarc.com^", + "||consent.up.welt.de^", + "||consentbar.interencheres.com^", + "||consentcdn.cookiebot.com^", + "||cookiehub.net^", + "||cp.as.com^", + "||cp.inside-digital.de^", + "||download.amd.com/OneTrust^", + "||driftingchef.com/static/*/Sticky2,ConsentManager", + "||emp.bbci.co.uk^", + "||eu.fastcmp.com^", + "||forum.vorondesign.com/js/xf/notice.min.js^", + "||gdpr-tcfv2.sp-prod.net^", + "||get.optad360.io/sf/*/plugin.min.js", + "||ilims.de/typo3conf/ext/nb_cookie_banner^", + "||itkadmin.de/_javascripts/cookiesolution/es_cookie_solution_sources_v2.js^", + "||js.vxcdn.com/usercentrics-sdk^", + "||lensois.com/wp-admin/admin-ajax.php", + "||media.bzcompany.cz/scookies^", + "||myprivacy-static.dpgmedia.net/consent.js^", + "||myprivacy.dpgmedia.*/consent^", + "||optanon.blob.core.windows.net^", + "||privacy.wetransfer.com/fides.js^", + "||prod.widgets.burgerprofiel.vlaanderen.be/*/js.cookie.js^", + "||redditstatic.com/onetrust.*.js", + "||s.nitropay.com/gpp-*.min.js", + "||s.p7s1.io/cmp^", + "||sdk.privacy-center.org^", + "||static.fastcmp.com^", + "||transcend-cdn.com^", + "||wcpstatic.microsoft.com^", + "||webtools.europa.eu/js/webtools.cck.js^", + "||widgets.marketcat.net^" + ], "tokens": { "backdrops": [ ".cc-policy-overlay", @@ -13997,5 +14008,5 @@ "ytm-consent-bump-v2-renderer" ] }, - "version": "1728300083309" + "version": "1729252494919" } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 38e7ed8..889c3df 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -12,6 +12,9 @@ import v4ReportRoutes from 'routes/v4/report'; import v5DataRoutes from 'routes/v5/data'; import v5IssuesRoutes from 'routes/v5/issues'; import v5ReportRoutes from 'routes/v5/report'; +import v6DataRoutes from 'routes/v6/data'; +import v6IssuesRoutes from 'routes/v6/issues'; +import v6ReportRoutes from 'routes/v6/report'; import environment from 'services/environment'; const server = fastify({ logger: true }); @@ -39,6 +42,9 @@ server.register(v4ReportRoutes, { prefix: '/rest/v4' }); server.register(v5DataRoutes, { prefix: '/rest/v5' }); server.register(v5IssuesRoutes, { prefix: '/rest/v5' }); server.register(v5ReportRoutes, { prefix: '/rest/v5' }); +server.register(v6DataRoutes, { prefix: '/rest/v6' }); +server.register(v6IssuesRoutes, { prefix: '/rest/v6' }); +server.register(v6ReportRoutes, { prefix: '/rest/v6' }); server.listen({ host: '0.0.0.0', port: environment.port }, (error, address) => { if (error) { diff --git a/packages/api/src/routes/v2/data.ts b/packages/api/src/routes/v2/data.ts index bfc2f19..860ba4a 100644 --- a/packages/api/src/routes/v2/data.ts +++ b/packages/api/src/routes/v2/data.ts @@ -1,6 +1,6 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; -import { parseNewFix } from 'services/compatibility'; +import { parseAction } from 'services/compatibility'; import environment from 'services/environment'; import { RATE_LIMIT_10_PER_MIN } from 'services/rateLimit'; @@ -14,17 +14,18 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: }, async (_request, reply) => { try { - const url = `${environment.gitea.raw}/database.json`; - const result = await (await fetch(url)).json(); + const database = `${environment.gitea.raw}/database.json`; + const response = await fetch(database); + const { actions, exclusions, keywords, tokens } = await response.json(); reply.send({ data: { - classes: result.tokens.classes, - commonWords: result.commonWords, - elements: result.tokens.selectors, - fixes: result.fixes.map(parseNewFix), - skips: result.skips.domains, - tags: result.skips.tags, + classes: tokens.classes, + commonWords: keywords, + elements: tokens.selectors, + fixes: actions.map(parseAction), + skips: exclusions.overflows, + tags: exclusions.tags, }, success: true, }); diff --git a/packages/api/src/routes/v3/data.ts b/packages/api/src/routes/v3/data.ts index 90d2a1a..801b228 100644 --- a/packages/api/src/routes/v3/data.ts +++ b/packages/api/src/routes/v3/data.ts @@ -1,6 +1,6 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; -import { parseNewFix } from 'services/compatibility'; +import { parseAction } from 'services/compatibility'; import environment from 'services/environment'; import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit'; @@ -14,13 +14,16 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: }, async (_request, reply) => { try { - const url = `${environment.gitea.raw}/database.json`; - const result = await (await fetch(url)).json(); + const database = `${environment.gitea.raw}/database.json`; + const response = await fetch(database); + const { actions, exclusions, keywords, ...rest } = await response.json(); reply.send({ data: { - ...result, - fixes: result.fixes.map(parseNewFix), + ...rest, + commonWords: keywords, + fixes: actions.map(parseAction), + skips: { domains: exclusions.overflows, tags: exclusions.tags }, }, success: true, }); diff --git a/packages/api/src/routes/v4/data.ts b/packages/api/src/routes/v4/data.ts index 70c7e4f..ae3d714 100644 --- a/packages/api/src/routes/v4/data.ts +++ b/packages/api/src/routes/v4/data.ts @@ -1,5 +1,6 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; +import { parseActionName, toDeclarativeNetRequestRule } from 'services/compatibility'; import environment from 'services/environment'; import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit'; @@ -13,14 +14,18 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: }, async (_request, reply) => { try { + const database = `${environment.gitea.raw}/database.json`; const options = { headers: { 'Cache-Control': 'no-cache' } }; - const url = `${environment.gitea.raw}/database.json`; - const { rules, ...result } = await (await fetch(url, options)).json(); + const response = await fetch(database, options); + const { actions, exclusions, keywords, rules, ...rest } = await response.json(); reply.send({ data: { - ...result, + ...rest, + actions: actions.map(parseActionName), + commonWords: keywords, rules: rules.map(toDeclarativeNetRequestRule), + skips: { domains: exclusions.overflows, tags: exclusions.tags }, }, success: true, }); @@ -35,17 +40,3 @@ export default (server: FastifyInstance, _options: RouteShorthandOptions, done: done(); }; - -function toDeclarativeNetRequestRule(urlFilter: string, index: number) { - return { - action: { - type: 'block', - }, - condition: { - resourceTypes: ['font', 'image', 'media', 'object', 'script', 'stylesheet', 'xmlhttprequest'], - urlFilter, - }, - id: index + 1, - priority: 1, - }; -} diff --git a/packages/api/src/routes/v6/data.ts b/packages/api/src/routes/v6/data.ts new file mode 100644 index 0000000..9e0ae75 --- /dev/null +++ b/packages/api/src/routes/v6/data.ts @@ -0,0 +1,39 @@ +import { FastifyInstance, RouteShorthandOptions } from 'fastify'; +import fetch from 'node-fetch'; +import { toDeclarativeNetRequestRule } from 'services/compatibility'; +import environment from 'services/environment'; +import { RATE_LIMIT_3_PER_MIN } from 'services/rateLimit'; + +export default (server: FastifyInstance, _options: RouteShorthandOptions, done: () => void) => { + server.get( + '/data/', + { + config: { + rateLimit: RATE_LIMIT_3_PER_MIN, + }, + }, + async (_request, reply) => { + try { + const database = `${environment.gitea.raw}/database.json`; + const options = { headers: { 'Cache-Control': 'no-cache' } }; + const response = await fetch(database, options); + const { rules, ...rest } = await response.json(); + + reply.send({ + data: { + ...rest, + rules: rules.map(toDeclarativeNetRequestRule), + }, + success: true, + }); + } catch (error) { + reply.send({ + errors: [error.message], + success: false, + }); + } + } + ); + + done(); +}; diff --git a/packages/api/src/routes/v6/issues.ts b/packages/api/src/routes/v6/issues.ts new file mode 100644 index 0000000..1a0a761 --- /dev/null +++ b/packages/api/src/routes/v6/issues.ts @@ -0,0 +1 @@ +export { default as default } from '../v5/issues'; diff --git a/packages/api/src/routes/v6/report.ts b/packages/api/src/routes/v6/report.ts new file mode 100644 index 0000000..74d76b4 --- /dev/null +++ b/packages/api/src/routes/v6/report.ts @@ -0,0 +1 @@ +export { default as default } from '../v5/report'; diff --git a/packages/api/src/services/compatibility.ts b/packages/api/src/services/compatibility.ts index 0f48cd6..89aeb87 100644 --- a/packages/api/src/services/compatibility.ts +++ b/packages/api/src/services/compatibility.ts @@ -1,13 +1,32 @@ -/** - * Parse the new fix object into the old string format used by older versions of the extension - */ -export function parseNewFix(fix: Fix): string { - return `${fix.domain}##${fix.selector}##${fix.action}${fix.property ? `##${fix.property}` : ''}`; +export function parseAction(action: Action): string { + return `${action.domain}##${action.selector}##${action.name}${action.property ? `##${action.property}` : ''}`; } -export interface Fix { - readonly action: string; +export function parseActionName( + action: Action +): Omit & { readonly action: string } { + const { name, ...rest } = action; + + return { action: name, ...rest }; +} + +export function toDeclarativeNetRequestRule(urlFilter: string, index: number) { + return { + action: { + type: 'block', + }, + condition: { + resourceTypes: ['font', 'image', 'media', 'object', 'script', 'stylesheet', 'xmlhttprequest'], + urlFilter, + }, + id: index + 1, + priority: 1, + }; +} + +export interface Action { readonly domain: string; + readonly name: string; readonly property?: string; readonly selector: string; }