@capgo/cli 2.3.14 → 2.3.16

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/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [2.3.16](https://github.com/Cap-go/capgo-cli/compare/v2.3.15...v2.3.16) (2022-12-17)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * cli detect if app exist ([0cb964e](https://github.com/Cap-go/capgo-cli/commit/0cb964e9d30ae5aef2e990d08a19d7cf80581f6c))
11
+
12
+ ### [2.3.15](https://github.com/Cap-go/capgo-cli/compare/v2.3.14...v2.3.15) (2022-12-12)
13
+
5
14
  ### [2.3.14](https://github.com/Cap-go/capgo-cli/compare/v2.3.13...v2.3.14) (2022-12-12)
6
15
 
7
16
  ### [2.3.13](https://github.com/Cap-go/capgo-cli/compare/v2.3.12...v2.3.13) (2022-12-11)
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- (()=>{"use strict";var e={577:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.checkAppExistsAndHasPermission=void 0;const i=n(304);o.checkAppExistsAndHasPermission=(e,o,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:r}=yield e.rpc("exist_app",{appid:o,apikey:n}).single();t&&!r||i.program.error("No permission for this app")}))},978:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.checkVersionNotUsedInChannel=void 0;const i=n(304),r=n(880);o.checkVersionNotUsedInChannel=(e,o,n,a,s)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:p}=yield e.from("channels").select().eq("app_id",o).eq("created_by",n).eq("version",a.id);if(p&&i.program.error(`Cannot check Version ${o}@${s} ${(0,r.formatError)(p)}`),t&&t.length>0){const e=(0,r.convertAppName)(o);i.program.error(`❌ Version ${o}@${s} is used in a channel, unlink it first\nhttps://web.capgo.app/app/p/${e}/channel/${t[0].id}\n${(0,r.formatError)(p)}`)}}))},113:(e,o,n)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.createRSA=o.encryptSource=o.decryptSource=void 0;const t=n(663),i="aes-128-cbc",r="sha256",a="base64",s=t.constants.RSA_PKCS1_OAEP_PADDING;o.decryptSource=(e,o,n)=>{const[p,d]=o.split(":"),c=(0,t.privateDecrypt)({key:n,padding:s,oaepHash:r},Buffer.from(d,a)),l=Buffer.from(p,a),u=c.toString(a);console.log("\nSessionB64",u);const y=(0,t.createDecipheriv)(i,c,l);return y.setAutoPadding(!0),Buffer.concat([y.update(e),y.final()])},o.encryptSource=(e,o)=>{const n=(0,t.randomBytes)(16),p=(0,t.randomBytes)(16),d=(0,t.createCipheriv)(i,p,n);d.setAutoPadding(!0);const c=`${n.toString(a)}:${(0,t.publicEncrypt)({key:o,padding:s,oaepHash:r},p).toString(a)}`;return{encryptedData:Buffer.concat([d.update(e),d.final()]),ivSessionKey:c}},o.createRSA=()=>{const{publicKey:e,privateKey:o}=(0,t.generateKeyPairSync)("rsa",{modulusLength:2048});return{publicKey:e.export({type:"pkcs1",format:"pem"}),privateKey:o.export({type:"pkcs1",format:"pem"})}}},386:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.checkVersionNotUsedInDeviceOverride=void 0;const i=n(304),r=n(880);o.checkVersionNotUsedInDeviceOverride=(e,o,n,a)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:s}=yield e.from("devices_override").select().eq("app_id",o).eq("version",n.id);if(s&&i.program.error(`Cannot check Device override ${o}@${a} ${(0,r.formatError)(s)}`),t&&t.length>0){const e=(0,r.convertAppName)(o);i.program.error(`❌ Version ${o} @${a} is used in a device override, unlink it first\nhttps://web.capgo.app/app/p/${e}/d/${t[0].device_id}\n${(0,r.formatError)(s)}`)}}))},191:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.deleteFromStorage=void 0;const i=n(304),r=n(880);o.deleteFromStorage=(e,o,n,a,s)=>t(void 0,void 0,void 0,(function*(){const{error:t}=yield e.storage.from("apps").remove([`${o}/${n}/versions/${a.bucket_id} `]);t&&i.program.error(`Something went wrong when trying to delete ${n} @${s} ${(0,r.formatError)(t)} `)}))},340:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.getVersionData=o.getActiveAppVersions=o.displayBundles=o.deleteSpecificVersion=o.deleteAppVersion=void 0;const i=n(304),r=n(847),a=n(880),s=n(978),p=n(386),d=n(191);o.deleteAppVersion=(e,o,n,r)=>t(void 0,void 0,void 0,(function*(){const{error:t}=yield e.from("app_versions").update({deleted:!0}).eq("app_id",o).eq("deleted",!1).eq("user_id",n).eq("name",r);t&&i.program.error(`App Version ${o}@${r} not found in database '${(0,a.formatError)(t)}'`)})),o.deleteSpecificVersion=(e,n,i,r)=>t(void 0,void 0,void 0,(function*(){const t=yield(0,o.getVersionData)(e,n,i,r);yield(0,s.checkVersionNotUsedInChannel)(e,n,i,t,r),yield(0,p.checkVersionNotUsedInDeviceOverride)(e,n,t,r),yield(0,d.deleteFromStorage)(e,i,n,t,r),yield(0,o.deleteAppVersion)(e,n,i,r)})),o.displayBundles=e=>{const o=new r.Table({title:"Bundles",charLength:{"❌":2,"✅":2}});e.reverse().forEach((e=>{o.addRow(Object.assign({Version:e.name,Created:(0,a.getHumanDate)(e)},void 0!==e.keep?{Keep:e.keep}:{}))})),o.printTable()},o.getActiveAppVersions=(e,o,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:r}=yield e.from("app_versions").select().eq("app_id",o).eq("user_id",n).eq("deleted",!1).order("created_at",{ascending:!1});return r&&i.program.error(`App ${o} not found in database ${(0,a.formatError)(r)} `),t})),o.getVersionData=(e,o,n,r)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:s}=yield e.from("app_versions").select().eq("app_id",o).eq("user_id",n).eq("name",r).eq("deleted",!1).single();return t&&!s||i.program.error(`App Version ${o}@${r} doesn't exist ${(0,a.formatError)(s)}`),t}))},870:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.addApp=void 0;const i=n(304),r=n(663),a=n(147),s=n(470),p=n(11),d=n(880),c="assets/icon.png";o.addApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,t;let{name:l,icon:u}=o;const y=o.apikey||(0,d.findSavedKey)(),v=yield(0,d.getConfig)(),g=(0,d.useLogSnag)();e=e||(null===(n=null==v?void 0:v.app)||void 0===n?void 0:n.appId),l=l||(null===(t=null==v?void 0:v.app)||void 0===t?void 0:t.appName)||"Unknown",u=u||"resources/icon.png",y||i.program.error("Missing API key, you need to provide a API key to add your app"),e&&l||i.program.error("Missing argument, you need to provide a appid and a name, or be in a capacitor project"),console.log(`Add ${e} to Capgo`);const f=(0,d.createSupabaseClient)(y),h=yield(0,d.verifyUser)(f,y,["write","all"]);let m,b;yield(0,d.checkPlanValid)(f,h),console.log("Adding..."),u&&(0,s.existsSync)(u)?(m=(0,a.readFileSync)(u),b=(0,p.getType)(u)||"image/png",console.warn(`Found app icon ${u}`)):(0,s.existsSync)(c)?(m=(0,a.readFileSync)(c),b=(0,p.getType)(c)||"image/png",console.warn(`Found app icon ${c}`)):console.warn(`Cannot find app icon in any of the following locations: ${u}, ${c}`);const{data:_,error:k}=yield f.rpc("exist_app",{appid:e,apikey:y}).single();(_||k)&&i.program.error(`App already exists ${(0,d.formatError)(k)}`);const w=`icon_${(0,r.randomUUID)()}`;let $="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(m&&b){const{error:o}=yield f.storage.from(`images/${h}/${e}`).upload(w,m,{contentType:b});o&&i.program.error(`Could not add app ${(0,d.formatError)(o)}`);const{data:n}=yield f.storage.from(`images/${h}/${e}`).getPublicUrl(w);$=(null==n?void 0:n.publicUrl)||$}const{error:x}=yield f.from("apps").insert({icon_url:$,user_id:h,name:l,app_id:e});x&&i.program.error(`Could not add app ${(0,d.formatError)(x)}`);const{error:S}=yield f.from("app_versions").insert([{user_id:h,deleted:!0,name:"unknown",app_id:e},{user_id:h,deleted:!0,name:"builtin",app_id:e}]);S&&i.program.error(`Could not add app ${(0,d.formatError)(S)}`),g.publish({channel:"app",event:"App Added",icon:"🎉",tags:{"user-id":h,"app-id":e},notify:!1}).catch(),console.log("App added to server, you can upload a bundle now")}))},600:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))},i=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o,n=e[Symbol.asyncIterator];return n?n.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),o={},t("next"),t("throw"),t("return"),o[Symbol.asyncIterator]=function(){return this},o);function t(n){o[n]=e[n]&&function(o){return new Promise((function(t,i){!function(e,o,n,t){Promise.resolve(t).then((function(o){e({value:o,done:n})}),o)}(t,i,(o=e[n](o)).done,o.value)}))}}},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.cleanupApp=void 0;const a=n(304),s=r(n(505)),p=r(n(616)),d=n(880),c=n(340),l=n(577),u=(0,p.default)();o.cleanupApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n;const r=o.apikey||(0,d.findSavedKey)(),{bundle:p,keep:y=4}=o,v=o.force||!1,g=yield(0,d.getConfig)();e=e||(null===(n=null==g?void 0:g.app)||void 0===n?void 0:n.appId),r||a.program.error("Missing API key, you need to provide an API key to delete your app"),e||a.program.error("Missing argument, you need to provide a appid, or be in a capacitor project");const f=(0,d.createSupabaseClient)(r),h=yield(0,d.verifyUser)(f,r);yield(0,l.checkAppExistsAndHasPermission)(f,e,r),console.log("Querying all available versions in Capgo");let m=yield(0,c.getActiveAppVersions)(f,e,h);if(console.log(`Total active versions in Capgo: ${null==m?void 0:m.length}`),0===(null==m?void 0:m.length))return void console.log("No versions found, aborting cleanup");if(p){const e=`${s.default.inc(p,"major")}`;console.log(`Querying available versions in Capgo between ${p} and ${e}`),m=((e,o,n)=>{const t=[];return null==e||e.forEach((e=>{s.default.gte(e.name,o)&&s.default.lt(e.name,`${n}`)&&t.push(e)})),t})(m,p,e),console.log(`Active versions in Capgo between ${p} and ${e}: ${null==m?void 0:m.length}`)}const b=[];if(m.forEach(((e,o)=>{o<y?e.keep="✅":(e.keep="❌",b.push(e))})),0!==b.length){if((0,c.displayBundles)(m),!v&&"yes"!==u("Do you want to continue removing the versions specified? Type yes to confirm: "))return void console.log("Not confirmed, aborting removal...");console.log("You have confirmed removal, removing versions now"),yield((e,o,n,r)=>{var a,s,p;return t(void 0,void 0,void 0,(function*(){var t,l,u,y;try{for(a=!0,s=i(e);!(t=(p=yield s.next()).done);){y=p.value,a=!1;try{const e=y;console.log(`Removing ${e.name} created on ${(0,d.getHumanDate)(e)}`),yield(0,c.deleteSpecificVersion)(o,n,r,e.name)}finally{a=!0}}}catch(e){l={error:e}}finally{try{a||t||!(u=s.return)||(yield u.call(s))}finally{if(l)throw l.error}}}))})(b,f,e,h)}else console.log("Nothing to be removed, aborting removal...")}))},692:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.decryptZip=void 0;const i=n(304),r=n(147),a=n(113),s=n(880);o.decryptZip=(e,o,n)=>t(void 0,void 0,void 0,(function*(){var t,p,d;(0,r.existsSync)(e)||i.program.error(`Zip not found at the path ${e}`);const c=yield(0,s.getConfig)(),{extConfig:l}=c.app;n.key||(0,r.existsSync)(s.baseKey)||(null===(p=null===(t=l.plugins)||void 0===t?void 0:t.CapacitorUpdater)||void 0===p?void 0:p.privateKey)||i.program.error(`Private Key not found at the path ${s.baseKey} or in ${c.app.extConfigFilePath}`);const u=n.key||s.baseKey;let{privateKey:y}=n.keyData||(null===(d=null==l?void 0:l.plugins)||void 0===d?void 0:d.CapacitorUpdater)||"";(0,r.existsSync)(u)||y?(0,r.existsSync)(u)&&(y=(0,r.readFileSync)(u).toString()):i.program.error(`Cannot find public key ${u} or as keyData option or in ${c.app.extConfigFilePath}`);const v=(0,r.readFileSync)(e),g=(0,a.decryptSource)(v,o,y);(0,r.writeFileSync)(`${e}_decrypted.zip`,g)}))},0:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.deleteApp=void 0;const i=n(304),r=n(880),a=n(340);o.deleteApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n;const{bundle:t}=o,s=o.apikey||(0,r.findSavedKey)(),p=yield(0,r.getConfig)(),d=(0,r.useLogSnag)();e=e||(null===(n=null==p?void 0:p.app)||void 0===n?void 0:n.appId),s||i.program.error("Missing API key, you need to provide an API key to delete your app"),e||i.program.error("Missing argument, you need to provide a appid, or be in a capacitor project");const c=(0,r.createSupabaseClient)(s),l=yield(0,r.verifyUser)(c,s),{data:u,error:y}=yield c.rpc("exist_app",{appid:e,apikey:s}).single();if(u&&!y||i.program.error("No permission to delete"),t)return console.log(`Delete ${e}@${t} from Capgo`),yield(0,a.deleteSpecificVersion)(c,e,l,t),void console.log(`${e}@${t} deleted from server`);console.log(`Delete ${e} from Capgo`);const{data:v,error:g}=yield c.from("app_versions").select().eq("app_id",e).eq("user_id",l);if(g&&i.program.error(`App ${e} not found in database ${(0,r.formatError)(g)} `),v&&v.length){const o=v.filter((e=>e.bucket_id&&!e.external_url)).map((o=>`${l}/${e}/versions/${o.bucket_id} `)),{error:n}=yield c.storage.from("apps").remove(o);n&&i.program.error(`Cannot delete stored version for app ${e} from storage ${(0,r.formatError)(n)} `)}const{error:f}=yield c.from("app_versions").delete().eq("app_id",e).eq("user_id",l);f&&i.program.error(`Cannot delete version for app ${e} from database ${(0,r.formatError)(f)} `);const{error:h}=yield c.from("apps").delete().eq("app_id",e).eq("user_id",l);h&&i.program.error(`Cannot delete from database ${(0,r.formatError)(h)} `),d.publish({channel:"app",event:"App Deleted",icon:"😱",tags:{"user-id":l,"app-id":e},notify:!1}).catch(),console.log(`${e} deleted from server`)}))},128:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.encryptZip=void 0;const i=n(304),r=n(147),a=n(113),s=n(880);o.encryptZip=(e,o)=>t(void 0,void 0,void 0,(function*(){(0,r.existsSync)(e)||i.program.error(`Zip not found at the path ${e}`);const n=o.key||s.baseKeyPub;let t=o.keyData||"";(0,r.existsSync)(n)||t?(0,r.existsSync)(n)&&(t=(0,r.readFileSync)(n).toString()):i.program.error(`Cannot find public key ${n} or as keyData option`);const p=(0,r.readFileSync)(e),d=(0,a.encryptSource)(p,t);console.log("ivSessionKey",d.ivSessionKey),(0,r.writeFileSync)(`${e}_encrypted.zip`,d.encryptedData)}))},731:function(e,o,n){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0});const i=n(304),r=n(692),a=n(128),s=n(870),p=n(218),d=n(0),c=n(331),l=n(510),u=t(n(598)),y=n(621),v=n(272),g=n(600);i.program.description("Manage packages and bundle versions in capgo Cloud").version(u.default.version),i.program.command("add [appid]").alias("a").description("Add a new app to capgo Cloud").action(s.addApp).option("-n, --name <name>","app name").option("-i, --icon <icon>","app icon path").option("-a, --apikey <apikey>","apikey to link to your account"),i.program.command("login [apikey]").alias("l").description("Save apikey to your machine or folder").action(y.login).option("--local","Only save in local folder"),i.program.command("upload [appid]").alias("u").description("Upload a new bundle to capgo Cloud").action(l.uploadVersion).option("-a, --apikey <apikey>","apikey to link to your account").option("-p, --path <path>","path of the folder to upload").option("-c, --channel <channel>","channel to link to").option("-e, --external <url>","link to external url intead of upload to capgo cloud").option("--key <key>","custom path for public signing key").option("--keyData <keyData>","base64 public signing key").option("--no-key","ignore signing key and send clear update").option("--display-iv-session","Show in the console the iv and session key used to encrypt the update").option("-b, --bundle <bundle>","bundle version number of the file to upload"),i.program.command("set [appid]").alias("s").description("Modify a channel configuration").action(c.setChannel).requiredOption("-c, --channel <channel>","channel to link to").option("-a, --apikey <apikey>","apikey to link to your account").option("-b, --bundle <bundle>","bundle version number of the file to set").option("-s, --state <state>","set the state of the channel, default or normal").option("--downgrade","Allow to downgrade to version under native one").option("--latest","get the latest version key in the package.json to set it to the channel").option("--no-downgrade","Disable downgrade to version under native one").option("--upgrade","Allow to upgrade to version above native one").option("--no-upgrade","Disable upgrade to version above native one").option("--ios","Allow sending update to ios devices").option("--no-ios","Disable sending update to ios devices").option("--android","Allow sending update to android devices").option("--no-android","Disable sending update to android devices").option("--self-assign","Allow to device to self assign to this channel").option("--no-self-assign","Disable devices to self assign to this channel"),i.program.command("delete [appid]").alias("d").description("Delete an app from capgo Cloud").action(d.deleteApp).option("-a, --apikey <apikey>","apikey to link to your account").option("-b, --bundle <bundle>","bundle version number of the app to delete"),i.program.command("list [appid]").alias("ls").description("List versions in capgo Cloud").action(v.listApp).option("-a, --apikey <apikey>","apikey to link to your account"),i.program.command("cleanup [appid]").alias("c").description("Cleanup versions in capgo Cloud").action(g.cleanupApp).option("-b, --bundle <bundle>","bundle version number of the app to delete").option("-a, --apikey <apikey>","apikey to link to your account").option("-k, --keep <keep>","number of version to keep").option("-f, --force","force removal"),i.program.command("key [option]").description("Save base64 signing key in capacitor config, usefull for CI").action(p.manageKey).option("-f, --force","force generate a new one"),i.program.command("decrypt [zipPath] [sessionKey]").description("Decrypt a signed zip update").action(r.decryptZip).option("--key <key>","custom path for private signing key").option("--keyData <keyData>","base64 private signing key"),i.program.command("encrypt [zipPath]").description("Encrypt a zip update").action(a.encryptZip).option("--key <key>","custom path for private signing key").option("--keyData <keyData>","base64 private signing key"),i.program.parse(process.argv)},218:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.manageKey=void 0;const i=n(304),r=n(147),a=n(778),s=n(113),p=n(880);o.manageKey=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,d;"save"===e?(n=o.key,d=o.keyData,t(void 0,void 0,void 0,(function*(){(0,r.existsSync)(".git")||i.program.error("To use local you should be in a git repository");const e=yield(0,p.getConfig)(),{extConfig:o}=e.app,t=n||p.baseKey;let s=d||"";(0,r.existsSync)(t)||s?(0,r.existsSync)(t)&&(s=(0,r.readFileSync)(t).toString()):i.program.error(`Cannot find public key ${t} or as keyData option or in ${e.app.extConfigFilePath}`),o&&(o.plugins||(o.plugins={}),o.plugins.CapacitorUpdater||(o.plugins.CapacitorUpdater={}),o.plugins.CapacitorUpdater.privateKey=s,(0,a.writeConfig)(o,e.app.extConfigFilePath)),console.log(`private key saved into ${e.app.extConfigFilePath} file in local directory`),console.log("your app will decode the zip archive with this key\n")}))):"create"===e?(e=>{t(void 0,void 0,void 0,(function*(){(0,r.existsSync)(".git")||i.program.error("To use local you should be in a git repository");const{publicKey:o,privateKey:n}=(0,s.createRSA)();(0,r.existsSync)(p.baseKeyPub)&&!e.force&&i.program.error("Public Key already exists, use --force to overwrite"),(0,r.writeFileSync)(p.baseKeyPub,o),(0,r.existsSync)(p.baseKey)&&!e.force&&i.program.error("Private Key already exists, use --force to overwrite"),(0,r.writeFileSync)(p.baseKey,n);const t=yield(0,p.getConfig)(),{extConfig:d}=t.app;d&&(d.plugins||(d.plugins={}),d.plugins.CapacitorUpdater||(d.plugins.CapacitorUpdater={}),d.plugins.CapacitorUpdater.privateKey=n,(0,a.writeConfig)(d,t.app.extConfigFilePath)),console.log("Your RSA key has been generated using node-rsa with this settings:\n\n- encryptionScheme — 'pkcs1_oaep'.\n- signingScheme — 'pkcs8-sha256'.\n- bits — 2048.\n- exp — 65537.\n"),console.log(`public key saved into ${p.baseKeyPub} file in local directory\n`),console.log("This key will be use to encode your zipped bundle before sending it to Capgo,\nthan make them unreadable by Capgo and unmodifiable by anyone\n"),console.log(`Private key saved into ${t.app.extConfigFilePath} file in local directory`),console.log("Your app will decode with this key the zipped bundle\n")}))})(o):i.program.error("You should provide a valid option (create or save)")}))},272:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.listApp=void 0;const i=n(304),r=n(880),a=n(577),s=n(340);o.listApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n;const t=o.apikey||(0,r.findSavedKey)(),p=yield(0,r.getConfig)();e=e||(null===(n=null==p?void 0:p.app)||void 0===n?void 0:n.appId),t||i.program.error("Missing API key, you need to provide an API key to delete your app"),e||i.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),console.log("Querying available versions in Capgo");const d=(0,r.createSupabaseClient)(t),c=yield(0,r.verifyUser)(d,t);yield(0,a.checkAppExistsAndHasPermission)(d,e,t);const l=yield(0,s.getActiveAppVersions)(d,e,c);console.log(`Active versions in Capgo: ${null==l?void 0:l.length}`),(0,s.displayBundles)(l)}))},621:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.login=void 0;const i=n(304),r=n(147),a=n(37),s=n(880);o.login=(e,o)=>t(void 0,void 0,void 0,(function*(){const{local:n}=o,t=(0,s.useLogSnag)();if(n)(0,r.existsSync)(".git")||i.program.error("To use local you should be in a git repository"),(0,r.writeFileSync)(".capgo",`${e}\n`),(0,r.appendFileSync)(".gitignore",".capgo\n");else{const o=(0,a.homedir)();(0,r.writeFileSync)(`${o}/.capgo`,`${e}\n`)}const p=(0,s.createSupabaseClient)(e),d=yield(0,s.verifyUser)(p,e,["write","all","upload"]);t.publish({channel:"user-login",event:"User CLI login",icon:"✅",tags:{"user-id":d},notify:!1}).catch(),console.log(`login saved into .capgo file in ${n?"local":"home"} directory`)}))},331:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.setChannel=void 0;const i=n(304),r=n(880);o.setChannel=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,t,a;const{bundle:s,latest:p,downgrade:d,upgrade:c,ios:l,android:u,selfAssign:y,channel:v,state:g}=o,f=o.apikey||(0,r.findSavedKey)(),h=yield(0,r.getConfig)(),m=(0,r.useLogSnag)();e=e||(null===(n=null==h?void 0:h.app)||void 0===n?void 0:n.appId),f||i.program.error("Missing API key, you need to provide a API key to add your app"),e||i.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),v||i.program.error("Missing argument, you need to provide a channel"),p&&s&&i.program.error("Cannot set latest and bundle at the same time"),void 0===s&&void 0===g&&void 0===p&&void 0===d&&void 0===c&&void 0===l&&void 0===u&&void 0===y&&i.program.error("Missing argument, you need to provide a option to set");try{const o=(0,r.createSupabaseClient)(f),n=yield(0,r.verifyUser)(o,f,["write","all"]);yield(0,r.checkPlanValid)(o,n);const b={created_by:n,app_id:e,name:v,version:-1},_=p?null===(a=null===(t=null==h?void 0:h.app)||void 0===t?void 0:t.package)||void 0===a?void 0:a.version:s;if(_){const{data:t,error:r}=yield o.from("app_versions").select().eq("app_id",e).eq("name",_).eq("user_id",n).eq("deleted",!1).single();!r&&t||i.program.error(`Cannot find version ${_}`),console.log(`Set ${e} channel: ${v} to @${s}`),b.version=t.id}void 0!==g&&("public"!==g&&"private"!==g||console.log(`Set ${e} channel: ${v} to public or private is deprecated, use default or normal instead`),console.log(`Set ${e} channel: ${v} to ${"public"===g||"default"===g?"default":"normal"}`),b.public="public"===g||"default"===g),void 0!==d&&(console.log(`Set ${e} channel: ${v} to ${d?"allow":"disallow"} downgrade`),b.disableAutoUpdateUnderNative=!d),void 0!==c&&(console.log(`Set ${e} channel: ${v} to ${c?"allow":"disallow"} upgrade`),b.disableAutoUpdateToMajor=!c),void 0!==l&&(console.log(`Set ${e} channel: ${v} to ${l?"allow":"disallow"} ios update`),b.ios=!!l),void 0!==u&&(console.log(`Set ${e} channel: ${v} to ${u?"allow":"disallow"} android update`),b.android=!!u),void 0!==y&&(console.log(`Set ${e} channel: ${v} to ${y?"allow":"disallow"} self assign to this channel`),b.allow_device_self_set=!!y);try{const{error:e}=yield(0,r.updateOrCreateChannel)(o,b,f);e&&i.program.error(`Cannot set channel ${(0,r.formatError)(e)}`)}catch(e){i.program.error(`Cannot set channel ${(0,r.formatError)(e)}`)}m.publish({channel:"app",event:"Set app",icon:"✅",tags:{"user-id":n,"app-id":e},notify:!1}).catch()}catch(e){i.program.error(`Unknow error ${(0,r.formatError)(e)}`)}console.log("Done ✅")}))},510:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.uploadVersion=void 0;const r=i(n(844)),a=n(304),s=n(663),p=i(n(295)),d=n(147),c=n(906),l=n(113),u=n(880);o.uploadVersion=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,t,i,y;let{bundle:v,path:g,channel:f}=o;const{external:h,key:m=!1,displayIvSession:b}=o,_=o.apikey||(0,u.findSavedKey)(),k=(0,u.useLogSnag)();f=f||"dev";const w=yield(0,u.getConfig)();e=e||(null===(n=null==w?void 0:w.app)||void 0===n?void 0:n.appId),v=v||(null===(i=null===(t=null==w?void 0:w.app)||void 0===t?void 0:t.package)||void 0===i?void 0:i.version),u.regexSemver.test(v)||a.program.error(`Your bundle name ${v}, is not valid it should follow semver convention : https://semver.org/`),g=g||(null===(y=null==w?void 0:w.app)||void 0===y?void 0:y.webDir),_||a.program.error("Missing API key, you need to provide a API key to add your app"),e&&v&&g||a.program.error("Missing argument, you need to provide a appid and a bundle and a path, or be in a capacitor project"),console.log(`Upload ${e}@${v} started from path "${g}" to Capgo cloud`);const $=(0,u.createSupabaseClient)(_),x=yield(0,u.verifyUser)($,_,["write","all","upload"]);yield(0,u.checkPlanValid)($,x,!1);const S=new p.default.MultiBar({clearOnComplete:!1,hideCursor:!0},p.default.Presets.shades_grey),C=S.create(7,0,{format:"Uploading: [{bar}] {percentage}% | ETA: {eta}s | {value}/{total} Part"},p.default.Presets.shades_grey);C.start(7,0,{speed:"N/A"});const{data:A,error:P}=yield $.rpc("exist_app_versions",{apikey:_,name_version:v,appid:e}).single();(A||P)&&(S.stop(),a.program.error(`This app bundle already exist or was deleted, you cannot re-upload it ${(0,u.formatError)(P)}`)),C.increment();const{data:D,error:I}=yield $.rpc("is_trial",{userid:x}).single();(D&&D>0||I)&&S.log(`WARNING !!\nTrial expires in ${D} days, upgrade here: ${u.hostWeb}/dashboard/settings/plans\n`),C.increment();const{data:K,error:q}=yield $.rpc("exist_app",{appid:e,apikey:_}).single();K&&!q||(S.stop(),a.program.error(`Cannot find app ${e} in your account \n${(0,u.formatError)(q)}`)),C.increment();const{data:j,error:E}=yield $.rpc("exist_app_versions",{appid:e,apikey:_,name_version:v}).single();(j||E)&&a.program.error(`Version already exists ${(0,u.formatError)(E)}`),C.increment();const M=(0,s.randomUUID)();let U,V="";if(h)h&&!h.startsWith("https://")&&(S.stop(),a.program.error(`External link should should start with "https://" current is "${h}"`));else{const o=new r.default;o.addLocalFolder(g);let n=o.toBuffer();if(V=yield(0,c.checksum)(n,"crc32"),m||(0,d.existsSync)(u.baseKeyPub)){const e="string"==typeof m?m:u.baseKeyPub;(0,d.existsSync)(e)||a.program.error(`Cannot find public key ${e}`);const o=(0,d.readFileSync)(e);S.log("Encrypting your bundle\n");const t=(0,l.encryptSource)(n,o.toString());U=t.ivSessionKey,b&&S.log(`Your Iv Session key is ${U},\nkeep it safe, you will need it to decrypt your bundle.\nIt will be also visible in your dashboard\n`),n=t.encryptedData}const t=Math.floor(n.byteLength/1024/1024),i=`apps/${x}/${e}/versions`;C.increment(),t>20&&(S.log(`WARNING !!\nThe app size is ${t} Mb, this may take a while to download for users\n`),k.publish({channel:"app-error",event:"App Too Large",icon:"🚛",tags:{"user-id":x,"app-id":e},notify:!1}).catch());const{error:s}=yield $.storage.from(i).upload(M,n,{contentType:"application/zip"});s&&(S.stop(),a.program.error(`Cannot upload ${(0,u.formatError)(s)}`))}C.increment();const{data:O,error:N}=yield(0,u.updateOrCreateVersion)($,{bucket_id:h?void 0:M,user_id:x,name:v,app_id:e,session_key:U,external_url:h,checksum:V},_);if(N&&(S.stop(),a.program.error(`Cannot add bundle ${(0,u.formatError)(N)}`)),C.increment(),O){const{error:o}=yield(0,u.updateOrCreateChannel)($,{name:f,app_id:e,created_by:x,version:O.id},_);o&&S.log("Cannot set bundle with upload key, use key with more rights for that\n")}else S.log("Cannot set bundle with upload key, use key with more rights for that\n");S.stop();const z=(0,u.convertAppName)(e);console.log("App uploaded to server"),console.log(`Try it in mobile app: ${u.host}/app_mobile`),console.log(`Or set the channel ${f} as public here: ${u.hostWeb}/app/package/${z}`),console.log("To use with live update in your own app"),console.log(`You can link specific device to this bundle to make user try it first, here: ${u.hostWeb}/app/p/${z}/devices`),k.publish({channel:"app",event:"App Uploaded",icon:"⏫",tags:{"user-id":x,"app-id":e},notify:!1}).catch()}))},880:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.getHumanDate=o.verifyUser=o.convertAppName=o.useLogSnag=o.updateOrCreateChannel=o.updateOrCreateVersion=o.getConfig=o.formatError=o.findSavedKey=o.checkPlanValid=o.isAllowedAction=o.isTrial=o.isPaying=o.isGoodPlan=o.checkKey=o.regexSemver=o.createSupabaseClient=o.supaAnon=o.hostSupa=o.hostWeb=o.host=o.baseKeyPub=o.baseKey=void 0;const r=n(778),a=n(304),s=n(885),p=i(n(867)),d=n(147),c=n(37),l=n(133);o.baseKey=".capgo_key",o.baseKeyPub=`${o.baseKey}.pub`,o.host="https://capgo.app",o.hostWeb="https://web.capgo.app",o.hostSupa="https://xvwzpoazmxkqosrdewyv.supabase.co",o.supaAnon="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYzNzgwNTAwOSwiZXhwIjoxOTUzMzgxMDA5fQ.8tgID1d4jodPwuo_fz4KHN4o1XKB9fnqyt0_GaJSj-w",o.createSupabaseClient=e=>(0,s.createClient)(o.hostSupa,o.supaAnon,{global:{headers:{capgkey:e}}}),o.regexSemver=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/,o.checkKey=(e,n,i)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:r}=yield e.rpc("is_allowed_capgkey",{apikey:n,keymode:i}).single();t&&!r||a.program.error(`Invalid API key or insufficient permissions ${(0,o.formatError)(r)}`)})),o.isGoodPlan=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_good_plan_v2",{userid:o}).single();if(t)throw t;return n||!1})),o.isPaying=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_paying",{userid:o}).single();if(t)throw t;return n||!1})),o.isTrial=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_trial",{userid:o}).single();if(t)throw t;return n||0})),o.isAllowedAction=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_allowed_action_user",{userid:o}).single();if(t)throw t;return n})),o.checkPlanValid=(e,n,i=!0)=>t(void 0,void 0,void 0,(function*(){(yield(0,o.isAllowedAction)(e,n))||a.program.error(`You need to upgrade your plan to continue to use capgo.\n Upgrade here: ${o.hostWeb}/dashboard/settings/plans\n`);const t=yield(0,o.isTrial)(e,n);t>0&&i&&console.log(`WARNING !!\nTrial expires in ${t} days, upgrade here: ${o.hostWeb}/dashboard/settings/plans\n`)})),o.findSavedKey=()=>{let e=`${(0,c.homedir)()}/.capgo`;return(0,d.existsSync)(e)?(console.log(`Use global apy key ${e}`),(0,d.readFileSync)(e,"utf8").trim()):(e=".capgo",(0,d.existsSync)(e)?(console.log(`Use local apy key ${e}`),(0,d.readFileSync)(e,"utf8").trim()):null)},o.formatError=e=>e?`\n${p.default.render(e)}`:"",o.getConfig=()=>t(void 0,void 0,void 0,(function*(){let e;try{e=yield(0,r.loadConfig)()}catch(e){a.program.error("No capacitor config file found, run `cap init` first")}return e})),o.updateOrCreateVersion=(e,o,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:i}=yield e.rpc("exist_app_versions",{appid:o.app_id,name_version:o.name,apikey:n}).single();return t&&!i?(o.deleted=!1,e.from("app_versions").update(o).eq("app_id",o.app_id).eq("name",o.name).single()):e.from("app_versions").insert(o).select().single()})),o.updateOrCreateChannel=(e,o,n)=>t(void 0,void 0,void 0,(function*(){if(!o.app_id||!o.name||!o.created_by)return console.error("missing app_id, name, or created_by"),Promise.reject(new Error("missing app_id, name, or created_by"));const{data:t,error:i}=yield e.rpc("exist_channel",{appid:o.app_id,name_channel:o.name,apikey:n}).single();return t&&!i?e.from("channels").update(o).eq("app_id",o.app_id).eq("name",o.name).eq("created_by",o.created_by).single():e.from("channels").insert(o).select().single()})),o.useLogSnag=()=>new l.LogSnag({token:"c124f5e9d0ce5bdd14bbb48f815d5583",project:"capgo"}),o.convertAppName=e=>e.replace(/\./g,"--"),o.verifyUser=(e,n,i=["all"])=>t(void 0,void 0,void 0,(function*(){yield(0,o.checkKey)(e,n,i);const{data:t,error:r}=yield e.rpc("get_user_id",{apikey:n}).single(),s=t?t.toString():"";return s&&!r||a.program.error(`Cannot verify user ${(0,o.formatError)(r)}`),s})),o.getHumanDate=e=>new Date(e.created_at||"").toLocaleString()},778:e=>{e.exports=require("@capacitor/cli/dist/config")},885:e=>{e.exports=require("@supabase/supabase-js")},906:e=>{e.exports=require("@tomasklaen/checksum")},844:e=>{e.exports=require("adm-zip")},295:e=>{e.exports=require("cli-progress")},304:e=>{e.exports=require("commander")},847:e=>{e.exports=require("console-table-printer")},470:e=>{e.exports=require("fs-extra")},133:e=>{e.exports=require("logsnag")},11:e=>{e.exports=require("mime")},867:e=>{e.exports=require("prettyjson")},616:e=>{e.exports=require("prompt-sync")},505:e=>{e.exports=require("semver/preload")},663:e=>{e.exports=require("crypto")},147:e=>{e.exports=require("fs")},37:e=>{e.exports=require("os")},598:e=>{e.exports=JSON.parse('{"name":"@capgo/cli","version":"2.3.14","description":"A CLI to upload to capgo servers","main":"dist/index.js","bin":{"capgo":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/Cap-go/capgo-cli.git"},"bugs":{"url":"https://github.com/Cap-go/capgo-cli/issues"},"keywords":["appflow alternative","ionic","capacitor","auto update","live update","capgo","cli","upload","capgo-cli"],"scripts":{"dev":"set NODE_ENV=development && npx webpack --config webpack.config.js","no-debug":"node dist/index.js","test":"npx --yes ts-node -T src/bin/index.ts","build":"npx --yes webpack --config webpack.config.js","dev-build":"SUPA_DB=development npx webpack --config webpack.config.js","pack":"pkg","types":"npx --yes supabase gen types typescript --project-id=xvwzpoazmxkqosrdewyv > src/types/supabase.types.ts","test_rls":"ts-node ./test/test_headers_rls.ts","lint":"eslint . --ext .ts --fix"},"author":"github.com/riderx","license":"Apache 2.0","dependencies":{"@capacitor/cli":"4.6.0","@supabase/supabase-js":"^2.1.2","@tomasklaen/checksum":"^1.1.0","adm-zip":"^0.5.9","cli-progress":"3.11.2","commander":"9.4.1","console-table-printer":"^2.11.1","fs-extra":"11.1.0","logsnag":"^0.1.5","mime":"^3.0.0","prettyjson":"^1.2.5","prompt-sync":"^4.2.0","semver":"^7.3.8"},"devDependencies":{"@types/adm-zip":"0.5.0","@types/cli-progress":"^3.11.0","@types/fs-extra":"^9.0.13","@types/mime":"^3.0.1","@types/node":"^18.11.9","@types/prettyjson":"^0.0.30","@types/prompt-sync":"^4.2.0","@types/semver":"^7.3.13","@typescript-eslint/eslint-plugin":"5.45.0","@typescript-eslint/parser":"5.45.0","eslint":"8.29.0","eslint-config-airbnb-base":"^15.0.0","eslint-config-prettier":"^8.5.0","eslint-import-resolver-typescript":"3.5.2","eslint-plugin-import":"2.26.0","eslint-plugin-prettier":"^4.2.1","git-format-staged":"3.0.0","husky":"^8.0.2","nodemon":"2.0.20","pkg":"5.8.0","prettier":"2.8.1","ts-loader":"^9.4.1","ts-node":"^10.9.1","tsconfig-paths":"4.1.1","typescript":"4.9.3","webpack":"5.75.0","webpack-cli":"^5.0.0","webpack-node-externals":"^3.0.0"}}')}},o={};!function n(t){var i=o[t];if(void 0!==i)return i.exports;var r=o[t]={exports:{}};return e[t].call(r.exports,r,r.exports,n),r.exports}(731)})();
2
+ (()=>{"use strict";var e={550:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.checkAppExistsAndHasPermission=void 0;const i=n(304);o.checkAppExistsAndHasPermission=(e,o,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:r}=yield e.rpc("exist_app",{appid:o,apikey:n}).single();t&&!r||i.program.error("No permission for this app")}))},170:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.checkVersionNotUsedInChannel=void 0;const i=n(304),r=n(693);o.checkVersionNotUsedInChannel=(e,o,n,a,s)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:p}=yield e.from("channels").select().eq("app_id",o).eq("created_by",n).eq("version",a.id);if(p&&i.program.error(`Cannot check Version ${o}@${s} ${(0,r.formatError)(p)}`),t&&t.length>0){const e=(0,r.convertAppName)(o);i.program.error(`❌ Version ${o}@${s} is used in a channel, unlink it first\nhttps://web.capgo.app/app/p/${e}/channel/${t[0].id}\n${(0,r.formatError)(p)}`)}}))},518:(e,o,n)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.createRSA=o.encryptSource=o.decryptSource=void 0;const t=n(113),i="aes-128-cbc",r="sha256",a="base64",s=t.constants.RSA_PKCS1_OAEP_PADDING;o.decryptSource=(e,o,n)=>{const[p,d]=o.split(":"),c=(0,t.privateDecrypt)({key:n,padding:s,oaepHash:r},Buffer.from(d,a)),l=Buffer.from(p,a),u=c.toString(a);console.log("\nSessionB64",u);const y=(0,t.createDecipheriv)(i,c,l);return y.setAutoPadding(!0),Buffer.concat([y.update(e),y.final()])},o.encryptSource=(e,o)=>{const n=(0,t.randomBytes)(16),p=(0,t.randomBytes)(16),d=(0,t.createCipheriv)(i,p,n);d.setAutoPadding(!0);const c=`${n.toString(a)}:${(0,t.publicEncrypt)({key:o,padding:s,oaepHash:r},p).toString(a)}`;return{encryptedData:Buffer.concat([d.update(e),d.final()]),ivSessionKey:c}},o.createRSA=()=>{const{publicKey:e,privateKey:o}=(0,t.generateKeyPairSync)("rsa",{modulusLength:2048});return{publicKey:e.export({type:"pkcs1",format:"pem"}),privateKey:o.export({type:"pkcs1",format:"pem"})}}},471:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.checkVersionNotUsedInDeviceOverride=void 0;const i=n(304),r=n(693);o.checkVersionNotUsedInDeviceOverride=(e,o,n,a)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:s}=yield e.from("devices_override").select().eq("app_id",o).eq("version",n.id);if(s&&i.program.error(`Cannot check Device override ${o}@${a} ${(0,r.formatError)(s)}`),t&&t.length>0){const e=(0,r.convertAppName)(o);i.program.error(`❌ Version ${o} @${a} is used in a device override, unlink it first\nhttps://web.capgo.app/app/p/${e}/d/${t[0].device_id}\n${(0,r.formatError)(s)}`)}}))},843:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.deleteFromStorage=void 0;const i=n(304),r=n(693);o.deleteFromStorage=(e,o,n,a,s)=>t(void 0,void 0,void 0,(function*(){const{error:t}=yield e.storage.from("apps").remove([`${o}/${n}/versions/${a.bucket_id} `]);t&&i.program.error(`Something went wrong when trying to delete ${n} @${s} ${(0,r.formatError)(t)} `)}))},971:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.getVersionData=o.getActiveAppVersions=o.displayBundles=o.deleteSpecificVersion=o.deleteAppVersion=void 0;const i=n(304),r=n(847),a=n(693),s=n(170),p=n(471),d=n(843);o.deleteAppVersion=(e,o,n,r)=>t(void 0,void 0,void 0,(function*(){const{error:t}=yield e.from("app_versions").update({deleted:!0}).eq("app_id",o).eq("deleted",!1).eq("user_id",n).eq("name",r);t&&i.program.error(`App Version ${o}@${r} not found in database '${(0,a.formatError)(t)}'`)})),o.deleteSpecificVersion=(e,n,i,r)=>t(void 0,void 0,void 0,(function*(){const t=yield(0,o.getVersionData)(e,n,i,r);yield(0,s.checkVersionNotUsedInChannel)(e,n,i,t,r),yield(0,p.checkVersionNotUsedInDeviceOverride)(e,n,t,r),yield(0,d.deleteFromStorage)(e,i,n,t,r),yield(0,o.deleteAppVersion)(e,n,i,r)})),o.displayBundles=e=>{const o=new r.Table({title:"Bundles",charLength:{"❌":2,"✅":2}});e.reverse().forEach((e=>{o.addRow(Object.assign({Version:e.name,Created:(0,a.getHumanDate)(e)},void 0!==e.keep?{Keep:e.keep}:{}))})),o.printTable()},o.getActiveAppVersions=(e,o,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:r}=yield e.from("app_versions").select().eq("app_id",o).eq("user_id",n).eq("deleted",!1).order("created_at",{ascending:!1});return r&&i.program.error(`App ${o} not found in database ${(0,a.formatError)(r)} `),t})),o.getVersionData=(e,o,n,r)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:s}=yield e.from("app_versions").select().eq("app_id",o).eq("user_id",n).eq("name",r).eq("deleted",!1).single();return t&&!s||i.program.error(`App Version ${o}@${r} doesn't exist ${(0,a.formatError)(s)}`),t}))},174:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.addApp=void 0;const i=n(304),r=n(113),a=n(147),s=n(470),p=n(11),d=n(693),c="assets/icon.png";o.addApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,t;let{name:l,icon:u}=o;const y=o.apikey||(0,d.findSavedKey)(),v=yield(0,d.getConfig)(),g=(0,d.useLogSnag)();e=e||(null===(n=null==v?void 0:v.app)||void 0===n?void 0:n.appId),l=l||(null===(t=null==v?void 0:v.app)||void 0===t?void 0:t.appName)||"Unknown",u=u||"resources/icon.png",y||i.program.error("Missing API key, you need to provide a API key to add your app"),e&&l||i.program.error("Missing argument, you need to provide a appid and a name, or be in a capacitor project"),console.log(`Add ${e} to Capgo`);const f=(0,d.createSupabaseClient)(y),h=yield(0,d.verifyUser)(f,y,["write","all"]);let m,b;yield(0,d.checkPlanValid)(f,h),console.log("Adding..."),u&&(0,s.existsSync)(u)?(m=(0,a.readFileSync)(u),b=(0,p.getType)(u)||"image/png",console.warn(`Found app icon ${u}`)):(0,s.existsSync)(c)?(m=(0,a.readFileSync)(c),b=(0,p.getType)(c)||"image/png",console.warn(`Found app icon ${c}`)):console.warn(`Cannot find app icon in any of the following locations: ${u}, ${c}`);const{data:_,error:k}=yield f.rpc("exist_app_v2",{appid:e}).single();(_||k)&&i.program.error(`App already exists ${(0,d.formatError)(k)}`);const w=`icon_${(0,r.randomUUID)()}`;let $="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(m&&b){const{error:o}=yield f.storage.from(`images/${h}/${e}`).upload(w,m,{contentType:b});o&&i.program.error(`Could not add app ${(0,d.formatError)(o)}`);const{data:n}=yield f.storage.from(`images/${h}/${e}`).getPublicUrl(w);$=(null==n?void 0:n.publicUrl)||$}const{error:x}=yield f.from("apps").insert({icon_url:$,user_id:h,name:l,app_id:e});x&&i.program.error(`Could not add app ${(0,d.formatError)(x)}`);const{error:S}=yield f.from("app_versions").insert([{user_id:h,deleted:!0,name:"unknown",app_id:e},{user_id:h,deleted:!0,name:"builtin",app_id:e}]);S&&i.program.error(`Could not add app ${(0,d.formatError)(S)}`),g.publish({channel:"app",event:"App Added",icon:"🎉",tags:{"user-id":h,"app-id":e},notify:!1}).catch(),console.log("App added to server, you can upload a bundle now")}))},327:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))},i=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o,n=e[Symbol.asyncIterator];return n?n.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),o={},t("next"),t("throw"),t("return"),o[Symbol.asyncIterator]=function(){return this},o);function t(n){o[n]=e[n]&&function(o){return new Promise((function(t,i){!function(e,o,n,t){Promise.resolve(t).then((function(o){e({value:o,done:n})}),o)}(t,i,(o=e[n](o)).done,o.value)}))}}},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.cleanupApp=void 0;const a=n(304),s=r(n(505)),p=r(n(616)),d=n(693),c=n(971),l=n(550),u=(0,p.default)();o.cleanupApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n;const r=o.apikey||(0,d.findSavedKey)(),{bundle:p,keep:y=4}=o,v=o.force||!1,g=yield(0,d.getConfig)();e=e||(null===(n=null==g?void 0:g.app)||void 0===n?void 0:n.appId),r||a.program.error("Missing API key, you need to provide an API key to delete your app"),e||a.program.error("Missing argument, you need to provide a appid, or be in a capacitor project");const f=(0,d.createSupabaseClient)(r),h=yield(0,d.verifyUser)(f,r);yield(0,l.checkAppExistsAndHasPermission)(f,e,r),console.log("Querying all available versions in Capgo");let m=yield(0,c.getActiveAppVersions)(f,e,h);if(console.log(`Total active versions in Capgo: ${null==m?void 0:m.length}`),0===(null==m?void 0:m.length))return void console.log("No versions found, aborting cleanup");if(p){const e=`${s.default.inc(p,"major")}`;console.log(`Querying available versions in Capgo between ${p} and ${e}`),m=((e,o,n)=>{const t=[];return null==e||e.forEach((e=>{s.default.gte(e.name,o)&&s.default.lt(e.name,`${n}`)&&t.push(e)})),t})(m,p,e),console.log(`Active versions in Capgo between ${p} and ${e}: ${null==m?void 0:m.length}`)}const b=[];if(m.forEach(((e,o)=>{o<y?e.keep="✅":(e.keep="❌",b.push(e))})),0!==b.length){if((0,c.displayBundles)(m),!v&&"yes"!==u("Do you want to continue removing the versions specified? Type yes to confirm: "))return void console.log("Not confirmed, aborting removal...");console.log("You have confirmed removal, removing versions now"),yield((e,o,n,r)=>{var a,s,p;return t(void 0,void 0,void 0,(function*(){var t,l,u,y;try{for(a=!0,s=i(e);!(t=(p=yield s.next()).done);){y=p.value,a=!1;try{const e=y;console.log(`Removing ${e.name} created on ${(0,d.getHumanDate)(e)}`),yield(0,c.deleteSpecificVersion)(o,n,r,e.name)}finally{a=!0}}}catch(e){l={error:e}}finally{try{a||t||!(u=s.return)||(yield u.call(s))}finally{if(l)throw l.error}}}))})(b,f,e,h)}else console.log("Nothing to be removed, aborting removal...")}))},790:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.decryptZip=void 0;const i=n(304),r=n(147),a=n(518),s=n(693);o.decryptZip=(e,o,n)=>t(void 0,void 0,void 0,(function*(){var t,p,d;(0,r.existsSync)(e)||i.program.error(`Zip not found at the path ${e}`);const c=yield(0,s.getConfig)(),{extConfig:l}=c.app;n.key||(0,r.existsSync)(s.baseKey)||(null===(p=null===(t=l.plugins)||void 0===t?void 0:t.CapacitorUpdater)||void 0===p?void 0:p.privateKey)||i.program.error(`Private Key not found at the path ${s.baseKey} or in ${c.app.extConfigFilePath}`);const u=n.key||s.baseKey;let{privateKey:y}=n.keyData||(null===(d=null==l?void 0:l.plugins)||void 0===d?void 0:d.CapacitorUpdater)||"";(0,r.existsSync)(u)||y?(0,r.existsSync)(u)&&(y=(0,r.readFileSync)(u).toString()):i.program.error(`Cannot find public key ${u} or as keyData option or in ${c.app.extConfigFilePath}`);const v=(0,r.readFileSync)(e),g=(0,a.decryptSource)(v,o,y);(0,r.writeFileSync)(`${e}_decrypted.zip`,g)}))},513:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.deleteApp=void 0;const i=n(304),r=n(693),a=n(971);o.deleteApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n;const{bundle:t}=o,s=o.apikey||(0,r.findSavedKey)(),p=yield(0,r.getConfig)(),d=(0,r.useLogSnag)();e=e||(null===(n=null==p?void 0:p.app)||void 0===n?void 0:n.appId),s||i.program.error("Missing API key, you need to provide an API key to delete your app"),e||i.program.error("Missing argument, you need to provide a appid, or be in a capacitor project");const c=(0,r.createSupabaseClient)(s),l=yield(0,r.verifyUser)(c,s),{data:u,error:y}=yield c.rpc("exist_app",{appid:e,apikey:s}).single();if(u&&!y||i.program.error("No permission to delete"),t)return console.log(`Delete ${e}@${t} from Capgo`),yield(0,a.deleteSpecificVersion)(c,e,l,t),void console.log(`${e}@${t} deleted from server`);console.log(`Delete ${e} from Capgo`);const{data:v,error:g}=yield c.from("app_versions").select().eq("app_id",e).eq("user_id",l);if(g&&i.program.error(`App ${e} not found in database ${(0,r.formatError)(g)} `),v&&v.length){const o=v.filter((e=>e.bucket_id&&!e.external_url)).map((o=>`${l}/${e}/versions/${o.bucket_id} `)),{error:n}=yield c.storage.from("apps").remove(o);n&&i.program.error(`Cannot delete stored version for app ${e} from storage ${(0,r.formatError)(n)} `)}const{error:f}=yield c.from("app_versions").delete().eq("app_id",e).eq("user_id",l);f&&i.program.error(`Cannot delete version for app ${e} from database ${(0,r.formatError)(f)} `);const{error:h}=yield c.from("apps").delete().eq("app_id",e).eq("user_id",l);h&&i.program.error(`Cannot delete from database ${(0,r.formatError)(h)} `),d.publish({channel:"app",event:"App Deleted",icon:"😱",tags:{"user-id":l,"app-id":e},notify:!1}).catch(),console.log(`${e} deleted from server`)}))},682:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.encryptZip=void 0;const i=n(304),r=n(147),a=n(518),s=n(693);o.encryptZip=(e,o)=>t(void 0,void 0,void 0,(function*(){(0,r.existsSync)(e)||i.program.error(`Zip not found at the path ${e}`);const n=o.key||s.baseKeyPub;let t=o.keyData||"";(0,r.existsSync)(n)||t?(0,r.existsSync)(n)&&(t=(0,r.readFileSync)(n).toString()):i.program.error(`Cannot find public key ${n} or as keyData option`);const p=(0,r.readFileSync)(e),d=(0,a.encryptSource)(p,t);console.log("ivSessionKey",d.ivSessionKey),(0,r.writeFileSync)(`${e}_encrypted.zip`,d.encryptedData)}))},213:function(e,o,n){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0});const i=n(304),r=n(790),a=n(682),s=n(174),p=n(69),d=n(513),c=n(131),l=n(658),u=t(n(598)),y=n(732),v=n(36),g=n(327);i.program.description("Manage packages and bundle versions in capgo Cloud").version(u.default.version),i.program.command("add [appid]").alias("a").description("Add a new app to capgo Cloud").action(s.addApp).option("-n, --name <name>","app name").option("-i, --icon <icon>","app icon path").option("-a, --apikey <apikey>","apikey to link to your account"),i.program.command("login [apikey]").alias("l").description("Save apikey to your machine or folder").action(y.login).option("--local","Only save in local folder"),i.program.command("upload [appid]").alias("u").description("Upload a new bundle to capgo Cloud").action(l.uploadVersion).option("-a, --apikey <apikey>","apikey to link to your account").option("-p, --path <path>","path of the folder to upload").option("-c, --channel <channel>","channel to link to").option("-e, --external <url>","link to external url intead of upload to capgo cloud").option("--key <key>","custom path for public signing key").option("--keyData <keyData>","base64 public signing key").option("--no-key","ignore signing key and send clear update").option("--display-iv-session","Show in the console the iv and session key used to encrypt the update").option("-b, --bundle <bundle>","bundle version number of the file to upload"),i.program.command("set [appid]").alias("s").description("Modify a channel configuration").action(c.setChannel).requiredOption("-c, --channel <channel>","channel to link to").option("-a, --apikey <apikey>","apikey to link to your account").option("-b, --bundle <bundle>","bundle version number of the file to set").option("-s, --state <state>","set the state of the channel, default or normal").option("--downgrade","Allow to downgrade to version under native one").option("--latest","get the latest version key in the package.json to set it to the channel").option("--no-downgrade","Disable downgrade to version under native one").option("--upgrade","Allow to upgrade to version above native one").option("--no-upgrade","Disable upgrade to version above native one").option("--ios","Allow sending update to ios devices").option("--no-ios","Disable sending update to ios devices").option("--android","Allow sending update to android devices").option("--no-android","Disable sending update to android devices").option("--self-assign","Allow to device to self assign to this channel").option("--no-self-assign","Disable devices to self assign to this channel"),i.program.command("delete [appid]").alias("d").description("Delete an app from capgo Cloud").action(d.deleteApp).option("-a, --apikey <apikey>","apikey to link to your account").option("-b, --bundle <bundle>","bundle version number of the app to delete"),i.program.command("list [appid]").alias("ls").description("List versions in capgo Cloud").action(v.listApp).option("-a, --apikey <apikey>","apikey to link to your account"),i.program.command("cleanup [appid]").alias("c").description("Cleanup versions in capgo Cloud").action(g.cleanupApp).option("-b, --bundle <bundle>","bundle version number of the app to delete").option("-a, --apikey <apikey>","apikey to link to your account").option("-k, --keep <keep>","number of version to keep").option("-f, --force","force removal"),i.program.command("key [option]").description("Save base64 signing key in capacitor config, usefull for CI").action(p.manageKey).option("-f, --force","force generate a new one"),i.program.command("decrypt [zipPath] [sessionKey]").description("Decrypt a signed zip update").action(r.decryptZip).option("--key <key>","custom path for private signing key").option("--keyData <keyData>","base64 private signing key"),i.program.command("encrypt [zipPath]").description("Encrypt a zip update").action(a.encryptZip).option("--key <key>","custom path for private signing key").option("--keyData <keyData>","base64 private signing key"),i.program.parse(process.argv)},69:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.manageKey=void 0;const i=n(304),r=n(147),a=n(778),s=n(518),p=n(693);o.manageKey=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,d;"save"===e?(n=o.key,d=o.keyData,t(void 0,void 0,void 0,(function*(){(0,r.existsSync)(".git")||i.program.error("To use local you should be in a git repository");const e=yield(0,p.getConfig)(),{extConfig:o}=e.app,t=n||p.baseKey;let s=d||"";(0,r.existsSync)(t)||s?(0,r.existsSync)(t)&&(s=(0,r.readFileSync)(t).toString()):i.program.error(`Cannot find public key ${t} or as keyData option or in ${e.app.extConfigFilePath}`),o&&(o.plugins||(o.plugins={}),o.plugins.CapacitorUpdater||(o.plugins.CapacitorUpdater={}),o.plugins.CapacitorUpdater.privateKey=s,(0,a.writeConfig)(o,e.app.extConfigFilePath)),console.log(`private key saved into ${e.app.extConfigFilePath} file in local directory`),console.log("your app will decode the zip archive with this key\n")}))):"create"===e?(e=>{t(void 0,void 0,void 0,(function*(){(0,r.existsSync)(".git")||i.program.error("To use local you should be in a git repository");const{publicKey:o,privateKey:n}=(0,s.createRSA)();(0,r.existsSync)(p.baseKeyPub)&&!e.force&&i.program.error("Public Key already exists, use --force to overwrite"),(0,r.writeFileSync)(p.baseKeyPub,o),(0,r.existsSync)(p.baseKey)&&!e.force&&i.program.error("Private Key already exists, use --force to overwrite"),(0,r.writeFileSync)(p.baseKey,n);const t=yield(0,p.getConfig)(),{extConfig:d}=t.app;d&&(d.plugins||(d.plugins={}),d.plugins.CapacitorUpdater||(d.plugins.CapacitorUpdater={}),d.plugins.CapacitorUpdater.privateKey=n,(0,a.writeConfig)(d,t.app.extConfigFilePath)),console.log("Your RSA key has been generated using node-rsa with this settings:\n\n- encryptionScheme — 'pkcs1_oaep'.\n- signingScheme — 'pkcs8-sha256'.\n- bits — 2048.\n- exp — 65537.\n"),console.log(`public key saved into ${p.baseKeyPub} file in local directory\n`),console.log("This key will be use to encode your zipped bundle before sending it to Capgo,\nthan make them unreadable by Capgo and unmodifiable by anyone\n"),console.log(`Private key saved into ${t.app.extConfigFilePath} file in local directory`),console.log("Your app will decode with this key the zipped bundle\n")}))})(o):i.program.error("You should provide a valid option (create or save)")}))},36:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.listApp=void 0;const i=n(304),r=n(693),a=n(550),s=n(971);o.listApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var n;const t=o.apikey||(0,r.findSavedKey)(),p=yield(0,r.getConfig)();e=e||(null===(n=null==p?void 0:p.app)||void 0===n?void 0:n.appId),t||i.program.error("Missing API key, you need to provide an API key to delete your app"),e||i.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),console.log("Querying available versions in Capgo");const d=(0,r.createSupabaseClient)(t),c=yield(0,r.verifyUser)(d,t);yield(0,a.checkAppExistsAndHasPermission)(d,e,t);const l=yield(0,s.getActiveAppVersions)(d,e,c);console.log(`Active versions in Capgo: ${null==l?void 0:l.length}`),(0,s.displayBundles)(l)}))},732:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.login=void 0;const i=n(304),r=n(147),a=n(37),s=n(693);o.login=(e,o)=>t(void 0,void 0,void 0,(function*(){const{local:n}=o,t=(0,s.useLogSnag)();if(n)(0,r.existsSync)(".git")||i.program.error("To use local you should be in a git repository"),(0,r.writeFileSync)(".capgo",`${e}\n`),(0,r.appendFileSync)(".gitignore",".capgo\n");else{const o=(0,a.homedir)();(0,r.writeFileSync)(`${o}/.capgo`,`${e}\n`)}const p=(0,s.createSupabaseClient)(e),d=yield(0,s.verifyUser)(p,e,["write","all","upload"]);t.publish({channel:"user-login",event:"User CLI login",icon:"✅",tags:{"user-id":d},notify:!1}).catch(),console.log(`login saved into .capgo file in ${n?"local":"home"} directory`)}))},131:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.setChannel=void 0;const i=n(304),r=n(693);o.setChannel=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,t,a;const{bundle:s,latest:p,downgrade:d,upgrade:c,ios:l,android:u,selfAssign:y,channel:v,state:g}=o,f=o.apikey||(0,r.findSavedKey)(),h=yield(0,r.getConfig)(),m=(0,r.useLogSnag)();e=e||(null===(n=null==h?void 0:h.app)||void 0===n?void 0:n.appId),f||i.program.error("Missing API key, you need to provide a API key to add your app"),e||i.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),v||i.program.error("Missing argument, you need to provide a channel"),p&&s&&i.program.error("Cannot set latest and bundle at the same time"),void 0===s&&void 0===g&&void 0===p&&void 0===d&&void 0===c&&void 0===l&&void 0===u&&void 0===y&&i.program.error("Missing argument, you need to provide a option to set");try{const o=(0,r.createSupabaseClient)(f),n=yield(0,r.verifyUser)(o,f,["write","all"]);yield(0,r.checkPlanValid)(o,n);const b={created_by:n,app_id:e,name:v,version:-1},_=p?null===(a=null===(t=null==h?void 0:h.app)||void 0===t?void 0:t.package)||void 0===a?void 0:a.version:s;if(_){const{data:t,error:r}=yield o.from("app_versions").select().eq("app_id",e).eq("name",_).eq("user_id",n).eq("deleted",!1).single();!r&&t||i.program.error(`Cannot find version ${_}`),console.log(`Set ${e} channel: ${v} to @${s}`),b.version=t.id}void 0!==g&&("public"!==g&&"private"!==g||console.log(`Set ${e} channel: ${v} to public or private is deprecated, use default or normal instead`),console.log(`Set ${e} channel: ${v} to ${"public"===g||"default"===g?"default":"normal"}`),b.public="public"===g||"default"===g),void 0!==d&&(console.log(`Set ${e} channel: ${v} to ${d?"allow":"disallow"} downgrade`),b.disableAutoUpdateUnderNative=!d),void 0!==c&&(console.log(`Set ${e} channel: ${v} to ${c?"allow":"disallow"} upgrade`),b.disableAutoUpdateToMajor=!c),void 0!==l&&(console.log(`Set ${e} channel: ${v} to ${l?"allow":"disallow"} ios update`),b.ios=!!l),void 0!==u&&(console.log(`Set ${e} channel: ${v} to ${u?"allow":"disallow"} android update`),b.android=!!u),void 0!==y&&(console.log(`Set ${e} channel: ${v} to ${y?"allow":"disallow"} self assign to this channel`),b.allow_device_self_set=!!y);try{const{error:e}=yield(0,r.updateOrCreateChannel)(o,b,f);e&&i.program.error(`Cannot set channel ${(0,r.formatError)(e)}`)}catch(e){i.program.error(`Cannot set channel ${(0,r.formatError)(e)}`)}m.publish({channel:"app",event:"Set app",icon:"✅",tags:{"user-id":n,"app-id":e},notify:!1}).catch()}catch(e){i.program.error(`Unknow error ${(0,r.formatError)(e)}`)}console.log("Done ✅")}))},658:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.uploadVersion=void 0;const r=i(n(844)),a=n(304),s=n(113),p=i(n(295)),d=n(147),c=n(906),l=n(518),u=n(693);o.uploadVersion=(e,o)=>t(void 0,void 0,void 0,(function*(){var n,t,i,y;let{bundle:v,path:g,channel:f}=o;const{external:h,key:m=!1,displayIvSession:b}=o,_=o.apikey||(0,u.findSavedKey)(),k=(0,u.useLogSnag)();f=f||"dev";const w=yield(0,u.getConfig)();e=e||(null===(n=null==w?void 0:w.app)||void 0===n?void 0:n.appId),v=v||(null===(i=null===(t=null==w?void 0:w.app)||void 0===t?void 0:t.package)||void 0===i?void 0:i.version),u.regexSemver.test(v)||a.program.error(`Your bundle name ${v}, is not valid it should follow semver convention : https://semver.org/`),g=g||(null===(y=null==w?void 0:w.app)||void 0===y?void 0:y.webDir),_||a.program.error("Missing API key, you need to provide a API key to add your app"),e&&v&&g||a.program.error("Missing argument, you need to provide a appid and a bundle and a path, or be in a capacitor project"),console.log(`Upload ${e}@${v} started from path "${g}" to Capgo cloud`);const $=(0,u.createSupabaseClient)(_),x=yield(0,u.verifyUser)($,_,["write","all","upload"]);yield(0,u.checkPlanValid)($,x,!1);const S=new p.default.MultiBar({clearOnComplete:!1,hideCursor:!0},p.default.Presets.shades_grey),C=S.create(7,0,{format:"Uploading: [{bar}] {percentage}% | ETA: {eta}s | {value}/{total} Part"},p.default.Presets.shades_grey);C.start(7,0,{speed:"N/A"});const{data:A,error:P}=yield $.rpc("exist_app_versions",{apikey:_,name_version:v,appid:e}).single();(A||P)&&(S.stop(),a.program.error(`This app bundle already exist or was deleted, you cannot re-upload it ${(0,u.formatError)(P)}`)),C.increment();const{data:D,error:I}=yield $.rpc("is_trial",{userid:x}).single();(D&&D>0||I)&&S.log(`WARNING !!\nTrial expires in ${D} days, upgrade here: ${u.hostWeb}/dashboard/settings/plans\n`),C.increment();const{data:K,error:q}=yield $.rpc("exist_app",{appid:e,apikey:_}).single();K&&!q||(S.stop(),a.program.error(`Cannot find app ${e} in your account \n${(0,u.formatError)(q)}`)),C.increment();const{data:j,error:E}=yield $.rpc("exist_app_versions",{appid:e,apikey:_,name_version:v}).single();(j||E)&&a.program.error(`Version already exists ${(0,u.formatError)(E)}`),C.increment();const M=(0,s.randomUUID)();let U,V="";if(h)h&&!h.startsWith("https://")&&(S.stop(),a.program.error(`External link should should start with "https://" current is "${h}"`));else{const o=new r.default;o.addLocalFolder(g);let n=o.toBuffer();if(V=yield(0,c.checksum)(n,"crc32"),m||(0,d.existsSync)(u.baseKeyPub)){const e="string"==typeof m?m:u.baseKeyPub;(0,d.existsSync)(e)||a.program.error(`Cannot find public key ${e}`);const o=(0,d.readFileSync)(e);S.log("Encrypting your bundle\n");const t=(0,l.encryptSource)(n,o.toString());U=t.ivSessionKey,b&&S.log(`Your Iv Session key is ${U},\nkeep it safe, you will need it to decrypt your bundle.\nIt will be also visible in your dashboard\n`),n=t.encryptedData}const t=Math.floor(n.byteLength/1024/1024),i=`apps/${x}/${e}/versions`;C.increment(),t>20&&(S.log(`WARNING !!\nThe app size is ${t} Mb, this may take a while to download for users\n`),k.publish({channel:"app-error",event:"App Too Large",icon:"🚛",tags:{"user-id":x,"app-id":e},notify:!1}).catch());const{error:s}=yield $.storage.from(i).upload(M,n,{contentType:"application/zip"});s&&(S.stop(),a.program.error(`Cannot upload ${(0,u.formatError)(s)}`))}C.increment();const{data:O,error:N}=yield(0,u.updateOrCreateVersion)($,{bucket_id:h?void 0:M,user_id:x,name:v,app_id:e,session_key:U,external_url:h,checksum:V},_);if(N&&(S.stop(),a.program.error(`Cannot add bundle ${(0,u.formatError)(N)}`)),C.increment(),O){const{error:o}=yield(0,u.updateOrCreateChannel)($,{name:f,app_id:e,created_by:x,version:O.id},_);o&&S.log("Cannot set bundle with upload key, use key with more rights for that\n")}else S.log("Cannot set bundle with upload key, use key with more rights for that\n");S.stop();const z=(0,u.convertAppName)(e);console.log("App uploaded to server"),console.log(`Try it in mobile app: ${u.host}/app_mobile`),console.log(`Or set the channel ${f} as public here: ${u.hostWeb}/app/package/${z}`),console.log("To use with live update in your own app"),console.log(`You can link specific device to this bundle to make user try it first, here: ${u.hostWeb}/app/p/${z}/devices`),k.publish({channel:"app",event:"App Uploaded",icon:"⏫",tags:{"user-id":x,"app-id":e},notify:!1}).catch()}))},693:function(e,o,n){var t=this&&this.__awaiter||function(e,o,n,t){return new(n||(n=Promise))((function(i,r){function a(e){try{p(t.next(e))}catch(e){r(e)}}function s(e){try{p(t.throw(e))}catch(e){r(e)}}function p(e){var o;e.done?i(e.value):(o=e.value,o instanceof n?o:new n((function(e){e(o)}))).then(a,s)}p((t=t.apply(e,o||[])).next())}))},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.getHumanDate=o.verifyUser=o.convertAppName=o.useLogSnag=o.updateOrCreateChannel=o.updateOrCreateVersion=o.getConfig=o.formatError=o.findSavedKey=o.checkPlanValid=o.isAllowedAction=o.isTrial=o.isPaying=o.isGoodPlan=o.checkKey=o.regexSemver=o.createSupabaseClient=o.supaAnon=o.hostSupa=o.hostWeb=o.host=o.baseKeyPub=o.baseKey=void 0;const r=n(778),a=n(304),s=n(885),p=i(n(867)),d=n(147),c=n(37),l=n(133);o.baseKey=".capgo_key",o.baseKeyPub=`${o.baseKey}.pub`,o.host="https://capgo.app",o.hostWeb="https://web.capgo.app",o.hostSupa="https://xvwzpoazmxkqosrdewyv.supabase.co",o.supaAnon="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYzNzgwNTAwOSwiZXhwIjoxOTUzMzgxMDA5fQ.8tgID1d4jodPwuo_fz4KHN4o1XKB9fnqyt0_GaJSj-w",o.createSupabaseClient=e=>(0,s.createClient)(o.hostSupa,o.supaAnon,{global:{headers:{capgkey:e}}}),o.regexSemver=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/,o.checkKey=(e,n,i)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:r}=yield e.rpc("is_allowed_capgkey",{apikey:n,keymode:i}).single();t&&!r||a.program.error(`Invalid API key or insufficient permissions ${(0,o.formatError)(r)}`)})),o.isGoodPlan=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_good_plan_v2",{userid:o}).single();if(t)throw t;return n||!1})),o.isPaying=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_paying",{userid:o}).single();if(t)throw t;return n||!1})),o.isTrial=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_trial",{userid:o}).single();if(t)throw t;return n||0})),o.isAllowedAction=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:n,error:t}=yield e.rpc("is_allowed_action_user",{userid:o}).single();if(t)throw t;return n})),o.checkPlanValid=(e,n,i=!0)=>t(void 0,void 0,void 0,(function*(){(yield(0,o.isAllowedAction)(e,n))||a.program.error(`You need to upgrade your plan to continue to use capgo.\n Upgrade here: ${o.hostWeb}/dashboard/settings/plans\n`);const t=yield(0,o.isTrial)(e,n);t>0&&i&&console.log(`WARNING !!\nTrial expires in ${t} days, upgrade here: ${o.hostWeb}/dashboard/settings/plans\n`)})),o.findSavedKey=()=>{let e=`${(0,c.homedir)()}/.capgo`;return(0,d.existsSync)(e)?(console.log(`Use global apy key ${e}`),(0,d.readFileSync)(e,"utf8").trim()):(e=".capgo",(0,d.existsSync)(e)?(console.log(`Use local apy key ${e}`),(0,d.readFileSync)(e,"utf8").trim()):null)},o.formatError=e=>e?`\n${p.default.render(e)}`:"",o.getConfig=()=>t(void 0,void 0,void 0,(function*(){let e;try{e=yield(0,r.loadConfig)()}catch(e){a.program.error("No capacitor config file found, run `cap init` first")}return e})),o.updateOrCreateVersion=(e,o,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:i}=yield e.rpc("exist_app_versions",{appid:o.app_id,name_version:o.name,apikey:n}).single();return t&&!i?(o.deleted=!1,e.from("app_versions").update(o).eq("app_id",o.app_id).eq("name",o.name).single()):e.from("app_versions").insert(o).select().single()})),o.updateOrCreateChannel=(e,o,n)=>t(void 0,void 0,void 0,(function*(){if(!o.app_id||!o.name||!o.created_by)return console.error("missing app_id, name, or created_by"),Promise.reject(new Error("missing app_id, name, or created_by"));const{data:t,error:i}=yield e.rpc("exist_channel",{appid:o.app_id,name_channel:o.name,apikey:n}).single();return t&&!i?e.from("channels").update(o).eq("app_id",o.app_id).eq("name",o.name).eq("created_by",o.created_by).single():e.from("channels").insert(o).select().single()})),o.useLogSnag=()=>new l.LogSnag({token:"c124f5e9d0ce5bdd14bbb48f815d5583",project:"capgo"}),o.convertAppName=e=>e.replace(/\./g,"--"),o.verifyUser=(e,n,i=["all"])=>t(void 0,void 0,void 0,(function*(){yield(0,o.checkKey)(e,n,i);const{data:t,error:r}=yield e.rpc("get_user_id",{apikey:n}).single(),s=t?t.toString():"";return s&&!r||a.program.error(`Cannot verify user ${(0,o.formatError)(r)}`),s})),o.getHumanDate=e=>new Date(e.created_at||"").toLocaleString()},778:e=>{e.exports=require("@capacitor/cli/dist/config")},885:e=>{e.exports=require("@supabase/supabase-js")},906:e=>{e.exports=require("@tomasklaen/checksum")},844:e=>{e.exports=require("adm-zip")},295:e=>{e.exports=require("cli-progress")},304:e=>{e.exports=require("commander")},847:e=>{e.exports=require("console-table-printer")},470:e=>{e.exports=require("fs-extra")},133:e=>{e.exports=require("logsnag")},11:e=>{e.exports=require("mime")},867:e=>{e.exports=require("prettyjson")},616:e=>{e.exports=require("prompt-sync")},505:e=>{e.exports=require("semver/preload")},113:e=>{e.exports=require("crypto")},147:e=>{e.exports=require("fs")},37:e=>{e.exports=require("os")},598:e=>{e.exports=JSON.parse('{"name":"@capgo/cli","version":"2.3.16","description":"A CLI to upload to capgo servers","main":"dist/index.js","bin":{"capgo":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/Cap-go/capgo-cli.git"},"bugs":{"url":"https://github.com/Cap-go/capgo-cli/issues"},"keywords":["appflow alternative","ionic","capacitor","auto update","live update","capgo","cli","upload","capgo-cli"],"scripts":{"dev":"set NODE_ENV=development && npx webpack --config webpack.config.js","no-debug":"node dist/index.js","test":"npx --yes ts-node -T src/bin/index.ts","build":"npx --yes webpack --config webpack.config.js","dev-build":"SUPA_DB=development npx webpack --config webpack.config.js","pack":"pkg","types":"npx --yes supabase gen types typescript --project-id=xvwzpoazmxkqosrdewyv > src/types/supabase.types.ts","test_rls":"ts-node ./test/test_headers_rls.ts","lint":"eslint . --ext .ts --fix"},"author":"github.com/riderx","license":"Apache 2.0","dependencies":{"@capacitor/cli":"4.6.0","@supabase/supabase-js":"^2.1.2","@tomasklaen/checksum":"^1.1.0","adm-zip":"^0.5.9","cli-progress":"3.11.2","commander":"9.4.1","console-table-printer":"^2.11.1","fs-extra":"11.1.0","logsnag":"^0.1.5","mime":"^3.0.0","prettyjson":"^1.2.5","prompt-sync":"^4.2.0","semver":"^7.3.8"},"devDependencies":{"@types/adm-zip":"0.5.0","@types/cli-progress":"^3.11.0","@types/fs-extra":"^9.0.13","@types/mime":"^3.0.1","@types/node":"^18.11.9","@types/prettyjson":"^0.0.30","@types/prompt-sync":"^4.2.0","@types/semver":"^7.3.13","@typescript-eslint/eslint-plugin":"5.45.0","@typescript-eslint/parser":"5.45.0","eslint":"8.29.0","eslint-config-airbnb-base":"^15.0.0","eslint-config-prettier":"^8.5.0","eslint-import-resolver-typescript":"3.5.2","eslint-plugin-import":"2.26.0","eslint-plugin-prettier":"^4.2.1","git-format-staged":"3.0.0","husky":"^8.0.2","nodemon":"2.0.20","pkg":"5.8.0","prettier":"2.8.1","ts-loader":"^9.4.1","ts-node":"^10.9.1","tsconfig-paths":"4.1.1","typescript":"4.9.4","webpack":"5.75.0","webpack-cli":"^5.0.0","webpack-node-externals":"^3.0.0"}}')}},o={};!function n(t){var i=o[t];if(void 0!==i)return i.exports;var r=o[t]={exports:{}};return e[t].call(r.exports,r,r.exports,n),r.exports}(213)})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/cli",
3
- "version": "2.3.14",
3
+ "version": "2.3.16",
4
4
  "description": "A CLI to upload to capgo servers",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -77,7 +77,7 @@
77
77
  "ts-loader": "^9.4.1",
78
78
  "ts-node": "^10.9.1",
79
79
  "tsconfig-paths": "4.1.1",
80
- "typescript": "4.9.3",
80
+ "typescript": "4.9.4",
81
81
  "webpack": "5.75.0",
82
82
  "webpack-cli": "^5.0.0",
83
83
  "webpack-node-externals": "^3.0.0"
package/src/bin/add.ts CHANGED
@@ -57,7 +57,7 @@ export const addApp = async (appid: string, options: Options) => {
57
57
 
58
58
  // check if app already exist
59
59
  const { data: app, error: dbError0 } = await supabase
60
- .rpc('exist_app', { appid, apikey })
60
+ .rpc('exist_app_v2', { appid })
61
61
  .single()
62
62
  if (app || dbError0) {
63
63
  program.error(`App already exists ${formatError(dbError0)}`)
@@ -516,7 +516,6 @@ export interface Database {
516
516
  user_id: string
517
517
  last_send_at: string
518
518
  total_send: number
519
- cron: string
520
519
  }
521
520
  Insert: {
522
521
  id: string
@@ -525,7 +524,6 @@ export interface Database {
525
524
  user_id: string
526
525
  last_send_at?: string
527
526
  total_send?: number
528
- cron?: string
529
527
  }
530
528
  Update: {
531
529
  id?: string
@@ -534,7 +532,6 @@ export interface Database {
534
532
  user_id?: string
535
533
  last_send_at?: string
536
534
  total_send?: number
537
- cron?: string
538
535
  }
539
536
  }
540
537
  pay_as_you_go: {
@@ -724,6 +721,7 @@ export interface Database {
724
721
  trial_at: string
725
722
  price_id: string | null
726
723
  is_good_plan: boolean | null
724
+ plan_usage: number | null
727
725
  }
728
726
  Insert: {
729
727
  created_at?: string
@@ -735,6 +733,7 @@ export interface Database {
735
733
  trial_at?: string
736
734
  price_id?: string | null
737
735
  is_good_plan?: boolean | null
736
+ plan_usage?: number | null
738
737
  }
739
738
  Update: {
740
739
  created_at?: string
@@ -746,6 +745,7 @@ export interface Database {
746
745
  trial_at?: string
747
746
  price_id?: string | null
748
747
  is_good_plan?: boolean | null
748
+ plan_usage?: number | null
749
749
  }
750
750
  }
751
751
  users: {
@@ -801,6 +801,26 @@ export interface Database {
801
801
  Args: Record<PropertyKey, never>
802
802
  Returns: { mau: number; bandwidth: number; storage: number }[]
803
803
  }
804
+ convert_bytes_to_gb: {
805
+ Args: { byt: number }
806
+ Returns: number
807
+ }
808
+ convert_bytes_to_mb: {
809
+ Args: { byt: number }
810
+ Returns: number
811
+ }
812
+ convert_gb_to_bytes: {
813
+ Args: { gb: number }
814
+ Returns: number
815
+ }
816
+ convert_mb_to_bytes: {
817
+ Args: { gb: number }
818
+ Returns: number
819
+ }
820
+ convert_number_to_percent: {
821
+ Args: { val: number; max_val: number }
822
+ Returns: number
823
+ }
804
824
  count_all_apps: {
805
825
  Args: Record<PropertyKey, never>
806
826
  Returns: number
@@ -813,6 +833,10 @@ export interface Database {
813
833
  Args: { appid: string; apikey: string }
814
834
  Returns: boolean
815
835
  }
836
+ exist_app_v2: {
837
+ Args: { appid: string }
838
+ Returns: boolean
839
+ }
816
840
  exist_app_versions: {
817
841
  Args: { appid: string; name_version: string; apikey: string }
818
842
  Returns: boolean
@@ -825,34 +849,22 @@ export interface Database {
825
849
  Args: { e_mail: string }
826
850
  Returns: string
827
851
  }
828
- find_best_plan: {
829
- Args: {
830
- apps_n: number
831
- channels_n: number
832
- updates_n: number
833
- versions_n: number
834
- shared_n: number
835
- }
836
- Returns: string
837
- }
838
852
  find_best_plan_v2: {
839
853
  Args: { mau: number; storage: number; bandwidth: number }
840
854
  Returns: string
841
855
  }
842
- find_fit_plan: {
843
- Args: {
844
- apps_n: number
845
- channels_n: number
846
- updates_n: number
847
- versions_n: number
848
- shared_n: number
849
- }
850
- Returns: { name: string }[]
856
+ find_best_plan_v3: {
857
+ Args: { mau: number; bandwidth: number; storage: number }
858
+ Returns: string
851
859
  }
852
860
  find_fit_plan_v2: {
853
861
  Args: { mau: number; storage: number; bandwidth: number }
854
862
  Returns: { name: string }[]
855
863
  }
864
+ find_fit_plan_v3: {
865
+ Args: { mau: number; bandwidth: number; storage: number }
866
+ Returns: string
867
+ }
856
868
  get_current_plan_max: {
857
869
  Args: { userid: string }
858
870
  Returns: { mau: number; bandwidth: number; storage: number }[]
@@ -861,6 +873,10 @@ export interface Database {
861
873
  Args: { userid: string }
862
874
  Returns: string
863
875
  }
876
+ get_devices_version: {
877
+ Args: { app_id: string; version_id: number }
878
+ Returns: number
879
+ }
864
880
  get_dl_by_month: {
865
881
  Args: { userid: string; pastmonth: number }
866
882
  Returns: { app_id: string; maxdownload: number }[]
@@ -886,21 +902,14 @@ export interface Database {
886
902
  Args: { userid: string }
887
903
  Returns: number
888
904
  }
889
- get_max_stats: {
890
- Args: { userid: string; dateid: string }
891
- Returns: {
892
- max_channel: number
893
- max_shared: number
894
- max_update: number
895
- max_version: number
896
- max_app: number
897
- max_device: number
898
- }[]
899
- }
900
905
  get_max_version: {
901
906
  Args: { userid: string }
902
907
  Returns: number
903
908
  }
909
+ get_plan_usage_percent: {
910
+ Args: { userid: string; dateid: string }
911
+ Returns: number
912
+ }
904
913
  get_stats: {
905
914
  Args: { userid: string; dateid: string }
906
915
  Returns: {
@@ -917,6 +926,10 @@ export interface Database {
917
926
  Args: { userid: string; dateid: string }
918
927
  Returns: { mau: number; storage: number; bandwidth: number }[]
919
928
  }
929
+ get_total_stats_v2: {
930
+ Args: { userid: string; dateid: string }
931
+ Returns: { mau: number; bandwidth: number; storage: number }[]
932
+ }
920
933
  get_user_id: {
921
934
  Args: { apikey: string }
922
935
  Returns: string
@@ -936,6 +949,22 @@ export interface Database {
936
949
  }
937
950
  Returns: undefined
938
951
  }
952
+ increment_stats_v2: {
953
+ Args: {
954
+ app_id: string
955
+ date_id: string
956
+ bandwidth: number
957
+ version_size: number
958
+ channels: number
959
+ shared: number
960
+ mlu: number
961
+ mlu_real: number
962
+ versions: number
963
+ devices: number
964
+ devices_real: number
965
+ }
966
+ Returns: undefined
967
+ }
939
968
  increment_version_stats: {
940
969
  Args: { app_id: string; version_id: number; devices: number }
941
970
  Returns: undefined
@@ -944,15 +973,10 @@ export interface Database {
944
973
  Args: { userid: string }
945
974
  Returns: boolean
946
975
  }
947
- is_allowed_action:
948
- | {
949
- Args: { apikey: string }
950
- Returns: boolean
951
- }
952
- | {
953
- Args: { userid: string }
954
- Returns: boolean
955
- }
976
+ is_allowed_action: {
977
+ Args: { apikey: string }
978
+ Returns: boolean
979
+ }
956
980
  is_allowed_action_user: {
957
981
  Args: { userid: string }
958
982
  Returns: boolean
@@ -985,7 +1009,7 @@ export interface Database {
985
1009
  Args: { userid: string }
986
1010
  Returns: boolean
987
1011
  }
988
- is_good_plan: {
1012
+ is_free_usage: {
989
1013
  Args: { userid: string }
990
1014
  Returns: boolean
991
1015
  }
@@ -993,6 +1017,10 @@ export interface Database {
993
1017
  Args: { userid: string }
994
1018
  Returns: boolean
995
1019
  }
1020
+ is_good_plan_v3: {
1021
+ Args: { userid: string }
1022
+ Returns: boolean
1023
+ }
996
1024
  is_in_channel: {
997
1025
  Args: { userid: string; ownerid: string }
998
1026
  Returns: boolean
@@ -1001,6 +1029,14 @@ export interface Database {
1001
1029
  Args: { email_check: string }
1002
1030
  Returns: boolean
1003
1031
  }
1032
+ is_onboarded: {
1033
+ Args: { userid: string }
1034
+ Returns: boolean
1035
+ }
1036
+ is_onboarding_needed: {
1037
+ Args: { userid: string }
1038
+ Returns: boolean
1039
+ }
1004
1040
  is_paying: {
1005
1041
  Args: { userid: string }
1006
1042
  Returns: boolean