@rtstic.dev/pulse 0.0.62 → 0.0.65

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.
@@ -0,0 +1 @@
1
+ "use strict";(()=>{var A=["google.","bing.com","yahoo.","duckduckgo.com","baidu.com","yandex.","ask.com","ecosia.org","aol.com","startpage.com","qwant.com","brave.com","search.brave.com","naver.com","daum.net","sogou.com","so.com","seznam.cz","onesearch.com","swisscows.com","mojeek.com","presearch.com","search.yahoo.com","googlesyndication.com","googleadservices.com"],C=["facebook.com","fb.com","fb.me","l.facebook.com","lm.facebook.com","m.facebook.com","instagram.com","l.instagram.com","twitter.com","t.co","x.com","linkedin.com","lnkd.in","pinterest.com","pin.it","reddit.com","tiktok.com","youtube.com","youtu.be","snapchat.com","tumblr.com","threads.net","mastodon.social","bsky.app","whatsapp.com","wechat.com","weibo.com","vk.com","quora.com","medium.com","discord.com","discord.gg","telegram.org","t.me","slack.com"],R={"facebook.com":"Facebook","fb.com":"Facebook","fb.me":"Facebook","l.facebook.com":"Facebook","lm.facebook.com":"Facebook","m.facebook.com":"Facebook","instagram.com":"Instagram","l.instagram.com":"Instagram","twitter.com":"Twitter","t.co":"Twitter","x.com":"Twitter","linkedin.com":"LinkedIn","lnkd.in":"LinkedIn","pinterest.com":"Pinterest","pin.it":"Pinterest","reddit.com":"Reddit","tiktok.com":"TikTok","youtube.com":"YouTube","youtu.be":"YouTube","snapchat.com":"Snapchat","tumblr.com":"Tumblr","threads.net":"Threads","mastodon.social":"Mastodon","bsky.app":"Bluesky","whatsapp.com":"WhatsApp","wechat.com":"WeChat","weibo.com":"Weibo","vk.com":"VK","quora.com":"Quora","medium.com":"Medium","discord.com":"Discord","discord.gg":"Discord","telegram.org":"Telegram","t.me":"Telegram","slack.com":"Slack"},N={"google.":"Google","bing.com":"Bing","yahoo.":"Yahoo","duckduckgo.com":"DuckDuckGo","baidu.com":"Baidu","yandex.":"Yandex","ask.com":"Ask","ecosia.org":"Ecosia","aol.com":"AOL","startpage.com":"Startpage","qwant.com":"Qwant","brave.com":"Brave","search.brave.com":"Brave","naver.com":"Naver","daum.net":"Daum","sogou.com":"Sogou","so.com":"360 Search","seznam.cz":"Seznam","googlesyndication.com":"Google","googleadservices.com":"Google"};(function(){"use strict";let c={utmKeys:["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id"],clickIdKeys:["gclid","msclkid","fbclid"],linkSelectors:["a[href]","button[onclick*='location']","button[onclick*='window.open']","button[onclick*='href']","[data-href]"],inputSelector:"[data-utm-input]",cookieName:"_attrib_data",cookieDays:30,storageKey:"utm_attribution",inputKeyMap:{source:"utm_source",medium:"utm_medium",campaign:"utm_campaign",term:"utm_term",content:"utm_content",id:"utm_id",utm_source:"utm_source",utm_medium:"utm_medium",utm_campaign:"utm_campaign",utm_term:"utm_term",utm_content:"utm_content",utm_id:"utm_id",gclid:"gclid",msclkid:"msclkid",fbclid:"fbclid",channel:"_channel",channeldrilldown1:"_channelDrilldown1",channeldrilldown2:"_channelDrilldown2",channeldrilldown3:"_channelDrilldown3",landingpage:"_landingPage",landingpagegroup:"_landingPageGroup"}};function h(n,t){let o=n.toLowerCase(),e=t.toLowerCase();return e.endsWith(".")?o===e.slice(0,-1)||o.includes("."+e.slice(0,-1)+".")||o.startsWith(e):o===e||o.endsWith("."+e)}function w(n){return A.some(t=>h(n,t))}function f(n){return C.some(t=>h(n,t))}function L(n){for(let[t,o]of Object.entries(N))if(h(n,t))return o;return k(n)}function b(n){for(let[t,o]of Object.entries(R))if(h(n,t))return o;return k(n)}function k(n){return n.replace(/^www\./,"")}function p(n){let t=n.toLowerCase().trim();return Object.values(R).map(e=>e.toLowerCase()).includes(t)?!0:C.some(e=>t===e||t===e.replace(".com",""))}function I(n){let t=n.toLowerCase().trim();return Object.values(N).map(e=>e.toLowerCase()).includes(t)?!0:A.some(e=>{let i=e.replace(/\.$/,"");return t===i||t===i.replace(".com","")})}function l(n,...t){if(!n)return!1;let o=n.toLowerCase();return t.some(e=>o.includes(e.toLowerCase()))}function D(n,...t){if(!n)return!1;let o=n.toLowerCase().trim();return t.some(e=>o===e.toLowerCase())}function O(n,t,o){let e=new Date(Date.now()+o*864e5).toUTCString();document.cookie=`${n}=${encodeURIComponent(t)};expires=${e};path=/;SameSite=Lax`}function K(n){let t=document.cookie.match(new RegExp("(?:^|; )"+n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"=([^;]*)"));return t?decodeURIComponent(t[1]):null}function _(n){let t=JSON.stringify(n);try{O(c.cookieName,t,c.cookieDays)}catch(o){console.warn("UTM: Could not set cookie",o)}try{sessionStorage.setItem(c.storageKey,t)}catch(o){console.warn("UTM: Could not write to sessionStorage",o)}}function M(){try{let n=K(c.cookieName);if(n)return JSON.parse(n)}catch(n){console.warn("UTM: Could not parse cookie",n)}try{let n=sessionStorage.getItem(c.storageKey);if(n)return JSON.parse(n)}catch(n){console.warn("UTM: Could not read sessionStorage",n)}return null}function G(){let n=new URLSearchParams(window.location.search),t={};c.utmKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)}),c.clickIdKeys.forEach(e=>{let i=n.get(e);i&&(t[e]=i)});let o=n.get("source");return o&&!t.utm_source&&(t.source=o),t}function P(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign||!!n.source||!!n.gclid||!!n.msclkid||!!n.fbclid}function W(n){return!!n.utm_source||!!n.utm_medium||!!n.utm_campaign}function j(){try{if(!document.referrer)return"";let n=new URL(document.referrer);return n.hostname===window.location.hostname?"":n.hostname.toLowerCase()}catch{return""}}function x(){return window.location.pathname+window.location.search}function q(){let t=window.location.pathname.split("/").filter(Boolean);return t.length>0?"/"+t[0]:"/"}function S(n,t){let o=n.utm_source||"",e=n.utm_medium||"",i=n.utm_campaign||"",g=n.utm_term||"",a=n.utm_content||"",m=n.source||"",r=n.gclid||"",d=n.msclkid||"",X=n.fbclid||"",v=x(),V=q(),s={landingPage:v,landingPageGroup:V};if(D(e,"social")&&(p(o)||f(t))){let u=p(o)?T(o):b(t);return{...s,channel:"Organic Social",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:a||""}}if(D(e,"email"))return{...s,channel:"Email Marketing",channelDrilldown1:o||"Email",channelDrilldown2:i||"",channelDrilldown3:a||""};if(l(o,"paidsocial")||l(e,"paidsocial")||l(e,"paid","ppc","cpc")&&p(o)||l(e,"paid","ppc","cpc")&&f(t)){let u=p(o)?T(o):f(t)?b(t):o||"Paid Social";return{...s,channel:"Paid Social",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:g||a||""}}if(l(o,"paidsearch")||l(e,"paidsearch")||l(o,"adwords","ppc","cpc")||l(e,"adwords","ppc","cpc")||l(i,"adwords","ppc","cpc")||r||d||W(n)&&w(t)){let u="Paid Search";return r?u="Google":d?u="Bing":I(o)?u=T(o):w(t)?u=L(t):o&&(u=o),{...s,channel:"Paid Search",channelDrilldown1:u,channelDrilldown2:i||"",channelDrilldown3:g||""}}return D(e,"display")?{...s,channel:"Display",channelDrilldown1:o||"Display",channelDrilldown2:i||"",channelDrilldown3:a||""}:l(e,"affiliate")?{...s,channel:"Affiliates",channelDrilldown1:o||"Affiliate",channelDrilldown2:i||"",channelDrilldown3:a||""}:P(n)?{...s,channel:"Other Campaigns",channelDrilldown1:o||m||"",channelDrilldown2:e||"",channelDrilldown3:i||""}:t&&f(t)?{...s,channel:"Organic Social",channelDrilldown1:b(t),channelDrilldown2:"",channelDrilldown3:""}:t&&w(t)?{...s,channel:"Organic Search",channelDrilldown1:L(t),channelDrilldown2:"",channelDrilldown3:""}:t?{...s,channel:"Referral",channelDrilldown1:k(t),channelDrilldown2:v,channelDrilldown3:""}:{...s,channel:"Direct",channelDrilldown1:"Direct",channelDrilldown2:v,channelDrilldown3:""}}function T(n){return n&&n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()}function B(n,t){try{return n.startsWith("/")||n.startsWith("./")||n.startsWith("../")?!0:/^[a-z]+:/i.test(n)&&!n.startsWith("http")?!1:n.startsWith("http")?new URL(n).hostname===t:n.startsWith("//")?new URL("https:"+n).hostname===t:!n.includes("://")}catch(o){return console.warn("UTM: Error parsing URL:",n,o),!1}}function F(n,t){try{let o=new URL(n,window.location.origin);return Object.entries(t).forEach(([e,i])=>{c.utmKeys.includes(e)&&(o.searchParams.has(e)||o.searchParams.set(e,i))}),o.toString()}catch(o){return console.warn("UTM: Error processing URL:",n,o),n}}function U(n){return n.getAttribute("data-utm-exception")==="true"}function y(n,t){if(U(n))return;let o=window.location.hostname,e=null;if(n instanceof HTMLAnchorElement&&n.href?e=n.href:n instanceof HTMLElement&&n.dataset.href&&(e=n.dataset.href),e&&B(e,o)){let i=F(e,t);n instanceof HTMLAnchorElement?n.href=i:n instanceof HTMLElement&&n.dataset.href&&(n.dataset.href=i)}}function $(n){document.querySelectorAll(c.linkSelectors.join(", ")).forEach(o=>y(o,n))}function E(n,t){if(U(n))return;let o=n.getAttribute("data-utm-input")?.trim().toLowerCase();if(!o)return;let e=c.inputKeyMap[o];if(!e){console.warn(`UTM: Unknown data-utm-input value "${o}"`);return}let i=t[e];if(i&&(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)){if(n.value&&n.value.trim()!=="")return;n.value=i,n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}}function z(n){document.querySelectorAll(c.inputSelector).forEach(o=>E(o,n))}function Y(n){let t={};return Object.entries(n.params).forEach(([o,e])=>{t[o]=e}),t._channel=n.attribution.channel,t._channelDrilldown1=n.attribution.channelDrilldown1,t._channelDrilldown2=n.attribution.channelDrilldown2,t._channelDrilldown3=n.attribution.channelDrilldown3,t._landingPage=n.attribution.landingPage,t._landingPageGroup=n.attribution.landingPageGroup,t}function J(n,t){let o=[...c.linkSelectors,c.inputSelector].join(", "),e=null,i=[];function g(){let m=i.slice();i=[],e=null,m.forEach(r=>{r.matches&&r.matches(c.inputSelector)?E(r,t):r.matches&&r.matches(c.linkSelectors.join(", "))&&y(r,n),r.querySelectorAll?.(o).forEach(d=>{d.matches(c.inputSelector)?E(d,t):y(d,n)})})}new MutationObserver(m=>{m.forEach(r=>{r.addedNodes.forEach(d=>{d.nodeType===Node.ELEMENT_NODE&&i.push(d)})}),i.length>0&&!e&&(e=setTimeout(g,50))}).observe(document.body,{childList:!0,subtree:!0})}function Q(){let n=G(),t=j(),o=P(n),e;if(o){let a=S(n,t);e={params:n,attribution:a},_(e)}else if(t){let a=M();if(a)e=a;else{let m=S(n,t);e={params:n,attribution:m},_(e)}}else{let a=M();if(a)e=a;else{let m=S(n,t);e={params:{},attribution:m},_(e)}}let i=Y(e),g=()=>{$(e.params),z(i),J(e.params,i),console.log("UTM Attribution:",e.attribution),console.log("UTM Params:",e.params)};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",g):g()}Q()})();})();
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/form/utm-propagation.ts"],
4
+ "sourcesContent": ["// UTM Parameter Propagation Script (TypeScript)\n// - Propagates UTM params to all internal links\n// - Fills input fields marked with data-utm-input attribute\n// - Stores UTM params in sessionStorage as fallback\n\ninterface UTMParams {\n [key: string]: string;\n}\n\ninterface UTMConfig {\n utmKeys: string[];\n linkSelectors: string[];\n inputSelector: string;\n storageKey: string;\n // Maps shorthand names (used in data-utm-input) to full UTM keys\n inputKeyMap: Record<string, string>;\n}\n\n(function (): void {\n \"use strict\";\n\n const config: UTMConfig = {\n utmKeys: [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n \"utm_id\",\n ],\n linkSelectors: [\n \"a[href]\",\n \"button[onclick*='location']\",\n \"button[onclick*='window.open']\",\n \"button[onclick*='href']\",\n \"[data-href]\",\n ],\n inputSelector: \"[data-utm-input]\",\n storageKey: \"utm_params\",\n inputKeyMap: {\n source: \"utm_source\",\n medium: \"utm_medium\",\n campaign: \"utm_campaign\",\n term: \"utm_term\",\n content: \"utm_content\",\n id: \"utm_id\",\n // Also support full key names\n utm_source: \"utm_source\",\n utm_medium: \"utm_medium\",\n utm_campaign: \"utm_campaign\",\n utm_term: \"utm_term\",\n utm_content: \"utm_content\",\n utm_id: \"utm_id\",\n },\n };\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // UTM Param Retrieval (URL \u2192 sessionStorage fallback)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function getUTMParamsFromURL(): UTMParams {\n const urlParams = new URLSearchParams(window.location.search);\n const utmParams: UTMParams = {};\n\n config.utmKeys.forEach((key) => {\n const value = urlParams.get(key);\n if (value) {\n utmParams[key] = value;\n }\n });\n\n return utmParams;\n }\n\n function storeUTMParams(params: UTMParams): void {\n try {\n sessionStorage.setItem(config.storageKey, JSON.stringify(params));\n } catch (e) {\n console.warn(\"UTM: Could not write to sessionStorage\", e);\n }\n }\n\n function getStoredUTMParams(): UTMParams {\n try {\n const stored = sessionStorage.getItem(config.storageKey);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n console.warn(\"UTM: Could not read from sessionStorage\", e);\n return {};\n }\n }\n\n /**\n * Returns UTM params with priority: URL params > sessionStorage.\n * Merges both so fresh URL params override stale stored ones,\n * but stored ones survive across pages that strip query strings.\n */\n function getUTMParams(): UTMParams {\n const fromURL = getUTMParamsFromURL();\n const fromStorage = getStoredUTMParams();\n\n const merged: UTMParams = { ...fromStorage, ...fromURL };\n\n // Persist merged result so subsequent pages can pick them up\n if (Object.keys(merged).length > 0) {\n storeUTMParams(merged);\n }\n\n return merged;\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Link Processing\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function isInternalLink(url: string, currentHost: string): boolean {\n try {\n if (\n url.startsWith(\"/\") ||\n url.startsWith(\"./\") ||\n url.startsWith(\"../\")\n ) {\n return true;\n }\n\n // Skip non-http schemes (mailto:, tel:, javascript:, etc.)\n if (/^[a-z]+:/i.test(url) && !url.startsWith(\"http\")) {\n return false;\n }\n\n if (url.startsWith(\"http\")) {\n return new URL(url).hostname === currentHost;\n }\n\n if (url.startsWith(\"//\")) {\n return new URL(\"https:\" + url).hostname === currentHost;\n }\n\n // Relative paths without scheme\n if (!url.includes(\"://\")) {\n return true;\n }\n\n return false;\n } catch (e) {\n console.warn(\"UTM: Error parsing URL:\", url, e);\n return false; // Safer default \u2014 don't touch broken URLs\n }\n }\n\n function addUTMToURL(url: string, utmParams: UTMParams): string {\n try {\n const urlObj = new URL(url, window.location.origin);\n\n Object.entries(utmParams).forEach(([key, value]) => {\n if (!urlObj.searchParams.has(key)) {\n urlObj.searchParams.set(key, value);\n }\n });\n\n return urlObj.toString();\n } catch (e) {\n console.warn(\"UTM: Error processing URL:\", url, e);\n return url;\n }\n }\n\n function hasUTMException(element: Element): boolean {\n return element.getAttribute(\"data-utm-exception\") === \"true\";\n }\n\n function processLink(element: Element, utmParams: UTMParams): void {\n if (hasUTMException(element)) return;\n\n const currentHost = window.location.hostname;\n let url: string | null = null;\n\n if (element instanceof HTMLAnchorElement && element.href) {\n url = element.href;\n } else if (element instanceof HTMLElement && element.dataset.href) {\n url = element.dataset.href;\n }\n\n if (url && isInternalLink(url, currentHost)) {\n const updatedURL = addUTMToURL(url, utmParams);\n\n if (element instanceof HTMLAnchorElement) {\n element.href = updatedURL;\n } else if (element instanceof HTMLElement && element.dataset.href) {\n element.dataset.href = updatedURL;\n }\n }\n }\n\n function processAllLinks(utmParams: UTMParams): void {\n const links = document.querySelectorAll(config.linkSelectors.join(\", \"));\n links.forEach((el) => processLink(el, utmParams));\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Input Field Processing\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Fills an input/textarea/select that has data-utm-input=\"<key>\"\n *\n * Usage examples:\n * <input type=\"hidden\" data-utm-input=\"source\" />\n * <input type=\"hidden\" data-utm-input=\"medium\" />\n * <input type=\"hidden\" data-utm-input=\"campaign\" />\n * <input type=\"hidden\" data-utm-input=\"term\" />\n * <input type=\"hidden\" data-utm-input=\"content\" />\n * <input type=\"hidden\" data-utm-input=\"id\" />\n *\n * Also accepts full names: data-utm-input=\"utm_source\"\n */\n function processInput(element: Element, utmParams: UTMParams): void {\n if (hasUTMException(element)) return;\n\n const shortKey = element.getAttribute(\"data-utm-input\")?.trim().toLowerCase();\n if (!shortKey) return;\n\n // Resolve shorthand \u2192 full UTM key\n const fullKey = config.inputKeyMap[shortKey];\n if (!fullKey) {\n console.warn(`UTM: Unknown data-utm-input value \"${shortKey}\"`);\n return;\n }\n\n const value = utmParams[fullKey];\n if (!value) return;\n\n // Support input, textarea, and select elements\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n element.value = value;\n\n // Dispatch events so frameworks (React, Vue, etc.) pick up the change\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n }\n\n function processAllInputs(utmParams: UTMParams): void {\n const inputs = document.querySelectorAll(config.inputSelector);\n inputs.forEach((el) => processInput(el, utmParams));\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // MutationObserver (handles dynamic content)\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function observeNewContent(utmParams: UTMParams): void {\n const allSelectors = [\n ...config.linkSelectors,\n config.inputSelector,\n ].join(\", \");\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingNodes: Element[] = [];\n\n function flushPending(): void {\n const nodes = pendingNodes.slice();\n pendingNodes = [];\n debounceTimer = null;\n\n nodes.forEach((element) => {\n if (element.matches && element.matches(config.inputSelector)) {\n processInput(element, utmParams);\n } else if (\n element.matches &&\n element.matches(config.linkSelectors.join(\", \"))\n ) {\n processLink(element, utmParams);\n }\n\n // Also check children\n element\n .querySelectorAll?.(allSelectors)\n .forEach((child) => {\n if (child.matches(config.inputSelector)) {\n processInput(child, utmParams);\n } else {\n processLink(child, utmParams);\n }\n });\n });\n }\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n pendingNodes.push(node as Element);\n }\n });\n });\n\n // Debounce to batch rapid DOM changes\n if (pendingNodes.length > 0 && !debounceTimer) {\n debounceTimer = setTimeout(flushPending, 50);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Init\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function init(): void {\n const utmParams = getUTMParams();\n\n if (Object.keys(utmParams).length === 0) return;\n\n const run = (): void => {\n processAllLinks(utmParams);\n processAllInputs(utmParams);\n observeNewContent(utmParams);\n console.log(\"UTM: Propagated params:\", utmParams);\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", run);\n } else {\n run();\n }\n }\n\n init();\n})();"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rtstic.dev/pulse",
3
- "version": "0.0.62",
3
+ "version": "0.0.65",
4
4
  "description": "pulse website",
5
5
  "license": "license-of-your-project",
6
6
  "keywords": [],