From 74293ac2f8d19b773c1aa6777f473c7e4f3e3717 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Tue, 19 Dec 2023 22:23:46 +0800 Subject: [PATCH] Chore: download mock assets --- .gitignore | 4 + Build/download-mock-assets.ts | 27 ++++ Build/index.ts | 7 +- Mock/www-google-analytics-com_analytics.js | 89 ------------ Mock/www-google-analytics-com_ga.js | 109 -------------- Mock/www-googlesyndication-com_adsbygoogle.js | 32 ----- Mock/www-googletagmanager-com_gtm.js | 24 ---- Mock/www-googletagservices-com_gpt.js | 133 ------------------ Modules/sukka_enhance_adblock.sgmodule | 2 +- bun.lockb | Bin 88602 -> 91834 bytes package.json | 10 +- 11 files changed, 43 insertions(+), 394 deletions(-) create mode 100644 Build/download-mock-assets.ts delete mode 100644 Mock/www-google-analytics-com_analytics.js delete mode 100644 Mock/www-google-analytics-com_ga.js delete mode 100644 Mock/www-googlesyndication-com_adsbygoogle.js delete mode 100644 Mock/www-googletagmanager-com_gtm.js delete mode 100644 Mock/www-googletagservices-com_gpt.js diff --git a/.gitignore b/.gitignore index 853b0d74..fc2ad193 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ List/ Clash/ Modules/sukka_local_dns_mapping.sgmodule Modules/sukka_url_redirect.sgmodule +Mock/www-google-analytics-com_ga.js +Mock/www-googletagservices-com_gpt.js +Mock/www-google-analytics-com_analytics.js +Mock/www-googlesyndication-com_adsbygoogle.js diff --git a/Build/download-mock-assets.ts b/Build/download-mock-assets.ts new file mode 100644 index 00000000..435a9327 --- /dev/null +++ b/Build/download-mock-assets.ts @@ -0,0 +1,27 @@ +import picocolors from 'picocolors'; +import { task } from './lib/trace-runner'; +import path from 'path'; +import { fetchWithRetry } from './lib/fetch-retry'; + +const ASSETS_LIST = { + 'www-google-analytics-com_ga.js': 'https://unpkg.com/@adguard/scriptlets@1/dist/redirect-files/google-analytics-ga.js', + 'www-googletagservices-com_gpt.js': 'https://unpkg.com/@adguard/scriptlets@1/dist/redirect-files/googletagservices-gpt.js', + 'www-google-analytics-com_analytics.js': 'https://unpkg.com/@adguard/scriptlets@1/dist/redirect-files/google-analytics.js', + 'www-googlesyndication-com_adsbygoogle.js': 'https://unpkg.com/@adguard/scriptlets@1/dist/redirect-files/googlesyndication-adsbygoogle.js' +} as const; + +const mockDir = path.resolve(import.meta.dir, '../Mock'); + +export const downloadMockAssets = task(import.meta.path, () => Promise.all(Object.entries(ASSETS_LIST).map(async ([filename, url]) => { + const targetPath = path.join(mockDir, filename); + + const key = picocolors.gray(`Download ${filename}`); + console.time(key); + const res = await fetchWithRetry(url); + await Bun.write(targetPath, res as Response); + console.timeEnd(key); +}))); + +if (import.meta.main) { + downloadMockAssets(); +} diff --git a/Build/index.ts b/Build/index.ts index 2630c0ab..2e19e05b 100644 --- a/Build/index.ts +++ b/Build/index.ts @@ -17,6 +17,7 @@ import { validate } from './validate-domainset'; import { buildSSPanelUIMAppProfile } from './build-sspanel-appprofile'; import { buildPublic } from './build-public'; +import { downloadMockAssets } from './download-mock-assets'; // import type { TaskResult } from './lib/trace-runner'; (async () => { @@ -70,6 +71,8 @@ import { buildPublic } from './build-public'; downloadPreviousBuildPromise ]).then(() => buildSSPanelUIMAppProfile()); + const downloadMockAssetsPromise = downloadMockAssets(); + const stats = await Promise.all([ downloadPreviousBuildPromise, downloadPublicSuffixListPromise, @@ -87,7 +90,9 @@ import { buildPublic } from './build-public'; buildDomesticRulesetPromise, buildRedirectModulePromise, buildStreamServicePromise, - buildSSPanelUIMAppProfilePromise + buildSSPanelUIMAppProfilePromise, + + downloadMockAssetsPromise ]); await Promise.all([ diff --git a/Mock/www-google-analytics-com_analytics.js b/Mock/www-google-analytics-com_analytics.js deleted file mode 100644 index 9c796c7d..00000000 --- a/Mock/www-google-analytics-com_analytics.js +++ /dev/null @@ -1,89 +0,0 @@ -(function () { - 'use strict'; - - // https://developers.google.com/analytics/devguides/collection/analyticsjs/ - const noopfn = function () { - }; - // - const Tracker = function () { - }; - const p = Tracker.prototype; - p.get = noopfn; - p.set = noopfn; - p.send = noopfn; - // - const w = window; - const gaName = w.GoogleAnalyticsObject || 'ga'; - const gaQueue = w[gaName]; - const ga = function (...args) { - const len = args.length; - if (len === 0) { return; } - let fn; - const a = args[len - 1]; - if (typeof a === 'object' && typeof a.hitCallback === 'function') { - fn = a.hitCallback; - } else if (typeof a === 'function') { - fn = () => { a(ga.create()); }; - } else { - const pos = args.indexOf('hitCallback'); - if (pos !== -1 && typeof args[pos + 1] === 'function') { - fn = args[pos + 1]; - } - } - if (typeof fn !== 'function') { return; } - try { - fn(); - } catch { - } - }; - ga.create = function () { - return new Tracker(); - }; - ga.getByName = function () { - return new Tracker(); - }; - ga.getAll = function () { - return [new Tracker()]; - }; - ga.remove = noopfn; - // https://github.com/uBlockOrigin/uAssets/issues/2107 - ga.loaded = true; - w[gaName] = ga; - // https://github.com/gorhill/uBlock/issues/3075 - const dl = w.dataLayer; - if (typeof dl === 'object') { - if (typeof dl.hide === 'object' && typeof dl.hide.end === 'function') { - dl.hide.end(); - dl.hide.end = () => { }; - } - if (typeof dl.push === 'function') { - const doCallback = function (item) { - if (typeof item === 'object' === false) { return; } - if (typeof item.eventCallback !== 'function') { return; } - // eslint-disable-next-line sukka/prefer-timer-id -- deliberate use of setTimeout - setTimeout(item.eventCallback, 1); - item.eventCallback = () => { }; - }; - dl.push = new Proxy(dl.push, { - apply(target, thisArg, args) { - doCallback(args[0]); - return Reflect.apply(target, thisArg, args); - } - }); - if (Array.isArray(dl)) { - const q = dl.slice(); - for (const item of q) { - doCallback(item); - } - } - } - } - // empty ga queue - if (typeof gaQueue === 'function' && Array.isArray(gaQueue.q)) { - const q = gaQueue.q.slice(); - gaQueue.q.length = 0; - for (const entry of q) { - ga(...entry); - } - } -}()); diff --git a/Mock/www-google-analytics-com_ga.js b/Mock/www-google-analytics-com_ga.js deleted file mode 100644 index 845be868..00000000 --- a/Mock/www-google-analytics-com_ga.js +++ /dev/null @@ -1,109 +0,0 @@ -(function () { - 'use strict'; - - const noopfn = function () { - }; - // - const Gaq = function () { - }; - Gaq.prototype.Na = noopfn; - Gaq.prototype.O = noopfn; - Gaq.prototype.Sa = noopfn; - Gaq.prototype.Ta = noopfn; - Gaq.prototype.Va = noopfn; - Gaq.prototype._createAsyncTracker = noopfn; - Gaq.prototype._getAsyncTracker = noopfn; - Gaq.prototype._getPlugin = noopfn; - Gaq.prototype.push = function (a) { - if (typeof a === 'function') { - a(); return; - } - if (Array.isArray(a) === false) { return; } - // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link - if ( - typeof a[0] === 'string' - && /(^|\.)_link$/.test(a[0]) - && typeof a[1] === 'string' - ) { - try { - window.location.assign(a[1]); - } catch { - } - } - if (a[0] === '_set' && a[1] === 'hitCallback' && typeof a[2] === 'function') { - a[2](); - } - }; - // - const tracker = (function () { - const out = {}; - const api = [ - '_addIgnoredOrganic _addIgnoredRef _addItem _addOrganic', - '_addTrans _clearIgnoredOrganic _clearIgnoredRef _clearOrganic', - '_cookiePathCopy _deleteCustomVar _getName _setAccount', - '_getAccount _getClientInfo _getDetectFlash _getDetectTitle', - '_getLinkerUrl _getLocalGifPath _getServiceMode _getVersion', - '_getVisitorCustomVar _initData _linkByPost', - '_setAllowAnchor _setAllowHash _setAllowLinker _setCampContentKey', - '_setCampMediumKey _setCampNameKey _setCampNOKey _setCampSourceKey', - '_setCampTermKey _setCampaignCookieTimeout _setCampaignTrack _setClientInfo', - '_setCookiePath _setCookiePersistence _setCookieTimeout _setCustomVar', - '_setDetectFlash _setDetectTitle _setDomainName _setLocalGifPath', - '_setLocalRemoteServerMode _setLocalServerMode _setReferrerOverride _setRemoteServerMode', - '_setSampleRate _setSessionTimeout _setSiteSpeedSampleRate _setSessionCookieTimeout', - '_setVar _setVisitorCookieTimeout _trackEvent _trackPageLoadTime', - '_trackPageview _trackSocial _trackTiming _trackTrans', - '_visitCode' - ].join(' ').split(/\s+/); - for (const method of api) { - out[method] = noopfn; - } - out._getLinkerUrl = function (a) { - return a; - }; - // https://github.com/AdguardTeam/Scriptlets/issues/154 - out._link = function (a) { - if (typeof a !== 'string') { return; } - try { - window.location.assign(a); - } catch { - } - }; - return out; - }()); - // - const Gat = function () { - }; - Gat.prototype._anonymizeIP = noopfn; - Gat.prototype._createTracker = noopfn; - Gat.prototype._forceSSL = noopfn; - Gat.prototype._getPlugin = noopfn; - Gat.prototype._getTracker = function () { - return tracker; - }; - Gat.prototype._getTrackerByName = function () { - return tracker; - }; - Gat.prototype._getTrackers = noopfn; - Gat.prototype.aa = noopfn; - Gat.prototype.ab = noopfn; - Gat.prototype.hb = noopfn; - Gat.prototype.la = noopfn; - Gat.prototype.oa = noopfn; - Gat.prototype.pa = noopfn; - Gat.prototype.u = noopfn; - const gat = new Gat(); - window._gat = gat; - // - const gaq = new Gaq(); - (function () { - const aa = window._gaq || []; - if (Array.isArray(aa)) { - while (aa[0]) { - gaq.push(aa.shift()); - } - } - }()); - gaq.qf = gaq; - window._gaq = gaq; -}()); diff --git a/Mock/www-googlesyndication-com_adsbygoogle.js b/Mock/www-googlesyndication-com_adsbygoogle.js deleted file mode 100644 index 8a025a5c..00000000 --- a/Mock/www-googlesyndication-com_adsbygoogle.js +++ /dev/null @@ -1,32 +0,0 @@ -(function () { - 'use strict'; - - const init = () => { - window.adsbygoogle = { - loaded: true, - push() { - } - }; - const phs = document.querySelectorAll('.adsbygoogle'); - const css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;'; - for (let i = 0; i < phs.length; i++) { - const id = `aswift_${i}`; - if (document.querySelector(`iframe#${id}`) !== null) { continue; } - const fr = document.createElement('iframe'); - fr.id = id; - fr.style = css; - const cfr = document.createElement('iframe'); - cfr.id = `google_ads_frame${i}`; - fr.appendChild(cfr); - phs[i].appendChild(fr); - } - }; - if ( - document.querySelectorAll('.adsbygoogle').length === 0 - && document.readyState === 'loading' - ) { - window.addEventListener('DOMContentLoaded', init, { once: true }); - } else { - init(); - } -}()); diff --git a/Mock/www-googletagmanager-com_gtm.js b/Mock/www-googletagmanager-com_gtm.js deleted file mode 100644 index 539f5f51..00000000 --- a/Mock/www-googletagmanager-com_gtm.js +++ /dev/null @@ -1,24 +0,0 @@ -(function () { - 'use strict'; - - const noopfn = function () { - }; - const w = window; - w.ga = w.ga || noopfn; - const dl = w.dataLayer; - if (typeof dl !== 'object') { return; } - if (typeof dl.hide === 'object' && typeof dl.hide.end === 'function') { - dl.hide.end(); - } - if (typeof dl.push === 'function') { - dl.push = function (o) { - if ( - typeof o === 'object' - && typeof o.eventCallback === 'function' - ) { - // eslint-disable-next-line sukka/prefer-timer-id -- deliberately use setTimeout - setTimeout(o.eventCallback, 1); - } - }; - } -}()); diff --git a/Mock/www-googletagservices-com_gpt.js b/Mock/www-googletagservices-com_gpt.js deleted file mode 100644 index 8e6668bf..00000000 --- a/Mock/www-googletagservices-com_gpt.js +++ /dev/null @@ -1,133 +0,0 @@ -(function () { - 'use strict'; - - // https://developers.google.com/doubleclick-gpt/reference - const noopfn = function () { - }.bind(); - const noopthisfn = function () { - return this; - }; - const noopnullfn = function () { - return null; - }; - const nooparrayfn = function () { - return []; - }; - const noopstrfn = function () { - return ''; - }; - // - const companionAdsService = { - addEventListener: noopthisfn, - enableSyncLoading: noopfn, - setRefreshUnfilledSlots: noopfn - }; - const contentService = { - addEventListener: noopthisfn, - setContent: noopfn - }; - const PassbackSlot = function () { - }; - let p = PassbackSlot.prototype; - p.display = noopfn; - p.get = noopnullfn; - p.set = noopthisfn; - p.setClickUrl = noopthisfn; - p.setTagForChildDirectedTreatment = noopthisfn; - p.setTargeting = noopthisfn; - p.updateTargetingFromMap = noopthisfn; - const pubAdsService = { - addEventListener: noopthisfn, - clear: noopfn, - clearCategoryExclusions: noopthisfn, - clearTagForChildDirectedTreatment: noopthisfn, - clearTargeting: noopthisfn, - collapseEmptyDivs: noopfn, - defineOutOfPagePassback() { return new PassbackSlot(); }, - definePassback() { return new PassbackSlot(); }, - disableInitialLoad: noopfn, - display: noopfn, - enableAsyncRendering: noopfn, - enableSingleRequest: noopfn, - enableSyncRendering: noopfn, - enableVideoAds: noopfn, - get: noopnullfn, - getAttributeKeys: nooparrayfn, - getTargeting: noopfn, - getTargetingKeys: nooparrayfn, - getSlots: nooparrayfn, - refresh: noopfn, - removeEventListener: noopfn, - set: noopthisfn, - setCategoryExclusion: noopthisfn, - setCentering: noopfn, - setCookieOptions: noopthisfn, - setForceSafeFrame: noopthisfn, - setLocation: noopthisfn, - setPublisherProvidedId: noopthisfn, - setPrivacySettings: noopthisfn, - setRequestNonPersonalizedAds: noopthisfn, - setSafeFrameConfig: noopthisfn, - setTagForChildDirectedTreatment: noopthisfn, - setTargeting: noopthisfn, - setVideoContent: noopthisfn, - updateCorrelator: noopfn - }; - const SizeMappingBuilder = function () { - }; - p = SizeMappingBuilder.prototype; - p.addSize = noopthisfn; - p.build = noopnullfn; - const Slot = function () { - }; - p = Slot.prototype; - p.addService = noopthisfn; - p.clearCategoryExclusions = noopthisfn; - p.clearTargeting = noopthisfn; - p.defineSizeMapping = noopthisfn; - p.get = noopnullfn; - p.getAdUnitPath = nooparrayfn; - p.getAttributeKeys = nooparrayfn; - p.getCategoryExclusions = nooparrayfn; - p.getDomId = noopstrfn; - p.getResponseInformation = noopnullfn; - p.getSlotElementId = noopstrfn; - p.getSlotId = noopthisfn; - p.getTargeting = nooparrayfn; - p.getTargetingKeys = nooparrayfn; - p.set = noopthisfn; - p.setCategoryExclusion = noopthisfn; - p.setClickUrl = noopthisfn; - p.setCollapseEmptyDiv = noopthisfn; - p.setTargeting = noopthisfn; - p.updateTargetingFromMap = noopthisfn; - // - const gpt = window.googletag || {}; - const cmd = gpt.cmd || []; - gpt.apiReady = true; - gpt.cmd = []; - gpt.cmd.push = function (a) { - try { - a(); - } catch { - } - return 1; - }; - gpt.companionAds = function () { return companionAdsService; }; - gpt.content = function () { return contentService; }; - gpt.defineOutOfPageSlot = function () { return new Slot(); }; - gpt.defineSlot = function () { return new Slot(); }; - gpt.destroySlots = noopfn; - gpt.disablePublisherConsole = noopfn; - gpt.display = noopfn; - gpt.enableServices = noopfn; - gpt.getVersion = noopstrfn; - gpt.pubads = function () { return pubAdsService; }; - gpt.pubadsReady = true; - gpt.setAdIframeTitle = noopfn; - gpt.sizeMapping = function () { return new SizeMappingBuilder(); }; - window.googletag = gpt; - while (cmd.length !== 0) { - gpt.cmd.push(cmd.shift()); - } -}()); diff --git a/Modules/sukka_enhance_adblock.sgmodule b/Modules/sukka_enhance_adblock.sgmodule index 820b382b..08a98d4c 100644 --- a/Modules/sukka_enhance_adblock.sgmodule +++ b/Modules/sukka_enhance_adblock.sgmodule @@ -6,8 +6,8 @@ hostname = %APPEND% *.google-analytics.com, *.googletagmanager.com, *.googlesynd [URL Rewrite] ^https?://.*\.google-analytics\.com/analytics\.js https://ruleset.skk.moe/Mock/www-google-analytics-com_analytics.js 302 +^https?://.*\.googletagmanager\.com/gtm\.js https://ruleset.skk.moe/Mock/www-google-analytics-com_analytics.js 302 ^https?://.*\.google-analytics\.com/ga\.js https://ruleset.skk.moe/Mock/www-google-analytics-com_ga.js 302 -^https?://.*\.googletagmanager\.com/gtm\.js https://ruleset.skk.moe/Mock/www-googletagmanager-com_gtm.js 302 ^https?://.*\.google-analytics\.com/cx/api\.js https://ruleset.skk.moe/Mock/www-google-analytics-com_cx_api.js 302 ^https?://.*\.googlesyndication\.com/adsbygoogle\.js https://ruleset.skk.moe/Mock/www-googlesyndication-com_adsbygoogle.js 302 ^https?://.*\.googletagservices\.com/gpt\.js https://ruleset.skk.moe/Mock/www-googletagservices-com_gpt.js 302 diff --git a/bun.lockb b/bun.lockb index c90c6ab1e1fccd8f51404d130d96a80fda904626..9bb227706bc34a77d94b388aa12f01a228fa6d32 100755 GIT binary patch delta 13251 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 delta 11576 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 diff --git a/package.json b/package.json index 55ce43f8..e09d829f 100644 --- a/package.json +++ b/package.json @@ -21,25 +21,25 @@ "async-sema": "^3.1.1", "ci-info": "^4.0.0", "csv-parse": "^5.5.3", - "fast-cidr-tools": "^0.2.2", + "fast-cidr-tools": "^0.2.4", "mnemonist": "^0.39.6", "path-scurry": "^1.10.1", "picocolors": "^1.0.0", "punycode": "^2.3.1", "table": "^6.8.1", "tar-stream": "^3.1.6", - "tldts": "^6.0.22" + "tldts": "^6.1.1" }, "devDependencies": { "@eslint-sukka/node": "4.1.10-beta.2", "@eslint-sukka/ts": "4.1.10-beta.2", "@types/async-retry": "^1.4.8", "@types/tar-stream": "^3.1.3", - "bun-types": "^1.0.11", - "eslint": "^8.55.0", + "bun-types": "^1.0.18-1", + "eslint": "^8.56.0", "eslint-config-sukka": "4.1.10-beta.2", "eslint-formatter-sukka": "4.1.9", - "typescript": "^5.2.2" + "typescript": "^5.3.3" }, "resolutions": { "has": "npm:@nolyfill/has@latest"