@capgo/cli 7.19.3 → 7.19.4
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/index.js +20 -20
- package/dist/package.json +1 -1
- package/dist/src/app/add.d.ts.map +1 -1
- package/dist/src/sdk.js +2 -2
- package/package.json +1 -1
package/dist/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/app/add.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAwD5C,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAQ;;;;;;GAE3E;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,UAAQ;;;;;;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/app/add.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAwD5C,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAQ;;;;;;GAE3E;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,UAAQ;;;;;;GA4Gf;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,iBAE/D"}
|
package/dist/src/sdk.js
CHANGED
|
@@ -315,8 +315,8 @@ ${W(s)}`),new Error(`Cannot retrieve unknown version for app ${e}: ${W(s)}`);ret
|
|
|
315
315
|
created_by,
|
|
316
316
|
app_id,
|
|
317
317
|
version (id, name)
|
|
318
|
-
`).eq("app_id",e).order("created_at",{ascending:!1});if(i)throw r||w.error(`App ${e} not found in database`),new Error(`App ${e} not found in database: ${W(i)}`);return n}async function eE(t,e,r,n={}){let{silent:i=!1}=n,{error:s}=await t.from("app_versions").update({deleted:!0}).eq("app_id",e).eq("deleted",!1).eq("name",r);if(s){let o=`App version ${e}@${r} not found in database`;throw i||w.error(o),new Error(`${o}: ${W(s)}`)}}async function jp(t,e,r,n={}){let{silent:i=!1,autoUnlink:s=!1}=n,o=await ble(t,e,r,{silent:i});await Z8(t,e,o,{silent:i,autoUnlink:s}),await eE(t,e,r,{silent:i})}function oM(t,e=!1){if(e)return;if(!t.length)throw new Error("No bundle found");let r=new Yt;r.theme=Yt.roundTheme,r.headers=["Version","Created","Keep"],r.rows=[];for(let n of t.toReversed())r.rows.push([n.name,Ja(n.created_at),n.keep??""]);w.success("Bundles"),w.success(r.toString())}async function Bp(t,e,r={}){let{silent:n=!1}=r,{data:i,error:s}=await t.from("app_versions").select().eq("app_id",e).eq("deleted",!1).order("created_at",{ascending:!1});if(s){let o=`App ${e} not found in database`;throw n||w.error(o),new Error(`${o}: ${W(s)}`)}return i??[]}async function aM(t,e,r={}){let{silent:n=!1}=r,{data:i,error:s}=await t.from("channels").select("version").eq("app_id",e);if(s){let o=`App ${e} not found in database`;throw n||w.error(o),new Error(`${o}: ${W(s)}`)}return(i??[]).map(o=>o.version)}async function ble(t,e,r,n={}){let{silent:i=!1}=n,{data:s,error:o}=await t.from("app_versions").select().eq("app_id",e).eq("name",r).eq("deleted",!1).single();if(!s||o){let a=`App version ${e}@${r} doesn't exist`;throw i||w.error(a),new Error(`${a}${o?`: ${W(o)}`:""}`)}return s}var Za=require("node:fs");async function uM(t,e){let{data:r}=await t.rpc("exist_app_v2",{appid:e}).single();return!!r}async function mt(t,e,r,n,i=!1){let s=rs(),o=await M8(t,e,r);if(!o.okay)switch(o.error){case"INVALID_APIKEY":{let c="Invalid apikey, such apikey does not exists!";throw i||w.error(c),new Error(c)}case"NO_APP":{let c=`App ${r} does not exist, run first \`${s.runner} @capgo/cli app add ${r}\` to create it`;throw i||w.error(c),new Error(c)}case"NO_ORG":{let c="Could not find organization, please contact support to resolve this!";throw i||w.error(c),new Error(c)}}let a=o.data;if(n>a){let c=`Insuficcent permissions for app ${r}. Current permission: ${fr[o.data]}, required for this action: ${fr[n]}.`;throw i||w.error(c),new Error(c)}return o.data}var Xr="assets/icon.png";var ns={name:"@capgo/cli",version:"7.19.
|
|
319
|
-
Please use @capgo/cli@${t}" or @capgo/cli@${e} to keep up to date with the latest features and bug fixes.`)}function Ele(t,e,r){if(!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!t)throw r||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");if(t.includes("--"))throw r||w.error('The app id includes illegal symbols. You cannot use "--" in the app id'),new Error("App id includes illegal symbols")}async function _le(t,e,r){if(await uM(t,e))throw e==="io.ionic.starter"?(r||w.error(`This appId ${e} cannot be used it's reserved, please change it in your capacitor config.`),new Error("Reserved appId, please change it in capacitor config")):(r||w.error(`App ${e} already exist`),new Error(`App ${e} already exists`))}async function cM(t,e,r,n=!1){n||oe("Adding"),await Je(),e.apikey=e.apikey||se();let i=await ge(),s=je(t,i?.config);Ele(s,e,n);let o=await ye(e.apikey,e.supaHost,e.supaAnon),a=await De(o,e.apikey,["write","all"]);await _le(o,s,n),r||(r=await $p(o,["admin","super_admin"]));let u=r.gid,{name:c,icon:l}=e;if(c=c||i.config?.appName||"Unknown",l=l||"resources/icon.png",!l||!c)throw n||w.error("Missing argument, you need to provide a appId and a name, or be in a capacitor project"),new Error("Missing app name or icon path");n||w.info(`Adding ${s} to Capgo`);let h=null,d=null;l&&(0,Za.existsSync)(l)?(h=(0,Za.readFileSync)(l),d=Ya(l)||"image/png",n||w.warn(`Found app icon ${l}`)):(0,Za.existsSync)(Xr)?(h=(0,Za.readFileSync)(Xr),d=Ya(Xr)||"image/png",n||w.warn(`Found app icon ${Xr}`)):n||w.warn(`Cannot find app icon in any of the following locations: ${l}, ${Xr}`);let f="icon",m="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(h&&d){let{error:S}=await o.storage.from(`images/org/${u}/${s}`).upload(f,h,{contentType:d});if(S)throw n||console.error(S),n||w.error(`Could not add app ${W(S)}`),new Error(`Could not add app ${W(S)}`);let{data:A}=await o.storage.from(`images/org/${u}/${s}`).getPublicUrl(f);m=A?.publicUrl||m}let{error:g}=await o.from("apps").insert({icon_url:m,owner_org:u,user_id:a,name:c,app_id:s});if(g)throw n||w.error(`Could not add app ${W(g)}`),new Error(`Could not add app ${W(g)}`);let{error:b}=await o.from("app_versions").insert([{owner_org:u,deleted:!0,name:"unknown",app_id:s},{owner_org:u,deleted:!0,name:"builtin",app_id:s}]);if(b)throw n||w.error(`Could not add app ${W(b)}`),new Error(`Could not add app ${W(b)}`);return n||(w.success(`App ${s} added to Capgo. You can upload a bundle now`),fe("Done \u2705")),{appId:s,organizationUid:u,userId:a,name:c,signedURL:m}}async function lM(t,e,r=!1,n=!1){r||oe("Deleting"),e.apikey=e.apikey||se();let i=await ge(),s=je(t,i?.config);if(!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!s)throw r||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");let o=await ye(e.apikey,e.supaHost,e.supaAnon),a=await De(o,e.apikey,["write","all"]);await mt(o,e.apikey,s,5,r);let{data:u,error:c}=await o.from("apps").select("owner_org ( created_by, id )").eq("app_id",s).single(),l=u;if(!n&&!c&&(l?.owner_org.created_by??"")!==a){if(r)throw new Error("Cannot delete app: you are not the organization owner");{w.warn("Deleting the app is not recomended for users that are not the organization owner"),w.warn("You are invited as a super_admin but your are not the owner"),w.warn("It's strongly recomended that you do not continue!");let g=await Do({message:"Do you want to continue?",options:[{label:"Yes",value:"yes"},{label:"No",value:"no"}]});if(Lt(g)||g==="no")throw w.error("Canceled deleting the app, exiting"),new Error("App deletion cancelled")}}else c&&!r&&w.warn(`Cannot get the app owner ${W(c)}`);let{error:h}=await o.storage.from("images").remove([`org/${l?.owner_org.id}/${s}/icon`]);h&&!r&&w.error("Could not delete app logo");let{error:d}=await o.storage.from(`apps/${s}/${a}`).remove(["versions"]);d&&!r&&w.error("Could not delete app version");let{error:f}=await o.from("apps").delete().eq("app_id",s);if(f)throw r||w.error("Could not delete app"),new Error(`Could not delete app: ${W(f)}`);let m=await Nn(o,s);return await Ie(e.apikey,{channel:"app",event:"App Deleted",icon:"\u{1F5D1}\uFE0F",user_id:m,tags:{"app-id":s},notify:!1}).catch(()=>{}),r||(w.success("App deleted in Capgo"),fe("Done \u2705")),!0}var qp=require("node:os"),hM=require("node:process");async function fM(t){let e={},r=Object.keys(t);return(await Promise.all(r.map(i=>Mp(i)))).forEach((i,s)=>{i&&(e[r[s]]=i)}),e}async function Cle(){let t=await Rn(),e={"@capgo/cli":ns.version};for(let[r,n]of t)(r.startsWith("@capgo/")||r.startsWith("@capawesome/")||r.startsWith("capacitor"))&&(e[r]=n);return e}async function dM(t,e=!1){e||w.warn(" \u{1F48A} Capgo Doctor \u{1F48A}");let r=await ge(),n=ts("",t.packageJson),i=r?.config?.plugins?.CapacitorUpdater?.version||n,s=r?.config?.appName||"",o=je("",r?.config),a=r?.config?.webDir||"";e||(w.info(` App Name: ${s}`),w.info(` App ID: ${o}`),w.info(` App Version: ${i}`),w.info(` Web Dir: ${a}`),w.info(` OS: ${(0,qp.platform)()} ${(0,qp.version)()}`),w.info(` Node: ${hM.version}`),w.info(" Installed Dependencies:"));let u=await Cle();if(Object.keys(u).length===0)throw e||w.warning("\x1B[31m%s\x1B[0m \u{1F6A8} No dependencies found"),new Error("No dependencies found");if(!e)for(let l of Object.keys(u))w.info(` ${l}: ${u[l]}`);let c={};if(e)c=await fM(u);else{let l=Ut();l.start("Running: Loading latest dependencies"),c=await fM(u),l.stop("Latest Dependencies:");for(let h of Object.keys(c))w.info(` ${h}: ${c[h]}`)}if(JSON.stringify(u)!==JSON.stringify(c))throw e||w.warn("\x1B[31m\u{1F6A8} Some dependencies are not up to date\x1B[0m"),new Error("Some dependencies are not up to date");return e||w.success("\x1B[32m\u2705 All dependencies are up to date\x1B[0m"),{appName:s,appId:o,appVersion:i,webDir:a,installedDependencies:u,latestDependencies:c}}function Sle(t){let e=new Yt;e.headers=["Name","id","Created"],e.rows=[];for(let r of t.toReversed())e.rows.push([r.name??"",r.app_id,Ja(r.created_at)]);w.success("Apps"),w.success(e.toString())}async function Ale(t,e){let{data:r,error:n}=await t.from("apps").select().order("created_at",{ascending:!1});if(n)throw e||w.error("Apps not found"),new Error("Apps not found");return r??[]}async function pM(t,e=!1){e||oe("List apps in Capgo"),await Je(),t.apikey=t.apikey||se();let r=await ye(t.apikey,t.supaHost,t.supaAnon);await De(r,t.apikey,["write","all","read","upload"]),e||w.info("Getting active bundle in Capgo");let n=await Ale(r,e);if(!n.length)throw e||w.error("No apps found"),new Error("No apps found");return e||(w.info(`Active app in Capgo: ${n.length}`),Sle(n),fe("Done \u2705")),n}var mM=require("node:crypto"),Qa=require("node:fs");async function gM(t,e,r=!1){r||oe("Set app"),e.apikey=e.apikey||se();let n=await ge();if(t=je(t,n?.config),!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!t)throw r||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");let i=await ye(e.apikey,e.supaHost,e.supaAnon),o=(await $p(i,["admin","super_admin"])).gid,a=await De(i,e.apikey,["write","all"]);await mt(i,e.apikey,t,4,r);let{name:u,icon:c,retention:l}=e;if(l&&Number.isNaN(Number(l)))throw r||w.error("retention value must be a number"),new Error("Retention value must be a number");if(l&&l<0)throw r||w.error("retention value cannot be less than 0"),new Error("Retention value cannot be less than 0");if(l&&l>=63113904)throw r||w.error("retention value cannot be greater than 63113904 seconds (2 years)"),new Error("Retention value cannot be greater than 63113904 seconds (2 years)");let h,d,f=`icon_${(0,mM.randomUUID)()}`,m="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(c&&(0,Qa.existsSync)(c)?(h=(0,Qa.readFileSync)(c),d=Ya(c)||"image/png",r||w.warn(`Found app icon ${c}`)):(0,Qa.existsSync)(Xr)?(h=(0,Qa.readFileSync)(Xr),d=Ya(Xr)||"image/png",r||w.warn(`Found app icon ${Xr}`)):r||w.warn(`Cannot find app icon in any of the following locations: ${c}, ${Xr}`),h&&d){let{error:b}=await i.storage.from(`images/org/${o}/${t}`).upload(f,h,{contentType:d});if(b)throw r||w.error(`Could not set app ${W(b)}`),new Error(`Could not set app: ${W(b)}`);let{data:S}=await i.storage.from(`images/org/${o}/${t}`).getPublicUrl(f);m=S?.publicUrl||m}let{error:g}=await i.from("apps").update({icon_url:m,name:u,retention:l?l*24*60*60:void 0}).eq("app_id",t).eq("user_id",a);if(g)throw r||w.error(`Could not set app ${W(g)}`),new Error(`Could not set app: ${W(g)}`);return r||fe("Done \u2705"),!0}async function yM(t,e,r=!1){if(r||oe("Set a specific setting in capacitor config"),e.bool&&e.string)throw r||w.error("Bool and string CANNOT be set at the same time"),new Error("Bool and string cannot both be provided");if(!e.bool&&!e.string)throw r||w.error("You MUST provide either bool or string as the value"),new Error("Either bool or string value is required");if(e.bool&&e.bool!=="true"&&e.bool!=="false")throw r||w.error("Invalid bool"),new Error("Invalid bool value; expected true or false");try{let n=await ge(),i=n.config,s=t.split(".");if(s.length===0)throw r||w.error("Invalid path"),new Error("Invalid config path");for(let a of s.slice(0,-1))Object.prototype.hasOwnProperty.call(i,a)||(i[a]={}),i=i[a];let o=e.bool?e.bool==="true":e.string;i[s.at(-1)]=o,await Ua(n,!0),r||w.success(`Set "${t}" to "${o}"`)}catch(n){throw r||w.error(`Cannot set config in capacitor settings ${W(n)}`),new Error(`Cannot set capacitor config: ${W(n)}`)}r||fe("Done \u2705")}async function Ole(t,e,r,n){for await(let i of t)n||w.warn(`Removing ${i.name} created on ${Ja(i.created_at)}`),await jp(e,r,i.name)}function xle(t,e,r){let n=[];for(let i of t??[]){let s=Et(i.name);Tm(s,e)&&Fm(s,r)&&n.push(i)}return n}async function DM(t,e,r=!1){r||oe("Cleanup versions in Capgo"),await Je(),e.apikey=e.apikey||se();let{bundle:n,keep:i=4}=e,s=e.force||!1,o=e.ignoreChannel||!1,a=await ge();if(t=je(t,a?.config),!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to delete your app"),new Error("Missing API key");if(!t)throw r||w.error("Missing argument, you need to provide a appid, or be in a capacitor project"),new Error("Missing appId");let u=await ye(e.apikey,e.supaHost,e.supaAnon);await De(u,e.apikey,["write","all"]),await mt(u,e.apikey,t,3,r),r||w.info("Querying all available versions in Capgo");let c=await Bp(u,t),l=await aM(u,t);if(r||w.info(`Total active versions in Capgo: ${c?.length??0}`),!c?.length)throw r||w.error("No versions found, aborting cleanup"),new Error("No versions found");if(n){let f=Et(n),m=u_(f,"major");r||w.info(`Querying available versions in Capgo between ${vi(f)} and ${vi(m)}`),c=xle(c,f,m),r||w.info(`Active versions in Capgo between ${vi(f)} and ${vi(m)}: ${c?.length??0}`)}let h=[],d=0;for(let f of c){let m=l.find(g=>g===f.id);d<i||m&&!o?(f.keep=m?"\u2705 (Linked to channel)":"\u2705",d+=1):(f.keep="\u274C",h.push(f))}if(!h.length)return r||w.warn("Nothing to be removed, aborting removal..."),{removed:0,kept:d};if(r||oM(c),!s){if(r)throw new Error("Cleanup requires force=true in SDK mode to prevent accidental deletions");{let f=await cn({message:"Do you want to continue removing the versions specified?"});if(Lt(f)||!f)throw w.warn("Not confirmed, aborting removal..."),new Error("Cleanup cancelled by user")}}return r||w.success("You have confirmed removal, removing versions now"),await Ole(h,u,t,r),r||fe("Done \u2705"),{removed:h.length,kept:d}}async function wM(t,e,r=!1){r||oe("Check compatibility");let n={...e,apikey:e.apikey||se()},i=await ge(),s=je(t,i?.config),o=n.channel;if(!o)throw r||w.error("Missing argument, you need to provide a channel"),new Error("Missing channel");if(!n.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!s)throw r||w.error("Missing argument, you need to provide an appId, or be in a capacitor project"),new Error("Missing appId");let a=await ye(n.apikey,n.supaHost,n.supaAnon);await De(a,n.apikey,["write","all","read","upload"]),await mt(a,n.apikey,s,1,r);let u=await Lp(a,s,o,n.packageJson,n.nodeModules);if(!r){let c=new Yt;c.headers=["Package","Local version","Remote version","Compatible"],c.theme=Yt.roundTheme,c.rows=[];let l=n.text?"Yes":"\u2705",h=n.text?"No":"\u274C";for(let d of u.finalCompatibility){let{name:f,localVersion:m,remoteVersion:g}=d,b=so(d)?l:h;c.rows.push([f,m,g,b])}w.success("Compatibility"),w.success(c.toString())}return{finalCompatibility:u.finalCompatibility}}var pi=require("node:fs");var is=require("node:buffer"),Mt=require("node:crypto"),bM="aes-128-cbc",di="base64",Up=Mt.constants.RSA_PKCS1_PADDING;function Hp(t){let e=(0,Mt.randomBytes)(16),r=(0,Mt.randomBytes)(16),n=e.toString(di),i=(0,Mt.privateEncrypt)({key:t,padding:Up},r).toString(di);return{sessionKey:r,ivSessionKey:`${n}:${i}`}}function eu(t,e,r){let[n]=r.split(":"),i=is.Buffer.from(n,di),s=(0,Mt.createCipheriv)(bM,e,i);return s.setAutoPadding(!0),is.Buffer.concat([s.update(t),s.final()])}function vM(t,e,r){let[n,i]=e.split(":"),s=(0,Mt.publicDecrypt)({key:r,padding:Up},is.Buffer.from(i,di)),o=is.Buffer.from(n,di),a=(0,Mt.createDecipheriv)(bM,s,o);return a.setAutoPadding(!0),is.Buffer.concat([a.update(t),a.final()])}function tu(t,e){return(0,Mt.privateEncrypt)({key:e,padding:Up},is.Buffer.from(t,di)).toString(di)}function EM(t="pem",e=2048){let{publicKey:r,privateKey:n}=(0,Mt.generateKeyPairSync)("rsa",{modulusLength:e});return t==="pem"?{publicKey:r.export({type:"pkcs1",format:"pem"}),privateKey:n.export({type:"pkcs1",format:"pem"})}:{publicKey:r.export({type:"spki",format:"der"}).toString("base64"),privateKey:n.export({type:"pkcs1",format:"pem"}).toString("base64")}}function _M(t,e){return(0,Mt.publicDecrypt)({key:e,padding:Up},is.Buffer.from(t,di)).toString(di)}function Tle(t,e){let r=t.key||hi,n=e.config.plugins?.CapacitorUpdater?.publicKey;return(0,pi.existsSync)(r)?n=(0,pi.readFileSync)(r,"utf8"):!n&&t.keyData&&(n=t.keyData),{publicKey:n,fallbackKeyPath:r}}async function CM(t,e,r,n=!1){n||oe("Decrypt zip file");try{if(await Je(),!(0,pi.existsSync)(t)){let h=`Zip not found at the path ${t}`;throw n||w.error(h),new Error(h)}let i=await ge();if(!r.key&&!(0,pi.existsSync)(hi)&&!i.config.plugins?.CapacitorUpdater?.privateKey){let h=`Private Key not found at the path ${hi} or in ${i.path}`;throw n||w.error(h),new Error(h)}let{publicKey:s,fallbackKeyPath:o}=Tle(r,i);if(!s){let h=`Cannot find public key ${o} or as keyData option or in ${i.path}`;throw n||w.error(h),new Error(h)}let a=(0,pi.readFileSync)(t),u=vM(a,e,r.keyData??s),c=`${t}_decrypted.zip`;(0,pi.writeFileSync)(c,u),n||w.info(`Decrypted zip file at ${c}`);let l;if(r.checksum){let h=await Xn(u,"sha256"),d=_M(r.checksum,r.keyData??s);if(l=h===d,!l){let f=`Checksum does not match ${h} !== ${d}`;throw n||w.error(f),new Error(f)}n||w.info("Checksum matches")}return n||fe("\u2705 done"),{outputPath:c,checksumMatches:l}}catch(i){throw n||w.error(`Error decrypting zip file ${W(i)}`),i instanceof Error?i:new Error(String(i))}}async function SM(t,e,r,n=!1){n||oe("Delete bundle"),r.apikey=r.apikey||se();let i=await ge();if(e=je(e,i?.config),!r.apikey)throw n||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!e)throw n||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");if(!t)throw n||w.error("Missing argument, you need to provide a bundleId, or be in a capacitor project"),new Error("Missing bundleId");let s=await ye(r.apikey,r.supaHost,r.supaAnon);return await De(s,r.apikey,["write","all"]),await mt(s,r.apikey,e,3,n),n||(w.info(`Deleting bundle ${e}@${t} from Capgo`),w.info("Keep in mind that you will not be able to reuse this bundle version, it's gone forever")),await jp(s,e,t),n||(w.success(`Bundle ${e}@${t} deleted in Capgo`),fe("Done")),!0}var mi=require("node:fs");function rl(t){console.error(W(t))}async function AM(t,e,r,n=!1){let{json:i}=r,s=!i&&!n;s&&(oe("Encryption"),await Je());try{let o=await ge(),a=!!o.config.plugins?.CapacitorUpdater?.privateKey,u=!!o.config.plugins?.CapacitorUpdater?.publicKey;if(a&&s&&w.warning("There is still a privateKey in the config"),!(0,mi.existsSync)(t)){let S=`Zip not found at the path ${t}`;throw n||(i?rl({error:"zip_not_found"}):w.error(`Error: ${S}`)),new Error(S)}if(!u)throw n||(i?rl({error:"missing_public_key"}):w.warning("Warning: Missing Public Key in config")),new Error("Missing public key in config");let c=r.key||Ir,l=r.keyData||"";if(!(0,mi.existsSync)(c)&&!l)throw n||(i?rl({error:"missing_key"}):(w.warning(`Cannot find a private key at ${c} or as a keyData option`),w.error("Error: Missing key"))),new Error("Missing private key");if((0,mi.existsSync)(c)&&(l=(0,mi.readFileSync)(c,"utf8")),l&&!l.startsWith("-----BEGIN RSA PRIVATE KEY-----"))throw n||(i?rl({error:"invalid_private_key"}):w.error("The private key provided is not a valid RSA Private key")),new Error("Invalid private key format");let h=(0,mi.readFileSync)(t),{sessionKey:d,ivSessionKey:f}=Hp(l),m=eu(h,d,f),g=tu(e,l),b=`${t}_encrypted.zip`;return(0,mi.writeFileSync)(b,m),n||(i?console.log(JSON.stringify({checksum:g,filename:b,ivSessionKey:f},null,2)):(w.success(`Encoded Checksum: ${g}`),w.success(`ivSessionKey: ${f}`),w.success(`Encrypted zip saved at ${b}`),fe("Done \u2705"))),{checksum:g,filename:b,ivSessionKey:f}}catch(o){throw n||(r.json?rl(o):w.error(`Error encrypting zip file ${W(o)}`)),o instanceof Error?o:new Error(String(o))}}var eq=require("node:crypto"),po=require("node:fs"),SE=require("node:path/posix"),AE=require("node:process");var Vp=class extends TransformStream{outChunkSize;constructor(e){let r=new Uint8Array(e),n=0;super({transform(i,s){let o=0;for(;o<i.length;){let a=e-n,u=Math.min(a,i.length-o);r.set(i.subarray(o,o+u),n),o+=u,n+=u,n===e&&(s.enqueue(r),r=new Uint8Array(e),n=0)}},flush(i){n>0&&i.enqueue(r.subarray(0,n))}}),this.outChunkSize=e}};function ss(t){return t=t.trim(),t=t.replace(/<!--[\s\S]*?-->/g,""),e();function e(){return{declaration:r(),root:n()}}function r(){if(!u(/^<\?xml\s*/))return;let d={attributes:{}};for(;!(c()||l("?>"));){let f=s();if(!f)return d;d.attributes[f.name]=f.value}return u(/\?>\s*/),d}function n(){let h=u(/^<([\w-:.]+)\s*/);if(!h)return;let d={name:h[1],attributes:{},children:[]};for(;!(c()||l(">")||l("?>")||l("/>"));){let m=s();if(!m)return d;d.attributes[m.name]=m.value}if(u(/^\s*\/>\s*/))return d;u(/\??>\s*/),d.content=i();let f;for(;f=n();)d.children.push(f);return u(/^<\/[\w-:.]+>\s*/),d}function i(){let h=u(/^([^<]*)/);return h?a(h[1]):""}function s(){let h=u(/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/);if(h)return{name:h[1],value:a(o(h[2]))}}function o(h){return h.replace(/^['"]|['"]$/g,"")}function a(h){return h.replaceAll("<","<").replaceAll(">",">").replaceAll("&","&")}function u(h){let d=t.match(h);if(d)return t=t.slice(d[0].length),d}function c(){return t.length===0}function l(h){return t.startsWith(h)}}var $n=class extends Error{};var Xt=class extends $n{},nl=class extends $n{},zp=class extends $n{bucketName;constructor(e){super(`Invalid bucket name: ${e}`),this.bucketName=e}},Ln=class extends $n{objectName;constructor(e){super(`Invalid object name: ${e}`),this.objectName=e}},os=class extends $n{constructor(){super("accessKey is required")}},ru=class extends $n{constructor(){super("secretKey is required")}},il=class extends $n{constructor(){super("expirySeconds cannot be less than 1 second or more than 7 days")}},gi=class extends $n{statusCode;code;key;bucketName;resource;region;constructor(e,r,n,i={}){super(n),this.statusCode=e,this.code=r,this.key=i.key,this.bucketName=i.bucketName,this.resource=i.resource,this.region=i.region}};async function OM(t){try{let r=ss(await t.text()).root;if(r?.name!=="Error")throw new Error("Invalid root, expected <Error>");let n=r.children.find(c=>c.name==="Code")?.content??"UnknownErrorCode",i=r.children.find(c=>c.name==="Message")?.content??"The error message could not be determined.",s=r.children.find(c=>c.name==="Key")?.content,o=r.children.find(c=>c.name==="BucketName")?.content,a=r.children.find(c=>c.name==="Resource")?.content,u=r.children.find(c=>c.name==="Region")?.content;return new gi(t.status,n,i,{key:s,bucketName:o,resource:a,region:u})}catch{return new gi(t.status,"UnrecognizedError",`Error: Unexpected response code ${t.status} ${t.statusText}. Unable to parse response as XML.`)}}function xM(t){return typeof t!="number"||isNaN(t)?!1:t>=1&&t<=65535}function TM(t){return typeof t!="string"||t.length<3||t.length>63||t.includes("..")||t.match(/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)?!1:!!t.match(/^[a-z0-9][a-z0-9.-]+[a-z0-9]$/)}function as(t){return!(!Fle(t)||t.length===0)}function Fle(t){return!(typeof t!="string"||t.length>1024)}function sl(t){return Array.from(t).map(e=>e.toString(16).padStart(2,"0")).join("")}function oo(t=""){let e={'"':"",""":"",""":"",""":"",""":""};return t.replace(/^("|"|")|("|"|")$/g,r=>e[r])}function rE(t){return t.get("x-amz-version-id")??null}function ao(t){let e=t.toISOString();return e.slice(0,4)+e.slice(5,7)+e.slice(8,13)+e.slice(14,16)+e.slice(17,19)+"Z"}function nE(t){return ao(t).slice(0,8)}function iE(t,e){return`${nE(e)}/${t}/s3/aws4_request`}async function Gp(t){return t instanceof Uint8Array||(t=new TextEncoder().encode(t)),sl(new Uint8Array(await crypto.subtle.digest("SHA-256",t)))}var Ile=["x-amz-server-side-encryption-customer-algorithm","x-amz-server-side-encryption-customer-key","x-amz-server-side-encryption-customer-key-MD5"],Kp=class extends WritableStream{getResult;constructor({client:e,bucketName:r,objectName:n,partSize:i,metadata:s}){let o,a=1,u,c=[],l,h=[];super({start(){},async write(d,f){let g=a++;try{if(g==1&&d.length<i){let A=await e.makeRequest({method:"PUT",headers:new Headers({...s,"Content-Length":String(d.length)}),bucketName:r,objectName:n,payload:d});o={etag:oo(A.headers.get("etag")??void 0),versionId:rE(A.headers)};return}g===1&&(u=(await kle({client:e,bucketName:r,objectName:n,metadata:s})).uploadId);let b={"Content-Length":String(d.length)};for(let A of Ile){let p=s[A];p&&(b[A]=p)}let S=e.makeRequest({method:"PUT",query:{partNumber:g.toString(),uploadId:u},headers:new Headers(b),bucketName:r,objectName:n,payload:d}).then(A=>{let p=A.headers.get("etag")??"";return p&&(p=p.replace(/^"/,"").replace(/"$/,"")),c.push({part:g,etag:p}),A});h.push(S.catch(A=>{l||(l=A)}))}catch(b){throw b}},async close(){if(!o)if(u){if(await Promise.all(h),l)throw l;c.sort((d,f)=>d.part>f.part?1:-1),o=await Ple({client:e,bucketName:r,objectName:n,uploadId:u,etags:c})}else throw new Error("Stream was closed without uploading any data.")}}),this.getResult=()=>{if(o===void 0)throw new Error("Result is not ready. await the stream first.");return o}}};async function kle(t){let e="POST",r=new Headers(t.metadata),s=await(await t.client.makeRequest({method:e,bucketName:t.bucketName,objectName:t.objectName,query:"uploads",headers:r,returnBody:!0})).text(),o=ss(s).root;if(!o||o.name!=="InitiateMultipartUploadResult")throw new Error(`Unexpected response: ${s}`);let a=o.children.find(u=>u.name==="UploadId")?.content;if(!a)throw new Error(`Unable to get UploadId from response: ${s}`);return{uploadId:a}}async function Ple({client:t,bucketName:e,objectName:r,uploadId:n,etags:i}){let s=`
|
|
318
|
+
`).eq("app_id",e).order("created_at",{ascending:!1});if(i)throw r||w.error(`App ${e} not found in database`),new Error(`App ${e} not found in database: ${W(i)}`);return n}async function eE(t,e,r,n={}){let{silent:i=!1}=n,{error:s}=await t.from("app_versions").update({deleted:!0}).eq("app_id",e).eq("deleted",!1).eq("name",r);if(s){let o=`App version ${e}@${r} not found in database`;throw i||w.error(o),new Error(`${o}: ${W(s)}`)}}async function jp(t,e,r,n={}){let{silent:i=!1,autoUnlink:s=!1}=n,o=await ble(t,e,r,{silent:i});await Z8(t,e,o,{silent:i,autoUnlink:s}),await eE(t,e,r,{silent:i})}function oM(t,e=!1){if(e)return;if(!t.length)throw new Error("No bundle found");let r=new Yt;r.theme=Yt.roundTheme,r.headers=["Version","Created","Keep"],r.rows=[];for(let n of t.toReversed())r.rows.push([n.name,Ja(n.created_at),n.keep??""]);w.success("Bundles"),w.success(r.toString())}async function Bp(t,e,r={}){let{silent:n=!1}=r,{data:i,error:s}=await t.from("app_versions").select().eq("app_id",e).eq("deleted",!1).order("created_at",{ascending:!1});if(s){let o=`App ${e} not found in database`;throw n||w.error(o),new Error(`${o}: ${W(s)}`)}return i??[]}async function aM(t,e,r={}){let{silent:n=!1}=r,{data:i,error:s}=await t.from("channels").select("version").eq("app_id",e);if(s){let o=`App ${e} not found in database`;throw n||w.error(o),new Error(`${o}: ${W(s)}`)}return(i??[]).map(o=>o.version)}async function ble(t,e,r,n={}){let{silent:i=!1}=n,{data:s,error:o}=await t.from("app_versions").select().eq("app_id",e).eq("name",r).eq("deleted",!1).single();if(!s||o){let a=`App version ${e}@${r} doesn't exist`;throw i||w.error(a),new Error(`${a}${o?`: ${W(o)}`:""}`)}return s}var Za=require("node:fs");async function uM(t,e){let{data:r}=await t.rpc("exist_app_v2",{appid:e}).single();return!!r}async function mt(t,e,r,n,i=!1){let s=rs(),o=await M8(t,e,r);if(!o.okay)switch(o.error){case"INVALID_APIKEY":{let c="Invalid apikey, such apikey does not exists!";throw i||w.error(c),new Error(c)}case"NO_APP":{let c=`App ${r} does not exist, run first \`${s.runner} @capgo/cli app add ${r}\` to create it`;throw i||w.error(c),new Error(c)}case"NO_ORG":{let c="Could not find organization, please contact support to resolve this!";throw i||w.error(c),new Error(c)}}let a=o.data;if(n>a){let c=`Insuficcent permissions for app ${r}. Current permission: ${fr[o.data]}, required for this action: ${fr[n]}.`;throw i||w.error(c),new Error(c)}return o.data}var Xr="assets/icon.png";var ns={name:"@capgo/cli",version:"7.19.4",description:"A CLI to upload to capgo servers",author:"Martin martin@capgo.app",license:"Apache 2.0",homepage:"https://github.com/Cap-go/CLI#readme",repository:{type:"git",url:"git+https://github.com/Cap-go/CLI.git"},bugs:{url:"https://github.com/Cap-go/CLI/issues"},keywords:["appflow alternative","ionic","capacitor","auto update","live update","capgo","cli","upload","capgo-cli","sdk"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js"},"./sdk":{types:"./dist/src/sdk.d.ts",import:"./dist/src/sdk.js",require:"./dist/src/sdk.js"}},main:"dist/index.js",types:"dist/src/index.d.ts",bin:{capgo:"dist/index.js"},engines:{npm:">=8.0.0",node:">=20.0.0"},scripts:{build:"tsc && node build.mjs",dev:"NODE_ENV=development ncc build","no-debug":"node dist/index.js","dev-build":"SUPA_DB=development ncc build",pack:"pkg",types:"npx --yes supabase gen types typescript --project-id=xvwzpoazmxkqosrdewyv > src/types/supabase.types.ts",lint:'eslint "src/**/*.ts" --fix',"check-posix-paths":"node test/check-posix-paths.js","generate-docs":"node dist/index.js generate-docs README.md","test:bundle":"bun test/test-bundle.mjs","test:functional":"bun test/test-functional.mjs","test:semver":"bun test/test-semver-validation.mjs","test:version-edge-cases":"bun test/test-version-validation.mjs","test:regex":"bun test/test-regex-validation.mjs","test:upload":"bun test/test-upload-validation.mjs",test:"bun run test:bundle && bun run test:functional && bun run test:semver && bun run test:version-edge-cases && bun run test:regex && bun run test:upload"},devDependencies:{"@antfu/eslint-config":"^6.1.0","@bradenmacdonald/s3-lite-client":"npm:@jsr/bradenmacdonald__s3-lite-client@0.9.4","@capacitor/cli":"^7.4.4","@capgo/find-package-manager":"^0.0.18","@clack/prompts":"^0.11.0","@sauber/table":"npm:@jsr/sauber__table","@std/semver":"npm:@jsr/std__semver@1.0.6","@supabase/supabase-js":"^2.79.0","@types/adm-zip":"^0.5.7","@types/node":"^24.9.1","@types/prettyjson":"^0.0.33","@types/tmp":"^0.2.6","@vercel/ncc":"^0.38.4","adm-zip":"^0.5.16","ci-info":"^4.3.1",commander:"^14.0.2",esbuild:"^0.25.11",eslint:"^9.38.0","git-format-staged":"3.1.1",husky:"^9.1.7","is-wsl":"^3.1.0",open:"^10.1.2",prettyjson:"^1.2.5",tmp:"^0.2.5","tus-js-client":"^4.3.1",typescript:"^5.9.3"}};async function Mp(t){try{let r=`https://registry.npmjs.org/${encodeURIComponent(t.toLowerCase())}`,n=await fetch(r,{headers:{accept:"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*"}});return n.ok&&(await n.json())["dist-tags"]?.latest||null}catch{return null}}async function Je(){let t=await Mp("@capgo/cli")??"",e=t?.split(".")[0];t!==ns.version&&w.warning(`\u{1F6A8} You are using @capgo/cli@${ns.version} it's not the latest version.
|
|
319
|
+
Please use @capgo/cli@${t}" or @capgo/cli@${e} to keep up to date with the latest features and bug fixes.`)}function Ele(t,e,r){if(!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!t)throw r||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");if(t.includes("--"))throw r||w.error('The app id includes illegal symbols. You cannot use "--" in the app id'),new Error("App id includes illegal symbols")}async function _le(t,e,r){if(await uM(t,e))throw e==="io.ionic.starter"?(r||w.error(`This appId ${e} cannot be used it's reserved, please change it in your capacitor config.`),new Error("Reserved appId, please change it in capacitor config")):(r||w.error(`App ${e} already exist`),new Error(`App ${e} already exists`))}async function cM(t,e,r,n=!1){n||oe("Adding"),await Je(),e.apikey=e.apikey||se();let i=await ge(),s=je(t,i?.config);Ele(s,e,n);let o=await ye(e.apikey,e.supaHost,e.supaAnon),a=await De(o,e.apikey,["write","all"]);await _le(o,s,n),r||(r=await $p(o,["admin","super_admin"]));let u=r.gid,{name:c,icon:l}=e;if(c=c||i.config?.appName||"Unknown",l=l||"resources/icon.png",!l||!c)throw n||w.error("Missing argument, you need to provide a appId and a name, or be in a capacitor project"),new Error("Missing app name or icon path");n||w.info(`Adding ${s} to Capgo`);let h=null,d=null;l&&(0,Za.existsSync)(l)?(h=(0,Za.readFileSync)(l),d=Ya(l)||"image/png",n||w.warn(`Found app icon ${l}`)):(0,Za.existsSync)(Xr)?(h=(0,Za.readFileSync)(Xr),d=Ya(Xr)||"image/png",n||w.warn(`Found app icon ${Xr}`)):n||w.warn(`Cannot find app icon in any of the following locations: ${l}, ${Xr}`);let f="icon",m="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(h&&d){let{error:b}=await o.storage.from(`images/org/${u}/${s}`).upload(f,h,{contentType:d});if(b)throw n||console.error(b),n||w.error(`Could not add app ${W(b)}`),new Error(`Could not add app ${W(b)}`);let{data:S}=await o.storage.from(`images/org/${u}/${s}`).getPublicUrl(f);m=S?.publicUrl||m}let{error:g}=await o.from("apps").insert({icon_url:m,owner_org:u,user_id:a,name:c,app_id:s});if(g)throw n||w.error(`Could not add app ${W(g)}`),new Error(`Could not add app ${W(g)}`);return n||(w.success(`App ${s} added to Capgo. You can upload a bundle now`),fe("Done \u2705")),{appId:s,organizationUid:u,userId:a,name:c,signedURL:m}}async function lM(t,e,r=!1,n=!1){r||oe("Deleting"),e.apikey=e.apikey||se();let i=await ge(),s=je(t,i?.config);if(!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!s)throw r||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");let o=await ye(e.apikey,e.supaHost,e.supaAnon),a=await De(o,e.apikey,["write","all"]);await mt(o,e.apikey,s,5,r);let{data:u,error:c}=await o.from("apps").select("owner_org ( created_by, id )").eq("app_id",s).single(),l=u;if(!n&&!c&&(l?.owner_org.created_by??"")!==a){if(r)throw new Error("Cannot delete app: you are not the organization owner");{w.warn("Deleting the app is not recomended for users that are not the organization owner"),w.warn("You are invited as a super_admin but your are not the owner"),w.warn("It's strongly recomended that you do not continue!");let g=await Do({message:"Do you want to continue?",options:[{label:"Yes",value:"yes"},{label:"No",value:"no"}]});if(Lt(g)||g==="no")throw w.error("Canceled deleting the app, exiting"),new Error("App deletion cancelled")}}else c&&!r&&w.warn(`Cannot get the app owner ${W(c)}`);let{error:h}=await o.storage.from("images").remove([`org/${l?.owner_org.id}/${s}/icon`]);h&&!r&&w.error("Could not delete app logo");let{error:d}=await o.storage.from(`apps/${s}/${a}`).remove(["versions"]);d&&!r&&w.error("Could not delete app version");let{error:f}=await o.from("apps").delete().eq("app_id",s);if(f)throw r||w.error("Could not delete app"),new Error(`Could not delete app: ${W(f)}`);let m=await Nn(o,s);return await Ie(e.apikey,{channel:"app",event:"App Deleted",icon:"\u{1F5D1}\uFE0F",user_id:m,tags:{"app-id":s},notify:!1}).catch(()=>{}),r||(w.success("App deleted in Capgo"),fe("Done \u2705")),!0}var qp=require("node:os"),hM=require("node:process");async function fM(t){let e={},r=Object.keys(t);return(await Promise.all(r.map(i=>Mp(i)))).forEach((i,s)=>{i&&(e[r[s]]=i)}),e}async function Cle(){let t=await Rn(),e={"@capgo/cli":ns.version};for(let[r,n]of t)(r.startsWith("@capgo/")||r.startsWith("@capawesome/")||r.startsWith("capacitor"))&&(e[r]=n);return e}async function dM(t,e=!1){e||w.warn(" \u{1F48A} Capgo Doctor \u{1F48A}");let r=await ge(),n=ts("",t.packageJson),i=r?.config?.plugins?.CapacitorUpdater?.version||n,s=r?.config?.appName||"",o=je("",r?.config),a=r?.config?.webDir||"";e||(w.info(` App Name: ${s}`),w.info(` App ID: ${o}`),w.info(` App Version: ${i}`),w.info(` Web Dir: ${a}`),w.info(` OS: ${(0,qp.platform)()} ${(0,qp.version)()}`),w.info(` Node: ${hM.version}`),w.info(" Installed Dependencies:"));let u=await Cle();if(Object.keys(u).length===0)throw e||w.warning("\x1B[31m%s\x1B[0m \u{1F6A8} No dependencies found"),new Error("No dependencies found");if(!e)for(let l of Object.keys(u))w.info(` ${l}: ${u[l]}`);let c={};if(e)c=await fM(u);else{let l=Ut();l.start("Running: Loading latest dependencies"),c=await fM(u),l.stop("Latest Dependencies:");for(let h of Object.keys(c))w.info(` ${h}: ${c[h]}`)}if(JSON.stringify(u)!==JSON.stringify(c))throw e||w.warn("\x1B[31m\u{1F6A8} Some dependencies are not up to date\x1B[0m"),new Error("Some dependencies are not up to date");return e||w.success("\x1B[32m\u2705 All dependencies are up to date\x1B[0m"),{appName:s,appId:o,appVersion:i,webDir:a,installedDependencies:u,latestDependencies:c}}function Sle(t){let e=new Yt;e.headers=["Name","id","Created"],e.rows=[];for(let r of t.toReversed())e.rows.push([r.name??"",r.app_id,Ja(r.created_at)]);w.success("Apps"),w.success(e.toString())}async function Ale(t,e){let{data:r,error:n}=await t.from("apps").select().order("created_at",{ascending:!1});if(n)throw e||w.error("Apps not found"),new Error("Apps not found");return r??[]}async function pM(t,e=!1){e||oe("List apps in Capgo"),await Je(),t.apikey=t.apikey||se();let r=await ye(t.apikey,t.supaHost,t.supaAnon);await De(r,t.apikey,["write","all","read","upload"]),e||w.info("Getting active bundle in Capgo");let n=await Ale(r,e);if(!n.length)throw e||w.error("No apps found"),new Error("No apps found");return e||(w.info(`Active app in Capgo: ${n.length}`),Sle(n),fe("Done \u2705")),n}var mM=require("node:crypto"),Qa=require("node:fs");async function gM(t,e,r=!1){r||oe("Set app"),e.apikey=e.apikey||se();let n=await ge();if(t=je(t,n?.config),!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!t)throw r||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");let i=await ye(e.apikey,e.supaHost,e.supaAnon),o=(await $p(i,["admin","super_admin"])).gid,a=await De(i,e.apikey,["write","all"]);await mt(i,e.apikey,t,4,r);let{name:u,icon:c,retention:l}=e;if(l&&Number.isNaN(Number(l)))throw r||w.error("retention value must be a number"),new Error("Retention value must be a number");if(l&&l<0)throw r||w.error("retention value cannot be less than 0"),new Error("Retention value cannot be less than 0");if(l&&l>=63113904)throw r||w.error("retention value cannot be greater than 63113904 seconds (2 years)"),new Error("Retention value cannot be greater than 63113904 seconds (2 years)");let h,d,f=`icon_${(0,mM.randomUUID)()}`,m="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(c&&(0,Qa.existsSync)(c)?(h=(0,Qa.readFileSync)(c),d=Ya(c)||"image/png",r||w.warn(`Found app icon ${c}`)):(0,Qa.existsSync)(Xr)?(h=(0,Qa.readFileSync)(Xr),d=Ya(Xr)||"image/png",r||w.warn(`Found app icon ${Xr}`)):r||w.warn(`Cannot find app icon in any of the following locations: ${c}, ${Xr}`),h&&d){let{error:b}=await i.storage.from(`images/org/${o}/${t}`).upload(f,h,{contentType:d});if(b)throw r||w.error(`Could not set app ${W(b)}`),new Error(`Could not set app: ${W(b)}`);let{data:S}=await i.storage.from(`images/org/${o}/${t}`).getPublicUrl(f);m=S?.publicUrl||m}let{error:g}=await i.from("apps").update({icon_url:m,name:u,retention:l?l*24*60*60:void 0}).eq("app_id",t).eq("user_id",a);if(g)throw r||w.error(`Could not set app ${W(g)}`),new Error(`Could not set app: ${W(g)}`);return r||fe("Done \u2705"),!0}async function yM(t,e,r=!1){if(r||oe("Set a specific setting in capacitor config"),e.bool&&e.string)throw r||w.error("Bool and string CANNOT be set at the same time"),new Error("Bool and string cannot both be provided");if(!e.bool&&!e.string)throw r||w.error("You MUST provide either bool or string as the value"),new Error("Either bool or string value is required");if(e.bool&&e.bool!=="true"&&e.bool!=="false")throw r||w.error("Invalid bool"),new Error("Invalid bool value; expected true or false");try{let n=await ge(),i=n.config,s=t.split(".");if(s.length===0)throw r||w.error("Invalid path"),new Error("Invalid config path");for(let a of s.slice(0,-1))Object.prototype.hasOwnProperty.call(i,a)||(i[a]={}),i=i[a];let o=e.bool?e.bool==="true":e.string;i[s.at(-1)]=o,await Ua(n,!0),r||w.success(`Set "${t}" to "${o}"`)}catch(n){throw r||w.error(`Cannot set config in capacitor settings ${W(n)}`),new Error(`Cannot set capacitor config: ${W(n)}`)}r||fe("Done \u2705")}async function Ole(t,e,r,n){for await(let i of t)n||w.warn(`Removing ${i.name} created on ${Ja(i.created_at)}`),await jp(e,r,i.name)}function xle(t,e,r){let n=[];for(let i of t??[]){let s=Et(i.name);Tm(s,e)&&Fm(s,r)&&n.push(i)}return n}async function DM(t,e,r=!1){r||oe("Cleanup versions in Capgo"),await Je(),e.apikey=e.apikey||se();let{bundle:n,keep:i=4}=e,s=e.force||!1,o=e.ignoreChannel||!1,a=await ge();if(t=je(t,a?.config),!e.apikey)throw r||w.error("Missing API key, you need to provide an API key to delete your app"),new Error("Missing API key");if(!t)throw r||w.error("Missing argument, you need to provide a appid, or be in a capacitor project"),new Error("Missing appId");let u=await ye(e.apikey,e.supaHost,e.supaAnon);await De(u,e.apikey,["write","all"]),await mt(u,e.apikey,t,3,r),r||w.info("Querying all available versions in Capgo");let c=await Bp(u,t),l=await aM(u,t);if(r||w.info(`Total active versions in Capgo: ${c?.length??0}`),!c?.length)throw r||w.error("No versions found, aborting cleanup"),new Error("No versions found");if(n){let f=Et(n),m=u_(f,"major");r||w.info(`Querying available versions in Capgo between ${vi(f)} and ${vi(m)}`),c=xle(c,f,m),r||w.info(`Active versions in Capgo between ${vi(f)} and ${vi(m)}: ${c?.length??0}`)}let h=[],d=0;for(let f of c){let m=l.find(g=>g===f.id);d<i||m&&!o?(f.keep=m?"\u2705 (Linked to channel)":"\u2705",d+=1):(f.keep="\u274C",h.push(f))}if(!h.length)return r||w.warn("Nothing to be removed, aborting removal..."),{removed:0,kept:d};if(r||oM(c),!s){if(r)throw new Error("Cleanup requires force=true in SDK mode to prevent accidental deletions");{let f=await cn({message:"Do you want to continue removing the versions specified?"});if(Lt(f)||!f)throw w.warn("Not confirmed, aborting removal..."),new Error("Cleanup cancelled by user")}}return r||w.success("You have confirmed removal, removing versions now"),await Ole(h,u,t,r),r||fe("Done \u2705"),{removed:h.length,kept:d}}async function wM(t,e,r=!1){r||oe("Check compatibility");let n={...e,apikey:e.apikey||se()},i=await ge(),s=je(t,i?.config),o=n.channel;if(!o)throw r||w.error("Missing argument, you need to provide a channel"),new Error("Missing channel");if(!n.apikey)throw r||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!s)throw r||w.error("Missing argument, you need to provide an appId, or be in a capacitor project"),new Error("Missing appId");let a=await ye(n.apikey,n.supaHost,n.supaAnon);await De(a,n.apikey,["write","all","read","upload"]),await mt(a,n.apikey,s,1,r);let u=await Lp(a,s,o,n.packageJson,n.nodeModules);if(!r){let c=new Yt;c.headers=["Package","Local version","Remote version","Compatible"],c.theme=Yt.roundTheme,c.rows=[];let l=n.text?"Yes":"\u2705",h=n.text?"No":"\u274C";for(let d of u.finalCompatibility){let{name:f,localVersion:m,remoteVersion:g}=d,b=so(d)?l:h;c.rows.push([f,m,g,b])}w.success("Compatibility"),w.success(c.toString())}return{finalCompatibility:u.finalCompatibility}}var pi=require("node:fs");var is=require("node:buffer"),Mt=require("node:crypto"),bM="aes-128-cbc",di="base64",Up=Mt.constants.RSA_PKCS1_PADDING;function Hp(t){let e=(0,Mt.randomBytes)(16),r=(0,Mt.randomBytes)(16),n=e.toString(di),i=(0,Mt.privateEncrypt)({key:t,padding:Up},r).toString(di);return{sessionKey:r,ivSessionKey:`${n}:${i}`}}function eu(t,e,r){let[n]=r.split(":"),i=is.Buffer.from(n,di),s=(0,Mt.createCipheriv)(bM,e,i);return s.setAutoPadding(!0),is.Buffer.concat([s.update(t),s.final()])}function vM(t,e,r){let[n,i]=e.split(":"),s=(0,Mt.publicDecrypt)({key:r,padding:Up},is.Buffer.from(i,di)),o=is.Buffer.from(n,di),a=(0,Mt.createDecipheriv)(bM,s,o);return a.setAutoPadding(!0),is.Buffer.concat([a.update(t),a.final()])}function tu(t,e){return(0,Mt.privateEncrypt)({key:e,padding:Up},is.Buffer.from(t,di)).toString(di)}function EM(t="pem",e=2048){let{publicKey:r,privateKey:n}=(0,Mt.generateKeyPairSync)("rsa",{modulusLength:e});return t==="pem"?{publicKey:r.export({type:"pkcs1",format:"pem"}),privateKey:n.export({type:"pkcs1",format:"pem"})}:{publicKey:r.export({type:"spki",format:"der"}).toString("base64"),privateKey:n.export({type:"pkcs1",format:"pem"}).toString("base64")}}function _M(t,e){return(0,Mt.publicDecrypt)({key:e,padding:Up},is.Buffer.from(t,di)).toString(di)}function Tle(t,e){let r=t.key||hi,n=e.config.plugins?.CapacitorUpdater?.publicKey;return(0,pi.existsSync)(r)?n=(0,pi.readFileSync)(r,"utf8"):!n&&t.keyData&&(n=t.keyData),{publicKey:n,fallbackKeyPath:r}}async function CM(t,e,r,n=!1){n||oe("Decrypt zip file");try{if(await Je(),!(0,pi.existsSync)(t)){let h=`Zip not found at the path ${t}`;throw n||w.error(h),new Error(h)}let i=await ge();if(!r.key&&!(0,pi.existsSync)(hi)&&!i.config.plugins?.CapacitorUpdater?.privateKey){let h=`Private Key not found at the path ${hi} or in ${i.path}`;throw n||w.error(h),new Error(h)}let{publicKey:s,fallbackKeyPath:o}=Tle(r,i);if(!s){let h=`Cannot find public key ${o} or as keyData option or in ${i.path}`;throw n||w.error(h),new Error(h)}let a=(0,pi.readFileSync)(t),u=vM(a,e,r.keyData??s),c=`${t}_decrypted.zip`;(0,pi.writeFileSync)(c,u),n||w.info(`Decrypted zip file at ${c}`);let l;if(r.checksum){let h=await Xn(u,"sha256"),d=_M(r.checksum,r.keyData??s);if(l=h===d,!l){let f=`Checksum does not match ${h} !== ${d}`;throw n||w.error(f),new Error(f)}n||w.info("Checksum matches")}return n||fe("\u2705 done"),{outputPath:c,checksumMatches:l}}catch(i){throw n||w.error(`Error decrypting zip file ${W(i)}`),i instanceof Error?i:new Error(String(i))}}async function SM(t,e,r,n=!1){n||oe("Delete bundle"),r.apikey=r.apikey||se();let i=await ge();if(e=je(e,i?.config),!r.apikey)throw n||w.error("Missing API key, you need to provide an API key to upload your bundle"),new Error("Missing API key");if(!e)throw n||w.error("Missing argument, you need to provide a appId, or be in a capacitor project"),new Error("Missing appId");if(!t)throw n||w.error("Missing argument, you need to provide a bundleId, or be in a capacitor project"),new Error("Missing bundleId");let s=await ye(r.apikey,r.supaHost,r.supaAnon);return await De(s,r.apikey,["write","all"]),await mt(s,r.apikey,e,3,n),n||(w.info(`Deleting bundle ${e}@${t} from Capgo`),w.info("Keep in mind that you will not be able to reuse this bundle version, it's gone forever")),await jp(s,e,t),n||(w.success(`Bundle ${e}@${t} deleted in Capgo`),fe("Done")),!0}var mi=require("node:fs");function rl(t){console.error(W(t))}async function AM(t,e,r,n=!1){let{json:i}=r,s=!i&&!n;s&&(oe("Encryption"),await Je());try{let o=await ge(),a=!!o.config.plugins?.CapacitorUpdater?.privateKey,u=!!o.config.plugins?.CapacitorUpdater?.publicKey;if(a&&s&&w.warning("There is still a privateKey in the config"),!(0,mi.existsSync)(t)){let S=`Zip not found at the path ${t}`;throw n||(i?rl({error:"zip_not_found"}):w.error(`Error: ${S}`)),new Error(S)}if(!u)throw n||(i?rl({error:"missing_public_key"}):w.warning("Warning: Missing Public Key in config")),new Error("Missing public key in config");let c=r.key||Ir,l=r.keyData||"";if(!(0,mi.existsSync)(c)&&!l)throw n||(i?rl({error:"missing_key"}):(w.warning(`Cannot find a private key at ${c} or as a keyData option`),w.error("Error: Missing key"))),new Error("Missing private key");if((0,mi.existsSync)(c)&&(l=(0,mi.readFileSync)(c,"utf8")),l&&!l.startsWith("-----BEGIN RSA PRIVATE KEY-----"))throw n||(i?rl({error:"invalid_private_key"}):w.error("The private key provided is not a valid RSA Private key")),new Error("Invalid private key format");let h=(0,mi.readFileSync)(t),{sessionKey:d,ivSessionKey:f}=Hp(l),m=eu(h,d,f),g=tu(e,l),b=`${t}_encrypted.zip`;return(0,mi.writeFileSync)(b,m),n||(i?console.log(JSON.stringify({checksum:g,filename:b,ivSessionKey:f},null,2)):(w.success(`Encoded Checksum: ${g}`),w.success(`ivSessionKey: ${f}`),w.success(`Encrypted zip saved at ${b}`),fe("Done \u2705"))),{checksum:g,filename:b,ivSessionKey:f}}catch(o){throw n||(r.json?rl(o):w.error(`Error encrypting zip file ${W(o)}`)),o instanceof Error?o:new Error(String(o))}}var eq=require("node:crypto"),po=require("node:fs"),SE=require("node:path/posix"),AE=require("node:process");var Vp=class extends TransformStream{outChunkSize;constructor(e){let r=new Uint8Array(e),n=0;super({transform(i,s){let o=0;for(;o<i.length;){let a=e-n,u=Math.min(a,i.length-o);r.set(i.subarray(o,o+u),n),o+=u,n+=u,n===e&&(s.enqueue(r),r=new Uint8Array(e),n=0)}},flush(i){n>0&&i.enqueue(r.subarray(0,n))}}),this.outChunkSize=e}};function ss(t){return t=t.trim(),t=t.replace(/<!--[\s\S]*?-->/g,""),e();function e(){return{declaration:r(),root:n()}}function r(){if(!u(/^<\?xml\s*/))return;let d={attributes:{}};for(;!(c()||l("?>"));){let f=s();if(!f)return d;d.attributes[f.name]=f.value}return u(/\?>\s*/),d}function n(){let h=u(/^<([\w-:.]+)\s*/);if(!h)return;let d={name:h[1],attributes:{},children:[]};for(;!(c()||l(">")||l("?>")||l("/>"));){let m=s();if(!m)return d;d.attributes[m.name]=m.value}if(u(/^\s*\/>\s*/))return d;u(/\??>\s*/),d.content=i();let f;for(;f=n();)d.children.push(f);return u(/^<\/[\w-:.]+>\s*/),d}function i(){let h=u(/^([^<]*)/);return h?a(h[1]):""}function s(){let h=u(/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/);if(h)return{name:h[1],value:a(o(h[2]))}}function o(h){return h.replace(/^['"]|['"]$/g,"")}function a(h){return h.replaceAll("<","<").replaceAll(">",">").replaceAll("&","&")}function u(h){let d=t.match(h);if(d)return t=t.slice(d[0].length),d}function c(){return t.length===0}function l(h){return t.startsWith(h)}}var $n=class extends Error{};var Xt=class extends $n{},nl=class extends $n{},zp=class extends $n{bucketName;constructor(e){super(`Invalid bucket name: ${e}`),this.bucketName=e}},Ln=class extends $n{objectName;constructor(e){super(`Invalid object name: ${e}`),this.objectName=e}},os=class extends $n{constructor(){super("accessKey is required")}},ru=class extends $n{constructor(){super("secretKey is required")}},il=class extends $n{constructor(){super("expirySeconds cannot be less than 1 second or more than 7 days")}},gi=class extends $n{statusCode;code;key;bucketName;resource;region;constructor(e,r,n,i={}){super(n),this.statusCode=e,this.code=r,this.key=i.key,this.bucketName=i.bucketName,this.resource=i.resource,this.region=i.region}};async function OM(t){try{let r=ss(await t.text()).root;if(r?.name!=="Error")throw new Error("Invalid root, expected <Error>");let n=r.children.find(c=>c.name==="Code")?.content??"UnknownErrorCode",i=r.children.find(c=>c.name==="Message")?.content??"The error message could not be determined.",s=r.children.find(c=>c.name==="Key")?.content,o=r.children.find(c=>c.name==="BucketName")?.content,a=r.children.find(c=>c.name==="Resource")?.content,u=r.children.find(c=>c.name==="Region")?.content;return new gi(t.status,n,i,{key:s,bucketName:o,resource:a,region:u})}catch{return new gi(t.status,"UnrecognizedError",`Error: Unexpected response code ${t.status} ${t.statusText}. Unable to parse response as XML.`)}}function xM(t){return typeof t!="number"||isNaN(t)?!1:t>=1&&t<=65535}function TM(t){return typeof t!="string"||t.length<3||t.length>63||t.includes("..")||t.match(/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)?!1:!!t.match(/^[a-z0-9][a-z0-9.-]+[a-z0-9]$/)}function as(t){return!(!Fle(t)||t.length===0)}function Fle(t){return!(typeof t!="string"||t.length>1024)}function sl(t){return Array.from(t).map(e=>e.toString(16).padStart(2,"0")).join("")}function oo(t=""){let e={'"':"",""":"",""":"",""":"",""":""};return t.replace(/^("|"|")|("|"|")$/g,r=>e[r])}function rE(t){return t.get("x-amz-version-id")??null}function ao(t){let e=t.toISOString();return e.slice(0,4)+e.slice(5,7)+e.slice(8,13)+e.slice(14,16)+e.slice(17,19)+"Z"}function nE(t){return ao(t).slice(0,8)}function iE(t,e){return`${nE(e)}/${t}/s3/aws4_request`}async function Gp(t){return t instanceof Uint8Array||(t=new TextEncoder().encode(t)),sl(new Uint8Array(await crypto.subtle.digest("SHA-256",t)))}var Ile=["x-amz-server-side-encryption-customer-algorithm","x-amz-server-side-encryption-customer-key","x-amz-server-side-encryption-customer-key-MD5"],Kp=class extends WritableStream{getResult;constructor({client:e,bucketName:r,objectName:n,partSize:i,metadata:s}){let o,a=1,u,c=[],l,h=[];super({start(){},async write(d,f){let g=a++;try{if(g==1&&d.length<i){let A=await e.makeRequest({method:"PUT",headers:new Headers({...s,"Content-Length":String(d.length)}),bucketName:r,objectName:n,payload:d});o={etag:oo(A.headers.get("etag")??void 0),versionId:rE(A.headers)};return}g===1&&(u=(await kle({client:e,bucketName:r,objectName:n,metadata:s})).uploadId);let b={"Content-Length":String(d.length)};for(let A of Ile){let p=s[A];p&&(b[A]=p)}let S=e.makeRequest({method:"PUT",query:{partNumber:g.toString(),uploadId:u},headers:new Headers(b),bucketName:r,objectName:n,payload:d}).then(A=>{let p=A.headers.get("etag")??"";return p&&(p=p.replace(/^"/,"").replace(/"$/,"")),c.push({part:g,etag:p}),A});h.push(S.catch(A=>{l||(l=A)}))}catch(b){throw b}},async close(){if(!o)if(u){if(await Promise.all(h),l)throw l;c.sort((d,f)=>d.part>f.part?1:-1),o=await Ple({client:e,bucketName:r,objectName:n,uploadId:u,etags:c})}else throw new Error("Stream was closed without uploading any data.")}}),this.getResult=()=>{if(o===void 0)throw new Error("Result is not ready. await the stream first.");return o}}};async function kle(t){let e="POST",r=new Headers(t.metadata),s=await(await t.client.makeRequest({method:e,bucketName:t.bucketName,objectName:t.objectName,query:"uploads",headers:r,returnBody:!0})).text(),o=ss(s).root;if(!o||o.name!=="InitiateMultipartUploadResult")throw new Error(`Unexpected response: ${s}`);let a=o.children.find(u=>u.name==="UploadId")?.content;if(!a)throw new Error(`Unable to get UploadId from response: ${s}`);return{uploadId:a}}async function Ple({client:t,bucketName:e,objectName:r,uploadId:n,etags:i}){let s=`
|
|
320
320
|
<CompleteMultipartUpload xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
|
321
321
|
${i.map(h=>` <Part><PartNumber>${h.part}</PartNumber><ETag>${h.etag}</ETag></Part>`).join(`
|
|
322
322
|
`)}
|