vtjump
Version:
A vite plugin for vtjump
12 lines (11 loc) • 7.73 kB
JavaScript
;const C=require("magic-string"),V=require("child_process"),g=require("@vue/compiler-sfc"),A=new Map;let J=0;function P(o,t){const s=`vtj-${++J}`;return A.set(s,{file:o,startLine:t,endLine:t}),{id:s,line:t}}/**
* @vue/shared v3.5.13
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/process.env.NODE_ENV!=="production"&&Object.freeze({});process.env.NODE_ENV!=="production"&&Object.freeze([]);const T=()=>!1;/**
* @vue/compiler-core v3.5.13
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/Symbol(process.env.NODE_ENV!=="production"?"Fragment":"");Symbol(process.env.NODE_ENV!=="production"?"Teleport":"");Symbol(process.env.NODE_ENV!=="production"?"Suspense":"");Symbol(process.env.NODE_ENV!=="production"?"KeepAlive":"");Symbol(process.env.NODE_ENV!=="production"?"BaseTransition":"");Symbol(process.env.NODE_ENV!=="production"?"openBlock":"");Symbol(process.env.NODE_ENV!=="production"?"createBlock":"");Symbol(process.env.NODE_ENV!=="production"?"createElementBlock":"");Symbol(process.env.NODE_ENV!=="production"?"createVNode":"");Symbol(process.env.NODE_ENV!=="production"?"createElementVNode":"");Symbol(process.env.NODE_ENV!=="production"?"createCommentVNode":"");Symbol(process.env.NODE_ENV!=="production"?"createTextVNode":"");Symbol(process.env.NODE_ENV!=="production"?"createStaticVNode":"");Symbol(process.env.NODE_ENV!=="production"?"resolveComponent":"");Symbol(process.env.NODE_ENV!=="production"?"resolveDynamicComponent":"");Symbol(process.env.NODE_ENV!=="production"?"resolveDirective":"");Symbol(process.env.NODE_ENV!=="production"?"resolveFilter":"");Symbol(process.env.NODE_ENV!=="production"?"withDirectives":"");Symbol(process.env.NODE_ENV!=="production"?"renderList":"");Symbol(process.env.NODE_ENV!=="production"?"renderSlot":"");Symbol(process.env.NODE_ENV!=="production"?"createSlots":"");Symbol(process.env.NODE_ENV!=="production"?"toDisplayString":"");Symbol(process.env.NODE_ENV!=="production"?"mergeProps":"");Symbol(process.env.NODE_ENV!=="production"?"normalizeClass":"");Symbol(process.env.NODE_ENV!=="production"?"normalizeStyle":"");Symbol(process.env.NODE_ENV!=="production"?"normalizeProps":"");Symbol(process.env.NODE_ENV!=="production"?"guardReactiveProps":"");Symbol(process.env.NODE_ENV!=="production"?"toHandlers":"");Symbol(process.env.NODE_ENV!=="production"?"camelize":"");Symbol(process.env.NODE_ENV!=="production"?"capitalize":"");Symbol(process.env.NODE_ENV!=="production"?"toHandlerKey":"");Symbol(process.env.NODE_ENV!=="production"?"setBlockTracking":"");Symbol(process.env.NODE_ENV!=="production"?"pushScopeId":"");Symbol(process.env.NODE_ENV!=="production"?"popScopeId":"");Symbol(process.env.NODE_ENV!=="production"?"withCtx":"");Symbol(process.env.NODE_ENV!=="production"?"unref":"");Symbol(process.env.NODE_ENV!=="production"?"isRef":"");Symbol(process.env.NODE_ENV!=="production"?"withMemo":"");Symbol(process.env.NODE_ENV!=="production"?"isMemoSame":"");const R={ROOT:0,0:"ROOT",ELEMENT:1,1:"ELEMENT",TEXT:2,2:"TEXT",COMMENT:3,3:"COMMENT",SIMPLE_EXPRESSION:4,4:"SIMPLE_EXPRESSION",INTERPOLATION:5,5:"INTERPOLATION",ATTRIBUTE:6,6:"ATTRIBUTE",DIRECTIVE:7,7:"DIRECTIVE",COMPOUND_EXPRESSION:8,8:"COMPOUND_EXPRESSION",IF:9,9:"IF",IF_BRANCH:10,10:"IF_BRANCH",FOR:11,11:"FOR",TEXT_CALL:12,12:"TEXT_CALL",VNODE_CALL:13,13:"VNODE_CALL",JS_CALL_EXPRESSION:14,14:"JS_CALL_EXPRESSION",JS_OBJECT_EXPRESSION:15,15:"JS_OBJECT_EXPRESSION",JS_PROPERTY:16,16:"JS_PROPERTY",JS_ARRAY_EXPRESSION:17,17:"JS_ARRAY_EXPRESSION",JS_FUNCTION_EXPRESSION:18,18:"JS_FUNCTION_EXPRESSION",JS_CONDITIONAL_EXPRESSION:19,19:"JS_CONDITIONAL_EXPRESSION",JS_CACHE_EXPRESSION:20,20:"JS_CACHE_EXPRESSION",JS_BLOCK_STATEMENT:21,21:"JS_BLOCK_STATEMENT",JS_TEMPLATE_LITERAL:22,22:"JS_TEMPLATE_LITERAL",JS_IF_STATEMENT:23,23:"JS_IF_STATEMENT",JS_ASSIGNMENT_EXPRESSION:24,24:"JS_ASSIGNMENT_EXPRESSION",JS_SEQUENCE_EXPRESSION:25,25:"JS_SEQUENCE_EXPRESSION",JS_RETURN_STATEMENT:26,26:"JS_RETURN_STATEMENT"};function h(o){throw o}function M(o){process.env.NODE_ENV!=="production"&&console.warn(`[Vue warn] ${o.message}`)}process.env.NODE_ENV;new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b");function w(o){return/\bdata-vtjump(?:=|\s|$)|\bdata-vtjump-line(?:=|\s|$)|\bdata-vtjump-file(?:=|\s|$)/.test(o)}function $(o){let t=!1,s=!1;for(let n=0;n<o.length;n++){const e=o[n];if(e==="'"&&!s)t=!t;else if(e==='"'&&!t)s=!s;else if(e===">"&&!t&&!s)return n}return-1}function j(o,t){if(!t.endsWith(".vue"))return null;const{descriptor:s}=g.parse(o);if(!s.template)return null;const n=new C(o),e=s.template.content,O=s.template.loc.start.offset,S=new Set,l=i=>{if(i.type===R.ELEMENT){const r=i,d=`${r.loc.start.offset}-${r.loc.end.offset}`;if(S.has(d))return;const N=O+r.loc.start.offset,v=O+r.loc.end.offset,_=o.slice(0,N).split(`
`).length,c=o.slice(N,v),p=$(c);if(p!==-1){const E=c.slice(0,p+1),a=/^<([a-zA-Z][\w-]*)(?:\s+([\s\S]*?))?(?:\/)?>/i.exec(E);if(a){const[,,m=""]=a;if(!w(m)){const{id:I,line:f}=P(t,_),L=` data-vtjump="${I}" data-vtjump-line="${f}" data-vtjump-file="${t}"`;let b=N+p;const D=c[p-1];D&&D==="/"&&(b=N+p-1),n.appendLeft(b,L),S.add(d)}}}r.children&&r.children.forEach(E=>{E.type===R.ELEMENT&&l(E)})}},u=g.compileTemplate({source:e,filename:t,id:t,compilerOptions:{nodeTransforms:[l]}});return u.errors&&u.errors.length?(console.error(u.errors),null):n.hasChanged()?{code:n.toString(),map:n.generateMap()}:null}const X=(o={})=>{let t;return{name:"vite:vtjump",configureServer(s){t=s,t.middlewares.use(async(n,e,O)=>{if(n.url==="/__vtjump"){if(e.setHeader("Access-Control-Allow-Origin","*"),e.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),e.setHeader("Access-Control-Allow-Headers","Content-Type"),n.method==="GET"||n.method==="OPTIONS"){e.setHeader("Content-Type","application/json"),e.end("__vtjump");return}const S=[];n.on("data",l=>S.push(l)),n.on("end",()=>{const l=JSON.parse(Buffer.concat(S).toString()),{getConfig:u}=l;let{protocols:i,jumpEndpoints:r}=o;if(i||(i=["cursor","cursor"]),i.length===1&&(i=[i[0],i[0]]),r||(r=["vite","vite"]),r.length===1&&(r=[r[0],r[0]]),u){e.setHeader("Content-Type","application/json"),e.end(JSON.stringify({protocols:i,jumpEndpoints:r,workingDir:process.cwd(),assets:o.assets||"/node_modules/vtjump/dist/client/vtjump.js"}));return}function d(c,p){const E=i[0]||"cursor";if(r[0]==="browser")e.setHeader("Content-Type","application/json"),e.end(JSON.stringify({url:`${E}://file/${c}`}));else if(r[0]==="vite"){let a="";process.platform==="win32"?a=`start ${`${E}://file/${c}:${p}`}`:E==="vscode"?a=`code -g "${c}:${p}"`:a=`${E} -g "${c}:${p}"`,V.exec(a,m=>{if(m){console.warn("Failed to open URL with system command:",m);const I=process.platform==="win32"?`${E} "${c}:${p}"`:`${E} "${c}"`;V.exec(I,f=>{f?(console.error("Failed to open with protocol command:",f),e.statusCode=500,e.end(JSON.stringify({error:"Failed to open file"}))):e.end(JSON.stringify({success:!0}))})}else e.end(JSON.stringify({success:!0}))})}}const{id:N,getInfo:v,path:y,line:_}=l;if(N){const c=A.get(N);if(!c){e.statusCode=404,e.end(JSON.stringify({error:"Location not found"}));return}v?(e.setHeader("Content-Type","application/json"),e.end(JSON.stringify({location:c}))):d(c.file,c.startLine.toString())}else y&&_&&d(y,_)});return}O()})},transform(s,n){return j(s,n)}}},B=(o={})=>{const t=X(o);return t.transformIndexHtml=s=>{const n=new C(s),e=s.match(/<\/body>/i);return e&&n.appendLeft(e.index,`<script type="module" src="${o.assets}"><\/script>
</body>`),{html:n.toString(),tags:[]}},t};module.exports=B;