@metagptx/vite-plugin-source-locator
Version:
A Vite plugin for source code location tracking
7 lines (6 loc) • 4.95 kB
JavaScript
/*!
* @metagptx/vite-plugin-source-locator v0.0.19
* (c) 2026 caowenyue@fuzhi.ai
*/
import t from"path";import*as e from"@babel/parser";import a from"@babel/traverse";import s from"@babel/generator";import*as o from"@babel/types";import{f as r,e as n,a as c,b as i,g as l,s as p,c as u,H as f,E as m,i as d}from"./utils-Byr4NCI7.mjs";import g from"magic-string";import{parse as A}from"@vue/compiler-sfc";import{parse as b,NodeTypes as $}from"@vue/compiler-dom";import h from"node:crypto";import"util";function v(t){let e,a=t[0],s=1;for(;s<t.length;){const o=t[s],r=t[s+1];if(s+=2,("optionalAccess"===o||"optionalCall"===o)&&null==a)return;"access"===o||"optionalAccess"===o?(e=a,a=r(a)):"call"!==o&&"optionalCall"!==o||(a=r((...t)=>a.call(e,...t)),e=void 0)}return a}const T=a.default||a,x=s.default||s;function y(t){let e,a=t[0],s=1;for(;s<t.length;){const o=t[s],r=t[s+1];if(s+=2,("optionalAccess"===o||"optionalCall"===o)&&null==a)return;"access"===o||"optionalAccess"===o?(e=a,a=r(a)):"call"!==o&&"optionalCall"!==o||(a=r((...t)=>a.call(e,...t)),e=void 0)}return a}const j={vue:["vue"],jsx:["jsx","tsx","js","ts"]},E={vue:(e,a,s,o)=>{const n=r(process.cwd()),c=t.relative(n,a),{descriptor:i}=A(e,{filename:a,sourceMap:!0}),{template:l}=i;if(!l)return{code:e,map:null};const p=l.loc.start.offset,u=new g(e),d=b(l.content,{comments:!1,isNativeTag:t=>!0}),h=(t,e=[])=>{if(t.type===$.ELEMENT){if(t.props.some(t=>t.type===$.ATTRIBUTE&&(t.name===`data-${s}-path`||t.name===`data-${s}-line`)))return;if("template"===t.tag)return;if(((t,e=[])=>"svg"!==y([t,"optionalAccess",t=>t.tag,"optionalAccess",t=>t.toLowerCase,"call",t=>t()])&&e.some(t=>"svg"===y([t,"optionalAccess",t=>t.tag,"optionalAccess",t=>t.toLowerCase,"call",t=>t()])))(t,e))return;let a=!0;if(y([o,"optionalAccess",t=>t.filterTag])?Array.isArray(o.filterTag)?a=o.filterTag.includes(t.tag):"function"==typeof o.filterTag&&(a=o.filterTag(t.tag)):a=f.includes(t.tag),!a)return;const r=p+t.loc.start.offset+t.tag.length+1,n=l.loc.start.line+t.loc.start.line-1,i=t.loc.start.column-1;let d=[];if(y([o,"optionalAccess",t=>t.attributes])){const e=o.attributes({relativePath:c,line:n,column:i,tag:t.tag});d=Object.entries(e).map(([t,e])=>` ${t}="${e}" `)}else{let e="";if(m.includes(y([t,"optionalAccess",t=>t.tag,"optionalAccess",t=>t.toLowerCase,"call",t=>t()]))&&t.children){t.children.some(t=>t.type===$.INTERPOLATION||t.type===$.COMPOUND_EXPRESSION)||(e=t.children.filter(t=>t.type===$.TEXT).map(t=>t.content).join(""))}d=[` data-${s}-path="${c}" `,` data-${s}-line="${n}" `,` data-${s}-start-column="${i}" `,` data-${s}-tag="${t.tag}" `,` data-${s}-component="${encodeURIComponent(y([l,"access",t=>t.content,"access",t=>t.split,"call",t=>t("\n"),"access",t=>t[n-1],"optionalAccess",t=>t.trim,"call",t=>t()])||"")}" `,` data-${s}-id="${c}:${n}:${i}" `,` data-${s}-text="${encodeURIComponent(e)}" `]}f.includes(t.tag)&&u.appendLeft(r,d.join(" "))}t.children&&t.children.forEach(a=>{a.type===$.ELEMENT&&h(a,[...e,t])})};return h(d),{code:u.toString(),map:u.generateMap({hires:!0})}},jsx:(a,s,f,m)=>{const d=e.parse(a,{sourceType:"module",plugins:["jsx","typescript","classProperties","decorators-legacy"]}),g=r(process.cwd()),A=t.relative(g,s);T(d,{JSXOpeningElement(t){const e=v([t,"access",t=>t.node,"access",t=>t.loc,"optionalAccess",t=>t.start,"access",t=>t.line]),s=v([t,"access",t=>t.node,"access",t=>t.loc,"optionalAccess",t=>t.start,"access",t=>t.column]);if(!e||void 0===s)return;if(n(t,f))return;if(c(t))return;if(i(t))return;const r=l(t.node.name);if(!p(r,v([m,"optionalAccess",t=>t.filterTag])))return;const d=u({code:a,path:t,prefix:f,relativePath:A,attributes:v([m,"optionalAccess",t=>t.attributes])});if(!d)return;const g=t.node.attributes.findIndex(t=>o.isJSXSpreadAttribute(t)),b=Object.entries(d.attrs).map(([t,e])=>o.jsxAttribute(o.jsxIdentifier(t),o.stringLiteral(e)));-1===g?t.node.attributes.push(...b):t.node.attributes.splice(g,0,...b)}});const b=x(d,{},a);return{code:b.code,map:b.map}}},C="locator",O=["src/**/*.{vue,jsx,tsx,js,ts}"],w=new Map;function I(e={}){const{include:a=O,exclude:s=[],prefix:o=C,enable:r=!0,attributes:n,filterTag:c}=e;return{name:"@metagptx/vite-plugin-source-locator",enforce:"pre",apply:"serve",version:"0.0.19",async transform(e,i){if(!r)return;const l=t.relative(process.cwd(),i);if(!d(l,a,s))return;const p=function(t){return h.createHash("md5").update(t).digest("hex")}(e),u=`${i}:${p}`;if(w.has(u)){return w.get(u)}const f=Object.keys(E).find(t=>j[t].some(t=>i.endsWith(`.${t}`)));if(!f)return;const m=function(t){let e,a=t[0],s=1;for(;s<t.length;){const o=t[s],r=t[s+1];if(s+=2,("optionalAccess"===o||"optionalCall"===o)&&null==a)return;"access"===o||"optionalAccess"===o?(e=a,a=r(a)):"call"!==o&&"optionalCall"!==o||(a=r((...t)=>a.call(e,...t)),e=void 0)}return a}([E,"access",t=>t[f],"optionalCall",t=>t(e,i,o,{attributes:n,filterTag:c})]);return w.set(u,m),m}}}export{I as viteSourceLocator};
//# sourceMappingURL=vite.mjs.map