yanki 2.0.15 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:process";import{fileURLToPath as n}from"node:url";import r,{execFile as i}from"node:child_process";import a,{constants as o}from"node:fs/promises";import{promisify as s}from"node:util";import c from"node:os";import l from"node:fs";import{Buffer as u}from"node:buffer";let d;function f(){try{return l.statSync(`/.dockerenv`),!0}catch{return!1}}function p(){try{return l.readFileSync(`/proc/self/cgroup`,`utf8`).includes(`docker`)}catch{return!1}}function ee(){return d===void 0&&(d=f()||p()),d}let m;const te=()=>{try{return l.statSync(`/run/.containerenv`),!0}catch{return!1}};function h(){return m===void 0&&(m=te()||ee()),m}const g=()=>{if(t.platform!==`linux`)return!1;if(c.release().toLowerCase().includes(`microsoft`))return!h();try{if(l.readFileSync(`/proc/version`,`utf8`).toLowerCase().includes(`microsoft`))return!h()}catch{}return l.existsSync(`/proc/sys/fs/binfmt_misc/WSLInterop`)||l.existsSync(`/run/WSL`)?!h():!1};var _=t.env.__IS_WSL_TEST__?g:g();const v=s(r.execFile),y=()=>`${t.env.SYSTEMROOT||t.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,b=async(e,t={})=>{let{powerShellPath:n,...r}=t,i=b.encodeCommand(e);return v(n??y(),[...b.argumentsPrefix,i],{encoding:`utf8`,...r})};b.argumentsPrefix=[`-NoProfile`,`-NonInteractive`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`],b.encodeCommand=e=>u.from(e,`utf16le`).toString(`base64`),b.escapeArgument=e=>`'${String(e).replaceAll(`'`,`''`)}'`;function ne(e){for(let t of e.split(`
2
+ `)){if(/^\s*#/.test(t))continue;let e=/^\s*root\s*=\s*(?<mountPoint>"[^"]*"|'[^']*'|[^#]*)/.exec(t);if(e)return e.groups.mountPoint.trim().replaceAll(/^["']|["']$/g,``)}}const re=s(r.execFile),ie=(()=>{let e=`/mnt/`,t;return async function(){if(t)return t;let n=`/etc/wsl.conf`,r=!1;try{await a.access(n,o.F_OK),r=!0}catch{}if(!r)return e;let i=ne(await a.readFile(n,{encoding:`utf8`}));return i===void 0?e:(t=i,t=t.endsWith(`/`)?t:`${t}/`,t)}})(),x=_?async()=>`${await ie()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`:y;let S;const ae=async()=>(S??=(async()=>{try{let e=await x();return await a.access(e,o.X_OK),!0}catch{return!1}})(),S),C=async()=>{let t=await x(),n=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,{stdout:r}=await b(n,{powerShellPath:t,cwd:e.dirname(t)});return r.trim()},w=e=>/^[a-z]+:\/\//i.test(e),T=async e=>{let t=Array.isArray(e),n=t?e:[e],r=[],i=[];for(let[e,t]of n.entries())w(t)||(r.push(e),i.push(t));let a=[...n];if(i.length>0)try{let{stdout:e}=await re(`wslpath`,[`-aw`,...i],{encoding:`utf8`}),t=e.split(/\r?\n/).filter(Boolean);for(let[e,i]of r.entries())a[i]=t[e]??n[i]}catch{}return t?a:a[0]},oe=s(r.execFile),se=()=>`${t.env.SYSTEMROOT||t.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,E=[`-NoProfile`,`-NonInteractive`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`],D=e=>u.from(e,`utf16le`).toString(`base64`),ce=e=>`'${String(e).replaceAll(/['‘’‚‛]/g,e=>e+e)}'`,O=e=>[...E,D(e)],le=e=>({encoding:`utf8`,...e,shell:!1}),k=async(e,t={})=>{let{powerShellPath:n,...r}=t;return oe(n??se(),O(e),le(r))};k.argumentsPrefix=E,k.encodeCommand=D,k.escapeArgument=ce,k.createArguments=O;function A(e,t,n){let r=n=>Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0});return Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get(){let e=n();return r(e),e},set(e){r(e)}}),e}const j=s(i);async function M(){if(t.platform!==`darwin`)throw Error(`macOS only`);let{stdout:e}=await j(`defaults`,[`read`,`com.apple.LaunchServices/com.apple.launchservices.secure`,`LSHandlers`]),n=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(e)?.groups.id??`com.apple.Safari`;return n===`com.apple.safari`?`com.apple.Safari`:n}const N=s(i);async function P(e,{humanReadableOutput:n=!0,signal:r}={}){if(t.platform!==`darwin`)throw Error(`macOS only`);let i=n?[]:[`-ss`],a={};r&&(a.signal=r);let{stdout:o}=await N(`osascript`,[`-e`,e,i],a);return o.trim()}async function F(e){return P(`tell application "Finder" to set app_path to application file id "${e}" as string\ntell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}const I=s(i),L={MSEdgeHTM:{name:`Edge`,id:`com.microsoft.edge`},MSEdgeBHTML:{name:`Edge Beta`,id:`com.microsoft.edge.beta`},MSEdgeDHTML:{name:`Edge Dev`,id:`com.microsoft.edge.dev`},AppXq0fevzme2pys62n3e0fbqa7peapykr8v:{name:`Edge`,id:`com.microsoft.edge.old`},ChromeHTML:{name:`Chrome`,id:`com.google.chrome`},ChromeBHTML:{name:`Chrome Beta`,id:`com.google.chrome.beta`},ChromeDHTML:{name:`Chrome Dev`,id:`com.google.chrome.dev`},ChromiumHTM:{name:`Chromium`,id:`org.chromium.Chromium`},BraveHTML:{name:`Brave`,id:`com.brave.Browser`},BraveBHTML:{name:`Brave Beta`,id:`com.brave.Browser.beta`},BraveDHTML:{name:`Brave Dev`,id:`com.brave.Browser.dev`},BraveSSHTM:{name:`Brave Nightly`,id:`com.brave.Browser.nightly`},FirefoxURL:{name:`Firefox`,id:`org.mozilla.firefox`},OperaStable:{name:`Opera`,id:`com.operasoftware.Opera`},VivaldiHTM:{name:`Vivaldi`,id:`com.vivaldi.Vivaldi`},"IE.HTTP":{name:`Internet Explorer`,id:`com.microsoft.ie`}},R=new Map(Object.entries(L));var z=class extends Error{};async function B(e=I){let{stdout:n}=await e(`${t.env.SYSTEMROOT??t.env.windir??`C:\\Windows`}\\System32\\reg.exe`,[`QUERY`,` HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice`,`/v`,`ProgId`]),r=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(n);if(!r)throw new z(`Cannot find Windows browser in stdout: ${JSON.stringify(n)}`);let{id:i}=r.groups,a=i.lastIndexOf(`.`),o=i.lastIndexOf(`-`),s=a===-1?void 0:i.slice(0,a),c=o===-1?void 0:i.slice(0,o);return L[i]??L[s]??L[c]??{name:i,id:i}}const V=s(i),H=e=>e.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,e=>e.toUpperCase());async function U(){if(t.platform===`darwin`){let e=await M();return{name:await F(e),id:e}}if(t.platform===`linux`){let{stdout:e}=await V(`xdg-mime`,[`query`,`default`,`x-scheme-handler/http`]),t=e.trim();return{name:H(t.replace(/.desktop$/,``).replace(`-`,` `)),id:t}}if(t.platform===`win32`)return B();throw Error(`Only macOS, Linux, and Windows are supported`)}const ue=!!(t.env.SSH_CONNECTION||t.env.SSH_CLIENT||t.env.SSH_TTY),W=Symbol(`fallbackAttempt`),G=import.meta.url?e.dirname(n(import.meta.url)):``,K=e.join(G,`xdg-open`),{platform:q,arch:J}=t,Y=async(e,t)=>{if(e.length===0)return;let n=[];for(let r of e)try{return await t(r)}catch(e){n.push(e)}throw AggregateError(n,`Failed to open in all supported apps`)},X=async n=>{n={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...n};let i=n[W]===!0;if(delete n[W],Array.isArray(n.app))return Y(n.app,e=>X({...n,app:e,[W]:!0}));let{name:s,arguments:c=[]}=n.app??{};if(c=[...c],Array.isArray(s))return Y(s,e=>X({...n,app:{name:e,arguments:c},[W]:!0}));if(s===`browser`||s===`browserPrivate`){let e={"com.google.chrome":`chrome`,"google-chrome.desktop":`chrome`,"com.brave.browser":`brave`,"org.mozilla.firefox":`firefox`,"firefox.desktop":`firefox`,"com.microsoft.msedge":`edge`,"com.microsoft.edge":`edge`,"com.microsoft.edgemac":`edge`,"microsoft-edge.desktop":`edge`,"com.apple.safari":`safari`},t={chrome:`--incognito`,brave:`--incognito`,firefox:`--private-window`,edge:`--inPrivate`},r;if(_){let e=await C();r=R.get(e)??{}}else r=await U();if(Object.hasOwn(e,r.id)){let i=e[r.id.toLowerCase()];if(i===void 0)throw Error(`${r.name} is not supported as a default browser`);if(s===`browserPrivate`){if(i===`safari`)throw Error(`Safari doesn't support opening in private mode via command line`);c.push(t[i])}return X({...n,app:{name:$[i],arguments:c}})}throw Error(`${r.name} is not supported as a default browser`)}let l,u=[],d={},f=!1;if(_&&!h()&&!ue&&!s&&(f=await ae()),q===`darwin`)l=`open`,n.wait&&u.push(`--wait-apps`),n.background&&u.push(`--background`),n.newInstance&&u.push(`--new`),s&&u.push(`-a`,s);else if(q===`win32`||f){l=await x(),u.push(...k.argumentsPrefix),_||(d.windowsVerbatimArguments=!0),_&&n.target&&(n.target=await T(n.target));let t=[`$ProgressPreference = 'SilentlyContinue';`,`Start`];n.wait&&t.push(`-Wait`),s?(t.push(k.escapeArgument(s)),n.target&&c.push(n.target)):n.target&&t.push(k.escapeArgument(n.target)),c.length>0&&(c=c.map(e=>k.escapeArgument(e)),t.push(`-ArgumentList`,c.join(`,`))),n.target=k.encodeCommand(t.join(` `)),n.wait||(d.stdio=`ignore`),_&&(d.cwd=e.dirname(l))}else{if(s)l=s;else{let e=!G||G===`/`,n=!1;try{await a.access(K,o.X_OK),n=!0}catch{}l=t.versions.electron??(q===`android`||e||!n)?`xdg-open`:K}c.length>0&&u.push(...c),n.wait||(d.stdio=`ignore`,d.detached=!0)}q===`darwin`&&c.length>0&&u.push(`--args`,...c),n.target&&u.push(n.target);let p=r.spawn(l,u,d);return n.wait?new Promise((e,t)=>{p.once(`error`,t),p.once(`close`,r=>{if(!n.allowNonzeroExitCode&&r!==0){t(Error(`Exited with code ${r}`));return}e(p)})}):i||q===`win32`||f?new Promise((e,t)=>{p.once(`error`,t),p.once(`spawn`,()=>{p.once(`close`,n=>{if(p.off(`error`,t),i&&n!==0){t(Error(`Exited with code ${n}`));return}p.unref(),e(p)})})}):(p.unref(),new Promise((e,t)=>{p.once(`error`,t),p.once(`spawn`,()=>{p.off(`error`,t),e(p)})}))},de=(e,t)=>{if(typeof e!=`string`&&!Array.isArray(e))throw TypeError("Expected a valid `name`");let{arguments:n=[]}=t??{};if(n!=null&&!Array.isArray(n))throw TypeError("Expected `appArguments` as Array type");return X({...t,app:{name:e,arguments:n}})};function Z(e){if(typeof e==`string`||Array.isArray(e))return e;let{[J]:t}=e;if(!t)throw Error(`${J} is not supported`);return t}function Q({[q]:e},{wsl:t}={}){if(t&&_)return Z(t);if(!e)throw Error(`${q} is not supported`);return Z(e)}const $={browser:`browser`,browserPrivate:`browserPrivate`};A($,`chrome`,()=>Q({darwin:`google chrome`,win32:`chrome`,linux:[`google-chrome`,`google-chrome-stable`,`chromium`,`chromium-browser`]},{wsl:{ia32:`/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe`,x64:[`/mnt/c/Program Files/Google/Chrome/Application/chrome.exe`,`/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe`]}})),A($,`brave`,()=>Q({darwin:`brave browser`,win32:`brave`,linux:[`brave-browser`,`brave`]},{wsl:{ia32:`/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe`,x64:[`/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe`,`/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe`]}})),A($,`firefox`,()=>Q({darwin:`firefox`,win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:`firefox`},{wsl:`/mnt/c/Program Files/Mozilla Firefox/firefox.exe`})),A($,`edge`,()=>Q({darwin:`microsoft edge`,win32:`msedge`,linux:[`microsoft-edge`,`microsoft-edge-dev`]},{wsl:`/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe`})),A($,`safari`,()=>Q({darwin:`Safari`}));export{de as openApp};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yanki",
3
- "version": "2.0.15",
3
+ "version": "3.0.0",
4
4
  "description": "A CLI tool and TypeScript library to turn Markdown into Anki flashcards.",
5
5
  "keywords": [
6
6
  "anki",
@@ -53,16 +53,16 @@
53
53
  "@shikijs/rehype": "^4.4.3",
54
54
  "@shikijs/themes": "^4.4.3",
55
55
  "@sindresorhus/fnv1a": "^3.1.0",
56
- "@sindresorhus/slugify": "^3.0.0",
56
+ "@sindresorhus/slugify": "^3.0.1",
57
57
  "@stdlib/assert-is-absolute-path": "^0.2.3",
58
58
  "@types/hast": "^3.0.5",
59
59
  "@types/lodash-es": "^4.17.12",
60
60
  "@types/mdast": "^4.0.4",
61
- "@types/node": "~20.19.43",
61
+ "@types/node": "~22.18.13",
62
62
  "@types/unist": "^3.0.3",
63
63
  "@types/yargs": "^17.0.35",
64
64
  "crypto-hash": "^4.0.1",
65
- "deepmerge-ts": "^7.1.6",
65
+ "deepmerge-ts": "^8.0.2",
66
66
  "filenamify": "6.0.0",
67
67
  "globby": "^16.2.4",
68
68
  "hast-util-to-text": "^4.0.2",
@@ -70,11 +70,11 @@
70
70
  "mdast-util-from-markdown": "^2.0.3",
71
71
  "micromark-util-sanitize-uri": "^2.0.1",
72
72
  "micromark-util-types": "^2.0.2",
73
- "nanoid": "^5.1.16",
73
+ "nanoid": "^6.0.1",
74
74
  "path-browserify-esm": "^1.0.6",
75
75
  "picocolors": "^1.1.1",
76
76
  "plur": "^6.0.0",
77
- "pretty-ms": "^9.3.0",
77
+ "pretty-ms": "^9.3.1",
78
78
  "rehype-format": "^5.0.1",
79
79
  "rehype-parse": "^9.0.1",
80
80
  "rehype-raw": "^7.0.0",
@@ -93,34 +93,34 @@
93
93
  "slash": "^5.1.0",
94
94
  "sort-keys": "^6.0.1",
95
95
  "strip-ansi": "^7.2.0",
96
- "type-fest": "^5.8.0",
96
+ "type-fest": "^5.9.0",
97
97
  "uint8array-extras": "^1.5.0",
98
98
  "unified": "^11.0.5",
99
99
  "unist-builder": "^4.0.0",
100
100
  "unist-util-visit": "^5.1.0",
101
101
  "untildify": "^6.0.0",
102
102
  "yaml": "^2.9.0",
103
- "yanki-connect": "^4.0.10",
103
+ "yanki-connect": "^4.0.11",
104
104
  "yargs": "^18.1.0"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@arethetypeswrong/cli": "^0.18.5",
108
- "@kitschpatrol/shared-config": "^8.7.0",
109
- "@vitest/browser-playwright": "^4.1.11",
110
- "@vitest/coverage-v8": "^4.1.11",
111
- "bumpp": "^12.2.1",
108
+ "@kitschpatrol/shared-config": "^8.8.0",
109
+ "@vitest/browser-playwright": "^5.0.0",
110
+ "@vitest/coverage-v8": "^5.0.0",
111
+ "bumpp": "^12.3.0",
112
112
  "execa": "^10.0.1",
113
113
  "mdat-plugin-cli-help": "^3.2.0",
114
- "playwright": "^1.62.1",
114
+ "playwright": "^1.63.0",
115
115
  "publint": "^0.3.24",
116
116
  "shx": "^0.4.0",
117
- "tsdown": "^0.22.14",
118
- "tsx": "^4.23.12",
117
+ "tsdown": "^0.23.0",
118
+ "tsx": "^4.23.13",
119
119
  "typescript": "~6.0.3",
120
- "vitest": "^4.1.11"
120
+ "vitest": "^5.0.0"
121
121
  },
122
122
  "engines": {
123
- "node": "^20.19.0 || >=22.12.0"
123
+ "node": ">=22.18.0"
124
124
  },
125
125
  "devEngines": {
126
126
  "runtime": {
@@ -130,7 +130,7 @@
130
130
  },
131
131
  "scripts": {
132
132
  "build": "tsdown && attw -P --profile esm-only && publint",
133
- "clean": "shx rm -f pnpm-lock.yaml && git clean -fdX -e !.claude/",
133
+ "clean-deep": "shx rm -f pnpm-lock.yaml && git clean -fdX -e !.claude/",
134
134
  "coverage": "vitest run --coverage",
135
135
  "fix": "ksc fix",
136
136
  "lint": "ksc lint",
package/readme.md CHANGED
@@ -58,7 +58,7 @@ The "Y" prefix in "Yanki" is in the "Yet another" naming tradition; a nod to Ank
58
58
 
59
59
  ## Quick start
60
60
 
61
- Install [Node.js](https://nodejs.org) if you haven't already. (Yanki requires Node 20.19 or newer.)
61
+ Install [Node.js](https://nodejs.org) if you haven't already. (Yanki requires Node 22.18 or newer.)
62
62
 
63
63
  Assuming you have a folder of Markdown note files, the [Anki app](https://apps.ankiweb.net) is open and has the [AnkiConnect](https://ankiweb.net/shared/info/2055492159) add-on installed:
64
64
 
@@ -1,2 +0,0 @@
1
- import e from"node:process";import t from"node:fs";import n from"node:path";import{promisify as r}from"node:util";import i,{execFile as a}from"node:child_process";import{fileURLToPath as o}from"node:url";import s,{constants as c}from"node:fs/promises";import l from"node:os";import{Buffer as u}from"node:buffer";let d;function f(){try{return t.statSync(`/.dockerenv`),!0}catch{return!1}}function p(){try{return t.readFileSync(`/proc/self/cgroup`,`utf8`).includes(`docker`)}catch{return!1}}function ee(){return d===void 0&&(d=f()||p()),d}let m;const te=()=>{try{return t.statSync(`/run/.containerenv`),!0}catch{return!1}};function h(){return m===void 0&&(m=te()||ee()),m}const g=()=>{if(e.platform!==`linux`)return!1;if(l.release().toLowerCase().includes(`microsoft`))return!h();try{if(t.readFileSync(`/proc/version`,`utf8`).toLowerCase().includes(`microsoft`))return!h()}catch{}return t.existsSync(`/proc/sys/fs/binfmt_misc/WSLInterop`)||t.existsSync(`/run/WSL`)?!h():!1};var _=e.env.__IS_WSL_TEST__?g:g();const v=r(i.execFile),y=()=>`${e.env.SYSTEMROOT||e.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,b=async(e,t={})=>{let{powerShellPath:n,...r}=t,i=b.encodeCommand(e);return v(n??y(),[...b.argumentsPrefix,i],{encoding:`utf8`,...r})};b.argumentsPrefix=[`-NoProfile`,`-NonInteractive`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`],b.encodeCommand=e=>u.from(e,`utf16le`).toString(`base64`),b.escapeArgument=e=>`'${String(e).replaceAll(`'`,`''`)}'`;function ne(e){for(let t of e.split(`
2
- `)){if(/^\s*#/.test(t))continue;let e=/^\s*root\s*=\s*(?<mountPoint>"[^"]*"|'[^']*'|[^#]*)/.exec(t);if(e)return e.groups.mountPoint.trim().replaceAll(/^["']|["']$/g,``)}}const re=r(i.execFile),ie=(()=>{let e=`/mnt/`,t;return async function(){if(t)return t;let n=`/etc/wsl.conf`,r=!1;try{await s.access(n,c.F_OK),r=!0}catch{}if(!r)return e;let i=ne(await s.readFile(n,{encoding:`utf8`}));return i===void 0?e:(t=i,t=t.endsWith(`/`)?t:`${t}/`,t)}})(),x=_?async()=>`${await ie()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`:y;let S;const C=async()=>(S??=(async()=>{try{let e=await x();return await s.access(e,c.X_OK),!0}catch{return!1}})(),S),w=async()=>{let e=await x(),t=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,{stdout:r}=await b(t,{powerShellPath:e,cwd:n.dirname(e)});return r.trim()},ae=e=>/^[a-z]+:\/\//i.test(e),oe=async e=>{let t=Array.isArray(e),n=t?e:[e],r=[],i=[];for(let[e,t]of n.entries())ae(t)||(r.push(e),i.push(t));let a=[...n];if(i.length>0)try{let{stdout:e}=await re(`wslpath`,[`-aw`,...i],{encoding:`utf8`}),t=e.split(/\r?\n/).filter(Boolean);for(let[e,i]of r.entries())a[i]=t[e]??n[i]}catch{}return t?a:a[0]},se=r(i.execFile),ce=()=>`${e.env.SYSTEMROOT||e.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,T=[`-NoProfile`,`-NonInteractive`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`],E=e=>u.from(e,`utf16le`).toString(`base64`),le=e=>`'${String(e).replaceAll(`'`,`''`)}'`,D=e=>[...T,E(e)],O=async(e,t={})=>{let{powerShellPath:n,...r}=t;return se(n??ce(),D(e),{encoding:`utf8`,...r})};O.argumentsPrefix=T,O.encodeCommand=E,O.escapeArgument=le,O.createArguments=D;function k(e,t,n){let r=n=>Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0});return Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get(){let e=n();return r(e),e},set(e){r(e)}}),e}const A=r(a);async function j(){if(e.platform!==`darwin`)throw Error(`macOS only`);let{stdout:t}=await A(`defaults`,[`read`,`com.apple.LaunchServices/com.apple.launchservices.secure`,`LSHandlers`]),n=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(t)?.groups.id??`com.apple.Safari`;return n===`com.apple.safari`?`com.apple.Safari`:n}const M=r(a);async function N(t,{humanReadableOutput:n=!0,signal:r}={}){if(e.platform!==`darwin`)throw Error(`macOS only`);let i=n?[]:[`-ss`],a={};r&&(a.signal=r);let{stdout:o}=await M(`osascript`,[`-e`,t,i],a);return o.trim()}async function P(e){return N(`tell application "Finder" to set app_path to application file id "${e}" as string\ntell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}const F=r(a),I={MSEdgeHTM:{name:`Edge`,id:`com.microsoft.edge`},MSEdgeBHTML:{name:`Edge Beta`,id:`com.microsoft.edge.beta`},MSEdgeDHTML:{name:`Edge Dev`,id:`com.microsoft.edge.dev`},AppXq0fevzme2pys62n3e0fbqa7peapykr8v:{name:`Edge`,id:`com.microsoft.edge.old`},ChromeHTML:{name:`Chrome`,id:`com.google.chrome`},ChromeBHTML:{name:`Chrome Beta`,id:`com.google.chrome.beta`},ChromeDHTML:{name:`Chrome Dev`,id:`com.google.chrome.dev`},ChromiumHTM:{name:`Chromium`,id:`org.chromium.Chromium`},BraveHTML:{name:`Brave`,id:`com.brave.Browser`},BraveBHTML:{name:`Brave Beta`,id:`com.brave.Browser.beta`},BraveDHTML:{name:`Brave Dev`,id:`com.brave.Browser.dev`},BraveSSHTM:{name:`Brave Nightly`,id:`com.brave.Browser.nightly`},FirefoxURL:{name:`Firefox`,id:`org.mozilla.firefox`},OperaStable:{name:`Opera`,id:`com.operasoftware.Opera`},VivaldiHTM:{name:`Vivaldi`,id:`com.vivaldi.Vivaldi`},"IE.HTTP":{name:`Internet Explorer`,id:`com.microsoft.ie`}},L=new Map(Object.entries(I));var R=class extends Error{};async function z(t=F){let{stdout:n}=await t(`${e.env.SYSTEMROOT??e.env.windir??`C:\\Windows`}\\System32\\reg.exe`,[`QUERY`,` HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice`,`/v`,`ProgId`]),r=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(n);if(!r)throw new R(`Cannot find Windows browser in stdout: ${JSON.stringify(n)}`);let{id:i}=r.groups,a=i.lastIndexOf(`.`),o=i.lastIndexOf(`-`),s=a===-1?void 0:i.slice(0,a),c=o===-1?void 0:i.slice(0,o);return I[i]??I[s]??I[c]??{name:i,id:i}}const B=r(a),V=e=>e.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,e=>e.toUpperCase());async function H(){if(e.platform===`darwin`){let e=await j();return{name:await P(e),id:e}}if(e.platform===`linux`){let{stdout:e}=await B(`xdg-mime`,[`query`,`default`,`x-scheme-handler/http`]),t=e.trim();return{name:V(t.replace(/.desktop$/,``).replace(`-`,` `)),id:t}}if(e.platform===`win32`)return z();throw Error(`Only macOS, Linux, and Windows are supported`)}const U=!!(e.env.SSH_CONNECTION||e.env.SSH_CLIENT||e.env.SSH_TTY),W=Symbol(`fallbackAttempt`),G=import.meta.url?n.dirname(o(import.meta.url)):``,K=n.join(G,`xdg-open`),{platform:q,arch:J}=e,Y=async(e,t)=>{if(e.length===0)return;let n=[];for(let r of e)try{return await t(r)}catch(e){n.push(e)}throw AggregateError(n,`Failed to open in all supported apps`)},X=async t=>{t={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...t};let r=t[W]===!0;if(delete t[W],Array.isArray(t.app))return Y(t.app,e=>X({...t,app:e,[W]:!0}));let{name:a,arguments:o=[]}=t.app??{};if(o=[...o],Array.isArray(a))return Y(a,e=>X({...t,app:{name:e,arguments:o},[W]:!0}));if(a===`browser`||a===`browserPrivate`){let e={"com.google.chrome":`chrome`,"google-chrome.desktop":`chrome`,"com.brave.browser":`brave`,"org.mozilla.firefox":`firefox`,"firefox.desktop":`firefox`,"com.microsoft.msedge":`edge`,"com.microsoft.edge":`edge`,"com.microsoft.edgemac":`edge`,"microsoft-edge.desktop":`edge`,"com.apple.safari":`safari`},n={chrome:`--incognito`,brave:`--incognito`,firefox:`--private-window`,edge:`--inPrivate`},r;if(_){let e=await w();r=L.get(e)??{}}else r=await H();if(r.id in e){let i=e[r.id.toLowerCase()];if(a===`browserPrivate`){if(i===`safari`)throw Error(`Safari doesn't support opening in private mode via command line`);o.push(n[i])}return X({...t,app:{name:$[i],arguments:o}})}throw Error(`${r.name} is not supported as a default browser`)}let l,u=[],d={},f=!1;if(_&&!h()&&!U&&!a&&(f=await C()),q===`darwin`)l=`open`,t.wait&&u.push(`--wait-apps`),t.background&&u.push(`--background`),t.newInstance&&u.push(`--new`),a&&u.push(`-a`,a);else if(q===`win32`||f){l=await x(),u.push(...O.argumentsPrefix),_||(d.windowsVerbatimArguments=!0),_&&t.target&&(t.target=await oe(t.target));let e=[`$ProgressPreference = 'SilentlyContinue';`,`Start`];t.wait&&e.push(`-Wait`),a?(e.push(O.escapeArgument(a)),t.target&&o.push(t.target)):t.target&&e.push(O.escapeArgument(t.target)),o.length>0&&(o=o.map(e=>O.escapeArgument(e)),e.push(`-ArgumentList`,o.join(`,`))),t.target=O.encodeCommand(e.join(` `)),t.wait||(d.stdio=`ignore`),_&&(d.cwd=n.dirname(l))}else{if(a)l=a;else{let t=!G||G===`/`,n=!1;try{await s.access(K,c.X_OK),n=!0}catch{}l=e.versions.electron??(q===`android`||t||!n)?`xdg-open`:K}o.length>0&&u.push(...o),t.wait||(d.stdio=`ignore`,d.detached=!0)}q===`darwin`&&o.length>0&&u.push(`--args`,...o),t.target&&u.push(t.target);let p=i.spawn(l,u,d);return t.wait?new Promise((e,n)=>{p.once(`error`,n),p.once(`close`,r=>{if(!t.allowNonzeroExitCode&&r!==0){n(Error(`Exited with code ${r}`));return}e(p)})}):r?new Promise((e,t)=>{p.once(`error`,t),p.once(`spawn`,()=>{p.once(`close`,n=>{if(p.off(`error`,t),n!==0){t(Error(`Exited with code ${n}`));return}p.unref(),e(p)})})}):(p.unref(),new Promise((e,t)=>{p.once(`error`,t),p.once(`spawn`,()=>{p.off(`error`,t),e(p)})}))},ue=(e,t)=>{if(typeof e!=`string`&&!Array.isArray(e))throw TypeError("Expected a valid `name`");let{arguments:n=[]}=t??{};if(n!=null&&!Array.isArray(n))throw TypeError("Expected `appArguments` as Array type");return X({...t,app:{name:e,arguments:n}})};function Z(e){if(typeof e==`string`||Array.isArray(e))return e;let{[J]:t}=e;if(!t)throw Error(`${J} is not supported`);return t}function Q({[q]:e},{wsl:t}={}){if(t&&_)return Z(t);if(!e)throw Error(`${q} is not supported`);return Z(e)}const $={browser:`browser`,browserPrivate:`browserPrivate`};k($,`chrome`,()=>Q({darwin:`google chrome`,win32:`chrome`,linux:[`google-chrome`,`google-chrome-stable`,`chromium`,`chromium-browser`]},{wsl:{ia32:`/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe`,x64:[`/mnt/c/Program Files/Google/Chrome/Application/chrome.exe`,`/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe`]}})),k($,`brave`,()=>Q({darwin:`brave browser`,win32:`brave`,linux:[`brave-browser`,`brave`]},{wsl:{ia32:`/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe`,x64:[`/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe`,`/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe`]}})),k($,`firefox`,()=>Q({darwin:`firefox`,win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:`firefox`},{wsl:`/mnt/c/Program Files/Mozilla Firefox/firefox.exe`})),k($,`edge`,()=>Q({darwin:`microsoft edge`,win32:`msedge`,linux:[`microsoft-edge`,`microsoft-edge-dev`]},{wsl:`/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe`})),k($,`safari`,()=>Q({darwin:`Safari`}));export{ue as openApp};
@@ -1,2 +0,0 @@
1
- import e from"node:path";import t from"node:process";import{fileURLToPath as n}from"node:url";import r,{execFile as i}from"node:child_process";import a,{constants as o}from"node:fs/promises";import{promisify as s}from"node:util";import c from"node:os";import l from"node:fs";import{Buffer as u}from"node:buffer";let d;function f(){try{return l.statSync(`/.dockerenv`),!0}catch{return!1}}function p(){try{return l.readFileSync(`/proc/self/cgroup`,`utf8`).includes(`docker`)}catch{return!1}}function m(){return d===void 0&&(d=f()||p()),d}let h;const ee=()=>{try{return l.statSync(`/run/.containerenv`),!0}catch{return!1}};function g(){return h===void 0&&(h=ee()||m()),h}const _=()=>{if(t.platform!==`linux`)return!1;if(c.release().toLowerCase().includes(`microsoft`))return!g();try{if(l.readFileSync(`/proc/version`,`utf8`).toLowerCase().includes(`microsoft`))return!g()}catch{}return l.existsSync(`/proc/sys/fs/binfmt_misc/WSLInterop`)||l.existsSync(`/run/WSL`)?!g():!1};var v=t.env.__IS_WSL_TEST__?_:_();const te=s(r.execFile),y=()=>`${t.env.SYSTEMROOT||t.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,b=async(e,t={})=>{let{powerShellPath:n,...r}=t,i=b.encodeCommand(e);return te(n??y(),[...b.argumentsPrefix,i],{encoding:`utf8`,...r})};b.argumentsPrefix=[`-NoProfile`,`-NonInteractive`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`],b.encodeCommand=e=>u.from(e,`utf16le`).toString(`base64`),b.escapeArgument=e=>`'${String(e).replaceAll(`'`,`''`)}'`;function ne(e){for(let t of e.split(`
2
- `)){if(/^\s*#/.test(t))continue;let e=/^\s*root\s*=\s*(?<mountPoint>"[^"]*"|'[^']*'|[^#]*)/.exec(t);if(e)return e.groups.mountPoint.trim().replaceAll(/^["']|["']$/g,``)}}const re=s(r.execFile),x=(()=>{let e=`/mnt/`,t;return async function(){if(t)return t;let n=`/etc/wsl.conf`,r=!1;try{await a.access(n,o.F_OK),r=!0}catch{}if(!r)return e;let i=ne(await a.readFile(n,{encoding:`utf8`}));return i===void 0?e:(t=i,t=t.endsWith(`/`)?t:`${t}/`,t)}})(),S=v?async()=>`${await x()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`:y;let C;const ie=async()=>(C??=(async()=>{try{let e=await S();return await a.access(e,o.X_OK),!0}catch{return!1}})(),C),ae=async()=>{let t=await S(),n=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,{stdout:r}=await b(n,{powerShellPath:t,cwd:e.dirname(t)});return r.trim()},w=e=>/^[a-z]+:\/\//i.test(e),oe=async e=>{let t=Array.isArray(e),n=t?e:[e],r=[],i=[];for(let[e,t]of n.entries())w(t)||(r.push(e),i.push(t));let a=[...n];if(i.length>0)try{let{stdout:e}=await re(`wslpath`,[`-aw`,...i],{encoding:`utf8`}),t=e.split(/\r?\n/).filter(Boolean);for(let[e,i]of r.entries())a[i]=t[e]??n[i]}catch{}return t?a:a[0]},se=s(r.execFile),ce=()=>`${t.env.SYSTEMROOT||t.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,T=[`-NoProfile`,`-NonInteractive`,`-ExecutionPolicy`,`Bypass`,`-EncodedCommand`],E=e=>u.from(e,`utf16le`).toString(`base64`),le=e=>`'${String(e).replaceAll(`'`,`''`)}'`,D=e=>[...T,E(e)],O=async(e,t={})=>{let{powerShellPath:n,...r}=t;return se(n??ce(),D(e),{encoding:`utf8`,...r})};O.argumentsPrefix=T,O.encodeCommand=E,O.escapeArgument=le,O.createArguments=D;function k(e,t,n){let r=n=>Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0});return Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get(){let e=n();return r(e),e},set(e){r(e)}}),e}const A=s(i);async function j(){if(t.platform!==`darwin`)throw Error(`macOS only`);let{stdout:e}=await A(`defaults`,[`read`,`com.apple.LaunchServices/com.apple.launchservices.secure`,`LSHandlers`]),n=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(e)?.groups.id??`com.apple.Safari`;return n===`com.apple.safari`?`com.apple.Safari`:n}const M=s(i);async function N(e,{humanReadableOutput:n=!0,signal:r}={}){if(t.platform!==`darwin`)throw Error(`macOS only`);let i=n?[]:[`-ss`],a={};r&&(a.signal=r);let{stdout:o}=await M(`osascript`,[`-e`,e,i],a);return o.trim()}async function P(e){return N(`tell application "Finder" to set app_path to application file id "${e}" as string\ntell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}const F=s(i),I={MSEdgeHTM:{name:`Edge`,id:`com.microsoft.edge`},MSEdgeBHTML:{name:`Edge Beta`,id:`com.microsoft.edge.beta`},MSEdgeDHTML:{name:`Edge Dev`,id:`com.microsoft.edge.dev`},AppXq0fevzme2pys62n3e0fbqa7peapykr8v:{name:`Edge`,id:`com.microsoft.edge.old`},ChromeHTML:{name:`Chrome`,id:`com.google.chrome`},ChromeBHTML:{name:`Chrome Beta`,id:`com.google.chrome.beta`},ChromeDHTML:{name:`Chrome Dev`,id:`com.google.chrome.dev`},ChromiumHTM:{name:`Chromium`,id:`org.chromium.Chromium`},BraveHTML:{name:`Brave`,id:`com.brave.Browser`},BraveBHTML:{name:`Brave Beta`,id:`com.brave.Browser.beta`},BraveDHTML:{name:`Brave Dev`,id:`com.brave.Browser.dev`},BraveSSHTM:{name:`Brave Nightly`,id:`com.brave.Browser.nightly`},FirefoxURL:{name:`Firefox`,id:`org.mozilla.firefox`},OperaStable:{name:`Opera`,id:`com.operasoftware.Opera`},VivaldiHTM:{name:`Vivaldi`,id:`com.vivaldi.Vivaldi`},"IE.HTTP":{name:`Internet Explorer`,id:`com.microsoft.ie`}},L=new Map(Object.entries(I));var R=class extends Error{};async function z(e=F){let{stdout:n}=await e(`${t.env.SYSTEMROOT??t.env.windir??`C:\\Windows`}\\System32\\reg.exe`,[`QUERY`,` HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice`,`/v`,`ProgId`]),r=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(n);if(!r)throw new R(`Cannot find Windows browser in stdout: ${JSON.stringify(n)}`);let{id:i}=r.groups,a=i.lastIndexOf(`.`),o=i.lastIndexOf(`-`),s=a===-1?void 0:i.slice(0,a),c=o===-1?void 0:i.slice(0,o);return I[i]??I[s]??I[c]??{name:i,id:i}}const B=s(i),V=e=>e.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,e=>e.toUpperCase());async function H(){if(t.platform===`darwin`){let e=await j();return{name:await P(e),id:e}}if(t.platform===`linux`){let{stdout:e}=await B(`xdg-mime`,[`query`,`default`,`x-scheme-handler/http`]),t=e.trim();return{name:V(t.replace(/.desktop$/,``).replace(`-`,` `)),id:t}}if(t.platform===`win32`)return z();throw Error(`Only macOS, Linux, and Windows are supported`)}const U=!!(t.env.SSH_CONNECTION||t.env.SSH_CLIENT||t.env.SSH_TTY),W=Symbol(`fallbackAttempt`),G=import.meta.url?e.dirname(n(import.meta.url)):``,K=e.join(G,`xdg-open`),{platform:q,arch:J}=t,Y=async(e,t)=>{if(e.length===0)return;let n=[];for(let r of e)try{return await t(r)}catch(e){n.push(e)}throw AggregateError(n,`Failed to open in all supported apps`)},X=async n=>{n={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...n};let i=n[W]===!0;if(delete n[W],Array.isArray(n.app))return Y(n.app,e=>X({...n,app:e,[W]:!0}));let{name:s,arguments:c=[]}=n.app??{};if(c=[...c],Array.isArray(s))return Y(s,e=>X({...n,app:{name:e,arguments:c},[W]:!0}));if(s===`browser`||s===`browserPrivate`){let e={"com.google.chrome":`chrome`,"google-chrome.desktop":`chrome`,"com.brave.browser":`brave`,"org.mozilla.firefox":`firefox`,"firefox.desktop":`firefox`,"com.microsoft.msedge":`edge`,"com.microsoft.edge":`edge`,"com.microsoft.edgemac":`edge`,"microsoft-edge.desktop":`edge`,"com.apple.safari":`safari`},t={chrome:`--incognito`,brave:`--incognito`,firefox:`--private-window`,edge:`--inPrivate`},r;if(v){let e=await ae();r=L.get(e)??{}}else r=await H();if(r.id in e){let i=e[r.id.toLowerCase()];if(s===`browserPrivate`){if(i===`safari`)throw Error(`Safari doesn't support opening in private mode via command line`);c.push(t[i])}return X({...n,app:{name:$[i],arguments:c}})}throw Error(`${r.name} is not supported as a default browser`)}let l,u=[],d={},f=!1;if(v&&!g()&&!U&&!s&&(f=await ie()),q===`darwin`)l=`open`,n.wait&&u.push(`--wait-apps`),n.background&&u.push(`--background`),n.newInstance&&u.push(`--new`),s&&u.push(`-a`,s);else if(q===`win32`||f){l=await S(),u.push(...O.argumentsPrefix),v||(d.windowsVerbatimArguments=!0),v&&n.target&&(n.target=await oe(n.target));let t=[`$ProgressPreference = 'SilentlyContinue';`,`Start`];n.wait&&t.push(`-Wait`),s?(t.push(O.escapeArgument(s)),n.target&&c.push(n.target)):n.target&&t.push(O.escapeArgument(n.target)),c.length>0&&(c=c.map(e=>O.escapeArgument(e)),t.push(`-ArgumentList`,c.join(`,`))),n.target=O.encodeCommand(t.join(` `)),n.wait||(d.stdio=`ignore`),v&&(d.cwd=e.dirname(l))}else{if(s)l=s;else{let e=!G||G===`/`,n=!1;try{await a.access(K,o.X_OK),n=!0}catch{}l=t.versions.electron??(q===`android`||e||!n)?`xdg-open`:K}c.length>0&&u.push(...c),n.wait||(d.stdio=`ignore`,d.detached=!0)}q===`darwin`&&c.length>0&&u.push(`--args`,...c),n.target&&u.push(n.target);let p=r.spawn(l,u,d);return n.wait?new Promise((e,t)=>{p.once(`error`,t),p.once(`close`,r=>{if(!n.allowNonzeroExitCode&&r!==0){t(Error(`Exited with code ${r}`));return}e(p)})}):i?new Promise((e,t)=>{p.once(`error`,t),p.once(`spawn`,()=>{p.once(`close`,n=>{if(p.off(`error`,t),n!==0){t(Error(`Exited with code ${n}`));return}p.unref(),e(p)})})}):(p.unref(),new Promise((e,t)=>{p.once(`error`,t),p.once(`spawn`,()=>{p.off(`error`,t),e(p)})}))},ue=(e,t)=>{if(typeof e!=`string`&&!Array.isArray(e))throw TypeError("Expected a valid `name`");let{arguments:n=[]}=t??{};if(n!=null&&!Array.isArray(n))throw TypeError("Expected `appArguments` as Array type");return X({...t,app:{name:e,arguments:n}})};function Z(e){if(typeof e==`string`||Array.isArray(e))return e;let{[J]:t}=e;if(!t)throw Error(`${J} is not supported`);return t}function Q({[q]:e},{wsl:t}={}){if(t&&v)return Z(t);if(!e)throw Error(`${q} is not supported`);return Z(e)}const $={browser:`browser`,browserPrivate:`browserPrivate`};k($,`chrome`,()=>Q({darwin:`google chrome`,win32:`chrome`,linux:[`google-chrome`,`google-chrome-stable`,`chromium`,`chromium-browser`]},{wsl:{ia32:`/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe`,x64:[`/mnt/c/Program Files/Google/Chrome/Application/chrome.exe`,`/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe`]}})),k($,`brave`,()=>Q({darwin:`brave browser`,win32:`brave`,linux:[`brave-browser`,`brave`]},{wsl:{ia32:`/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe`,x64:[`/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe`,`/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe`]}})),k($,`firefox`,()=>Q({darwin:`firefox`,win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:`firefox`},{wsl:`/mnt/c/Program Files/Mozilla Firefox/firefox.exe`})),k($,`edge`,()=>Q({darwin:`microsoft edge`,win32:`msedge`,linux:[`microsoft-edge`,`microsoft-edge-dev`]},{wsl:`/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe`})),k($,`safari`,()=>Q({darwin:`Safari`}));export{ue as openApp};