@capgo/cli 7.18.23 → 7.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/index.js +214 -214
  2. package/dist/src/sdk.js +1 -1
  3. package/package.json +1 -1
  4. package/dist/package.json +0 -86
  5. package/dist/src/api/app.js +0 -45
  6. package/dist/src/api/app.js.map +0 -1
  7. package/dist/src/api/channels.js +0 -167
  8. package/dist/src/api/channels.js.map +0 -1
  9. package/dist/src/api/cryptoV2.js +0 -102
  10. package/dist/src/api/cryptoV2.js.map +0 -1
  11. package/dist/src/api/update.js +0 -13
  12. package/dist/src/api/update.js.map +0 -1
  13. package/dist/src/api/versions.js +0 -92
  14. package/dist/src/api/versions.js.map +0 -1
  15. package/dist/src/app/add.js +0 -150
  16. package/dist/src/app/add.js.map +0 -1
  17. package/dist/src/app/debug.js +0 -222
  18. package/dist/src/app/debug.js.map +0 -1
  19. package/dist/src/app/delete.js +0 -89
  20. package/dist/src/app/delete.js.map +0 -1
  21. package/dist/src/app/info.js +0 -84
  22. package/dist/src/app/info.js.map +0 -1
  23. package/dist/src/app/list.js +0 -48
  24. package/dist/src/app/list.js.map +0 -1
  25. package/dist/src/app/set.js +0 -96
  26. package/dist/src/app/set.js.map +0 -1
  27. package/dist/src/app/setting.js +0 -50
  28. package/dist/src/app/setting.js.map +0 -1
  29. package/dist/src/bundle/check.js +0 -30
  30. package/dist/src/bundle/check.js.map +0 -1
  31. package/dist/src/bundle/cleanup.js +0 -105
  32. package/dist/src/bundle/cleanup.js.map +0 -1
  33. package/dist/src/bundle/compatibility.js +0 -62
  34. package/dist/src/bundle/compatibility.js.map +0 -1
  35. package/dist/src/bundle/decryptV2.js +0 -76
  36. package/dist/src/bundle/decryptV2.js.map +0 -1
  37. package/dist/src/bundle/delete.js +0 -40
  38. package/dist/src/bundle/delete.js.map +0 -1
  39. package/dist/src/bundle/encryptV2.js +0 -108
  40. package/dist/src/bundle/encryptV2.js.map +0 -1
  41. package/dist/src/bundle/list.js +0 -36
  42. package/dist/src/bundle/list.js.map +0 -1
  43. package/dist/src/bundle/partial.js +0 -277
  44. package/dist/src/bundle/partial.js.map +0 -1
  45. package/dist/src/bundle/unlink.js +0 -70
  46. package/dist/src/bundle/unlink.js.map +0 -1
  47. package/dist/src/bundle/upload.js +0 -940
  48. package/dist/src/bundle/upload.js.map +0 -1
  49. package/dist/src/bundle/upload_interface.js +0 -2
  50. package/dist/src/bundle/upload_interface.js.map +0 -1
  51. package/dist/src/bundle/zip.js +0 -156
  52. package/dist/src/bundle/zip.js.map +0 -1
  53. package/dist/src/channel/add.js +0 -68
  54. package/dist/src/channel/add.js.map +0 -1
  55. package/dist/src/channel/currentBundle.js +0 -54
  56. package/dist/src/channel/currentBundle.js.map +0 -1
  57. package/dist/src/channel/delete.js +0 -77
  58. package/dist/src/channel/delete.js.map +0 -1
  59. package/dist/src/channel/list.js +0 -45
  60. package/dist/src/channel/list.js.map +0 -1
  61. package/dist/src/channel/set.js +0 -220
  62. package/dist/src/channel/set.js.map +0 -1
  63. package/dist/src/checksum.js +0 -46
  64. package/dist/src/checksum.js.map +0 -1
  65. package/dist/src/config/index.js +0 -31
  66. package/dist/src/config/index.js.map +0 -1
  67. package/dist/src/docs.js +0 -280
  68. package/dist/src/docs.js.map +0 -1
  69. package/dist/src/index.js +0 -522
  70. package/dist/src/index.js.map +0 -1
  71. package/dist/src/init.js +0 -803
  72. package/dist/src/init.js.map +0 -1
  73. package/dist/src/keyV2.js +0 -163
  74. package/dist/src/keyV2.js.map +0 -1
  75. package/dist/src/login.js +0 -51
  76. package/dist/src/login.js.map +0 -1
  77. package/dist/src/organisation/add.js +0 -82
  78. package/dist/src/organisation/add.js.map +0 -1
  79. package/dist/src/organisation/delete.js +0 -91
  80. package/dist/src/organisation/delete.js.map +0 -1
  81. package/dist/src/organisation/index.js +0 -5
  82. package/dist/src/organisation/index.js.map +0 -1
  83. package/dist/src/organisation/list.js +0 -60
  84. package/dist/src/organisation/list.js.map +0 -1
  85. package/dist/src/organisation/set.js +0 -95
  86. package/dist/src/organisation/set.js.map +0 -1
  87. package/dist/src/sdk.js.map +0 -1
  88. package/dist/src/types/supabase.types.js +0 -86
  89. package/dist/src/types/supabase.types.js.map +0 -1
  90. package/dist/src/user/account.js +0 -31
  91. package/dist/src/user/account.js.map +0 -1
  92. package/dist/src/utils/latest-version.js +0 -26
  93. package/dist/src/utils/latest-version.js.map +0 -1
  94. package/dist/src/utils.js +0 -1222
  95. package/dist/src/utils.js.map +0 -1
package/dist/src/sdk.js CHANGED
@@ -315,7 +315,7 @@ ${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.18.23",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"},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.
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.0",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"},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
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("&lt;","<").replaceAll("&gt;",">").replaceAll("&amp;","&")}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={'"':"","&quot;":"","&#34;":"","&QUOT;":"","&#x00022":""};return t.replace(/^("|&quot;|&#34;)|("|&quot;|&#34;)$/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(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/cli",
3
- "version": "7.18.23",
3
+ "version": "7.19.0",
4
4
  "description": "A CLI to upload to capgo servers",
5
5
  "author": "Martin martin@capgo.app",
6
6
  "license": "Apache 2.0",
package/dist/package.json DELETED
@@ -1,86 +0,0 @@
1
- {
2
- "name": "@capgo/cli",
3
- "version": "7.18.23",
4
- "description": "A CLI to upload to capgo servers",
5
- "author": "Martin martin@capgo.app",
6
- "license": "Apache 2.0",
7
- "homepage": "https://github.com/Cap-go/CLI#readme",
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/Cap-go/CLI.git"
11
- },
12
- "bugs": {
13
- "url": "https://github.com/Cap-go/CLI/issues"
14
- },
15
- "keywords": [
16
- "appflow alternative",
17
- "ionic",
18
- "capacitor",
19
- "auto update",
20
- "live update",
21
- "capgo",
22
- "cli",
23
- "upload",
24
- "capgo-cli",
25
- "sdk"
26
- ],
27
- "exports": {
28
- ".": {
29
- "import": "./dist/index.js",
30
- "require": "./dist/index.js"
31
- },
32
- "./sdk": {
33
- "types": "./dist/src/sdk.d.ts",
34
- "import": "./dist/src/sdk.js",
35
- "require": "./dist/src/sdk.js"
36
- }
37
- },
38
- "main": "dist/index.js",
39
- "types": "dist/src/index.d.ts",
40
- "bin": {
41
- "capgo": "dist/index.js"
42
- },
43
- "engines": {
44
- "npm": ">=8.0.0",
45
- "node": ">=20.0.0"
46
- },
47
- "scripts": {
48
- "build": "tsc && node build.mjs",
49
- "dev": "NODE_ENV=development ncc build",
50
- "no-debug": "node dist/index.js",
51
- "dev-build": "SUPA_DB=development ncc build",
52
- "pack": "pkg",
53
- "types": "npx --yes supabase gen types typescript --project-id=xvwzpoazmxkqosrdewyv > src/types/supabase.types.ts",
54
- "lint": "eslint \"src/**/*.ts\" --fix",
55
- "check-posix-paths": "node test/check-posix-paths.js",
56
- "generate-docs": "node dist/index.js generate-docs README.md"
57
- },
58
- "devDependencies": {
59
- "@antfu/eslint-config": "^6.1.0",
60
- "@bradenmacdonald/s3-lite-client": "npm:@jsr/bradenmacdonald__s3-lite-client@0.9.4",
61
- "@capacitor/cli": "^7.4.4",
62
- "@capgo/find-package-manager": "^0.0.18",
63
- "@clack/prompts": "^0.11.0",
64
- "@sauber/table": "npm:@jsr/sauber__table",
65
- "@std/semver": "npm:@jsr/std__semver@1.0.6",
66
- "@supabase/supabase-js": "^2.79.0",
67
- "@types/adm-zip": "^0.5.7",
68
- "@types/node": "^24.9.1",
69
- "@types/prettyjson": "^0.0.33",
70
- "@types/tmp": "^0.2.6",
71
- "@vercel/ncc": "^0.38.4",
72
- "adm-zip": "^0.5.16",
73
- "ci-info": "^4.3.1",
74
- "commander": "^14.0.2",
75
- "esbuild": "^0.25.11",
76
- "eslint": "^9.38.0",
77
- "git-format-staged": "3.1.1",
78
- "husky": "^9.1.7",
79
- "is-wsl": "^3.1.0",
80
- "open": "^10.1.2",
81
- "prettyjson": "^1.2.5",
82
- "tmp": "^0.2.5",
83
- "tus-js-client": "^4.3.1",
84
- "typescript": "^5.9.3"
85
- }
86
- }
@@ -1,45 +0,0 @@
1
- import { log } from '@clack/prompts';
2
- import { getPMAndCommand, isAllowedAppOrg, OrganizationPerm } from '../utils';
3
- export async function checkAppExists(supabase, appid) {
4
- const { data: app } = await supabase
5
- .rpc('exist_app_v2', { appid })
6
- .single();
7
- return !!app;
8
- }
9
- export async function checkAppExistsAndHasPermissionOrgErr(supabase, apikey, appid, requiredPermission, silent = false) {
10
- const pm = getPMAndCommand();
11
- const permissions = await isAllowedAppOrg(supabase, apikey, appid);
12
- if (!permissions.okay) {
13
- switch (permissions.error) {
14
- case 'INVALID_APIKEY': {
15
- const msg = 'Invalid apikey, such apikey does not exists!';
16
- if (!silent)
17
- log.error(msg);
18
- throw new Error(msg);
19
- }
20
- case 'NO_APP': {
21
- const msg = `App ${appid} does not exist, run first \`${pm.runner} @capgo/cli app add ${appid}\` to create it`;
22
- if (!silent)
23
- log.error(msg);
24
- throw new Error(msg);
25
- }
26
- case 'NO_ORG': {
27
- const msg = 'Could not find organization, please contact support to resolve this!';
28
- if (!silent)
29
- log.error(msg);
30
- throw new Error(msg);
31
- }
32
- }
33
- }
34
- const remotePermNumber = permissions.data;
35
- const requiredPermNumber = requiredPermission;
36
- if (requiredPermNumber > remotePermNumber) {
37
- const msg = `Insuficcent permissions for app ${appid}. Current permission: ${OrganizationPerm[permissions.data]}, required for this action: ${OrganizationPerm[requiredPermission]}.`;
38
- if (!silent)
39
- log.error(msg);
40
- throw new Error(msg);
41
- }
42
- return permissions.data;
43
- }
44
- export const newIconPath = 'assets/icon.png';
45
- //# sourceMappingURL=app.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/api/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE7E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAkC,EAAE,KAAa;IACpF,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ;SACjC,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC;SAC9B,MAAM,EAAE,CAAA;IACX,OAAO,CAAC,CAAC,GAAG,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,QAAkC,EAClC,MAAc,EACd,KAAa,EACb,kBAAoC,EACpC,MAAM,GAAG,KAAK;IAEd,MAAM,EAAE,GAAG,eAAe,EAAE,CAAA;IAC5B,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAClE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,QAAQ,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,GAAG,GAAG,8CAA8C,CAAA;gBAC1D,IAAI,CAAC,MAAM;oBACT,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAChB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,OAAO,KAAK,gCAAgC,EAAE,CAAC,MAAM,uBAAuB,KAAK,iBAAiB,CAAA;gBAC9G,IAAI,CAAC,MAAM;oBACT,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAChB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,sEAAsE,CAAA;gBAClF,IAAI,CAAC,MAAM;oBACT,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAChB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAc,CAAA;IACnD,MAAM,kBAAkB,GAAG,kBAA4B,CAAA;IAEvD,IAAI,kBAAkB,GAAG,gBAAgB,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,mCAAmC,KAAK,yBAAyB,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,+BAA+B,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAA;QACrL,IAAI,CAAC,MAAM;YACT,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAA;AACzB,CAAC;AAQD,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAA"}
@@ -1,167 +0,0 @@
1
- import { confirm as confirmC, intro, log, outro, spinner } from '@clack/prompts';
2
- import { Table } from '@sauber/table';
3
- import { formatError } from '../utils';
4
- export async function checkVersionNotUsedInChannel(supabase, appid, versionData, options = {}) {
5
- const { silent = false, autoUnlink = false } = options;
6
- const { data: channelFound, error: errorChannel } = await supabase
7
- .from('channels')
8
- .select()
9
- .eq('app_id', appid)
10
- .eq('version', versionData.id);
11
- if (errorChannel) {
12
- if (!silent)
13
- log.error(`Cannot check Version ${appid}@${versionData.name}: ${formatError(errorChannel)}`);
14
- throw new Error(`Cannot check version ${appid}@${versionData.name}: ${formatError(errorChannel)}`);
15
- }
16
- if (!channelFound?.length)
17
- return;
18
- if (silent)
19
- throw new Error(`Version ${appid}@${versionData.name} is used in ${channelFound.length} channel(s)`); // No interactivity allowed
20
- intro(`❌ Version ${appid}@${versionData.name} is used in ${channelFound.length} channel${channelFound.length > 1 ? 's' : ''}`);
21
- let shouldUnlink = autoUnlink;
22
- if (!autoUnlink) {
23
- const response = await confirmC({ message: 'unlink it?' });
24
- shouldUnlink = response === true;
25
- }
26
- if (!shouldUnlink) {
27
- log.error('Unlink it first');
28
- throw new Error(`Version ${appid}@${versionData.name} is still linked to channel(s)`); // Stop command
29
- }
30
- for (const channel of channelFound) {
31
- const s = spinner();
32
- s.start(`Unlinking channel ${channel.name}`);
33
- const unknownVersion = await findUnknownVersion(supabase, appid, { silent });
34
- if (!unknownVersion) {
35
- s.stop(`Cannot find unknown version for ${appid}`);
36
- throw new Error(`Cannot find unknown version for ${appid}`);
37
- }
38
- const { error: errorChannelUpdate } = await supabase
39
- .from('channels')
40
- .update({ version: unknownVersion.id })
41
- .eq('id', channel.id);
42
- if (errorChannelUpdate) {
43
- s.stop(`Cannot update channel ${channel.name} ${formatError(errorChannelUpdate)}`);
44
- throw new Error(`Cannot update channel ${channel.name}: ${formatError(errorChannelUpdate)}`);
45
- }
46
- s.stop(`✅ Channel ${channel.name} unlinked`);
47
- }
48
- outro(`Version unlinked from ${channelFound.length} channel${channelFound.length > 1 ? 's' : ''}`);
49
- }
50
- export async function findUnknownVersion(supabase, appId, options = {}) {
51
- const { silent = false } = options;
52
- const { data, error } = await supabase
53
- .from('app_versions')
54
- .select('id')
55
- .eq('app_id', appId)
56
- .eq('name', 'unknown')
57
- .single();
58
- if (error) {
59
- if (!silent)
60
- log.error(`Cannot call findUnknownVersion as it returned an error.\n${formatError(error)}`);
61
- throw new Error(`Cannot retrieve unknown version for app ${appId}: ${formatError(error)}`);
62
- }
63
- return data;
64
- }
65
- export function createChannel(supabase, update) {
66
- return supabase
67
- .from('channels')
68
- .insert(update)
69
- .select()
70
- .single();
71
- }
72
- export function delChannel(supabase, name, appId, _userId) {
73
- return supabase
74
- .from('channels')
75
- .delete()
76
- .eq('name', name)
77
- .eq('app_id', appId)
78
- .single();
79
- }
80
- export function findChannel(supabase, appId, name) {
81
- return supabase
82
- .from('channels')
83
- .select()
84
- .eq('app_id', appId)
85
- .eq('name', name)
86
- .single();
87
- }
88
- export function findChannelDevices(supabase, appId, channelId) {
89
- return supabase
90
- .from('channel_devices')
91
- .select('id')
92
- .eq('app_id', appId)
93
- .eq('channel_id', channelId);
94
- }
95
- export function delChannelDevices(supabase, appId, channelId) {
96
- return supabase
97
- .from('channel_devices')
98
- .delete()
99
- .eq('app_id', appId)
100
- .eq('channel_id', channelId);
101
- }
102
- export function findBundleIdByChannelName(supabase, appId, name) {
103
- return supabase
104
- .from('channels')
105
- .select(`
106
- id,
107
- version (id, name)
108
- `)
109
- .eq('app_id', appId)
110
- .eq('name', name)
111
- .single()
112
- .throwOnError()
113
- .then(({ data }) => data?.version);
114
- }
115
- export function displayChannels(data, silent = false) {
116
- if (silent)
117
- return;
118
- const t = new Table();
119
- t.theme = Table.roundTheme;
120
- t.headers = ['Name', 'Version', 'Public', 'iOS', 'Android', 'Auto Update', 'Native Auto Update', 'Device Self Set', 'Progressive Deploy', 'Secondary Version', 'Secondary Version Percentage', 'AB Testing', 'AB Testing Version', 'AB Testing Percentage', 'Emulator', 'Dev'];
121
- t.rows = [];
122
- for (const row of data.toReversed()) {
123
- t.rows.push([
124
- row.name,
125
- row.version?.name,
126
- row.public ? '✅' : '❌',
127
- row.ios ? '✅' : '❌',
128
- row.android ? '✅' : '❌',
129
- row.disable_auto_update,
130
- row.disable_auto_update_under_native ? '❌' : '✅',
131
- row.allow_device_self_set ? '✅' : '❌',
132
- row.allow_emulator ? '✅' : '❌',
133
- row.allow_dev ? '✅' : '❌',
134
- ]);
135
- }
136
- log.success('Channels');
137
- log.success(t.toString());
138
- }
139
- export async function getActiveChannels(supabase, appid, silent = false) {
140
- const { data, error: vError } = await supabase
141
- .from('channels')
142
- .select(`
143
- id,
144
- name,
145
- public,
146
- allow_emulator,
147
- allow_dev,
148
- ios,
149
- android,
150
- allow_device_self_set,
151
- disable_auto_update_under_native,
152
- disable_auto_update,
153
- created_at,
154
- created_by,
155
- app_id,
156
- version (id, name)
157
- `)
158
- .eq('app_id', appid)
159
- .order('created_at', { ascending: false });
160
- if (vError) {
161
- if (!silent)
162
- log.error(`App ${appid} not found in database`);
163
- throw new Error(`App ${appid} not found in database: ${formatError(vError)}`);
164
- }
165
- return data;
166
- }
167
- //# sourceMappingURL=channels.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../src/api/channels.ts"],"names":[],"mappings":"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"}
@@ -1,102 +0,0 @@
1
- import { Buffer } from 'node:buffer';
2
- import { constants, createCipheriv, createDecipheriv, generateKeyPairSync, privateEncrypt, publicDecrypt, randomBytes, } from 'node:crypto';
3
- const algorithm = 'aes-128-cbc';
4
- const formatB64 = 'base64';
5
- const padding = constants.RSA_PKCS1_PADDING;
6
- export function generateSessionKey(key) {
7
- const initVector = randomBytes(16);
8
- const sessionKey = randomBytes(16);
9
- const ivB64 = initVector.toString(formatB64);
10
- const sessionb64Encrypted = privateEncrypt({
11
- key,
12
- padding,
13
- }, sessionKey).toString(formatB64);
14
- return {
15
- sessionKey,
16
- ivSessionKey: `${ivB64}:${sessionb64Encrypted}`,
17
- };
18
- }
19
- export function encryptSourceV2(source, sessionKey, ivSessionKey) {
20
- const [ivB64] = ivSessionKey.split(':');
21
- const initVector = Buffer.from(ivB64, formatB64);
22
- const cipher = createCipheriv(algorithm, sessionKey, initVector);
23
- cipher.setAutoPadding(true);
24
- const encryptedData = Buffer.concat([cipher.update(source), cipher.final()]);
25
- return encryptedData;
26
- }
27
- export function decryptSourceV2(source, ivSessionKey, key) {
28
- const [ivB64, sessionb64Encrypted] = ivSessionKey.split(':');
29
- const sessionKey = publicDecrypt({
30
- key,
31
- padding,
32
- }, Buffer.from(sessionb64Encrypted, formatB64));
33
- // ivB64 to uft-8
34
- const initVector = Buffer.from(ivB64, formatB64);
35
- // console.log('\nSessionB64', sessionB64)
36
- const decipher = createDecipheriv(algorithm, sessionKey, initVector);
37
- decipher.setAutoPadding(true);
38
- const decryptedData = Buffer.concat([decipher.update(source), decipher.final()]);
39
- return decryptedData;
40
- }
41
- export function encryptChecksumV2(checksum, key) {
42
- const checksumEncrypted = privateEncrypt({
43
- key,
44
- padding,
45
- }, Buffer.from(checksum, formatB64)).toString(formatB64);
46
- return checksumEncrypted;
47
- }
48
- export function createRSA(format = 'pem', keySize = 2048) {
49
- const { publicKey, privateKey } = generateKeyPairSync('rsa', {
50
- // The standard secure default length for RSA keys is 2048 bits
51
- modulusLength: keySize,
52
- });
53
- // Generate RSA key pair
54
- if (format === 'pem') {
55
- return {
56
- publicKey: publicKey.export({
57
- type: 'pkcs1',
58
- format: 'pem',
59
- }),
60
- privateKey: privateKey.export({
61
- type: 'pkcs1',
62
- format: 'pem',
63
- }),
64
- };
65
- }
66
- else {
67
- return {
68
- publicKey: publicKey.export({
69
- type: 'spki',
70
- format: 'der',
71
- }).toString('base64'),
72
- privateKey: privateKey.export({
73
- type: 'pkcs1',
74
- format: 'pem',
75
- }).toString('base64'),
76
- };
77
- }
78
- }
79
- export function decryptChecksumV2(checksum, key) {
80
- const checksumDecrypted = publicDecrypt({
81
- key,
82
- padding,
83
- }, Buffer.from(checksum, formatB64)).toString(formatB64);
84
- return checksumDecrypted;
85
- }
86
- export function createRSAV2() {
87
- const { publicKey, privateKey } = generateKeyPairSync('rsa', {
88
- modulusLength: 2048,
89
- });
90
- // Generate RSA key pair
91
- return {
92
- publicKey: publicKey.export({
93
- type: 'pkcs1',
94
- format: 'pem',
95
- }),
96
- privateKey: privateKey.export({
97
- type: 'pkcs1',
98
- format: 'pem',
99
- }),
100
- };
101
- }
102
- //# sourceMappingURL=cryptoV2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cryptoV2.js","sourceRoot":"","sources":["../../../src/api/cryptoV2.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { log } from '@clack/prompts';
2
- import pack from '../../package.json';
3
- import { getLatestVersion } from '../utils/latest-version';
4
- export async function checkAlerts() {
5
- const latest = await getLatestVersion('@capgo/cli') ?? '';
6
- const major = latest?.split('.')[0];
7
- if (latest !== pack.version) {
8
- log.warning(`🚨 You are using @capgo/cli@${pack.version} it's not the latest version.
9
- Please use @capgo/cli@${latest}" or @capgo/cli@${major} to keep up to date with the latest features and bug fixes.`);
10
- }
11
- // check if the app use old encryption key and if so alert the user it not secure enouth and it should migrate on v2
12
- }
13
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/api/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,IAAI,MAAM,oBAAoB,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;IACzD,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,GAAG,CAAC,OAAO,CAAC,+BAA+B,IAAI,CAAC,OAAO;wBACnC,MAAM,mBAAmB,KAAK,6DAA6D,CAC9G,CAAA;IACH,CAAC;IACD,oHAAoH;AACtH,CAAC"}
@@ -1,92 +0,0 @@
1
- import { log } from '@clack/prompts';
2
- import { Table } from '@sauber/table';
3
- import { formatError, getHumanDate } from '../utils';
4
- import { checkVersionNotUsedInChannel } from './channels';
5
- export async function deleteAppVersion(supabase, appid, bundle, options = {}) {
6
- const { silent = false } = options;
7
- const { error: delAppSpecVersionError } = await supabase
8
- .from('app_versions')
9
- .update({ deleted: true })
10
- .eq('app_id', appid)
11
- .eq('deleted', false)
12
- .eq('name', bundle);
13
- if (delAppSpecVersionError) {
14
- const message = `App version ${appid}@${bundle} not found in database`;
15
- if (!silent)
16
- log.error(message);
17
- throw new Error(`${message}: ${formatError(delAppSpecVersionError)}`);
18
- }
19
- }
20
- export async function deleteSpecificVersion(supabase, appid, bundle, options = {}) {
21
- const { silent = false, autoUnlink = false } = options;
22
- const versionData = await getVersionData(supabase, appid, bundle, { silent });
23
- await checkVersionNotUsedInChannel(supabase, appid, versionData, { silent, autoUnlink });
24
- await deleteAppVersion(supabase, appid, bundle, { silent });
25
- }
26
- export function displayBundles(data, silent = false) {
27
- if (silent)
28
- return;
29
- if (!data.length)
30
- throw new Error('No bundle found');
31
- const t = new Table();
32
- t.theme = Table.roundTheme;
33
- t.headers = ['Version', 'Created', 'Keep'];
34
- t.rows = [];
35
- for (const row of data.toReversed()) {
36
- t.rows.push([
37
- row.name,
38
- getHumanDate(row.created_at),
39
- row.keep ?? '',
40
- ]);
41
- }
42
- log.success('Bundles');
43
- log.success(t.toString());
44
- }
45
- export async function getActiveAppVersions(supabase, appid, options = {}) {
46
- const { silent = false } = options;
47
- const { data, error: vError } = await supabase
48
- .from('app_versions')
49
- .select()
50
- .eq('app_id', appid)
51
- .eq('deleted', false)
52
- .order('created_at', { ascending: false });
53
- if (vError) {
54
- const message = `App ${appid} not found in database`;
55
- if (!silent)
56
- log.error(message);
57
- throw new Error(`${message}: ${formatError(vError)}`);
58
- }
59
- return data ?? [];
60
- }
61
- export async function getChannelsVersion(supabase, appid, options = {}) {
62
- const { silent = false } = options;
63
- const { data: channels, error: channelsError } = await supabase
64
- .from('channels')
65
- .select('version')
66
- .eq('app_id', appid);
67
- if (channelsError) {
68
- const message = `App ${appid} not found in database`;
69
- if (!silent)
70
- log.error(message);
71
- throw new Error(`${message}: ${formatError(channelsError)}`);
72
- }
73
- return (channels ?? []).map(c => c.version);
74
- }
75
- export async function getVersionData(supabase, appid, bundle, options = {}) {
76
- const { silent = false } = options;
77
- const { data: versionData, error: versionIdError } = await supabase
78
- .from('app_versions')
79
- .select()
80
- .eq('app_id', appid)
81
- .eq('name', bundle)
82
- .eq('deleted', false)
83
- .single();
84
- if (!versionData || versionIdError) {
85
- const message = `App version ${appid}@${bundle} doesn't exist`;
86
- if (!silent)
87
- log.error(message);
88
- throw new Error(`${message}${versionIdError ? `: ${formatError(versionIdError)}` : ''}`);
89
- }
90
- return versionData;
91
- }
92
- //# sourceMappingURL=versions.js.map