UNPKG

launch-ide

Version:

Automatically recognize the editor by running processes and open the specified file in it.

2 lines (1 loc) 14.5 kB
"use strict";var ee=Object.defineProperty,te=Object.defineProperties;var ne=Object.getOwnPropertyDescriptors;var $=Object.getOwnPropertySymbols;var oe=Object.prototype.hasOwnProperty,re=Object.prototype.propertyIsEnumerable;var L=(t,e,n)=>e in t?ee(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,v=(t,e)=>{for(var n in e||(e={}))oe.call(e,n)&&L(t,n,e[n]);if($)for(var n of $(e))re.call(e,n)&&L(t,n,e[n]);return t},B=(t,e)=>te(t,ne(e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("fs"),c=require("path"),w=require("child_process"),W=require("os"),C=require("chalk"),se=require("dotenv"),V={kiro:["/Kiro.app/Contents/MacOS/Electron","/Kiro.app/Contents/MacOS/Kiro"],cursor:["/Cursor.app/Contents/MacOS/Cursor"],comate:["/Comate.app/Contents/MacOS/Electron","/Comate.app/Contents/MacOS/Comate"],qoder:["/Qoder.app/Contents/MacOS/Electron","/Qoder CN.app/Contents/MacOS/Electron","/Qoder.app/Contents/MacOS/Qoder","/Qoder CN.app/Contents/MacOS/Qoder"],windsurf:["/Windsurf.app/Contents/MacOS/Electron","/Windsurf.app/Contents/MacOS/Windsurf"],devin:["Devin.app/Contents/MacOS/Devin","Devin.app/Contents/MacOS/Electron"],trae:["/Trae.app/Contents/MacOS/Electron","/Trae CN.app/Contents/MacOS/Electron","/Trae.app/Contents/MacOS/Trae","/Trae CN.app/Contents/MacOS/Trae"],codebuddy:["/Applications/CodeBuddy.app/Contents/MacOS/Electron","/Applications/CodeBuddy CN.app/Contents/MacOS/Electron","/Applications/CodeBuddy.app/Contents/MacOS/CodeBuddy","/Applications/CodeBuddy CN.app/Contents/MacOS/CodeBuddy"],antigravity:["/Antigravity.app/Contents/MacOS/Electron","/Antigravity.app/Contents/MacOS/Antigravity"],code:["/Visual Studio Code.app/Contents/MacOS/Electron","/Visual Studio Code.app/Contents/MacOS/Code"],"code-insiders":["/Visual Studio Code - Insiders.app/Contents/MacOS/Electron"],webstorm:["/WebStorm.app/Contents/MacOS/webstorm"],atom:["/Atom.app/Contents/MacOS/Atom","/Atom Beta.app/Contents/MacOS/Atom Beta"],hbuilder:["/HBuilderX.app/Contents/MacOS/HBuilderX"],phpstorm:["/PhpStorm.app/Contents/MacOS/phpstorm"],pycharm:["/PyCharm.app/Contents/MacOS/pycharm"],idea:["/IntelliJ IDEA.app/Contents/MacOS/idea"],codium:["/VSCodium.app/Contents/MacOS/Electron"],goland:["/GoLand.app/Contents/MacOS/goland"],colin:["/CLion.app/Contents/MacOS/clion"],appcode:["/AppCode.app/Contents/MacOS/appcode"],"atom-beta":["/Atom Beta.app/Contents/MacOS/Atom Beta"],brackets:["/Brackets.app/Contents/MacOS/Brackets"],rider:["/Rider.app/Contents/MacOS/rider"],rubymine:["/RubyMine.app/Contents/MacOS/rubymine"],sublime:["/Sublime Text.app/Contents/MacOS/sublime_text"],zed:["/Zed.app/Contents/MacOS/zed","/Zed.app/Contents/MacOS/cli"]},q={};for(let t of Object.values(V))for(let e of t)q[e]=e;const ae=B(v({},q),{"/Sublime Text.app/Contents/MacOS/Sublime Text":"/Sublime Text.app/Contents/SharedSupport/bin/subl","/Sublime Text.app/Contents/MacOS/sublime_text":"/Sublime Text.app/Contents/SharedSupport/bin/subl","/Sublime Text 2.app/Contents/MacOS/Sublime Text 2":"/Sublime Text 2.app/Contents/SharedSupport/bin/subl","/Sublime Text Dev.app/Contents/MacOS/Sublime Text":"/Sublime Text Dev.app/Contents/SharedSupport/bin/subl","/MacVim.app/Contents/MacOS/MacVim":"mvim","/Zed.app/Contents/MacOS/zed":"/Zed.app/Contents/MacOS/cli"}),j={kiro:"kiro",cursor:"cursor",comate:"comate",qoder:"qoder",devin:"devin",windsurf:"windsurf",trae:"trae",codebuddy:"codebuddy",antigravity:"antigravity",code:"vscode",codium:"vscodium",zed:"zed"},H={kiro:["kiro"],antigravity:["antigravity"],webstorm:["webstorm","webstorm.sh"],cursor:["cursor"],devin:["devin"],windsurf:["windsurf"],trae:["trae"],comate:["comate"],qoder:["qoder"],codebuddy:["codebuddy"],code:["code"],"code-insiders":["code-insiders"],atom:["atom"],hbuilder:["hbuilderx","hbuilderx.sh"],phpstorm:["phpstorm","phpstorm.sh"],pycharm:["pycharm","pycharm.sh"],idea:["idea","idea.sh"],codium:["vscodium"],goland:["goland"],brackets:["Brackets"],rider:["rider"],rubymine:["rubymine","rubymine.sh"],sublime:["sublime_text"],vim:["vim"],emacs:["emacs"],zed:["zed"]},Q={};Object.entries(H).forEach(([t,e])=>{for(let n of e)Q[n]=t});const ce=B(v({},Q),{vscodium:"vscodium",codium:"codium",hbuilderx:"hbuilderx","hbuilderx.sh":"hbuilderx",gvim:"gvim",sublime_text:"subl"}),X={kiro:["Kiro.exe"],antigravity:["Antigravity.exe"],webstorm:["webstorm.exe","webstorm64.exe"],cursor:["Cursor.exe"],windsurf:["Windsurf.exe"],devin:["Devin.exe"],trae:["Trae.exe","Trae CN.exe"],comate:["comate.exe"],qoder:["Qoder.exe","Qoder CN.exe"],codebuddy:["CodeBuddy.exe","CodeBuddy CN.exe"],code:["Code.exe"],"code-insiders":["Code - Insiders.exe"],atom:["atom.exe"],hbuilder:["HBuilderX.exe","HBuilder.exe","HBuilderX64.exe","HBuilder64.exe"],phpstorm:["phpstorm.exe","phpstorm64.exe"],pycharm:["pycharm.exe","pycharm64.exe"],idea:["idea.exe","idea64.exe"],codium:["VSCodium.exe"],goland:["goland.exe","goland64.exe"],colin:["clion.exe","clion64.exe"],brackets:["Brackets.exe"],rider:["rider.exe","rider64.exe"],rubymine:["rubymine.exe","rubymine64.exe"],sublime:["sublime_text.exe"],notepad:["notepad++.exe"],zed:["zed.exe"]},J={};for(let t of Object.values(X))for(let e of t)J[e]="";const ie=J,U={darwin:ae,linux:ce,win32:ie},A={darwin:V,linux:H,win32:X},m="{file}",f="{line}",g="{column}";function K(t,e,n,o){let s="".concat(t,":").concat(e,":").concat(n);if(typeof o=="string")s=o.replace(m,t).replace(f,e.toString()).replace(g,n.toString());else if(o instanceof Array)return o.map(r=>r.replace(m,t).replace(f,e.toString()).replace(g,n.toString()));return[s]}const le=["-g","-r","{file}:{line}:{column}"];function de(t){const{editorBasename:e,fileName:n,lineNumber:o,colNumber:s,workspace:r,openWindowParams:a,pathFormat:i}=t,E=pe({editorBasename:e,openWindowParams:a,workspace:r})||le;return K(n,o,s,i||E)}function ue(t){let e=c.basename(t).replace(/\.(exe|cmd|bat|sh)$/i,"");const n=process.platform,o=Object.keys(A[n]);for(let s=0;s<o.length;s++)if((A[n][o[s]]||[]).some(a=>t.toLowerCase().endsWith(a.toLowerCase()))){e=o[s];break}return e.toLowerCase()}function pe(t){const{editorBasename:e,openWindowParams:n,workspace:o}=t;switch(e){case"atom":case"atom beta":case"subl":case"sublime":case"sublime_text":case"wstorm":case"charm":return"".concat(m,":").concat(f,":").concat(g);case"notepad++":return["-n"+f,"-c"+g,m];case"vim":case"mvim":return["+call cursor(".concat(f,", ").concat(g,")"),m];case"joe":case"gvim":return["+"+f,m];case"emacs":case"emacsclient":return["+"+f+":"+g,m];case"rmate":case"mate":case"mine":return["--line",f,m];case"code":case"code-insiders":case"code - insiders":case"codium":case"cursor":case"windsurf":case"devin":case"trae":case"codebuddy":case"antigravity":case"comate":case"qoder":case"vscodium":case"hbuilderx":case"hbuilder":case"kiro":return[...o?[o]:[],"-g",...n?[n]:[],"".concat(m,":").concat(f,":").concat(g)];case"appcode":case"clion":case"clion64":case"idea":case"idea64":case"phpstorm":case"phpstorm64":case"pycharm":case"pycharm64":case"rubymine":case"rubymine64":case"webstorm":case"webstorm64":case"goland":case"goland64":case"rider":case"rider64":return[...o?[o]:[],"--line",f,"--column",g,m];case"zed":return[n==="-n"?"-n":"-a","".concat(m,":").concat(f,":").concat(g)]}return""}function Z(t){let e={};process.env&&(e=v({},process.env));let n="";if(t){const o=c.resolve(t,".env.local");b.existsSync(o)&&(n=o)}if(!n){const o=c.resolve(process.cwd(),".env.local");b.existsSync(o)&&(n=o)}if(n){const o=b.readFileSync(n,"utf-8"),s=se.parse(o||"");e=v(v({},s),e)}return e}function k(t,e){return Z(e)[t]||null}const me={darwin:"ps ax -o comm=",linux:"ps -eo comm --sort=comm",win32:'powershell -NoProfile -Command "Get-CimInstance -Query \\"select executablepath from win32_process where executablepath is not null\\" | % { $_.ExecutablePath }"'};function fe(t,e,n){let o=null;const s=k("CODE_EDITOR",e||"");if(s){const r=F(s);if(r)o=r;else return[s]}if(!o&&t){const r=F(t);r&&(o=r)}if(!o&&n){const r=he();if(r)return[r]}try{let r;const a=process.platform,i=process.platform==="win32",x=me[a],E=U[a];G(i);const N=w.execSync(x,{encoding:"utf-8"}),h=Object.keys(E),y=N.split(i?"\r\n":"\n").map(M=>M.trim());for(let M=0;M<h.length;M++){const l=h[M];let S="",P="";if(i){const u=y.find(I=>c.basename(I).toLowerCase()===l.toLowerCase());u&&(P=c.basename(u),S=Ce(u))}else if(a==="darwin"){const u=y.find(I=>I.toLowerCase().endsWith(l.toLowerCase()));if(u){const I=u.replace(l,""),_=E[l];P=l,_.includes("/")?S="".concat(I).concat(_):S=_}}else N.indexOf(l)!==-1&&(P=l,S=E[l]);if(P&&S){if(o!=null&&o.includes(P))return[S];r||(r=[S])}}if(r)return r}catch(r){}return process.env.VISUAL?[process.env.VISUAL]:process.env.EDITOR?[process.env.EDITOR]:[null]}const F=t=>{const e=process.platform;return A[e]&&A[e][t]||null};function Ce(t){if(c.basename(t).toLowerCase()==="zed.exe"){const e=c.join(c.dirname(t),"bin","zed.exe");if(b.existsSync(e))return e}return t}const G=t=>{if(t)try{w.execSync("chcp 65001")}catch(e){}};function he(){const t=process.platform,e=Object.keys(U[t]);try{return be(process.pid,t,e)}catch(n){return console.log(C.red("Error while getting editor by PID:"),n),null}}function be(t,e,n){let o=0;const s=50,r=0;for(;t&&t!==r&&o<s;){const a=Se(t,e);if(!a)break;const{command:i,parentPid:x}=a;if(ye(i,n))return i;t=x,o++}return null}function Se(t,e){switch(e){case"darwin":case"linux":return Oe(t);case"win32":return ge(t);default:return null}}function Oe(t){try{const n=w.execSync("ps -p ".concat(t," -o ppid=,comm="),{encoding:"utf8"}).trim().split("\n");return n.length?xe(n[0].trim()):null}catch(e){return null}}function ge(t){try{G(!0);const e='powershell -NoProfile -Command "Get-CimInstance -ClassName Win32_Process -Filter "ProcessId='.concat(t,'" | Select-Object ParentProcessId, ExecutablePath | ConvertTo-Csv -NoTypeInformation'),o=w.execSync(e,{encoding:"utf8"}).trim().split("\r\n").filter(a=>a.trim()).slice(1);if(o.length===0)return null;const[s,r]=o[0].split(",");return!r||!s?null:{command:r.slice(1,-1),parentPid:Number(s.slice(1,-1))}}catch(e){return null}}function xe(t){const e=t.match(/^(\d+)\s+(.+)$/);return e?{command:e[2],parentPid:parseInt(e[1])}:null}function ye(t,e){return e.some(n=>t.toLowerCase().endsWith(n.toLowerCase()))}const ve=262,D=new Map,we=new Set(["appcode","clion","clion64","idea","idea64","phpstorm","phpstorm64","pycharm","pycharm64","rubymine","rubymine64","webstorm","webstorm64","goland","goland64","rider","rider64"]);function Ee(t){return we.has(t)}function Me(){try{return w.execSync("git rev-parse --show-toplevel",{encoding:"utf8",stdio:["pipe","pipe","pipe"]}).trim()}catch(t){return""}}function Pe(t,e){if(e){const r=c.resolve(e);if(b.existsSync(r))return r}const n=Me();if(n)return n;const o=[];let s=c.dirname(c.resolve(t));for(;;){o.push(s);const r=c.dirname(s);if(r===s)break;s=r}for(const r of[".idea",".git"]){const a=o.find(i=>b.existsSync(c.join(i,r)));if(a)return a}return c.dirname(c.resolve(t))}function Ie(t){const e=t.includes(c.sep)?[t]:(process.env.PATH||"").split(c.delimiter).filter(Boolean).map(n=>c.join(n,t));for(const n of e)try{if(b.existsSync(n))return b.realpathSync(n)}catch(o){}return null}function Ne(t){const e=c.dirname(t);return[c.resolve(e,"../Resources/product-info.json"),c.resolve(e,"../product-info.json")]}function _e(t){const e=Number.parseInt(t.buildNumber||"",10);if(!Number.isNaN(e))return e>=ve;const n=/^(\d{4})\.(\d+)/.exec(t.version||"");if(!n)return!1;const o=Number(n[1]),s=Number(n[2]);return o>2026||o===2026&&s>=2}function Te(t){const e=D.get(t);if(e!==void 0)return e;const n=Ie(t);if(!n)return D.set(t,!1),!1;for(const o of Ne(n))try{const s=JSON.parse(b.readFileSync(o,"utf8")),r=_e(s);return D.set(t,r),r}catch(s){}return D.set(t,!1),!1}function Be(t){switch(t){case"vim":case"emacs":case"nano":return!0}return!1}function De(t){const e=k("CODE_INSPECTOR_FORMAT_PATH",t);if(e)try{return JSON.parse(e)}catch(n){return null}return null}function Ae(t,e){console.log(C.red("Could not open "+c.basename(t)+" in the editor.")),e&&(e[e.length-1]!=="."&&(e+="."),console.log(C.red("The editor process exited with an error: "+e))),console.log("To set up the editor integration, add something like "+C.cyan("CODE_EDITOR=code")+" to the "+C.green(".env.local")+" file in your project folder, or add "+C.green('editor: "code"')+" to CodeInspectorPlugin config, and then restart the development server. Learn more: "+C.green("https://goo.gl/MMTaZt"))}let O=null;function ke(t){return t==="reuse"?"-r":t==="new"?"-n":""}function z(t,e){const n=B(v({},process.env),{NODE_OPTIONS:""});if(process.platform==="win32"){const o=a=>a.replace(/([&|<>,;=^])/g,"^$1"),s=a=>a.includes("^")?'^"'.concat(a,'^"'):a.includes(" ")?'"'.concat(a,'"'):a,r=[t,...e.map(o)].map(s).join(" ");return w.exec(r,{shell:!0,env:n})}return w.spawn(t,e,{stdio:"ignore",env:n})}function Re(t){let{file:e,line:n=1,column:o=1,editor:s,method:r,format:a,onError:i,rootDir:x,usePid:E,type:N="exec"}=t;if(!b.existsSync(e))return;let[h,...y]=fe(s,x,E);const M=y.filter(d=>d!==null);let l=null;const S=De(x||"")||a;if(!h||h.toLowerCase()==="none"){typeof i=="function"?i(e,"Failed to recognize IDE automatically"):console.log("Failed to recognize IDE automatically, add something like "+C.cyan("CODE_EDITOR=code")+" to the "+C.green(".env.local")+" file in your project folder, or add "+C.green('editor: "code"')+" to CodeInspectorPlugin config, and then restart the development server. Learn more: "+C.green("https://goo.gl/MMTaZt"));return}const P=h,u=ue(h);if((N==="open"||N==="open-bg")&&process.platform==="darwin"&&j[u]){const d="".concat(j[u],"://file").concat(e,":").concat(n,":").concat(o),p=N==="open-bg"?["-g",d]:[d];O=w.spawn("open",p,{stdio:"ignore",env:B(v({},process.env),{NODE_OPTIONS:""})})}else{process.platform==="linux"&&e.startsWith("/mnt/")&&/Microsoft/i.test(W.release())&&(e=c.relative("",e));let p=Te(h)?Pe(e,x):null;p&&process.platform==="linux"&&p.startsWith("/mnt/")&&/Microsoft/i.test(W.release())&&(p=c.relative("",p)),n?(Ee(u)&&(l=M.concat([e,"--line",String(n),"--column",String(o)])),y=y.concat(de({editorBasename:u,fileName:e,lineNumber:n,colNumber:o,workspace:p,openWindowParams:ke(r),pathFormat:S}))):y.push(e),O&&Be(h)&&O.kill("SIGKILL"),O=z(h,y)}const I=d=>{typeof i=="function"?i(e,d):Ae(e,d)},_=d=>{let p=!1;const R=T=>{if(!p){if(p=!0,l){const Y=l;l=null,O=z(P,Y),_(O);return}I(T)}};d.on("exit",function(T){O===d&&(O=null),T?R("(code "+T+")"):p=!0}),d.on("error",function(T){R(T.message)})};_(O)}exports.formatOpenPath=K;exports.getEnvVariable=k;exports.getEnvVariables=Z;exports.launchIDE=Re;