urlpurify 1.0.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.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/clean.d.ts +8 -0
  4. package/dist/clean.js +63 -0
  5. package/dist/defaults.d.ts +7 -0
  6. package/dist/defaults.js +30 -0
  7. package/dist/index.d.ts +80 -0
  8. package/dist/index.js +79 -0
  9. package/dist/params.d.ts +4 -0
  10. package/dist/params.js +157 -0
  11. package/dist/types.d.ts +9 -0
  12. package/dist/unwraps/aceml.d.ts +6 -0
  13. package/dist/unwraps/aceml.js +15 -0
  14. package/dist/unwraps/adjust.d.ts +6 -0
  15. package/dist/unwraps/adjust.js +9 -0
  16. package/dist/unwraps/amazonAffiliate.d.ts +6 -0
  17. package/dist/unwraps/amazonAffiliate.js +9 -0
  18. package/dist/unwraps/ampCache.d.ts +6 -0
  19. package/dist/unwraps/ampCache.js +13 -0
  20. package/dist/unwraps/awin.d.ts +6 -0
  21. package/dist/unwraps/awin.js +9 -0
  22. package/dist/unwraps/bing.d.ts +6 -0
  23. package/dist/unwraps/bing.js +14 -0
  24. package/dist/unwraps/cjNetwork.d.ts +6 -0
  25. package/dist/unwraps/cjNetwork.js +17 -0
  26. package/dist/unwraps/digidip.d.ts +6 -0
  27. package/dist/unwraps/digidip.js +8 -0
  28. package/dist/unwraps/disqus.d.ts +6 -0
  29. package/dist/unwraps/disqus.js +8 -0
  30. package/dist/unwraps/douban.d.ts +6 -0
  31. package/dist/unwraps/douban.js +9 -0
  32. package/dist/unwraps/duckduckgo.d.ts +6 -0
  33. package/dist/unwraps/duckduckgo.js +9 -0
  34. package/dist/unwraps/ebayRover.d.ts +6 -0
  35. package/dist/unwraps/ebayRover.js +8 -0
  36. package/dist/unwraps/effiliation.d.ts +6 -0
  37. package/dist/unwraps/effiliation.js +8 -0
  38. package/dist/unwraps/embedly.d.ts +6 -0
  39. package/dist/unwraps/embedly.js +8 -0
  40. package/dist/unwraps/facebook.d.ts +6 -0
  41. package/dist/unwraps/facebook.js +9 -0
  42. package/dist/unwraps/feedsportal.d.ts +6 -0
  43. package/dist/unwraps/feedsportal.js +44 -0
  44. package/dist/unwraps/firebaseDynamicLinks.d.ts +6 -0
  45. package/dist/unwraps/firebaseDynamicLinks.js +8 -0
  46. package/dist/unwraps/flipboard.d.ts +6 -0
  47. package/dist/unwraps/flipboard.js +9 -0
  48. package/dist/unwraps/gateSc.d.ts +6 -0
  49. package/dist/unwraps/gateSc.js +8 -0
  50. package/dist/unwraps/georiot.d.ts +6 -0
  51. package/dist/unwraps/georiot.js +8 -0
  52. package/dist/unwraps/gitee.d.ts +6 -0
  53. package/dist/unwraps/gitee.js +9 -0
  54. package/dist/unwraps/google.d.ts +6 -0
  55. package/dist/unwraps/google.js +8 -0
  56. package/dist/unwraps/googleAmpViewer.d.ts +6 -0
  57. package/dist/unwraps/googleAmpViewer.js +13 -0
  58. package/dist/unwraps/googleNews.d.ts +6 -0
  59. package/dist/unwraps/googleNews.js +8 -0
  60. package/dist/unwraps/googleNewsModern.d.ts +6 -0
  61. package/dist/unwraps/googleNewsModern.js +14 -0
  62. package/dist/unwraps/googleScholar.d.ts +6 -0
  63. package/dist/unwraps/googleScholar.js +8 -0
  64. package/dist/unwraps/googleTranslate.d.ts +6 -0
  65. package/dist/unwraps/googleTranslate.js +8 -0
  66. package/dist/unwraps/hashnode.d.ts +6 -0
  67. package/dist/unwraps/hashnode.js +9 -0
  68. package/dist/unwraps/icptrack.d.ts +6 -0
  69. package/dist/unwraps/icptrack.js +9 -0
  70. package/dist/unwraps/idealoPartner.d.ts +6 -0
  71. package/dist/unwraps/idealoPartner.js +8 -0
  72. package/dist/unwraps/instagram.d.ts +6 -0
  73. package/dist/unwraps/instagram.js +8 -0
  74. package/dist/unwraps/jianshuGo.d.ts +6 -0
  75. package/dist/unwraps/jianshuGo.js +9 -0
  76. package/dist/unwraps/juejin.d.ts +6 -0
  77. package/dist/unwraps/juejin.js +8 -0
  78. package/dist/unwraps/leverAnalytics.d.ts +6 -0
  79. package/dist/unwraps/leverAnalytics.js +8 -0
  80. package/dist/unwraps/linksynergy.d.ts +6 -0
  81. package/dist/unwraps/linksynergy.js +9 -0
  82. package/dist/unwraps/mailchimp.d.ts +6 -0
  83. package/dist/unwraps/mailchimp.js +9 -0
  84. package/dist/unwraps/mailpanion.d.ts +6 -0
  85. package/dist/unwraps/mailpanion.js +8 -0
  86. package/dist/unwraps/mailpgn.d.ts +6 -0
  87. package/dist/unwraps/mailpgn.js +8 -0
  88. package/dist/unwraps/mailtrack.d.ts +6 -0
  89. package/dist/unwraps/mailtrack.js +8 -0
  90. package/dist/unwraps/medium.d.ts +6 -0
  91. package/dist/unwraps/medium.js +9 -0
  92. package/dist/unwraps/mimecast.d.ts +6 -0
  93. package/dist/unwraps/mimecast.js +11 -0
  94. package/dist/unwraps/mozillaOutgoing.d.ts +6 -0
  95. package/dist/unwraps/mozillaOutgoing.js +13 -0
  96. package/dist/unwraps/narrativ.d.ts +6 -0
  97. package/dist/unwraps/narrativ.js +8 -0
  98. package/dist/unwraps/nicoMs.d.ts +6 -0
  99. package/dist/unwraps/nicoMs.js +12 -0
  100. package/dist/unwraps/outlookSafelinks.d.ts +6 -0
  101. package/dist/unwraps/outlookSafelinks.js +8 -0
  102. package/dist/unwraps/partnerAds.d.ts +6 -0
  103. package/dist/unwraps/partnerAds.js +8 -0
  104. package/dist/unwraps/pocket.d.ts +6 -0
  105. package/dist/unwraps/pocket.js +9 -0
  106. package/dist/unwraps/postmark.d.ts +6 -0
  107. package/dist/unwraps/postmark.js +12 -0
  108. package/dist/unwraps/proofpointV1.d.ts +6 -0
  109. package/dist/unwraps/proofpointV1.js +16 -0
  110. package/dist/unwraps/proofpointV2.d.ts +6 -0
  111. package/dist/unwraps/proofpointV2.js +16 -0
  112. package/dist/unwraps/proofpointV3.d.ts +6 -0
  113. package/dist/unwraps/proofpointV3.js +78 -0
  114. package/dist/unwraps/pxf.d.ts +6 -0
  115. package/dist/unwraps/pxf.js +8 -0
  116. package/dist/unwraps/recruitics.d.ts +6 -0
  117. package/dist/unwraps/recruitics.js +8 -0
  118. package/dist/unwraps/redditOut.d.ts +6 -0
  119. package/dist/unwraps/redditOut.js +8 -0
  120. package/dist/unwraps/redirectingat.d.ts +6 -0
  121. package/dist/unwraps/redirectingat.js +8 -0
  122. package/dist/unwraps/segmentfault.d.ts +6 -0
  123. package/dist/unwraps/segmentfault.js +14 -0
  124. package/dist/unwraps/shareasale.d.ts +6 -0
  125. package/dist/unwraps/shareasale.js +9 -0
  126. package/dist/unwraps/sjv.d.ts +6 -0
  127. package/dist/unwraps/sjv.js +8 -0
  128. package/dist/unwraps/skimlinks.d.ts +6 -0
  129. package/dist/unwraps/skimlinks.js +8 -0
  130. package/dist/unwraps/slack.d.ts +6 -0
  131. package/dist/unwraps/slack.js +9 -0
  132. package/dist/unwraps/smartredirect.d.ts +6 -0
  133. package/dist/unwraps/smartredirect.js +8 -0
  134. package/dist/unwraps/sspai.d.ts +6 -0
  135. package/dist/unwraps/sspai.js +9 -0
  136. package/dist/unwraps/steamLinkfilter.d.ts +6 -0
  137. package/dist/unwraps/steamLinkfilter.js +9 -0
  138. package/dist/unwraps/telegramIv.d.ts +6 -0
  139. package/dist/unwraps/telegramIv.js +9 -0
  140. package/dist/unwraps/tradedoubler.d.ts +6 -0
  141. package/dist/unwraps/tradedoubler.js +9 -0
  142. package/dist/unwraps/tumblr.d.ts +6 -0
  143. package/dist/unwraps/tumblr.js +9 -0
  144. package/dist/unwraps/valuecommerce.d.ts +6 -0
  145. package/dist/unwraps/valuecommerce.js +9 -0
  146. package/dist/unwraps/viglink.d.ts +6 -0
  147. package/dist/unwraps/viglink.js +8 -0
  148. package/dist/unwraps/vkAway.d.ts +6 -0
  149. package/dist/unwraps/vkAway.js +9 -0
  150. package/dist/unwraps/webArchive.d.ts +6 -0
  151. package/dist/unwraps/webArchive.js +12 -0
  152. package/dist/unwraps/yahooSearch.d.ts +6 -0
  153. package/dist/unwraps/yahooSearch.js +12 -0
  154. package/dist/unwraps/yandexTurbo.d.ts +6 -0
  155. package/dist/unwraps/yandexTurbo.js +12 -0
  156. package/dist/unwraps/youtube.d.ts +6 -0
  157. package/dist/unwraps/youtube.js +9 -0
  158. package/dist/unwraps/zhihu.d.ts +6 -0
  159. package/dist/unwraps/zhihu.js +8 -0
  160. package/dist/utils.d.ts +11 -0
  161. package/dist/utils.js +50 -0
  162. package/package.json +45 -0
@@ -0,0 +1,9 @@
1
+ import { createParamExtractor } from "../utils.js";
2
+ //#region src/unwraps/tumblr.ts
3
+ const unwrapTumblr = createParamExtractor({
4
+ hosts: "t.umblr.com",
5
+ path: "/redirect",
6
+ params: ["z"]
7
+ });
8
+ //#endregion
9
+ export { unwrapTumblr };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/valuecommerce.d.ts
4
+ declare const unwrapValuecommerce: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapValuecommerce };
@@ -0,0 +1,9 @@
1
+ import { createParamExtractor } from "../utils.js";
2
+ //#region src/unwraps/valuecommerce.ts
3
+ const unwrapValuecommerce = createParamExtractor({
4
+ hosts: "ck.jp.ap.valuecommerce.com",
5
+ path: "/servlet/referral",
6
+ params: ["vc_url"]
7
+ });
8
+ //#endregion
9
+ export { unwrapValuecommerce };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/viglink.d.ts
4
+ declare const unwrapViglink: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapViglink };
@@ -0,0 +1,8 @@
1
+ import { createParamExtractor } from "../utils.js";
2
+ //#region src/unwraps/viglink.ts
3
+ const unwrapViglink = createParamExtractor({
4
+ hosts: "redirect.viglink.com",
5
+ params: ["u"]
6
+ });
7
+ //#endregion
8
+ export { unwrapViglink };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/vkAway.d.ts
4
+ declare const unwrapVkAway: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapVkAway };
@@ -0,0 +1,9 @@
1
+ import { createParamExtractor } from "../utils.js";
2
+ //#region src/unwraps/vkAway.ts
3
+ const unwrapVkAway = createParamExtractor({
4
+ hosts: "vk.com",
5
+ path: "/away.php",
6
+ params: ["to"]
7
+ });
8
+ //#endregion
9
+ export { unwrapVkAway };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/webArchive.d.ts
4
+ declare const unwrapWebArchive: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapWebArchive };
@@ -0,0 +1,12 @@
1
+ //#region src/unwraps/webArchive.ts
2
+ const pathRegex = /^\/web\/\d{14}\*?\/(.+)$/;
3
+ const unwrapWebArchive = (url) => {
4
+ if (url.hostname !== "web.archive.org") return;
5
+ const match = url.pathname.match(pathRegex);
6
+ if (!match) return;
7
+ try {
8
+ return decodeURIComponent(match[1]);
9
+ } catch {}
10
+ };
11
+ //#endregion
12
+ export { unwrapWebArchive };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/yahooSearch.d.ts
4
+ declare const unwrapYahooSearch: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapYahooSearch };
@@ -0,0 +1,12 @@
1
+ //#region src/unwraps/yahooSearch.ts
2
+ const yahooPathRegex = /\/RU=([^/]+)\/RK=/;
3
+ const unwrapYahooSearch = (url) => {
4
+ if (url.hostname !== "r.search.yahoo.com") return;
5
+ const match = url.pathname.match(yahooPathRegex);
6
+ if (!match) return;
7
+ try {
8
+ return decodeURIComponent(match[1]);
9
+ } catch {}
10
+ };
11
+ //#endregion
12
+ export { unwrapYahooSearch };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/yandexTurbo.d.ts
4
+ declare const unwrapYandexTurbo: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapYandexTurbo };
@@ -0,0 +1,12 @@
1
+ //#region src/unwraps/yandexTurbo.ts
2
+ const turbopagesHostRegex = /\.turbopages\.org$/;
3
+ const turbopagesPathRegex = /^\/[^/]+\/s\/(.+)$/;
4
+ const dashRegex = /-/g;
5
+ const unwrapYandexTurbo = (url) => {
6
+ if (!turbopagesHostRegex.test(url.hostname)) return;
7
+ const match = url.pathname.match(turbopagesPathRegex);
8
+ if (!match) return;
9
+ return `https://${url.hostname.replace(turbopagesHostRegex, "").replace(dashRegex, ".")}/${match[1]}`;
10
+ };
11
+ //#endregion
12
+ export { unwrapYandexTurbo };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/youtube.d.ts
4
+ declare const unwrapYouTube: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapYouTube };
@@ -0,0 +1,9 @@
1
+ import { createParamExtractor } from "../utils.js";
2
+ //#region src/unwraps/youtube.ts
3
+ const unwrapYouTube = createParamExtractor({
4
+ hosts: "www.youtube.com",
5
+ path: "/redirect",
6
+ params: ["q"]
7
+ });
8
+ //#endregion
9
+ export { unwrapYouTube };
@@ -0,0 +1,6 @@
1
+ import { UrlUnwrapper } from "../types.js";
2
+
3
+ //#region src/unwraps/zhihu.d.ts
4
+ declare const unwrapZhihu: UrlUnwrapper;
5
+ //#endregion
6
+ export { unwrapZhihu };
@@ -0,0 +1,8 @@
1
+ import { createParamExtractor } from "../utils.js";
2
+ //#region src/unwraps/zhihu.ts
3
+ const unwrapZhihu = createParamExtractor({
4
+ hosts: "link.zhihu.com",
5
+ params: ["target"]
6
+ });
7
+ //#endregion
8
+ export { unwrapZhihu };
@@ -0,0 +1,11 @@
1
+ import { UrlUnwrapper } from "./types.js";
2
+
3
+ //#region src/utils.d.ts
4
+ type ParamExtractorConfig = {
5
+ hosts: string | Array<string> | RegExp;
6
+ path?: string;
7
+ params: Array<string>;
8
+ };
9
+ declare const createParamExtractor: (config: ParamExtractorConfig) => UrlUnwrapper;
10
+ //#endregion
11
+ export { ParamExtractorConfig, createParamExtractor };
package/dist/utils.js ADDED
@@ -0,0 +1,50 @@
1
+ //#region src/utils.ts
2
+ const createHostMatcher = (hosts) => {
3
+ if (hosts instanceof RegExp) return (host) => hosts.test(host);
4
+ const hostSet = new Set(Array.isArray(hosts) ? hosts : [hosts]);
5
+ return (host) => hostSet.has(host);
6
+ };
7
+ const createParamExtractor = (config) => {
8
+ const matchesHost = createHostMatcher(config.hosts);
9
+ return (url) => {
10
+ if (!matchesHost(url.hostname)) return;
11
+ if (config.path && url.pathname !== config.path) return;
12
+ for (const param of config.params) {
13
+ const value = url.searchParams.get(param);
14
+ if (value) return value;
15
+ }
16
+ };
17
+ };
18
+ const isHostOf = (url, hosts) => {
19
+ try {
20
+ const hostname = (url instanceof URL ? url : new URL(url)).hostname.toLowerCase();
21
+ return (Array.isArray(hosts) ? hosts : [hosts]).some((host) => hostname === host.toLowerCase().trim());
22
+ } catch {}
23
+ return false;
24
+ };
25
+ const isSubdomainOf = (url, domains) => {
26
+ try {
27
+ const hostname = (url instanceof URL ? url : new URL(url)).hostname.toLowerCase();
28
+ return (Array.isArray(domains) ? domains : [domains]).some((domain) => hostname.endsWith(`.${domain}`));
29
+ } catch {}
30
+ return false;
31
+ };
32
+ const decodeBase64Binary = (value) => {
33
+ try {
34
+ return atob(value);
35
+ } catch {}
36
+ };
37
+ const decodeBase64 = (value) => {
38
+ const binary = decodeBase64Binary(value);
39
+ if (binary === void 0) return;
40
+ const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
41
+ return new TextDecoder().decode(bytes);
42
+ };
43
+ const decodeBase64Url = (value) => {
44
+ return decodeBase64(value.replace(/-/g, "+").replace(/_/g, "/"));
45
+ };
46
+ const getUtf8ByteLength = (value) => {
47
+ return new TextEncoder().encode(value).length;
48
+ };
49
+ //#endregion
50
+ export { createParamExtractor, decodeBase64, decodeBase64Binary, decodeBase64Url, getUtf8ByteLength, isHostOf, isSubdomainOf };
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "urlpurify",
3
+ "description": "Unwrap redirect, affiliate, and tracking wrapper URLs and strip tracking parameters. Turn noisy links into clean, direct URLs.",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/macieklamberski/urlpurify.git"
7
+ },
8
+ "bugs": {
9
+ "url": "https://github.com/macieklamberski/urlpurify/issues"
10
+ },
11
+ "license": "MIT",
12
+ "author": "Maciej Lamberski",
13
+ "sideEffects": false,
14
+ "keywords": [
15
+ "url",
16
+ "clean",
17
+ "tracking",
18
+ "utm",
19
+ "redirect",
20
+ "unwrap",
21
+ "affiliate",
22
+ "privacy"
23
+ ],
24
+ "type": "module",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/index.js"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "scripts": {
35
+ "prepare": "lefthook install",
36
+ "build": "tsdown src/index.ts --format esm --dts --clean --unbundle --no-fixed-extension",
37
+ "test": "bun test"
38
+ },
39
+ "devDependencies": {
40
+ "@types/bun": "^1.3.14",
41
+ "kvalita": "^1.14.0",
42
+ "tsdown": "^0.22.2"
43
+ },
44
+ "version": "1.0.0"
45
+ }