ctc-track-plugin
Version:
uniapp 小程序埋点劫持
13 lines • 2.52 kB
JavaScript
import{parse as A}from"vue/compiler-sfc";var w=e=>e.props.find(n=>{var r;return n.type===7&&n.name==="on"&&((r=n.arg)==null?void 0:r.content)==="click"}),N=e=>{var r;return((r=e.children.find(p=>p.type===2))==null?void 0:r.content)??""},F=/^\s*[a-zA-Z_$][\w$]*\s*\([^)]*\)\s*$|^\s*[a-zA-Z_$][\w$]*\s*$/,M=e=>F.test(e)&&!/\([^)]*\)/.test(e)?`${e}()`:e,T=(e,n,r,p)=>{var f;let a=((f=n.exp)==null?void 0:f.content)||"",$=M(a),m=`@click.stop="${r};${$}"`,l=e.loc.source.replace(n.loc.source,m).trim();p.push({source:e.loc.source,replaceSource:l})},_=()=>({name:"inject-click-handler",transform(e,n){var r,p;try{if(!/.vue$/.test(n))return null;let a=A(e);if(!a||!((p=(r=a.descriptor)==null?void 0:r.template)!=null&&p.content))return null;let{content:$}=a.descriptor.template,m=$,l=[],f=t=>{var g,y,d,k,E,C,S;if((g=t==null?void 0:t.props)!=null&&g.length){let i=t.props.find(c=>{var o;return c.type===6&&c.name==="data-manual-track"||c.type===7&&c.name==="bind"&&((o=c.arg)==null?void 0:o.content)==="data-manual-track"});if(i){let c=t.tag,o=i.type===6?`'${((y=i.value)==null?void 0:y.content)||""}'`:i.type===7&&((d=i.exp)==null?void 0:d.content)||"",x=w(t),u="",v=N(t);if(x){let s=`sendMd({
content:${o},
tag:'${c}',
text:'${v}'
})`;T(t,x,s,l)}else{u=`@click.stop="sendMd({
content:${o},
tag:${c},
text:'${v}'
})"`;let s=t.loc.source.lastIndexOf(">"),R=t.loc.source[s-1]==="/",h;R?h=t.loc.source.slice(0,s-1).trim()+` ${u} />`:h=t.loc.source.slice(0,s).trim()+` ${u}>`,l.push({source:t.loc.source,replaceSource:h})}}else{let c=t.tag;if(c==="navigator"&&t.type===1){let u=((E=(k=t.props.find(s=>s.name==="url"))==null?void 0:k.value)==null?void 0:E.content)??((S=(C=t.props.find(s=>s.rawName===":url"))==null?void 0:C.exp)==null?void 0:S.content),v=t.loc.source.replace(/<navigator([^>]*)>/,`<navigator$1 @click.stop="sendPageMd('${u}',{},'${c}')">`).trim();l.push({source:t.loc.source,replaceSource:v})}let o=w(t),x=N(t);if(o){let u=`sendMd({
tag: '${c}',
text:'${x}'
})`;T(t,o,u,l)}}}t.children&&t.children.forEach(i=>f(i))};return f(a.descriptor.template.ast),l.sort((t,g)=>g.source.length-t.source.length).forEach(({source:t,replaceSource:g})=>{m=m.replace(t,g)}),{code:e.replace($,m),map:null}}catch(a){return console.error(`\u57CB\u70B9\u6CE8\u5165\u5931\u8D25: ${a}`),null}}});export{_ as default};
//# sourceMappingURL=inject-click-handler.js.map