UNPKG

@metagptx/vite-plugin-source-locator

Version:

A Vite plugin for source code location tracking

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