urlpurify 1.0.0 → 1.1.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 CHANGED
@@ -35,8 +35,9 @@ import { cleanUrl, defaultUnwrappers, unwrapWebArchive } from 'urlpurify'
35
35
  const cleaned = cleanUrl(url, {
36
36
  // Unwrappers to apply, first match wins per pass (omit to use defaults).
37
37
  unwrappers: [...defaultUnwrappers, unwrapWebArchive],
38
- // Query parameter names to remove, matched case-insensitively (omit to use defaults).
39
- trackingParams: ['utm_source', 'utm_medium', 'fbclid'],
38
+ // Param names (matched case-insensitively) or anchored regexes tested against the
39
+ // lowercased name (omit to use defaults).
40
+ trackingParams: ['fbclid', /^utm_[a-z0-9_-]+$/],
40
41
  // Maximum number of unwrap passes for nested wrappers. Defaults to 3.
41
42
  maxUnwrapDepth: 3,
42
43
  })
@@ -69,7 +70,7 @@ For wrappers that encode the target (base64 path segments, custom escaping), wri
69
70
 
70
71
  ### Defaults
71
72
 
72
- `defaultTrackingParams` and `defaultUnwrappers` are exported from the package root. `defaultUnwrappers` enables a conservative subset of the catalog (search-engine redirects and social-platform shims); everything else is exported individually for explicit opt-in.
73
+ `defaultTrackingParams` is the combined default list for `cleanUrl` and `stripTrackingParams`: literal names plus family regexes like `/^utm_[a-z0-9_-]+$/` that cover vendor namespaces where new variants keep appearing. Its parts are exported separately as `trackingParamsLiterals` (strings only, for consumers that need a plain string list) and `trackingParamsPatterns`. `defaultUnwrappers` is exported alongside. `defaultUnwrappers` enables a conservative subset of the catalog (search-engine redirects and social-platform shims); everything else is exported individually for explicit opt-in.
73
74
 
74
75
  ## Unwrappers
75
76
 
package/dist/clean.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { CleanUrlOptions, UrlUnwrapper } from "./types.js";
1
+ import { CleanUrlOptions, TrackingParam, UrlUnwrapper } from "./types.js";
2
2
 
3
3
  //#region src/clean.d.ts
4
4
  declare const unwrapUrl: (url: string, unwrappers?: Array<UrlUnwrapper>) => string | undefined;
5
- declare const stripTrackingParams: (url: string, trackingParams?: Array<string>) => string;
5
+ declare const stripTrackingParams: (url: string, trackingParams?: Array<TrackingParam>) => string;
6
6
  declare const cleanUrl: (url: string, options?: CleanUrlOptions) => string;
7
7
  //#endregion
8
8
  export { cleanUrl, stripTrackingParams, unwrapUrl };
package/dist/clean.js CHANGED
@@ -1,12 +1,18 @@
1
- import { defaultTrackingParams } from "./params.js";
2
- import { defaultUnwrappers } from "./defaults.js";
1
+ import { defaultTrackingParams, defaultUnwrappers } from "./defaults.js";
3
2
  //#region src/clean.ts
4
- const trackingParamsCache = /* @__PURE__ */ new WeakMap();
5
- const getTrackingParamsSet = (params) => {
6
- let cached = trackingParamsCache.get(params);
3
+ const trackingMatcherCache = /* @__PURE__ */ new WeakMap();
4
+ const getTrackingMatcher = (params) => {
5
+ let cached = trackingMatcherCache.get(params);
7
6
  if (!cached) {
8
- cached = new Set(params.map((param) => param.toLowerCase()));
9
- trackingParamsCache.set(params, cached);
7
+ const literals = /* @__PURE__ */ new Set();
8
+ const patterns = [];
9
+ for (const param of params) if (param instanceof RegExp) patterns.push(param);
10
+ else literals.add(param.toLowerCase());
11
+ cached = {
12
+ literals,
13
+ patterns
14
+ };
15
+ trackingMatcherCache.set(params, cached);
10
16
  }
11
17
  return cached;
12
18
  };
@@ -17,9 +23,12 @@ const parseUrl = (url) => {
17
23
  };
18
24
  const deleteTrackingParams = (url, trackingParams) => {
19
25
  if (!url.search) return false;
20
- const trackingSet = getTrackingParamsSet(trackingParams);
26
+ const matcher = getTrackingMatcher(trackingParams);
21
27
  const keysToDelete = [];
22
- for (const key of url.searchParams.keys()) if (trackingSet.has(key.toLowerCase())) keysToDelete.push(key);
28
+ for (const key of url.searchParams.keys()) {
29
+ const name = key.toLowerCase();
30
+ if (matcher.literals.has(name) || matcher.patterns.some((pattern) => pattern.test(name))) keysToDelete.push(key);
31
+ }
23
32
  for (const key of keysToDelete) url.searchParams.delete(key);
24
33
  return keysToDelete.length > 0;
25
34
  };
@@ -1,7 +1,9 @@
1
- import { UrlUnwrapper } from "./types.js";
2
- import { defaultTrackingParams } from "./params.js";
1
+ import { TrackingParam, UrlUnwrapper } from "./types.js";
2
+ import { trackingParamsLiterals } from "./tracking/literals.js";
3
+ import { trackingParamsPatterns } from "./tracking/patterns.js";
3
4
 
4
5
  //#region src/defaults.d.ts
6
+ declare const defaultTrackingParams: Array<TrackingParam>;
5
7
  declare const defaultUnwrappers: Array<UrlUnwrapper>;
6
8
  //#endregion
7
- export { defaultUnwrappers };
9
+ export { defaultTrackingParams, defaultUnwrappers };
package/dist/defaults.js CHANGED
@@ -10,8 +10,10 @@ import { unwrapRedditOut } from "./unwraps/redditOut.js";
10
10
  import { unwrapVkAway } from "./unwraps/vkAway.js";
11
11
  import { unwrapYahooSearch } from "./unwraps/yahooSearch.js";
12
12
  import { unwrapYouTube } from "./unwraps/youtube.js";
13
- import "./params.js";
13
+ import { trackingParamsLiterals } from "./tracking/literals.js";
14
+ import { trackingParamsPatterns } from "./tracking/patterns.js";
14
15
  //#region src/defaults.ts
16
+ const defaultTrackingParams = [...trackingParamsLiterals, ...trackingParamsPatterns];
15
17
  const defaultUnwrappers = [
16
18
  unwrapBing,
17
19
  unwrapGoogle,
@@ -27,4 +29,4 @@ const defaultUnwrappers = [
27
29
  unwrapRedditOut
28
30
  ];
29
31
  //#endregion
30
- export { defaultUnwrappers };
32
+ export { defaultTrackingParams, defaultUnwrappers };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { CleanUrlOptions, UrlUnwrapper } from "./types.js";
1
+ import { CleanUrlOptions, TrackingParam, UrlUnwrapper } from "./types.js";
2
2
  import { cleanUrl, stripTrackingParams, unwrapUrl } from "./clean.js";
3
- import { defaultTrackingParams } from "./params.js";
4
- import { defaultUnwrappers } from "./defaults.js";
3
+ import { trackingParamsLiterals } from "./tracking/literals.js";
4
+ import { trackingParamsPatterns } from "./tracking/patterns.js";
5
+ import { defaultTrackingParams, defaultUnwrappers } from "./defaults.js";
5
6
  import { unwrapAceml } from "./unwraps/aceml.js";
6
7
  import { unwrapAdjust } from "./unwraps/adjust.js";
7
8
  import { unwrapAmazonAffiliate } from "./unwraps/amazonAffiliate.js";
@@ -77,4 +78,4 @@ import { unwrapYandexTurbo } from "./unwraps/yandexTurbo.js";
77
78
  import { unwrapYouTube } from "./unwraps/youtube.js";
78
79
  import { unwrapZhihu } from "./unwraps/zhihu.js";
79
80
  import { ParamExtractorConfig, createParamExtractor } from "./utils.js";
80
- export { type CleanUrlOptions, type ParamExtractorConfig, type UrlUnwrapper, cleanUrl, createParamExtractor, defaultTrackingParams, defaultUnwrappers, stripTrackingParams, unwrapAceml, unwrapAdjust, unwrapAmazonAffiliate, unwrapAmpCache, unwrapAwin, unwrapBing, unwrapCjNetwork, unwrapDigidip, unwrapDisqus, unwrapDouban, unwrapDuckduckgo, unwrapEbayRover, unwrapEffiliation, unwrapEmbedly, unwrapFacebookShim, unwrapFeedsportal, unwrapFirebaseDynamicLinks, unwrapFlipboard, unwrapGateSc, unwrapGeoriot, unwrapGitee, unwrapGoogle, unwrapGoogleAmpViewer, unwrapGoogleNews, unwrapGoogleNewsModern, unwrapGoogleScholar, unwrapGoogleTranslate, unwrapHashnode, unwrapIcptrack, unwrapIdealoPartner, unwrapInstagramShim, unwrapJianshuGo, unwrapJuejin, unwrapLeverAnalytics, unwrapLinksynergy, unwrapMailchimp, unwrapMailpanion, unwrapMailpgn, unwrapMailtrack, unwrapMedium, unwrapMimecast, unwrapMozillaOutgoing, unwrapNarrativ, unwrapNicoMs, unwrapOutlookSafelinks, unwrapPartnerAds, unwrapPocket, unwrapPostmark, unwrapProofpointV1, unwrapProofpointV2, unwrapProofpointV3, unwrapPxf, unwrapRecruitics, unwrapRedditOut, unwrapRedirectingat, unwrapSegmentfault, unwrapShareasale, unwrapSjv, unwrapSkimlinks, unwrapSlack, unwrapSmartredirect, unwrapSspai, unwrapSteamLinkfilter, unwrapTelegramIv, unwrapTradedoubler, unwrapTumblr, unwrapUrl, unwrapValuecommerce, unwrapViglink, unwrapVkAway, unwrapWebArchive, unwrapYahooSearch, unwrapYandexTurbo, unwrapYouTube, unwrapZhihu };
81
+ export { type CleanUrlOptions, type ParamExtractorConfig, type TrackingParam, type UrlUnwrapper, cleanUrl, createParamExtractor, defaultTrackingParams, defaultUnwrappers, stripTrackingParams, trackingParamsLiterals, trackingParamsPatterns, unwrapAceml, unwrapAdjust, unwrapAmazonAffiliate, unwrapAmpCache, unwrapAwin, unwrapBing, unwrapCjNetwork, unwrapDigidip, unwrapDisqus, unwrapDouban, unwrapDuckduckgo, unwrapEbayRover, unwrapEffiliation, unwrapEmbedly, unwrapFacebookShim, unwrapFeedsportal, unwrapFirebaseDynamicLinks, unwrapFlipboard, unwrapGateSc, unwrapGeoriot, unwrapGitee, unwrapGoogle, unwrapGoogleAmpViewer, unwrapGoogleNews, unwrapGoogleNewsModern, unwrapGoogleScholar, unwrapGoogleTranslate, unwrapHashnode, unwrapIcptrack, unwrapIdealoPartner, unwrapInstagramShim, unwrapJianshuGo, unwrapJuejin, unwrapLeverAnalytics, unwrapLinksynergy, unwrapMailchimp, unwrapMailpanion, unwrapMailpgn, unwrapMailtrack, unwrapMedium, unwrapMimecast, unwrapMozillaOutgoing, unwrapNarrativ, unwrapNicoMs, unwrapOutlookSafelinks, unwrapPartnerAds, unwrapPocket, unwrapPostmark, unwrapProofpointV1, unwrapProofpointV2, unwrapProofpointV3, unwrapPxf, unwrapRecruitics, unwrapRedditOut, unwrapRedirectingat, unwrapSegmentfault, unwrapShareasale, unwrapSjv, unwrapSkimlinks, unwrapSlack, unwrapSmartredirect, unwrapSspai, unwrapSteamLinkfilter, unwrapTelegramIv, unwrapTradedoubler, unwrapTumblr, unwrapUrl, unwrapValuecommerce, unwrapViglink, unwrapVkAway, unwrapWebArchive, unwrapYahooSearch, unwrapYandexTurbo, unwrapYouTube, unwrapZhihu };
package/dist/index.js CHANGED
@@ -11,8 +11,9 @@ import { unwrapRedditOut } from "./unwraps/redditOut.js";
11
11
  import { unwrapVkAway } from "./unwraps/vkAway.js";
12
12
  import { unwrapYahooSearch } from "./unwraps/yahooSearch.js";
13
13
  import { unwrapYouTube } from "./unwraps/youtube.js";
14
- import { defaultTrackingParams } from "./params.js";
15
- import { defaultUnwrappers } from "./defaults.js";
14
+ import { trackingParamsLiterals } from "./tracking/literals.js";
15
+ import { trackingParamsPatterns } from "./tracking/patterns.js";
16
+ import { defaultTrackingParams, defaultUnwrappers } from "./defaults.js";
16
17
  import { cleanUrl, stripTrackingParams, unwrapUrl } from "./clean.js";
17
18
  import { unwrapAceml } from "./unwraps/aceml.js";
18
19
  import { unwrapAdjust } from "./unwraps/adjust.js";
@@ -76,4 +77,4 @@ import { unwrapViglink } from "./unwraps/viglink.js";
76
77
  import { unwrapWebArchive } from "./unwraps/webArchive.js";
77
78
  import { unwrapYandexTurbo } from "./unwraps/yandexTurbo.js";
78
79
  import { unwrapZhihu } from "./unwraps/zhihu.js";
79
- export { cleanUrl, createParamExtractor, defaultTrackingParams, defaultUnwrappers, stripTrackingParams, unwrapAceml, unwrapAdjust, unwrapAmazonAffiliate, unwrapAmpCache, unwrapAwin, unwrapBing, unwrapCjNetwork, unwrapDigidip, unwrapDisqus, unwrapDouban, unwrapDuckduckgo, unwrapEbayRover, unwrapEffiliation, unwrapEmbedly, unwrapFacebookShim, unwrapFeedsportal, unwrapFirebaseDynamicLinks, unwrapFlipboard, unwrapGateSc, unwrapGeoriot, unwrapGitee, unwrapGoogle, unwrapGoogleAmpViewer, unwrapGoogleNews, unwrapGoogleNewsModern, unwrapGoogleScholar, unwrapGoogleTranslate, unwrapHashnode, unwrapIcptrack, unwrapIdealoPartner, unwrapInstagramShim, unwrapJianshuGo, unwrapJuejin, unwrapLeverAnalytics, unwrapLinksynergy, unwrapMailchimp, unwrapMailpanion, unwrapMailpgn, unwrapMailtrack, unwrapMedium, unwrapMimecast, unwrapMozillaOutgoing, unwrapNarrativ, unwrapNicoMs, unwrapOutlookSafelinks, unwrapPartnerAds, unwrapPocket, unwrapPostmark, unwrapProofpointV1, unwrapProofpointV2, unwrapProofpointV3, unwrapPxf, unwrapRecruitics, unwrapRedditOut, unwrapRedirectingat, unwrapSegmentfault, unwrapShareasale, unwrapSjv, unwrapSkimlinks, unwrapSlack, unwrapSmartredirect, unwrapSspai, unwrapSteamLinkfilter, unwrapTelegramIv, unwrapTradedoubler, unwrapTumblr, unwrapUrl, unwrapValuecommerce, unwrapViglink, unwrapVkAway, unwrapWebArchive, unwrapYahooSearch, unwrapYandexTurbo, unwrapYouTube, unwrapZhihu };
80
+ export { cleanUrl, createParamExtractor, defaultTrackingParams, defaultUnwrappers, stripTrackingParams, trackingParamsLiterals, trackingParamsPatterns, unwrapAceml, unwrapAdjust, unwrapAmazonAffiliate, unwrapAmpCache, unwrapAwin, unwrapBing, unwrapCjNetwork, unwrapDigidip, unwrapDisqus, unwrapDouban, unwrapDuckduckgo, unwrapEbayRover, unwrapEffiliation, unwrapEmbedly, unwrapFacebookShim, unwrapFeedsportal, unwrapFirebaseDynamicLinks, unwrapFlipboard, unwrapGateSc, unwrapGeoriot, unwrapGitee, unwrapGoogle, unwrapGoogleAmpViewer, unwrapGoogleNews, unwrapGoogleNewsModern, unwrapGoogleScholar, unwrapGoogleTranslate, unwrapHashnode, unwrapIcptrack, unwrapIdealoPartner, unwrapInstagramShim, unwrapJianshuGo, unwrapJuejin, unwrapLeverAnalytics, unwrapLinksynergy, unwrapMailchimp, unwrapMailpanion, unwrapMailpgn, unwrapMailtrack, unwrapMedium, unwrapMimecast, unwrapMozillaOutgoing, unwrapNarrativ, unwrapNicoMs, unwrapOutlookSafelinks, unwrapPartnerAds, unwrapPocket, unwrapPostmark, unwrapProofpointV1, unwrapProofpointV2, unwrapProofpointV3, unwrapPxf, unwrapRecruitics, unwrapRedditOut, unwrapRedirectingat, unwrapSegmentfault, unwrapShareasale, unwrapSjv, unwrapSkimlinks, unwrapSlack, unwrapSmartredirect, unwrapSspai, unwrapSteamLinkfilter, unwrapTelegramIv, unwrapTradedoubler, unwrapTumblr, unwrapUrl, unwrapValuecommerce, unwrapViglink, unwrapVkAway, unwrapWebArchive, unwrapYahooSearch, unwrapYandexTurbo, unwrapYouTube, unwrapZhihu };
@@ -0,0 +1,4 @@
1
+ //#region src/tracking/literals.d.ts
2
+ declare const trackingParamsLiterals: string[];
3
+ //#endregion
4
+ export { trackingParamsLiterals };
@@ -1,5 +1,5 @@
1
- //#region src/params.ts
2
- const defaultTrackingParams = [
1
+ //#region src/tracking/literals.ts
2
+ const trackingParamsLiterals = [
3
3
  "utm_source",
4
4
  "utm_medium",
5
5
  "utm_campaign",
@@ -154,4 +154,4 @@ const defaultTrackingParams = [
154
154
  "xtor"
155
155
  ];
156
156
  //#endregion
157
- export { defaultTrackingParams };
157
+ export { trackingParamsLiterals };
@@ -0,0 +1,4 @@
1
+ //#region src/tracking/patterns.d.ts
2
+ declare const trackingParamsPatterns: Array<RegExp>;
3
+ //#endregion
4
+ export { trackingParamsPatterns };
@@ -0,0 +1,19 @@
1
+ //#region src/tracking/patterns.ts
2
+ const trackingParamsPatterns = [
3
+ /^utm_[a-z0-9_-]+$/,
4
+ /^stm_[a-z0-9_-]+$/,
5
+ /^hsa_[a-z0-9_]+$/,
6
+ /^mtm_[a-z0-9_]+$/,
7
+ /^pk_[a-z0-9_]+$/,
8
+ /^piwik_[a-z0-9_]+$/,
9
+ /^itm_[a-z0-9_]+$/,
10
+ /^int_[a-z0-9_]+$/,
11
+ /^at_[a-z0-9_]+$/,
12
+ /^g2i_[a-z0-9_]+$/,
13
+ /^bsft_[a-z0-9_]+$/,
14
+ /^sfmc_[a-z0-9_]+$/,
15
+ /^oft_[a-z0-9_]+$/,
16
+ /^cm_mmca?\d*$/
17
+ ];
18
+ //#endregion
19
+ export { trackingParamsPatterns };
package/dist/types.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  //#region src/types.d.ts
2
2
  type UrlUnwrapper = (url: URL) => string | undefined;
3
+ type TrackingParam = string | RegExp;
3
4
  type CleanUrlOptions = {
4
5
  unwrappers?: Array<UrlUnwrapper>;
5
- trackingParams?: Array<string>;
6
+ trackingParams?: Array<TrackingParam>;
6
7
  maxUnwrapDepth?: number;
7
8
  };
8
9
  //#endregion
9
- export { CleanUrlOptions, UrlUnwrapper };
10
+ export { CleanUrlOptions, TrackingParam, UrlUnwrapper };
package/package.json CHANGED
@@ -41,5 +41,5 @@
41
41
  "kvalita": "^1.14.0",
42
42
  "tsdown": "^0.22.2"
43
43
  },
44
- "version": "1.0.0"
44
+ "version": "1.1.0"
45
45
  }
package/dist/params.d.ts DELETED
@@ -1,4 +0,0 @@
1
- //#region src/params.d.ts
2
- declare const defaultTrackingParams: string[];
3
- //#endregion
4
- export { defaultTrackingParams };