@adriangalilea/utils 2.9.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -0
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/universal/url/index.d.ts +60 -0
- package/dist/universal/url/index.d.ts.map +1 -0
- package/dist/universal/url/index.js +186 -0
- package/dist/universal/url/index.js.map +1 -0
- package/dist/universal/url/overlay.d.ts +14 -0
- package/dist/universal/url/overlay.d.ts.map +1 -0
- package/dist/universal/url/overlay.js +63 -0
- package/dist/universal/url/overlay.js.map +1 -0
- package/dist/universal/url/tidy-rules.d.ts +19 -0
- package/dist/universal/url/tidy-rules.d.ts.map +1 -0
- package/dist/universal/url/tidy-rules.js +192 -0
- package/dist/universal/url/tidy-rules.js.map +1 -0
- package/dist/universal/url/update-rules.d.ts +15 -0
- package/dist/universal/url/update-rules.d.ts.map +1 -0
- package/dist/universal/url/update-rules.js +114 -0
- package/dist/universal/url/update-rules.js.map +1 -0
- package/package.json +18 -9
package/README.md
CHANGED
|
@@ -99,6 +99,56 @@ btc(0.00001234) // "0.00001234 ₿"
|
|
|
99
99
|
money(100, 'EUR') // "€100.00"
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
+
### URL (`url`)
|
|
103
|
+
|
|
104
|
+
Everything between "text someone typed" and "a URL you can use": detection,
|
|
105
|
+
tracking-parameter stripping, canonical cache keys, host questions. Each
|
|
106
|
+
concern rides its state of the art instead of hand-rolls — detection is
|
|
107
|
+
[linkifyjs](https://linkify.js.org) (scanner-based, TLD-aware); parsing is the
|
|
108
|
+
WHATWG URL API, never regexes; the knowledge of WHICH params are tracking is
|
|
109
|
+
vendored from
|
|
110
|
+
[@protontech/tidy-url](https://www.npmjs.com/package/@protontech/tidy-url)
|
|
111
|
+
(Proton's maintained fork of DrKain/tidy-url, MIT; refresh with
|
|
112
|
+
`pnpm update-url-rules`) plus a small tested overlay. Global rules only for
|
|
113
|
+
unambiguous trackers (utm_*, fbclid, gclid, …); ambiguous names stay per-host —
|
|
114
|
+
`si` is junk on YouTube/Spotify but `ref` on GitHub names a branch and
|
|
115
|
+
survives.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { findUrls, asHttpUrl, cleanUrl, urlKey, hostOf, hostMatches } from '@adriangalilea/utils/url'
|
|
119
|
+
|
|
120
|
+
// Every http(s) URL in free text, in order, cleaned — with spans and
|
|
121
|
+
// whether the user typed the scheme (requireScheme drops bare domains).
|
|
122
|
+
findUrls('check https://a.com/x?utm_source=t and example.com/y')
|
|
123
|
+
// [{ url: 'https://a.com/x', start: 6, end: 34, hadScheme: true },
|
|
124
|
+
// { url: 'https://example.com/y', start: 39, end: 52, hadScheme: false }]
|
|
125
|
+
|
|
126
|
+
// One pasted token → one clean URL (or null). Punctuation, brackets,
|
|
127
|
+
// emails-are-not-URLs: the scanner's problem, not yours.
|
|
128
|
+
asHttpUrl('<https://example.com/a?utm_source=x>,') // 'https://example.com/a'
|
|
129
|
+
|
|
130
|
+
// The SAME resource minus tracking — safe to fetch, share, display.
|
|
131
|
+
// Keeps scheme, www., param order, and the fragment (a real anchor).
|
|
132
|
+
cleanUrl('https://www.youtube.com/watch?v=abc&t=120s&si=junk')
|
|
133
|
+
// 'https://www.youtube.com/watch?v=abc&t=120s'
|
|
134
|
+
|
|
135
|
+
// The resource's IDENTITY — for cache keys and dedupe. Scheme-agnostic,
|
|
136
|
+
// www-less lowercase host, no trailing slash, params stripped + sorted,
|
|
137
|
+
// fragment dropped: every spelling of one page collides, different pages never do.
|
|
138
|
+
urlKey('https://www.theverge.com/2026/1/1/story/?utm_source=twitter#comments')
|
|
139
|
+
// 'theverge.com/2026/1/1/story'
|
|
140
|
+
|
|
141
|
+
hostOf('https://www.theverge.com/a') // 'theverge.com'
|
|
142
|
+
hostMatches('music.youtube.com', 'youtube.com') // true (RFC 6265 domain-match)
|
|
143
|
+
hostMatches('notyoutube.com', 'youtube.com') // false
|
|
144
|
+
|
|
145
|
+
// App-specific junk rides along per call
|
|
146
|
+
urlKey(url, { strip: ['session_id'] })
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Unparseable or non-http(s) input passes through unchanged — these are hygiene
|
|
150
|
+
functions over user-pasted text, not validators.
|
|
151
|
+
|
|
102
152
|
### CLI presentation (`cli`)
|
|
103
153
|
|
|
104
154
|
Terminal output: aligned tables, key/value blocks, trees, and a semantic color
|
package/dist/browser.d.ts
CHANGED
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
package/dist/browser.js
CHANGED
|
@@ -13,6 +13,7 @@ export * from "./universal/currency/index.js";
|
|
|
13
13
|
export * from "./universal/format.js";
|
|
14
14
|
// Universal utilities that work in browser
|
|
15
15
|
export * from "./universal/log.js";
|
|
16
|
+
export * from "./universal/url/index.js";
|
|
16
17
|
// Note: file, dir, path, project, and kev are NOT exported here
|
|
17
18
|
// because they depend on Node.js file system APIs
|
|
18
19
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,cAAc,gBAAgB,CAAC;AAE/B,2CAA2C;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,2CAA2C;AAC3C,cAAc,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,cAAc,gBAAgB,CAAC;AAE/B,2CAA2C;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,2CAA2C;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AAEzC,gEAAgE;AAChE,kDAAkD"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yDAAyD;AACzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,8BAA8B;AAC9B,mEAAmE;AACnE,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAElC,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACzD,uDAAuD;AACvD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,wCAAwC;AACxC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yDAAyD;AACzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,8BAA8B;AAC9B,mEAAmE;AACnE,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAElC,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACzD,uDAAuD;AACvD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,wCAAwC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export { TIDY_RULES, TIDY_VERSION, type TrackingProvider } from "./tidy-rules.js";
|
|
2
|
+
export { OVERLAY_RULES } from "./overlay.js";
|
|
3
|
+
export interface StripOptions {
|
|
4
|
+
/** Extra param names to strip (compared lowercased), for app-specific junk. */
|
|
5
|
+
strip?: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export interface FindUrlsOptions extends StripOptions {
|
|
8
|
+
/** Drop scheme-less matches (`example.com/x`) instead of coercing them to https://. */
|
|
9
|
+
requireScheme?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** One URL found in free text by {@link findUrls}. */
|
|
12
|
+
export interface FoundUrl {
|
|
13
|
+
/** The cleaned http(s) URL (https:// coerced onto scheme-less matches). */
|
|
14
|
+
url: string;
|
|
15
|
+
/** Span of the raw match in the input text. */
|
|
16
|
+
start: number;
|
|
17
|
+
end: number;
|
|
18
|
+
/** False for scheme-less matches the scanner inferred from a known TLD. */
|
|
19
|
+
hadScheme: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Every http(s) URL in free text, in order, cleaned. Detection is linkifyjs —
|
|
23
|
+
* a real scanner, TLD-aware for scheme-less domains, and it owns the messy
|
|
24
|
+
* text-boundary problems (trailing punctuation, brackets, emails-are-not-URLs)
|
|
25
|
+
* — then each match goes through the URL parser and tracking-param stripping.
|
|
26
|
+
* Scheme-less matches coerce to https:// (drop them with `requireScheme`).
|
|
27
|
+
*/
|
|
28
|
+
export declare function findUrls(text: string, opts?: FindUrlsOptions): FoundUrl[];
|
|
29
|
+
/**
|
|
30
|
+
* A user-pasted token as one CLEAN http(s) URL, or null: {@link findUrls}
|
|
31
|
+
* over the token, first match. The one verb between "text someone typed"
|
|
32
|
+
* and "a URL you can use".
|
|
33
|
+
*/
|
|
34
|
+
export declare function asHttpUrl(token: string, opts?: FindUrlsOptions): string | null;
|
|
35
|
+
/** A URL's host without a leading www., or the input unchanged if it won't parse. */
|
|
36
|
+
export declare function hostOf(url: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* True if `host` IS `domain` or a subdomain of it — never a lookalike suffix
|
|
39
|
+
* (`notyoutube.com` doesn't match `youtube.com`). RFC 6265 §5.1.3 domain-
|
|
40
|
+
* matching semantics, the same rule cookies use.
|
|
41
|
+
*/
|
|
42
|
+
export declare function hostMatches(host: string, domain: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* The same URL minus tracking params: safe to fetch, share, and display.
|
|
45
|
+
* Unparseable or non-http(s) input is returned unchanged.
|
|
46
|
+
*/
|
|
47
|
+
export declare function cleanUrl(url: string, opts?: StripOptions): string;
|
|
48
|
+
/**
|
|
49
|
+
* A canonical identity for the resource behind `url` — `host/path?sortedQuery`
|
|
50
|
+
* — for cache keys and dedupe. Unparseable or non-http(s) input is returned
|
|
51
|
+
* unchanged so it still keys consistently.
|
|
52
|
+
*/
|
|
53
|
+
export declare function urlKey(url: string, opts?: StripOptions): string;
|
|
54
|
+
/**
|
|
55
|
+
* True if `name` is a tracking param — globally, or on `host` specifically.
|
|
56
|
+
* Providers that match on the full URL (matchHref) need more context than a
|
|
57
|
+
* host and are skipped here; `cleanUrl`/`urlKey` do honor them.
|
|
58
|
+
*/
|
|
59
|
+
export declare function isTrackingParam(name: string, host?: string): boolean;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/universal/url/index.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC5B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACpD,uFAAuF;IACvF,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACxB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,EAAE,CAazE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAE9E;AAED,qFAAqF;AACrF,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM1C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIjE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAU/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,OAAO,CAUhE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL hygiene: tracking-parameter stripping and canonical cache keys.
|
|
3
|
+
* Pure and dependency-free — safe in Node, Workers, and browsers.
|
|
4
|
+
*
|
|
5
|
+
* Two verbs for two jobs:
|
|
6
|
+
* - `cleanUrl(url)`: the SAME resource, minus tracking params. Safe to fetch,
|
|
7
|
+
* share, and display. Keeps scheme, www., remaining param order, and the
|
|
8
|
+
* fragment (a fragment can be a real anchor).
|
|
9
|
+
* - `urlKey(url)`: the resource's IDENTITY, for cache keys and dedupe.
|
|
10
|
+
* Scheme-agnostic, lowercase host without www. or a trailing dot, no
|
|
11
|
+
* trailing slash, tracking params stripped, surviving params sorted,
|
|
12
|
+
* fragment dropped. Two spellings of one page collide; two different
|
|
13
|
+
* pages never do.
|
|
14
|
+
*
|
|
15
|
+
* Plus the text side: `findUrls(text)` / `asHttpUrl(token)` pull clean URLs
|
|
16
|
+
* out of what a user typed, and `hostOf` / `hostMatches` (RFC 6265 domain-
|
|
17
|
+
* matching) answer host questions.
|
|
18
|
+
*
|
|
19
|
+
* Each concern rides its state of the art instead of hand-rolls:
|
|
20
|
+
* - detection in free text: linkifyjs (scanner-based, TLD-aware, MIT);
|
|
21
|
+
* - parsing/serialization: the WHATWG URL API, never regexes;
|
|
22
|
+
* - which params are tracking: vendored from @protontech/tidy-url (Proton's
|
|
23
|
+
* maintained fork of DrKain/tidy-url, MIT; see tidy-rules.ts, refresh with
|
|
24
|
+
* `pnpm update-url-rules`) plus a small tested overlay (overlay.ts) —
|
|
25
|
+
* param names compare literally (lowercased), per host;
|
|
26
|
+
* - `urlKey` is ours: no standard exists for cache identity.
|
|
27
|
+
*
|
|
28
|
+
* Unparseable or non-http(s) input passes through unchanged: these are hygiene
|
|
29
|
+
* functions over user-pasted text, not validators.
|
|
30
|
+
*/
|
|
31
|
+
import { find } from "linkifyjs";
|
|
32
|
+
import { OVERLAY_RULES } from "./overlay.js";
|
|
33
|
+
import { TIDY_RULES } from "./tidy-rules.js";
|
|
34
|
+
export { TIDY_RULES, TIDY_VERSION } from "./tidy-rules.js";
|
|
35
|
+
export { OVERLAY_RULES } from "./overlay.js";
|
|
36
|
+
/**
|
|
37
|
+
* Every http(s) URL in free text, in order, cleaned. Detection is linkifyjs —
|
|
38
|
+
* a real scanner, TLD-aware for scheme-less domains, and it owns the messy
|
|
39
|
+
* text-boundary problems (trailing punctuation, brackets, emails-are-not-URLs)
|
|
40
|
+
* — then each match goes through the URL parser and tracking-param stripping.
|
|
41
|
+
* Scheme-less matches coerce to https:// (drop them with `requireScheme`).
|
|
42
|
+
*/
|
|
43
|
+
export function findUrls(text, opts) {
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const link of find(text, "url", { defaultProtocol: "https" })) {
|
|
46
|
+
// href === value exactly when the text already carried a scheme; otherwise
|
|
47
|
+
// the scanner built href by prepending defaultProtocol onto the bare match.
|
|
48
|
+
const hadScheme = link.href === link.value;
|
|
49
|
+
if (!hadScheme && opts?.requireScheme)
|
|
50
|
+
continue;
|
|
51
|
+
const u = parseHttp(link.href);
|
|
52
|
+
if (!u)
|
|
53
|
+
continue; // a non-http scheme the scanner knows; not our job
|
|
54
|
+
deleteTracking(u, opts);
|
|
55
|
+
out.push({ url: u.toString(), start: link.start, end: link.end, hadScheme });
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A user-pasted token as one CLEAN http(s) URL, or null: {@link findUrls}
|
|
61
|
+
* over the token, first match. The one verb between "text someone typed"
|
|
62
|
+
* and "a URL you can use".
|
|
63
|
+
*/
|
|
64
|
+
export function asHttpUrl(token, opts) {
|
|
65
|
+
return findUrls(token, opts)[0]?.url ?? null;
|
|
66
|
+
}
|
|
67
|
+
/** A URL's host without a leading www., or the input unchanged if it won't parse. */
|
|
68
|
+
export function hostOf(url) {
|
|
69
|
+
try {
|
|
70
|
+
return new URL(url).hostname.replace(/^www\./, "");
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return url;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* True if `host` IS `domain` or a subdomain of it — never a lookalike suffix
|
|
78
|
+
* (`notyoutube.com` doesn't match `youtube.com`). RFC 6265 §5.1.3 domain-
|
|
79
|
+
* matching semantics, the same rule cookies use.
|
|
80
|
+
*/
|
|
81
|
+
export function hostMatches(host, domain) {
|
|
82
|
+
const h = host.toLowerCase().replace(/^www\./, "").replace(/\.$/, "");
|
|
83
|
+
const d = domain.toLowerCase();
|
|
84
|
+
return h === d || h.endsWith(`.${d}`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The same URL minus tracking params: safe to fetch, share, and display.
|
|
88
|
+
* Unparseable or non-http(s) input is returned unchanged.
|
|
89
|
+
*/
|
|
90
|
+
export function cleanUrl(url, opts) {
|
|
91
|
+
const u = parseHttp(url);
|
|
92
|
+
if (!u)
|
|
93
|
+
return url;
|
|
94
|
+
deleteTracking(u, opts);
|
|
95
|
+
return u.toString();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A canonical identity for the resource behind `url` — `host/path?sortedQuery`
|
|
99
|
+
* — for cache keys and dedupe. Unparseable or non-http(s) input is returned
|
|
100
|
+
* unchanged so it still keys consistently.
|
|
101
|
+
*/
|
|
102
|
+
export function urlKey(url, opts) {
|
|
103
|
+
const u = parseHttp(url);
|
|
104
|
+
if (!u)
|
|
105
|
+
return url;
|
|
106
|
+
deleteTracking(u, opts);
|
|
107
|
+
u.searchParams.sort();
|
|
108
|
+
const host = u.hostname.toLowerCase().replace(/^www\./, "").replace(/\.$/, "");
|
|
109
|
+
const port = u.port ? `:${u.port}` : ""; // default ports never survive URL parsing
|
|
110
|
+
const path = u.pathname.replace(/\/+$/, "") || "/";
|
|
111
|
+
const query = u.searchParams.toString();
|
|
112
|
+
return `${host}${port}${path}${query ? `?${query}` : ""}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* True if `name` is a tracking param — globally, or on `host` specifically.
|
|
116
|
+
* Providers that match on the full URL (matchHref) need more context than a
|
|
117
|
+
* host and are skipped here; `cleanUrl`/`urlKey` do honor them.
|
|
118
|
+
*/
|
|
119
|
+
export function isTrackingParam(name, host = "") {
|
|
120
|
+
const n = name.toLowerCase();
|
|
121
|
+
const doomed = new Set();
|
|
122
|
+
const allowed = new Set();
|
|
123
|
+
for (const p of compiled()) {
|
|
124
|
+
if (p.provider.matchHref)
|
|
125
|
+
continue;
|
|
126
|
+
if (!p.match.test(host))
|
|
127
|
+
continue;
|
|
128
|
+
collect(p.provider, doomed, allowed);
|
|
129
|
+
}
|
|
130
|
+
return doomed.has(n) && !allowed.has(n);
|
|
131
|
+
}
|
|
132
|
+
let cache = null;
|
|
133
|
+
/** All providers (vendored + overlay), matchers compiled once per process. */
|
|
134
|
+
function compiled() {
|
|
135
|
+
cache ??= [...TIDY_RULES, ...OVERLAY_RULES].map((provider) => ({
|
|
136
|
+
provider,
|
|
137
|
+
match: new RegExp(provider.match, provider.flags),
|
|
138
|
+
exclude: (provider.exclude ?? []).map((e) => new RegExp(e.match, e.flags)),
|
|
139
|
+
}));
|
|
140
|
+
return cache;
|
|
141
|
+
}
|
|
142
|
+
/** Parse as a WHATWG URL, but only for http(s); anything else → null. */
|
|
143
|
+
function parseHttp(url) {
|
|
144
|
+
let u;
|
|
145
|
+
try {
|
|
146
|
+
u = new URL(url);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return u.protocol === "http:" || u.protocol === "https:" ? u : null;
|
|
152
|
+
}
|
|
153
|
+
/** Fold one provider's rules/allow into the doomed/allowed sets (lowercased). */
|
|
154
|
+
function collect(provider, doomed, allowed) {
|
|
155
|
+
for (const r of provider.rules)
|
|
156
|
+
doomed.add(r.toLowerCase());
|
|
157
|
+
for (const a of provider.allow ?? [])
|
|
158
|
+
allowed.add(a.toLowerCase());
|
|
159
|
+
}
|
|
160
|
+
/** Remove tracking params (dataset + overlay + caller extras) from `u` in place. */
|
|
161
|
+
function deleteTracking(u, opts) {
|
|
162
|
+
const doomed = new Set();
|
|
163
|
+
const allowed = new Set();
|
|
164
|
+
for (const p of compiled()) {
|
|
165
|
+
// Upstream semantics: providers match on the host (href when matchHref),
|
|
166
|
+
// and an exclude pattern opts the whole URL out of that provider.
|
|
167
|
+
if (!p.match.test(p.provider.matchHref ? u.href : u.host))
|
|
168
|
+
continue;
|
|
169
|
+
if (p.exclude.some((x) => x.test(u.href)))
|
|
170
|
+
continue;
|
|
171
|
+
collect(p.provider, doomed, allowed);
|
|
172
|
+
}
|
|
173
|
+
for (const extra of opts?.strip ?? [])
|
|
174
|
+
doomed.add(extra.toLowerCase());
|
|
175
|
+
for (const a of allowed)
|
|
176
|
+
doomed.delete(a);
|
|
177
|
+
if (doomed.size === 0)
|
|
178
|
+
return;
|
|
179
|
+
// Collect first: deleting while iterating URLSearchParams skips entries.
|
|
180
|
+
const keys = [...new Set(u.searchParams.keys())];
|
|
181
|
+
for (const k of keys) {
|
|
182
|
+
if (doomed.has(k.toLowerCase()))
|
|
183
|
+
u.searchParams.delete(k);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/universal/url/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAyB,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAuB7C;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAsB;IAC5D,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACpE,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,aAAa;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,SAAS,CAAC,mDAAmD;QACrE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAAsB;IAC9D,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,MAAM,CAAC,GAAW;IACjC,IAAI,CAAC;QACJ,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,GAAG,CAAC;IACZ,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACvD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAmB;IACxD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,IAAmB;IACtD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACtB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,0CAA0C;IACnF,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IACnD,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;IACxC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAI,GAAG,EAAE;IACtD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS;YAAE,SAAS;QACnC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAUD,IAAI,KAAK,GAA8B,IAAI,CAAC;AAE5C,8EAA8E;AAC9E,SAAS,QAAQ;IAChB,KAAK,KAAK,CAAC,GAAG,UAAU,EAAE,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9D,QAAQ;QACR,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QACjD,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;KAC1E,CAAC,CAAC,CAAC;IACJ,OAAO,KAAK,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,SAAS,SAAS,CAAC,GAAW;IAC7B,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QACJ,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,iFAAiF;AACjF,SAAS,OAAO,CAAC,QAA0B,EAAE,MAAmB,EAAE,OAAoB;IACrF,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,oFAAoF;AACpF,SAAS,cAAc,CAAC,CAAM,EAAE,IAAmB;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;QAC5B,yEAAyE;QACzE,kEAAkE;QAClE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACpE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QACpD,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC9B,yEAAyE;IACzE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated additions the vendored ruleset lacks, in the same TrackingProvider
|
|
3
|
+
* shape so the engine treats both identically. Everything here is covered by
|
|
4
|
+
* tests/url-test.ts; entries that land upstream can be deleted on the next
|
|
5
|
+
* `pnpm update-url-rules`.
|
|
6
|
+
*
|
|
7
|
+
* The bar for the global entry is UNAMBIGUOUS: ad-platform click ids and
|
|
8
|
+
* analytics linkers that never carry meaning anywhere. Ambiguous names
|
|
9
|
+
* (`ref`, `source`, `si`, `t`) go under a host — a global strip of `ref`
|
|
10
|
+
* would corrupt GitHub URLs, where it names a branch.
|
|
11
|
+
*/
|
|
12
|
+
import type { TrackingProvider } from "./tidy-rules.js";
|
|
13
|
+
export declare const OVERLAY_RULES: readonly TrackingProvider[];
|
|
14
|
+
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/universal/url/overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,eAAO,MAAM,aAAa,EAAE,SAAS,gBAAgB,EA6DpD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const OVERLAY_RULES = [
|
|
2
|
+
{
|
|
3
|
+
name: "overlay:global",
|
|
4
|
+
match: ".*",
|
|
5
|
+
flags: "",
|
|
6
|
+
rules: [
|
|
7
|
+
// Ad-platform click ids upstream's Global list misses
|
|
8
|
+
"msclkid", // Microsoft Ads
|
|
9
|
+
"dclid", // Google DoubleClick
|
|
10
|
+
"yclid", // Yandex
|
|
11
|
+
"twclid", // Twitter Ads
|
|
12
|
+
"ttclid", // TikTok Ads
|
|
13
|
+
"li_fat_id", // LinkedIn
|
|
14
|
+
"epik", // Pinterest
|
|
15
|
+
"irclickid", // Impact Radius
|
|
16
|
+
"srsltid", // Google Merchant / shopping results
|
|
17
|
+
"gbraid", // Google Ads (iOS attribution)
|
|
18
|
+
"wbraid",
|
|
19
|
+
// Google Analytics cross-domain linker
|
|
20
|
+
"_ga",
|
|
21
|
+
"_gl",
|
|
22
|
+
"_gid",
|
|
23
|
+
// Openstat (mail.ru / rambler analytics)
|
|
24
|
+
"_openstat",
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
// Upstream's youtube matcher (`.*.youtube.com`) misses the bare host, and its
|
|
29
|
+
// rules miss the share/attribution params — carry a superset that covers both.
|
|
30
|
+
name: "overlay:youtube.com",
|
|
31
|
+
match: "(^|\\.)youtube\\.com$",
|
|
32
|
+
flags: "i",
|
|
33
|
+
rules: ["si", "pp", "ab_channel", "kw", "feature", "app", "embeds_referring_euri", "embeds_referring_origin"],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "overlay:youtu.be",
|
|
37
|
+
match: "(^|\\.)youtu\\.be$",
|
|
38
|
+
flags: "i",
|
|
39
|
+
rules: ["si", "feature"],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
// Upstream covers twitter.com but not the x.com rename; `t` (share token) is
|
|
43
|
+
// missing on both. `s` and `t` are share residue here, meaningful elsewhere.
|
|
44
|
+
name: "overlay:x.com",
|
|
45
|
+
match: "(^|\\.)x\\.com$",
|
|
46
|
+
flags: "i",
|
|
47
|
+
rules: ["s", "t", "src", "ref_url", "ref_src", "mx"],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "overlay:twitter.com",
|
|
51
|
+
match: "(^|\\.)twitter\\.com$",
|
|
52
|
+
flags: "i",
|
|
53
|
+
rules: ["t"],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
// Substack share links: `r` is the referrer handle, the rest is signup routing.
|
|
57
|
+
name: "overlay:substack.com",
|
|
58
|
+
match: "(^|\\.)substack\\.com$",
|
|
59
|
+
flags: "i",
|
|
60
|
+
rules: ["r", "triedRedirect", "freeWelcomeReferral", "isFreemail"],
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/universal/url/overlay.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,aAAa,GAAgC;IACzD;QACC,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,EAAE;QACT,KAAK,EAAE;YACN,sDAAsD;YACtD,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,aAAa;YACvB,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,YAAY;YACpB,WAAW,EAAE,gBAAgB;YAC7B,SAAS,EAAE,qCAAqC;YAChD,QAAQ,EAAE,+BAA+B;YACzC,QAAQ;YACR,uCAAuC;YACvC,KAAK;YACL,KAAK;YACL,MAAM;YACN,yCAAyC;YACzC,WAAW;SACX;KACD;IACD;QACC,8EAA8E;QAC9E,+EAA+E;QAC/E,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,uBAAuB;QAC9B,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,yBAAyB,CAAC;KAC7G;IACD;QACC,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,oBAAoB;QAC3B,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;KACxB;IACD;QACC,6EAA6E;QAC7E,6EAA6E;QAC7E,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;KACpD;IACD;QACC,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,uBAAuB;QAC9B,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,CAAC,GAAG,CAAC;KACZ;IACD;QACC,gFAAgF;QAChF,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,qBAAqB,EAAE,YAAY,CAAC;KAClE;CACD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface TrackingProvider {
|
|
2
|
+
name: string;
|
|
3
|
+
/** Host-matcher regex source; tested against the URL host (href when matchHref). */
|
|
4
|
+
match: string;
|
|
5
|
+
flags: string;
|
|
6
|
+
matchHref?: boolean;
|
|
7
|
+
/** Param names to strip (compared lowercased). */
|
|
8
|
+
rules: readonly string[];
|
|
9
|
+
/** Param names protected from ANY rule on this provider's URLs. */
|
|
10
|
+
allow?: readonly string[];
|
|
11
|
+
/** URL patterns that opt a URL out of this provider entirely. */
|
|
12
|
+
exclude?: readonly {
|
|
13
|
+
match: string;
|
|
14
|
+
flags: string;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
export declare const TIDY_VERSION = "1.18.5";
|
|
18
|
+
export declare const TIDY_RULES: readonly TrackingProvider[];
|
|
19
|
+
//# sourceMappingURL=tidy-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tidy-rules.d.ts","sourceRoot":"","sources":["../../../src/universal/url/tidy-rules.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,mEAAmE;IACnE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,iEAAiE;IACjE,OAAO,CAAC,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtD;AAED,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,UAAU,EAAE,SAAS,gBAAgB,EAiLjD,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// GENERATED FILE — do not edit; refresh with `pnpm update-url-rules`.
|
|
2
|
+
//
|
|
3
|
+
// Tracking-parameter ruleset vendored from @protontech/tidy-url@1.18.5 (data/rules.js),
|
|
4
|
+
// Proton's maintained fork of https://github.com/DrKain/tidy-url.
|
|
5
|
+
// Upstream license: MIT — Copyright (c) 2021 DrKain (https://github.com/DrKain)
|
|
6
|
+
//
|
|
7
|
+
// Carried fields: the host matcher (match/flags; tested against the URL host,
|
|
8
|
+
// or the full href when matchHref), the param names to strip (rules), params
|
|
9
|
+
// protected from any rule (allow), and URL patterns that opt a URL out of the
|
|
10
|
+
// provider (exclude). Upstream's redirect/AMP/decode features are out of scope;
|
|
11
|
+
// 56 providers that only did those were dropped (176 kept).
|
|
12
|
+
// Generated 2026-07-13.
|
|
13
|
+
export const TIDY_VERSION = "1.18.5";
|
|
14
|
+
export const TIDY_RULES = [
|
|
15
|
+
{ "name": "Global", "match": ".*", "flags": "", "rules": ["utm_source", "utm_medium", "utm_term", "utm_campaign", "utm_content", "utm_name", "utm_cid", "utm_reader", "utm_viz_id", "utm_pubreferrer", "utm_swu", "utm_social-type", "utm_brand", "utm_team", "utm_feeditemid", "utm_id", "utm_marketing_tactic", "utm_creative_format", "utm_campaign_id", "utm_source_platform", "utm_timestamp", "utm_souce", "utm_couponvalue", "itm_source", "itm_medium", "itm_term", "itm_campaign", "itm_content", "itm_channel", "itm_source_s", "itm_medium_s", "itm_campaign_s", "itm_audience", "int_source", "int_cmp_name", "int_cmp_id", "int_cmp_creative", "int_medium", "int_campaign", "int_content", "pk_campaign", "pk_cpn", "pk_source", "pk_medium", "pk_keyword", "pk_kwd", "pk_content", "pk_cid", "piwik_campaign", "piwik_cpn", "piwik_source", "piwik_medium", "piwik_keyword", "piwik_kwd", "piwik_content", "piwik_cid", "gclid", "ga_source", "ga_medium", "ga_term", "ga_content", "ga_campaign", "ga_place", "gclid", "gclsrc", "hsa_cam", "hsa_grp", "hsa_mt", "hsa_src", "hsa_ad", "hsa_acc", "hsa_net", "hsa_kw", "hsa_tgt", "hsa_ver", "hsa_la", "hsa_ol", "fbclid", "oly_enc_id", "oly_anon_id", "vero_id", "vero_conv", "__s", "_hsenc", "_hsmi", "__hssc", "__hstc", "__hsfp", "hsCtaTracking", "mkt_tok", "mtm_campaign", "mtm_keyword", "mtm_kwd", "mtm_source", "mtm_medium", "mtm_content", "mtm_cid", "mtm_group", "mtm_placement", "elqTrackId", "elq", "elqak", "elqaid", "elqat", "elqCampaignId", "elqTrack", "mc_cid", "mc_eid", "ncid", "cmpid", "mbid", "rdt_cid"] },
|
|
16
|
+
{ "name": "audible.com", "match": "www.audible.com", "flags": "i", "rules": ["qid", "sr", "pf_rd_p", "pf_rd_r", "plink", "ref"] },
|
|
17
|
+
{ "name": "bandcamp.com", "match": ".*.bandcamp.com", "flags": "i", "rules": ["from", "search_item_id", "search_item_type", "search_match_part", "search_page_id", "search_page_no", "search_rank", "search_sig"] },
|
|
18
|
+
{ "name": "amazon.com", "match": "amazon\\.[a-z0-9]{0,3}", "flags": "i", "rules": ["psc", "colid", "coliid", "linkId", "tag", "linkCode", "ms3_c", "pf_rd_s", "pf_rd_t", " pf_rd_i", "pf_rd_m", "pd_rd_w", "qid", "sr", "keywords", "dchild", "ref", "ref_", "rnid", "pf_rd_r", "pf_rd_p", "pd_rd_r", "smid", "pd_rd_wg", "content-id", "spLa", "crid", "sprefix", "hvlocint", "hvdvcmdl", "hvptwo", "hvpone", "hvpos", "qu", "pd_rd_i", "nc2", "nc1", "trk", "sc_icampaign", "trkCampaign", "ufe", "sc_icontent", "sc_ichannel", "sc_iplace", "sc_country", "sc_outcome", "sc_geo", "sc_campaign", "sc_channel"] },
|
|
19
|
+
{ "name": "reddit.com", "match": ".*.reddit.com", "flags": "i", "rules": ["ref_campaign", "ref_source", "tags", "keyword", "channel", "campaign", "user_agent", "domain", "base_url", "$android_deeplink_path", "$deeplink_path", "$og_redirect", "share_id", "correlation_id", "ref", "rdt"] },
|
|
20
|
+
{ "name": "app.link", "match": ".*\\.app\\.link", "flags": "i", "rules": ["tags", "keyword", "channel", "campaign", "user_agent", "domain", "base_url", "$android_deeplink_path", "$deeplink_path", "$og_redirect", "compact_view", "dnt", "adblock", "geoip_country", "referrer_domain", "referrer_url"] },
|
|
21
|
+
{ "name": "twitch.tv", "match": "www.twitch.tv", "flags": "i", "rules": ["tt_medium", "tt_content", "tt_email_id"] },
|
|
22
|
+
{ "name": "blog.twitch.tv", "match": "blog.twitch.tv", "flags": "i", "rules": ["utm_referrer"] },
|
|
23
|
+
{ "name": "pixiv.net", "match": "www.pixiv.net", "flags": "i", "rules": ["p", "i", "g"] },
|
|
24
|
+
{ "name": "spotify.com", "match": "open.spotify.com", "flags": "i", "rules": ["si", "utm_source", "context", "sp_cid", "_branch_match_id", "_branch_referrer"], "allow": ["go", "nd"] },
|
|
25
|
+
{ "name": "aliexpress.com", "match": "^(?:https?:\\/\\/)?(?:[^.]+\\.)?aliexpress\\.(?:[a-z]{2,}){1,}", "flags": "i", "rules": ["_t", "spm", "algo_pvid", "algo_expid", "btsid", "ws_ab_test", "initiative_id", "origin", "widgetId", "tabType", "productId", "productIds", "gps-id", "scm", "scm_id", "scm-url", "pvid", "algo_exp_id", "pdp_pi", "fromRankId", "sourceType", "utparam", "gatewayAdapt", "_evo_buckets", "tpp_rcmd_bucket_id", "scenario", "pdp_npi", "tt", "spreadType", "srcSns", "bizType", "social_params", "aff_fcid", "aff_fsk", "aff_platform", "aff_trace_key", "shareId", "platform", "businessType", "terminal_id", "afSmartRedirect", "sk", "gbraid"], "allow": ["sku_id", "pdp_ext_f"] },
|
|
26
|
+
{ "name": "google.com", "match": "www.google\\..*", "flags": "i", "rules": ["sourceid", "client", "aqs", "sxsrf", "uact", "ved", "iflsig", "source", "ei", "oq", "gs_lcp", "sclient", "bih", "biw", "sa", "dpr", "rlz", "gs_lp", "sca_esv", "si", "gs_l", "gs_lcrp"] },
|
|
27
|
+
{ "name": "youtube.com", "match": ".*.youtube.com", "flags": "i", "rules": ["gclid", "feature", "app", "src", "lId", "cId", "embeds_referring_euri"] },
|
|
28
|
+
{ "name": "humblebundle.com", "match": "www.humblebundle.com", "flags": "i", "rules": ["hmb_source", "hmb_medium", "hmb_campaign", "mcID", "linkID"], "allow": ["partner"] },
|
|
29
|
+
{ "name": "greenmangaming.com", "match": "www.greenmangaming.com", "flags": "i", "rules": ["CJEVENT", "cjevent", "irclickid", "irgwc", "pdpgatetoken"] },
|
|
30
|
+
{ "name": "fanatical.com", "match": "www.fanatical.com", "flags": "i", "rules": ["cj_pid", "cj_aid", "aff_track", "CJEVENT", "cjevent"] },
|
|
31
|
+
{ "name": "newsweek.com", "match": "www.newsweek.com", "flags": "i", "rules": ["subref", "amp"] },
|
|
32
|
+
{ "name": "imgur.com", "match": "imgur.com", "flags": "i", "rules": ["source"] },
|
|
33
|
+
{ "name": "plex.tv", "match": ".*.plex.tv", "flags": "i", "rules": ["origin", "plex_utm", "sl", "ckhid"] },
|
|
34
|
+
{ "name": "imdb.com", "match": "^.*\\.imdb\\.com", "flags": "i", "rules": ["ref_", "ref\\_", "pf_rd_m", "pf_rd_r", "pf_rd_p", "pf_rd_s", "pf_rd_t", "pf_rd_i", "ref_hp_hp_e_2", "rf", "ref"] },
|
|
35
|
+
{ "name": "gog.com", "match": "www.gog.com", "flags": "i", "rules": ["at_gd", "rec_scenario_id", "rec_sub_source_id", "rec_item_id", "vds_id", "prod_id", "rec_source"] },
|
|
36
|
+
{ "name": "tiktok.com", "match": "www.tiktok.com", "flags": "i", "rules": ["is_copy_url", "is_from_webapp", "sender_device", "sender_web_id", "sec_user_id", "share_app_id", "share_item_id", "share_link_id", "social_sharing", "_r", "source", "user_id", "u_code", "tt_from", "share_author_id", "sec_uid", "checksum", "_d", "refer", "enter_from", "enter_method", "attr_medium", "attr_source"], "allow": ["lang"] },
|
|
37
|
+
{ "name": "facebook.com", "match": ".*.facebook.com", "flags": "i", "rules": ["fbclid", "fb_ref", "fb_source", "referral_code", "referral_story_type", "tracking", "ref"], "exclude": [{ "match": "www\\.facebook\\.com\\/sharer", "flags": "i" }] },
|
|
38
|
+
{ "name": "yandex.com", "match": "yandex.com", "flags": "i", "rules": ["lr", "from", "grhow", "origin", "_openstat"] },
|
|
39
|
+
{ "name": "store.steampowered.com", "match": "store.steampowered.com", "flags": "i", "rules": ["snr"] },
|
|
40
|
+
{ "name": "findojobs.co.nz", "match": "www.findojobs.co.nz", "flags": "i", "rules": ["source"] },
|
|
41
|
+
{ "name": "linkedin.com", "match": ".*.linkedin.com", "flags": "i", "rules": ["contextUrn", "destRedirectURL", "lipi", "licu", "trk", "trkInfo", "originalReferer", "upsellOrderOrigin", "upsellTrk", "upsellTrackingId", "src", "trackingId", "midToken", "midSig", "trkEmail", "eid"], "allow": ["otpToken"] },
|
|
42
|
+
{ "name": "indeed.com", "match": ".*.indeed.com", "flags": "i", "rules": ["from", "attributionid"] },
|
|
43
|
+
{ "name": "discord.com", "match": "(?:.*\\.)?discord\\.com", "flags": "i", "rules": ["source", "ref"] },
|
|
44
|
+
{ "name": "medium.com", "match": "medium.com", "flags": "i", "rules": ["source"] },
|
|
45
|
+
{ "name": "twitter.com", "match": "twitter.com", "flags": "i", "rules": ["s", "src", "ref_url", "ref_src"] },
|
|
46
|
+
{ "name": "voidu.com", "match": "voidu.com", "flags": "i", "rules": ["affiliate"] },
|
|
47
|
+
{ "name": "wingamestore.com", "match": "wingamestore.com", "flags": "i", "rules": ["ars"] },
|
|
48
|
+
{ "name": "gamebillet.com", "match": "gamebillet.com", "flags": "i", "rules": ["affiliate"] },
|
|
49
|
+
{ "name": "gamesload.com", "match": "^www.gamesload.com", "flags": "i", "rules": ["affil"], "allow": ["REF"] },
|
|
50
|
+
{ "name": "mightyape", "match": "mightyape.(co.nz|com.au)", "flags": "i", "rules": ["m"] },
|
|
51
|
+
{ "name": "apple.com", "match": ".*.apple.com", "flags": "i", "rules": ["uo", "app", "at", "ct", "ls", "pt", "mt", "itsct", "itscg", "referrer", "src", "cid"] },
|
|
52
|
+
{ "name": "music.apple.com", "match": "music.apple.com", "flags": "i", "rules": ["i", "lId", "cId", "sr", "src"] },
|
|
53
|
+
{ "name": "play.google.com", "match": "play.google.com", "flags": "i", "rules": ["referrer", "pcampaignid"] },
|
|
54
|
+
{ "name": "lenovo.com", "match": ".*.lenovo.com", "flags": "i", "rules": ["PID", "clickid", "irgwc", "cid", "acid", "linkTrack"] },
|
|
55
|
+
{ "name": "itch.io", "match": "itch.io", "flags": "i", "rules": ["fbclid"] },
|
|
56
|
+
{ "name": "microsoft.com", "match": "microsoft.com", "flags": "i", "rules": ["refd", "icid"] },
|
|
57
|
+
{ "name": "berrybase.de", "match": "berrybase.de", "flags": "i", "rules": ["sPartner"] },
|
|
58
|
+
{ "name": "instagram.com", "match": "instagram.com", "flags": "i", "rules": ["igshid", "igsh", "source"] },
|
|
59
|
+
{ "name": "hubspot.com", "match": "hubspot.com", "flags": "i", "rules": ["hubs_content-cta", "hubs_content"] },
|
|
60
|
+
{ "name": "ebay.com", "match": "^(?:https?:\\/\\/)?(?:[^.]+\\.)?ebay\\.[a-z0-9]{0,3}", "flags": "i", "rules": ["amdata", "var", "hash", "_trkparms", "_trksid", "_from", "mkcid", "mkrid", "campid", "toolid", "mkevt", "customid", "siteid", "ufes_redirect", "ff3", "pub", "media", "widget_ver", "ssspo", "sssrc", "ssuid"], "allow": ["epid", "_nkw"] },
|
|
61
|
+
{ "name": "shopee.com", "match": "^(?:https?:\\/\\/)?(?:[^.]+\\.)?shopee\\.[a-z0-9]{0,3}", "flags": "i", "rules": ["af_siteid", "pid", "af_click_lookback", "af_viewthrough_lookback", "is_retargeting", "af_reengagement_window", "af_sub_siteid", "c"] },
|
|
62
|
+
{ "name": "msn.com", "match": "www.msn.com", "flags": "i", "rules": ["ocid", "cvid", "pc"] },
|
|
63
|
+
{ "name": "nuuvem.com", "match": "www.nuuvem.com", "flags": "i", "rules": ["ranMID", "ranEAID", "ranSiteID"] },
|
|
64
|
+
{ "name": "linksynergy.com", "match": ".*.linksynergy.com", "flags": "i", "rules": ["id", "mid"] },
|
|
65
|
+
{ "name": "cnbc.com", "match": "www.cnbc.com", "flags": "i", "rules": ["__source"] },
|
|
66
|
+
{ "name": "yahoo.com", "match": "yahoo.com", "flags": "i", "rules": ["guce_referrer", "guce_referrer_sig", "guccounter", "soc_src", "soc_trk", "tsrc"] },
|
|
67
|
+
{ "name": "techcrunch.com", "match": "techcrunch.com", "flags": "i", "rules": ["guce_referrer", "guce_referrer_sig", "guccounter"] },
|
|
68
|
+
{ "name": "office.com", "match": "office.com", "flags": "i", "rules": ["from"] },
|
|
69
|
+
{ "name": "ticketmaster.co.nz", "match": "ticketmaster.co.nz", "flags": "i", "rules": ["tm_link"] },
|
|
70
|
+
{ "name": "bostonglobe.com", "match": "bostonglobe.com", "flags": "i", "rules": ["p1"] },
|
|
71
|
+
{ "name": "ampproject.org", "match": "cdn.ampproject.org", "flags": "i", "rules": ["amp_gsa", "amp_js_v", "usqp", "outputType"] },
|
|
72
|
+
{ "name": "nbcnews.com", "match": "nbcnews.com", "flags": "i", "rules": ["fbclid"] },
|
|
73
|
+
{ "name": "countdown.co.nz", "match": "www.countdown.co.nz", "flags": "i", "rules": ["promo_name", "promo_creative", "promo_position", "itemID"] },
|
|
74
|
+
{ "name": "etsy.com", "match": "www.etsy.com", "flags": "i", "rules": ["click_key", "click_sum", "rec_type", "ref", "frs", "sts", "dd_referrer"] },
|
|
75
|
+
{ "name": "wattpad.com", "match": "www.wattpad.com", "flags": "i", "rules": ["wp_page", "wp_uname", "wp_originator"] },
|
|
76
|
+
{ "name": "noctre.com", "match": "www.noctre.com", "flags": "i", "rules": ["aff"] },
|
|
77
|
+
{ "name": "dreamgame.com", "match": "www.dreamgame.com", "flags": "i", "rules": ["affiliate"] },
|
|
78
|
+
{ "name": "startpage.com", "match": ".*.startpage.com", "flags": "i", "rules": ["source"] },
|
|
79
|
+
{ "name": "2game.com", "match": "^2game.com", "flags": "i", "rules": ["ref"] },
|
|
80
|
+
{ "name": "gamesplanet.com", "match": "^(?:.*\\.|)gamesplanet\\.com", "flags": "i", "rules": ["ref"] },
|
|
81
|
+
{ "name": "gamersgate.com", "match": "www.gamersgate.com", "flags": "i", "rules": ["aff"] },
|
|
82
|
+
{ "name": "ranker.com", "match": "^(www|blog).ranker.com", "flags": "i", "rules": ["ref", "rlf", "l", "li_source", "li_medium"] },
|
|
83
|
+
{ "name": "watchworthy.app", "match": "^watchworthy.app", "flags": "i", "rules": ["ref"] },
|
|
84
|
+
{ "name": "squarespace.com", "match": "^.*.squarespace.com", "flags": "i", "rules": ["subchannel", "source", "subcampaign", "campaign", "channel", "_ga"] },
|
|
85
|
+
{ "name": "baidu.com", "match": "^www.baidu.com", "flags": "i", "rules": ["rsv_spt", "rsv_idx", "rsv_pq", "rsv_t", "rsv_bp", "rsv_dl", "rsv_iqid", "rsv_enter", "rsv_sug1", "rsv_sug2", "rsv_sug3", "rsv_sug4", "rsv_sug5", "rsv_sug6", "rsv_sug7", "rsv_sug8", "rsv_sug9", "rsv_sug7", "rsv_btype", "tn", "sa", "rsf", "rqid", "usm", "__pc2ps_ab", "p_signature", "p_sign", "p_timestamp", "p_tk", "oq"], "allow": ["wd", "ie"] },
|
|
86
|
+
{ "name": "primevideo.com", "match": "^www.primevideo.com", "flags": "i", "rules": ["dclid"] },
|
|
87
|
+
{ "name": "threadless.com", "match": "^www.threadless.com", "flags": "i", "rules": ["itm_source_s", "itm_medium_s", "itm_campaign_s"] },
|
|
88
|
+
{ "name": "wsj.com", "match": "^www.wsj.com", "flags": "i", "rules": ["mod"] },
|
|
89
|
+
{ "name": "thewarehouse.co.nz", "match": "^www.thewarehouse.co.nz", "flags": "i", "rules": ["sfmc_j", "sfmc_id", "sfmc_mid", "sfmc_uid", "sfmc_id", "sfmc_activityid"] },
|
|
90
|
+
{ "name": "ko-fi.com", "match": "^ko-fi.com", "flags": "i", "rules": ["ref", "src"] },
|
|
91
|
+
{ "name": "indiegala.com", "match": "^www.indiegala.com", "flags": "i", "rules": ["ref"] },
|
|
92
|
+
{ "name": "transparency.fb.com", "match": "^transparency.fb.com", "flags": "i", "rules": ["source"] },
|
|
93
|
+
{ "name": "manymorestores.com", "match": "^www.manymorestores.com", "flags": "i", "rules": ["ref"] },
|
|
94
|
+
{ "name": "macgamestore.com", "match": "^www.macgamestore.com", "flags": "i", "rules": ["ars"] },
|
|
95
|
+
{ "name": "blizzardgearstore.com", "match": "^www.blizzardgearstore.com", "flags": "i", "rules": ["_s"] },
|
|
96
|
+
{ "name": "playbook.com", "match": "^www.playbook.com", "flags": "i", "rules": ["p"] },
|
|
97
|
+
{ "name": "cookiepro.com", "match": "^.*.cookiepro.com", "flags": "i", "rules": ["source", "referral"] },
|
|
98
|
+
{ "name": "pinterest.com", "match": "^www\\.pinterest\\..*", "flags": "i", "rules": ["rs"] },
|
|
99
|
+
{ "name": "bing.com", "match": "^www\\.bing\\.com", "flags": "i", "rules": ["qs", "form", "sp", "pq", "sc", "sk", "cvid", "FORM", "ck", "simid", "thid", "cdnurl", "pivotparams", "ghsh", "ghacc", "ccid", "", "ru"], "allow": ["q", "tsc", "iss", "id", "view", "setlang"] },
|
|
100
|
+
{ "name": "jf79.net", "match": "^jf79\\.net", "flags": "i", "rules": ["li", "wi", "ws", "ws2"] },
|
|
101
|
+
{ "name": "frankenergie.nl", "match": "^www\\.frankenergie\\.nl", "flags": "i", "rules": ["aff_id"] },
|
|
102
|
+
{ "name": "nova.cz", "match": "^.*\\.nova\\.cz", "flags": "i", "rules": ["sznclid"] },
|
|
103
|
+
{ "name": "cnn.com", "match": ".*.cnn.com", "flags": "i", "rules": ["hpt", "iid"], "exclude": [{ "match": "e.newsletters.cnn.com", "flags": "i" }] },
|
|
104
|
+
{ "name": "justwatch.com", "match": "click\\.justwatch\\.com", "flags": "i", "rules": ["cx", "uct_country", "uct_buybox", "sid"] },
|
|
105
|
+
{ "name": "psychologytoday.com", "match": "www\\.psychologytoday\\.com", "flags": "i", "rules": ["amp"] },
|
|
106
|
+
{ "name": "mouser.com", "match": "www\\.mouser\\.com", "flags": "i", "rules": ["qs"] },
|
|
107
|
+
{ "name": "awin1.com", "match": "www\\.awin1\\.com", "flags": "i", "rules": ["awinmid", "awinaffid", "clickref"] },
|
|
108
|
+
{ "name": "castorama.fr", "match": "www\\.castorama\\.fr", "flags": "i", "rules": ["syte_ref"] },
|
|
109
|
+
{ "name": "quizlet.com", "match": "quizlet\\.com", "flags": "i", "rules": ["funnelUUID", "source"] },
|
|
110
|
+
{ "name": "pbtech.co.nz", "match": "www\\.pbtech\\.co\\.nz", "flags": "i", "rules": ["qr"] },
|
|
111
|
+
{ "name": "matomo.org", "match": "matomo\\.org", "flags": "i", "rules": ["menu", "footer", "header", "hp-reasons-learn", "hp-top", "above-fold", "step1-hp", "mid-hp", "take-back-control-hp", "hp-reasons-icon", "hp-reasons-heading", "hp-reasons-p", "hp-bottom", "footer", "menu"] },
|
|
112
|
+
{ "name": "eufy.com", "match": "eufy\\.com", "flags": "i", "rules": ["ref"] },
|
|
113
|
+
{ "name": "newsflare.com", "match": "www\\.newsflare\\.com", "flags": "i", "rules": ["jwsource"] },
|
|
114
|
+
{ "name": "wish.com", "match": "www\\.wish\\.com", "flags": "i", "rules": ["share"] },
|
|
115
|
+
{ "name": "change.org", "match": "www\\.change\\.org", "flags": "i", "rules": ["source_location"] },
|
|
116
|
+
{ "name": "washingtonpost.com", "match": ".*\\.washingtonpost\\.com", "flags": "i", "rules": ["itid", "s_l"] },
|
|
117
|
+
{ "name": "lowes.com", "match": "www\\.lowes\\.com", "flags": "i", "rules": ["cm_mmc", "ds_rl", "gbraid"] },
|
|
118
|
+
{ "name": "stacks.wellcomecollection.org", "match": "stacks\\.wellcomecollection\\.org", "flags": "i", "rules": ["source"] },
|
|
119
|
+
{ "name": "redbubble.com", "match": ".*\\.redbubble\\.com", "flags": "i", "rules": ["ref"] },
|
|
120
|
+
{ "name": "inyourarea.co.uk", "match": "inyourarea.co.uk", "flags": "i", "rules": ["from_reach_primary_nav", "from_reach_footer_nav", "branding"] },
|
|
121
|
+
{ "name": "fiverr.com", "match": ".*\\.fiverr\\.com", "flags": "i", "rules": ["source", "context_referrer", "referrer_gig_slug", "ref_ctx_id", "funnel", "imp_id"] },
|
|
122
|
+
{ "name": "kqzyfj.com", "match": "www\\.kqzyfj\\.com", "flags": "i", "rules": ["cjsku", "pubdata"] },
|
|
123
|
+
{ "name": "marca.com", "match": ".*\\.marca\\.com", "flags": "i", "rules": ["intcmp", "s_kw", "emk"] },
|
|
124
|
+
{ "name": "marcaentradas.com", "match": ".*\\.marcaentradas\\.com", "flags": "i", "rules": ["intcmp", "s_kw"] },
|
|
125
|
+
{ "name": "honeycode.aws", "match": ".*\\.honeycode\\.aws", "flags": "i", "rules": ["trackingId", "sc_icampaign", "sc_icontent", "sc_ichannel", "sc_iplace", "sc_country", "sc_outcome", "sc_geo", "sc_campaign", "sc_channel", "trkCampaign", "trk"] },
|
|
126
|
+
{ "name": "studentbeans.com", "match": "www\\.studentbeans\\.com", "flags": "i", "rules": ["source"] },
|
|
127
|
+
{ "name": "boxofficemojo.com", "match": "boxofficemojo.com", "flags": "i", "rules": ["ref_"] },
|
|
128
|
+
{ "name": "solodeportes.com.ar", "match": "www.solodeportes.com.ar", "flags": "i", "rules": ["nosto", "refSrc"] },
|
|
129
|
+
{ "name": "joybuggy.com", "match": "joybuggy.com", "flags": "i", "rules": ["ref"] },
|
|
130
|
+
{ "name": "etail.market", "match": "etail.market", "flags": "i", "rules": ["tracking"] },
|
|
131
|
+
{ "name": "myanimelist.net", "match": "myanimelist.net", "flags": "i", "rules": ["_location", "click_type", "click_param"] },
|
|
132
|
+
{ "name": "support-dev.discord.com", "match": "support-dev.discord.com", "flags": "i", "rules": ["ref"] },
|
|
133
|
+
{ "name": "dlgamer.com", "match": "dlgamer.com", "flags": "i", "rules": ["affil"] },
|
|
134
|
+
{ "name": "newsletter.manor.ch", "match": "newsletter.manor.ch", "flags": "i", "rules": ["user_id_1"] },
|
|
135
|
+
{ "name": "producthunt.com", "match": "producthunt.com", "flags": "i", "rules": ["ref"] },
|
|
136
|
+
{ "name": "cbsnews.com", "match": "www.cbsnews.com", "flags": "i", "rules": ["ftag", "intcid"] },
|
|
137
|
+
{ "name": "jobs.venturebeat.com", "match": "jobs.venturebeat.com", "flags": "i", "rules": ["source"] },
|
|
138
|
+
{ "name": "wfaa.com", "match": "www.wfaa.com", "flags": "i", "rules": ["ref"] },
|
|
139
|
+
{ "name": "buyatoyota.com", "match": "www.buyatoyota.com", "flags": "i", "rules": ["siteid"] },
|
|
140
|
+
{ "name": "independent.co.uk", "match": "www.independent.co.uk", "flags": "i", "rules": ["amp", "regSourceMethod"] },
|
|
141
|
+
{ "name": "cooking.nytimes.com", "match": "cooking.nytimes.com", "flags": "i", "rules": ["smid", "variant", "algo", "req_id", "surface", "imp_id", "action", "region", "module", "pgType"] },
|
|
142
|
+
{ "name": "optigruen.com", "match": "www\\.optigruen\\.[a-z0-9]{0,3}", "flags": "i", "rules": ["cHash", "chash", "mdrv"] },
|
|
143
|
+
{ "name": "osi.rosenberger.com", "match": "osi.rosenberger.com", "flags": "i", "rules": ["cHash", "chash"] },
|
|
144
|
+
{ "name": "cbc.ca", "match": "cbc.ca", "flags": "i", "rules": ["__vfz", "cmp", "referrer"] },
|
|
145
|
+
{ "name": "local12.com", "match": "local12.com", "flags": "i", "rules": ["_gl"] },
|
|
146
|
+
{ "name": "eufylife.com", "match": "eufylife.com", "flags": "i", "rules": ["ref"] },
|
|
147
|
+
{ "name": "walmart.com", "match": "walmart.com", "flags": "i", "rules": ["athAsset", "povid", "wmlspartner", "athcpid", "athpgid", "athznid", "athmtid", "athstid", "athguid", "athwpid", "athtvid", "athcgid", "athieid", "athancid", "athbdg", "campaign_id", "eventST", "bt", "pos", "rdf", "tax", "plmt", "mloc", "pltfm", "pgId", "pt", "spQs", "adUid", "adsRedirect"] },
|
|
148
|
+
{ "name": "dyno.gg", "match": "dyno.gg", "flags": "i", "rules": ["ref"] },
|
|
149
|
+
{ "name": "eufylife.com", "match": "eufylife.com", "flags": "i", "rules": ["ref"] },
|
|
150
|
+
{ "name": "connect.studentbeans.com", "match": "connect.studentbeans.com", "flags": "i", "rules": ["ref"] },
|
|
151
|
+
{ "name": "s.pemsrv.com", "match": "s.pemsrv.com", "flags": "i", "rules": ["cat", "idzone", "type", "sub", "block", "el", "tags", "cookieconsent", "scr_info"] },
|
|
152
|
+
{ "name": "chess.com", "match": "www.chess.com", "flags": "i", "rules": ["c"] },
|
|
153
|
+
{ "name": "porndude.link", "match": "porndude.link", "flags": "i", "rules": ["ref"] },
|
|
154
|
+
{ "name": "xvideos.com", "match": "xvideos.com", "flags": "i", "rules": ["sxcaf"] },
|
|
155
|
+
{ "name": "xvideos.red", "match": "xvideos.red", "flags": "i", "rules": ["sxcaf", "pmsc", "pmln"] },
|
|
156
|
+
{ "name": "xhamster.com", "match": "xhamster.com", "flags": "i", "rules": ["source"] },
|
|
157
|
+
{ "name": "milkrun.com", "match": "milkrun.com", "flags": "i", "rules": ["_branch_match_id", "_branch_referrer"] },
|
|
158
|
+
{ "name": "gog.salesmanago.com", "match": "gog.salesmanago.com", "flags": "i", "rules": ["smclient", "smconv", "smlid"] },
|
|
159
|
+
{ "name": "dailymail.co.uk", "match": "dailymail.co.uk", "flags": "i", "rules": ["reg_source", "ito"] },
|
|
160
|
+
{ "name": "hashnode.com", "match": "(?:.*\\.)?hashnode\\.com", "flags": "i", "rules": ["source"] },
|
|
161
|
+
{ "name": "s.amazon-adsystem.com", "match": "s.amazon-adsystem.com", "flags": "i", "rules": ["dsig", "d", "ex-fch", "ex-fargs", "cb"] },
|
|
162
|
+
{ "name": "theguardian.com", "match": "theguardian.com", "flags": "i", "rules": ["INTCMP", "acquisitionData", "REFPVID"] },
|
|
163
|
+
{ "name": "seek.co.nz", "match": "www.seek.co.nz", "flags": "i", "rules": ["tracking", "sc_trk"] },
|
|
164
|
+
{ "name": "seekvolunteer.co.nz", "match": "seekvolunteer.co.nz", "flags": "i", "rules": ["tracking", "sc_trk"] },
|
|
165
|
+
{ "name": "seekbusiness.com.au", "match": "www.seekbusiness.com.au", "flags": "i", "rules": ["tracking", "cid"] },
|
|
166
|
+
{ "name": "garageclothing.com", "match": "www.garageclothing.com", "flags": "i", "rules": ["syte_ref", "site_ref"] },
|
|
167
|
+
{ "name": "urbandictionary.com", "match": "urbandictionary.com", "flags": "i", "rules": ["amp"] },
|
|
168
|
+
{ "name": "norml.org", "match": "norml.org", "flags": "i", "rules": ["amp"] },
|
|
169
|
+
{ "name": "nbcconnecticut.com", "match": "www.nbcconnecticut.com", "flags": "i", "rules": ["amp"] },
|
|
170
|
+
{ "name": "ladysmithchronicle.com", "match": "www.ladysmithchronicle.com", "flags": "i", "rules": ["ref"] },
|
|
171
|
+
{ "name": "m10news.com", "match": "m10news.com", "flags": "i", "rules": ["amp"] },
|
|
172
|
+
{ "name": "libretro.com", "match": "www.libretro.com", "flags": "i", "rules": ["amp"] },
|
|
173
|
+
{ "name": "bostonherald.com", "match": "bostonherald.com", "flags": "i", "rules": ["g2i_source", "g2i_medium", "g2i_campaign"] },
|
|
174
|
+
{ "name": "playshoptitans.com", "match": "playshoptitans.com", "flags": "i", "rules": ["af_ad", "pid", "source_caller", "shortlink", "c"] },
|
|
175
|
+
{ "name": "news.com.au", "match": "www.news.com.au", "flags": "i", "rules": ["sourceCode"] },
|
|
176
|
+
{ "name": "wvva.com", "match": "www.wvva.com", "flags": "i", "rules": ["outputType"] },
|
|
177
|
+
{ "name": "realestate.com.au", "match": "www.realestate.com.au", "flags": "i", "rules": ["campaignType", "campaignChannel", "campaignName", "campaignContent", "campaignSource", "campaignPlacement", "sourcePage", "sourceElement", "cid"] },
|
|
178
|
+
{ "name": "redirectingat.com", "match": "redirectingat.com", "flags": "i", "rules": ["id", "xcust", "xs"] },
|
|
179
|
+
{ "name": "map.sewoon.org", "match": "map.sewoon.org", "flags": "i", "rules": ["cid"] },
|
|
180
|
+
{ "name": "vi-control.net", "match": "[&?]source=https:\\/\\/vi-control\\.net\\/community$", "flags": "", "matchHref": true, "rules": ["source"] },
|
|
181
|
+
{ "name": "rosequake.com", "match": "www.rosequake.com", "flags": "i", "rules": ["edmID", "linkID", "userID", "em", "taskItemID"] },
|
|
182
|
+
{ "name": "rekrute.com", "match": "www.rekrute.com", "flags": "i", "rules": ["clear"] },
|
|
183
|
+
{ "name": "go.skimresources.com", "match": "go.skimresources.com", "flags": "i", "rules": ["id", "xs", "xcust"] },
|
|
184
|
+
{ "name": "khnum-ezi.com", "match": "khnum-ezi.com", "flags": "i", "rules": ["browserWidth", "browserHeight", "iframeDetected", "webdriverDetected", "gpu", "timezone", "visitid", "type", "timezoneName"] },
|
|
185
|
+
{ "name": "theatlantic.com", "match": "(?:www|accounts)\\.theatlantic\\.com", "flags": "i", "rules": ["source", "referral"] },
|
|
186
|
+
{ "name": "rumble.com", "match": "rumble.com", "flags": "i", "rules": ["e9s"] },
|
|
187
|
+
{ "name": "cointiply.com", "match": "cointiply.com", "flags": "i", "rules": ["source_cta"] },
|
|
188
|
+
{ "name": "dev.to", "match": "dev.to", "flags": "", "rules": ["t", "s", "u"] },
|
|
189
|
+
{ "name": "milda-clq.com", "match": "milda-clq.com", "flags": "", "rules": ["visitid", "type", "browserWidth", "browserHeight", "webdriverDetected", "timezone", "gpu", "iframeDetected", "timezoneName"] },
|
|
190
|
+
{ "name": "app.message.asce", "match": ".*.app\\.message\\.asce\\.org", "flags": "i", "rules": [], "allow": ["elq"] },
|
|
191
|
+
];
|
|
192
|
+
//# sourceMappingURL=tidy-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tidy-rules.js","sourceRoot":"","sources":["../../../src/universal/url/tidy-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Vendors the tracking-parameter ruleset from @protontech/tidy-url (Proton's
|
|
4
|
+
* maintained fork of DrKain/tidy-url, MIT) into ./tidy-rules.ts. Same pattern
|
|
5
|
+
* as currency's download-crypto-list.ts: dataset knowledge is community-
|
|
6
|
+
* maintained upstream; we vendor a snapshot instead of taking a runtime dep.
|
|
7
|
+
*
|
|
8
|
+
* Only the param-stripping fields are carried over (name, match, match_href,
|
|
9
|
+
* rules, allow, exclude). Upstream's redirect-unwrapping, AMP, and base64-
|
|
10
|
+
* decode features are out of scope — providers that ONLY do those are dropped.
|
|
11
|
+
*
|
|
12
|
+
* Usage: pnpm update-url-rules
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=update-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-rules.d.ts","sourceRoot":"","sources":["../../../src/universal/url/update-rules.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Vendors the tracking-parameter ruleset from @protontech/tidy-url (Proton's
|
|
4
|
+
* maintained fork of DrKain/tidy-url, MIT) into ./tidy-rules.ts. Same pattern
|
|
5
|
+
* as currency's download-crypto-list.ts: dataset knowledge is community-
|
|
6
|
+
* maintained upstream; we vendor a snapshot instead of taking a runtime dep.
|
|
7
|
+
*
|
|
8
|
+
* Only the param-stripping fields are carried over (name, match, match_href,
|
|
9
|
+
* rules, allow, exclude). Upstream's redirect-unwrapping, AMP, and base64-
|
|
10
|
+
* decode features are out of scope — providers that ONLY do those are dropped.
|
|
11
|
+
*
|
|
12
|
+
* Usage: pnpm update-url-rules
|
|
13
|
+
*/
|
|
14
|
+
import { execSync } from "node:child_process";
|
|
15
|
+
import { mkdtempSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { createRequire } from "node:module";
|
|
17
|
+
import { tmpdir } from "node:os";
|
|
18
|
+
import { dirname, join } from "node:path";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
const OUT = join(dirname(fileURLToPath(import.meta.url)), "tidy-rules.ts");
|
|
21
|
+
const PACKAGE = "@protontech/tidy-url";
|
|
22
|
+
function fetchUpstream() {
|
|
23
|
+
const dir = mkdtempSync(join(tmpdir(), "tidy-url-"));
|
|
24
|
+
console.log(`Packing ${PACKAGE}@latest ...`);
|
|
25
|
+
const tarball = execSync(`npm pack ${PACKAGE}@latest --pack-destination ${JSON.stringify(dir)}`, {
|
|
26
|
+
encoding: "utf8",
|
|
27
|
+
})
|
|
28
|
+
.trim()
|
|
29
|
+
.split("\n")
|
|
30
|
+
.at(-1);
|
|
31
|
+
if (!tarball)
|
|
32
|
+
throw new Error("npm pack produced no tarball name");
|
|
33
|
+
execSync(`tar xzf ${JSON.stringify(join(dir, tarball))} -C ${JSON.stringify(dir)}`);
|
|
34
|
+
const pkg = JSON.parse(readFileSync(join(dir, "package/package.json"), "utf8"));
|
|
35
|
+
// data/rules.js is CommonJS (`module.exports = [...]`) with RegExp literals;
|
|
36
|
+
// requiring it yields real RegExp objects — no parsing of our own.
|
|
37
|
+
const rules = createRequire(import.meta.url)(join(dir, "package/data/rules.js"));
|
|
38
|
+
const copyright = readFileSync(join(dir, "package/LICENSE"), "utf8")
|
|
39
|
+
.split("\n")
|
|
40
|
+
.find((l) => l.startsWith("Copyright"));
|
|
41
|
+
if (!Array.isArray(rules) || rules.length === 0)
|
|
42
|
+
throw new Error("upstream rules did not load");
|
|
43
|
+
if (pkg.license !== "MIT")
|
|
44
|
+
throw new Error(`upstream license changed to ${pkg.license} — review before vendoring`);
|
|
45
|
+
return { rules, version: pkg.version, license: `${pkg.license} — ${copyright ?? ""}`.trim() };
|
|
46
|
+
}
|
|
47
|
+
/** A regex serialized for the generated file; `g`/`y` are dropped (statefulness). */
|
|
48
|
+
function serializeRegex(re) {
|
|
49
|
+
return { match: re.source, flags: re.flags.replace(/[gy]/g, "") };
|
|
50
|
+
}
|
|
51
|
+
function assertStrings(list, where) {
|
|
52
|
+
for (const item of list) {
|
|
53
|
+
if (typeof item !== "string")
|
|
54
|
+
throw new Error(`non-string entry in ${where}: ${JSON.stringify(item)}`);
|
|
55
|
+
}
|
|
56
|
+
return list;
|
|
57
|
+
}
|
|
58
|
+
function generate() {
|
|
59
|
+
const { rules, version, license } = fetchUpstream();
|
|
60
|
+
const kept = rules
|
|
61
|
+
.filter((r) => (r.rules?.length ?? 0) > 0 || (r.allow?.length ?? 0) > 0)
|
|
62
|
+
.map((r) => {
|
|
63
|
+
if (typeof r.name !== "string" || !(r.match instanceof RegExp)) {
|
|
64
|
+
throw new Error(`malformed provider: ${JSON.stringify(r.name)}`);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
name: r.name,
|
|
68
|
+
...serializeRegex(r.match),
|
|
69
|
+
...(r.match_href === true ? { matchHref: true } : {}),
|
|
70
|
+
rules: assertStrings(r.rules ?? [], r.name),
|
|
71
|
+
...(r.allow?.length ? { allow: assertStrings(r.allow, `${r.name}.allow`) } : {}),
|
|
72
|
+
...(r.exclude?.length ? { exclude: r.exclude.map(serializeRegex) } : {}),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
const dropped = rules.length - kept.length;
|
|
76
|
+
const body = kept.map((p) => `\t${JSON.stringify(p)},`).join("\n");
|
|
77
|
+
const file = `// GENERATED FILE — do not edit; refresh with \`pnpm update-url-rules\`.
|
|
78
|
+
//
|
|
79
|
+
// Tracking-parameter ruleset vendored from ${PACKAGE}@${version} (data/rules.js),
|
|
80
|
+
// Proton's maintained fork of https://github.com/DrKain/tidy-url.
|
|
81
|
+
// Upstream license: ${license}
|
|
82
|
+
//
|
|
83
|
+
// Carried fields: the host matcher (match/flags; tested against the URL host,
|
|
84
|
+
// or the full href when matchHref), the param names to strip (rules), params
|
|
85
|
+
// protected from any rule (allow), and URL patterns that opt a URL out of the
|
|
86
|
+
// provider (exclude). Upstream's redirect/AMP/decode features are out of scope;
|
|
87
|
+
// ${dropped} providers that only did those were dropped (${kept.length} kept).
|
|
88
|
+
// Generated ${new Date().toISOString().slice(0, 10)}.
|
|
89
|
+
|
|
90
|
+
export interface TrackingProvider {
|
|
91
|
+
name: string;
|
|
92
|
+
/** Host-matcher regex source; tested against the URL host (href when matchHref). */
|
|
93
|
+
match: string;
|
|
94
|
+
flags: string;
|
|
95
|
+
matchHref?: boolean;
|
|
96
|
+
/** Param names to strip (compared lowercased). */
|
|
97
|
+
rules: readonly string[];
|
|
98
|
+
/** Param names protected from ANY rule on this provider's URLs. */
|
|
99
|
+
allow?: readonly string[];
|
|
100
|
+
/** URL patterns that opt a URL out of this provider entirely. */
|
|
101
|
+
exclude?: readonly { match: string; flags: string }[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const TIDY_VERSION = ${JSON.stringify(version)};
|
|
105
|
+
|
|
106
|
+
export const TIDY_RULES: readonly TrackingProvider[] = [
|
|
107
|
+
${body}
|
|
108
|
+
];
|
|
109
|
+
`;
|
|
110
|
+
writeFileSync(OUT, file);
|
|
111
|
+
console.log(`Wrote ${kept.length} providers (${dropped} dropped) from ${PACKAGE}@${version} → ${OUT}`);
|
|
112
|
+
}
|
|
113
|
+
generate();
|
|
114
|
+
//# sourceMappingURL=update-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-rules.js","sourceRoot":"","sources":["../../../src/universal/url/update-rules.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adriangalilea/utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"description": "TypeScript utilities - logger, currency, formatter, GramIO bot plugins, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -24,6 +24,10 @@
|
|
|
24
24
|
"types": "./dist/universal/format.d.ts",
|
|
25
25
|
"default": "./dist/universal/format.js"
|
|
26
26
|
},
|
|
27
|
+
"./url": {
|
|
28
|
+
"types": "./dist/universal/url/index.d.ts",
|
|
29
|
+
"default": "./dist/universal/url/index.js"
|
|
30
|
+
},
|
|
27
31
|
"./log": {
|
|
28
32
|
"types": "./dist/universal/log.d.ts",
|
|
29
33
|
"default": "./dist/universal/log.js"
|
|
@@ -169,6 +173,7 @@
|
|
|
169
173
|
"test:browser": "open tests/browser-test.html",
|
|
170
174
|
"example": "tsx tests/example.ts",
|
|
171
175
|
"update-crypto": "tsx src/universal/currency/download-crypto-list.ts",
|
|
176
|
+
"update-url-rules": "tsx src/universal/url/update-rules.ts",
|
|
172
177
|
"type-check": "tsc --noEmit",
|
|
173
178
|
"lint": "biome lint",
|
|
174
179
|
"format": "biome format",
|
|
@@ -185,7 +190,8 @@
|
|
|
185
190
|
"test:language-picker": "tsx tests/language-picker-test.ts",
|
|
186
191
|
"test:llm": "tsx tests/llm-live-test.ts",
|
|
187
192
|
"test:tg-md": "tsx tests/tg-md-test.ts",
|
|
188
|
-
"test:self-echo": "tsx tests/self-echo-test.ts"
|
|
193
|
+
"test:self-echo": "tsx tests/self-echo-test.ts",
|
|
194
|
+
"test:url": "tsx tests/url-test.ts"
|
|
189
195
|
},
|
|
190
196
|
"keywords": [
|
|
191
197
|
"typescript",
|
|
@@ -214,17 +220,17 @@
|
|
|
214
220
|
"zod": "^4.4.3"
|
|
215
221
|
},
|
|
216
222
|
"peerDependencies": {
|
|
223
|
+
"@ai-sdk/anthropic": "^4.0.0",
|
|
224
|
+
"@ai-sdk/openai-compatible": "^3.0.0",
|
|
217
225
|
"@gramio/format": ">=0.8.0",
|
|
218
226
|
"@gramio/session": ">=0.2.0",
|
|
227
|
+
"@gramio/split": "^0.0.1",
|
|
219
228
|
"@gramio/storage": ">=2.0.0",
|
|
229
|
+
"@openrouter/ai-sdk-provider": "^3.0.0",
|
|
230
|
+
"ai": "^7.0.0",
|
|
220
231
|
"gramio": "^0.12.0",
|
|
221
232
|
"marked": ">=12",
|
|
222
|
-
"zod": ">=3.22"
|
|
223
|
-
"ai": "^7.0.0",
|
|
224
|
-
"@ai-sdk/anthropic": "^4.0.0",
|
|
225
|
-
"@ai-sdk/openai-compatible": "^3.0.0",
|
|
226
|
-
"@openrouter/ai-sdk-provider": "^3.0.0",
|
|
227
|
-
"@gramio/split": "^0.0.1"
|
|
233
|
+
"zod": ">=3.22"
|
|
228
234
|
},
|
|
229
235
|
"peerDependenciesMeta": {
|
|
230
236
|
"@gramio/format": {
|
|
@@ -273,5 +279,8 @@
|
|
|
273
279
|
"url": "https://github.com/adriangalilea/ts-utils/issues"
|
|
274
280
|
},
|
|
275
281
|
"homepage": "https://github.com/adriangalilea/ts-utils#readme",
|
|
276
|
-
"sideEffects": false
|
|
282
|
+
"sideEffects": false,
|
|
283
|
+
"dependencies": {
|
|
284
|
+
"linkifyjs": "^4.3.3"
|
|
285
|
+
}
|
|
277
286
|
}
|