@capgo/cli 0.13.4 → 0.13.5

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/.cz.toml CHANGED
@@ -1,7 +1,7 @@
1
1
  [tool.commitizen]
2
2
  name = "cz_conventional_commits"
3
3
  tag_format = "$major.$minor.$patch$prerelease"
4
- version = "0.13.4"
4
+ version = "0.13.5"
5
5
  version_files = [
6
6
  "package.json:version",
7
7
  ".cz.toml"
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.13.5 (2022-06-10)
2
+
3
+ ### Fix
4
+
5
+ - issue with add and typo in text
6
+
1
7
  ## 0.13.4 (2022-06-09)
2
8
 
3
9
  ### Fix
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- (()=>{"use strict";var e={548:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(a,n){function i(e){try{s(t.next(e))}catch(e){n(e)}}function p(e){try{s(t.throw(e))}catch(e){n(e)}}function s(e){var o;e.done?a(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.addApp=void 0;const a=r(304),n=r(113),i=r(147),p=r(470),s=r(11),d=r(233),l="assets/icon.png";o.addApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var r,t;let{name:c,icon:u}=o;const g=o.apikey||(0,d.findSavedKey)(),f=yield(0,d.getConfig)();e=e||(null===(r=null==f?void 0:f.app)||void 0===r?void 0:r.appId),c=c||(null===(t=null==f?void 0:f.app)||void 0===t?void 0:t.appName)||"Unknown",u=u||"resources/icon.png",g||a.program.error("Missing API key, you need to provide a API key to add your app"),e&&c||a.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 y=(0,d.createSupabaseClient)(g),{data:v,error:m}=yield y.rpc("is_allowed_capgkey",{apikey:g,keymode:["write","all"]});if(!v||m)return void console.log("Invalid API key or insufisant rights");let h,_;console.log("Adding..."),u&&(0,p.existsSync)(u)?(h=(0,i.readFileSync)(u),_=(0,s.getType)(u)||"image/png",console.warn(`Found app icon ${u}`)):(0,p.existsSync)(l)?(h=(0,i.readFileSync)(l),_=(0,s.getType)(l)||"image/png",console.warn(`Found app icon ${l}`)):console.warn(`Cannot find app icon in any of the following locations: ${u}, ${l}`);const{data:k,error:b}=yield y.rpc("get_user_id",{apikey:g}),$=k?k.toString():"";$&&!b||a.program.error(`Cannot verify user ${(0,d.formatError)(b)}`),yield(0,d.checkPlan)(y,$);const{data:w,error:x}=yield y.rpc("exist_app",{appid:e,apikey:g});(w||x)&&a.program.error(`App already exists ${(0,d.formatError)(x)}`);const C=`icon_${(0,n.randomUUID)()}`;let q="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(h&&_){const{error:o}=yield y.storage.from(`images/${$}/${e}`).upload(C,h,{contentType:_});o&&a.program.error(`Could not add app ${(0,d.formatError)(o)}`);const{data:r}=yield y.storage.from(`images/${$}/${e}`).getPublicUrl(C);q=(null==r?void 0:r.publicURL)||q}const{error:A}=yield y.from("apps").insert({icon_url:q,user_id:$,name:c,app_id:e},{returning:"minimal"});A&&a.program.error(`Could not add app ${(0,d.formatError)(A)}`),console.log("App added to server, you can upload a version now")}))},453:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(a,n){function i(e){try{s(t.next(e))}catch(e){n(e)}}function p(e){try{s(t.throw(e))}catch(e){n(e)}}function s(e){var o;e.done?a(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.deleteApp=void 0;const a=r(304),n=r(233);o.deleteApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var r;const{version:t}=o,i=o.apikey||(0,n.findSavedKey)(),p=yield(0,n.getConfig)();e=e||(null===(r=null==p?void 0:p.app)||void 0===r?void 0:r.appId),i||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"),console.log(`Delete ${e} to Capgo`);const s=(0,n.createSupabaseClient)(i),{data:d,error:l}=yield s.rpc("is_allowed_capgkey",{apikey:i,keymode:["all"],app_id:e});if(!d||l)return void console.log("Invalid API key or insufisant rights");const{data:c,error:u}=yield s.rpc("get_user_id",{apikey:i}),g=c?c.toString():"";g&&!u||a.program.error(`Cannot verify user ${(0,n.formatError)(u)}`);const{data:f,error:y}=yield s.rpc("exist_app",{appid:e,apikey:i});if(f&&!y||a.program.error("No permission to delete"),t){const{data:o,error:r}=yield s.from("app_versions").select().eq("app_id",e).eq("user_id",g).eq("name",t).eq("deleted",!1);o&&o.length&&!r||a.program.error(`Version ${e}@${t} don't exist ${(0,n.formatError)(r)}`);const{data:i,error:p}=yield s.from("channels").select().eq("app_id",e).eq("created_by",g).eq("version",o[0].id);(i&&i.length||p)&&a.program.error(`Version ${e}@${t} is used in a channel, unlink it first ${(0,n.formatError)(p)}`);const{data:d,error:l}=yield s.from("devices_override").select().eq("app_id",e).eq("version",o[0].id);(d&&d.length||l)&&a.program.error(`Version ${e} @${t} is used in a device override, unlink it first ${(0,n.formatError)(l)}`);const{error:c}=yield s.storage.from("apps").remove([`${g} /${e}/versions / ${o[0].bucket_id} `]);c&&a.program.error(`Something went wrong when trying to delete ${e} @${t} ${c} `);const{error:u}=yield s.from("app_versions").update({deleted:!0}).eq("app_id",e).eq("name",t).eq("user_id",g);return u&&a.program.error(`App ${e} @${t} not found in database ${u} `),void console.log("App version deleted from server")}const{data:v,error:m}=yield s.from("app_versions").select().eq("app_id",e).eq("user_id",g);if(m&&a.program.error(`App ${e} not found in database ${m} `),v&&v.length){const o=v.map((o=>`${g} /${e}/versions / ${o.bucket_id} `)),{error:r}=yield s.storage.from("apps").remove(o);r&&a.program.error(`Cannot delete stored version for app ${e} from storage ${r} `)}const{error:h}=yield s.from("app_versions").delete().eq("app_id",e).eq("user_id",g);h&&a.program.error(`Cannot delete version for app ${e} from database ${h} `);const{error:_}=yield s.from("apps").delete().eq("app_id",e).eq("user_id",g);_&&a.program.error(`Cannot delete from database ${_} `),console.log("App deleted from server")}))},473:function(e,o,r){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0});const a=r(304),n=r(548),i=r(453),p=r(666),s=r(310),d=t(r(598)),l=r(937);a.program.version(d.default.version).command("add [appid]").alias("a").action(n.addApp).option("-n, --name <name>","app name").option("-i, --icon <icon>","app icon path").option("-a, --apikey <apikey>","apikey to link to your account"),a.program.version(d.default.version).command("login [apikey]").alias("l").action(l.login).option("--local","Only save in local folder"),a.program.command("upload [appid]").alias("u").action(s.uploadVersion).option("-a, --apikey <apikey>","apikey to link to your account").option("-p, --path <path>","path of the file 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("-f, --format <base64|hex|binary|utf8>","choose the upload format default base64").option("-v, --version <version>","version number of the file to upload"),a.program.command("set [appid]").alias("s").action(p.setChannel).option("-c, --channel <channel>","channel to link to").option("-v, --version <version>","version number of the file to upload").option("-s, --state <state>","set the state of the channel, public or private").option("-a, --apikey <apikey>","apikey to link to your account"),a.program.description("Manage package and version in capgo Cloud").command("delete [appid]").alias("d").action(i.deleteApp).option("-a, --apikey <apikey>","apikey to link to your account").option("-v, --version <version>","version number of the app to delete"),a.program.parse(process.argv)},937:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(a,n){function i(e){try{s(t.next(e))}catch(e){n(e)}}function p(e){try{s(t.throw(e))}catch(e){n(e)}}function s(e){var o;e.done?a(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.login=void 0;const n=r(304),i=a(r(147)),p=a(r(37));o.login=(e,o)=>t(void 0,void 0,void 0,(function*(){const{local:r}=o;if(r)i.default.existsSync(".git")||n.program.error("To use local you should be in a git repository"),i.default.writeFileSync(".capgo",`${e}\n`),i.default.appendFileSync(".gitignore",".capgo\n");else{const o=p.default.homedir();i.default.writeFileSync(`${o}/.capgo`,`${e}\n`)}console.log(`login saved into .capgo file in ${r?"local":"home"} directory`)}))},666:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(a,n){function i(e){try{s(t.next(e))}catch(e){n(e)}}function p(e){try{s(t.throw(e))}catch(e){n(e)}}function s(e){var o;e.done?a(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.setChannel=void 0;const a=r(304),n=r(233);o.setChannel=(e,o)=>t(void 0,void 0,void 0,(function*(){var r,t,i;let{version:p}=o;const{state:s,channel:d="dev"}=o,l=o.apikey||(0,n.findSavedKey)(),c=yield(0,n.getConfig)();let u;e=e||(null===(r=null==c?void 0:c.app)||void 0===r?void 0:r.appId),p=p||(null===(i=null===(t=null==c?void 0:c.app)||void 0===t?void 0:t.package)||void 0===i?void 0:i.version),"public"!==s&&"private"!==s||(u="public"===s),l||a.program.error("Missing API key, you need to provide a API key to add your app"),e||a.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),p||u||a.program.error("Missing argument, you need to provide a state or a version"),p?console.log(`Set ${d} to @${p} in ${e}`):console.log(`Set${d} to @${s} in ${e}`);try{const o=(0,n.createSupabaseClient)(l),{data:r,error:t}=yield o.rpc("is_allowed_capgkey",{apikey:l,keymode:["write","all"],app_id:e});r&&!t||a.program.error("Invalid API key or insufisant rights");const{data:i,error:s}=yield o.rpc("get_user_id",{apikey:l}),c=i?i.toString():"";c&&!s||a.program.error(`Cannot verify user ${(0,n.formatError)(s)}`),yield(0,n.checkPlan)(o,c);const g={created_by:c,app_id:e,name:d};if(p){const{data:r,error:t}=yield o.from("app_versions").select().eq("app_id",e).eq("name",p).eq("user_id",c).eq("deleted",!1);!t&&r&&r.length||a.program.error(`Cannot find version ${p}`),g.version=r[0].id}void 0!==u&&(g.public=u);try{const{error:e}=yield(0,n.updateOrCreateChannel)(o,g,l);e&&a.program.error(`Cannot set channel ${(0,n.formatError)(e)}`)}catch(e){a.program.error(`Cannot set channel ${(0,n.formatError)(e)}`)}}catch(e){a.program.error(`Unknow error ${(0,n.formatError)(e)}`)}p?console.log("Done ✅"):console.log(`You can use now is channel in your app with the url: ${n.host}/api/latest?appid=${e}&channel=${d}`)}))},310:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(a,n){function i(e){try{s(t.next(e))}catch(e){n(e)}}function p(e){try{s(t.throw(e))}catch(e){n(e)}}function s(e){var o;e.done?a(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.uploadVersion=void 0;const n=a(r(844)),i=r(304),p=r(113),s=a(r(295)),d=r(233);o.uploadVersion=(e,o)=>t(void 0,void 0,void 0,(function*(){var r,t,a,l;let{version:c,path:u,channel:g}=o;const{external:f}=o,y=o.apikey||(0,d.findSavedKey)();g=g||"dev";const v=yield(0,d.getConfig)();e=e||(null===(r=null==v?void 0:v.app)||void 0===r?void 0:r.appId),c=c||(null===(a=null===(t=null==v?void 0:v.app)||void 0===t?void 0:t.package)||void 0===a?void 0:a.version),u=u||(null===(l=null==v?void 0:v.app)||void 0===l?void 0:l.webDir),y||i.program.error("Missing API key, you need to provide a API key to add your app"),e&&c&&u||i.program.error("Missing argument, you need to provide a appid and a version and a path, or be in a capacitor project"),console.log(`Upload ${e}@${c} started from path "${u}" to Capgo cloud`);const m=(0,d.createSupabaseClient)(y),h=new s.default.MultiBar({clearOnComplete:!1,hideCursor:!0},s.default.Presets.shades_grey),_=h.create(7,0,{format:"Uploading: [{bar}] {percentage}% | ETA: {eta}s | {value}/{total} Part"},s.default.Presets.shades_grey);_.start(7,0,{speed:"N/A"});const{data:k,error:b}=yield m.rpc("is_allowed_capgkey",{apikey:y,keymode:["upload","write","all"],app_id:e});k&&!b||(h.stop(),i.program.error(`Invalid API key or insufisant rights ${(0,d.formatError)(b)}`)),_.increment();const{data:$,error:w}=yield m.rpc("exist_app_versions",{apikey:y,name_version:c,appid:e});($||w)&&(h.stop(),i.program.error(`This app version already exist or was deleted, you cannot re-upload it ${(0,d.formatError)(w)}`)),_.increment();const{data:x,error:C}=yield m.rpc("get_user_id",{apikey:y}),q=x?x.toString():"";q&&!C||(h.stop(),i.program.error(`Cannot verify user ${(0,d.formatError)(C)}`)),yield(0,d.checkPlan)(m,q,!1);const{data:A,error:P}=yield m.rpc("is_trial",{userid:q}).single();(A&&A>0||P)&&h.log(`WARNING !!\nTrial expires in ${A} days, upgrade here: ${d.hostWeb}/app/usage\n`),_.increment();const{data:I,error:S}=yield m.rpc("exist_app",{appid:e,apikey:y});I&&!S||(h.stop(),i.program.error(`Cannot find app ${e} in your account \n${(0,d.formatError)(S)}`)),_.increment();const M=(0,p.randomUUID)();if(f)f&&!f.startsWith("https://")&&(h.stop(),i.program.error(`External link should should start with "https://" current is "${f}"`));else{const o=new n.default;o.addLocalFolder(u);const r=o.toBuffer(),t=Math.floor(r.byteLength/1024/1024),a=`apps/${q}/${e}/versions`;_.increment(),t>30&&(h.stop(),i.program.error(`The app is too big, the limit is 30 Mb, your is ${t} Mb`)),t>25&&h.log(`WARNING !!\nThe app size is ${t} Mb, the limit is 30 Mb\n`);const{error:p}=yield m.storage.from(a).upload(M,r,{contentType:"application/zip"});p&&(h.stop(),i.program.error(`Cannot upload ${(0,d.formatError)(p)}`))}_.increment();const{data:j,error:E}=yield(0,d.updateOrCreateVersion)(m,{bucket_id:f?void 0:M,user_id:q,name:c,app_id:e,external_url:f},y);if(E&&(h.stop(),i.program.error(`Cannot add version ${(0,d.formatError)(E)}`)),_.increment(),j&&j.length){const{error:o}=yield(0,d.updateOrCreateChannel)(m,{name:g,app_id:e,created_by:q,version:j[0].id},y);o&&h.log("Cannot set version with upload key, use key with more rights for that\n")}else h.log("Cannot set version with upload key, use key with more rights for that\n");h.stop(),console.log("App uploaded to server"),console.log(`Try it in mobile app: ${d.host}/app_mobile`),console.log(`Or set the channel ${g} as public here: ${d.hostWeb}/app/package/${e}`),console.log("To use with live update in your own app")}))},233:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(a,n){function i(e){try{s(t.next(e))}catch(e){n(e)}}function p(e){try{s(t.throw(e))}catch(e){n(e)}}function s(e){var o;e.done?a(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.updateOrCreateChannel=o.updateOrCreateVersion=o.getConfig=o.formatError=o.findSavedKey=o.checkPlan=o.isTrial=o.isGoodPlan=o.createSupabaseClient=o.supaAnon=o.hostSupa=o.hostWeb=o.host=void 0;const n=r(778),i=r(304),p=r(885),s=a(r(867)),d=a(r(147)),l=a(r(37));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,p.createClient)(o.hostSupa,o.supaAnon,{headers:{capgkey:e}}),o.isGoodPlan=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:r,error:t}=yield e.rpc("is_good_plan",{userid:o}).single();if(t)throw t;return r||!1})),o.isTrial=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:r,error:t}=yield e.rpc("is_trial",{userid:o}).single();if(t)throw t;return r||0})),o.checkPlan=(e,r,a=!0)=>t(void 0,void 0,void 0,(function*(){let t=yield(0,o.isGoodPlan)(e,r);const n=yield(0,o.isTrial)(e,r);n>0&&(t=!0),t||i.program.error(`You need to upgrade your plan to continue to use capgo.\n Upgrade here: ${o.hostWeb}/app/usage\n`),n>0&&a&&console.log(`WARNING !!\nTrial expires in ${n} days, upgrade here: ${o.hostWeb}/app/usage\n`)})),o.findSavedKey=()=>{let e=`${l.default.homedir()}/.capgo`;return d.default.existsSync(e)?d.default.readFileSync(e,"utf8").trim():(e=".capgo",d.default.existsSync(e)?d.default.readFileSync(e,"utf8").trim():null)},o.formatError=e=>e?`\n${s.default.render(e)}`:"",o.getConfig=()=>t(void 0,void 0,void 0,(function*(){let e;try{e=yield(0,n.loadConfig)()}catch(e){i.program.error("No capacitor config file found, run `cap init` first")}return e})),o.updateOrCreateVersion=(e,o,r)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:a}=yield e.rpc("exist_app_versions",{appid:o.app_id,name_version:o.name,apikey:r});return t&&!a?(o.deleted=!1,e.from("app_versions").update(o).eq("app_id",o.app_id).eq("name",o.name)):e.from("app_versions").insert(o)})),o.updateOrCreateChannel=(e,o,r)=>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:a}=yield e.rpc("exist_channel",{appid:o.app_id,name_channel:o.name,apikey:r});return t&&!a?e.from("channels").update(o,{returning:"minimal"}).eq("app_id",o.app_id).eq("name",o.name).eq("created_by",o.created_by):e.from("channels").insert(o,{returning:"minimal"})}))},778:e=>{e.exports=require("@capacitor/cli/dist/config")},885:e=>{e.exports=require("@supabase/supabase-js")},844:e=>{e.exports=require("adm-zip")},295:e=>{e.exports=require("cli-progress")},304:e=>{e.exports=require("commander")},470:e=>{e.exports=require("fs-extra")},11:e=>{e.exports=require("mime")},867:e=>{e.exports=require("prettyjson")},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":"0.13.4","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","build":"set NODE_ENV=production&& npx webpack --config webpack.config.js","pack":"pkg","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":"3.5.1","@supabase/supabase-js":"^1.35.3","adm-zip":"^0.5.9","cli-progress":"3.11.0","commander":"9.2.0","form-data":"^4.0.0","fs-extra":"10.1.0","mime":"^3.0.0","node-stream-zip":"^1.15.0","prettyjson":"^1.2.5","upath":"^2.0.1"},"devDependencies":{"@types/adm-zip":"0.5.0","@types/cli-progress":"^3.11.0","@types/fs-extra":"^9.0.13","@types/mime":"^2.0.3","@types/node":"^17.0.31","@types/prettyjson":"^0.0.30","@typescript-eslint/eslint-plugin":"5.22.0","@typescript-eslint/parser":"5.22.0","eslint":"8.14.0","eslint-config-airbnb-base":"^15.0.0","eslint-config-prettier":"^8.5.0","eslint-import-resolver-typescript":"2.7.1","eslint-plugin-import":"2.26.0","eslint-plugin-prettier":"^4.0.0","git-format-staged":"3.0.0","husky":"^7.0.4","nodemon":"2.0.16","pkg":"5.6.0","prettier":"2.6.2","ts-loader":"^9.3.0","ts-node":"^10.7.0","tsconfig-paths":"4.0.0","typescript":"4.6.4","webpack":"5.72.0","webpack-cli":"^4.9.2","webpack-node-externals":"^3.0.0"}}')}},o={};!function r(t){var a=o[t];if(void 0!==a)return a.exports;var n=o[t]={exports:{}};return e[t].call(n.exports,n,n.exports,r),n.exports}(473)})();
2
+ (()=>{"use strict";var e={548:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(n,a){function i(e){try{s(t.next(e))}catch(e){a(e)}}function p(e){try{s(t.throw(e))}catch(e){a(e)}}function s(e){var o;e.done?n(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.addApp=void 0;const n=r(304),a=r(113),i=r(147),p=r(470),s=r(11),d=r(233),l="assets/icon.png";o.addApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var r,t;let{name:c,icon:u}=o;const f=o.apikey||(0,d.findSavedKey)(),g=yield(0,d.getConfig)();e=e||(null===(r=null==g?void 0:g.app)||void 0===r?void 0:r.appId),c=c||(null===(t=null==g?void 0:g.app)||void 0===t?void 0:t.appName)||"Unknown",u=u||"resources/icon.png",f||n.program.error("Missing API key, you need to provide a API key to add your app"),e&&c||n.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 v=(0,d.createSupabaseClient)(f);yield(0,d.checkKey)(v,f,["write","all"]);const{data:y,error:m}=yield v.rpc("get_user_id",{apikey:f}),h=y?y.toString():"";let _,b;h&&!m||n.program.error(`Cannot verify user ${(0,d.formatError)(m)}`),yield(0,d.checkPlan)(v,h),console.log("Adding..."),u&&(0,p.existsSync)(u)?(_=(0,i.readFileSync)(u),b=(0,s.getType)(u)||"image/png",console.warn(`Found app icon ${u}`)):(0,p.existsSync)(l)?(_=(0,i.readFileSync)(l),b=(0,s.getType)(l)||"image/png",console.warn(`Found app icon ${l}`)):console.warn(`Cannot find app icon in any of the following locations: ${u}, ${l}`);const{data:k,error:$}=yield v.rpc("exist_app",{appid:e,apikey:f});(k||$)&&n.program.error(`App already exists ${(0,d.formatError)($)}`);const w=`icon_${(0,a.randomUUID)()}`;let x="https://xvwzpoazmxkqosrdewyv.supabase.co/storage/v1/object/public/images/capgo.png";if(_&&b){const{error:o}=yield v.storage.from(`images/${h}/${e}`).upload(w,_,{contentType:b});o&&n.program.error(`Could not add app ${(0,d.formatError)(o)}`);const{data:r}=yield v.storage.from(`images/${h}/${e}`).getPublicUrl(w);x=(null==r?void 0:r.publicURL)||x}const{error:C}=yield v.from("apps").insert({icon_url:x,user_id:h,name:c,app_id:e},{returning:"minimal"});C&&n.program.error(`Could not add app ${(0,d.formatError)(C)}`),console.log("App added to server, you can upload a version now")}))},453:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(n,a){function i(e){try{s(t.next(e))}catch(e){a(e)}}function p(e){try{s(t.throw(e))}catch(e){a(e)}}function s(e){var o;e.done?n(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.deleteApp=void 0;const n=r(304),a=r(233);o.deleteApp=(e,o)=>t(void 0,void 0,void 0,(function*(){var r;const{version:t}=o,i=o.apikey||(0,a.findSavedKey)(),p=yield(0,a.getConfig)();e=e||(null===(r=null==p?void 0:p.app)||void 0===r?void 0:r.appId),i||n.program.error("Missing API key, you need to provide an API key to delete your app"),e||n.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),console.log(`Delete ${e} to Capgo`);const s=(0,a.createSupabaseClient)(i);yield(0,a.checkKey)(s,i,["all"]);const{data:d,error:l}=yield s.rpc("get_user_id",{apikey:i}),c=d?d.toString():"";c&&!l||n.program.error(`Cannot verify user ${(0,a.formatError)(l)}`);const{data:u,error:f}=yield s.rpc("exist_app",{appid:e,apikey:i});if(u&&!f||n.program.error("No permission to delete"),t){const{data:o,error:r}=yield s.from("app_versions").select().eq("app_id",e).eq("user_id",c).eq("name",t).eq("deleted",!1);o&&o.length&&!r||n.program.error(`Version ${e}@${t} don't exist ${(0,a.formatError)(r)}`);const{data:i,error:p}=yield s.from("channels").select().eq("app_id",e).eq("created_by",c).eq("version",o[0].id);(i&&i.length||p)&&n.program.error(`Version ${e}@${t} is used in a channel, unlink it first ${(0,a.formatError)(p)}`);const{data:d,error:l}=yield s.from("devices_override").select().eq("app_id",e).eq("version",o[0].id);(d&&d.length||l)&&n.program.error(`Version ${e} @${t} is used in a device override, unlink it first ${(0,a.formatError)(l)}`);const{error:u}=yield s.storage.from("apps").remove([`${c} /${e}/versions / ${o[0].bucket_id} `]);u&&n.program.error(`Something went wrong when trying to delete ${e} @${t} ${u} `);const{error:f}=yield s.from("app_versions").update({deleted:!0}).eq("app_id",e).eq("name",t).eq("user_id",c);return f&&n.program.error(`App ${e} @${t} not found in database ${f} `),void console.log("App version deleted from server")}const{data:g,error:v}=yield s.from("app_versions").select().eq("app_id",e).eq("user_id",c);if(v&&n.program.error(`App ${e} not found in database ${v} `),g&&g.length){const o=g.map((o=>`${c}/${e}/versions/${o.bucket_id} `)),{error:r}=yield s.storage.from("apps").remove(o);r&&n.program.error(`Cannot delete stored version for app ${e} from storage ${r} `)}const{error:y}=yield s.from("app_versions").delete().eq("app_id",e).eq("user_id",c);y&&n.program.error(`Cannot delete version for app ${e} from database ${y} `);const{error:m}=yield s.from("apps").delete().eq("app_id",e).eq("user_id",c);m&&n.program.error(`Cannot delete from database ${m} `),console.log("App deleted from server")}))},473:function(e,o,r){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0});const n=r(304),a=r(548),i=r(453),p=r(666),s=r(310),d=t(r(598)),l=r(937);n.program.version(d.default.version).command("add [appid]").alias("a").action(a.addApp).option("-n, --name <name>","app name").option("-i, --icon <icon>","app icon path").option("-a, --apikey <apikey>","apikey to link to your account"),n.program.version(d.default.version).command("login [apikey]").alias("l").action(l.login).option("--local","Only save in local folder"),n.program.command("upload [appid]").alias("u").action(s.uploadVersion).option("-a, --apikey <apikey>","apikey to link to your account").option("-p, --path <path>","path of the file 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("-f, --format <base64|hex|binary|utf8>","choose the upload format default base64").option("-v, --version <version>","version number of the file to upload"),n.program.command("set [appid]").alias("s").action(p.setChannel).option("-c, --channel <channel>","channel to link to").option("-v, --version <version>","version number of the file to upload").option("-s, --state <state>","set the state of the channel, public or private").option("-a, --apikey <apikey>","apikey to link to your account"),n.program.description("Manage package and version in capgo Cloud").command("delete [appid]").alias("d").action(i.deleteApp).option("-a, --apikey <apikey>","apikey to link to your account").option("-v, --version <version>","version number of the app to delete"),n.program.parse(process.argv)},937:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(n,a){function i(e){try{s(t.next(e))}catch(e){a(e)}}function p(e){try{s(t.throw(e))}catch(e){a(e)}}function s(e){var o;e.done?n(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.login=void 0;const a=r(304),i=n(r(147)),p=n(r(37));o.login=(e,o)=>t(void 0,void 0,void 0,(function*(){const{local:r}=o;if(r)i.default.existsSync(".git")||a.program.error("To use local you should be in a git repository"),i.default.writeFileSync(".capgo",`${e}\n`),i.default.appendFileSync(".gitignore",".capgo\n");else{const o=p.default.homedir();i.default.writeFileSync(`${o}/.capgo`,`${e}\n`)}console.log(`login saved into .capgo file in ${r?"local":"home"} directory`)}))},666:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(n,a){function i(e){try{s(t.next(e))}catch(e){a(e)}}function p(e){try{s(t.throw(e))}catch(e){a(e)}}function s(e){var o;e.done?n(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))};Object.defineProperty(o,"__esModule",{value:!0}),o.setChannel=void 0;const n=r(304),a=r(233);o.setChannel=(e,o)=>t(void 0,void 0,void 0,(function*(){var r,t,i;let{version:p}=o;const{state:s,channel:d="dev"}=o,l=o.apikey||(0,a.findSavedKey)(),c=yield(0,a.getConfig)();let u;e=e||(null===(r=null==c?void 0:c.app)||void 0===r?void 0:r.appId),p=p||(null===(i=null===(t=null==c?void 0:c.app)||void 0===t?void 0:t.package)||void 0===i?void 0:i.version),"public"!==s&&"private"!==s||(u="public"===s),l||n.program.error("Missing API key, you need to provide a API key to add your app"),e||n.program.error("Missing argument, you need to provide a appid, or be in a capacitor project"),p||u||n.program.error("Missing argument, you need to provide a state or a version"),p?console.log(`Set ${d} to @${p} in ${e}`):console.log(`Set${d} to @${s} in ${e}`);try{const o=(0,a.createSupabaseClient)(l);yield(0,a.checkKey)(o,l,["write","all"]);const{data:r,error:t}=yield o.rpc("get_user_id",{apikey:l}),i=r?r.toString():"";i&&!t||n.program.error(`Cannot verify user ${(0,a.formatError)(t)}`),yield(0,a.checkPlan)(o,i);const s={created_by:i,app_id:e,name:d};if(p){const{data:r,error:t}=yield o.from("app_versions").select().eq("app_id",e).eq("name",p).eq("user_id",i).eq("deleted",!1);!t&&r&&r.length||n.program.error(`Cannot find version ${p}`),s.version=r[0].id}void 0!==u&&(s.public=u);try{const{error:e}=yield(0,a.updateOrCreateChannel)(o,s,l);e&&n.program.error(`Cannot set channel ${(0,a.formatError)(e)}`)}catch(e){n.program.error(`Cannot set channel ${(0,a.formatError)(e)}`)}}catch(e){n.program.error(`Unknow error ${(0,a.formatError)(e)}`)}p?console.log("Done ✅"):console.log(`You can use now is channel in your app with the url: ${a.host}/api/latest?appid=${e}&channel=${d}`)}))},310:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(n,a){function i(e){try{s(t.next(e))}catch(e){a(e)}}function p(e){try{s(t.throw(e))}catch(e){a(e)}}function s(e){var o;e.done?n(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.uploadVersion=void 0;const a=n(r(844)),i=r(304),p=r(113),s=n(r(295)),d=r(233);o.uploadVersion=(e,o)=>t(void 0,void 0,void 0,(function*(){var r,t,n,l;let{version:c,path:u,channel:f}=o;const{external:g}=o,v=o.apikey||(0,d.findSavedKey)();f=f||"dev";const y=yield(0,d.getConfig)();e=e||(null===(r=null==y?void 0:y.app)||void 0===r?void 0:r.appId),c=c||(null===(n=null===(t=null==y?void 0:y.app)||void 0===t?void 0:t.package)||void 0===n?void 0:n.version),u=u||(null===(l=null==y?void 0:y.app)||void 0===l?void 0:l.webDir),v||i.program.error("Missing API key, you need to provide a API key to add your app"),e&&c&&u||i.program.error("Missing argument, you need to provide a appid and a version and a path, or be in a capacitor project"),console.log(`Upload ${e}@${c} started from path "${u}" to Capgo cloud`);const m=(0,d.createSupabaseClient)(v);yield(0,d.checkKey)(m,v,["write","all"]);const h=new s.default.MultiBar({clearOnComplete:!1,hideCursor:!0},s.default.Presets.shades_grey),_=h.create(7,0,{format:"Uploading: [{bar}] {percentage}% | ETA: {eta}s | {value}/{total} Part"},s.default.Presets.shades_grey);_.start(7,0,{speed:"N/A"}),_.increment();const{data:b,error:k}=yield m.rpc("exist_app_versions",{apikey:v,name_version:c,appid:e});(b||k)&&(h.stop(),i.program.error(`This app version already exist or was deleted, you cannot re-upload it ${(0,d.formatError)(k)}`)),_.increment();const{data:$,error:w}=yield m.rpc("get_user_id",{apikey:v}),x=$?$.toString():"";x&&!w||(h.stop(),i.program.error(`Cannot verify user ${(0,d.formatError)(w)}`)),yield(0,d.checkPlan)(m,x,!1);const{data:C,error:q}=yield m.rpc("is_trial",{userid:x}).single();(C&&C>0||q)&&h.log(`WARNING !!\nTrial expires in ${C} days, upgrade here: ${d.hostWeb}/app/usage\n`),_.increment();const{data:S,error:A}=yield m.rpc("exist_app",{appid:e,apikey:v});S&&!A||(h.stop(),i.program.error(`Cannot find app ${e} in your account \n${(0,d.formatError)(A)}`)),_.increment();const P=(0,p.randomUUID)();if(g)g&&!g.startsWith("https://")&&(h.stop(),i.program.error(`External link should should start with "https://" current is "${g}"`));else{const o=new a.default;o.addLocalFolder(u);const r=o.toBuffer(),t=Math.floor(r.byteLength/1024/1024),n=`apps/${x}/${e}/versions`;_.increment(),t>30&&(h.stop(),i.program.error(`The app is too big, the limit is 30 Mb, your is ${t} Mb`)),t>25&&h.log(`WARNING !!\nThe app size is ${t} Mb, the limit is 30 Mb\n`);const{error:p}=yield m.storage.from(n).upload(P,r,{contentType:"application/zip"});p&&(h.stop(),i.program.error(`Cannot upload ${(0,d.formatError)(p)}`))}_.increment();const{data:I,error:M}=yield(0,d.updateOrCreateVersion)(m,{bucket_id:g?void 0:P,user_id:x,name:c,app_id:e,external_url:g},v);if(M&&(h.stop(),i.program.error(`Cannot add version ${(0,d.formatError)(M)}`)),_.increment(),I&&I.length){const{error:o}=yield(0,d.updateOrCreateChannel)(m,{name:f,app_id:e,created_by:x,version:I[0].id},v);o&&h.log("Cannot set version with upload key, use key with more rights for that\n")}else h.log("Cannot set version with upload key, use key with more rights for that\n");h.stop();const j=e.replace(/\./g,"--");console.log("App uploaded to server"),console.log(`Try it in mobile app: ${d.host}/app_mobile`),console.log(`Or set the channel ${f} as public here: ${d.hostWeb}/app/package/${j}`),console.log("To use with live update in your own app"),console.log(`You can link specific device to this version to make user try it first, here: ${d.hostWeb}/app/p/${j}/devices`)}))},233:function(e,o,r){var t=this&&this.__awaiter||function(e,o,r,t){return new(r||(r=Promise))((function(n,a){function i(e){try{s(t.next(e))}catch(e){a(e)}}function p(e){try{s(t.throw(e))}catch(e){a(e)}}function s(e){var o;e.done?n(e.value):(o=e.value,o instanceof r?o:new r((function(e){e(o)}))).then(i,p)}s((t=t.apply(e,o||[])).next())}))},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(o,"__esModule",{value:!0}),o.updateOrCreateChannel=o.updateOrCreateVersion=o.getConfig=o.formatError=o.findSavedKey=o.checkPlan=o.isTrial=o.isGoodPlan=o.checkKey=o.createSupabaseClient=o.supaAnon=o.hostSupa=o.hostWeb=o.host=void 0;const a=r(778),i=r(304),p=r(885),s=n(r(867)),d=n(r(147)),l=n(r(37));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,p.createClient)(o.hostSupa,o.supaAnon,{headers:{capgkey:e}}),o.checkKey=(e,r,n)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:a}=yield e.rpc("is_allowed_capgkey",{apikey:r,keymode:n});t&&!a||i.program.error(`Invalid API key or insufficient rights ${(0,o.formatError)(a)}`)})),o.isGoodPlan=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:r,error:t}=yield e.rpc("is_good_plan",{userid:o}).single();if(t)throw t;return r||!1})),o.isTrial=(e,o)=>t(void 0,void 0,void 0,(function*(){const{data:r,error:t}=yield e.rpc("is_trial",{userid:o}).single();if(t)throw t;return r||0})),o.checkPlan=(e,r,n=!0)=>t(void 0,void 0,void 0,(function*(){let t=yield(0,o.isGoodPlan)(e,r);const a=yield(0,o.isTrial)(e,r);a>0&&(t=!0),t||i.program.error(`You need to upgrade your plan to continue to use capgo.\n Upgrade here: ${o.hostWeb}/app/usage\n`),a>0&&n&&console.log(`WARNING !!\nTrial expires in ${a} days, upgrade here: ${o.hostWeb}/app/usage\n`)})),o.findSavedKey=()=>{let e=`${l.default.homedir()}/.capgo`;return d.default.existsSync(e)?d.default.readFileSync(e,"utf8").trim():(e=".capgo",d.default.existsSync(e)?d.default.readFileSync(e,"utf8").trim():null)},o.formatError=e=>e?`\n${s.default.render(e)}`:"",o.getConfig=()=>t(void 0,void 0,void 0,(function*(){let e;try{e=yield(0,a.loadConfig)()}catch(e){i.program.error("No capacitor config file found, run `cap init` first")}return e})),o.updateOrCreateVersion=(e,o,r)=>t(void 0,void 0,void 0,(function*(){const{data:t,error:n}=yield e.rpc("exist_app_versions",{appid:o.app_id,name_version:o.name,apikey:r});return t&&!n?(o.deleted=!1,e.from("app_versions").update(o).eq("app_id",o.app_id).eq("name",o.name)):e.from("app_versions").insert(o)})),o.updateOrCreateChannel=(e,o,r)=>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:n}=yield e.rpc("exist_channel",{appid:o.app_id,name_channel:o.name,apikey:r});return t&&!n?e.from("channels").update(o,{returning:"minimal"}).eq("app_id",o.app_id).eq("name",o.name).eq("created_by",o.created_by):e.from("channels").insert(o,{returning:"minimal"})}))},778:e=>{e.exports=require("@capacitor/cli/dist/config")},885:e=>{e.exports=require("@supabase/supabase-js")},844:e=>{e.exports=require("adm-zip")},295:e=>{e.exports=require("cli-progress")},304:e=>{e.exports=require("commander")},470:e=>{e.exports=require("fs-extra")},11:e=>{e.exports=require("mime")},867:e=>{e.exports=require("prettyjson")},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":"0.13.5","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","build":"npx webpack --config webpack.config.js","dev-build":"SUPA_DB=development npx webpack --config webpack.config.js","pack":"pkg","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":"3.5.1","@supabase/supabase-js":"^1.35.3","adm-zip":"^0.5.9","cli-progress":"3.11.0","commander":"9.2.0","form-data":"^4.0.0","fs-extra":"10.1.0","mime":"^3.0.0","node-stream-zip":"^1.15.0","prettyjson":"^1.2.5","upath":"^2.0.1"},"devDependencies":{"@types/adm-zip":"0.5.0","@types/cli-progress":"^3.11.0","@types/fs-extra":"^9.0.13","@types/mime":"^2.0.3","@types/node":"^17.0.31","@types/prettyjson":"^0.0.30","@typescript-eslint/eslint-plugin":"5.22.0","@typescript-eslint/parser":"5.22.0","eslint":"8.14.0","eslint-config-airbnb-base":"^15.0.0","eslint-config-prettier":"^8.5.0","eslint-import-resolver-typescript":"2.7.1","eslint-plugin-import":"2.26.0","eslint-plugin-prettier":"^4.0.0","git-format-staged":"3.0.0","husky":"^7.0.4","nodemon":"2.0.16","pkg":"5.6.0","prettier":"2.6.2","ts-loader":"^9.3.0","ts-node":"^10.7.0","tsconfig-paths":"4.0.0","typescript":"4.6.4","webpack":"5.72.0","webpack-cli":"^4.9.2","webpack-node-externals":"^3.0.0"}}')}},o={};!function r(t){var n=o[t];if(void 0!==n)return n.exports;var a=o[t]={exports:{}};return e[t].call(a.exports,a,a.exports,r),a.exports}(473)})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/cli",
3
- "version": "0.13.4",
3
+ "version": "0.13.5",
4
4
  "description": "A CLI to upload to capgo servers",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -25,9 +25,10 @@
25
25
  "capgo-cli"
26
26
  ],
27
27
  "scripts": {
28
- "dev": "set NODE_ENV=development&& npx webpack --config webpack.config.js",
28
+ "dev": "set NODE_ENV=development && npx webpack --config webpack.config.js",
29
29
  "no-debug": "node dist/index.js",
30
- "build": "set NODE_ENV=production&& npx webpack --config webpack.config.js",
30
+ "build": "npx webpack --config webpack.config.js",
31
+ "dev-build": "SUPA_DB=development npx webpack --config webpack.config.js",
31
32
  "pack": "pkg",
32
33
  "test_rls": "ts-node ./test/test_headers_rls.ts",
33
34
  "lint": "eslint . --ext .ts --fix"
package/src/bin/add.ts CHANGED
@@ -4,7 +4,7 @@ import { readFileSync } from 'fs';
4
4
  import { existsSync } from 'fs-extra';
5
5
  import { getType } from 'mime';
6
6
  import { definitions } from './types_supabase'
7
- import { getConfig, createSupabaseClient, formatError, findSavedKey, hostWeb, checkPlan } from './utils';
7
+ import { getConfig, createSupabaseClient, formatError, findSavedKey, checkPlan, checkKey } from './utils';
8
8
 
9
9
  interface Options {
10
10
  apikey: string;
@@ -29,14 +29,14 @@ export const addApp = async (appid: string, options: Options) => {
29
29
 
30
30
  const supabase = createSupabaseClient(apikey)
31
31
 
32
- // checking if user has access before uploading image
33
- const { data: apiAccess, error: apiAccessError } = await supabase
34
- .rpc('is_allowed_capgkey', { apikey, keymode: ['write', 'all'] })
35
-
36
- if (!apiAccess || apiAccessError) {
37
- console.log('Invalid API key or insufisant rights');
38
- return
32
+ await checkKey(supabase, apikey, ['write', 'all']);
33
+ const { data: dataUser, error: userIdError } = await supabase
34
+ .rpc<string>('get_user_id', { apikey })
35
+ const userId = dataUser ? dataUser.toString() : '';
36
+ if (!userId || userIdError) {
37
+ program.error(`Cannot verify user ${formatError(userIdError)}`);
39
38
  }
39
+ await checkPlan(supabase, userId)
40
40
 
41
41
  console.log('Adding...');
42
42
  let iconBuff;
@@ -57,15 +57,6 @@ export const addApp = async (appid: string, options: Options) => {
57
57
  console.warn(`Cannot find app icon in any of the following locations: ${icon}, ${newIconPath}`);
58
58
  }
59
59
 
60
- const { data: dataUser, error: userIdError } = await supabase
61
- .rpc<string>('get_user_id', { apikey })
62
-
63
- const userId = dataUser ? dataUser.toString() : '';
64
-
65
- if (!userId || userIdError) {
66
- program.error(`Cannot verify user ${formatError(userIdError)}`);
67
- }
68
- await checkPlan(supabase, userId)
69
60
  // check if app already exist
70
61
  const { data: app, error: dbError0 } = await supabase
71
62
  .rpc<string>('exist_app', { appid, apikey })
@@ -92,7 +83,6 @@ export const addApp = async (appid: string, options: Options) => {
92
83
  .getPublicUrl(fileName)
93
84
  signedURL = signedURLData?.publicURL || signedURL
94
85
  }
95
-
96
86
  // add app to db
97
87
  const { error: dbError } = await supabase
98
88
  .from<definitions['apps']>('apps')
package/src/bin/delete.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { program } from 'commander';
2
- import { getConfig, createSupabaseClient, formatError, findSavedKey, hostWeb } from './utils';
2
+ import { getConfig, createSupabaseClient, formatError, findSavedKey, checkKey } from './utils';
3
3
  import { definitions } from './types_supabase'
4
4
 
5
5
  interface Options {
@@ -22,14 +22,7 @@ export const deleteApp = async (appid: string, options: Options) => {
22
22
 
23
23
  const supabase = createSupabaseClient(apikey)
24
24
 
25
- // checking if user has access rights before deleting
26
- const { data: apiAccess, error: apiAccessError } = await supabase
27
- .rpc('is_allowed_capgkey', { apikey, keymode: ['all'], app_id: appid })
28
-
29
- if (!apiAccess || apiAccessError) {
30
- console.log('Invalid API key or insufisant rights');
31
- return
32
- }
25
+ await checkKey(supabase, apikey, ['all']);
33
26
 
34
27
  const { data: dataUser, error: userIdError } = await supabase
35
28
  .rpc<string>('get_user_id', { apikey })
@@ -109,7 +102,7 @@ export const deleteApp = async (appid: string, options: Options) => {
109
102
  }
110
103
 
111
104
  if (data && data.length) {
112
- const filesToRemove = data.map(x => `${userId} /${appid}/versions / ${x.bucket_id} `)
105
+ const filesToRemove = data.map(x => `${userId}/${appid}/versions/${x.bucket_id} `)
113
106
  const { error: delError } = await supabase
114
107
  .storage
115
108
  .from('apps')
package/src/bin/set.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import { program } from 'commander';
2
- import { getConfig, createSupabaseClient, updateOrCreateChannel, host, formatError, findSavedKey, hostWeb, checkPlan } from './utils';
2
+ import {
3
+ getConfig, createSupabaseClient, updateOrCreateChannel,
4
+ host, formatError, findSavedKey, checkPlan, checkKey
5
+ } from './utils';
3
6
  import { definitions } from './types_supabase';
4
7
 
5
8
  interface Options {
@@ -35,12 +38,7 @@ export const setChannel = async (appid: string, options: Options) => {
35
38
  }
36
39
  try {
37
40
  const supabase = createSupabaseClient(apikey)
38
- const { data: apiAccess, error: apiAccessError } = await supabase
39
- .rpc('is_allowed_capgkey', { apikey, keymode: ['write', 'all'], app_id: appid })
40
-
41
- if (!apiAccess || apiAccessError) {
42
- program.error("Invalid API key or insufisant rights");
43
- }
41
+ await checkKey(supabase, apikey, ['write', 'all']);
44
42
  const { data: dataUser, error: userIdError } = await supabase
45
43
  .rpc<string>('get_user_id', { apikey })
46
44
 
package/src/bin/upload.ts CHANGED
@@ -4,7 +4,7 @@ import { randomUUID } from 'crypto';
4
4
  import cliProgress from 'cli-progress';
5
5
  import {
6
6
  host, hostWeb, getConfig, createSupabaseClient,
7
- updateOrCreateChannel, updateOrCreateVersion, formatError, findSavedKey, checkPlan
7
+ updateOrCreateChannel, updateOrCreateVersion, formatError, findSavedKey, checkPlan, checkKey
8
8
  } from './utils';
9
9
 
10
10
  interface Options {
@@ -36,6 +36,7 @@ export const uploadVersion = async (appid: string, options: Options) => {
36
36
  console.log(`Upload ${appid}@${version} started from path "${path}" to Capgo cloud`);
37
37
 
38
38
  const supabase = createSupabaseClient(apikey)
39
+ await checkKey(supabase, apikey, ['write', 'all']);
39
40
  const multibar = new cliProgress.MultiBar({
40
41
  clearOnComplete: false,
41
42
  hideCursor: true
@@ -48,14 +49,6 @@ export const uploadVersion = async (appid: string, options: Options) => {
48
49
  b1.start(7, 0, {
49
50
  speed: "N/A"
50
51
  });
51
- // checking if user has access rights before uploading
52
- const { data: apiAccess, error: apiAccessError } = await supabase
53
- .rpc('is_allowed_capgkey', { apikey, keymode: ['upload', 'write', 'all'], app_id: appid })
54
-
55
- if (!apiAccess || apiAccessError) {
56
- multibar.stop()
57
- program.error(`Invalid API key or insufisant rights ${formatError(apiAccessError)}`);
58
- }
59
52
  b1.increment();
60
53
 
61
54
  // checking if user has access rights before uploading
@@ -148,8 +141,10 @@ export const uploadVersion = async (appid: string, options: Options) => {
148
141
  multibar.log('Cannot set version with upload key, use key with more rights for that\n');
149
142
  }
150
143
  multibar.stop()
144
+ const appidWeb = appid.replace(/\./g, '--')
151
145
  console.log("App uploaded to server")
152
146
  console.log(`Try it in mobile app: ${host}/app_mobile`)
153
- console.log(`Or set the channel ${channel} as public here: ${hostWeb}/app/package/${appid}`)
147
+ console.log(`Or set the channel ${channel} as public here: ${hostWeb}/app/package/${appidWeb}`)
154
148
  console.log("To use with live update in your own app")
149
+ console.log(`You can link specific device to this version to make user try it first, here: ${hostWeb}/app/p/${appidWeb}/devices`)
155
150
  }
package/src/bin/utils.ts CHANGED
@@ -8,12 +8,16 @@ import { definitions } from './types_supabase';
8
8
 
9
9
  export const host = 'https://capgo.app';
10
10
  export const hostWeb = 'https://web.capgo.app';
11
- export const hostSupa = 'https://xvwzpoazmxkqosrdewyv.supabase.co';
12
- // export const hostSupa = 'https://aucsybvnhavogdmzwtcw.supabase.co';
11
+ export const hostSupa = process.env.SUPA_DB === 'production'
12
+ ? 'https://xvwzpoazmxkqosrdewyv.supabase.co' : 'https://aucsybvnhavogdmzwtcw.supabase.co';
13
13
 
14
+ if (process.env.SUPA_DB !== 'production') {
15
+ console.log('hostSupa', hostSupa);
16
+ }
14
17
  /* eslint-disable */
15
- export const supaAnon = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYzNzgwNTAwOSwiZXhwIjoxOTUzMzgxMDA5fQ.8tgID1d4jodPwuo_fz4KHN4o1XKB9fnqyt0_GaJSj-w'
16
- // export const supaAnon = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImF1Y3N5YnZuaGF2b2dkbXp3dGN3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2NTM1ODcxNjgsImV4cCI6MTk2OTE2MzE2OH0.8FKKJqiGgoVA3p9GH5wvnbWkWywIxVLqQyZFhupZ7C4'
18
+ export const supaAnon = process.env.SUPA_DB === 'production'
19
+ ? 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYzNzgwNTAwOSwiZXhwIjoxOTUzMzgxMDA5fQ.8tgID1d4jodPwuo_fz4KHN4o1XKB9fnqyt0_GaJSj-w'
20
+ : 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImF1Y3N5YnZuaGF2b2dkbXp3dGN3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2NTQ1Mzk1MDYsImV4cCI6MTk3MDExNTUwNn0.HyuZmo_EjF5fgZQU3g37bdNardK1CLHgxXmYqtr59bo'
17
21
  /* eslint-enable */
18
22
 
19
23
  export const createSupabaseClient = (apikey: string) => createClient(hostSupa, supaAnon, {
@@ -22,6 +26,15 @@ export const createSupabaseClient = (apikey: string) => createClient(hostSupa, s
22
26
  }
23
27
  })
24
28
 
29
+ export const checkKey = async (supabase: SupabaseClient, apikey: string, keymode: string[]) => {
30
+ const { data: apiAccess, error: apiAccessError } = await supabase
31
+ .rpc('is_allowed_capgkey', { apikey, keymode })
32
+
33
+ if (!apiAccess || apiAccessError) {
34
+ program.error(`Invalid API key or insufficient rights ${formatError(apiAccessError)}`);
35
+ }
36
+ }
37
+
25
38
  export const isGoodPlan = async (supabase: SupabaseClient, userId: string): Promise<boolean> => {
26
39
  const { data, error } = await supabase
27
40
  .rpc<boolean>('is_good_plan', { userid: userId })
package/webpack.config.js CHANGED
@@ -18,7 +18,12 @@ module.exports = {
18
18
  },
19
19
  devtool: process.env.NODE_ENV === 'development' ? 'eval-source-map' : undefined,
20
20
  watch: process.env.NODE_ENV === 'development',
21
- plugins: [new webpack.BannerPlugin({ banner: '#!/usr/bin/env node', raw: true })],
21
+ plugins: [
22
+ new webpack.BannerPlugin({ banner: '#!/usr/bin/env node', raw: true }),
23
+ new webpack.EnvironmentPlugin({
24
+ SUPA_DB: 'production',
25
+ }),
26
+ ],
22
27
  resolve: {
23
28
  extensions: ['.ts', '.js'],
24
29
  },