@crewx/sdk 0.9.0-rc.59 → 0.9.0-rc.60
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.
package/dist/desktop/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';var d=require('path'),fs=require('fs'),os=require('os'),child_process=require('child_process'),module$1=require('module');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var d__namespace=/*#__PURE__*/_interopNamespace(d);var O=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var f=class extends Error{code;constructor(e,n){super(`${e}: ${n}`),this.code=e,this.name="ShortcutError";}};var F={existsSync:t=>fs.existsSync(t),readFileSync:t=>fs.readFileSync(t,"utf8"),writeFileSync:(t,e)=>fs.writeFileSync(t,e,"utf8"),mkdirSync:t=>{fs.mkdirSync(t,{recursive:true});},unlinkSync:t=>{fs.unlinkSync(t);}},$=os.homedir;function L(t){return typeof t!="string"?void 0:t.trim()||void 0}function k(t){return L(t)?.toLowerCase()??""}function R(t){try{return fs.statSync(t).isFile()}catch{return false}}function xt(t,e){if(t===e)return true;let n=d__namespace.default.relative(t,e);return n!==""&&!n.startsWith("..")&&!d__namespace.default.isAbsolute(n)}function Lt(t,e){if(d__namespace.default.basename(t)!==".bin")return false;let n=d__namespace.default.dirname(t);if(d__namespace.default.basename(n)!=="node_modules")return false;let r=d__namespace.default.dirname(n);return xt(r,e)}function V(t,e={}){if(t.includes("/")||t.includes("\\")||d__namespace.default.isAbsolute(t))return t;let n=e.platform??process.platform,r=e.env??process.env,s=d__namespace.default.resolve(e.cwd??process.cwd()),c=(e.resolution??"global_first")==="global_first",o=r.PATH??r.Path??process.env.PATH??process.env.Path??"",i=n==="win32"?";":":",a=o.split(i).map(u=>u.trim()).filter(Boolean),l=d__namespace.default.extname(t).length>0,h=r.PATHEXT??r.Pathext??process.env.PATHEXT??process.env.Pathext??".EXE;.CMD;.BAT;.COM",m=n==="win32"?l?[""]:h.split(";").map(u=>u.trim()).filter(Boolean).map(u=>u.startsWith(".")?u:`.${u}`):[""];for(let u of a){let p=d__namespace.default.resolve(s,u);if(!(c&&Lt(p,s)))for(let g of m){let mt=k(g),gt=g.toUpperCase();for(let wt of [g,mt,gt]){let M=d__namespace.default.join(p,`${t}${wt}`);if(R(M))return M}}}return t}function kt(t){if(!R(t))return null;try{let e=fs.readFileSync(t,"utf8"),n=d__namespace.default.dirname(t),r=[];for(let i of e.matchAll(/"([^"\r\n]*)"/g)){let h=(i[1]??"").match(/%~?dp0%?\s*[\\/]*(.*)$/i)?.[1]?.trim();if(!h)continue;let m=h.replace(/[\\/]+/g,d__namespace.default.sep).replace(/^[\\/]+/,""),u=d__namespace.default.resolve(n,m);R(u)&&r.push(u);}let s=[],c=new Map;for(let i of e.matchAll(/SET\s+"(\w+)=%~?dp0%?[\\/]?([^"]+)"/gi)){let a=i[1].toUpperCase(),l=i[2].trim().replace(/[\\/]+/g,d__namespace.default.sep).replace(/^[\\/]+/,"");c.set(a,d__namespace.default.resolve(n,l));}for(let i of e.split(/\r?\n/))if(i.includes("%*"))for(let a of i.matchAll(/"%(\w+)%"/g)){let l=c.get(a[1].toUpperCase());l&&R(l)&&s.push(l);}let o=i=>i.find(a=>{let l=k(d__namespace.default.basename(a));return l!=="node.exe"&&l!=="node"})??null;return o(s)??o(r)}catch{return null}}function It(t,e){if(typeof e=="string")return L(e)||null;if(!e||typeof e!="object")return null;if(t){let n=e[t],r=typeof n=="string"?L(n):void 0;if(r)return r}for(let n of Object.values(e)){let r=typeof n=="string"?L(n):void 0;if(r)return r}return null}function _t(t,e){if(!e)return null;let n=d__namespace.default.dirname(t),r=[d__namespace.default.resolve(n,"..",e),d__namespace.default.resolve(n,"node_modules",e)];for(let s of r){let c=d__namespace.default.join(s,"package.json");if(R(c))try{let o=JSON.parse(fs.readFileSync(c,"utf8")),i=It(e,o.bin);if(!i)continue;let a=d__namespace.default.resolve(s,i);if(R(a))return a}catch{}}return null}function Nt(t){let e=t.platform??process.platform,n=t.env??process.env,r=t.execPath??process.execPath,s=t.cwd,c=t.resolution;if(e!=="win32")return {command:V(t.command,{cwd:s,env:n,platform:e,resolution:c}),leadingArgv:[],resolution:"direct"};let o=V(t.command,{cwd:s,env:n,platform:e,resolution:c}),i=k(d__namespace.default.extname(o));if(i===".js"||i===".cjs"||i===".mjs")return {command:r,leadingArgv:[o],resolution:"node-entrypoint",windowsHide:true};if(i===".cmd"||i===".bat"){let a=kt(o)??_t(o,t.packageName);return a?k(d__namespace.default.extname(a))===".exe"?{command:a,leadingArgv:[],resolution:"exe-entrypoint",windowsHide:true}:{command:r,leadingArgv:[a],resolution:"node-entrypoint",windowsHide:true}:{command:o,leadingArgv:[],resolution:"unresolved-wrapper"}}return {command:o,leadingArgv:[],resolution:"direct"}}function Ot(t){if(t.candidate.resolution!=="unresolved-wrapper")return {command:t.candidate.command,leadingArgv:t.candidate.leadingArgv,resolution:t.candidate.resolution,windowsHide:t.candidate.windowsHide};throw new Error(`${d__namespace.default.basename(t.candidate.command)} wrapper resolved, but no executable/Node entrypoint could be resolved without shell execution.`)}function X(t){let e=Nt(t);return Ot({candidate:e})}function H(t,e){return {command:t.command,argv:[...t.leadingArgv,...e],resolution:t.resolution,shell:t.shell,windowsHide:t.windowsHide}}var G=3e4;function bt(t){if(typeof t.pid!="number"){t.kill();return}if(process.platform==="win32"){child_process.spawn("taskkill",["/pid",String(t.pid),"/t","/f"],{windowsHide:true}).on("error",()=>{});return}try{process.kill(-t.pid,"SIGKILL");}catch{t.kill("SIGKILL");}}var j=(t,e,n={})=>new Promise((r,s)=>{let c=n.env??process.env,o=process.platform,i;try{let p=X({command:t,platform:o,env:c,cwd:n.cwd,allowShellFallback:!1});i=H(p,e);}catch(p){s(p instanceof Error?p:new Error(String(p)));return}let a=child_process.spawn(i.command,i.argv,{cwd:n.cwd,env:c,shell:i.shell,windowsHide:i.windowsHide??true,detached:o!=="win32"}),l="",h="",m=false,u=setTimeout(()=>{m||(m=true,bt(a),s(new Error(`Command timed out after ${n.timeoutMs??G}ms: ${t} ${e.join(" ")}`)));},n.timeoutMs??G);a.stdout?.on("data",p=>{l+=p.toString();}),a.stderr?.on("data",p=>{h+=p.toString();}),a.on("error",p=>{m||(m=true,clearTimeout(u),s(p));}),a.on("close",p=>{m||(m=true,clearTimeout(u),r({code:p??0,stdout:l,stderr:h}));});});function Wt(){try{return (typeof O=="function"?O:module$1.createRequire(__filename)).resolve("@crewx/sdk/package.json")}catch{return null}}function Tt(){let t=[Wt(),d.join(__dirname,"../../package.json"),d.join(__dirname,"../../../package.json")].filter(e=>!!e);for(let e of t)try{let n=JSON.parse(fs.readFileSync(e,"utf8"));if(n.name==="@crewx/sdk"&&n.version)return n.version}catch{}return "0.0.0"}var K=Tt();var S=d__namespace.win32;function b(t){return S.join(t,".crewx")}function q(t){return S.join(b(t),"shortcut.json")}function Q(t){return S.join(b(t),"launcher.json")}function Y(t){return S.join(b(t),"bin","crewx-launcher.cmd")}function Z(t){return S.join(t,"CrewX.lnk")}function D(t,e){return S.normalize(t).toLowerCase()===S.normalize(e).toLowerCase()}var Mt="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; [Environment]::GetFolderPath('DesktopDirectory')";async function tt(t){try{let n=await t.run("powershell",["-NoProfile","-NonInteractive","-Command",Mt],{env:t.env}),r=n.stdout.trim();if(n.code===0&&r)return {dir:r,source:"known-folder"}}catch{}let e=t.env.USERPROFILE||t.env.Userprofile||t.homedir();return e?{dir:S.join(e,"Desktop"),source:"fallback"}:null}function A(t,e){let n=S.resolve(e,"node_modules",".bin").toLowerCase();return t.split(";").filter(r=>r?S.resolve(r).toLowerCase()!==n:true).join(";")}function et(t){return t?/\\Program Files( \(x86\))?\\/i.test(t)&&/crewx/i.test(t):false}function Ft(t,e){let n=a=>{let[l,...h]=a.split("-"),m=h.join("-")||void 0;return {parts:(l??"").split(".").map(p=>Number.parseInt(p,10)||0),pre:m}},r=n(t),s=n(e),c=Math.max(r.parts.length,s.parts.length);for(let a=0;a<c;a++){let l=r.parts[a]??0,h=s.parts[a]??0;if(l!==h)return l<h?-1:1}if(r.pre===s.pre)return 0;if(!r.pre&&s.pre)return 1;if(r.pre&&!s.pre)return -1;let o=Number.parseInt(r.pre.match(/(\d+)$/)?.[1]??"",10),i=Number.parseInt(s.pre.match(/(\d+)$/)?.[1]??"",10);return !Number.isNaN(o)&&!Number.isNaN(i)&&o!==i?o<i?-1:1:r.pre<s.pre?-1:r.pre>s.pre?1:0}function v(t,e){return Ft(t,e)<0}var rt=d__namespace.win32,ot=1;function st(t,e){if(!t.existsSync(e))return null;try{let n=JSON.parse(t.readFileSync(e));return {schema:n.schema??ot,shortcutPath:n.shortcutPath,version:n.version,owned:!!n.owned,declined:!!n.declined,desktopSource:n.desktopSource,updatedAt:n.updatedAt}}catch{return null}}function I(t,e,n){let r={schema:ot,...n,updatedAt:new Date().toISOString()};t.mkdirSync(rt.dirname(e)),t.writeFileSync(e,JSON.stringify(r,null,2));}function _(t,e){if(!t.existsSync(e))return null;try{let n=JSON.parse(t.readFileSync(e));return {schema:n.schema??0,binPath:n.binPath,updatedAt:n.updatedAt}}catch{return null}}function it(t,e,n){t.mkdirSync(rt.dirname(e)),t.writeFileSync(e,JSON.stringify(n,null,2));}var $t=d__namespace.win32,y=1;function Vt(t){return t.replace(/%/g,"%%")}function Bt(t){return ["@echo off","setlocal DisableDelayedExpansion","chcp 65001 >nul","",'set "CREWX_WORKDIR=%USERPROFILE%\\crewx"','if not exist "%CREWX_WORKDIR%" mkdir "%CREWX_WORKDIR%" >nul 2>nul','cd /d "%CREWX_WORKDIR%"',"",'set "CREWX_PORT_EFFECTIVE=%CREWX_PORT%"','if "%CREWX_PORT_EFFECTIVE%"=="" set "CREWX_PORT_EFFECTIVE=8150"','set "CREWX_HEALTH_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/api/v1/health"','set "CREWX_ORIGIN_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/"',"",t.bakedBinPath?`set "CREWX_FALLBACK_BIN=${Vt(t.bakedBinPath)}"`:'set "CREWX_FALLBACK_BIN="','set "CREWX_RESOLVED_BIN=%CREWX_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" set "CREWX_RESOLVED_BIN=%CREWX_FALLBACK_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" (',` for /f "delims=" %%I in ('where crewx 2^>nul') do (`,' if not defined CREWX_RESOLVED_BIN set "CREWX_RESOLVED_BIN=%%I"'," )",")","",'powershell -NoProfile -NonInteractive -Command "try { $r = Invoke-WebRequest -Uri $env:CREWX_HEALTH_URL -TimeoutSec 1 -UseBasicParsing; if ($r.StatusCode -eq 200) { exit 0 } else { exit 1 } } catch { exit 1 }"',"if %ERRORLEVEL% EQU 0 (",' start "" "%CREWX_ORIGIN_URL%"'," exit /b 0",")","",'if "%CREWX_RESOLVED_BIN%"=="" ('," echo CrewX executable not found. Please reinstall the desktop shortcut."," pause"," exit /b 1",")","",'start "CrewX" /min "%CREWX_RESOLVED_BIN%"',""].join(`\r
|
|
2
|
-
`)}function
|
|
3
|
-
${
|
|
1
|
+
'use strict';var d=require('path'),crypto=require('crypto'),fs=require('fs'),os=require('os'),child_process=require('child_process'),module$1=require('module');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var d__namespace=/*#__PURE__*/_interopNamespace(d);var D=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var f=class extends Error{code;constructor(t,n){super(`${t}: ${n}`),this.code=t,this.name="ShortcutError";}};var X={existsSync:e=>fs.existsSync(e),readFileSync:e=>fs.readFileSync(e,"utf8"),readBinaryFileSync:e=>new Uint8Array(fs.readFileSync(e)),writeFileSync:(e,t)=>fs.writeFileSync(e,t,"utf8"),mkdirSync:e=>{fs.mkdirSync(e,{recursive:true});},unlinkSync:e=>{fs.unlinkSync(e);}},G=os.homedir;function _(e){return typeof e!="string"?void 0:e.trim()||void 0}function N(e){return _(e)?.toLowerCase()??""}function v(e){try{return fs.statSync(e).isFile()}catch{return false}}function Le(e,t){if(e===t)return true;let n=d__namespace.default.relative(e,t);return n!==""&&!n.startsWith("..")&&!d__namespace.default.isAbsolute(n)}function ke(e,t){if(d__namespace.default.basename(e)!==".bin")return false;let n=d__namespace.default.dirname(e);if(d__namespace.default.basename(n)!=="node_modules")return false;let r=d__namespace.default.dirname(n);return Le(r,t)}function U(e,t={}){if(e.includes("/")||e.includes("\\")||d__namespace.default.isAbsolute(e))return e;let n=t.platform??process.platform,r=t.env??process.env,i=d__namespace.default.resolve(t.cwd??process.cwd()),l=(t.resolution??"global_first")==="global_first",o=r.PATH??r.Path??process.env.PATH??process.env.Path??"",s=n==="win32"?";":":",a=o.split(s).map(u=>u.trim()).filter(Boolean),c=d__namespace.default.extname(e).length>0,h=r.PATHEXT??r.Pathext??process.env.PATHEXT??process.env.Pathext??".EXE;.CMD;.BAT;.COM",m=n==="win32"?c?[""]:h.split(";").map(u=>u.trim()).filter(Boolean).map(u=>u.startsWith(".")?u:`.${u}`):[""];for(let u of a){let p=d__namespace.default.resolve(i,u);if(!(l&&ke(p,i)))for(let w of m){let y=N(w),g=w.toUpperCase();for(let k of [w,y,g]){let H=d__namespace.default.join(p,`${e}${k}`);if(v(H))return H}}}return e}function _e(e){if(!v(e))return null;try{let t=fs.readFileSync(e,"utf8"),n=d__namespace.default.dirname(e),r=[];for(let s of t.matchAll(/"([^"\r\n]*)"/g)){let h=(s[1]??"").match(/%~?dp0%?\s*[\\/]*(.*)$/i)?.[1]?.trim();if(!h)continue;let m=h.replace(/[\\/]+/g,d__namespace.default.sep).replace(/^[\\/]+/,""),u=d__namespace.default.resolve(n,m);v(u)&&r.push(u);}let i=[],l=new Map;for(let s of t.matchAll(/SET\s+"(\w+)=%~?dp0%?[\\/]?([^"]+)"/gi)){let a=s[1].toUpperCase(),c=s[2].trim().replace(/[\\/]+/g,d__namespace.default.sep).replace(/^[\\/]+/,"");l.set(a,d__namespace.default.resolve(n,c));}for(let s of t.split(/\r?\n/))if(s.includes("%*"))for(let a of s.matchAll(/"%(\w+)%"/g)){let c=l.get(a[1].toUpperCase());c&&v(c)&&i.push(c);}let o=s=>s.find(a=>{let c=N(d__namespace.default.basename(a));return c!=="node.exe"&&c!=="node"})??null;return o(i)??o(r)}catch{return null}}function Ne(e,t){if(typeof t=="string")return _(t)||null;if(!t||typeof t!="object")return null;if(e){let n=t[e],r=typeof n=="string"?_(n):void 0;if(r)return r}for(let n of Object.values(t)){let r=typeof n=="string"?_(n):void 0;if(r)return r}return null}function Oe(e,t){if(!t)return null;let n=d__namespace.default.dirname(e),r=[d__namespace.default.resolve(n,"..",t),d__namespace.default.resolve(n,"node_modules",t)];for(let i of r){let l=d__namespace.default.join(i,"package.json");if(v(l))try{let o=JSON.parse(fs.readFileSync(l,"utf8")),s=Ne(t,o.bin);if(!s)continue;let a=d__namespace.default.resolve(i,s);if(v(a))return a}catch{}}return null}function be(e){let t=e.platform??process.platform,n=e.env??process.env,r=e.execPath??process.execPath,i=e.cwd,l=e.resolution;if(t!=="win32")return {command:U(e.command,{cwd:i,env:n,platform:t,resolution:l}),leadingArgv:[],resolution:"direct"};let o=U(e.command,{cwd:i,env:n,platform:t,resolution:l}),s=N(d__namespace.default.extname(o));if(s===".js"||s===".cjs"||s===".mjs")return {command:r,leadingArgv:[o],resolution:"node-entrypoint",windowsHide:true};if(s===".cmd"||s===".bat"){let a=_e(o)??Oe(o,e.packageName);return a?N(d__namespace.default.extname(a))===".exe"?{command:a,leadingArgv:[],resolution:"exe-entrypoint",windowsHide:true}:{command:r,leadingArgv:[a],resolution:"node-entrypoint",windowsHide:true}:{command:o,leadingArgv:[],resolution:"unresolved-wrapper"}}return {command:o,leadingArgv:[],resolution:"direct"}}function Ae(e){if(e.candidate.resolution!=="unresolved-wrapper")return {command:e.candidate.command,leadingArgv:e.candidate.leadingArgv,resolution:e.candidate.resolution,windowsHide:e.candidate.windowsHide};throw new Error(`${d__namespace.default.basename(e.candidate.command)} wrapper resolved, but no executable/Node entrypoint could be resolved without shell execution.`)}function J(e){let t=be(e);return Ae({candidate:t})}function K(e,t){return {command:e.command,argv:[...e.leadingArgv,...t],resolution:e.resolution,shell:e.shell,windowsHide:e.windowsHide}}var z=3e4;function De(e){if(typeof e.pid!="number"){e.kill();return}if(process.platform==="win32"){child_process.spawn("taskkill",["/pid",String(e.pid),"/t","/f"],{windowsHide:true}).on("error",()=>{});return}try{process.kill(-e.pid,"SIGKILL");}catch{e.kill("SIGKILL");}}var Q=(e,t,n={})=>new Promise((r,i)=>{let l=n.env??process.env,o=process.platform,s;try{let p=J({command:e,platform:o,env:l,cwd:n.cwd,allowShellFallback:!1});s=K(p,t);}catch(p){i(p instanceof Error?p:new Error(String(p)));return}let a=child_process.spawn(s.command,s.argv,{cwd:n.cwd,env:l,shell:s.shell,windowsHide:s.windowsHide??true,detached:o!=="win32"}),c="",h="",m=false,u=setTimeout(()=>{m||(m=true,De(a),i(new Error(`Command timed out after ${n.timeoutMs??z}ms: ${e} ${t.join(" ")}`)));},n.timeoutMs??z);a.stdout?.on("data",p=>{c+=p.toString();}),a.stderr?.on("data",p=>{h+=p.toString();}),a.on("error",p=>{m||(m=true,clearTimeout(u),i(p));}),a.on("close",p=>{m||(m=true,clearTimeout(u),r({code:p??0,stdout:c,stderr:h}));});});function Fe(){try{return (typeof D=="function"?D:module$1.createRequire(__filename)).resolve("@crewx/sdk/package.json")}catch{return null}}function Me(){let e=[Fe(),d.join(__dirname,"../../package.json"),d.join(__dirname,"../../../package.json")].filter(t=>!!t);for(let t of e)try{let n=JSON.parse(fs.readFileSync(t,"utf8"));if(n.name==="@crewx/sdk"&&n.version)return n.version}catch{}return "0.0.0"}var Z=Me();var P=d__namespace.win32;function W(e){return P.join(e,".crewx")}function te(e){return P.join(W(e),"shortcut.json")}function ne(e){return P.join(W(e),"launcher.json")}function re(e){return P.join(W(e),"bin","crewx-launcher.cmd")}function oe(e){return P.join(e,"CrewX.lnk")}function T(e,t){return P.normalize(e).toLowerCase()===P.normalize(t).toLowerCase()}var Be="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; [Environment]::GetFolderPath('DesktopDirectory')";async function se(e){try{let n=await e.run("powershell",["-NoProfile","-NonInteractive","-Command",Be],{env:e.env}),r=n.stdout.trim();if(n.code===0&&r)return {dir:r,source:"known-folder"}}catch{}let t=e.env.USERPROFILE||e.env.Userprofile||e.homedir();return t?{dir:P.join(t,"Desktop"),source:"fallback"}:null}function F(e,t){let n=P.resolve(t,"node_modules",".bin").toLowerCase();return e.split(";").filter(r=>r?P.resolve(r).toLowerCase()!==n:true).join(";")}function ie(e){return e?/\\Program Files( \(x86\))?\\/i.test(e)&&/crewx/i.test(e):false}function $e(e,t){let n=a=>{let[c,...h]=a.split("-"),m=h.join("-")||void 0;return {parts:(c??"").split(".").map(p=>Number.parseInt(p,10)||0),pre:m}},r=n(e),i=n(t),l=Math.max(r.parts.length,i.parts.length);for(let a=0;a<l;a++){let c=r.parts[a]??0,h=i.parts[a]??0;if(c!==h)return c<h?-1:1}if(r.pre===i.pre)return 0;if(!r.pre&&i.pre)return 1;if(r.pre&&!i.pre)return -1;let o=Number.parseInt(r.pre.match(/(\d+)$/)?.[1]??"",10),s=Number.parseInt(i.pre.match(/(\d+)$/)?.[1]??"",10);return !Number.isNaN(o)&&!Number.isNaN(s)&&o!==s?o<s?-1:1:r.pre<i.pre?-1:r.pre>i.pre?1:0}function C(e,t){return $e(e,t)<0}var ce=d__namespace.win32,le=1;function ue(e,t){if(!e.existsSync(t))return null;try{let n=JSON.parse(e.readFileSync(t));return {schema:n.schema??le,shortcutPath:n.shortcutPath,version:n.version,iconHash:typeof n.iconHash=="string"?n.iconHash:void 0,owned:!!n.owned,declined:!!n.declined,desktopSource:n.desktopSource,updatedAt:n.updatedAt}}catch{return null}}function O(e,t,n){let r={schema:le,...n,updatedAt:new Date().toISOString()};e.mkdirSync(ce.dirname(t)),e.writeFileSync(t,JSON.stringify(r,null,2));}function b(e,t){if(!e.existsSync(t))return null;try{let n=JSON.parse(e.readFileSync(t));return {schema:n.schema??0,binPath:n.binPath,updatedAt:n.updatedAt}}catch{return null}}function de(e,t,n){e.mkdirSync(ce.dirname(t)),e.writeFileSync(t,JSON.stringify(n,null,2));}var He=d__namespace.win32,x=1;function Ve(e){return e.replace(/%/g,"%%")}function Xe(e){return ["@echo off","setlocal DisableDelayedExpansion","chcp 65001 >nul","",'set "CREWX_WORKDIR=%USERPROFILE%\\crewx"','if not exist "%CREWX_WORKDIR%" mkdir "%CREWX_WORKDIR%" >nul 2>nul','cd /d "%CREWX_WORKDIR%"',"",'set "CREWX_PORT_EFFECTIVE=%CREWX_PORT%"','if "%CREWX_PORT_EFFECTIVE%"=="" set "CREWX_PORT_EFFECTIVE=8150"','set "CREWX_HEALTH_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/api/v1/health"','set "CREWX_ORIGIN_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/"',"",e.bakedBinPath?`set "CREWX_FALLBACK_BIN=${Ve(e.bakedBinPath)}"`:'set "CREWX_FALLBACK_BIN="','set "CREWX_RESOLVED_BIN=%CREWX_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" set "CREWX_RESOLVED_BIN=%CREWX_FALLBACK_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" (',` for /f "delims=" %%I in ('where crewx 2^>nul') do (`,' if not defined CREWX_RESOLVED_BIN set "CREWX_RESOLVED_BIN=%%I"'," )",")","",'powershell -NoProfile -NonInteractive -Command "try { $r = Invoke-WebRequest -Uri $env:CREWX_HEALTH_URL -TimeoutSec 1 -UseBasicParsing; if ($r.StatusCode -eq 200) { exit 0 } else { exit 1 } } catch { exit 1 }"',"if %ERRORLEVEL% EQU 0 (",' start "" "%CREWX_ORIGIN_URL%"'," exit /b 0",")","",'if "%CREWX_RESOLVED_BIN%"=="" ('," echo CrewX executable not found. Please reinstall the desktop shortcut."," pause"," exit /b 1",")","",'start "CrewX" /min "%CREWX_RESOLVED_BIN%"',""].join(`\r
|
|
2
|
+
`)}function fe(e){let t=b(e.fs,e.launcherManifestPath),n=!!t&&t.schema>=x&&e.fs.existsSync(e.wrapperPath),r=n&&!t.binPath&&!!e.bakedBinPath;if(n&&!r)return {wrapperPath:e.wrapperPath,wrote:false,schema:t.schema};let l=Xe({bakedBinPath:e.bakedBinPath});try{e.fs.mkdirSync(He.dirname(e.wrapperPath)),e.fs.writeFileSync(e.wrapperPath,l),de(e.fs,e.launcherManifestPath,{schema:x,binPath:e.bakedBinPath,updatedAt:new Date().toISOString()});}catch(o){throw o instanceof f?o:new f("WRITE_DENIED",`Could not write launcher wrapper: ${o instanceof Error?o.message:String(o)}`)}return {wrapperPath:e.wrapperPath,wrote:true,schema:x}}var Ge=["$ws = New-Object -ComObject WScript.Shell","$sc = $ws.CreateShortcut($env:CREWX_LNK_PATH)","$sc.TargetPath = $env:CREWX_LNK_TARGET","if ($env:CREWX_LNK_WORKDIR) { $sc.WorkingDirectory = $env:CREWX_LNK_WORKDIR }","$sc.WindowStyle = 7","if ($env:CREWX_LNK_ICON) { $sc.IconLocation = $env:CREWX_LNK_ICON }","$sc.Save()"].join("; "),Ue=["[Console]::OutputEncoding = [System.Text.Encoding]::UTF8","$ws = New-Object -ComObject WScript.Shell","$sc = $ws.CreateShortcut($env:CREWX_LNK_PATH)","[PSCustomObject]@{ TargetPath = $sc.TargetPath; WorkingDirectory = $sc.WorkingDirectory; IconLocation = $sc.IconLocation } | ConvertTo-Json -Compress"].join("; ");async function he(e){let t={...e.env,CREWX_LNK_PATH:e.shortcutPath,CREWX_LNK_TARGET:e.targetPath,CREWX_LNK_WORKDIR:e.workingDirectory??"",CREWX_LNK_ICON:e.iconPath??""},n;try{n=await e.run("powershell",["-NoProfile","-NonInteractive","-Command",Ge],{env:t});}catch(r){throw new f("POWERSHELL_UNAVAILABLE",`Could not run PowerShell: ${r instanceof Error?r.message:String(r)}`)}if(n.code!==0)throw new f("POWERSHELL_UNAVAILABLE",`Failed to create desktop shortcut: ${n.stderr||n.stdout}`)}function me(e){let t=e.trim(),n=t.lastIndexOf(",");return n!==-1&&/^-?\d+$/.test(t.slice(n+1).trim())&&(t=t.slice(0,n).trim()),t.length>=2&&t.startsWith('"')&&t.endsWith('"')&&(t=t.slice(1,-1).trim()),t}async function ge(e){try{let t={...e.env,CREWX_LNK_PATH:e.shortcutPath},n=await e.run("powershell",["-NoProfile","-NonInteractive","-Command",Ue],{env:t});if(n.code!==0||!n.stdout.trim())return null;let r=JSON.parse(n.stdout.trim());return {targetPath:r.TargetPath??"",workingDirectory:r.WorkingDirectory??"",iconLocation:r.IconLocation??""}}catch{return null}}var B=d__namespace.win32;async function I(e){let t=F(e.env.PATH??e.env.Path??"",e.cwd),n={...e.env,PATH:t,Path:t},r;try{r=await e.run("npm",["list","-g","crewx","--depth=0","--json"],{env:n});}catch{return {installed:false}}let i;try{i=JSON.parse(r.stdout||"{}");}catch{return {installed:false}}let l=i.dependencies?.crewx;if(!l?.version)return {installed:false};let o;try{let a=await e.run("npm",["prefix","-g"],{env:n});a.code===0&&(o=a.stdout.trim()||void 0);}catch{}let s=o?B.join(o,"crewx.cmd"):void 0;return {installed:true,version:l.version,binPath:s,prefix:o}}var je=/EACCES|EPERM|EROFS/,Je=/ENOTFOUND|ETIMEDOUT|ECONNREFUSED|network|registry/i,Ke=/^\d+\.\d+\.\d+/;function ze(e){return !!e&&e!=="0.0.0"&&Ke.test(e)}var M=10*6e4;async function Se(e){if(!ze(e.targetVersion))throw new f("GLOBAL_INSTALL_FAILED",`RUNNING_VERSION_UNKNOWN: cannot reliably determine the running crewx version to install (got ${JSON.stringify(e.targetVersion)}); refusing to fall back to crewx@latest`);if(e.currentInfo?.installed&&e.currentInfo.version&&!C(e.currentInfo.version,e.targetVersion))return {info:e.currentInfo};let t=F(e.env.PATH??e.env.Path??"",e.cwd),n={...e.env,PATH:t,Path:t},r=`crewx@${e.targetVersion}`;e.onProgress?.({phase:"global-install",message:`Installing crewx globally (npm install -g ${r})`});let i;try{i=await e.run("npm",["install","-g",r,"--no-audit","--no-fund"],{env:n,timeoutMs:M});}catch(o){throw new f("NPM_UNAVAILABLE",`Could not run npm: ${o instanceof Error?o.message:String(o)}`)}if(i.code===0)return {info:await I({env:n,cwd:e.cwd,run:e.run})};let l=`${i.stdout}
|
|
3
|
+
${i.stderr}`;if(je.test(l)){e.onProgress?.({phase:"global-install",message:"Permission denied \u2014 retrying with a user-scoped npm prefix"});let o=e.env.LOCALAPPDATA||B.join(e.env.USERPROFILE??"","AppData","Local"),s={...n,npm_config_prefix:B.join(o,"crewx","npm")},a;try{a=await e.run("npm",["install","-g",r,"--no-audit","--no-fund"],{env:s,timeoutMs:M});}catch(c){throw new f("NPM_PERMISSION_DENIED",`Retry with user-scoped prefix failed: ${c instanceof Error?c.message:String(c)}`)}if(a.code===0)return {info:await I({env:s,cwd:e.cwd,run:e.run})};throw new f("NPM_PERMISSION_DENIED",`npm install -g failed after user-scoped prefix retry: ${a.stderr||a.stdout}`)}if(Je.test(l)){if(!e.installRoot)throw new f("OFFLINE_NO_SOURCE","The npm registry is unreachable and no local installRoot was provided for an offline install");e.onProgress?.({phase:"global-install",message:`Registry unreachable \u2014 installing offline from ${e.installRoot}`});let o;try{o=await e.run("npm",["install","-g",e.installRoot,"--offline","--no-audit","--no-fund"],{env:n,timeoutMs:M});}catch(s){throw new f("GLOBAL_INSTALL_FAILED",`Offline install failed: ${s instanceof Error?s.message:String(s)}`)}if(o.code===0)return {info:await I({env:n,cwd:e.cwd,run:e.run})};throw new f("GLOBAL_INSTALL_FAILED",`Offline install failed: ${o.stderr||o.stdout}`)}throw new f("GLOBAL_INSTALL_FAILED",l.trim()||`npm install -g ${r} failed`)}function Qe(e){return e.run??Q}function Ye(e){return e.fs??X}async function A(e){let t=e.platform??process.platform,n=e.env??process.env,r=e.homedir??G,i=Qe(e),l=Ye(e),o=e.runningVersion??Z,s=e.cwd??process.cwd(),a=r(),c=te(a),h=ne(a),m=re(a),u=null;t==="win32"&&(u=await se({env:n,homedir:r,run:i}));let p=u?oe(u.dir):null;return {platform:t,env:n,homedir:r,run:i,fs:l,runningVersion:o,cwd:s,installRoot:e.installRoot,shortcutManifestPath:c,launcherManifestPath:h,wrapperPath:m,desktop:u,shortcutPath:p}}function Pe(e){return e?d__namespace.win32.normalize(e).toLowerCase().endsWith(`${d__namespace.win32.sep}bin${d__namespace.win32.sep}crewx.ico`):false}function $(e,t){let n=e.readBinaryFileSync;if(n)try{return crypto.createHash("sha256").update(n(t)).digest("hex")}catch{return}}async function Ze(e){try{await e.run("ie4uinit.exe",["-show"],{env:e.env});}catch{}}async function E(e){if(e.platform!=="win32")return {supported:false,state:"unsupported",globalCrewx:null,runningVersion:e.runningVersion,errors:[],manifest:null,iconStale:false};let t=[];e.desktop||t.push("NO_DESKTOP_DIR: could not resolve the Windows Desktop directory");let n=ue(e.fs,e.shortcutManifestPath),r=b(e.fs,e.launcherManifestPath),i=await I({env:e.env,cwd:e.cwd,run:e.run}),l=e.shortcutPath?e.fs.existsSync(e.shortcutPath):false,o,s=false,a,c;if(!l)o=n?.declined?"declined":"not-installed";else {let h=!!n?.owned&&!!e.shortcutPath&&n.shortcutPath===e.shortcutPath,m=false,u=e.shortcutPath?await ge({run:e.run,env:e.env,shortcutPath:e.shortcutPath}):null;if(h||(u&&T(u.targetPath,e.wrapperPath)?h=true:u&&ie(u.targetPath)&&(m=true)),m)o="foreign",t.push("NSIS_PRESENT: an NSIS-installed CrewX shortcut was detected");else if(!h)o="foreign";else if(n?.version&&C(e.runningVersion,n.version))o="superseded",t.push(`SUPERSEDED: running version ${e.runningVersion} is older than the installed shortcut's version ${n.version}; refusing to modify it`);else {let p=!r||r.schema<x||!e.fs.existsSync(e.wrapperPath);if(u){let w=me(u.iconLocation);if(!(!!w&&e.fs.existsSync(w)))s=true;else {a=w;let g=Ee(i,e.fs);g?T(w,g)?(c=$(e.fs,w),s=!c||n?.iconHash!==c):s=true:Pe(w)?(c=$(e.fs,w),s=!c||n?.iconHash!==c):s=true;}}o=p||s?"stale":"installed";}}return {supported:true,state:o,shortcutPath:e.shortcutPath??void 0,desktopDir:e.desktop?.dir,desktopSource:e.desktop?.source,wrapperPath:e.wrapperPath,wrapperSchema:r?.schema,globalCrewx:i.installed?i:{installed:false},runningVersion:e.runningVersion,errors:t,manifest:n,iconStale:s,iconPath:a,iconHash:c}}function Ee(e,t){if(!e?.installed||!e.prefix)return;let n=d__namespace.win32.join(e.prefix,"node_modules","crewx","bin","crewx.ico");return t.existsSync(n)?n:void 0}function R(e){let{manifest:t,iconStale:n,iconPath:r,iconHash:i,...l}=e;return l}async function et(e={}){let t=await A(e),n=await E(t);return R(n)}async function tt(e={}){let t=await A(e);e.onProgress?.({phase:"detect",message:"Checking current shortcut status"});let n=await E(t),r=R(n);if(!r.supported)return {...r,changed:false,installedGlobal:false};if(r.state==="superseded")return {...r,changed:false,installedGlobal:false};if(r.state==="foreign"){if(n.errors.some(g=>g.startsWith("NSIS_PRESENT")))throw new f("NSIS_PRESENT",`An NSIS-installed CrewX shortcut was detected at ${r.shortcutPath}`);if(!e.force)throw new f("FOREIGN_SHORTCUT",`An existing shortcut at ${r.shortcutPath} is not managed by CrewX`)}if(!t.desktop||!t.shortcutPath)throw new f("NO_DESKTOP_DIR","Could not resolve the Windows Desktop directory");let i=false,l=false,o=r.globalCrewx,s=[],a=n.manifest?.iconHash,c=false;if(!!o?.installed&&!!o.version&&C(o.version,t.runningVersion)||!o?.installed&&r.state!=="installed"){let g=await Se({env:t.env,cwd:t.cwd,run:t.run,targetVersion:t.runningVersion,currentInfo:o??void 0,installRoot:t.installRoot,onProgress:e.onProgress});o=g.info,l=g.info.installed,i=true,l||s.push(`GLOBAL_INSTALL_UNCONFIRMED: npm install -g crewx@${t.runningVersion} exited successfully but a follow-up check could not confirm the global install`);}if(e.onProgress?.({phase:"wrapper",message:"Ensuring launcher wrapper"}),fe({fs:t.fs,wrapperPath:t.wrapperPath,launcherManifestPath:t.launcherManifestPath,bakedBinPath:o?.binPath}).wrote&&(i=true),!((r.state==="installed"||r.state==="stale")&&!n.iconStale)){let g=Ee(o,t.fs)??(n.iconPath&&Pe(n.iconPath)&&t.fs.existsSync(n.iconPath)?n.iconPath:void 0);if(n.iconStale&&!g)throw new f("ICON_UNAVAILABLE",`Could not locate the global CrewX icon (bin\\crewx.ico) to repair the desktop shortcut at ${t.shortcutPath}; the existing shortcut was left untouched`);e.onProgress?.({phase:"lnk",message:"Creating desktop shortcut"}),await he({run:t.run,env:t.env,shortcutPath:t.shortcutPath,targetPath:t.wrapperPath,iconPath:g}),i=true,c=n.iconStale;let k=g?$(t.fs,g):void 0;k&&(a=k);}i&&O(t.fs,t.shortcutManifestPath,{shortcutPath:t.shortcutPath,version:t.runningVersion,owned:true,declined:false,desktopSource:t.desktop.source,iconHash:a}),c&&await Ze(t);let w=await E(t),y=R(w);return {...y,errors:[...y.errors,...s],changed:i,installedGlobal:l}}async function nt(e={}){let t=await A(e),n=await E(t),r=R(n);if(!r.supported)return r;if((r.state==="installed"||r.state==="stale")&&t.shortcutPath)try{t.fs.unlinkSync(t.shortcutPath);}catch{}O(t.fs,t.shortcutManifestPath,{shortcutPath:void 0,version:n.manifest?.version,owned:false,declined:true,desktopSource:void 0,iconHash:void 0});let i=await E(t);return R(i)}async function rt(e={}){let t=await A(e),n=await E(t),r=R(n);if(!r.supported)return r;O(t.fs,t.shortcutManifestPath,{shortcutPath:n.manifest?.shortcutPath,version:n.manifest?.version,owned:n.manifest?.owned??false,declined:true,desktopSource:n.manifest?.desktopSource,iconHash:n.manifest?.iconHash});let i=await E(t);return R(i)}exports.ShortcutError=f;exports.dismissShortcutNotice=rt;exports.getShortcutStatus=et;exports.installShortcut=tt;exports.uninstallShortcut=nt;
|
package/dist/desktop/types.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ export type CommandRunner = (command: string, args: string[], opts?: CommandRunO
|
|
|
41
41
|
export interface ShortcutFsLike {
|
|
42
42
|
existsSync(path: string): boolean;
|
|
43
43
|
readFileSync(path: string): string;
|
|
44
|
+
readBinaryFileSync?: (path: string) => Uint8Array;
|
|
44
45
|
writeFileSync(path: string, data: string): void;
|
|
45
46
|
mkdirSync(path: string): void;
|
|
46
47
|
unlinkSync(path: string): void;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import*as d from'path';import d__default,{join}from'path';import {fileURLToPath}from'url';import {readFileSync,unlinkSync,mkdirSync,writeFileSync,existsSync,statSync}from'fs';import {homedir}from'os';import {spawn}from'child_process';import {createRequire}from'module';var b=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var $=()=>fileURLToPath(import.meta.url),vt=()=>d__default.dirname($()),w=vt(),S=$();var f=class extends Error{code;constructor(e,n){super(`${e}: ${n}`),this.code=e,this.name="ShortcutError";}};var V={existsSync:t=>existsSync(t),readFileSync:t=>readFileSync(t,"utf8"),writeFileSync:(t,e)=>writeFileSync(t,e,"utf8"),mkdirSync:t=>{mkdirSync(t,{recursive:true});},unlinkSync:t=>{unlinkSync(t);}},B=homedir;function k(t){return typeof t!="string"?void 0:t.trim()||void 0}function I(t){return k(t)?.toLowerCase()??""}function v(t){try{return statSync(t).isFile()}catch{return false}}function _t(t,e){if(t===e)return true;let n=d__default.relative(t,e);return n!==""&&!n.startsWith("..")&&!d__default.isAbsolute(n)}function Ot(t,e){if(d__default.basename(t)!==".bin")return false;let n=d__default.dirname(t);if(d__default.basename(n)!=="node_modules")return false;let r=d__default.dirname(n);return _t(r,e)}function X(t,e={}){if(t.includes("/")||t.includes("\\")||d__default.isAbsolute(t))return t;let n=e.platform??process.platform,r=e.env??process.env,s=d__default.resolve(e.cwd??process.cwd()),c=(e.resolution??"global_first")==="global_first",o=r.PATH??r.Path??process.env.PATH??process.env.Path??"",i=n==="win32"?";":":",a=o.split(i).map(u=>u.trim()).filter(Boolean),l=d__default.extname(t).length>0,h=r.PATHEXT??r.Pathext??process.env.PATHEXT??process.env.Pathext??".EXE;.CMD;.BAT;.COM",m=n==="win32"?l?[""]:h.split(";").map(u=>u.trim()).filter(Boolean).map(u=>u.startsWith(".")?u:`.${u}`):[""];for(let u of a){let p=d__default.resolve(s,u);if(!(c&&Ot(p,s)))for(let g of m){let wt=I(g),St=g.toUpperCase();for(let Pt of [g,wt,St]){let F=d__default.join(p,`${t}${Pt}`);if(v(F))return F}}}return t}function bt(t){if(!v(t))return null;try{let e=readFileSync(t,"utf8"),n=d__default.dirname(t),r=[];for(let i of e.matchAll(/"([^"\r\n]*)"/g)){let h=(i[1]??"").match(/%~?dp0%?\s*[\\/]*(.*)$/i)?.[1]?.trim();if(!h)continue;let m=h.replace(/[\\/]+/g,d__default.sep).replace(/^[\\/]+/,""),u=d__default.resolve(n,m);v(u)&&r.push(u);}let s=[],c=new Map;for(let i of e.matchAll(/SET\s+"(\w+)=%~?dp0%?[\\/]?([^"]+)"/gi)){let a=i[1].toUpperCase(),l=i[2].trim().replace(/[\\/]+/g,d__default.sep).replace(/^[\\/]+/,"");c.set(a,d__default.resolve(n,l));}for(let i of e.split(/\r?\n/))if(i.includes("%*"))for(let a of i.matchAll(/"%(\w+)%"/g)){let l=c.get(a[1].toUpperCase());l&&v(l)&&s.push(l);}let o=i=>i.find(a=>{let l=I(d__default.basename(a));return l!=="node.exe"&&l!=="node"})??null;return o(s)??o(r)}catch{return null}}function Dt(t,e){if(typeof e=="string")return k(e)||null;if(!e||typeof e!="object")return null;if(t){let n=e[t],r=typeof n=="string"?k(n):void 0;if(r)return r}for(let n of Object.values(e)){let r=typeof n=="string"?k(n):void 0;if(r)return r}return null}function At(t,e){if(!e)return null;let n=d__default.dirname(t),r=[d__default.resolve(n,"..",e),d__default.resolve(n,"node_modules",e)];for(let s of r){let c=d__default.join(s,"package.json");if(v(c))try{let o=JSON.parse(readFileSync(c,"utf8")),i=Dt(e,o.bin);if(!i)continue;let a=d__default.resolve(s,i);if(v(a))return a}catch{}}return null}function Wt(t){let e=t.platform??process.platform,n=t.env??process.env,r=t.execPath??process.execPath,s=t.cwd,c=t.resolution;if(e!=="win32")return {command:X(t.command,{cwd:s,env:n,platform:e,resolution:c}),leadingArgv:[],resolution:"direct"};let o=X(t.command,{cwd:s,env:n,platform:e,resolution:c}),i=I(d__default.extname(o));if(i===".js"||i===".cjs"||i===".mjs")return {command:r,leadingArgv:[o],resolution:"node-entrypoint",windowsHide:true};if(i===".cmd"||i===".bat"){let a=bt(o)??At(o,t.packageName);return a?I(d__default.extname(a))===".exe"?{command:a,leadingArgv:[],resolution:"exe-entrypoint",windowsHide:true}:{command:r,leadingArgv:[a],resolution:"node-entrypoint",windowsHide:true}:{command:o,leadingArgv:[],resolution:"unresolved-wrapper"}}return {command:o,leadingArgv:[],resolution:"direct"}}function Tt(t){if(t.candidate.resolution!=="unresolved-wrapper")return {command:t.candidate.command,leadingArgv:t.candidate.leadingArgv,resolution:t.candidate.resolution,windowsHide:t.candidate.windowsHide};throw new Error(`${d__default.basename(t.candidate.command)} wrapper resolved, but no executable/Node entrypoint could be resolved without shell execution.`)}function G(t){let e=Wt(t);return Tt({candidate:e})}function U(t,e){return {command:t.command,argv:[...t.leadingArgv,...e],resolution:t.resolution,shell:t.shell,windowsHide:t.windowsHide}}var j=3e4;function Mt(t){if(typeof t.pid!="number"){t.kill();return}if(process.platform==="win32"){spawn("taskkill",["/pid",String(t.pid),"/t","/f"],{windowsHide:true}).on("error",()=>{});return}try{process.kill(-t.pid,"SIGKILL");}catch{t.kill("SIGKILL");}}var K=(t,e,n={})=>new Promise((r,s)=>{let c=n.env??process.env,o=process.platform,i;try{let p=G({command:t,platform:o,env:c,cwd:n.cwd,allowShellFallback:!1});i=U(p,e);}catch(p){s(p instanceof Error?p:new Error(String(p)));return}let a=spawn(i.command,i.argv,{cwd:n.cwd,env:c,shell:i.shell,windowsHide:i.windowsHide??true,detached:o!=="win32"}),l="",h="",m=false,u=setTimeout(()=>{m||(m=true,Mt(a),s(new Error(`Command timed out after ${n.timeoutMs??j}ms: ${t} ${e.join(" ")}`)));},n.timeoutMs??j);a.stdout?.on("data",p=>{l+=p.toString();}),a.stderr?.on("data",p=>{h+=p.toString();}),a.on("error",p=>{m||(m=true,clearTimeout(u),s(p));}),a.on("close",p=>{m||(m=true,clearTimeout(u),r({code:p??0,stdout:l,stderr:h}));});});function Vt(){try{return (typeof b=="function"?b:createRequire(S)).resolve("@crewx/sdk/package.json")}catch{return null}}function Bt(){let t=[Vt(),join(w,"../../package.json"),join(w,"../../../package.json")].filter(e=>!!e);for(let e of t)try{let n=JSON.parse(readFileSync(e,"utf8"));if(n.name==="@crewx/sdk"&&n.version)return n.version}catch{}return "0.0.0"}var q=Bt();var P=d.win32;function D(t){return P.join(t,".crewx")}function Y(t){return P.join(D(t),"shortcut.json")}function Z(t){return P.join(D(t),"launcher.json")}function tt(t){return P.join(D(t),"bin","crewx-launcher.cmd")}function et(t){return P.join(t,"CrewX.lnk")}function A(t,e){return P.normalize(t).toLowerCase()===P.normalize(e).toLowerCase()}var Xt="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; [Environment]::GetFolderPath('DesktopDirectory')";async function nt(t){try{let n=await t.run("powershell",["-NoProfile","-NonInteractive","-Command",Xt],{env:t.env}),r=n.stdout.trim();if(n.code===0&&r)return {dir:r,source:"known-folder"}}catch{}let e=t.env.USERPROFILE||t.env.Userprofile||t.homedir();return e?{dir:P.join(e,"Desktop"),source:"fallback"}:null}function W(t,e){let n=P.resolve(e,"node_modules",".bin").toLowerCase();return t.split(";").filter(r=>r?P.resolve(r).toLowerCase()!==n:true).join(";")}function rt(t){return t?/\\Program Files( \(x86\))?\\/i.test(t)&&/crewx/i.test(t):false}function Ht(t,e){let n=a=>{let[l,...h]=a.split("-"),m=h.join("-")||void 0;return {parts:(l??"").split(".").map(p=>Number.parseInt(p,10)||0),pre:m}},r=n(t),s=n(e),c=Math.max(r.parts.length,s.parts.length);for(let a=0;a<c;a++){let l=r.parts[a]??0,h=s.parts[a]??0;if(l!==h)return l<h?-1:1}if(r.pre===s.pre)return 0;if(!r.pre&&s.pre)return 1;if(r.pre&&!s.pre)return -1;let o=Number.parseInt(r.pre.match(/(\d+)$/)?.[1]??"",10),i=Number.parseInt(s.pre.match(/(\d+)$/)?.[1]??"",10);return !Number.isNaN(o)&&!Number.isNaN(i)&&o!==i?o<i?-1:1:r.pre<s.pre?-1:r.pre>s.pre?1:0}function y(t,e){return Ht(t,e)<0}var st=d.win32,it=1;function at(t,e){if(!t.existsSync(e))return null;try{let n=JSON.parse(t.readFileSync(e));return {schema:n.schema??it,shortcutPath:n.shortcutPath,version:n.version,owned:!!n.owned,declined:!!n.declined,desktopSource:n.desktopSource,updatedAt:n.updatedAt}}catch{return null}}function N(t,e,n){let r={schema:it,...n,updatedAt:new Date().toISOString()};t.mkdirSync(st.dirname(e)),t.writeFileSync(e,JSON.stringify(r,null,2));}function _(t,e){if(!t.existsSync(e))return null;try{let n=JSON.parse(t.readFileSync(e));return {schema:n.schema??0,binPath:n.binPath,updatedAt:n.updatedAt}}catch{return null}}function ct(t,e,n){t.mkdirSync(st.dirname(e)),t.writeFileSync(e,JSON.stringify(n,null,2));}var Gt=d.win32,x=1;function Ut(t){return t.replace(/%/g,"%%")}function jt(t){return ["@echo off","setlocal DisableDelayedExpansion","chcp 65001 >nul","",'set "CREWX_WORKDIR=%USERPROFILE%\\crewx"','if not exist "%CREWX_WORKDIR%" mkdir "%CREWX_WORKDIR%" >nul 2>nul','cd /d "%CREWX_WORKDIR%"',"",'set "CREWX_PORT_EFFECTIVE=%CREWX_PORT%"','if "%CREWX_PORT_EFFECTIVE%"=="" set "CREWX_PORT_EFFECTIVE=8150"','set "CREWX_HEALTH_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/api/v1/health"','set "CREWX_ORIGIN_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/"',"",t.bakedBinPath?`set "CREWX_FALLBACK_BIN=${Ut(t.bakedBinPath)}"`:'set "CREWX_FALLBACK_BIN="','set "CREWX_RESOLVED_BIN=%CREWX_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" set "CREWX_RESOLVED_BIN=%CREWX_FALLBACK_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" (',` for /f "delims=" %%I in ('where crewx 2^>nul') do (`,' if not defined CREWX_RESOLVED_BIN set "CREWX_RESOLVED_BIN=%%I"'," )",")","",'powershell -NoProfile -NonInteractive -Command "try { $r = Invoke-WebRequest -Uri $env:CREWX_HEALTH_URL -TimeoutSec 1 -UseBasicParsing; if ($r.StatusCode -eq 200) { exit 0 } else { exit 1 } } catch { exit 1 }"',"if %ERRORLEVEL% EQU 0 (",' start "" "%CREWX_ORIGIN_URL%"'," exit /b 0",")","",'if "%CREWX_RESOLVED_BIN%"=="" ('," echo CrewX executable not found. Please reinstall the desktop shortcut."," pause"," exit /b 1",")","",'start "CrewX" /min "%CREWX_RESOLVED_BIN%"',""].join(`\r
|
|
2
|
-
`)}function
|
|
3
|
-
${
|
|
1
|
+
import*as d from'path';import d__default,{join}from'path';import {fileURLToPath}from'url';import {createHash}from'crypto';import {readFileSync,unlinkSync,mkdirSync,writeFileSync,existsSync,statSync}from'fs';import {homedir}from'os';import {spawn}from'child_process';import {createRequire}from'module';var W=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var X=()=>fileURLToPath(import.meta.url),xe=()=>d__default.dirname(X()),w=xe(),P=X();var f=class extends Error{code;constructor(t,n){super(`${t}: ${n}`),this.code=t,this.name="ShortcutError";}};var U={existsSync:e=>existsSync(e),readFileSync:e=>readFileSync(e,"utf8"),readBinaryFileSync:e=>new Uint8Array(readFileSync(e)),writeFileSync:(e,t)=>writeFileSync(e,t,"utf8"),mkdirSync:e=>{mkdirSync(e,{recursive:true});},unlinkSync:e=>{unlinkSync(e);}},j=homedir;function N(e){return typeof e!="string"?void 0:e.trim()||void 0}function O(e){return N(e)?.toLowerCase()??""}function y(e){try{return statSync(e).isFile()}catch{return false}}function be(e,t){if(e===t)return true;let n=d__default.relative(e,t);return n!==""&&!n.startsWith("..")&&!d__default.isAbsolute(n)}function Ae(e,t){if(d__default.basename(e)!==".bin")return false;let n=d__default.dirname(e);if(d__default.basename(n)!=="node_modules")return false;let r=d__default.dirname(n);return be(r,t)}function J(e,t={}){if(e.includes("/")||e.includes("\\")||d__default.isAbsolute(e))return e;let n=t.platform??process.platform,r=t.env??process.env,i=d__default.resolve(t.cwd??process.cwd()),l=(t.resolution??"global_first")==="global_first",o=r.PATH??r.Path??process.env.PATH??process.env.Path??"",s=n==="win32"?";":":",a=o.split(s).map(u=>u.trim()).filter(Boolean),c=d__default.extname(e).length>0,h=r.PATHEXT??r.Pathext??process.env.PATHEXT??process.env.Pathext??".EXE;.CMD;.BAT;.COM",m=n==="win32"?c?[""]:h.split(";").map(u=>u.trim()).filter(Boolean).map(u=>u.startsWith(".")?u:`.${u}`):[""];for(let u of a){let p=d__default.resolve(i,u);if(!(l&&Ae(p,i)))for(let S of m){let C=O(S),g=S.toUpperCase();for(let _ of [S,C,g]){let V=d__default.join(p,`${e}${_}`);if(y(V))return V}}}return e}function De(e){if(!y(e))return null;try{let t=readFileSync(e,"utf8"),n=d__default.dirname(e),r=[];for(let s of t.matchAll(/"([^"\r\n]*)"/g)){let h=(s[1]??"").match(/%~?dp0%?\s*[\\/]*(.*)$/i)?.[1]?.trim();if(!h)continue;let m=h.replace(/[\\/]+/g,d__default.sep).replace(/^[\\/]+/,""),u=d__default.resolve(n,m);y(u)&&r.push(u);}let i=[],l=new Map;for(let s of t.matchAll(/SET\s+"(\w+)=%~?dp0%?[\\/]?([^"]+)"/gi)){let a=s[1].toUpperCase(),c=s[2].trim().replace(/[\\/]+/g,d__default.sep).replace(/^[\\/]+/,"");l.set(a,d__default.resolve(n,c));}for(let s of t.split(/\r?\n/))if(s.includes("%*"))for(let a of s.matchAll(/"%(\w+)%"/g)){let c=l.get(a[1].toUpperCase());c&&y(c)&&i.push(c);}let o=s=>s.find(a=>{let c=O(d__default.basename(a));return c!=="node.exe"&&c!=="node"})??null;return o(i)??o(r)}catch{return null}}function We(e,t){if(typeof t=="string")return N(t)||null;if(!t||typeof t!="object")return null;if(e){let n=t[e],r=typeof n=="string"?N(n):void 0;if(r)return r}for(let n of Object.values(t)){let r=typeof n=="string"?N(n):void 0;if(r)return r}return null}function Te(e,t){if(!t)return null;let n=d__default.dirname(e),r=[d__default.resolve(n,"..",t),d__default.resolve(n,"node_modules",t)];for(let i of r){let l=d__default.join(i,"package.json");if(y(l))try{let o=JSON.parse(readFileSync(l,"utf8")),s=We(t,o.bin);if(!s)continue;let a=d__default.resolve(i,s);if(y(a))return a}catch{}}return null}function Fe(e){let t=e.platform??process.platform,n=e.env??process.env,r=e.execPath??process.execPath,i=e.cwd,l=e.resolution;if(t!=="win32")return {command:J(e.command,{cwd:i,env:n,platform:t,resolution:l}),leadingArgv:[],resolution:"direct"};let o=J(e.command,{cwd:i,env:n,platform:t,resolution:l}),s=O(d__default.extname(o));if(s===".js"||s===".cjs"||s===".mjs")return {command:r,leadingArgv:[o],resolution:"node-entrypoint",windowsHide:true};if(s===".cmd"||s===".bat"){let a=De(o)??Te(o,e.packageName);return a?O(d__default.extname(a))===".exe"?{command:a,leadingArgv:[],resolution:"exe-entrypoint",windowsHide:true}:{command:r,leadingArgv:[a],resolution:"node-entrypoint",windowsHide:true}:{command:o,leadingArgv:[],resolution:"unresolved-wrapper"}}return {command:o,leadingArgv:[],resolution:"direct"}}function Me(e){if(e.candidate.resolution!=="unresolved-wrapper")return {command:e.candidate.command,leadingArgv:e.candidate.leadingArgv,resolution:e.candidate.resolution,windowsHide:e.candidate.windowsHide};throw new Error(`${d__default.basename(e.candidate.command)} wrapper resolved, but no executable/Node entrypoint could be resolved without shell execution.`)}function z(e){let t=Fe(e);return Me({candidate:t})}function q(e,t){return {command:e.command,argv:[...e.leadingArgv,...t],resolution:e.resolution,shell:e.shell,windowsHide:e.windowsHide}}var Q=3e4;function Be(e){if(typeof e.pid!="number"){e.kill();return}if(process.platform==="win32"){spawn("taskkill",["/pid",String(e.pid),"/t","/f"],{windowsHide:true}).on("error",()=>{});return}try{process.kill(-e.pid,"SIGKILL");}catch{e.kill("SIGKILL");}}var Z=(e,t,n={})=>new Promise((r,i)=>{let l=n.env??process.env,o=process.platform,s;try{let p=z({command:e,platform:o,env:l,cwd:n.cwd,allowShellFallback:!1});s=q(p,t);}catch(p){i(p instanceof Error?p:new Error(String(p)));return}let a=spawn(s.command,s.argv,{cwd:n.cwd,env:l,shell:s.shell,windowsHide:s.windowsHide??true,detached:o!=="win32"}),c="",h="",m=false,u=setTimeout(()=>{m||(m=true,Be(a),i(new Error(`Command timed out after ${n.timeoutMs??Q}ms: ${e} ${t.join(" ")}`)));},n.timeoutMs??Q);a.stdout?.on("data",p=>{c+=p.toString();}),a.stderr?.on("data",p=>{h+=p.toString();}),a.on("error",p=>{m||(m=true,clearTimeout(u),i(p));}),a.on("close",p=>{m||(m=true,clearTimeout(u),r({code:p??0,stdout:c,stderr:h}));});});function Ve(){try{return (typeof W=="function"?W:createRequire(P)).resolve("@crewx/sdk/package.json")}catch{return null}}function Xe(){let e=[Ve(),join(w,"../../package.json"),join(w,"../../../package.json")].filter(t=>!!t);for(let t of e)try{let n=JSON.parse(readFileSync(t,"utf8"));if(n.name==="@crewx/sdk"&&n.version)return n.version}catch{}return "0.0.0"}var te=Xe();var E=d.win32;function T(e){return E.join(e,".crewx")}function re(e){return E.join(T(e),"shortcut.json")}function oe(e){return E.join(T(e),"launcher.json")}function se(e){return E.join(T(e),"bin","crewx-launcher.cmd")}function ie(e){return E.join(e,"CrewX.lnk")}function F(e,t){return E.normalize(e).toLowerCase()===E.normalize(t).toLowerCase()}var Ge="[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; [Environment]::GetFolderPath('DesktopDirectory')";async function ae(e){try{let n=await e.run("powershell",["-NoProfile","-NonInteractive","-Command",Ge],{env:e.env}),r=n.stdout.trim();if(n.code===0&&r)return {dir:r,source:"known-folder"}}catch{}let t=e.env.USERPROFILE||e.env.Userprofile||e.homedir();return t?{dir:E.join(t,"Desktop"),source:"fallback"}:null}function M(e,t){let n=E.resolve(t,"node_modules",".bin").toLowerCase();return e.split(";").filter(r=>r?E.resolve(r).toLowerCase()!==n:true).join(";")}function ce(e){return e?/\\Program Files( \(x86\))?\\/i.test(e)&&/crewx/i.test(e):false}function Ue(e,t){let n=a=>{let[c,...h]=a.split("-"),m=h.join("-")||void 0;return {parts:(c??"").split(".").map(p=>Number.parseInt(p,10)||0),pre:m}},r=n(e),i=n(t),l=Math.max(r.parts.length,i.parts.length);for(let a=0;a<l;a++){let c=r.parts[a]??0,h=i.parts[a]??0;if(c!==h)return c<h?-1:1}if(r.pre===i.pre)return 0;if(!r.pre&&i.pre)return 1;if(r.pre&&!i.pre)return -1;let o=Number.parseInt(r.pre.match(/(\d+)$/)?.[1]??"",10),s=Number.parseInt(i.pre.match(/(\d+)$/)?.[1]??"",10);return !Number.isNaN(o)&&!Number.isNaN(s)&&o!==s?o<s?-1:1:r.pre<i.pre?-1:r.pre>i.pre?1:0}function x(e,t){return Ue(e,t)<0}var ue=d.win32,de=1;function pe(e,t){if(!e.existsSync(t))return null;try{let n=JSON.parse(e.readFileSync(t));return {schema:n.schema??de,shortcutPath:n.shortcutPath,version:n.version,iconHash:typeof n.iconHash=="string"?n.iconHash:void 0,owned:!!n.owned,declined:!!n.declined,desktopSource:n.desktopSource,updatedAt:n.updatedAt}}catch{return null}}function b(e,t,n){let r={schema:de,...n,updatedAt:new Date().toISOString()};e.mkdirSync(ue.dirname(t)),e.writeFileSync(t,JSON.stringify(r,null,2));}function A(e,t){if(!e.existsSync(t))return null;try{let n=JSON.parse(e.readFileSync(t));return {schema:n.schema??0,binPath:n.binPath,updatedAt:n.updatedAt}}catch{return null}}function fe(e,t,n){e.mkdirSync(ue.dirname(t)),e.writeFileSync(t,JSON.stringify(n,null,2));}var je=d.win32,L=1;function Je(e){return e.replace(/%/g,"%%")}function Ke(e){return ["@echo off","setlocal DisableDelayedExpansion","chcp 65001 >nul","",'set "CREWX_WORKDIR=%USERPROFILE%\\crewx"','if not exist "%CREWX_WORKDIR%" mkdir "%CREWX_WORKDIR%" >nul 2>nul','cd /d "%CREWX_WORKDIR%"',"",'set "CREWX_PORT_EFFECTIVE=%CREWX_PORT%"','if "%CREWX_PORT_EFFECTIVE%"=="" set "CREWX_PORT_EFFECTIVE=8150"','set "CREWX_HEALTH_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/api/v1/health"','set "CREWX_ORIGIN_URL=http://127.0.0.1:%CREWX_PORT_EFFECTIVE%/"',"",e.bakedBinPath?`set "CREWX_FALLBACK_BIN=${Je(e.bakedBinPath)}"`:'set "CREWX_FALLBACK_BIN="','set "CREWX_RESOLVED_BIN=%CREWX_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" set "CREWX_RESOLVED_BIN=%CREWX_FALLBACK_BIN%"','if "%CREWX_RESOLVED_BIN%"=="" (',` for /f "delims=" %%I in ('where crewx 2^>nul') do (`,' if not defined CREWX_RESOLVED_BIN set "CREWX_RESOLVED_BIN=%%I"'," )",")","",'powershell -NoProfile -NonInteractive -Command "try { $r = Invoke-WebRequest -Uri $env:CREWX_HEALTH_URL -TimeoutSec 1 -UseBasicParsing; if ($r.StatusCode -eq 200) { exit 0 } else { exit 1 } } catch { exit 1 }"',"if %ERRORLEVEL% EQU 0 (",' start "" "%CREWX_ORIGIN_URL%"'," exit /b 0",")","",'if "%CREWX_RESOLVED_BIN%"=="" ('," echo CrewX executable not found. Please reinstall the desktop shortcut."," pause"," exit /b 1",")","",'start "CrewX" /min "%CREWX_RESOLVED_BIN%"',""].join(`\r
|
|
2
|
+
`)}function me(e){let t=A(e.fs,e.launcherManifestPath),n=!!t&&t.schema>=L&&e.fs.existsSync(e.wrapperPath),r=n&&!t.binPath&&!!e.bakedBinPath;if(n&&!r)return {wrapperPath:e.wrapperPath,wrote:false,schema:t.schema};let l=Ke({bakedBinPath:e.bakedBinPath});try{e.fs.mkdirSync(je.dirname(e.wrapperPath)),e.fs.writeFileSync(e.wrapperPath,l),fe(e.fs,e.launcherManifestPath,{schema:L,binPath:e.bakedBinPath,updatedAt:new Date().toISOString()});}catch(o){throw o instanceof f?o:new f("WRITE_DENIED",`Could not write launcher wrapper: ${o instanceof Error?o.message:String(o)}`)}return {wrapperPath:e.wrapperPath,wrote:true,schema:L}}var ze=["$ws = New-Object -ComObject WScript.Shell","$sc = $ws.CreateShortcut($env:CREWX_LNK_PATH)","$sc.TargetPath = $env:CREWX_LNK_TARGET","if ($env:CREWX_LNK_WORKDIR) { $sc.WorkingDirectory = $env:CREWX_LNK_WORKDIR }","$sc.WindowStyle = 7","if ($env:CREWX_LNK_ICON) { $sc.IconLocation = $env:CREWX_LNK_ICON }","$sc.Save()"].join("; "),qe=["[Console]::OutputEncoding = [System.Text.Encoding]::UTF8","$ws = New-Object -ComObject WScript.Shell","$sc = $ws.CreateShortcut($env:CREWX_LNK_PATH)","[PSCustomObject]@{ TargetPath = $sc.TargetPath; WorkingDirectory = $sc.WorkingDirectory; IconLocation = $sc.IconLocation } | ConvertTo-Json -Compress"].join("; ");async function ge(e){let t={...e.env,CREWX_LNK_PATH:e.shortcutPath,CREWX_LNK_TARGET:e.targetPath,CREWX_LNK_WORKDIR:e.workingDirectory??"",CREWX_LNK_ICON:e.iconPath??""},n;try{n=await e.run("powershell",["-NoProfile","-NonInteractive","-Command",ze],{env:t});}catch(r){throw new f("POWERSHELL_UNAVAILABLE",`Could not run PowerShell: ${r instanceof Error?r.message:String(r)}`)}if(n.code!==0)throw new f("POWERSHELL_UNAVAILABLE",`Failed to create desktop shortcut: ${n.stderr||n.stdout}`)}function we(e){let t=e.trim(),n=t.lastIndexOf(",");return n!==-1&&/^-?\d+$/.test(t.slice(n+1).trim())&&(t=t.slice(0,n).trim()),t.length>=2&&t.startsWith('"')&&t.endsWith('"')&&(t=t.slice(1,-1).trim()),t}async function Se(e){try{let t={...e.env,CREWX_LNK_PATH:e.shortcutPath},n=await e.run("powershell",["-NoProfile","-NonInteractive","-Command",qe],{env:t});if(n.code!==0||!n.stdout.trim())return null;let r=JSON.parse(n.stdout.trim());return {targetPath:r.TargetPath??"",workingDirectory:r.WorkingDirectory??"",iconLocation:r.IconLocation??""}}catch{return null}}var $=d.win32;async function I(e){let t=M(e.env.PATH??e.env.Path??"",e.cwd),n={...e.env,PATH:t,Path:t},r;try{r=await e.run("npm",["list","-g","crewx","--depth=0","--json"],{env:n});}catch{return {installed:false}}let i;try{i=JSON.parse(r.stdout||"{}");}catch{return {installed:false}}let l=i.dependencies?.crewx;if(!l?.version)return {installed:false};let o;try{let a=await e.run("npm",["prefix","-g"],{env:n});a.code===0&&(o=a.stdout.trim()||void 0);}catch{}let s=o?$.join(o,"crewx.cmd"):void 0;return {installed:true,version:l.version,binPath:s,prefix:o}}var Qe=/EACCES|EPERM|EROFS/,Ye=/ENOTFOUND|ETIMEDOUT|ECONNREFUSED|network|registry/i,Ze=/^\d+\.\d+\.\d+/;function et(e){return !!e&&e!=="0.0.0"&&Ze.test(e)}var B=10*6e4;async function Ee(e){if(!et(e.targetVersion))throw new f("GLOBAL_INSTALL_FAILED",`RUNNING_VERSION_UNKNOWN: cannot reliably determine the running crewx version to install (got ${JSON.stringify(e.targetVersion)}); refusing to fall back to crewx@latest`);if(e.currentInfo?.installed&&e.currentInfo.version&&!x(e.currentInfo.version,e.targetVersion))return {info:e.currentInfo};let t=M(e.env.PATH??e.env.Path??"",e.cwd),n={...e.env,PATH:t,Path:t},r=`crewx@${e.targetVersion}`;e.onProgress?.({phase:"global-install",message:`Installing crewx globally (npm install -g ${r})`});let i;try{i=await e.run("npm",["install","-g",r,"--no-audit","--no-fund"],{env:n,timeoutMs:B});}catch(o){throw new f("NPM_UNAVAILABLE",`Could not run npm: ${o instanceof Error?o.message:String(o)}`)}if(i.code===0)return {info:await I({env:n,cwd:e.cwd,run:e.run})};let l=`${i.stdout}
|
|
3
|
+
${i.stderr}`;if(Qe.test(l)){e.onProgress?.({phase:"global-install",message:"Permission denied \u2014 retrying with a user-scoped npm prefix"});let o=e.env.LOCALAPPDATA||$.join(e.env.USERPROFILE??"","AppData","Local"),s={...n,npm_config_prefix:$.join(o,"crewx","npm")},a;try{a=await e.run("npm",["install","-g",r,"--no-audit","--no-fund"],{env:s,timeoutMs:B});}catch(c){throw new f("NPM_PERMISSION_DENIED",`Retry with user-scoped prefix failed: ${c instanceof Error?c.message:String(c)}`)}if(a.code===0)return {info:await I({env:s,cwd:e.cwd,run:e.run})};throw new f("NPM_PERMISSION_DENIED",`npm install -g failed after user-scoped prefix retry: ${a.stderr||a.stdout}`)}if(Ye.test(l)){if(!e.installRoot)throw new f("OFFLINE_NO_SOURCE","The npm registry is unreachable and no local installRoot was provided for an offline install");e.onProgress?.({phase:"global-install",message:`Registry unreachable \u2014 installing offline from ${e.installRoot}`});let o;try{o=await e.run("npm",["install","-g",e.installRoot,"--offline","--no-audit","--no-fund"],{env:n,timeoutMs:B});}catch(s){throw new f("GLOBAL_INSTALL_FAILED",`Offline install failed: ${s instanceof Error?s.message:String(s)}`)}if(o.code===0)return {info:await I({env:n,cwd:e.cwd,run:e.run})};throw new f("GLOBAL_INSTALL_FAILED",`Offline install failed: ${o.stderr||o.stdout}`)}throw new f("GLOBAL_INSTALL_FAILED",l.trim()||`npm install -g ${r} failed`)}function nt(e){return e.run??Z}function rt(e){return e.fs??U}async function D(e){let t=e.platform??process.platform,n=e.env??process.env,r=e.homedir??j,i=nt(e),l=rt(e),o=e.runningVersion??te,s=e.cwd??process.cwd(),a=r(),c=re(a),h=oe(a),m=se(a),u=null;t==="win32"&&(u=await ae({env:n,homedir:r,run:i}));let p=u?ie(u.dir):null;return {platform:t,env:n,homedir:r,run:i,fs:l,runningVersion:o,cwd:s,installRoot:e.installRoot,shortcutManifestPath:c,launcherManifestPath:h,wrapperPath:m,desktop:u,shortcutPath:p}}function Re(e){return e?d.win32.normalize(e).toLowerCase().endsWith(`${d.win32.sep}bin${d.win32.sep}crewx.ico`):false}function H(e,t){let n=e.readBinaryFileSync;if(n)try{return createHash("sha256").update(n(t)).digest("hex")}catch{return}}async function ot(e){try{await e.run("ie4uinit.exe",["-show"],{env:e.env});}catch{}}async function R(e){if(e.platform!=="win32")return {supported:false,state:"unsupported",globalCrewx:null,runningVersion:e.runningVersion,errors:[],manifest:null,iconStale:false};let t=[];e.desktop||t.push("NO_DESKTOP_DIR: could not resolve the Windows Desktop directory");let n=pe(e.fs,e.shortcutManifestPath),r=A(e.fs,e.launcherManifestPath),i=await I({env:e.env,cwd:e.cwd,run:e.run}),l=e.shortcutPath?e.fs.existsSync(e.shortcutPath):false,o,s=false,a,c;if(!l)o=n?.declined?"declined":"not-installed";else {let h=!!n?.owned&&!!e.shortcutPath&&n.shortcutPath===e.shortcutPath,m=false,u=e.shortcutPath?await Se({run:e.run,env:e.env,shortcutPath:e.shortcutPath}):null;if(h||(u&&F(u.targetPath,e.wrapperPath)?h=true:u&&ce(u.targetPath)&&(m=true)),m)o="foreign",t.push("NSIS_PRESENT: an NSIS-installed CrewX shortcut was detected");else if(!h)o="foreign";else if(n?.version&&x(e.runningVersion,n.version))o="superseded",t.push(`SUPERSEDED: running version ${e.runningVersion} is older than the installed shortcut's version ${n.version}; refusing to modify it`);else {let p=!r||r.schema<L||!e.fs.existsSync(e.wrapperPath);if(u){let S=we(u.iconLocation);if(!(!!S&&e.fs.existsSync(S)))s=true;else {a=S;let g=ve(i,e.fs);g?F(S,g)?(c=H(e.fs,S),s=!c||n?.iconHash!==c):s=true:Re(S)?(c=H(e.fs,S),s=!c||n?.iconHash!==c):s=true;}}o=p||s?"stale":"installed";}}return {supported:true,state:o,shortcutPath:e.shortcutPath??void 0,desktopDir:e.desktop?.dir,desktopSource:e.desktop?.source,wrapperPath:e.wrapperPath,wrapperSchema:r?.schema,globalCrewx:i.installed?i:{installed:false},runningVersion:e.runningVersion,errors:t,manifest:n,iconStale:s,iconPath:a,iconHash:c}}function ve(e,t){if(!e?.installed||!e.prefix)return;let n=d.win32.join(e.prefix,"node_modules","crewx","bin","crewx.ico");return t.existsSync(n)?n:void 0}function v(e){let{manifest:t,iconStale:n,iconPath:r,iconHash:i,...l}=e;return l}async function st(e={}){let t=await D(e),n=await R(t);return v(n)}async function it(e={}){let t=await D(e);e.onProgress?.({phase:"detect",message:"Checking current shortcut status"});let n=await R(t),r=v(n);if(!r.supported)return {...r,changed:false,installedGlobal:false};if(r.state==="superseded")return {...r,changed:false,installedGlobal:false};if(r.state==="foreign"){if(n.errors.some(g=>g.startsWith("NSIS_PRESENT")))throw new f("NSIS_PRESENT",`An NSIS-installed CrewX shortcut was detected at ${r.shortcutPath}`);if(!e.force)throw new f("FOREIGN_SHORTCUT",`An existing shortcut at ${r.shortcutPath} is not managed by CrewX`)}if(!t.desktop||!t.shortcutPath)throw new f("NO_DESKTOP_DIR","Could not resolve the Windows Desktop directory");let i=false,l=false,o=r.globalCrewx,s=[],a=n.manifest?.iconHash,c=false;if(!!o?.installed&&!!o.version&&x(o.version,t.runningVersion)||!o?.installed&&r.state!=="installed"){let g=await Ee({env:t.env,cwd:t.cwd,run:t.run,targetVersion:t.runningVersion,currentInfo:o??void 0,installRoot:t.installRoot,onProgress:e.onProgress});o=g.info,l=g.info.installed,i=true,l||s.push(`GLOBAL_INSTALL_UNCONFIRMED: npm install -g crewx@${t.runningVersion} exited successfully but a follow-up check could not confirm the global install`);}if(e.onProgress?.({phase:"wrapper",message:"Ensuring launcher wrapper"}),me({fs:t.fs,wrapperPath:t.wrapperPath,launcherManifestPath:t.launcherManifestPath,bakedBinPath:o?.binPath}).wrote&&(i=true),!((r.state==="installed"||r.state==="stale")&&!n.iconStale)){let g=ve(o,t.fs)??(n.iconPath&&Re(n.iconPath)&&t.fs.existsSync(n.iconPath)?n.iconPath:void 0);if(n.iconStale&&!g)throw new f("ICON_UNAVAILABLE",`Could not locate the global CrewX icon (bin\\crewx.ico) to repair the desktop shortcut at ${t.shortcutPath}; the existing shortcut was left untouched`);e.onProgress?.({phase:"lnk",message:"Creating desktop shortcut"}),await ge({run:t.run,env:t.env,shortcutPath:t.shortcutPath,targetPath:t.wrapperPath,iconPath:g}),i=true,c=n.iconStale;let _=g?H(t.fs,g):void 0;_&&(a=_);}i&&b(t.fs,t.shortcutManifestPath,{shortcutPath:t.shortcutPath,version:t.runningVersion,owned:true,declined:false,desktopSource:t.desktop.source,iconHash:a}),c&&await ot(t);let S=await R(t),C=v(S);return {...C,errors:[...C.errors,...s],changed:i,installedGlobal:l}}async function at(e={}){let t=await D(e),n=await R(t),r=v(n);if(!r.supported)return r;if((r.state==="installed"||r.state==="stale")&&t.shortcutPath)try{t.fs.unlinkSync(t.shortcutPath);}catch{}b(t.fs,t.shortcutManifestPath,{shortcutPath:void 0,version:n.manifest?.version,owned:false,declined:true,desktopSource:void 0,iconHash:void 0});let i=await R(t);return v(i)}async function ct(e={}){let t=await D(e),n=await R(t),r=v(n);if(!r.supported)return r;b(t.fs,t.shortcutManifestPath,{shortcutPath:n.manifest?.shortcutPath,version:n.manifest?.version,owned:n.manifest?.owned??false,declined:true,desktopSource:n.manifest?.desktopSource,iconHash:n.manifest?.iconHash});let i=await R(t);return v(i)}export{f as ShortcutError,ct as dismissShortcutNotice,st as getShortcutStatus,it as installShortcut,at as uninstallShortcut};
|