urlpurify 1.4.2 → 1.6.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 (695) hide show
  1. package/README.md +49 -65
  2. package/dist/clean.mjs +65 -26
  3. package/dist/defaults.d.mts +10 -0
  4. package/dist/defaults.mjs +742 -25
  5. package/dist/index.d.mts +305 -5
  6. package/dist/index.mjs +338 -38
  7. package/dist/node_modules/trousse/dist/matching.mjs +7 -3
  8. package/dist/node_modules/trousse/dist/urls.mjs +91 -8
  9. package/dist/pathTarget.mjs +14 -0
  10. package/dist/tracking/literals.mjs +0 -1
  11. package/dist/unwraps/12ft.d.mts +4 -0
  12. package/dist/unwraps/12ft.mjs +9 -0
  13. package/dist/unwraps/2performant.d.mts +4 -0
  14. package/dist/unwraps/2performant.mjs +9 -0
  15. package/dist/unwraps/4pda.d.mts +4 -0
  16. package/dist/unwraps/4pda.mjs +13 -0
  17. package/dist/unwraps/a8Net.d.mts +4 -0
  18. package/dist/unwraps/a8Net.mjs +23 -0
  19. package/dist/unwraps/aboutCom.d.mts +4 -0
  20. package/dist/unwraps/aboutCom.mjs +17 -0
  21. package/dist/unwraps/acast.d.mts +4 -0
  22. package/dist/unwraps/acast.mjs +10 -0
  23. package/dist/unwraps/accesstrade.d.mts +4 -0
  24. package/dist/unwraps/accesstrade.mjs +18 -0
  25. package/dist/unwraps/aceml.mjs +8 -2
  26. package/dist/unwraps/adcell.d.mts +4 -0
  27. package/dist/unwraps/adcell.mjs +13 -0
  28. package/dist/unwraps/adfly.d.mts +4 -0
  29. package/dist/unwraps/adfly.mjs +16 -0
  30. package/dist/unwraps/adjust.mjs +26 -5
  31. package/dist/unwraps/admitad.d.mts +4 -0
  32. package/dist/unwraps/admitad.mjs +29 -0
  33. package/dist/unwraps/adrecord.d.mts +4 -0
  34. package/dist/unwraps/adrecord.mjs +9 -0
  35. package/dist/unwraps/adtraction.d.mts +4 -0
  36. package/dist/unwraps/adtraction.mjs +9 -0
  37. package/dist/unwraps/affilae.d.mts +4 -0
  38. package/dist/unwraps/affilae.mjs +8 -0
  39. package/dist/unwraps/affiliateFuture.d.mts +4 -0
  40. package/dist/unwraps/affiliateFuture.mjs +9 -0
  41. package/dist/unwraps/affiliatesOne.d.mts +4 -0
  42. package/dist/unwraps/affiliatesOne.mjs +39 -0
  43. package/dist/unwraps/aliexpress.d.mts +4 -0
  44. package/dist/unwraps/aliexpress.mjs +9 -0
  45. package/dist/unwraps/aliyun.d.mts +4 -0
  46. package/dist/unwraps/aliyun.mjs +9 -0
  47. package/dist/unwraps/allblog.d.mts +4 -0
  48. package/dist/unwraps/allblog.mjs +10 -0
  49. package/dist/unwraps/amazonAffiliate.mjs +19 -2
  50. package/dist/unwraps/amazonSes.d.mts +4 -0
  51. package/dist/unwraps/amazonSes.mjs +14 -0
  52. package/dist/unwraps/ampCache.mjs +14 -8
  53. package/dist/unwraps/anchor.d.mts +4 -0
  54. package/dist/unwraps/anchor.mjs +15 -0
  55. package/dist/unwraps/anonymTo.mjs +7 -2
  56. package/dist/unwraps/anonymouse.d.mts +4 -0
  57. package/dist/unwraps/anonymouse.mjs +12 -0
  58. package/dist/unwraps/appsflyerOnelink.d.mts +4 -0
  59. package/dist/unwraps/appsflyerOnelink.mjs +13 -0
  60. package/dist/unwraps/apptrkr.d.mts +4 -0
  61. package/dist/unwraps/apptrkr.mjs +13 -0
  62. package/dist/unwraps/archiveToday.d.mts +4 -0
  63. package/dist/unwraps/archiveToday.mjs +24 -0
  64. package/dist/unwraps/arquivo.d.mts +4 -0
  65. package/dist/unwraps/arquivo.mjs +12 -0
  66. package/dist/unwraps/arttrack.d.mts +4 -0
  67. package/dist/unwraps/arttrack.mjs +10 -0
  68. package/dist/unwraps/arxiv.d.mts +4 -0
  69. package/dist/unwraps/arxiv.mjs +9 -0
  70. package/dist/unwraps/ask.d.mts +4 -0
  71. package/dist/unwraps/ask.mjs +14 -0
  72. package/dist/unwraps/augure.d.mts +4 -0
  73. package/dist/unwraps/augure.mjs +28 -0
  74. package/dist/unwraps/ausha.d.mts +4 -0
  75. package/dist/unwraps/ausha.mjs +10 -0
  76. package/dist/unwraps/avantlink.d.mts +4 -0
  77. package/dist/unwraps/avantlink.mjs +13 -0
  78. package/dist/unwraps/awesound.d.mts +4 -0
  79. package/dist/unwraps/awesound.mjs +10 -0
  80. package/dist/unwraps/awin.mjs +10 -2
  81. package/dist/unwraps/axigen.d.mts +4 -0
  82. package/dist/unwraps/axigen.mjs +11 -0
  83. package/dist/unwraps/babyblog.d.mts +4 -0
  84. package/dist/unwraps/babyblog.mjs +9 -0
  85. package/dist/unwraps/bacLacWebArchive.d.mts +4 -0
  86. package/dist/unwraps/bacLacWebArchive.mjs +12 -0
  87. package/dist/unwraps/bale.d.mts +4 -0
  88. package/dist/unwraps/bale.mjs +9 -0
  89. package/dist/unwraps/bananatag.d.mts +4 -0
  90. package/dist/unwraps/bananatag.mjs +17 -0
  91. package/dist/unwraps/barracudaLinkProtect.d.mts +4 -0
  92. package/dist/unwraps/barracudaLinkProtect.mjs +9 -0
  93. package/dist/unwraps/big5Gate.d.mts +4 -0
  94. package/dist/unwraps/big5Gate.mjs +11 -0
  95. package/dist/unwraps/bing.mjs +21 -5
  96. package/dist/unwraps/bingAds.d.mts +4 -0
  97. package/dist/unwraps/bingAds.mjs +18 -0
  98. package/dist/unwraps/bitrix.d.mts +4 -0
  99. package/dist/unwraps/bitrix.mjs +14 -0
  100. package/dist/unwraps/bitrixBanner.d.mts +4 -0
  101. package/dist/unwraps/bitrixBanner.mjs +8 -0
  102. package/dist/unwraps/bizrate.d.mts +4 -0
  103. package/dist/unwraps/bizrate.mjs +9 -0
  104. package/dist/unwraps/blubrry.d.mts +4 -0
  105. package/dist/unwraps/blubrry.mjs +15 -0
  106. package/dist/unwraps/bolPartner.d.mts +4 -0
  107. package/dist/unwraps/bolPartner.mjs +13 -0
  108. package/dist/unwraps/bridgyFed.d.mts +4 -0
  109. package/dist/unwraps/bridgyFed.mjs +16 -0
  110. package/dist/unwraps/businessWire.d.mts +4 -0
  111. package/dist/unwraps/businessWire.mjs +9 -0
  112. package/dist/unwraps/button.d.mts +4 -0
  113. package/dist/unwraps/button.mjs +13 -0
  114. package/dist/unwraps/buyAt.d.mts +4 -0
  115. package/dist/unwraps/buyAt.mjs +13 -0
  116. package/dist/unwraps/buybox.d.mts +4 -0
  117. package/dist/unwraps/buybox.mjs +13 -0
  118. package/dist/unwraps/buzzstream.d.mts +4 -0
  119. package/dist/unwraps/buzzstream.mjs +13 -0
  120. package/dist/unwraps/bytedance.d.mts +4 -0
  121. package/dist/unwraps/bytedance.mjs +9 -0
  122. package/dist/unwraps/cake.d.mts +4 -0
  123. package/dist/unwraps/cake.mjs +11 -0
  124. package/dist/unwraps/calendly.d.mts +4 -0
  125. package/dist/unwraps/calendly.mjs +9 -0
  126. package/dist/unwraps/canva.d.mts +4 -0
  127. package/dist/unwraps/canva.mjs +9 -0
  128. package/dist/unwraps/castPlus.d.mts +4 -0
  129. package/dist/unwraps/castPlus.mjs +10 -0
  130. package/dist/unwraps/ccbill.d.mts +4 -0
  131. package/dist/unwraps/ccbill.mjs +9 -0
  132. package/dist/unwraps/chartable.d.mts +4 -0
  133. package/dist/unwraps/chartable.mjs +11 -0
  134. package/dist/unwraps/checkPointHarmony.d.mts +4 -0
  135. package/dist/unwraps/checkPointHarmony.mjs +25 -0
  136. package/dist/unwraps/chitika.d.mts +4 -0
  137. package/dist/unwraps/chitika.mjs +9 -0
  138. package/dist/unwraps/ciscoSecureWeb.d.mts +4 -0
  139. package/dist/unwraps/ciscoSecureWeb.mjs +16 -0
  140. package/dist/unwraps/cjNetwork.mjs +41 -12
  141. package/dist/unwraps/claritas.d.mts +4 -0
  142. package/dist/unwraps/claritas.mjs +11 -0
  143. package/dist/unwraps/cleverbridge.d.mts +4 -0
  144. package/dist/unwraps/cleverbridge.mjs +12 -0
  145. package/dist/unwraps/clevercomm.d.mts +4 -0
  146. package/dist/unwraps/clevercomm.mjs +9 -0
  147. package/dist/unwraps/cloudhq.d.mts +4 -0
  148. package/dist/unwraps/cloudhq.mjs +13 -0
  149. package/dist/unwraps/cloze.d.mts +4 -0
  150. package/dist/unwraps/cloze.mjs +12 -0
  151. package/dist/unwraps/cohst.d.mts +4 -0
  152. package/dist/unwraps/cohst.mjs +10 -0
  153. package/dist/unwraps/commissionFactory.d.mts +4 -0
  154. package/dist/unwraps/commissionFactory.mjs +13 -0
  155. package/dist/unwraps/communicationads.d.mts +4 -0
  156. package/dist/unwraps/communicationads.mjs +9 -0
  157. package/dist/unwraps/constantContact.d.mts +4 -0
  158. package/dist/unwraps/constantContact.mjs +9 -0
  159. package/dist/unwraps/contactMonkey.d.mts +4 -0
  160. package/dist/unwraps/contactMonkey.mjs +12 -0
  161. package/dist/unwraps/convertiser.d.mts +4 -0
  162. package/dist/unwraps/convertiser.mjs +13 -0
  163. package/dist/unwraps/csdn.mjs +1 -0
  164. package/dist/unwraps/cse360.d.mts +4 -0
  165. package/dist/unwraps/cse360.mjs +17 -0
  166. package/dist/unwraps/cuelinks.d.mts +4 -0
  167. package/dist/unwraps/cuelinks.mjs +9 -0
  168. package/dist/unwraps/dasBlog.d.mts +4 -0
  169. package/dist/unwraps/dasBlog.mjs +11 -0
  170. package/dist/unwraps/datalifeEngine.d.mts +4 -0
  171. package/dist/unwraps/datalifeEngine.mjs +14 -0
  172. package/dist/unwraps/deployer.d.mts +4 -0
  173. package/dist/unwraps/deployer.mjs +18 -0
  174. package/dist/unwraps/derefMail.d.mts +4 -0
  175. package/dist/unwraps/derefMail.mjs +61 -0
  176. package/dist/unwraps/deviantartOutgoing.mjs +6 -3
  177. package/dist/unwraps/digidip.mjs +6 -1
  178. package/dist/unwraps/digikala.d.mts +4 -0
  179. package/dist/unwraps/digikala.mjs +13 -0
  180. package/dist/unwraps/directMail.d.mts +4 -0
  181. package/dist/unwraps/directMail.mjs +17 -0
  182. package/dist/unwraps/disqus.mjs +6 -1
  183. package/dist/unwraps/dmmAffiliate.d.mts +4 -0
  184. package/dist/unwraps/dmmAffiliate.mjs +13 -0
  185. package/dist/unwraps/dognet.d.mts +4 -0
  186. package/dist/unwraps/dognet.mjs +9 -0
  187. package/dist/unwraps/douban.mjs +5 -1
  188. package/dist/unwraps/dropbox.d.mts +4 -0
  189. package/dist/unwraps/dropbox.mjs +22 -0
  190. package/dist/unwraps/dstats.d.mts +4 -0
  191. package/dist/unwraps/dstats.mjs +21 -0
  192. package/dist/unwraps/duckduckgo.mjs +1 -1
  193. package/dist/unwraps/duckduckgoAds.d.mts +4 -0
  194. package/dist/unwraps/duckduckgoAds.mjs +9 -0
  195. package/dist/unwraps/duomai.d.mts +4 -0
  196. package/dist/unwraps/duomai.mjs +9 -0
  197. package/dist/unwraps/dyn.d.mts +4 -0
  198. package/dist/unwraps/dyn.mjs +9 -0
  199. package/dist/unwraps/dzen.d.mts +4 -0
  200. package/dist/unwraps/dzen.mjs +9 -0
  201. package/dist/unwraps/eClick.d.mts +4 -0
  202. package/dist/unwraps/eClick.mjs +13 -0
  203. package/dist/unwraps/easyMarketing.d.mts +4 -0
  204. package/dist/unwraps/easyMarketing.mjs +20 -0
  205. package/dist/unwraps/ebayRover.mjs +10 -3
  206. package/dist/unwraps/ebuzzing.d.mts +4 -0
  207. package/dist/unwraps/ebuzzing.mjs +20 -0
  208. package/dist/unwraps/edgepilot.d.mts +4 -0
  209. package/dist/unwraps/edgepilot.mjs +13 -0
  210. package/dist/unwraps/effiliation.mjs +7 -2
  211. package/dist/unwraps/ehub.d.mts +4 -0
  212. package/dist/unwraps/ehub.mjs +9 -0
  213. package/dist/unwraps/elasticEmail.d.mts +4 -0
  214. package/dist/unwraps/elasticEmail.mjs +11 -0
  215. package/dist/unwraps/embedly.mjs +2 -1
  216. package/dist/unwraps/epn.d.mts +4 -0
  217. package/dist/unwraps/epn.mjs +19 -0
  218. package/dist/unwraps/esva.d.mts +4 -0
  219. package/dist/unwraps/esva.mjs +9 -0
  220. package/dist/unwraps/eulerian.d.mts +4 -0
  221. package/dist/unwraps/eulerian.mjs +12 -0
  222. package/dist/unwraps/evernote.d.mts +4 -0
  223. package/dist/unwraps/evernote.mjs +9 -0
  224. package/dist/unwraps/exciteTranslate.d.mts +4 -0
  225. package/dist/unwraps/exciteTranslate.mjs +17 -0
  226. package/dist/unwraps/expediaAffiliate.d.mts +4 -0
  227. package/dist/unwraps/expediaAffiliate.mjs +9 -0
  228. package/dist/unwraps/facebook.mjs +48 -3
  229. package/dist/unwraps/fanbridge.d.mts +4 -0
  230. package/dist/unwraps/fanbridge.mjs +9 -0
  231. package/dist/unwraps/federatedMedia.d.mts +4 -0
  232. package/dist/unwraps/federatedMedia.mjs +9 -0
  233. package/dist/unwraps/feedStatistics.d.mts +4 -0
  234. package/dist/unwraps/feedStatistics.mjs +12 -0
  235. package/dist/unwraps/feedblitz.d.mts +4 -0
  236. package/dist/unwraps/feedblitz.mjs +12 -0
  237. package/dist/unwraps/feedsportal.mjs +2 -1
  238. package/dist/unwraps/finalsite.d.mts +4 -0
  239. package/dist/unwraps/finalsite.mjs +12 -0
  240. package/dist/unwraps/firebaseDynamicLinks.mjs +15 -3
  241. package/dist/unwraps/fireeye.d.mts +4 -0
  242. package/dist/unwraps/fireeye.mjs +11 -0
  243. package/dist/unwraps/firstory.d.mts +4 -0
  244. package/dist/unwraps/firstory.mjs +21 -0
  245. package/dist/unwraps/fiveByFive.d.mts +4 -0
  246. package/dist/unwraps/fiveByFive.mjs +12 -0
  247. package/dist/unwraps/fiverr.d.mts +4 -0
  248. package/dist/unwraps/fiverr.mjs +9 -0
  249. package/dist/unwraps/flexoffers.d.mts +4 -0
  250. package/dist/unwraps/flexoffers.mjs +13 -0
  251. package/dist/unwraps/fortimail.d.mts +4 -0
  252. package/dist/unwraps/fortimail.mjs +11 -0
  253. package/dist/unwraps/ftc.d.mts +4 -0
  254. package/dist/unwraps/ftc.mjs +13 -0
  255. package/dist/unwraps/gateSc.mjs +1 -0
  256. package/dist/unwraps/georiot.mjs +7 -1
  257. package/dist/unwraps/gfnLinkProxy.d.mts +4 -0
  258. package/dist/unwraps/gfnLinkProxy.mjs +13 -0
  259. package/dist/unwraps/glueUp.d.mts +4 -0
  260. package/dist/unwraps/glueUp.mjs +16 -0
  261. package/dist/unwraps/godcaster.d.mts +4 -0
  262. package/dist/unwraps/godcaster.mjs +21 -0
  263. package/dist/unwraps/google.mjs +4 -2
  264. package/dist/unwraps/googleAds.d.mts +4 -0
  265. package/dist/unwraps/googleAds.mjs +52 -0
  266. package/dist/unwraps/googleAmpViewer.mjs +2 -2
  267. package/dist/unwraps/googleNewsModern.mjs +2 -5
  268. package/dist/unwraps/googleScholar.mjs +1 -1
  269. package/dist/unwraps/googleTranslate.mjs +34 -6
  270. package/dist/unwraps/googleWebLight.d.mts +4 -0
  271. package/dist/unwraps/googleWebLight.mjs +17 -0
  272. package/dist/unwraps/groupMail.d.mts +4 -0
  273. package/dist/unwraps/groupMail.mjs +11 -0
  274. package/dist/unwraps/groupon.d.mts +4 -0
  275. package/dist/unwraps/groupon.mjs +17 -0
  276. package/dist/unwraps/gumball.d.mts +4 -0
  277. package/dist/unwraps/gumball.mjs +11 -0
  278. package/dist/unwraps/gurunavi.d.mts +4 -0
  279. package/dist/unwraps/gurunavi.mjs +9 -0
  280. package/dist/unwraps/hackerone.d.mts +4 -0
  281. package/dist/unwraps/hackerone.mjs +9 -0
  282. package/dist/unwraps/hasoffers.d.mts +4 -0
  283. package/dist/unwraps/hasoffers.mjs +11 -0
  284. package/dist/unwraps/hearthis.d.mts +4 -0
  285. package/dist/unwraps/hearthis.mjs +9 -0
  286. package/dist/unwraps/hellohq.d.mts +4 -0
  287. package/dist/unwraps/hellohq.mjs +9 -0
  288. package/dist/unwraps/hirkereso.d.mts +4 -0
  289. package/dist/unwraps/hirkereso.mjs +13 -0
  290. package/dist/unwraps/horde.d.mts +4 -0
  291. package/dist/unwraps/horde.mjs +12 -0
  292. package/dist/unwraps/hornetsecurity.d.mts +4 -0
  293. package/dist/unwraps/hornetsecurity.mjs +9 -0
  294. package/dist/unwraps/hrefLi.mjs +4 -2
  295. package/dist/unwraps/hubspotSidekick.d.mts +4 -0
  296. package/dist/unwraps/hubspotSidekick.mjs +13 -0
  297. package/dist/unwraps/icptrack.mjs +7 -3
  298. package/dist/unwraps/igafnl.d.mts +4 -0
  299. package/dist/unwraps/igafnl.mjs +9 -0
  300. package/dist/unwraps/impact.d.mts +4 -0
  301. package/dist/unwraps/impact.mjs +19 -0
  302. package/dist/unwraps/indexHu.d.mts +4 -0
  303. package/dist/unwraps/indexHu.mjs +27 -0
  304. package/dist/unwraps/infospace.d.mts +4 -0
  305. package/dist/unwraps/infospace.mjs +14 -0
  306. package/dist/unwraps/insiderAffiliate.d.mts +4 -0
  307. package/dist/unwraps/insiderAffiliate.mjs +17 -0
  308. package/dist/unwraps/instagram.mjs +1 -0
  309. package/dist/unwraps/intranetQuorum.d.mts +4 -0
  310. package/dist/unwraps/intranetQuorum.mjs +13 -0
  311. package/dist/unwraps/invisionNoExternalLinks.d.mts +4 -0
  312. package/dist/unwraps/invisionNoExternalLinks.mjs +14 -0
  313. package/dist/unwraps/involveAsia.d.mts +4 -0
  314. package/dist/unwraps/involveAsia.mjs +18 -0
  315. package/dist/unwraps/irs.d.mts +4 -0
  316. package/dist/unwraps/irs.mjs +9 -0
  317. package/dist/unwraps/jianshuGo.mjs +9 -1
  318. package/dist/unwraps/jive.d.mts +4 -0
  319. package/dist/unwraps/jive.mjs +11 -0
  320. package/dist/unwraps/juejin.mjs +2 -1
  321. package/dist/unwraps/justwatch.d.mts +4 -0
  322. package/dist/unwraps/justwatch.mjs +9 -0
  323. package/dist/unwraps/klook.d.mts +4 -0
  324. package/dist/unwraps/klook.mjs +10 -0
  325. package/dist/unwraps/lazada.d.mts +4 -0
  326. package/dist/unwraps/lazada.mjs +20 -0
  327. package/dist/unwraps/ld246.d.mts +4 -0
  328. package/dist/unwraps/ld246.mjs +14 -0
  329. package/dist/unwraps/letscast.d.mts +4 -0
  330. package/dist/unwraps/letscast.mjs +10 -0
  331. package/dist/unwraps/leverAnalytics.mjs +1 -0
  332. package/dist/unwraps/linkA.d.mts +4 -0
  333. package/dist/unwraps/linkA.mjs +18 -0
  334. package/dist/unwraps/linkconnector.d.mts +4 -0
  335. package/dist/unwraps/linkconnector.mjs +9 -0
  336. package/dist/unwraps/linkedin.d.mts +4 -0
  337. package/dist/unwraps/linkedin.mjs +12 -0
  338. package/dist/unwraps/linksynergy.mjs +23 -6
  339. package/dist/unwraps/linktrust.d.mts +4 -0
  340. package/dist/unwraps/linktrust.mjs +18 -0
  341. package/dist/unwraps/linkwise.d.mts +4 -0
  342. package/dist/unwraps/linkwise.mjs +13 -0
  343. package/dist/unwraps/livejournal.d.mts +4 -0
  344. package/dist/unwraps/livejournal.mjs +9 -0
  345. package/dist/unwraps/lnkam.d.mts +4 -0
  346. package/dist/unwraps/lnkam.mjs +9 -0
  347. package/dist/unwraps/locWebArchive.d.mts +4 -0
  348. package/dist/unwraps/locWebArchive.mjs +12 -0
  349. package/dist/unwraps/locaweb.d.mts +4 -0
  350. package/dist/unwraps/locaweb.mjs +9 -0
  351. package/dist/unwraps/logicboard.d.mts +4 -0
  352. package/dist/unwraps/logicboard.mjs +14 -0
  353. package/dist/unwraps/magellan.d.mts +4 -0
  354. package/dist/unwraps/magellan.mjs +10 -0
  355. package/dist/unwraps/magnetmail.d.mts +4 -0
  356. package/dist/unwraps/magnetmail.mjs +9 -0
  357. package/dist/unwraps/mail2easy.d.mts +4 -0
  358. package/dist/unwraps/mail2easy.mjs +12 -0
  359. package/dist/unwraps/mailRu.d.mts +4 -0
  360. package/dist/unwraps/mailRu.mjs +17 -0
  361. package/dist/unwraps/mailRuLink.d.mts +4 -0
  362. package/dist/unwraps/mailRuLink.mjs +9 -0
  363. package/dist/unwraps/mailchimp.mjs +7 -3
  364. package/dist/unwraps/mailinblack.d.mts +4 -0
  365. package/dist/unwraps/mailinblack.mjs +16 -0
  366. package/dist/unwraps/mailpanion.mjs +1 -0
  367. package/dist/unwraps/mailpgn.mjs +1 -0
  368. package/dist/unwraps/mailstat.d.mts +4 -0
  369. package/dist/unwraps/mailstat.mjs +11 -0
  370. package/dist/unwraps/mailtrack.mjs +6 -1
  371. package/dist/unwraps/mandrill.d.mts +4 -0
  372. package/dist/unwraps/mandrill.mjs +26 -0
  373. package/dist/unwraps/marketwire.d.mts +4 -0
  374. package/dist/unwraps/marketwire.mjs +9 -0
  375. package/dist/unwraps/mcas.d.mts +4 -0
  376. package/dist/unwraps/mcas.mjs +28 -0
  377. package/dist/unwraps/medium.mjs +13 -3
  378. package/dist/unwraps/megalodon.d.mts +4 -0
  379. package/dist/unwraps/megalodon.mjs +14 -0
  380. package/dist/unwraps/mimecast.mjs +6 -3
  381. package/dist/unwraps/ministryCloud.d.mts +4 -0
  382. package/dist/unwraps/ministryCloud.mjs +10 -0
  383. package/dist/unwraps/mintDownloads.d.mts +4 -0
  384. package/dist/unwraps/mintDownloads.mjs +11 -0
  385. package/dist/unwraps/mintFeeder.d.mts +4 -0
  386. package/dist/unwraps/mintFeeder.mjs +10 -0
  387. package/dist/unwraps/mohtwize.d.mts +4 -0
  388. package/dist/unwraps/mohtwize.mjs +20 -0
  389. package/dist/unwraps/moshimo.d.mts +4 -0
  390. package/dist/unwraps/moshimo.mjs +13 -0
  391. package/dist/unwraps/mozillaOutgoing.mjs +5 -1
  392. package/dist/unwraps/myNewsletterBuilder.d.mts +4 -0
  393. package/dist/unwraps/myNewsletterBuilder.mjs +9 -0
  394. package/dist/unwraps/narrativ.mjs +21 -2
  395. package/dist/unwraps/natlibNz.d.mts +4 -0
  396. package/dist/unwraps/natlibNz.mjs +12 -0
  397. package/dist/unwraps/naverOutgoing.mjs +10 -1
  398. package/dist/unwraps/ncls.d.mts +4 -0
  399. package/dist/unwraps/ncls.mjs +11 -0
  400. package/dist/unwraps/ndlWarp.d.mts +4 -0
  401. package/dist/unwraps/ndlWarp.mjs +16 -0
  402. package/dist/unwraps/netaffiliation.d.mts +4 -0
  403. package/dist/unwraps/netaffiliation.mjs +18 -0
  404. package/dist/unwraps/netcentrum.d.mts +4 -0
  405. package/dist/unwraps/netcentrum.mjs +9 -0
  406. package/dist/unwraps/newswire.d.mts +4 -0
  407. package/dist/unwraps/newswire.mjs +19 -0
  408. package/dist/unwraps/nicoMs.mjs +2 -1
  409. package/dist/unwraps/nimble.d.mts +4 -0
  410. package/dist/unwraps/nimble.mjs +13 -0
  411. package/dist/unwraps/nlaWebarchive.d.mts +4 -0
  412. package/dist/unwraps/nlaWebarchive.mjs +22 -0
  413. package/dist/unwraps/nodeseek.d.mts +4 -0
  414. package/dist/unwraps/nodeseek.mjs +9 -0
  415. package/dist/unwraps/okRu.d.mts +4 -0
  416. package/dist/unwraps/okRu.mjs +23 -0
  417. package/dist/unwraps/op3.d.mts +4 -0
  418. package/dist/unwraps/op3.mjs +10 -0
  419. package/dist/unwraps/orkut.d.mts +4 -0
  420. package/dist/unwraps/orkut.mjs +13 -0
  421. package/dist/unwraps/osnova.d.mts +4 -0
  422. package/dist/unwraps/osnova.mjs +9 -0
  423. package/dist/unwraps/outlookSafelinks.mjs +12 -2
  424. package/dist/unwraps/outlookWebAccess.d.mts +4 -0
  425. package/dist/unwraps/outlookWebAccess.mjs +12 -0
  426. package/dist/unwraps/pagefreezer.d.mts +4 -0
  427. package/dist/unwraps/pagefreezer.mjs +18 -0
  428. package/dist/unwraps/partnerAds.mjs +11 -2
  429. package/dist/unwraps/pbs.d.mts +4 -0
  430. package/dist/unwraps/pbs.mjs +10 -0
  431. package/dist/unwraps/philpapers.d.mts +4 -0
  432. package/dist/unwraps/philpapers.mjs +9 -0
  433. package/dist/unwraps/pinterest.d.mts +4 -0
  434. package/dist/unwraps/pinterest.mjs +17 -0
  435. package/dist/unwraps/pipedrive.d.mts +4 -0
  436. package/dist/unwraps/pipedrive.mjs +13 -0
  437. package/dist/unwraps/podcorn.d.mts +4 -0
  438. package/dist/unwraps/podcorn.mjs +10 -0
  439. package/dist/unwraps/podder.d.mts +4 -0
  440. package/dist/unwraps/podder.mjs +10 -0
  441. package/dist/unwraps/podkite.d.mts +4 -0
  442. package/dist/unwraps/podkite.mjs +12 -0
  443. package/dist/unwraps/podroll.d.mts +4 -0
  444. package/dist/unwraps/podroll.mjs +10 -0
  445. package/dist/unwraps/podscribe.d.mts +4 -0
  446. package/dist/unwraps/podscribe.mjs +10 -0
  447. package/dist/unwraps/podsights.d.mts +4 -0
  448. package/dist/unwraps/podsights.mjs +10 -0
  449. package/dist/unwraps/podtrac.d.mts +4 -0
  450. package/dist/unwraps/podtrac.mjs +21 -0
  451. package/dist/unwraps/podup.d.mts +4 -0
  452. package/dist/unwraps/podup.mjs +11 -0
  453. package/dist/unwraps/postAffiliatePro.d.mts +4 -0
  454. package/dist/unwraps/postAffiliatePro.mjs +13 -0
  455. package/dist/unwraps/postmark.mjs +5 -3
  456. package/dist/unwraps/prNewswire.d.mts +4 -0
  457. package/dist/unwraps/prNewswire.mjs +13 -0
  458. package/dist/unwraps/prezly.d.mts +4 -0
  459. package/dist/unwraps/prezly.mjs +17 -0
  460. package/dist/unwraps/priceGrabber.d.mts +4 -0
  461. package/dist/unwraps/priceGrabber.mjs +9 -0
  462. package/dist/unwraps/promoJukebox.d.mts +4 -0
  463. package/dist/unwraps/promoJukebox.mjs +9 -0
  464. package/dist/unwraps/proofpointIsolation.d.mts +4 -0
  465. package/dist/unwraps/proofpointIsolation.mjs +9 -0
  466. package/dist/unwraps/proofpointV1.mjs +14 -12
  467. package/dist/unwraps/proofpointV2.mjs +2 -13
  468. package/dist/unwraps/proofpointV3.mjs +2 -7
  469. package/dist/unwraps/prweb.d.mts +4 -0
  470. package/dist/unwraps/prweb.mjs +16 -0
  471. package/dist/unwraps/qualityClick.d.mts +4 -0
  472. package/dist/unwraps/qualityClick.mjs +13 -0
  473. package/dist/unwraps/rakutenAffiliate.d.mts +4 -0
  474. package/dist/unwraps/rakutenAffiliate.mjs +29 -0
  475. package/dist/unwraps/ramblerMail.d.mts +4 -0
  476. package/dist/unwraps/ramblerMail.mjs +9 -0
  477. package/dist/unwraps/recruitics.mjs +1 -0
  478. package/dist/unwraps/redditOut.mjs +6 -1
  479. package/dist/unwraps/rediffmail.d.mts +4 -0
  480. package/dist/unwraps/rediffmail.mjs +9 -0
  481. package/dist/unwraps/redirectingat.mjs +6 -1
  482. package/dist/unwraps/researchgate.d.mts +4 -0
  483. package/dist/unwraps/researchgate.mjs +23 -0
  484. package/dist/unwraps/reverbnation.d.mts +4 -0
  485. package/dist/unwraps/reverbnation.mjs +17 -0
  486. package/dist/unwraps/reviveAdserver.d.mts +4 -0
  487. package/dist/unwraps/reviveAdserver.mjs +29 -0
  488. package/dist/unwraps/salesdoubler.d.mts +4 -0
  489. package/dist/unwraps/salesdoubler.mjs +13 -0
  490. package/dist/unwraps/salesflare.d.mts +4 -0
  491. package/dist/unwraps/salesflare.mjs +9 -0
  492. package/dist/unwraps/salesforceiq.d.mts +4 -0
  493. package/dist/unwraps/salesforceiq.mjs +9 -0
  494. package/dist/unwraps/saleshandy.d.mts +4 -0
  495. package/dist/unwraps/saleshandy.mjs +13 -0
  496. package/dist/unwraps/salsa.d.mts +4 -0
  497. package/dist/unwraps/salsa.mjs +12 -0
  498. package/dist/unwraps/sapHelp.d.mts +4 -0
  499. package/dist/unwraps/sapHelp.mjs +13 -0
  500. package/dist/unwraps/sbsAd.d.mts +4 -0
  501. package/dist/unwraps/sbsAd.mjs +9 -0
  502. package/dist/unwraps/segmentfault.mjs +3 -1
  503. package/dist/unwraps/serendipity.d.mts +4 -0
  504. package/dist/unwraps/serendipity.mjs +13 -0
  505. package/dist/unwraps/shareasale.mjs +1 -1
  506. package/dist/unwraps/shareit.d.mts +4 -0
  507. package/dist/unwraps/shareit.mjs +17 -0
  508. package/dist/unwraps/skimlinks.mjs +6 -1
  509. package/dist/unwraps/skyrock.d.mts +4 -0
  510. package/dist/unwraps/skyrock.mjs +9 -0
  511. package/dist/unwraps/slickdeals.d.mts +4 -0
  512. package/dist/unwraps/slickdeals.mjs +9 -0
  513. package/dist/unwraps/smartAdserver.d.mts +4 -0
  514. package/dist/unwraps/smartAdserver.mjs +9 -0
  515. package/dist/unwraps/smartredirect.mjs +12 -2
  516. package/dist/unwraps/smry.d.mts +4 -0
  517. package/dist/unwraps/smry.mjs +9 -0
  518. package/dist/unwraps/sophos.d.mts +4 -0
  519. package/dist/unwraps/sophos.mjs +16 -0
  520. package/dist/unwraps/soundOn.d.mts +4 -0
  521. package/dist/unwraps/soundOn.mjs +10 -0
  522. package/dist/unwraps/soundcloud.d.mts +4 -0
  523. package/dist/unwraps/soundcloud.mjs +9 -0
  524. package/dist/unwraps/soundstack.d.mts +4 -0
  525. package/dist/unwraps/soundstack.mjs +10 -0
  526. package/dist/unwraps/squarespaceEmail.d.mts +4 -0
  527. package/dist/unwraps/squarespaceEmail.mjs +9 -0
  528. package/dist/unwraps/sspai.mjs +1 -1
  529. package/dist/unwraps/stay22.d.mts +4 -0
  530. package/dist/unwraps/stay22.mjs +11 -0
  531. package/dist/unwraps/steamLinkfilter.mjs +1 -1
  532. package/dist/unwraps/storify.d.mts +4 -0
  533. package/dist/unwraps/storify.mjs +9 -0
  534. package/dist/unwraps/streak.d.mts +4 -0
  535. package/dist/unwraps/streak.mjs +15 -0
  536. package/dist/unwraps/streamsend.d.mts +4 -0
  537. package/dist/unwraps/streamsend.mjs +13 -0
  538. package/dist/unwraps/stumbleupon.d.mts +4 -0
  539. package/dist/unwraps/stumbleupon.mjs +19 -0
  540. package/dist/unwraps/subscribeRu.d.mts +4 -0
  541. package/dist/unwraps/subscribeRu.mjs +11 -0
  542. package/dist/unwraps/substack.d.mts +4 -0
  543. package/dist/unwraps/substack.mjs +15 -0
  544. package/dist/unwraps/surly.d.mts +4 -0
  545. package/dist/unwraps/surly.mjs +19 -0
  546. package/dist/unwraps/surugaya.d.mts +4 -0
  547. package/dist/unwraps/surugaya.mjs +9 -0
  548. package/dist/unwraps/swap.d.mts +4 -0
  549. package/dist/unwraps/swap.mjs +17 -0
  550. package/dist/unwraps/symantecClicktime.d.mts +4 -0
  551. package/dist/unwraps/symantecClicktime.mjs +13 -0
  552. package/dist/unwraps/symplicity.d.mts +4 -0
  553. package/dist/unwraps/symplicity.mjs +16 -0
  554. package/dist/unwraps/targetCircle.d.mts +4 -0
  555. package/dist/unwraps/targetCircle.mjs +13 -0
  556. package/dist/unwraps/teacup.d.mts +4 -0
  557. package/dist/unwraps/teacup.mjs +14 -0
  558. package/dist/unwraps/telegramIv.mjs +1 -1
  559. package/dist/unwraps/theRegister.d.mts +4 -0
  560. package/dist/unwraps/theRegister.mjs +10 -0
  561. package/dist/unwraps/threads.mjs +1 -0
  562. package/dist/unwraps/tiktok.d.mts +4 -0
  563. package/dist/unwraps/tiktok.mjs +9 -0
  564. package/dist/unwraps/titanhqLinklock.d.mts +4 -0
  565. package/dist/unwraps/titanhqLinklock.mjs +9 -0
  566. package/dist/unwraps/topsec.d.mts +4 -0
  567. package/dist/unwraps/topsec.mjs +9 -0
  568. package/dist/unwraps/toucharcade.d.mts +4 -0
  569. package/dist/unwraps/toucharcade.mjs +12 -0
  570. package/dist/unwraps/tracdelight.d.mts +4 -0
  571. package/dist/unwraps/tracdelight.mjs +18 -0
  572. package/dist/unwraps/tradedoubler.mjs +6 -1
  573. package/dist/unwraps/tradetracker.d.mts +4 -0
  574. package/dist/unwraps/tradetracker.mjs +9 -0
  575. package/dist/unwraps/travelpayouts.d.mts +4 -0
  576. package/dist/unwraps/travelpayouts.mjs +17 -0
  577. package/dist/unwraps/trendMicro.d.mts +4 -0
  578. package/dist/unwraps/trendMicro.mjs +17 -0
  579. package/dist/unwraps/triplelift.d.mts +4 -0
  580. package/dist/unwraps/triplelift.mjs +9 -0
  581. package/dist/unwraps/trustwaveScanmail.d.mts +4 -0
  582. package/dist/unwraps/trustwaveScanmail.mjs +9 -0
  583. package/dist/unwraps/trxHub.d.mts +4 -0
  584. package/dist/unwraps/trxHub.mjs +13 -0
  585. package/dist/unwraps/twitterRedirect.d.mts +4 -0
  586. package/dist/unwraps/twitterRedirect.mjs +9 -0
  587. package/dist/unwraps/twoCheckout.d.mts +4 -0
  588. package/dist/unwraps/twoCheckout.mjs +12 -0
  589. package/dist/unwraps/uinterbox.d.mts +4 -0
  590. package/dist/unwraps/uinterbox.mjs +9 -0
  591. package/dist/unwraps/ukWebArchive.d.mts +4 -0
  592. package/dist/unwraps/ukWebArchive.mjs +12 -0
  593. package/dist/unwraps/ukgwa.d.mts +4 -0
  594. package/dist/unwraps/ukgwa.mjs +14 -0
  595. package/dist/unwraps/unescoWebArchive.d.mts +4 -0
  596. package/dist/unwraps/unescoWebArchive.mjs +12 -0
  597. package/dist/unwraps/unhcrWebArchive.d.mts +4 -0
  598. package/dist/unwraps/unhcrWebArchive.mjs +12 -0
  599. package/dist/unwraps/unisender.d.mts +4 -0
  600. package/dist/unwraps/unisender.mjs +33 -0
  601. package/dist/unwraps/upAudio.d.mts +4 -0
  602. package/dist/unwraps/upAudio.mjs +10 -0
  603. package/dist/unwraps/vadeSecure.d.mts +4 -0
  604. package/dist/unwraps/vadeSecure.mjs +22 -0
  605. package/dist/unwraps/valuePress.d.mts +4 -0
  606. package/dist/unwraps/valuePress.mjs +19 -0
  607. package/dist/unwraps/valuecommerce.mjs +15 -1
  608. package/dist/unwraps/vanilla.d.mts +4 -0
  609. package/dist/unwraps/vanilla.mjs +12 -0
  610. package/dist/unwraps/vbulletin.d.mts +4 -0
  611. package/dist/unwraps/vbulletin.mjs +12 -0
  612. package/dist/unwraps/vefsafn.d.mts +4 -0
  613. package/dist/unwraps/vefsafn.mjs +14 -0
  614. package/dist/unwraps/vgWort.d.mts +4 -0
  615. package/dist/unwraps/vgWort.mjs +14 -0
  616. package/dist/unwraps/viglink.mjs +15 -2
  617. package/dist/unwraps/virgool.d.mts +4 -0
  618. package/dist/unwraps/virgool.mjs +9 -0
  619. package/dist/unwraps/visibli.d.mts +4 -0
  620. package/dist/unwraps/visibli.mjs +17 -0
  621. package/dist/unwraps/vkAway.mjs +8 -1
  622. package/dist/unwraps/vocus.d.mts +4 -0
  623. package/dist/unwraps/vocus.mjs +15 -0
  624. package/dist/unwraps/voxnest.d.mts +4 -0
  625. package/dist/unwraps/voxnest.mjs +10 -0
  626. package/dist/unwraps/vpixl.d.mts +4 -0
  627. package/dist/unwraps/vpixl.mjs +10 -0
  628. package/dist/unwraps/vuture.d.mts +4 -0
  629. package/dist/unwraps/vuture.mjs +11 -0
  630. package/dist/unwraps/webArchive.mjs +33 -5
  631. package/dist/unwraps/webcitation.d.mts +4 -0
  632. package/dist/unwraps/webcitation.mjs +13 -0
  633. package/dist/unwraps/webgains.d.mts +4 -0
  634. package/dist/unwraps/webgains.mjs +13 -0
  635. package/dist/unwraps/webharvest.d.mts +4 -0
  636. package/dist/unwraps/webharvest.mjs +12 -0
  637. package/dist/unwraps/wikiwix.d.mts +4 -0
  638. package/dist/unwraps/wikiwix.mjs +17 -0
  639. package/dist/unwraps/wikizero.d.mts +4 -0
  640. package/dist/unwraps/wikizero.mjs +22 -0
  641. package/dist/unwraps/wordpressEmail.d.mts +4 -0
  642. package/dist/unwraps/wordpressEmail.mjs +9 -0
  643. package/dist/unwraps/wordpressGo2.d.mts +4 -0
  644. package/dist/unwraps/wordpressGo2.mjs +9 -0
  645. package/dist/unwraps/worldNomads.d.mts +4 -0
  646. package/dist/unwraps/worldNomads.mjs +9 -0
  647. package/dist/unwraps/wpPoczta.d.mts +4 -0
  648. package/dist/unwraps/wpPoczta.mjs +16 -0
  649. package/dist/unwraps/xengentr.d.mts +4 -0
  650. package/dist/unwraps/xengentr.mjs +12 -0
  651. package/dist/unwraps/xiaoyuzhou.d.mts +4 -0
  652. package/dist/unwraps/xiaoyuzhou.mjs +10 -0
  653. package/dist/unwraps/ximalaya.d.mts +4 -0
  654. package/dist/unwraps/ximalaya.mjs +18 -0
  655. package/dist/unwraps/yahooJapan.d.mts +4 -0
  656. package/dist/unwraps/yahooJapan.mjs +15 -0
  657. package/dist/unwraps/yahooJapanAmpViewer.d.mts +4 -0
  658. package/dist/unwraps/yahooJapanAmpViewer.mjs +20 -0
  659. package/dist/unwraps/yahooSearch.mjs +11 -4
  660. package/dist/unwraps/yamm.d.mts +4 -0
  661. package/dist/unwraps/yamm.mjs +9 -0
  662. package/dist/unwraps/yandexMail.d.mts +4 -0
  663. package/dist/unwraps/yandexMail.mjs +14 -0
  664. package/dist/unwraps/yandexTranslate.d.mts +4 -0
  665. package/dist/unwraps/yandexTranslate.mjs +11 -0
  666. package/dist/unwraps/yandexTurbo.mjs +20 -1
  667. package/dist/unwraps/yelp.d.mts +4 -0
  668. package/dist/unwraps/yelp.mjs +13 -0
  669. package/dist/unwraps/yesware.d.mts +4 -0
  670. package/dist/unwraps/yesware.mjs +19 -0
  671. package/dist/unwraps/yourMembership.d.mts +4 -0
  672. package/dist/unwraps/yourMembership.mjs +13 -0
  673. package/dist/unwraps/youtube.mjs +1 -1
  674. package/dist/unwraps/zanox.d.mts +4 -0
  675. package/dist/unwraps/zanox.mjs +17 -0
  676. package/dist/unwraps/zayads.d.mts +4 -0
  677. package/dist/unwraps/zayads.mjs +10 -0
  678. package/dist/unwraps/zemanta.d.mts +4 -0
  679. package/dist/unwraps/zemanta.mjs +9 -0
  680. package/dist/unwraps/zencastr.d.mts +4 -0
  681. package/dist/unwraps/zencastr.mjs +10 -0
  682. package/dist/unwraps/zhihu.mjs +1 -0
  683. package/dist/unwraps/zix.d.mts +4 -0
  684. package/dist/unwraps/zix.mjs +13 -0
  685. package/dist/unwraps/zscalerIsolation.d.mts +4 -0
  686. package/dist/unwraps/zscalerIsolation.mjs +13 -0
  687. package/dist/utils.d.mts +6 -1
  688. package/dist/utils.mjs +48 -10
  689. package/package.json +3 -3
  690. package/dist/unwraps/idealoPartner.d.mts +0 -4
  691. package/dist/unwraps/idealoPartner.mjs +0 -8
  692. package/dist/unwraps/pxf.d.mts +0 -4
  693. package/dist/unwraps/pxf.mjs +0 -8
  694. package/dist/unwraps/sjv.d.mts +0 -4
  695. package/dist/unwraps/sjv.mjs +0 -8
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Unwrap redirect, affiliate, and tracking wrapper URLs and strip tracking parameters. Turn noisy links into clean, direct URLs.
8
8
 
9
- URLs collected from feeds, emails, and social platforms rarely point straight at their destination: they pass through search-engine redirects, email security gateways, affiliate networks, and AMP caches, and carry analytics parameters that bloat the link and leak data. urlpurify ships 70+ unwrappers for known wrapper services and a list of 150+ known tracking parameters, plus a composite `cleanUrl()` that applies both. It has zero dependencies and runs in any modern JavaScript runtime, including browsers.
9
+ Links from feeds, emails and social platforms rarely point straight at their destination. They pass through search redirects, link shims, email gateways and affiliate networks, and pick up tracking parameters on the way, the link decoration that follows a reader from site to site. urlpurify unwraps 380+ known wrappers and strips 170+ known tracking parameters plus families like `utm_*`. It has no dependencies and runs in any modern JavaScript runtime, browsers included.
10
10
 
11
11
  ## Installation
12
12
 
@@ -14,111 +14,95 @@ URLs collected from feeds, emails, and social platforms rarely point straight at
14
14
  npm install urlpurify
15
15
  ```
16
16
 
17
- ## Quick Start
17
+ ## Quick start
18
18
 
19
19
  ```typescript
20
20
  import { cleanUrl } from 'urlpurify'
21
21
 
22
- cleanUrl('https://www.google.com/url?q=https%3A%2F%2Fexample.com%2Fpost%3Futm_source%3Dnewsletter')
23
- // => 'https://example.com/post'
22
+ const url = 'https://www.google.com/url?q=https%3A%2F%2Fexample.com%2Fpost%3Futm_source%3Dnewsletter'
23
+
24
+ cleanUrl(url) // => 'https://example.com/post'
24
25
  ```
25
26
 
26
27
  ## API
27
28
 
28
29
  ### `cleanUrl(url, options?)`
29
30
 
30
- Unwraps redirect wrappers (repeatedly, since wrappers can nest), then strips tracking parameters. When the input cannot be parsed as a URL or nothing applies, the input string is returned unchanged, so the result is always safe to display.
31
+ Unwraps wrappers, repeatedly since they nest, then strips tracking parameters. The result is serialized per the URL Standard, and input that can't be parsed comes back unchanged, so the result is always safe to display.
31
32
 
32
33
  ```typescript
33
- import { cleanUrl, defaultUnwrappers, unwrapWebArchive } from 'urlpurify'
34
+ import { cleanUrl, defaultTrackingParams, defaultUnwrappers, unwrapWebArchive } from 'urlpurify'
34
35
 
35
- const cleaned = cleanUrl(url, {
36
- // Unwrappers to apply, first match wins per pass (omit to use defaults).
36
+ cleanUrl(url, {
37
+ // First match wins per pass.
37
38
  unwrappers: [...defaultUnwrappers, unwrapWebArchive],
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_-]+$/],
41
- // Maximum number of unwrap passes for nested wrappers. Defaults to 3.
42
- maxUnwrapDepth: 3,
39
+ // Names, or regexes tested on the lowercased name.
40
+ trackingParams: [...defaultTrackingParams, 'newsletter_id', /^cmp_[a-z0-9_]+$/],
41
+ // The default.
42
+ maxUnwrapDepth: 6,
43
43
  })
44
44
  ```
45
45
 
46
+ An unwrapped target that isn't a usable URL is ignored, and the wrapper is kept.
47
+
46
48
  ### `unwrapUrl(url, unwrappers?)`
47
49
 
48
- Applies the unwrappers in order (one pass) and returns the first extracted target, or `undefined` when none match or the input cannot be parsed.
50
+ Runs one pass of the unwrappers and returns the first target, or `undefined`.
49
51
 
50
52
  ### `stripTrackingParams(url, trackingParams?)`
51
53
 
52
- Removes matching query parameters and returns the cleaned URL. The input is returned unchanged when nothing matches or it cannot be parsed.
54
+ Removes tracking parameters and returns the serialized URL. Both this and `cleanUrl` apply three rules on top of the list:
53
55
 
54
- Both `cleanUrl` and `stripTrackingParams` also drop a `ref` parameter when its value is the URL's own host (Ghost's self-referral `?ref=example.com` on `example.com`), regardless of the tracking list passed. With any other value `ref` is left alone, since it is often a real referral target.
56
+ - `ref` is dropped when it names the URL's own host, as in Ghost's `?ref=example.com`, and kept otherwise.
57
+ - A query with a signature (`sig`, `signature`, `X-Amz-Signature` or `X-Goog-Signature`) stays whole, since dropping anything breaks the signature.
58
+ - `ts` stays on Alibaba DirectMail click URLs, which fail without it.
59
+
60
+ A tracking list is compiled on first use and cached per array. To change it, pass a new array.
55
61
 
56
62
  ### `createParamExtractor(config)`
57
63
 
58
- Builds an unwrapper for the common case where the target URL sits in a query parameter:
64
+ Builds an unwrapper for a target that sits in a query parameter:
59
65
 
60
66
  ```typescript
61
67
  import { cleanUrl, createParamExtractor, defaultUnwrappers } from 'urlpurify'
62
68
 
63
69
  const unwrapExample = createParamExtractor({
64
- hosts: 'go.example.com', // Also accepts an array of hosts or a regex.
70
+ // The domain and every subdomain. Use `hosts` for exact hosts or a regex.
71
+ domains: 'example.com',
72
+ path: '/out',
65
73
  params: ['target'],
66
74
  })
67
75
 
68
76
  cleanUrl(url, { unwrappers: [...defaultUnwrappers, unwrapExample] })
69
77
  ```
70
78
 
71
- For wrappers that encode the target (base64 path segments, custom escaping), write a plain function of type `UrlUnwrapper`: it receives a `URL` and returns the target string or `undefined`.
79
+ A value still encoded after one decode, starting with `http%3A` or `https%3A`, is decoded once more. For any other shape, write a plain `UrlUnwrapper`: a function that takes a `URL` and returns the target or `undefined`.
80
+
81
+ ### Tracking parameters
72
82
 
73
- ### Defaults
83
+ `defaultTrackingParams` holds literal names plus regexes for vendor families like `utm_*`. The two halves are also exported as `trackingParamsLiterals` and `trackingParamsPatterns`.
74
84
 
75
- `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; everything else is exported individually for explicit opt-in.
85
+ ## Unwrappers
76
86
 
77
- **On by default:** redirects that only track the click — search-engine redirects and platform shims. Unwrapping them costs the destination nothing.
87
+ There are more than 380 unwrappers, each in its own file in [src/unwraps](src/unwraps), with a comment naming the service and the URL shape it handles. Each is exported on its own and belongs to one category. The categories split by what unwrapping takes away from someone, which is what decides whether you want it:
78
88
 
79
- **Off by default:** affiliate and referral wrappers (`unwrapSkimlinks`, `unwrapAwin`, `unwrapShareasale`, `unwrapAmazonAffiliate`, `unwrapViglink`, and the rest). The reader lands on the same page either way — unwrapping only removes the writer's commission, which for a small blog is the money paying for the work. Opt in explicitly if you want them.
89
+ | Category | Export | Unwrapping removes | Default |
90
+ | --- | --- | --- | :---: |
91
+ | Search clicks | `searchClickUnwrappers` | The search engine's or aggregator's click logging | ☑️ |
92
+ | Link shims | `linkShimUnwrappers` | Nothing, or a platform's click count or a site click counter | ☑️ |
93
+ | Press releases | `pressReleaseUnwrappers` | The wire's click stats | ☑️ |
94
+ | Sign-in shims | `signInShimUnwrappers` | Nothing, but the shim's page needs a sign-in | |
95
+ | Security gateways | `securityGatewayUnwrappers` | The gateway's click-time check of the target | |
96
+ | Email tracking | `emailTrackingUnwrappers` | The sender's click stats | |
97
+ | Affiliate links | `affiliateUnwrappers` | The publisher's commission | |
98
+ | Advertising | `advertisingUnwrappers` | Ad click and app install attribution | |
99
+ | Download measurement | `downloadMeasurementUnwrappers` | A podcast measurement prefix's download counts, or a site's download or click counts | |
100
+ | Archives and proxies | `archiveProxyUnwrappers` | The archived or translated copy: you get the live page | |
80
101
 
81
- Prevalence is not the test: affiliate wrappers are more common than tracking shims.
102
+ `defaultUnwrappers` combines the first three. The rest cost somebody something or change the page: an affiliate link may pay for a small blog, and an archive link points at a copy on purpose. To turn more on, spread them next to the defaults:
82
103
 
83
- ## Unwrappers
104
+ ```typescript
105
+ import { affiliateUnwrappers, cleanUrl, defaultUnwrappers } from 'urlpurify'
84
106
 
85
- Enabled by default:
86
-
87
- | Unwrapper | Description |
88
- | --- | --- |
89
- | `unwrapBing` | Bing search-result redirect (www.bing.com/ck/a?u=a1\<base64url\>) |
90
- | `unwrapAnonymTo` | anonym.to referrer anonymizer (anonym.to/?\<target\>) |
91
- | `unwrapBlueskyRedirect` | Bluesky outbound link redirect (go.bsky.app/redirect?u=\<target\>) |
92
- | `unwrapCsdn` | CSDN external link redirect (link.csdn.net/?target=\<target\>) |
93
- | `unwrapDeviantartOutgoing` | DeviantArt outbound link shim (deviantart.com/\<user\>/outgoing?\<target\>) |
94
- | `unwrapDisqus` | Disqus outbound link redirect (disq.us/?url=\<target\>) |
95
- | `unwrapDouban` | Douban external link redirect (www.douban.com/link2/?url=\<target\>) |
96
- | `unwrapFacebookShim` | Meta link shim (l.facebook.com / l.messenger.com /l.php?u=\<target\>) |
97
- | `unwrapFlipboard` | Flipboard outbound redirect (flipboard.com/redirect?url=\<target\>) |
98
- | `unwrapGitee` | Gitee external link redirect (gitee.com/link?target=\<target\>) |
99
- | `unwrapGoogle` | Google redirect (google.\<TLD\>/url?url=\<target\> or ?q=\<target\>) |
100
- | `unwrapGoogleAmpViewer` | Google AMP viewer (www.google.\<TLD\>/amp/s/\<host\>/\<path\>) |
101
- | `unwrapGoogleNews` | Google News legacy redirect (news.google.\<TLD\>/news/url?url=\<target\>) |
102
- | `unwrapGoogleNewsModern` | Google News modern article URLs (news.google.com/articles/\<base64\>) |
103
- | `unwrapGoogleScholar` | Google Scholar search-result redirect (scholar.google.\<TLD\>/scholar_url?url=\<target\>) |
104
- | `unwrapHashnode` | Hashnode outbound redirect (hashnode.com/util/redirect?url=\<target\>) |
105
- | `unwrapHrefLi` | href.li referrer stripper (href.li/?\<target\>), used by Tumblr |
106
- | `unwrapInstagramShim` | Instagram outbound link shim (l.instagram.com with ?u=\<target\>) |
107
- | `unwrapJianshuGo` | Jianshu external link redirect (links.jianshu.com/go?to=\<target\>) |
108
- | `unwrapJuejin` | Juejin external link redirect (link.juejin.cn/?target=\<target\>) |
109
- | `unwrapMedium` | Medium outbound link redirect (medium.com/r/?url=\<target\>) |
110
- | `unwrapMozillaOutgoing` | Mozilla outgoing-link redirector (outgoing.prod.mozaws.net/v1/\<hash\>/\<target\>) |
111
- | `unwrapPocket` | Pocket redirect (getpocket.com/redirect?url=\<target\>) |
112
- | `unwrapNaverOutgoing` | Naver outbound link redirect (cc.loginfra.com/...?u=\<target\>) |
113
- | `unwrapRedditOut` | Reddit outbound click tracker (out.reddit.com/?url=\<target\>) |
114
- | `unwrapSegmentfault` | Segmentfault external link redirect (link.segmentfault.com/?enc=\<base64\>) |
115
- | `unwrapSspai` | Sspai external link redirect (sspai.com/link?target=\<target\>) |
116
- | `unwrapSteamLinkfilter` | Steam outbound link filter (steamcommunity.com/linkfilter/?url=\<target\>) |
117
- | `unwrapThreadsShim` | Threads outbound link shim (l.threads.com / l.threads.net with ?u=\<target\>) |
118
- | `unwrapTumblr` | Tumblr outbound redirect (t.umblr.com/redirect?z=\<target\>) |
119
- | `unwrapVkAway` | VK away redirect (vk.com/away.php?to=\<target\>) |
120
- | `unwrapYahooSearch` | Yahoo Search redirect (r.search.yahoo.com/.../RU=\<target\>/RK=...) |
121
- | `unwrapYouTube` | YouTube external redirect (www.youtube.com/redirect?q=\<target\>) |
122
- | `unwrapZhihu` | Zhihu external redirect (link.zhihu.com/?target=\<target\>) |
123
-
124
- Many more are available for explicit opt-in: email security gateways (Outlook SafeLinks, Proofpoint, Mimecast), affiliate networks (Awin, Skimlinks, Commission Junction), CJK platforms, AMP caches, and others. See [src/unwraps](src/unwraps) for the full catalog, each documented in its source file.
107
+ cleanUrl(url, { unwrappers: [...defaultUnwrappers, ...affiliateUnwrappers] })
108
+ ```
package/dist/clean.mjs CHANGED
@@ -1,6 +1,14 @@
1
- import { parseUrl, stripWww } from "./node_modules/trousse/dist/urls.mjs";
1
+ import { fixMalformedProtocol, isHttpUrl, isIpAddress, parseUrl, stripWww } from "./node_modules/trousse/dist/urls.mjs";
2
2
  import { defaultTrackingParams, defaultUnwrappers } from "./defaults.mjs";
3
3
  //#region src/clean.ts
4
+ const replacementCharacter = "�";
5
+ const refDelimitersRegex = /[\s/?#\\:@]/;
6
+ const signatureParams = [
7
+ "sig",
8
+ "signature",
9
+ "x-amz-signature",
10
+ "x-goog-signature"
11
+ ];
4
12
  const trackingMatcherCache = /* @__PURE__ */ new WeakMap();
5
13
  const getTrackingMatcher = (params) => {
6
14
  let cached = trackingMatcherCache.get(params);
@@ -18,52 +26,77 @@ const getTrackingMatcher = (params) => {
18
26
  return cached;
19
27
  };
20
28
  const deleteTrackingParams = (url, trackingParams) => {
21
- if (!url.search) return false;
29
+ if (!url.search) return;
30
+ const pairs = url.search.slice(1).split("&");
31
+ const entries = pairs.map((pair) => new URLSearchParams(pair).entries().next().value);
32
+ for (const entry of entries) if (entry && signatureParams.includes(entry[0].toLowerCase())) return;
22
33
  const matcher = getTrackingMatcher(trackingParams);
23
- const keysToDelete = [];
24
- for (const key of url.searchParams.keys()) {
34
+ const host = stripWww(url.hostname);
35
+ const keepsTs = url.hostname === "dm-cn.aliyuncs.com" && url.pathname === "/trace/v1/report";
36
+ const keptPairs = pairs.filter((_pair, index) => {
37
+ const entry = entries[index];
38
+ if (!entry) return true;
39
+ const [key, value] = entry;
25
40
  const name = key.toLowerCase();
26
- if (matcher.literals.has(name) || matcher.patterns.some((pattern) => pattern.test(name))) keysToDelete.push(key);
27
- }
28
- for (const key of keysToDelete) url.searchParams.delete(key);
29
- return keysToDelete.length > 0;
41
+ if (keepsTs && name === "ts") return true;
42
+ if (matcher.literals.has(name) || matcher.patterns.some((pattern) => name.search(pattern) !== -1)) return false;
43
+ if (name !== "ref" || refDelimitersRegex.test(value)) return true;
44
+ try {
45
+ return stripWww(new URL(`http://${value}`).hostname) !== host;
46
+ } catch {}
47
+ return true;
48
+ });
49
+ if (keptPairs.length === pairs.length) return;
50
+ url.search = keptPairs.join("&");
30
51
  };
31
- const stripHostPrefix = (host) => {
32
- return stripWww(host).toLowerCase();
52
+ const controlCharactersRegex = /[\p{Cc}\u2028\u2029]/u;
53
+ const dottedHostRegex = /[^.]\.[^.]/;
54
+ const fileExtensionHostRegex = /\.(?:asp|aspx|cgi|htm|html|jsp|jspa|php)$/;
55
+ const cleanTarget = (target) => {
56
+ if (!target) return;
57
+ const repaired = fixMalformedProtocol(target.trim());
58
+ if (controlCharactersRegex.test(repaired)) return;
59
+ const hostname = parseUrl(repaired)?.hostname ?? "";
60
+ if (!dottedHostRegex.test(hostname) && !isIpAddress(hostname)) return;
61
+ if (fileExtensionHostRegex.test(hostname)) return;
62
+ return repaired;
33
63
  };
34
- const deleteSelfReferentialParams = (url) => {
35
- const value = url.searchParams.get("ref");
36
- if (!value || stripHostPrefix(value) !== stripHostPrefix(url.hostname)) return false;
37
- url.searchParams.delete("ref");
38
- return true;
64
+ const protocolRelativeRegex = /^\/\/[^/]/;
65
+ const addMissingScheme = (target) => {
66
+ if (!target || !protocolRelativeRegex.test(target)) return target;
67
+ return `https:${target}`;
39
68
  };
40
69
  const applyUnwrappers = (url, unwrappers) => {
41
70
  for (const unwrap of unwrappers) {
42
- const target = unwrap(url);
71
+ const raw = addMissingScheme(unwrap(url));
72
+ if (!raw || !isHttpUrl(raw)) continue;
73
+ const target = cleanTarget(raw);
43
74
  if (target) return target;
44
75
  }
45
76
  };
46
77
  const unwrapUrl = (url, unwrappers = defaultUnwrappers) => {
47
78
  const parsed = parseUrl(url);
48
79
  if (!parsed) return;
49
- return applyUnwrappers(parsed, unwrappers);
80
+ const target = applyUnwrappers(parsed, unwrappers);
81
+ if (!target || target.includes(replacementCharacter)) return;
82
+ return parseUrl(target)?.href;
50
83
  };
51
84
  const stripTrackingParams = (url, trackingParams = defaultTrackingParams) => {
52
85
  const parsed = parseUrl(url);
53
86
  if (!parsed) return url;
54
- const trackingRemoved = deleteTrackingParams(parsed, trackingParams);
55
- const selfReferentialRemoved = deleteSelfReferentialParams(parsed);
56
- if (trackingRemoved || selfReferentialRemoved) return parsed.toString();
57
- return url;
87
+ deleteTrackingParams(parsed, trackingParams);
88
+ return parsed.href;
58
89
  };
59
90
  const cleanUrl = (url, options) => {
60
91
  const unwrappers = options?.unwrappers ?? defaultUnwrappers;
61
92
  const trackingParams = options?.trackingParams ?? defaultTrackingParams;
62
- const maxUnwrapDepth = options?.maxUnwrapDepth ?? 3;
93
+ const maxUnwrapDepth = options?.maxUnwrapDepth ?? 6;
63
94
  const parsed = parseUrl(url);
64
95
  if (!parsed) return url;
65
96
  let currentUrl = url;
66
97
  let currentParsed = parsed;
98
+ let intactUrl = url;
99
+ let intactParsed = parsed;
67
100
  for (let depth = 0; depth < maxUnwrapDepth; depth += 1) {
68
101
  const target = applyUnwrappers(currentParsed, unwrappers);
69
102
  if (!target) break;
@@ -71,11 +104,17 @@ const cleanUrl = (url, options) => {
71
104
  if (!targetParsed) break;
72
105
  currentUrl = target;
73
106
  currentParsed = targetParsed;
107
+ if (!target.includes(replacementCharacter)) {
108
+ intactUrl = target;
109
+ intactParsed = targetParsed;
110
+ }
111
+ }
112
+ if (currentUrl.includes(replacementCharacter)) {
113
+ currentUrl = intactUrl;
114
+ currentParsed = intactParsed;
74
115
  }
75
- const trackingRemoved = deleteTrackingParams(currentParsed, trackingParams);
76
- const selfReferentialRemoved = deleteSelfReferentialParams(currentParsed);
77
- if (trackingRemoved || selfReferentialRemoved) return currentParsed.toString();
78
- return currentUrl;
116
+ deleteTrackingParams(currentParsed, trackingParams);
117
+ return currentParsed.href;
79
118
  };
80
119
  //#endregion
81
120
  export { cleanUrl, stripTrackingParams, unwrapUrl };
@@ -3,6 +3,16 @@ import { trackingParamsLiterals } from "./tracking/literals.mjs";
3
3
  import { trackingParamsPatterns } from "./tracking/patterns.mjs";
4
4
  //#region src/defaults.d.ts
5
5
  export declare const defaultTrackingParams: Array<TrackingParam>;
6
+ export declare const searchClickUnwrappers: Array<UrlUnwrapper>;
7
+ export declare const linkShimUnwrappers: Array<UrlUnwrapper>;
8
+ export declare const pressReleaseUnwrappers: Array<UrlUnwrapper>;
9
+ export declare const signInShimUnwrappers: Array<UrlUnwrapper>;
10
+ export declare const securityGatewayUnwrappers: Array<UrlUnwrapper>;
11
+ export declare const emailTrackingUnwrappers: Array<UrlUnwrapper>;
12
+ export declare const affiliateUnwrappers: Array<UrlUnwrapper>;
13
+ export declare const advertisingUnwrappers: Array<UrlUnwrapper>;
14
+ export declare const downloadMeasurementUnwrappers: Array<UrlUnwrapper>;
15
+ export declare const archiveProxyUnwrappers: Array<UrlUnwrapper>;
6
16
  export declare const defaultUnwrappers: Array<UrlUnwrapper>;
7
17
  //#endregion
8
18
  export { trackingParamsLiterals, trackingParamsPatterns };