UNPKG

launch-ide

Version:

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

444 lines (443 loc) 14.8 kB
var N = Object.defineProperty, R = Object.defineProperties; var k = Object.getOwnPropertyDescriptors; var P = Object.getOwnPropertySymbols; var W = Object.prototype.hasOwnProperty, F = Object.prototype.propertyIsEnumerable; var D = (t, e, o) => e in t ? N(t, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : t[e] = o, w = (t, e) => { for (var o in e || (e = {})) W.call(e, o) && D(t, o, e[o]); if (P) for (var o of P(e)) F.call(e, o) && D(t, o, e[o]); return t; }, _ = (t, e) => R(t, k(e)); import y from "fs"; import b from "path"; import g from "child_process"; import H from "os"; import u from "chalk"; import B from "dotenv"; const $ = { "/Cursor.app/Contents/MacOS/Cursor": "/Cursor.app/Contents/MacOS/Cursor", "/Windsurf.app/Contents/MacOS/Electron": "/Windsurf.app/Contents/MacOS/Electron", "/Visual Studio Code.app/Contents/MacOS/Electron": "/Visual Studio Code.app/Contents/MacOS/Electron", "/Trae.app/Contents/MacOS/Electron": "/Trae.app/Contents/MacOS/Electron", "/Trae CN.app/Contents/MacOS/Electron": "/Trae CN.app/Contents/MacOS/Electron", "/Visual Studio Code - Insiders.app/Contents/MacOS/Electron": "/Visual Studio Code - Insiders.app/Contents/MacOS/Electron", "/VSCodium.app/Contents/MacOS/Electron": "/VSCodium.app/Contents/MacOS/Electron", "/WebStorm.app/Contents/MacOS/webstorm": "/WebStorm.app/Contents/MacOS/webstorm", "/HBuilderX.app/Contents/MacOS/HBuilderX": "/HBuilderX.app/Contents/MacOS/HBuilderX", "/Atom.app/Contents/MacOS/Atom": "atom", "/Atom Beta.app/Contents/MacOS/Atom Beta": "/Atom Beta.app/Contents/MacOS/Atom Beta", "/Brackets.app/Contents/MacOS/Brackets": "brackets", "/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", "/PhpStorm.app/Contents/MacOS/phpstorm": "/PhpStorm.app/Contents/MacOS/phpstorm", "/PyCharm.app/Contents/MacOS/pycharm": "/PyCharm.app/Contents/MacOS/pycharm", "/PyCharm CE.app/Contents/MacOS/pycharm": "/PyCharm CE.app/Contents/MacOS/pycharm", "/IntelliJ IDEA.app/Contents/MacOS/idea": "/IntelliJ IDEA.app/Contents/MacOS/idea", "/IntelliJ IDEA Ultimate.app/Contents/MacOS/idea": "/IntelliJ IDEA Ultimate.app/Contents/MacOS/idea", "/IntelliJ IDEA Community Edition.app/Contents/MacOS/idea": "/IntelliJ IDEA Community Edition.app/Contents/MacOS/idea", "/Zed.app/Contents/MacOS/zed": "zed", "/GoLand.app/Contents/MacOS/goland": "/GoLand.app/Contents/MacOS/goland", "/AppCode.app/Contents/MacOS/appcode": "/AppCode.app/Contents/MacOS/appcode", "/CLion.app/Contents/MacOS/clion": "/CLion.app/Contents/MacOS/clion", "/RubyMine.app/Contents/MacOS/rubymine": "/RubyMine.app/Contents/MacOS/rubymine", "/MacVim.app/Contents/MacOS/MacVim": "mvim", "/Rider.app/Contents/MacOS/rider": "/Rider.app/Contents/MacOS/rider" }, L = { code: ["/Visual Studio Code.app/Contents/MacOS/Electron"], "code-insiders": ["/Visual Studio Code - Insiders.app/Contents/MacOS/Electron"], webstorm: ["/WebStorm.app/Contents/MacOS/webstorm"], cursor: ["/Cursor.app/Contents/MacOS/Cursor"], windsurf: ["/Windsurf.app/Contents/MacOS/Electron"], trae: ["/Trae.app/Contents/MacOS/Electron", "/Trae CN.app/Contents/MacOS/Electron"], atom: ["/Atom.app/Contents/MacOS/Atom"], 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"] }, V = { cursor: "cursor", windsurf: "windsurf", code: "code", vscodium: "vscodium", codium: "codium", webstorm: "webstorm", "webstorm.sh": "webstorm", hbuilderx: "hbuilderx", "hbuilderx.sh": "hbuilderx", atom: "atom", Brackets: "brackets", "code-insiders": "code-insiders", emacs: "emacs", gvim: "gvim", idea: "idea", "idea.sh": "idea", phpstorm: "phpstorm", "phpstorm.sh": "phpstorm", pycharm: "pycharm", "pycharm.sh": "pycharm", rubymine: "rubymine", "rubymine.sh": "rubymine", sublime_text: "subl", vim: "vim", goland: "goland", "goland.sh": "goland", rider: "rider", "rider.sh": "rider" }, X = { code: ["code"], "code-insiders": ["code-insiders"], webstorm: ["webstorm", "webstorm.sh"], cursor: ["cursor"], windsurf: ["windsurf"], 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"] }, J = { "Cursor.exe": "", "Windsurf.exe": "", "Trae.exe": "", "Trae CN.exe": "", "Code.exe": "", "Code - Insiders.exe": "", "VSCodium.exe": "", "webstorm.exe": "", "webstorm64.exe": "", "HBuilderX.exe": "", "HBuilderX64.exe": "", "HBuilder.exe": "", "HBuilder64.exe": "", "Brackets.exe": "", "atom.exe": "", "sublime_text.exe": "", "notepad++.exe": "", "clion.exe": "", "clion64.exe": "", "idea.exe": "", "idea64.exe": "", "phpstorm.exe": "", "phpstorm64.exe": "", "pycharm.exe": "", "pycharm64.exe": "", "rubymine.exe": "", "rubymine64.exe": "", "goland.exe": "", "goland64.exe": "", "rider.exe": "", "rider64.exe": "" }, z = { code: ["Code.exe"], "code-insiders": ["Code - Insiders.exe"], webstorm: ["webstorm.exe", "webstorm64.exe"], cursor: ["Cursor.exe"], windsurf: ["Windsurf.exe"], trae: ["Trae.exe", "Trae CN.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"] }, j = { darwin: $, linux: V, win32: J }, I = { darwin: L, linux: X, win32: z }, m = "{file}", d = "{line}", x = "{column}"; function U(t, e, o, n) { let r = "".concat(t, ":").concat(e, ":").concat(o); if (typeof n == "string") r = n.replace(m, t).replace(d, e.toString()).replace(x, o.toString()); else if (n instanceof Array) return n.map((s) => s.replace(m, t).replace(d, e.toString()).replace(x, o.toString())); return [r]; } function G(t) { const { processName: e, fileName: o, lineNumber: n, colNumber: r, workspace: s, openWindowParams: O, pathFormat: i } = t, l = { editorBasename: Z(e), openWindowParams: O, workspace: s }, M = Q(l) || "{file}"; return U(o, n, r, i || M); } function Z(t) { let e = b.basename(t).replace(/\.(exe|cmd|bat|sh)$/i, ""); const o = process.platform, n = Object.keys(I[o]); for (let r = 0; r < n.length; r++) if ((I[o][n[r]] || []).some((O) => t.endsWith(O))) { e = n[r]; break; } return e.toLowerCase(); } function Q(t) { const { editorBasename: e, openWindowParams: o, workspace: n } = t; switch (e) { case "atom": case "atom beta": case "subl": case "sublime": case "sublime_text": case "wstorm": case "charm": case "zed": return "".concat(m, ":").concat(d, ":").concat(x); case "notepad++": return ["-n" + d, "-c" + x, m]; case "vim": case "mvim": return ["+call cursor(".concat(d, ", ").concat(x, ")"), m]; case "joe": case "gvim": return ["+" + d, m]; case "emacs": case "emacsclient": return ["+" + d + ":" + x, m]; case "rmate": case "mate": case "mine": return ["--line", d, m]; case "code": case "code-insiders": case "code - insiders": case "codium": case "cursor": case "windsurf": case "trae": case "vscodium": case "hbuilderx": case "hbuilder": return [ ...n ? [n] : [], "-g", ...o ? [o] : [], "".concat(m, ":").concat(d, ":").concat(x) ]; 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 [ ...n ? [n] : [], "--line", d, m ]; } return ""; } const K = { darwin: "ps ax -o comm=", linux: "ps -eo comm --sort=comm", // wmic's performance is better, but window11 not build in win32: 'wmic process where "executablepath is not null" get executablepath' }, q = 'powershell -NoProfile -Command "Get-CimInstance -Query \\"select executablepath from win32_process where executablepath is not null\\" | % { $_.ExecutablePath }"'; function Y(t) { let e = null; if (process.env.CODE_EDITOR) { const n = v(process.env.CODE_EDITOR); if (n) e = n; else return [process.env.CODE_EDITOR]; } const o = b.resolve(process.cwd(), ".env.local"); if (y.existsSync(o) && !e) { const n = y.readFileSync(o, "utf-8"), r = B.parse(n || ""); if (r.CODE_EDITOR) { const s = v(r.CODE_EDITOR); if (s) e = s; else return [r.CODE_EDITOR]; } } if (t && !e) { const n = v(t); n && (e = n); } try { let n; const r = process.platform, s = process.platform === "win32", O = K[r], i = j[r]; ee(s); let p = ""; try { p = g.execSync(O, { encoding: "utf-8" }); } catch (S) { s && (p = g.execSync(q, { encoding: "utf-8" })); } const l = Object.keys(i), M = p.split(s ? "\r\n" : "\n").map((S) => S.trim()); for (let S = 0; S < l.length; S++) { const a = l[S]; let C = "", h = ""; if (s) { const c = M.find( (E) => b.basename(E) === a ); c && (h = b.basename(c), C = c); } else if (r === "darwin") { const c = M.find( (E) => E.endsWith(a) ); if (c) { const E = c.replace(a, ""), T = i[a]; h = a, T.includes("/") ? C = "".concat(E).concat(T) : C = T; } } else p.indexOf(a) !== -1 && (h = a, C = i[a]); if (h && C) { if (e != null && e.includes(h)) return [C]; n || (n = [C]); } } if (n) return n; } catch (n) { } return process.env.VISUAL ? [process.env.VISUAL] : process.env.EDITOR ? [process.env.EDITOR] : [null]; } const v = (t) => { const e = process.platform; return I[e] && I[e][t] || null; }, ee = (t) => { if (t) try { g.execSync("chcp 65001"); } catch (e) { } }; function te(t) { switch (t) { case "vim": case "emacs": case "nano": return !0; } return !1; } function ne() { if (process.env.CODE_INSPECTOR_FORMAT_PATH) try { return JSON.parse(process.env.CODE_INSPECTOR_FORMAT_PATH); } catch (e) { return null; } const t = b.resolve(process.cwd(), ".env.local"); if (y.existsSync(t)) { const e = y.readFileSync(t, "utf-8"), o = B.parse(e || ""); if (o.CODE_INSPECTOR_FORMAT_PATH) try { return JSON.parse(o.CODE_INSPECTOR_FORMAT_PATH); } catch (n) { return null; } } return null; } function A(t, e) { console.log( u.red("Could not open " + b.basename(t) + " in the editor.") ), e && (e[e.length - 1] !== "." && (e += "."), console.log( u.red("The editor process exited with an error: " + e) )), console.log( "To set up the editor integration, add something like " + u.cyan("CODE_EDITOR=code") + " to the " + u.green(".env.local") + " file in your project folder, or add " + u.green('editor: "code"') + " to CodeInspectorPlugin config, and then restart the development server. Learn more: " + u.green("https://goo.gl/MMTaZt") ); } let f = null; function oe(t) { return t === "reuse" ? "-r" : t === "new" ? "-n" : ""; } function me(t) { let { file: e, line: o = 1, column: n = 1, editor: r, method: s, format: O, onError: i } = t; if (!y.existsSync(e)) return; let [p, ...l] = Y(r); const M = ne() || O; if (!p || p.toLowerCase() === "none") { typeof i == "function" ? i(e, "Failed to recognize IDE automatically") : console.log( "Failed to recognize IDE automatically, add something like " + u.cyan("CODE_EDITOR=code") + " to the " + u.green(".env.local") + " file in your project folder, or add " + u.green('editor: "code"') + " to CodeInspectorPlugin config, and then restart the development server. Learn more: " + u.green("https://goo.gl/MMTaZt") ); return; } process.platform === "linux" && e.startsWith("/mnt/") && /Microsoft/i.test(H.release()) && (e = b.relative("", e)); let S = null; if (o ? l = l.concat( G({ processName: p, fileName: e, lineNumber: o, colNumber: n, workspace: S, openWindowParams: oe(s), pathFormat: M }) ) : l.push(e), f && te(p) && f.kill("SIGKILL"), process.platform === "win32") { const a = (c) => c.replace(/([&|<>,;=^])/g, "^$1"), C = (c) => c.includes("^") ? '^"'.concat(c, '^"') : c.includes(" ") ? '"'.concat(c, '"') : c, h = [p, ...l.map(a)].map(C).join(" "); f = g.exec(h, { stdio: "inherit", // @ts-ignore shell: !0, env: _(w({}, process.env), { NODE_OPTIONS: "" }) }); } else f = g.spawn(p, l, { stdio: "inherit", env: _(w({}, process.env), { NODE_OPTIONS: "" }) }); f.on("exit", function(a) { f = null, a && (typeof i == "function" ? i(e, "(code " + a + ")") : A(e, "(code " + a + ")")); }), f.on("error", function(a) { typeof i == "function" ? i(e, a.message) : A(e, a.message); }); } export { U as formatOpenPath, me as launchIDE };