yanki
Version:
A CLI tool and TypeScript library for syncing Markdown to Anki flashcards.
3 lines (2 loc) • 9.23 kB
JavaScript
var _=Object.defineProperty;var n=(e,r)=>_(e,"name",{value:r,configurable:!0});import c from"node:process";import{Buffer as C}from"node:buffer";import F from"node:path";import{fileURLToPath as D}from"node:url";import{promisify as w}from"node:util";import M,{execFile as h}from"node:child_process";import S,{constants as L}from"node:fs/promises";import R from"node:os";import v from"node:fs";let b;function N(){try{return v.statSync("/.dockerenv"),!0}catch{return!1}}n(N,"hasDockerEnv");function z(){try{return v.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}n(z,"hasDockerCGroup");function G(){return b===void 0&&(b=N()||z()),b}n(G,"isDocker");let P;const X=n(()=>{try{return v.statSync("/run/.containerenv"),!0}catch{return!1}},"hasContainerEnv");function E(){return P===void 0&&(P=X()||G()),P}n(E,"isInsideContainer");const T=n(()=>{if(c.platform!=="linux")return!1;if(R.release().toLowerCase().includes("microsoft"))return!E();try{return v.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!E():!1}catch{return!1}},"isWsl");var g=c.env.__IS_WSL_TEST__?T:T();const K=(()=>{const e="/mnt/";let r;return async function(){if(r)return r;const o="/etc/wsl.conf";let i=!1;try{await S.access(o,L.F_OK),i=!0}catch{}if(!i)return e;const t=await S.readFile(o,{encoding:"utf8"}),s=/(?<!#.*)root\s*=\s*(?<mountPoint>.*)/g.exec(t);return s?(r=s.groups.mountPoint.trim(),r=r.endsWith("/")?r:`${r}/`,r):e}})(),V=n(async()=>`${await K()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`,"powerShellPathFromWsl"),O=n(async()=>g?V():`${c.env.SYSTEMROOT||c.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,"powerShellPath");function d(e,r,o){const i=n(t=>Object.defineProperty(e,r,{value:t,enumerable:!0,writable:!0}),"define");return Object.defineProperty(e,r,{configurable:!0,enumerable:!0,get(){const t=o();return i(t),t},set(t){i(t)}}),e}n(d,"defineLazyProperty");const j=w(h);async function q(){if(c.platform!=="darwin")throw new Error("macOS only");const{stdout:e}=await j("defaults",["read","com.apple.LaunchServices/com.apple.launchservices.secure","LSHandlers"]),o=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(e)?.groups.id??"com.apple.Safari";return o==="com.apple.safari"?"com.apple.Safari":o}n(q,"defaultBrowserId");const Y=w(h);async function J(e,{humanReadableOutput:r=!0,signal:o}={}){if(c.platform!=="darwin")throw new Error("macOS only");const i=r?[]:["-ss"],t={};o&&(t.signal=o);const{stdout:s}=await Y("osascript",["-e",e,i],t);return s.trim()}n(J,"runAppleScript");async function Q(e){return J(`tell application "Finder" to set app_path to application file id "${e}" as string
tell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}n(Q,"bundleName");const Z=w(h),$={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"}};new Map(Object.entries($));class H extends Error{static{n(this,"UnknownBrowserError")}}async function ee(e=Z){const{stdout:r}=await e("reg",["QUERY"," HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice","/v","ProgId"]),o=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec(r);if(!o)throw new H(`Cannot find Windows browser in stdout: ${JSON.stringify(r)}`);const{id:i}=o.groups,t=$[i];if(!t)throw new H(`Unknown browser ID: ${i}`);return t}n(ee,"defaultBrowser$1");const re=w(h),oe=n(e=>e.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,r=>r.toUpperCase()),"titleize");async function te(){if(c.platform==="darwin"){const e=await q();return{name:await Q(e),id:e}}if(c.platform==="linux"){const{stdout:e}=await re("xdg-mime",["query","default","x-scheme-handler/http"]),r=e.trim();return{name:oe(r.replace(/.desktop$/,"").replace("-"," ")),id:r}}if(c.platform==="win32")return ee();throw new Error("Only macOS, Linux, and Windows are supported")}n(te,"defaultBrowser");const ne=w(M.execFile),B=F.dirname(D(import.meta.url)),I=F.join(B,"xdg-open"),{platform:u,arch:k}=c;async function ie(){const e=await O(),r=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,o=C.from(r,"utf16le").toString("base64"),{stdout:i}=await ne(e,["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",o],{encoding:"utf8"}),t=i.trim(),s={ChromeHTML:"com.google.chrome",BraveHTML:"com.brave.Browser",MSEdgeHTM:"com.microsoft.edge",FirefoxURL:"org.mozilla.firefox"};return s[t]?{id:s[t]}:{}}n(ie,"getWindowsDefaultBrowserFromWsl");const W=n(async(e,r)=>{let o;for(const i of e)try{return await r(i)}catch(t){o=t}throw o},"pTryEach"),x=n(async e=>{if(e={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...e},Array.isArray(e.app))return W(e.app,a=>x({...e,app:a}));let{name:r,arguments:o=[]}=e.app??{};if(o=[...o],Array.isArray(r))return W(r,a=>x({...e,app:{name:a,arguments:o}}));if(r==="browser"||r==="browserPrivate"){const a={"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"},m={chrome:"--incognito",brave:"--incognito",firefox:"--private-window",edge:"--inPrivate"},f=g?await ie():await te();if(f.id in a){const A=a[f.id];return r==="browserPrivate"&&o.push(m[A]),x({...e,app:{name:l[A],arguments:o}})}throw new Error(`${f.name} is not supported as a default browser`)}let i;const t=[],s={};if(u==="darwin")i="open",e.wait&&t.push("--wait-apps"),e.background&&t.push("--background"),e.newInstance&&t.push("--new"),r&&t.push("-a",r);else if(u==="win32"||g&&!E()&&!r){i=await O(),t.push("-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand"),g||(s.windowsVerbatimArguments=!0);const a=["Start"];e.wait&&a.push("-Wait"),r?(a.push(`"\`"${r}\`""`),e.target&&o.push(e.target)):e.target&&a.push(`"${e.target}"`),o.length>0&&(o=o.map(m=>`"\`"${m}\`""`),a.push("-ArgumentList",o.join(","))),e.target=C.from(a.join(" "),"utf16le").toString("base64")}else{if(r)i=r;else{const a=!B||B==="/";let m=!1;try{await S.access(I,L.X_OK),m=!0}catch{}i=c.versions.electron??(u==="android"||a||!m)?"xdg-open":I}o.length>0&&t.push(...o),e.wait||(s.stdio="ignore",s.detached=!0)}u==="darwin"&&o.length>0&&t.push("--args",...o),e.target&&t.push(e.target);const p=M.spawn(i,t,s);return e.wait?new Promise((a,m)=>{p.once("error",m),p.once("close",f=>{if(!e.allowNonzeroExitCode&&f>0){m(new Error(`Exited with code ${f}`));return}a(p)})}):(p.unref(),p)},"baseOpen"),ae=n((e,r)=>{if(typeof e!="string"&&!Array.isArray(e))throw new TypeError("Expected a valid `name`");const{arguments:o=[]}=r??{};if(o!=null&&!Array.isArray(o))throw new TypeError("Expected `appArguments` as Array type");return x({...r,app:{name:e,arguments:o}})},"openApp");function U(e){if(typeof e=="string"||Array.isArray(e))return e;const{[k]:r}=e;if(!r)throw new Error(`${k} is not supported`);return r}n(U,"detectArchBinary");function y({[u]:e},{wsl:r}){if(r&&g)return U(r);if(!e)throw new Error(`${u} is not supported`);return U(e)}n(y,"detectPlatformBinary");const l={};d(l,"chrome",()=>y({darwin:"google chrome",win32:"chrome",linux:["google-chrome","google-chrome-stable","chromium"]},{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"]}})),d(l,"brave",()=>y({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"]}})),d(l,"firefox",()=>y({darwin:"firefox",win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:"firefox"},{wsl:"/mnt/c/Program Files/Mozilla Firefox/firefox.exe"})),d(l,"edge",()=>y({darwin:"microsoft edge",win32:"msedge",linux:["microsoft-edge","microsoft-edge-dev"]},{wsl:"/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"})),d(l,"browser",()=>"browser"),d(l,"browserPrivate",()=>"browserPrivate");export{l as apps,ae as openApp};