@todesktop/cli 1.1.0 → 1.1.1

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.
@@ -1,90 +1,3607 @@
1
- parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"cb6D":[function(require,module,exports) {
2
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("react"),r=({cons:r=console,proc:t=process}={})=>{try{(0,e.useState)(null)}catch(o){r.error(o),t.exit(1)}};exports.default=r;
3
- },{}],"iiO0":[function(require,module,exports) {
4
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=o(require("@babel/runtime/helpers/extends")),t=o(require("ink-text-input")),u=o(require("react")),r=o(require("prop-types"));function o(e){return e&&e.__esModule?e:{default:e}}const l=({onBlur:r,onFocus:o,...l})=>(u.default.useEffect(()=>(o(),r),[o,r]),u.default.createElement(t.default,(0,e.default)({},l,{showCursor:!0})));l.propTypes={onBlur:r.default.func,onFocus:r.default.func};var s=l;exports.default=s;
5
- },{}],"QfeP":[function(require,module,exports) {
6
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=r(require("pkg-up"));function r(e){return e&&e.__esModule?e:{default:e}}const t=require(e.default.sync({cwd:__dirname})).version;var u=()=>t;exports.default=u;
7
- },{}],"XvyO":[function(require,module,exports) {
8
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("bunyan")),r=i(require("fs")),t=i(require("os")),o=i(require("path")),n=i(require("@sentry/node"));function a(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(a=function(e){return e?t:r})(e)}function i(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=a(r);if(t&&t.has(e))return t.get(e);var o={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var u=n?Object.getOwnPropertyDescriptor(e,i):null;u&&(u.get||u.set)?Object.defineProperty(o,i,u):o[i]=e[i]}return o.default=e,t&&t.set(e,o),o}function u(e){return e&&e.__esModule?e:{default:e}}let c;try{const a="todesktop-cli";let i;const u=t.homedir();i="darwin"===process.platform?o.join(u,"Library","Logs",a):"win32"===process.platform?o.join(process.env.APPDATA||o.join(u,"AppData","Roaming"),a,"logs"):o.join(process.env.XDG_CONFIG_HOME||o.join(u,".config"),a,"logs"),r.mkdirSync(i,{recursive:!0}),c=e.default.createLogger({name:a,src:!0,streams:[{level:"debug",path:o.join(i,"main.log")}]})}catch(p){const e=()=>{};c={debug:e,error:e,fatal:e,info:e,trace:e,warn:e};try{n.captureException(p)}catch(f){}}var s=c;exports.default=s;
9
- },{}],"gwcX":[function(require,module,exports) {
10
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=o(require("dotenv")),t=n(require("path"));function r(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(r=function(e){return e?n:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=r(t);if(n&&n.has(e))return n.get(e);var o={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var f=u?Object.getOwnPropertyDescriptor(e,a):null;f&&(f.get||f.set)?Object.defineProperty(o,a,f):o[a]=e[a]}return o.default=e,n&&n.set(e,o),o}function o(e){return e&&e.__esModule?e:{default:e}}let u=!1;const a=()=>{u||(e.default.config({path:t.resolve(__dirname,"..","..",".env")}),u=!0)};var f=()=>(u||(e.default.config({path:t.resolve(__dirname,"..","..",".env")}),u=!0),process.env);exports.default=f;
11
- },{}],"gzUX":[function(require,module,exports) {
12
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.signInWithCustomToken=exports.onUserAuth=exports.default=exports.currentUser=void 0;var e=o(require("firebase/app"));require("firebase/firestore"),require("firebase/auth");var t=r(require("./getEnvironmentVariables"));function r(e){return e&&e.__esModule?e:{default:e}}function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}function o(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var s=a?Object.getOwnPropertyDescriptor(e,u):null;s&&(s.get||s.set)?Object.defineProperty(o,u,s):o[u]=e[u]}return o.default=e,r&&r.set(e,o),o}const a=(0,t.default)(),u=e.initializeApp({apiKey:a.TODESKTOP_CLI_FIREBASE_API_KEY,authDomain:a.TODESKTOP_CLI_FIREBASE_AUTH_DOMAIN,databaseURL:a.TODESKTOP_CLI_FIREBASE_DATABASE_URL,projectId:a.TODESKTOP_CLI_FIREBASE_PROJECT_ID,storageBucket:a.TODESKTOP_CLI_FIREBASE_STORAGE_BUCKET,messagingSenderId:a.TODESKTOP_CLI_FIREBASE_MESSAGING_SENDER_ID,appId:a.TODESKTOP_CLI_FIREBASE_ID}),s=()=>e.auth().currentUser;exports.currentUser=s;const i=async t=>e.auth().signInWithCustomToken(t);exports.signInWithCustomToken=i;const _=t=>e.auth().onAuthStateChanged(e=>{t(e||{})});exports.onUserAuth=_;var p=u.firestore();exports.default=p;
13
- },{"./getEnvironmentVariables":"gwcX"}],"ffKF":[function(require,module,exports) {
14
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.setConfig=exports.setAuthConfig=exports.jwtTokenConfigKey=exports.getConfig=exports.getAuthConfig=exports.emailConfigKey=exports.deleteAuthConfig=exports.accessTokenConfigKey=void 0;var e=i(require("fs")),t=r(require("del")),o=r(require("conf")),n=r(require("xdg-basedir"));function r(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,o=new WeakMap;return(s=function(e){return e?o:t})(e)}function i(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var o=s(t);if(o&&o.has(e))return o.get(e);var n={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var c=r?Object.getOwnPropertyDescriptor(e,i):null;c&&(c.get||c.set)?Object.defineProperty(n,i,c):n[i]=e[i]}return n.default=e,o&&o.set(e,n),n}const c=new o.default({configName:"todesktop-cli"}),f="accessToken";exports.accessTokenConfigKey="accessToken";const a="email";exports.emailConfigKey="email";const u="jwtToken";exports.jwtTokenConfigKey="jwtToken";const l=(e,t)=>c.set(e,t);exports.setConfig=l;const p=e=>c.get(e);exports.getConfig=p;const g=(e,t,o)=>{l("email",e),l("accessToken",t),l("jwtToken",o)};exports.setAuthConfig=g;const d=()=>{return{accessToken:p("accessToken"),jwtToken:p("jwtToken"),email:p("email")}};exports.getAuthConfig=d;const k=()=>{c.delete("email"),c.delete("accessToken"),c.delete("jwtToken")};exports.deleteAuthConfig=k;const x=`${n.default.config}/configstore/config.json.json`;if(e.existsSync(x))try{const{email:e,accessToken:o,jwtToken:n}=require(x);g(e,o,n),(0,t.default)(x,{force:!0})}catch(j){(0,t.default)(x,{force:!0})}
15
- },{}],"ALju":[function(require,module,exports) {
16
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.track=exports.identify=exports.flush=exports.ANALYTICS_EVENT=void 0;var e=u(require("os")),t=require("uuid"),r=u(require("analytics-node")),s=u(require("./getEnvironmentVariables")),o=require("./firestore"),i=require("./configStore"),n=u(require("./getCliVersion"));function u(e){return e&&e.__esModule?e:{default:e}}const a=(0,s.default)(),c=new r.default(a.SEGMENT_WRITE_KEY,{flushAt:1,flushInterval:1}),l={CLI_COMMAND:"CLI Command"};function d(){let t={client:"cli"};try{t.os={name:e.default.platform(),version:e.default.release()}}catch(r){}try{t.user={email:(0,i.getAuthConfig)().email}}catch(r){}try{t.app={cliVersion:(0,n.default)()}}catch(r){}try{t.runtime={name:"Node.js",version:process.version}}catch(r){}return t}exports.ANALYTICS_EVENT=l;const f=(0,t.v4)(),p=(e,t={},r=(()=>{}))=>{try{const i=(0,o.currentUser)();c.track({event:e,userId:i?i.uid:void 0,anonymousId:f,properties:{...t,...d()}},r)}catch(s){}};exports.track=p;const y=(e,t={},r=(()=>{}))=>{try{c.identify({userId:e,anonymousId:f,traits:t},r)}catch(s){}};exports.identify=y;const h=(e=(()=>{}))=>c.flush(e);exports.flush=h;
17
- },{"./getEnvironmentVariables":"gwcX","./firestore":"gzUX","./configStore":"ffKF","./getCliVersion":"QfeP"}],"QLfx":[function(require,module,exports) {
18
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),r=require("./analytics"),t=i(require("./firestore")),u=i(require("./logger"));function i(e){return e&&e.__esModule?e:{default:e}}var o=()=>{const{exit:i}=(0,e.useApp)();return e=>{let o;u.default.debug({error:e},"Exit called"),t.default.terminate().catch(e=>u.default.error(e)),Promise.race([new Promise(e=>(0,r.flush)(()=>e())),new Promise(e=>o=setTimeout(()=>e(),1e3))]).catch(()=>{}).finally(()=>{clearTimeout(o);try{i()}catch(r){u.default.error(r)}setTimeout(()=>process.exit(e?1:0),10)})}};exports.default=o;
19
- },{"./analytics":"ALju","./firestore":"gzUX","./logger":"XvyO"}],"f0Jz":[function(require,module,exports) {
20
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=i(require("prop-types")),r=a(require("react")),o=i(require("../utilities/getCliVersion")),l=i(require("../utilities/logger")),u=i(require("../utilities/useExit"));function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}function a(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var a=l?Object.getOwnPropertyDescriptor(e,u):null;a&&(a.get||a.set)?Object.defineProperty(o,u,a):o[u]=e[u]}return o.default=e,r&&r.set(e,o),o}function i(e){return e&&e.__esModule?e:{default:e}}const c=({commandUsed:t,error:n})=>{const a=(0,u.default)();return l.default.error({error:n}),(0,r.useEffect)(()=>{n&&setTimeout(()=>a(n),10)},[a,n]),r.default.createElement(r.Fragment,null,r.default.createElement(e.Text,{backgroundColor:"red",color:"white"}," ","ERROR"," "),r.default.createElement(e.Text,null,n.message||n.stack||n.toString()),r.default.createElement(e.Box,{flexDirection:"column",marginTop:1},t?r.default.createElement(e.Text,{dimColor:!0,color:"gray"},"Command: ",t):null,r.default.createElement(e.Text,{dimColor:!0,color:"gray"},"@todesktop/cli: ",(0,o.default)()),r.default.createElement(e.Text,{dimColor:!0,color:"gray"},"Node: ",process.version),r.default.createElement(e.Text,{dimColor:!0,color:"gray"},"cwd: ",process.cwd())))};c.propTypes={commandUsed:t.default.string,error:t.default.object.isRequired};var d=c;exports.default=d;
21
- },{"../utilities/getCliVersion":"QfeP","../utilities/logger":"XvyO","../utilities/useExit":"QLfx"}],"I8pf":[function(require,module,exports) {
22
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=u;var e=o(require("axios")),t=o(require("./getEnvironmentVariables")),r=o(require("./logger"));function o(e){return e&&e.__esModule?e:{default:e}}const{TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE:a}=(0,t.default)();async function u(t,o={},u={}){r.default.debug({functionName:t,body:o,config:u},"postToFirebaseFunction");try{const s=await e.default.post(`${a}${t}`,o,u);return r.default.debug({responseData:s.data},"postToFirebaseFunction: success"),s.data}catch(n){throw r.default.error({error:n},"postToFirebaseFunction: error"),n}}
23
- },{"./getEnvironmentVariables":"gwcX","./logger":"XvyO"}],"pd2Y":[function(require,module,exports) {
24
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=f(require("@babel/runtime/helpers/extends")),t=require("ink"),r=f(require("prop-types")),a=d(require("react")),l=require("react-final-form"),n=f(require("../components/TextInput")),u=f(require("./ErrorDisplay")),o=f(require("../utilities/postToFirebaseFunction")),i=require("../utilities/firestore"),c=require("../utilities/configStore");function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function d(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var a={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in e)if("default"!==n&&Object.prototype.hasOwnProperty.call(e,n)){var u=l?Object.getOwnPropertyDescriptor(e,n):null;u&&(u.get||u.set)?Object.defineProperty(a,n,u):a[n]=e[n]}return a.default=e,r&&r.set(e,a),a}function f(e){return e&&e.__esModule?e:{default:e}}const m=[{name:"email",label:"Your email",placeholder:"name@email.com",Input:n.default,validate:e=>{if(!e)return"Required"}},{name:"accessToken",label:"Your access token",placeholder:"********",Input:n.default,validate:e=>{if(!e)return"Required"},mask:"*"}],p=({setIsLoggedIn:r})=>{const[n,s]=(0,a.useState)(0),[d,f]=(0,a.useState)(null),[p,T]=(0,a.useState)(null),[E,x]=(0,a.useState)(!1),y=e=>{x(!1),T(e),s(0)};return d?a.default.createElement(u.default,{error:d}):a.default.createElement(a.Fragment,null,a.default.createElement(t.Text,null,"You are not currently logged in."),a.default.createElement(t.Text,null,"Log in below:"),a.default.createElement(t.Box,{marginBottom:1}),a.default.createElement(l.Form,{onSubmit:async({email:e,accessToken:t})=>{T(null),x(!0);try{const l=await(0,o.default)("loginWithAccessToken",{email:e,accessToken:t});l?(await(0,i.signInWithCustomToken)(l),(0,c.setAuthConfig)(e,t,l),r(!0)):y("Incorrrect credentials. Try again")}catch(a){500===a.code?f(a):y(`Login unsuccessful: ${a.message}`)}}},({handleSubmit:r,validating:u,form:o})=>a.default.createElement(t.Box,{flexDirection:"column"},m.map(({name:o,label:i,placeholder:c,validate:d,Input:f,mask:p},T)=>a.default.createElement(l.Field,{name:o,key:o,validate:d},({input:l,meta:d})=>a.default.createElement(t.Box,{flexDirection:"column"},n>=T?a.default.createElement(t.Box,null,a.default.createElement(t.Text,{bold:n===T},i,": "),n===T?a.default.createElement(f,(0,e.default)({},l,{mask:p,placeholder:c,onSubmit:()=>{d.valid&&!u?(s(e=>e+1),n===m.length-1&&r()):l.onBlur()}})):l.value&&a.default.createElement(t.Text,null,"accessToken"===o?l.value.replace(/./gi,"*"):l.value)||c&&a.default.createElement(t.Text,{color:"gray"},c),d.invalid&&d.touched&&a.default.createElement(t.Box,{marginLeft:2,marginRight:1},a.default.createElement(t.Text,{color:"red"},"✖")),d.error&&d.touched&&a.default.createElement(g,{errorMessage:d.error})):null))))),E&&a.default.createElement(t.Box,{marginTop:1},a.default.createElement(t.Text,null,"Logging in...")),p&&a.default.createElement(g,{errorMessage:p,marginTop:!0}))},g=({errorMessage:e,marginTop:r})=>a.default.createElement(t.Box,{marginTop:r?1:0},a.default.createElement(t.Text,{color:"red"},e));g.propTypes={errorMessage:r.default.string.isRequired,marginTop:r.default.bool},p.propTypes={setIsLoggedIn:r.default.func.isRequired};var T=p;exports.default=T;
25
- },{"../components/TextInput":"iiO0","./ErrorDisplay":"f0Jz","../utilities/postToFirebaseFunction":"I8pf","../utilities/firestore":"gzUX","../utilities/configStore":"ffKF"}],"nLy3":[function(require,module,exports) {
26
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=d(require("react")),r=c(require("prop-types")),n=c(require("is-ci")),i=c(require("./Login")),o=require("../utilities/firestore"),a=require("../utilities/configStore"),u=c(require("../utilities/postToFirebaseFunction")),s=c(require("../utilities/getEnvironmentVariables")),l=c(require("./ErrorDisplay"));function c(e){return e&&e.__esModule?e:{default:e}}function f(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(f=function(e){return e?r:t})(e)}function d(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=f(t);if(r&&r.has(e))return r.get(e);var n={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var a=i?Object.getOwnPropertyDescriptor(e,o):null;a&&(a.get||a.set)?Object.defineProperty(n,o,a):n[o]=e[o]}return n.default=e,r&&r.set(e,n),n}const p=({children:r,isInteractive:c=!0})=>{const[f,d]=(0,t.useState)(!1),[p,T]=(0,t.useState)(!1),[g,y]=(0,t.useState)(null),{isRawModeSupported:v}=(0,e.useStdin)(),O=(e,t={})=>{y({...t,message:e})};return(0,t.useEffect)(()=>{!async function(){const{accessToken:e,email:t,jwtToken:r}=(0,a.getAuthConfig)();let i=null;const{TODESKTOP_ACCESS_TOKEN:l,TODESKTOP_EMAIL:c}=(0,s.default)();try{if(l&&c){const e=await(0,u.default)("loginWithAccessToken",{email:c,accessToken:l});e&&(i=await(0,o.signInWithCustomToken)(e)).user&&d(!0)}else v&&!n.default||O("ToDesktop environment variables not found. When automating builds with your CI provider, you need to specify environment variables for TODESKTOP_EMAIL and TODESKTOP_ACCESS_TOKEN.")}catch(f){O("Log in with environment variables failed.",f)}try{!i&&r&&(i=await(0,o.signInWithCustomToken)(r)).user&&d(!0)}catch(f){}try{if(!i&&e&&t){const r=await(0,u.default)("loginWithAccessToken",{email:t,accessToken:e});r&&(i=await(0,o.signInWithCustomToken)(r),(0,a.setAuthConfig)(t,e,r),i.user&&d(!0))}}catch(f){}T(!0)}()},[]),g&&c?t.default.createElement(l.default,{error:g}):p?!f&&c?t.default.createElement(i.default,{setIsLoggedIn:d}):t.default.createElement(t.Fragment,null,r):t.default.createElement(e.Text,null,"...")};p.propTypes={children:r.default.object,isInteractive:r.default.bool};var T=p;exports.default=T;
27
- },{"./Login":"pd2Y","../utilities/firestore":"gzUX","../utilities/configStore":"ffKF","../utilities/postToFirebaseFunction":"I8pf","../utilities/getEnvironmentVariables":"gwcX","./ErrorDisplay":"f0Jz"}],"XM8F":[function(require,module,exports) {
28
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("react")),t=o(require("@sentry/node")),r=u(require("prop-types"));function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}function o(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=u?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(o,a,s):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}function u(e){return e&&e.__esModule?e:{default:e}}class a extends e.default.Component{constructor(e){super(e),this.state={eventId:null,error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){t.withScope(n=>{n.setExtras(r);const o=t.captureException(e);this.setState({eventId:o})})}render(){if(this.state.error)throw this.state.error;return this.props.children}}a.propTypes={children:r.default.object};var s=a;exports.default=s;
29
- },{}],"OMIR":[function(require,module,exports) {
30
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("@babel/runtime/helpers/extends")),t=require("ink"),r=u(require("prop-types")),l=u(require("react"));function u(e){return e&&e.__esModule?e:{default:e}}const i=({isSelected:r,...u})=>l.default.createElement(t.Box,(0,e.default)({marginRight:1},u),l.default.createElement(t.Text,null,r?"win32"===process.platform?">":"❯":" "));i.propTypes={isSelected:r.default.bool.isRequired};var s=i;exports.default=s;
31
- },{}],"oPeF":[function(require,module,exports) {
32
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("@babel/runtime/helpers/extends")),r=require("ink"),t=u(require("prop-types")),l=u(require("react"));function u(e){return e&&e.__esModule?e:{default:e}}const d=({isSelected:t,label:u,...d})=>l.default.createElement(r.Text,(0,e.default)({bold:t,color:t?void 0:"gray"},d),u);d.propTypes={isSelected:t.default.bool.isRequired,label:t.default.string.isRequired};var i=d;exports.default=i;
33
- },{}],"xeB6":[function(require,module,exports) {
34
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=n(require("./firestore")),t=r(require("./logger"));function r(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function n(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var i=a?Object.getOwnPropertyDescriptor(e,o):null;i&&(i.get||i.set)?Object.defineProperty(n,o,i):n[o]=e[o]}return n.default=e,r&&r.set(e,n),n}var a=async({appId:r,buildId:u})=>{t.default.debug({appId:r,buildId:u},"getBuildById");const n=await e.default.doc(`users/${(0,e.currentUser)().uid}/applications/${r}/builds/${u}`).get();return n.exists?n.data():null};exports.default=a;
35
- },{"./firestore":"gzUX","./logger":"XvyO"}],"koRC":[function(require,module,exports) {
36
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("firebase/app"));require("firebase/functions");var t=r(require("./getEnvironmentVariables"));function r(e){return e&&e.__esModule?e:{default:e}}function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}function u(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var u={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var f=o?Object.getOwnPropertyDescriptor(e,a):null;f&&(f.get||f.set)?Object.defineProperty(u,a,f):u[a]=e[a]}return u.default=e,r&&r.set(e,u),u}"development"===(0,t.default)().TODESKTOP_CLI_ENV&&e.functions().useFunctionsEmulator("http://localhost:5000");var o=t=>e.functions().httpsCallable(t);exports.default=o;
37
- },{"./getEnvironmentVariables":"gwcX"}],"EqTV":[function(require,module,exports) {
38
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=o(require("./firestore")),t=r(require("./logger"));function r(e){return e&&e.__esModule?e:{default:e}}function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}function o(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var a=u?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(o,i,a):o[i]=e[i]}return o.default=e,r&&r.set(e,o),o}var u=async({appId:r})=>{t.default.debug({appId:r},"getLatestBuildId");const n=e.default.doc(`users/${(0,e.currentUser)().uid}/applications/${r}`);if(!(await n.get()).exists)throw new Error(`Application with ID of ${r} doesn't exist.`);const o=await n.collection("builds").orderBy("createdAt","desc").limit(1).get();return o.empty?null:o.docs[0].id};exports.default=u;
39
- },{"./firestore":"gzUX","./logger":"XvyO"}],"GCJw":[function(require,module,exports) {
40
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=e=>require(e);exports.default=e;
41
- },{}],"waRp":[function(require,module,exports) {
42
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=n(require("path"));function t(e){if("function"!=typeof WeakMap)return null;var n=new WeakMap,o=new WeakMap;return(t=function(e){return e?o:n})(e)}function n(e,n){if(!n&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var o=t(n);if(o&&o.has(e))return o.get(e);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var c=i?Object.getOwnPropertyDescriptor(e,a):null;c&&(c.get||c.set)?Object.defineProperty(r,a,c):r[a]=e[a]}return r.default=e,o&&o.set(e,r),r}var o=({config:t,projectRoot:n})=>{const o=t.appPath?e.isAbsolute(t.appPath)?t.appPath:e.join(n,t.appPath):n,r=(e,t)=>e?t(e):void 0,i=t=>e.isAbsolute(t)?t:e.join(n,t),a={...t,appPath:o,icon:i(t.icon)};return t.extraContentFiles&&(a.extraContentFiles=r(t.extraContentFiles,e=>e.map(e=>({...e,from:i(e.from)})))),t.extraResources&&(a.extraResources=r(t.extraResources,e=>e.map(e=>({...e,from:i(e.from)})))),t.linux&&(a.linux={...t.linux},t.linux.icon&&(a.linux.icon=i(t.linux.icon))),t.mac&&(a.mac={...t.mac},t.mac.entitlements&&(a.mac.entitlements=i(t.mac.entitlements)),t.mac.icon&&(a.mac.icon=i(t.mac.icon))),t.dmg&&t.dmg.background&&(a.dmg.background=i(t.dmg.background)),t.windows&&(a.windows={...t.windows},t.windows.icon&&(a.windows.icon=i(t.windows.icon))),a};exports.default=o;
43
- },{}],"zW94":[function(require,module,exports) {
44
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=e=>({type:"object",required:["author","dependencies","devDependencies","homepage","name","version"],properties:{author:{npmAuthor:{}},dependencies:{type:"object",required:["@todesktop/runtime"],excludedDependencies:{dependencyKey:"dependencies",blacklist:["@todesktop/cli"]},properties:{"@todesktop/runtime":{type:"string"}}},devDependencies:{type:"object",required:["electron"],properties:{electron:{type:"string",semanticVersion:{packageName:"electron",mustBeExact:!0}}}},name:{type:"string",minLength:1},scripts:{type:"object",properties:{"todesktop:beforeInstall":{type:"string",file:{from:e.projectRoot,mustBeFile:!0}},"todesktop:afterPack":{type:"string",file:{from:e.projectRoot,mustBeFile:!0}}}},version:{type:"string",semanticVersion:{}}}});exports.default=e;
45
- },{}],"fl4s":[function(require,module,exports) {
46
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=a(require("ajv")),r=a(require("better-ajv-errors")),t=a(require("./addCustomKeywords")),o=a(require("./schema/packageJSON"));function a(e){return e&&e.__esModule?e:{default:e}}var s=(a,s,u)=>{const d=new e.default({allErrors:!0,jsonPointers:!0});(0,t.default)(d,u);const i=(0,o.default)(u),n=d.compile(i);if(!n(a)){const e=(0,r.default)(i,a,n.errors,{indent:2}),t=new Error(`package.json invalid (${s}); \n${e}`);throw t.isValidationError=!0,t}};exports.default=s;
47
- },{"./addCustomKeywords":"g5Ig","./schema/packageJSON":"zW94"}],"g5Ig":[function(require,module,exports) {
48
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("email-regex")),r=a(require("fs")),t=a(require("path")),i=u(require("parse-author")),s=a(require("semver")),o=u(require("./validatePackageJSON"));function n(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(n=function(e){return e?t:r})(e)}function a(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=n(r);if(t&&t.has(e))return t.get(e);var i={},s=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var a=s?Object.getOwnPropertyDescriptor(e,o):null;a&&(a.get||a.set)?Object.defineProperty(i,o,a):i[o]=e[o]}return i.default=e,t&&t.set(e,i),i}function u(e){return e&&e.__esModule?e:{default:e}}var d=(n,a)=>{n.addKeyword("excludedDependencies",{validate:function e(r,t){let i=r.blacklist.filter(e=>t[e]);return!i.length||(e.errors=[{keyword:"Dependency",message:`${i.join(", ")} should not be in ${r.dependencyKey}`,dataPath:`/${r.dependencyKey}`}],!1)}}),n.addKeyword("email",{type:"string",minLength:5,validate:function r(t,i){return!!(0,e.default)({exact:!0}).test(i)||(r.errors=[{keyword:"email",message:"invalid"}],!1)}}),n.addKeyword("file",{type:"string",validate:function e(i,s){const n=i.mustBeDirectory||i.mustBeElectronApp;if(!s.trim().length)return!!i.isOptional||(e.errors=[{keyword:i.mustBeDirectory?"Directory":"File",message:"is empty"}],!1);const u=t.isAbsolute(s)?s:t.join(i.from,s);if(t.relative(i.from,u).startsWith(".."))return e.errors=[{keyword:n?"Directory":"File",message:`is not in project (${u})`}],!1;if(i.extensions&&!i.extensions.includes(t.extname(u).substr(1)))return e.errors=[{keyword:"File extension",message:`invalid. ${t.extname(s)} Must be${i.extensions>1?"one of the following:":""} "${i.extensions.join('", "')}"`}],!1;if(!r.existsSync(u))return e.errors=[{keyword:n?"Directory":"File",message:`does not exist (${u})`}],!1;const d=r.statSync(u);if(n&&d.isFile())return e.errors=[{keyword:"Directory",message:`must be a directory, not a file (${u})`}],!1;if(i.mustBeFile&&d.isDirectory())return e.errors=[{keyword:"File",message:`must be a file, not a directory (${u})`}],!1;if(i.mustBeElectronApp){const i=t.resolve(u),s=t.join(i,"package.json");if(!r.existsSync(s))return e.errors=[{keyword:"App",message:`invalid. There is no package.json at ${s}`}],!1;let n;try{n=require(s)}catch(l){return e.errors=[{keyword:"App",message:`invalid. Invalid JSON in package.json (${s})`}],!1}a.projectRoot=i,(0,o.default)(n,s,a);const d=n.main;if(d){const s=t.join(i,d);if(!r.existsSync(s))return e.errors=[{keyword:"App",message:`invalid. The "main" file specified in your package.json (${d}) does not exist (${s})`}],!1}else if(!r.existsSync(t.join(i,"index.js")))return e.errors=[{keyword:"App",message:'invalid. There is neither a "main" property in your package.json nor an index.js at the root of your app'}],!1}return!0},errors:!0}),n.addKeyword("npmAuthor",{validate:function r(t,s){const o=typeof s;if("undefined"===o)return!0;if("string"===o){const e=(0,i.default)(s);if(!e||!e.email)return r.errors=[{keyword:"author",message:'invalid. If you\'re using a string, it must look something like "Barney Rubble <b@rubble.com>", see https://docs.npmjs.com/files/package.json#people-fields-author-contributors'}],!1}else{if("object"!==o)return r.errors=[{keyword:"author",message:"invalid. It must either be an object or string. See https://docs.npmjs.com/files/package.json#people-fields-author-contributors"}],!1;if(void 0===s.name)return r.errors=[{keyword:"author",message:'invalid. "name" property is missing.'}],!1;if("string"!=typeof s.name)return r.errors=[{keyword:"author",message:".name invalid. It must be a string"}],!1;if(void 0===s.email)return r.errors=[{keyword:"author",message:'invalid. "email" property is missing.'}],!1;if("string"!=typeof s.email)return r.errors=[{keyword:"author",message:".email invalid. It must be a string."}],!1;if(!(0,e.default)({exact:!0}).test(s.email))return r.errors=[{keyword:"author",message:".email invalid. It does not look like an email."}],!1}return!0},errors:!0}),n.addKeyword("semanticVersion",{type:"string",minLength:5,validate:function e(r,t){const i=(r.packageName?`${r.packageName} `:"")+"version";return s.valid(t)||s.validRange(t)?!r.mustBeExact||!t.startsWith("~")&&!t.startsWith("^")||(e.errors=[{keyword:i,message:"invalid. It must be an exact version. Good: 9.0.0. Bad: ^9.0.0"}],!1):(e.errors=[{keyword:i,message:"invalid. It must be a semantic version (see https://semver.org/)"}],!1)}})};exports.default=d;
49
- },{"./validatePackageJSON":"fl4s"}],"CN2N":[function(require,module,exports) {
50
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const e=e=>({oneOf:[e,{type:"array",items:e}]});var t=t=>{const i=(e=[])=>({type:"string",file:{from:t.projectRoot,extensions:["icns","png",...e],mustBeFile:!0},minLength:3});return{type:"object",required:["id","icon","schemaVersion"],properties:{appId:{type:"string",minLength:1},appFiles:{type:"array",items:{type:"string",minLength:1},minItems:1},appProtocolScheme:{type:"string",minLength:1},appPath:{type:"string",file:{from:t.projectRoot,isOptional:!0,mustBeElectronApp:!0}},copyright:{type:"string",minLength:1},electronMirror:{type:"string",format:"uri"},electronVersion:{type:"string",minLength:1},extraContentFiles:{type:"array",items:{type:"object",required:["from"],properties:{from:{type:"string",file:{from:t.projectRoot}},to:{type:"string"}}}},extraResources:{type:"array",items:{type:"object",required:["from"],properties:{from:{type:"string",file:{from:t.projectRoot}},to:{type:"string"}}}},fileAssociations:{type:"array",items:{type:"object",required:["ext"],properties:{ext:e({type:"string",minLength:1}),description:{type:"string",minLength:1},name:{type:"string",minLength:1},mimeType:{type:"string",minLength:1},icon:{type:"string",minLength:1},role:{type:"string",minLength:1},isPackage:{type:"boolean"},rank:{type:"string",minLength:1}}},minItems:1},filesForDistribution:{type:"array",items:{type:"string",minLength:1},minItems:1},icon:i(),linux:{properties:{category:{type:"string",minLength:1},icon:i()}},id:{type:"string",minLength:1},mac:{properties:{category:{type:"string",minLength:1},additionalBinariesToSign:{type:"array",items:{type:"string",minLength:1}},entitlements:{type:"string",file:{from:t.projectRoot,extensions:["plist"],mustBeFile:!0},minLength:1},extendInfo:{type:"object"},icon:i()}},dmg:{properties:{background:{type:"string",file:{from:t.projectRoot,extensions:["tiff"],mustBeFile:!0},minLength:1},artifactName:{type:"string",minLength:1},backgroundColor:{type:"string",minLength:1},iconSize:{type:"number"},iconTextSize:{type:"number"},title:{type:"string",minLength:1},contents:{type:"array",items:{type:"object",properties:{x:{type:"number"},y:{type:"number"}}}},window:{type:"object",properties:{x:{type:"number"},y:{type:"number"},width:{type:"number"},height:{type:"number"}}}}},schemaVersion:{type:"number",minimum:1,maximum:1},snap:{properties:{after:{type:"array",items:{type:"string",minLength:1}},appPartStage:{type:"array",items:{type:"string",minLength:1}},assumes:e({type:"string",minLength:1}),autoStart:{type:"boolean"},buildPackages:{type:"array",items:{type:"string",minLength:1}},confinement:{type:"string",enum:["classic","devmode","strict"]},environment:{type:"object"},grade:{type:"string",enum:["devel","stable"]},layout:{type:"object"},plugs:{type:"array",items:{anyOf:[{type:"string",minLength:1},{type:"object"}]}},stagePackages:{type:"array",items:{type:"string",minLength:1}},summary:{type:"string",maxLength:78},useTemplateApp:{type:"boolean"}}},uploadSizeLimit:{type:"number"},windows:{properties:{icon:i(["ico"])}}}}};exports.default=t;
51
- },{}],"aYcI":[function(require,module,exports) {
52
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=a(require("ajv")),o=a(require("better-ajv-errors")),t=a(require("./addCustomKeywords")),r=a(require("./schema/full"));function a(e){return e&&e.__esModule?e:{default:e}}var n=({config:a,projectRoot:n})=>{const s={projectRoot:n},d=(0,r.default)(s),p=new e.default({allErrors:!0,jsonPointers:!0});(0,t.default)(p,s);const i=p.compile(d);if(!i(a)){const e=(0,o.default)(d,a,i.errors,{indent:2});throw new Error(`todesktop.json invalid. \nLearn more here: https://www.npmjs.com/package/@todesktop/cli#project-configuration-todesktopjson \n\n${e}`)}if(a.productName)throw new Error('todesktop.json invalid.\n\nThe "productName" property is no longer supported in todesktop.json. Please remove it and add it to your app\'s package.json instead.\n\nWe made this change because Electron also uses the "productName" if it exists in your app\'s package.json. If you do not add it to your package.json, your app name will default to the value of the "name" property in your package.json.')};exports.default=n;
53
- },{"./addCustomKeywords":"g5Ig","./schema/full":"CN2N"}],"Sx1d":[function(require,module,exports) {
54
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("path"),o=a(require("find-up")),t=a(require("./loadConfig")),r=a(require("./resolveConfigPaths")),n=a(require("./validateConfig"));function a(e){return e&&e.__esModule?e:{default:e}}var i=()=>{const a=o.default.sync("todesktop.json");if(!a)throw new Error("Can not find todesktop.json in this folder or any parent folders");const i=(0,e.dirname)(a),d=(0,t.default)(a);return d.appPath=d.appPath||".",(0,n.default)({config:d,projectRoot:i}),{config:(0,r.default)({config:d,projectRoot:i}),unprocessedConfig:d,projectRoot:i}};exports.default=i;
55
- },{"./loadConfig":"GCJw","./resolveConfigPaths":"waRp","./validateConfig":"aYcI"}],"Sre8":[function(require,module,exports) {
56
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=o(require("is-ci")),r=o(require("./logger"));function o(e){return e&&e.__esModule?e:{default:e}}var t=(...o)=>{r.default.info({args:o},"logForCI"),e.default&&console.log(...o)};exports.default=t;
57
- },{"./logger":"XvyO"}],"u18N":[function(require,module,exports) {
58
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=h(require("ink-link")),r=h(require("ink-select-input")),l=h(require("prop-types")),a=b(require("react")),n=h(require("./CustomSelectInputIndicator")),i=h(require("./CustomSelectInputItem")),u=h(require("./ErrorDisplay")),o=h(require("../utilities/getBuildById")),s=h(require("../utilities/getCallableFirebaseFunction")),d=h(require("../utilities/getLatestBuildId")),f=h(require("../utilities/projectConfig/getProjectConfig")),c=h(require("../utilities/logForCI")),p=h(require("../utilities/useExit"));function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(m=function(e){return e?r:t})(e)}function b(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=m(t);if(r&&r.has(e))return r.get(e);var l={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in e)if("default"!==n&&Object.prototype.hasOwnProperty.call(e,n)){var i=a?Object.getOwnPropertyDescriptor(e,n):null;i&&(i.get||i.set)?Object.defineProperty(l,n,i):l[n]=e[n]}return l.default=e,r&&r.set(e,l),l}function h(e){return e&&e.__esModule?e:{default:e}}const g=(r,l)=>a.default.createElement(e.Box,{flexDirection:"column"},a.default.createElement(e.Text,{bold:!0,color:"red"},"Can't release ",r.appName," v",r.appVersion),a.default.createElement(e.Box,{marginBottom:1,marginTop:1},a.default.createElement(e.Text,null,l)),a.default.createElement(e.Text,{bold:!0},"See web UI for more information: "),a.default.createElement(e.Text,null,a.default.createElement(t.default,{fallback:!1,url:r.url},r.url))),E=({commandUsed:t,id:l,shouldConfirm:m})=>{const b=(0,p.default)(),[{appId:h,arbitraryMessageComponent:E,build:y,error:x,hasConfirmed:C,hasBeenValidatedSuccesfully:T,isComplete:v,isReleasing:B},I]=(0,a.useState)({appId:null,build:null,error:null,hasConfirmed:!1,hasBeenValidatedSuccesfully:!1,isComplete:!1,isReleasing:!1,arbitraryMessageComponent:null}),w=e=>{const t=e.response?e.response.data:e;(0,c.default)(t),I(e=>({...e,error:t}))};if((0,a.useEffect)(()=>{if(y)return;const t=(0,f.default)().config.id,r=e=>{(0,o.default)({appId:t,buildId:e}).then(r=>{if(!r)throw new Error(`No such build ${e} for application ${t}`);I(e=>({...e,appId:t,build:r}))}).catch(w)};l?r(l):(0,d.default)({appId:t}).catch(w).then(t=>{if(t)return r(t);I(t=>({...t,arbitraryMessageComponent:a.default.createElement(e.Text,null,"There are no builds yet")}))})},[y,l]),(0,a.useEffect)(()=>{if(!y||T||E)return;let e;y.releasedAt?e="It has already been released.":"succeeded"!==y.status&&(e=`The build must have completed successfully. Actual build status: ${y.status}`),I(e?t=>({...t,arbitraryMessageComponent:g(y,e),hasBeenValidatedSuccesfully:!1}):e=>({...e,hasBeenValidatedSuccesfully:!0}))},[E,y,T]),(0,a.useEffect)(()=>{!T||m&&!C||B||v||(I(e=>({...e,isReleasing:!0})),(0,s.default)("releaseBuild")({appId:h,buildId:y.id}).then(()=>{(0,c.default)("Released!"),I(e=>({...e,isReleasing:!1,isComplete:!0}))}).catch(e=>{["failed-precondition","not-found"].includes(e.code)?I(t=>({...t,arbitraryMessageComponent:g(y,e.message),isReleasing:!1})):w(new Error("Unexpected internal error while releasing build"))}))},[h,y,C,T,l,v,B,m]),(0,a.useEffect)(()=>{v?setTimeout(b,10):E&&setTimeout(()=>b(new Error("Validation failed")),10)},[E,b,v]),x)return a.default.createElement(u.default,{commandUsed:t,error:x});if(E)return E;if(T&&m&&!C){const t=[{label:"Yes",value:"yes"},{label:"No",value:"no"}],l=e=>{"no"!==e.value?I(e=>({...e,hasConfirmed:!0})):setTimeout(b,10)};return a.default.createElement(e.Box,{flexDirection:"column"},a.default.createElement(e.Box,null,a.default.createElement(e.Text,null,"This will release build ",y.id," as "),a.default.createElement(e.Text,{bold:!0},y.appName," v",y.appVersion),a.default.createElement(e.Text,null,", are you sure?")),a.default.createElement(e.Box,{marginBottom:1,marginTop:1},a.default.createElement(r.default,{indicatorComponent:n.default,initialIndex:1,itemComponent:i.default,items:t,onSelect:l})),a.default.createElement(e.Text,{dimColor:!0},"Your users will be auto-updated to this version. You can use --force to bypass this confirmation in future"))}return B?a.default.createElement(e.Text,null,"Releasing..."):v?a.default.createElement(e.Text,{bold:!0,color:"greenBright"},"Released!"):a.default.createElement(e.Text,null,"...")};E.propTypes={id:(e,t,r)=>{if(1!==[e.id,e.shouldReleaseLatest].filter(Boolean).length)return new Error(`Exactly one of 'id' and 'shouldReleaseLatest' must be specified in '${r}'`);const l=typeof e.id;return["string","undefined"].includes(l)?void 0:new Error(`'id' is a '${l}', not a string, in '${r}'.`)},commandUsed:l.default.string.isRequired,shouldReleaseLatest:(e,t,r)=>{if(1!==[e.id,e.shouldReleaseLatest].filter(Boolean).length)return new Error(`Exactly one of 'id' and 'shouldReleaseLatest' must be specified in '${r}'`);const l=typeof e.shouldReleaseLatest;return["boolean","undefined"].includes(l)?void 0:new Error(`'shouldReleaseLatest' is a '${l}', not a boolean, in '${r}'.`)},shouldConfirm:l.default.bool.isRequired};var y=E;exports.default=y;
59
- },{"./CustomSelectInputIndicator":"OMIR","./CustomSelectInputItem":"oPeF","./ErrorDisplay":"f0Jz","../utilities/getBuildById":"xeB6","../utilities/getCallableFirebaseFunction":"koRC","../utilities/getLatestBuildId":"EqTV","../utilities/projectConfig/getProjectConfig":"Sx1d","../utilities/logForCI":"Sre8","../utilities/useExit":"QLfx"}],"krS3":[function(require,module,exports) {
60
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=u(require("prop-types")),r=u(require("react"));function u(e){return e&&e.__esModule?e:{default:e}}const a=({keyDetails:t,...u})=>{let a="└";return a+=Object.values(t).map(({width:e})=>"─".repeat(e+2)).join("┴"),a+="┘",r.default.createElement(e.Box,u,r.default.createElement(e.Text,null,a))};a.propTypes={keyDetails:t.default.object.isRequired};var l=a;exports.default=l;
61
- },{}],"hUnH":[function(require,module,exports) {
62
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=a(require("@babel/runtime/helpers/extends")),t=require("ink"),r=a(require("prop-types")),l=u(require("react"));function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}function u(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var l={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var o=u?Object.getOwnPropertyDescriptor(e,a):null;o&&(o.get||o.set)?Object.defineProperty(l,a,o):l[a]=e[a]}return l.default=e,r&&r.set(e,l),l}function a(e){return e&&e.__esModule?e:{default:e}}const o=({keyDetails:r,...n})=>{let u="┌";u+=Object.values(r).map(({width:e})=>"─".repeat(e+2)).join("┬"),u+="┐";const a=Object.values(r).map(({key:e,width:r},n)=>l.default.createElement(l.Fragment,{key:e},n>0?l.default.createElement(t.Text,null," │ "):null,l.default.createElement(t.Box,{width:r},l.default.createElement(t.Text,{bold:!0},e))));return l.default.createElement(t.Box,(0,e.default)({flexDirection:"column"},n),l.default.createElement(t.Box,null,l.default.createElement(t.Text,null,u)),l.default.createElement(t.Box,null,l.default.createElement(t.Box,null,l.default.createElement(t.Text,null,"│ "),a,l.default.createElement(t.Text,null," │"))))};o.propTypes={bottomLinePrefix:r.default.string,keyDetails:r.default.object.isRequired};var f=o;exports.default=f;
63
- },{}],"vuw3":[function(require,module,exports) {
64
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=n(require("prop-types")),r=a(require("react"));function l(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(l=function(e){return e?r:t})(e)}function a(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=l(t);if(r&&r.has(e))return r.get(e);var a={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var o=n?Object.getOwnPropertyDescriptor(e,u):null;o&&(o.get||o.set)?Object.defineProperty(a,u,o):a[u]=e[u]}return a.default=e,r&&r.set(e,a),a}function n(e){return e&&e.__esModule?e:{default:e}}const u=({data:t,getCellTextProps:l=(({props:e})=>e),keyDetails:a,textProps:n={}})=>{let u="├";u+=Object.values(a).map(({width:e})=>"─".repeat(e+2)).join("┼"),u+="┤";const o=r.default.createElement(r.Fragment,null,r.default.createElement(e.Text,null,"│ "),Object.entries(t).map(([u,o],f)=>r.default.createElement(e.Box,{key:u},f>0?r.default.createElement(e.Text,null," │ "):null,r.default.createElement(e.Box,{width:a[u].width},r.default.createElement(e.Text,l({key:u,props:n,rowData:t,value:o}),o)))),r.default.createElement(e.Text,null," │"));return r.default.createElement(r.Fragment,null,r.default.createElement(e.Box,{flexDirection:"column"},r.default.createElement(e.Text,null,u),r.default.createElement(e.Box,null,o)))};u.propTypes={data:t.default.object.isRequired,getCellTextProps:t.default.func,keyDetails:t.default.object.isRequired,textProps:t.default.object};var o=u;exports.default=o;
65
- },{}],"bdRS":[function(require,module,exports) {
66
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=e=>{const t={};return Object.keys(e[0]).forEach(r=>{t[r]={key:r,width:Math.max(r.length,e.map(e=>e[r].toString().length).sort((e,t)=>t-e)[0])}}),t};exports.default=e;
67
- },{}],"TG4W":[function(require,module,exports) {
68
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=p(require("@babel/runtime/helpers/extends")),t=require("ink"),r=p(require("ink-select-input")),a=p(require("prop-types")),n=p(require("react")),l=p(require("./CustomSelectInputIndicator")),u=p(require("./TableEnd")),o=p(require("./TableHead")),i=p(require("./TableRow")),d=p(require("../utilities/getKeyDetails"));function p(e){return e&&e.__esModule?e:{default:e}}const s=t=>n.default.createElement(l.default,(0,e.default)({marginTop:1},t)),c=({data:e,onSelect:l})=>{const p=(0,d.default)(e),c=({index:t,isSelected:r})=>n.default.createElement(i.default,{data:e[t],key:t,keyDetails:p,textProps:{bold:r,color:r?void 0:"gray"}});return c.propTypes={index:a.default.number,isSelected:a.default.bool},n.default.createElement(t.Box,{flexDirection:"column"},n.default.createElement(o.default,{keyDetails:p,marginLeft:2}),n.default.createElement(r.default,{indicatorComponent:s,itemComponent:c,items:(()=>e.map((e,t)=>({index:t,key:t,value:e})))(),onSelect:l}),n.default.createElement(u.default,{keyDetails:p,marginLeft:2}))};c.propTypes={data:(e,t,r)=>{const a=typeof e.data;return Array.isArray("array")?new Error(`'data' prop must be an array ('${a}' given) in ${r} component`):0===e.data.length?new Error(`'data' prop must not be empty, in ${r} component`):void 0},onSelect:a.default.func};var f=c;exports.default=f;
69
- },{"./CustomSelectInputIndicator":"OMIR","./TableEnd":"krS3","./TableHead":"hUnH","./TableRow":"vuw3","../utilities/getKeyDetails":"bdRS"}],"H47U":[function(require,module,exports) {
70
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=o(require("./firestore")),t=r(require("./logger"));function r(e){return e&&e.__esModule?e:{default:e}}function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(a=function(e){return e?r:t})(e)}function o(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=a(t);if(r&&r.has(e))return r.get(e);var o={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in e)if("default"!==n&&Object.prototype.hasOwnProperty.call(e,n)){var u=i?Object.getOwnPropertyDescriptor(e,n):null;u&&(u.get||u.set)?Object.defineProperty(o,n,u):o[n]=e[n]}return o.default=e,r&&r.set(e,o),o}var i=async({addWhereClauses:r=(e=>e),appId:a,limit:o=5,startAfter:i})=>{t.default.debug({appId:a,limit:o,startAfter:i},"getBuilds");const n=e.default.doc(`users/${(0,e.currentUser)().uid}/applications/${a}`);if(!(await n.get()).exists)throw new Error(`Application with ID of ${a} doesn't exist.`);let u=r(n.collection("builds")).orderBy("createdAt","desc");i&&(u=u.startAfter(i));const s=await u.limit(o).get();return s.empty?[]:s.docs.map(e=>e.data())};exports.default=i;
71
- },{"./firestore":"gzUX","./logger":"XvyO"}],"oShw":[function(require,module,exports) {
72
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=r(require("date-fns"));function t(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,n=new WeakMap;return(t=function(e){return e?n:r})(e)}function r(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=t(r);if(n&&n.has(e))return n.get(e);var a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var f=o?Object.getOwnPropertyDescriptor(e,u):null;f&&(f.get||f.set)?Object.defineProperty(a,u,f):a[u]=e[u]}return a.default=e,n&&n.set(e,a),a}var n=t=>e.formatDistance(new Date(t),new Date)+" ago";exports.default=n;
73
- },{}],"CLRu":[function(require,module,exports) {
74
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=u(require("is-ci")),t=require("ink"),r=u(require("./useExit"));function u(e){return e&&e.__esModule?e:{default:e}}let o=!1,s=[];const n=(e,t)=>{let r=String(e),u=!1;r<=""&&"\r"!==r&&(r=String.fromCharCode(r.charCodeAt(0)+"a".charCodeAt(0)-1),u=!0),u&&"c"===r&&(s.forEach(e=>e()),setTimeout(t,10))};var d=()=>{if(e.default)return()=>()=>{};const u=(0,r.default)(),{stdin:d}=(0,t.useStdin)();return(e,r,a={})=>{const i=e=>n(e,u);a.onCtrlCPressed&&s.push(a.onCtrlCPressed),o||(o=!0,d.on("data",i));let l=(0,t.useInput)(e,r);return()=>{o&&d.off("data",i),l&&l()}}};exports.default=d;
75
- },{"./useExit":"QLfx"}],"C9mZ":[function(require,module,exports) {
76
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=m(require("prop-types")),r=p(require("react")),l=m(require("./ErrorDisplay")),u=m(require("./ReleaseBuild")),i=m(require("./SelectTable")),n=m(require("../utilities/getBuilds")),a=m(require("../utilities/projectConfig/getProjectConfig")),d=m(require("../utilities/getRelativeDateFromDateString")),o=m(require("../utilities/logForCI")),s=m(require("../utilities/useExit")),f=m(require("../utilities/useInput"));function c(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(c=function(e){return e?r:t})(e)}function p(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=c(t);if(r&&r.has(e))return r.get(e);var l={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var n=u?Object.getOwnPropertyDescriptor(e,i):null;n&&(n.get||n.set)?Object.defineProperty(l,i,n):l[i]=e[i]}return l.default=e,r&&r.set(e,l),l}function m(e){return e&&e.__esModule?e:{default:e}}const g=({commandUsed:t,shouldConfirm:c})=>{const p=(0,s.default)(),[{error:m,builds:g,chosenBuildId:h,isLoading:b},y]=(0,r.useState)({error:null,builds:null,chosenBuildId:null,isLoading:!0}),E=(0,f.default)();if((0,r.useEffect)(()=>{if(g)return;let e;try{e=(0,a.default)().config}catch(t){return void y(e=>({...e,error:t}))}(0,n.default)({addWhereClauses:e=>e.where("status","==","succeeded"),appId:e.id,limit:50}).then(e=>{y(t=>({...t,builds:e.filter(e=>!e.releasedAt).slice(0,5),isLoading:!1}))}).catch(e=>{(0,o.default)(e),y(t=>({...t,error:e,isLoading:!1}))})},[g]),E((e,t)=>{g&&g.length&&!h&&t.escape&&p()}),m)return r.default.createElement(l.default,{commandUsed:t,error:m});if(b)return r.default.createElement(e.Text,null,"Loading...");if(h)return r.default.createElement(u.default,{commandUsed:t,id:h,shouldConfirm:c});if(g.length){const t=g.map(e=>({ID:e.id,Version:e.appVersion||"unknown","Creation date":(0,d.default)(e.createdAt)})),l=e=>y(t=>({...t,chosenBuildId:e.value.ID}));return r.default.createElement(r.Fragment,null,r.default.createElement(e.Box,null,r.default.createElement(e.Text,null,"Which build would you like to release?")),r.default.createElement(i.default,{data:t,onSelect:l}),r.default.createElement(e.Box,null,r.default.createElement(e.Text,{dimColor:!0},"Showing the latest ",g.length," unreleased successful builds")))}return r.default.createElement(e.Box,null,r.default.createElement(e.Text,null,"No elligible builds found "),r.default.createElement(e.Text,{dimColor:!0},"(i.e. unreleased and successful)"))};g.propTypes={commandUsed:t.default.string.isRequired,shouldConfirm:t.default.bool.isRequired};var h=g;exports.default=h;
77
- },{"./ErrorDisplay":"f0Jz","./ReleaseBuild":"u18N","./SelectTable":"TG4W","../utilities/getBuilds":"H47U","../utilities/projectConfig/getProjectConfig":"Sx1d","../utilities/getRelativeDateFromDateString":"oShw","../utilities/logForCI":"Sre8","../utilities/useExit":"QLfx","../utilities/useInput":"CLRu"}],"AYMC":[function(require,module,exports) {
78
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=i(require("chalk")),t=i(require("is-installed-globally")),o=i(require("latest-version")),r=i(require("pkg-up")),s=i(require("semver"));function i(e){return e&&e.__esModule?e:{default:e}}var u=()=>{if(process.env.AVA_PATH)return;const i=require(r.default.sync({cwd:__dirname}));(0,o.default)(i.name).then(o=>{if(s.default.gt(o,i.version)){const r=e.default.greenBright(`npm install ${t.default?"-g":"--save-dev"} @todesktop/cli`);console.log(`Your version of @todesktop/cli is out of date.\nRun ${r} to update to v${o}.`),s.default.satisfies(o,`^${i.version}`)||(console.log("CLI is exiting because it is out out of date."),process.exit(1))}})};exports.default=u;
79
- },{}],"EHrm":[function(require,module,exports) {
80
- module.exports={private:!1,publishConfig:{access:"public"},name:"@todesktop/cli",version:"1.0.0",license:"MIT",author:"Dave Jeffery <dave@todesktop.com> (http://www.todesktop.com/)",homepage:"https://todesktop.com/cli",bugs:{email:"dave@todesktop.com"},bin:{todesktop:"./build/cli.js"},engines:{node:">=12"},scripts:{preinstall:"npx force-resolutions",dev:"cp-cli dev.env .env && pastel dev",build:"cross-env NODE_ENV=production pastel build && cp-cli prod.env .env && cp node_modules/pastel/boot.js build/boot.js && sed -i'.bak' 's@pastel\\/boot@.\\/boot@g' build/cli.js",lint:"eslint .","lint--fix":"eslint . --fix",release:"npm run build && npx np --tag=latest","release-beta":"npm run build && npx np --any-branch --no-tests --tag=beta",test:"npm run build && ava","test--watch":"npm test -- --watch"},files:["build","docs",".env","LICENSE","README.md"],dependencies:{"@sentry/node":"^5.27.2",ajv:"^6.12.6","analytics-node":"^4.0.1",archiver:"^5.2.0",axios:"^0.21.1","better-ajv-errors":"^0.6.7",bunyan:"^1.8.14","camelcase-keys":"^5.2.0",chalk:"^4.1.0",conf:"^7.1.2","date-fns":"^2.28.0",decamelize:"^1.2.0",del:"^6.0.0",dotenv:"^8.2.0",du:"^1.0.0","email-regex":"^4.0.0","fast-glob":"^3.2.4","final-form":"^4.20.1","find-up":"^5.0.0",firebase:"^7.23.0","force-resolutions":"^1.0.10","git-rev-sync":"^3.0.2",ink:"^3.2.0","ink-gradient":"^2.0.0","ink-link":"^2.0.0","ink-progress-bar":"^3.0.0","ink-select-input":"^4.2.1","ink-text-input":"^4.0.1","is-installed-globally":"^0.3.2","latest-version":"^5.1.0","lodash.throttle":"^4.1.1","parse-author":"^2.0.0","pkg-up":"^3.1.0","pretty-bytes":"^5.4.1","prop-types":"^15.7.2",react:"^16.13.1","react-final-form":"^6.5.1",semver:"^7.3.2","stream-to-array":"^2.3.0",superagent:"^7.1.3",uuid:"^8.3.1","xdg-basedir":"^4.0.0",yargs:"^15.4.1"},devDependencies:{"@ava/babel":"^1.0.1","@babel/core":"^7.12.3","@babel/plugin-transform-runtime":"^7.12.1","@babel/preset-env":"^7.11.5","@babel/register":"^7.12.1","@types/bunyan":"^1.8.6",ava:"^3.12.1","babel-preset-es2015":"^6.24.1","cp-cli":"^2.0.0","cross-env":"^7.0.2",eslint:"^7.6.0","eslint-config-prettier":"^6.11.0","eslint-config-standard":"^14.1.1","eslint-plugin-import":"^2.22.1","eslint-plugin-node":"^11.1.0","eslint-plugin-prettier":"^3.1.4","eslint-plugin-promise":"^4.2.1","eslint-plugin-react":"^7.21.4","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-standard":"^4.0.1",execa:"^4.0.3","extract-zip":"^2.0.1","fs-extra":"^9.0.1",husky:"^4.3.0","is-ci":"^2.0.0","lint-staged":"^10.2.11",pastel:"^1.1.1",prettier:"^2.1.2",proxyquire:"^2.1.3",sinon:"^9.0.3"},ava:{babel:!0,files:["test/**/*.js","!test/fixtures/**/*","!test/utilities/**/*"],require:["@babel/register"],timeout:"10m"},"lint-staged":{"**/*.js":["eslint . --fix","git add"]},husky:{hooks:{"pre-commit":"lint-staged"}},overrides:{pastel:{"parcel-bundler":{deasync:"0.1.24"}}},resolutions:{"pastel/parcel-bundler/deasync":"0.1.24",ink:"3.2.0"}};
81
- },{}],"SYaU":[function(require,module,exports) {
82
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=c(require("@sentry/node")),t=u(require("os")),r=u(require("../../package.json")),n=require("../utilities/configStore"),o=u(require("../utilities/projectConfig/getProjectConfig")),a=u(require("path")),i=u(require("./getEnvironmentVariables"));function u(e){return e&&e.__esModule?e:{default:e}}function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function c(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var n={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(n,a,i):n[a]=e[a]}return n.default=e,r&&r.set(e,n),n}var f=()=>{const{TODESKTOP_CLI_SENTRY_DSN:a}=(0,i.default)();a&&(e.init({dsn:a}),e.configureScope(e=>{try{e.setUser({email:(0,n.getAuthConfig)().email})}catch(a){}try{e.setContext("os",{name:t.default.platform(),version:t.default.release()})}catch(a){}try{e.setContext("runtime",{name:"Node.js",version:process.version})}catch(a){}try{e.setContext("app",{app_name:r.default.name,app_version:r.default.version})}catch(a){}try{const t=(0,o.default)();e.setExtra("config",t)}catch(a){}}))};exports.default=f;
83
- },{"../../package.json":"EHrm","../utilities/configStore":"ffKF","../utilities/projectConfig/getProjectConfig":"Sx1d","./getEnvironmentVariables":"gwcX"}],"rPNZ":[function(require,module,exports) {
84
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=r(require("./exitIfCLIOutOfDate")),t=r(require("./initSentry"));function r(e){return e&&e.__esModule?e:{default:e}}const u={sentry:!0,exitIfOutOfDate:!0};var f=r=>{const{sentry:f,exitIfOutOfDate:a}={...u,...r};f&&(0,t.default)(),a&&(0,e.default)()};exports.default=f;
85
- },{"./exitIfCLIOutOfDate":"AYMC","./initSentry":"SYaU"}],"CV1E":[function(require,module,exports) {
86
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useAnalyticsCommand=void 0;var e=require("react"),t=require("./firestore"),i=require("./analytics"),r=s(require("../utilities/logger")),a=s(require("../utilities/projectConfig/getProjectConfig"));function s(e){return e&&e.__esModule?e:{default:e}}const o=(s,o={},u={})=>{const[n,c]=(0,e.useState)(!1);r.default.info({command:s,flags:o,properties:u},"useAnalyticsCommand");try{o.projectPath&&(u={...u,...(0,a.default)()})}catch(l){}return(0,e.useEffect)(()=>{const e=(0,t.onUserAuth)(async t=>{t.uid&&(0,i.identify)(t.uid,{email:t.email,displayName:t.displayName},()=>{(0,i.track)(i.ANALYTICS_EVENT.CLI_COMMAND,{...u,flags:o,command:s},()=>c(!0)),e&&e()})});setTimeout(()=>c(!0),5e3)},[]),{hasAttemptedTracking:n}};exports.useAnalyticsCommand=o;
87
- },{"./firestore":"gzUX","./analytics":"ALju","../utilities/logger":"XvyO","../utilities/projectConfig/getProjectConfig":"Sx1d"}],"YgbH":[function(require,module,exports) {
88
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("ink"),t=c(require("prop-types")),r=f(require("react")),l=c(require("../lib/utilities/checkIfReactIsUsable")),o=c(require("../lib/components/LoginHOC")),a=c(require("../lib/components/ErrorBoundary")),u=c(require("../lib/components/ReleaseBuild")),n=c(require("../lib/components/PickBuildForRelease")),i=c(require("../lib/utilities/onCommand")),s=require("../lib/utilities/useAnalytics");function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function f(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var l={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var u=o?Object.getOwnPropertyDescriptor(e,a):null;u&&(u.get||u.set)?Object.defineProperty(l,a,u):l[a]=e[a]}return l.default=e,r&&r.set(e,l),l}function c(e){return e&&e.__esModule?e:{default:e}}(0,i.default)();const p=({id:t,force:i,latest:d})=>{if((0,l.default)(),(0,s.useAnalyticsCommand)("release",{id:t,force:i,shouldReleaseLatest:d}),t&&t.startsWith("."))return r.default.createElement(r.Fragment,null,r.default.createElement(e.Box,null,r.default.createElement(e.Text,{bold:!0,color:"red"},"todesktop release <project-path>"),r.default.createElement(e.Text,null," is no longer supported. Run this instead:")),r.default.createElement(e.Text,{bold:!0,color:"greenBright"},"todesktop build && todesktop release --latest --force"));return r.default.createElement(a.default,null,r.default.createElement(o.default,null,(()=>t?r.default.createElement(u.default,{commandUsed:"todesktop release <id>",id:t,shouldConfirm:!i}):d?r.default.createElement(u.default,{commandUsed:"todesktop release --latest",shouldReleaseLatest:!0,shouldConfirm:!i}):r.default.createElement(n.default,{commandUsed:"todesktop builds",shouldConfirm:!i}))()))};p.propTypes={id:t.default.string,force:t.default.bool,latest:t.default.bool},p.positionalArgs=["id"];var m=p;exports.default=m;
89
- },{"../lib/utilities/checkIfReactIsUsable":"cb6D","../lib/components/LoginHOC":"nLy3","../lib/components/ErrorBoundary":"XM8F","../lib/components/ReleaseBuild":"u18N","../lib/components/PickBuildForRelease":"C9mZ","../lib/utilities/onCommand":"rPNZ","../lib/utilities/useAnalytics":"CV1E"}]},{},["YgbH"], null)
1
+ // modules are defined as an array
2
+ // [ module function, map of requires ]
3
+ //
4
+ // map of requires is short require name -> numeric require
5
+ //
6
+ // anything defined in a previous bundle is accessed via the
7
+ // orig method which is the require for previous bundles
8
+ parcelRequire = (function (modules, cache, entry, globalName) {
9
+ // Save the require from previous bundle to this closure if any
10
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
11
+ var nodeRequire = typeof require === 'function' && require;
12
+
13
+ function newRequire(name, jumped) {
14
+ if (!cache[name]) {
15
+ if (!modules[name]) {
16
+ // if we cannot find the module within our internal map or
17
+ // cache jump to the current global require ie. the last bundle
18
+ // that was added to the page.
19
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
20
+ if (!jumped && currentRequire) {
21
+ return currentRequire(name, true);
22
+ }
23
+
24
+ // If there are other bundles on this page the require from the
25
+ // previous one is saved to 'previousRequire'. Repeat this as
26
+ // many times as there are bundles until the module is found or
27
+ // we exhaust the require chain.
28
+ if (previousRequire) {
29
+ return previousRequire(name, true);
30
+ }
31
+
32
+ // Try the node require function if it exists.
33
+ if (nodeRequire && typeof name === 'string') {
34
+ return nodeRequire(name);
35
+ }
36
+
37
+ var err = new Error('Cannot find module \'' + name + '\'');
38
+ err.code = 'MODULE_NOT_FOUND';
39
+ throw err;
40
+ }
41
+
42
+ localRequire.resolve = resolve;
43
+ localRequire.cache = {};
44
+
45
+ var module = cache[name] = new newRequire.Module(name);
46
+
47
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
48
+ }
49
+
50
+ return cache[name].exports;
51
+
52
+ function localRequire(x){
53
+ return newRequire(localRequire.resolve(x));
54
+ }
55
+
56
+ function resolve(x){
57
+ return modules[name][1][x] || x;
58
+ }
59
+ }
60
+
61
+ function Module(moduleName) {
62
+ this.id = moduleName;
63
+ this.bundle = newRequire;
64
+ this.exports = {};
65
+ }
66
+
67
+ newRequire.isParcelRequire = true;
68
+ newRequire.Module = Module;
69
+ newRequire.modules = modules;
70
+ newRequire.cache = cache;
71
+ newRequire.parent = previousRequire;
72
+ newRequire.register = function (id, exports) {
73
+ modules[id] = [function (require, module) {
74
+ module.exports = exports;
75
+ }, {}];
76
+ };
77
+
78
+ var error;
79
+ for (var i = 0; i < entry.length; i++) {
80
+ try {
81
+ newRequire(entry[i]);
82
+ } catch (e) {
83
+ // Save first error but execute all entries
84
+ if (!error) {
85
+ error = e;
86
+ }
87
+ }
88
+ }
89
+
90
+ if (entry.length) {
91
+ // Expose entry point to Node, AMD or browser globals
92
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
93
+ var mainExports = newRequire(entry[entry.length - 1]);
94
+
95
+ // CommonJS
96
+ if (typeof exports === "object" && typeof module !== "undefined") {
97
+ module.exports = mainExports;
98
+
99
+ // RequireJS
100
+ } else if (typeof define === "function" && define.amd) {
101
+ define(function () {
102
+ return mainExports;
103
+ });
104
+
105
+ // <script>
106
+ } else if (globalName) {
107
+ this[globalName] = mainExports;
108
+ }
109
+ }
110
+
111
+ // Override the current require with this new one
112
+ parcelRequire = newRequire;
113
+
114
+ if (error) {
115
+ // throw error from earlier, _after updating parcelRequire_
116
+ throw error;
117
+ }
118
+
119
+ return newRequire;
120
+ })({"../lib/utilities/checkIfReactIsUsable.js":[function(require,module,exports) {
121
+ "use strict";
122
+
123
+ Object.defineProperty(exports, "__esModule", {
124
+ value: true
125
+ });
126
+ exports.default = void 0;
127
+
128
+ var _react = require("react");
129
+
130
+ /*
131
+ This should be called at the top of all commands to test if React
132
+ is OK and if not, to exit cleanly.
133
+
134
+ If React throws an error (e.g. when there are multiple versions of
135
+ React in the customer's dependency tree), then we need to exit with
136
+ a non-zero error code and not with an uncaught exception somewhere.
137
+
138
+ These parameters exist only to make things more testable
139
+ */
140
+ var _default = ({
141
+ cons = console,
142
+ proc = process
143
+ } = {}) => {
144
+ try {
145
+ (0, _react.useState)(null);
146
+ } catch (e) {
147
+ cons.error(e);
148
+ proc.exit(1);
149
+ }
150
+ };
151
+
152
+ exports.default = _default;
153
+ },{}],"../lib/components/TextInput.js":[function(require,module,exports) {
154
+ "use strict";
155
+
156
+ Object.defineProperty(exports, "__esModule", {
157
+ value: true
158
+ });
159
+ exports.default = void 0;
160
+
161
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
162
+
163
+ var _inkTextInput = _interopRequireDefault(require("ink-text-input"));
164
+
165
+ var _react = _interopRequireDefault(require("react"));
166
+
167
+ var _propTypes = _interopRequireDefault(require("prop-types"));
168
+
169
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
170
+
171
+ const TextInput = ({
172
+ onBlur,
173
+ onFocus,
174
+ ...props
175
+ }) => {
176
+ _react.default.useEffect(() => {
177
+ onFocus();
178
+ return onBlur;
179
+ }, [onFocus, onBlur]);
180
+
181
+ return /*#__PURE__*/_react.default.createElement(_inkTextInput.default, (0, _extends2.default)({}, props, {
182
+ showCursor: true
183
+ }));
184
+ };
185
+
186
+ TextInput.propTypes = {
187
+ onBlur: _propTypes.default.func,
188
+ onFocus: _propTypes.default.func
189
+ };
190
+ var _default = TextInput;
191
+ exports.default = _default;
192
+ },{}],"../lib/utilities/getCliVersion.js":[function(require,module,exports) {
193
+ "use strict";
194
+
195
+ Object.defineProperty(exports, "__esModule", {
196
+ value: true
197
+ });
198
+ exports.default = void 0;
199
+
200
+ var _pkgUp = _interopRequireDefault(require("pkg-up"));
201
+
202
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
203
+
204
+ const cliVersion = require(_pkgUp.default.sync({
205
+ cwd: __dirname
206
+ })).version;
207
+
208
+ var _default = () => cliVersion;
209
+
210
+ exports.default = _default;
211
+ },{}],"../lib/utilities/logger.js":[function(require,module,exports) {
212
+ "use strict";
213
+
214
+ Object.defineProperty(exports, "__esModule", {
215
+ value: true
216
+ });
217
+ exports.default = void 0;
218
+
219
+ var _bunyan = _interopRequireDefault(require("bunyan"));
220
+
221
+ var fs = _interopRequireWildcard(require("fs"));
222
+
223
+ var os = _interopRequireWildcard(require("os"));
224
+
225
+ var path = _interopRequireWildcard(require("path"));
226
+
227
+ var Sentry = _interopRequireWildcard(require("@sentry/node"));
228
+
229
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
230
+
231
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
232
+
233
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
234
+
235
+ let logger;
236
+
237
+ try {
238
+ const name = "todesktop-cli";
239
+ let parentDirectory;
240
+ const homePath = os.homedir();
241
+
242
+ if (process.platform === "darwin") {
243
+ parentDirectory = path.join(homePath, "Library", "Logs", name);
244
+ } else if (process.platform === "win32") {
245
+ parentDirectory = path.join(process.env.APPDATA || path.join(homePath, "AppData", "Roaming"), name, "logs");
246
+ } else {
247
+ parentDirectory = path.join(process.env.XDG_CONFIG_HOME || path.join(homePath, ".config"), name, "logs");
248
+ }
249
+
250
+ fs.mkdirSync(parentDirectory, {
251
+ recursive: true
252
+ });
253
+ logger = _bunyan.default.createLogger({
254
+ name,
255
+ src: true,
256
+ streams: [{
257
+ level: "debug",
258
+ path: path.join(parentDirectory, "main.log")
259
+ }]
260
+ });
261
+ } catch (e) {
262
+ // Ignore
263
+ const noOp = () => {};
264
+
265
+ logger = {
266
+ debug: noOp,
267
+ error: noOp,
268
+ fatal: noOp,
269
+ info: noOp,
270
+ trace: noOp,
271
+ warn: noOp
272
+ };
273
+
274
+ try {
275
+ Sentry.captureException(e);
276
+ } catch (err) {// Ignore
277
+ }
278
+ }
279
+
280
+ var _default = logger;
281
+ exports.default = _default;
282
+ },{}],"../lib/utilities/getEnvironmentVariables.js":[function(require,module,exports) {
283
+ "use strict";
284
+
285
+ Object.defineProperty(exports, "__esModule", {
286
+ value: true
287
+ });
288
+ exports.default = void 0;
289
+
290
+ var _dotenv = _interopRequireDefault(require("dotenv"));
291
+
292
+ var path = _interopRequireWildcard(require("path"));
293
+
294
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
295
+
296
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
297
+
298
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
299
+
300
+ let hasInitialized = false;
301
+
302
+ const init = () => {
303
+ if (hasInitialized) {
304
+ return;
305
+ }
306
+
307
+ _dotenv.default.config({
308
+ path: path.resolve(__dirname, "..", "..", ".env")
309
+ });
310
+
311
+ hasInitialized = true;
312
+ };
313
+
314
+ var _default = () => {
315
+ init();
316
+ return process.env;
317
+ };
318
+
319
+ exports.default = _default;
320
+ },{}],"../lib/utilities/firestore.js":[function(require,module,exports) {
321
+ "use strict";
322
+
323
+ Object.defineProperty(exports, "__esModule", {
324
+ value: true
325
+ });
326
+ exports.signInWithCustomToken = exports.onUserAuth = exports.default = exports.currentUser = void 0;
327
+
328
+ var firebase = _interopRequireWildcard(require("firebase/app"));
329
+
330
+ require("firebase/firestore");
331
+
332
+ require("firebase/auth");
333
+
334
+ var _getEnvironmentVariables = _interopRequireDefault(require("./getEnvironmentVariables"));
335
+
336
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
337
+
338
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
339
+
340
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
341
+
342
+ const environmentVariables = (0, _getEnvironmentVariables.default)(); // if (environmentVariables.NODE_ENV === "development") {
343
+ // if (true) {
344
+ // firebase.firestore.setLogLevel("debug");
345
+ // }
346
+
347
+ const firebaseDB = firebase.initializeApp({
348
+ apiKey: environmentVariables.TODESKTOP_CLI_FIREBASE_API_KEY,
349
+ authDomain: environmentVariables.TODESKTOP_CLI_FIREBASE_AUTH_DOMAIN,
350
+ databaseURL: environmentVariables.TODESKTOP_CLI_FIREBASE_DATABASE_URL,
351
+ projectId: environmentVariables.TODESKTOP_CLI_FIREBASE_PROJECT_ID,
352
+ storageBucket: environmentVariables.TODESKTOP_CLI_FIREBASE_STORAGE_BUCKET,
353
+ messagingSenderId: environmentVariables.TODESKTOP_CLI_FIREBASE_MESSAGING_SENDER_ID,
354
+ appId: environmentVariables.TODESKTOP_CLI_FIREBASE_ID
355
+ });
356
+
357
+ const currentUser = () => firebase.auth().currentUser;
358
+
359
+ exports.currentUser = currentUser;
360
+
361
+ const signInWithCustomToken = async token => {
362
+ return firebase.auth().signInWithCustomToken(token);
363
+ };
364
+ /**
365
+ * onUserAuth is only triggered on sign-in. This
366
+ * happens once signInWithCustomToken is successful.
367
+ *
368
+ * It technically also triggers on sign-out but there's
369
+ * no concept of signing out of firebase with the CLI app.
370
+ * (See logout command which just deletes a local file)
371
+ */
372
+
373
+
374
+ exports.signInWithCustomToken = signInWithCustomToken;
375
+
376
+ const onUserAuth = handler => firebase.auth().onAuthStateChanged(user => {
377
+ handler(user || {});
378
+ });
379
+
380
+ exports.onUserAuth = onUserAuth;
381
+
382
+ var _default = firebaseDB.firestore();
383
+
384
+ exports.default = _default;
385
+ },{"./getEnvironmentVariables":"../lib/utilities/getEnvironmentVariables.js"}],"../lib/utilities/configStore.js":[function(require,module,exports) {
386
+ "use strict";
387
+
388
+ Object.defineProperty(exports, "__esModule", {
389
+ value: true
390
+ });
391
+ exports.setConfig = exports.setAuthConfig = exports.jwtTokenConfigKey = exports.getConfig = exports.getAuthConfig = exports.emailConfigKey = exports.deleteAuthConfig = exports.accessTokenConfigKey = void 0;
392
+
393
+ var fs = _interopRequireWildcard(require("fs"));
394
+
395
+ var _del = _interopRequireDefault(require("del"));
396
+
397
+ var _conf = _interopRequireDefault(require("conf"));
398
+
399
+ var _xdgBasedir = _interopRequireDefault(require("xdg-basedir"));
400
+
401
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
402
+
403
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
404
+
405
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
406
+
407
+ const config = new _conf.default({
408
+ configName: "todesktop-cli"
409
+ });
410
+ const accessTokenConfigKey = "accessToken";
411
+ exports.accessTokenConfigKey = accessTokenConfigKey;
412
+ const emailConfigKey = "email";
413
+ exports.emailConfigKey = emailConfigKey;
414
+ const jwtTokenConfigKey = "jwtToken";
415
+ exports.jwtTokenConfigKey = jwtTokenConfigKey;
416
+
417
+ const setConfig = (key, value) => config.set(key, value);
418
+
419
+ exports.setConfig = setConfig;
420
+
421
+ const getConfig = key => config.get(key);
422
+
423
+ exports.getConfig = getConfig;
424
+
425
+ const setAuthConfig = (email, accessToken, jwtToken) => {
426
+ setConfig(emailConfigKey, email);
427
+ setConfig(accessTokenConfigKey, accessToken);
428
+ setConfig(jwtTokenConfigKey, jwtToken);
429
+ };
430
+
431
+ exports.setAuthConfig = setAuthConfig;
432
+
433
+ const getAuthConfig = () => {
434
+ const accessToken = getConfig(accessTokenConfigKey);
435
+ const jwtToken = getConfig(jwtTokenConfigKey);
436
+ const email = getConfig(emailConfigKey);
437
+ return {
438
+ accessToken,
439
+ jwtToken,
440
+ email
441
+ };
442
+ };
443
+
444
+ exports.getAuthConfig = getAuthConfig;
445
+
446
+ const deleteAuthConfig = () => {
447
+ config.delete(emailConfigKey);
448
+ config.delete(accessTokenConfigKey);
449
+ config.delete(jwtTokenConfigKey);
450
+ }; // TODO - Delete by end of April: backwards compatibility for old configstore
451
+
452
+
453
+ exports.deleteAuthConfig = deleteAuthConfig;
454
+ const oldConfigPath = `${_xdgBasedir.default.config}/configstore/config.json.json`;
455
+
456
+ if (fs.existsSync(oldConfigPath)) {
457
+ try {
458
+ // copy config from old json file to new json file, delete old file
459
+ const {
460
+ email,
461
+ accessToken,
462
+ jwtToken
463
+ } = require(oldConfigPath);
464
+
465
+ setAuthConfig(email, accessToken, jwtToken);
466
+ (0, _del.default)(oldConfigPath, {
467
+ force: true
468
+ });
469
+ } catch (err) {
470
+ // if invalid json, delete file to prompt new login
471
+ (0, _del.default)(oldConfigPath, {
472
+ force: true
473
+ });
474
+ }
475
+ }
476
+ },{}],"../lib/utilities/analytics.js":[function(require,module,exports) {
477
+ "use strict";
478
+
479
+ Object.defineProperty(exports, "__esModule", {
480
+ value: true
481
+ });
482
+ exports.track = exports.identify = exports.flush = exports.ANALYTICS_EVENT = void 0;
483
+
484
+ var _os = _interopRequireDefault(require("os"));
485
+
486
+ var _uuid = require("uuid");
487
+
488
+ var _analyticsNode = _interopRequireDefault(require("analytics-node"));
489
+
490
+ var _getEnvironmentVariables = _interopRequireDefault(require("./getEnvironmentVariables"));
491
+
492
+ var _firestore = require("./firestore");
493
+
494
+ var _configStore = require("./configStore");
495
+
496
+ var _getCliVersion = _interopRequireDefault(require("./getCliVersion"));
497
+
498
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
499
+
500
+ const environmentVariables = (0, _getEnvironmentVariables.default)();
501
+ const analytics = new _analyticsNode.default(environmentVariables.SEGMENT_WRITE_KEY, {
502
+ flushAt: 1,
503
+ flushInterval: 1
504
+ });
505
+ const ANALYTICS_EVENT = {
506
+ CLI_COMMAND: "CLI Command"
507
+ };
508
+ exports.ANALYTICS_EVENT = ANALYTICS_EVENT;
509
+
510
+ function getAnalyticsBaseProperties() {
511
+ let baseProps = {
512
+ client: "cli"
513
+ };
514
+
515
+ try {
516
+ baseProps.os = {
517
+ name: _os.default.platform(),
518
+ version: _os.default.release()
519
+ };
520
+ } catch (err) {}
521
+
522
+ try {
523
+ baseProps.user = {
524
+ email: (0, _configStore.getAuthConfig)().email
525
+ };
526
+ } catch (err) {}
527
+
528
+ try {
529
+ baseProps.app = {
530
+ cliVersion: (0, _getCliVersion.default)()
531
+ };
532
+ } catch (err) {}
533
+
534
+ try {
535
+ baseProps.runtime = {
536
+ name: "Node.js",
537
+ version: process.version
538
+ };
539
+ } catch (err) {}
540
+
541
+ return baseProps;
542
+ }
543
+
544
+ const anonymousId = (0, _uuid.v4)();
545
+
546
+ const track = (event, properties = {}, callback = () => {}) => {
547
+ try {
548
+ const user = (0, _firestore.currentUser)();
549
+ analytics.track({
550
+ event,
551
+ userId: user ? user.uid : undefined,
552
+ anonymousId,
553
+ properties: { ...properties,
554
+ ...getAnalyticsBaseProperties()
555
+ }
556
+ }, callback);
557
+ } catch (err) {}
558
+ };
559
+
560
+ exports.track = track;
561
+
562
+ const identify = (id, traits = {}, callback = () => {}) => {
563
+ try {
564
+ analytics.identify({
565
+ userId: id,
566
+ anonymousId,
567
+ traits
568
+ }, callback);
569
+ } catch (err) {}
570
+ };
571
+
572
+ exports.identify = identify;
573
+
574
+ const flush = (callback = () => {}) => analytics.flush(callback);
575
+
576
+ exports.flush = flush;
577
+ },{"./getEnvironmentVariables":"../lib/utilities/getEnvironmentVariables.js","./firestore":"../lib/utilities/firestore.js","./configStore":"../lib/utilities/configStore.js","./getCliVersion":"../lib/utilities/getCliVersion.js"}],"../lib/utilities/useExit.js":[function(require,module,exports) {
578
+ "use strict";
579
+
580
+ Object.defineProperty(exports, "__esModule", {
581
+ value: true
582
+ });
583
+ exports.default = void 0;
584
+
585
+ var _ink = require("ink");
586
+
587
+ var _analytics = require("./analytics");
588
+
589
+ var _firestore = _interopRequireDefault(require("./firestore"));
590
+
591
+ var _logger = _interopRequireDefault(require("./logger"));
592
+
593
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
594
+
595
+ var _default = () => {
596
+ const {
597
+ exit
598
+ } = (0, _ink.useApp)();
599
+ return error => {
600
+ _logger.default.debug({
601
+ error
602
+ }, "Exit called");
603
+ /*
604
+ First, destroy connections.
605
+ Why do we need to do this if we're going to call process.exit
606
+ below anyway? Just to be safe in case a Firestore subscription
607
+ triggers a state update after the React app is exited.
608
+ */
609
+
610
+
611
+ _firestore.default.terminate().catch(e => // Ignore
612
+ _logger.default.error(e));
613
+
614
+ let timeoutId;
615
+ Promise.race([// flush the analytics to make sure all outstanding events are pushed to segment
616
+ new Promise(resolve => (0, _analytics.flush)(() => resolve())), // If it takes longer than 1 second, resolve early to proceed with program exit
617
+ new Promise(resolve => timeoutId = setTimeout(() => resolve(), 1000))]).catch(() => {}).finally(() => {
618
+ clearTimeout(timeoutId);
619
+ /*
620
+ Then, exit the React app. We don't pass the error because:
621
+ 1. We don't want it displayed. We could give it a dummy error but
622
+ that will output an empty line.
623
+ 2. It doesn't exit with the correct code anyway, see
624
+ https://github.com/vadimdemedes/pastel/issues/39.
625
+ Side note: your component must not perform state updates after
626
+ calling this, it will error.
627
+ The try-catch shouldn't be needed here, but let's be safe
628
+ */
629
+
630
+ try {
631
+ exit();
632
+ } catch (e) {
633
+ _logger.default.error(e); // Ignore
634
+
635
+ }
636
+ /*
637
+ Then exit the process.
638
+ It should happen if all connections, etc. are destroyed. We manually
639
+ exit with a code because:
640
+ 1. We might not clean up properly, it could fail or take a long time.
641
+ 2. The exit function above doesn't exit the CLI with the correct
642
+ code anyway.
643
+ If we had a way to detect when the app exits, we would use that
644
+ and then call process.exit / destroy connections appropriately
645
+ (https://github.com/vadimdemedes/pastel/issues/38).
646
+ */
647
+
648
+
649
+ setTimeout(() => process.exit(error ? 1 : 0), 10);
650
+ });
651
+ };
652
+ };
653
+
654
+ exports.default = _default;
655
+ },{"./analytics":"../lib/utilities/analytics.js","./firestore":"../lib/utilities/firestore.js","./logger":"../lib/utilities/logger.js"}],"../lib/components/ErrorDisplay.js":[function(require,module,exports) {
656
+ "use strict";
657
+
658
+ Object.defineProperty(exports, "__esModule", {
659
+ value: true
660
+ });
661
+ exports.default = void 0;
662
+
663
+ var _ink = require("ink");
664
+
665
+ var _propTypes = _interopRequireDefault(require("prop-types"));
666
+
667
+ var _react = _interopRequireWildcard(require("react"));
668
+
669
+ var _getCliVersion = _interopRequireDefault(require("../utilities/getCliVersion"));
670
+
671
+ var _logger = _interopRequireDefault(require("../utilities/logger"));
672
+
673
+ var _useExit = _interopRequireDefault(require("../utilities/useExit"));
674
+
675
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
676
+
677
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
678
+
679
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
680
+
681
+ const ErrorDisplay = ({
682
+ commandUsed,
683
+ error
684
+ }) => {
685
+ const exit = (0, _useExit.default)();
686
+
687
+ _logger.default.error({
688
+ error
689
+ }); // After an error is set, exit
690
+
691
+
692
+ (0, _react.useEffect)(() => {
693
+ if (!error) {
694
+ return;
695
+ } // Just to avoid updating state after exiting the React app
696
+
697
+
698
+ setTimeout(() => exit(error), 10);
699
+ }, [exit, error]);
700
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ink.Text, {
701
+ backgroundColor: "red",
702
+ color: "white"
703
+ }, " ", "ERROR", " "), /*#__PURE__*/_react.default.createElement(_ink.Text, null, error.message || error.stack || error.toString()), /*#__PURE__*/_react.default.createElement(_ink.Box, {
704
+ flexDirection: "column",
705
+ marginTop: 1
706
+ }, commandUsed ? /*#__PURE__*/_react.default.createElement(_ink.Text, {
707
+ dimColor: true,
708
+ color: "gray"
709
+ }, "Command: ", commandUsed) : null, /*#__PURE__*/_react.default.createElement(_ink.Text, {
710
+ dimColor: true,
711
+ color: "gray"
712
+ }, "@todesktop/cli: ", (0, _getCliVersion.default)()), /*#__PURE__*/_react.default.createElement(_ink.Text, {
713
+ dimColor: true,
714
+ color: "gray"
715
+ }, "Node: ", process.version), /*#__PURE__*/_react.default.createElement(_ink.Text, {
716
+ dimColor: true,
717
+ color: "gray"
718
+ }, "cwd: ", process.cwd())));
719
+ };
720
+
721
+ ErrorDisplay.propTypes = {
722
+ commandUsed: _propTypes.default.string,
723
+ error: _propTypes.default.object.isRequired
724
+ };
725
+ var _default = ErrorDisplay;
726
+ exports.default = _default;
727
+ },{"../utilities/getCliVersion":"../lib/utilities/getCliVersion.js","../utilities/logger":"../lib/utilities/logger.js","../utilities/useExit":"../lib/utilities/useExit.js"}],"../lib/utilities/postToFirebaseFunction.js":[function(require,module,exports) {
728
+ "use strict";
729
+
730
+ Object.defineProperty(exports, "__esModule", {
731
+ value: true
732
+ });
733
+ exports.default = _default;
734
+
735
+ var _axios = _interopRequireDefault(require("axios"));
736
+
737
+ var _getEnvironmentVariables = _interopRequireDefault(require("./getEnvironmentVariables"));
738
+
739
+ var _logger = _interopRequireDefault(require("./logger"));
740
+
741
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
742
+
743
+ const {
744
+ TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE
745
+ } = (0, _getEnvironmentVariables.default)();
746
+
747
+ async function _default(functionName, body = {}, config = {}) {
748
+ _logger.default.debug({
749
+ functionName,
750
+ body,
751
+ config
752
+ }, "postToFirebaseFunction");
753
+
754
+ try {
755
+ const response = await _axios.default.post(`${TODESKTOP_CLI_FIREBASE_FUNCTIONS_BASE}${functionName}`, body, config);
756
+
757
+ _logger.default.debug({
758
+ responseData: response.data
759
+ }, "postToFirebaseFunction: success");
760
+
761
+ return response.data;
762
+ } catch (e) {
763
+ _logger.default.error({
764
+ error: e
765
+ }, "postToFirebaseFunction: error");
766
+
767
+ throw e;
768
+ }
769
+ }
770
+ },{"./getEnvironmentVariables":"../lib/utilities/getEnvironmentVariables.js","./logger":"../lib/utilities/logger.js"}],"../lib/components/Login.js":[function(require,module,exports) {
771
+ "use strict";
772
+
773
+ Object.defineProperty(exports, "__esModule", {
774
+ value: true
775
+ });
776
+ exports.default = void 0;
777
+
778
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
779
+
780
+ var _ink = require("ink");
781
+
782
+ var _propTypes = _interopRequireDefault(require("prop-types"));
783
+
784
+ var _react = _interopRequireWildcard(require("react"));
785
+
786
+ var _reactFinalForm = require("react-final-form");
787
+
788
+ var _TextInput = _interopRequireDefault(require("../components/TextInput"));
789
+
790
+ var _ErrorDisplay = _interopRequireDefault(require("./ErrorDisplay"));
791
+
792
+ var _postToFirebaseFunction = _interopRequireDefault(require("../utilities/postToFirebaseFunction"));
793
+
794
+ var _firestore = require("../utilities/firestore");
795
+
796
+ var _configStore = require("../utilities/configStore");
797
+
798
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
799
+
800
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
801
+
802
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
803
+
804
+ // modules
805
+ // components
806
+ // logic
807
+ const loginFields = [{
808
+ name: "email",
809
+ label: "Your email",
810
+ placeholder: "name@email.com",
811
+ Input: _TextInput.default,
812
+ validate: value => {
813
+ if (!value) return "Required";
814
+ }
815
+ }, {
816
+ name: "accessToken",
817
+ label: "Your access token",
818
+ placeholder: "********",
819
+ Input: _TextInput.default,
820
+ validate: value => {
821
+ if (!value) return "Required";
822
+ },
823
+ mask: "*"
824
+ }];
825
+
826
+ const Login = ({
827
+ setIsLoggedIn
828
+ }) => {
829
+ const [activeField, setActiveField] = (0, _react.useState)(0);
830
+ const [error, setError] = (0, _react.useState)(null);
831
+ const [failureMessage, setFailureMessage] = (0, _react.useState)(null);
832
+ const [isSubmittingForm, setIsSubmittingForm] = (0, _react.useState)(false);
833
+
834
+ const onFailure = message => {
835
+ setIsSubmittingForm(false);
836
+ setFailureMessage(message);
837
+ setActiveField(0);
838
+ }; // login handler that verifies accessToken and email with that in firebase
839
+
840
+
841
+ const onSubmitLogin = async ({
842
+ email,
843
+ accessToken
844
+ }) => {
845
+ setFailureMessage(null);
846
+ setIsSubmittingForm(true);
847
+
848
+ try {
849
+ const jwtToken = await (0, _postToFirebaseFunction.default)("loginWithAccessToken", {
850
+ email,
851
+ accessToken
852
+ });
853
+
854
+ if (jwtToken) {
855
+ await (0, _firestore.signInWithCustomToken)(jwtToken);
856
+ (0, _configStore.setAuthConfig)(email, accessToken, jwtToken);
857
+ setIsLoggedIn(true);
858
+ } else {
859
+ onFailure("Incorrrect credentials. Try again");
860
+ }
861
+ } catch (err) {
862
+ if (err.code === 500) {
863
+ setError(err);
864
+ } else {
865
+ onFailure(`Login unsuccessful: ${err.message}`);
866
+ }
867
+ }
868
+ };
869
+
870
+ if (error) return /*#__PURE__*/_react.default.createElement(_ErrorDisplay.default, {
871
+ error: error
872
+ });
873
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "You are not currently logged in."), /*#__PURE__*/_react.default.createElement(_ink.Text, null, "Log in below:"), /*#__PURE__*/_react.default.createElement(_ink.Box, {
874
+ marginBottom: 1
875
+ }), /*#__PURE__*/_react.default.createElement(_reactFinalForm.Form, {
876
+ onSubmit: onSubmitLogin
877
+ }, ({
878
+ handleSubmit,
879
+ validating,
880
+ form
881
+ }) => /*#__PURE__*/_react.default.createElement(_ink.Box, {
882
+ flexDirection: "column"
883
+ }, loginFields.map(({
884
+ name,
885
+ label,
886
+ placeholder,
887
+ validate,
888
+ Input,
889
+ mask
890
+ }, index) => /*#__PURE__*/_react.default.createElement(_reactFinalForm.Field, {
891
+ name: name,
892
+ key: name,
893
+ validate: validate
894
+ }, ({
895
+ input,
896
+ meta
897
+ }) => /*#__PURE__*/_react.default.createElement(_ink.Box, {
898
+ flexDirection: "column"
899
+ }, activeField >= index ? /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, {
900
+ bold: activeField === index
901
+ }, label, ": "), activeField === index ? /*#__PURE__*/_react.default.createElement(Input, (0, _extends2.default)({}, input, {
902
+ mask: mask,
903
+ placeholder: placeholder,
904
+ onSubmit: () => {
905
+ if (meta.valid && !validating) {
906
+ setActiveField(value => value + 1); // go to next field
907
+
908
+ if (activeField === loginFields.length - 1) {
909
+ // last field, so submit
910
+ handleSubmit();
911
+ }
912
+ } else {
913
+ input.onBlur(); // mark as touched to show error
914
+ }
915
+ }
916
+ })) : input.value && /*#__PURE__*/_react.default.createElement(_ink.Text, null, name === "accessToken" ? input.value.replace(/./gi, "*") : input.value) || placeholder && /*#__PURE__*/_react.default.createElement(_ink.Text, {
917
+ color: "gray"
918
+ }, placeholder), meta.invalid && meta.touched && /*#__PURE__*/_react.default.createElement(_ink.Box, {
919
+ marginLeft: 2,
920
+ marginRight: 1
921
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, {
922
+ color: "red"
923
+ }, "\u2716")), meta.error && meta.touched && /*#__PURE__*/_react.default.createElement(Error, {
924
+ errorMessage: meta.error
925
+ })) : null))))), isSubmittingForm && /*#__PURE__*/_react.default.createElement(_ink.Box, {
926
+ marginTop: 1
927
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "Logging in...")), failureMessage && /*#__PURE__*/_react.default.createElement(Error, {
928
+ errorMessage: failureMessage,
929
+ marginTop: true
930
+ }));
931
+ };
932
+
933
+ const Error = ({
934
+ errorMessage,
935
+ marginTop
936
+ }) => /*#__PURE__*/_react.default.createElement(_ink.Box, {
937
+ marginTop: marginTop ? 1 : 0
938
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, {
939
+ color: "red"
940
+ }, errorMessage));
941
+
942
+ Error.propTypes = {
943
+ errorMessage: _propTypes.default.string.isRequired,
944
+ marginTop: _propTypes.default.bool
945
+ };
946
+ Login.propTypes = {
947
+ setIsLoggedIn: _propTypes.default.func.isRequired
948
+ };
949
+ var _default = Login;
950
+ exports.default = _default;
951
+ },{"../components/TextInput":"../lib/components/TextInput.js","./ErrorDisplay":"../lib/components/ErrorDisplay.js","../utilities/postToFirebaseFunction":"../lib/utilities/postToFirebaseFunction.js","../utilities/firestore":"../lib/utilities/firestore.js","../utilities/configStore":"../lib/utilities/configStore.js"}],"../lib/components/LoginHOC.js":[function(require,module,exports) {
952
+ "use strict";
953
+
954
+ Object.defineProperty(exports, "__esModule", {
955
+ value: true
956
+ });
957
+ exports.default = void 0;
958
+
959
+ var _ink = require("ink");
960
+
961
+ var _react = _interopRequireWildcard(require("react"));
962
+
963
+ var _propTypes = _interopRequireDefault(require("prop-types"));
964
+
965
+ var _isCi = _interopRequireDefault(require("is-ci"));
966
+
967
+ var _Login = _interopRequireDefault(require("./Login"));
968
+
969
+ var _firestore = require("../utilities/firestore");
970
+
971
+ var _configStore = require("../utilities/configStore");
972
+
973
+ var _postToFirebaseFunction = _interopRequireDefault(require("../utilities/postToFirebaseFunction"));
974
+
975
+ var _getEnvironmentVariables = _interopRequireDefault(require("../utilities/getEnvironmentVariables"));
976
+
977
+ var _ErrorDisplay = _interopRequireDefault(require("./ErrorDisplay"));
978
+
979
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
980
+
981
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
982
+
983
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
984
+
985
+ // components
986
+ // logic
987
+ const LoginHOC = ({
988
+ children,
989
+ isInteractive = true
990
+ }) => {
991
+ const [isLoggedIn, setIsLoggedIn] = (0, _react.useState)(false);
992
+ const [isEffectDone, setEffectDone] = (0, _react.useState)(false);
993
+ const [error, setError] = (0, _react.useState)(null);
994
+ const {
995
+ isRawModeSupported
996
+ } = (0, _ink.useStdin)();
997
+
998
+ const onFailure = (message, err = {}) => {
999
+ setError({ ...err,
1000
+ message
1001
+ });
1002
+ }; // use effect for determining if tokens exist and are valid
1003
+
1004
+
1005
+ (0, _react.useEffect)(() => {
1006
+ async function isAccessTokenValid() {
1007
+ const {
1008
+ accessToken,
1009
+ email,
1010
+ jwtToken
1011
+ } = (0, _configStore.getAuthConfig)();
1012
+ let userCreds = null;
1013
+ const {
1014
+ TODESKTOP_ACCESS_TOKEN,
1015
+ TODESKTOP_EMAIL
1016
+ } = (0, _getEnvironmentVariables.default)(); // 1. attempt log in with environment variables if present
1017
+
1018
+ try {
1019
+ if (TODESKTOP_ACCESS_TOKEN && TODESKTOP_EMAIL) {
1020
+ const newJwtToken = await (0, _postToFirebaseFunction.default)("loginWithAccessToken", {
1021
+ email: TODESKTOP_EMAIL,
1022
+ accessToken: TODESKTOP_ACCESS_TOKEN
1023
+ });
1024
+
1025
+ if (newJwtToken) {
1026
+ userCreds = await (0, _firestore.signInWithCustomToken)(newJwtToken);
1027
+ if (userCreds.user) setIsLoggedIn(true);
1028
+ } // if no environment variables set and is in a CI, set alert message and exit
1029
+
1030
+ } else if (!isRawModeSupported || _isCi.default) {
1031
+ onFailure("ToDesktop environment variables not found. When automating builds with your CI provider, you need to specify environment variables for TODESKTOP_EMAIL and TODESKTOP_ACCESS_TOKEN.");
1032
+ }
1033
+ } catch (err) {
1034
+ // print error and stop the app execution if env variables attempted
1035
+ onFailure("Log in with environment variables failed.", err);
1036
+ } // 2. attempt log in with jwtToken if present
1037
+
1038
+
1039
+ try {
1040
+ if (!userCreds && jwtToken) {
1041
+ userCreds = await (0, _firestore.signInWithCustomToken)(jwtToken);
1042
+ if (userCreds.user) setIsLoggedIn(true);
1043
+ }
1044
+ } catch (err) {// do nothing, attempt login with accessToken and email
1045
+ } // 3. attempt log in with accessToken and email on disk
1046
+
1047
+
1048
+ try {
1049
+ if (!userCreds && accessToken && email) {
1050
+ const newJwtToken = await (0, _postToFirebaseFunction.default)("loginWithAccessToken", {
1051
+ email,
1052
+ accessToken
1053
+ });
1054
+
1055
+ if (newJwtToken) {
1056
+ userCreds = await (0, _firestore.signInWithCustomToken)(newJwtToken);
1057
+ (0, _configStore.setAuthConfig)(email, accessToken, newJwtToken);
1058
+ if (userCreds.user) setIsLoggedIn(true);
1059
+ }
1060
+ }
1061
+ } catch (err) {// do nothing: no error state and not logged in state means render login
1062
+ }
1063
+
1064
+ setEffectDone(true);
1065
+ }
1066
+
1067
+ isAccessTokenValid();
1068
+ }, []);
1069
+
1070
+ if (error && isInteractive) {
1071
+ return /*#__PURE__*/_react.default.createElement(_ErrorDisplay.default, {
1072
+ error: error
1073
+ });
1074
+ }
1075
+
1076
+ if (!isEffectDone) {
1077
+ return /*#__PURE__*/_react.default.createElement(_ink.Text, null, "...");
1078
+ }
1079
+
1080
+ if (!isLoggedIn && isInteractive) {
1081
+ return /*#__PURE__*/_react.default.createElement(_Login.default, {
1082
+ setIsLoggedIn: setIsLoggedIn
1083
+ });
1084
+ }
1085
+
1086
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, children);
1087
+ };
1088
+
1089
+ LoginHOC.propTypes = {
1090
+ children: _propTypes.default.object,
1091
+ isInteractive: _propTypes.default.bool
1092
+ };
1093
+ var _default = LoginHOC;
1094
+ exports.default = _default;
1095
+ },{"./Login":"../lib/components/Login.js","../utilities/firestore":"../lib/utilities/firestore.js","../utilities/configStore":"../lib/utilities/configStore.js","../utilities/postToFirebaseFunction":"../lib/utilities/postToFirebaseFunction.js","../utilities/getEnvironmentVariables":"../lib/utilities/getEnvironmentVariables.js","./ErrorDisplay":"../lib/components/ErrorDisplay.js"}],"../lib/components/ErrorBoundary.js":[function(require,module,exports) {
1096
+ "use strict";
1097
+
1098
+ Object.defineProperty(exports, "__esModule", {
1099
+ value: true
1100
+ });
1101
+ exports.default = void 0;
1102
+
1103
+ var _react = _interopRequireDefault(require("react"));
1104
+
1105
+ var Sentry = _interopRequireWildcard(require("@sentry/node"));
1106
+
1107
+ var _propTypes = _interopRequireDefault(require("prop-types"));
1108
+
1109
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
1110
+
1111
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
1112
+
1113
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1114
+
1115
+ class ErrorBoundary extends _react.default.Component {
1116
+ constructor(props) {
1117
+ super(props);
1118
+ this.state = {
1119
+ eventId: null,
1120
+ error: null
1121
+ };
1122
+ }
1123
+
1124
+ static getDerivedStateFromError(error) {
1125
+ return {
1126
+ error
1127
+ };
1128
+ }
1129
+
1130
+ componentDidCatch(error, errorInfo) {
1131
+ Sentry.withScope(scope => {
1132
+ scope.setExtras(errorInfo);
1133
+ const eventId = Sentry.captureException(error);
1134
+ this.setState({
1135
+ eventId
1136
+ });
1137
+ });
1138
+ }
1139
+
1140
+ render() {
1141
+ if (this.state.error) {
1142
+ throw this.state.error;
1143
+ }
1144
+
1145
+ return this.props.children;
1146
+ }
1147
+
1148
+ }
1149
+
1150
+ ErrorBoundary.propTypes = {
1151
+ children: _propTypes.default.object
1152
+ };
1153
+ var _default = ErrorBoundary;
1154
+ exports.default = _default;
1155
+ },{}],"../lib/components/CustomSelectInputIndicator.js":[function(require,module,exports) {
1156
+ "use strict";
1157
+
1158
+ Object.defineProperty(exports, "__esModule", {
1159
+ value: true
1160
+ });
1161
+ exports.default = void 0;
1162
+
1163
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
1164
+
1165
+ var _ink = require("ink");
1166
+
1167
+ var _propTypes = _interopRequireDefault(require("prop-types"));
1168
+
1169
+ var _react = _interopRequireDefault(require("react"));
1170
+
1171
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1172
+
1173
+ const CustomSelectInputIndicator = ({
1174
+ isSelected,
1175
+ ...props
1176
+ }) => /*#__PURE__*/_react.default.createElement(_ink.Box, (0, _extends2.default)({
1177
+ marginRight: 1
1178
+ }, props), /*#__PURE__*/_react.default.createElement(_ink.Text, null, isSelected ? process.platform === "win32" ? ">" : "❯" : " "));
1179
+
1180
+ CustomSelectInputIndicator.propTypes = {
1181
+ isSelected: _propTypes.default.bool.isRequired
1182
+ };
1183
+ var _default = CustomSelectInputIndicator;
1184
+ exports.default = _default;
1185
+ },{}],"../lib/components/CustomSelectInputItem.js":[function(require,module,exports) {
1186
+ "use strict";
1187
+
1188
+ Object.defineProperty(exports, "__esModule", {
1189
+ value: true
1190
+ });
1191
+ exports.default = void 0;
1192
+
1193
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
1194
+
1195
+ var _ink = require("ink");
1196
+
1197
+ var _propTypes = _interopRequireDefault(require("prop-types"));
1198
+
1199
+ var _react = _interopRequireDefault(require("react"));
1200
+
1201
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1202
+
1203
+ const CustomSelectInputItem = ({
1204
+ isSelected,
1205
+ label,
1206
+ ...props
1207
+ }) => /*#__PURE__*/_react.default.createElement(_ink.Text, (0, _extends2.default)({
1208
+ bold: isSelected,
1209
+ color: isSelected ? undefined : "gray"
1210
+ }, props), label);
1211
+
1212
+ CustomSelectInputItem.propTypes = {
1213
+ isSelected: _propTypes.default.bool.isRequired,
1214
+ label: _propTypes.default.string.isRequired
1215
+ };
1216
+ var _default = CustomSelectInputItem;
1217
+ exports.default = _default;
1218
+ },{}],"../lib/utilities/getBuildById.js":[function(require,module,exports) {
1219
+ "use strict";
1220
+
1221
+ Object.defineProperty(exports, "__esModule", {
1222
+ value: true
1223
+ });
1224
+ exports.default = void 0;
1225
+
1226
+ var _firestore = _interopRequireWildcard(require("./firestore"));
1227
+
1228
+ var _logger = _interopRequireDefault(require("./logger"));
1229
+
1230
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1231
+
1232
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
1233
+
1234
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
1235
+
1236
+ var _default = async ({
1237
+ appId,
1238
+ buildId
1239
+ }) => {
1240
+ _logger.default.debug({
1241
+ appId,
1242
+ buildId
1243
+ }, "getBuildById");
1244
+
1245
+ const snapshot = await _firestore.default.doc(`users/${(0, _firestore.currentUser)().uid}/applications/${appId}/builds/${buildId}`).get();
1246
+
1247
+ if (!snapshot.exists) {
1248
+ return null;
1249
+ }
1250
+
1251
+ return snapshot.data();
1252
+ };
1253
+
1254
+ exports.default = _default;
1255
+ },{"./firestore":"../lib/utilities/firestore.js","./logger":"../lib/utilities/logger.js"}],"../lib/utilities/getCallableFirebaseFunction.js":[function(require,module,exports) {
1256
+ "use strict";
1257
+
1258
+ Object.defineProperty(exports, "__esModule", {
1259
+ value: true
1260
+ });
1261
+ exports.default = void 0;
1262
+
1263
+ var firebase = _interopRequireWildcard(require("firebase/app"));
1264
+
1265
+ require("firebase/functions");
1266
+
1267
+ var _getEnvironmentVariables = _interopRequireDefault(require("./getEnvironmentVariables"));
1268
+
1269
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1270
+
1271
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
1272
+
1273
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
1274
+
1275
+ if ((0, _getEnvironmentVariables.default)().TODESKTOP_CLI_ENV === "development") {
1276
+ firebase.functions().useFunctionsEmulator("http://localhost:5000");
1277
+ }
1278
+
1279
+ var _default = functionName => firebase.functions().httpsCallable(functionName);
1280
+
1281
+ exports.default = _default;
1282
+ },{"./getEnvironmentVariables":"../lib/utilities/getEnvironmentVariables.js"}],"../lib/utilities/getLatestBuildId.js":[function(require,module,exports) {
1283
+ "use strict";
1284
+
1285
+ Object.defineProperty(exports, "__esModule", {
1286
+ value: true
1287
+ });
1288
+ exports.default = void 0;
1289
+
1290
+ var _firestore = _interopRequireWildcard(require("./firestore"));
1291
+
1292
+ var _logger = _interopRequireDefault(require("./logger"));
1293
+
1294
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1295
+
1296
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
1297
+
1298
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
1299
+
1300
+ var _default = async ({
1301
+ appId
1302
+ }) => {
1303
+ _logger.default.debug({
1304
+ appId
1305
+ }, "getLatestBuildId");
1306
+
1307
+ const appRef = _firestore.default.doc(`users/${(0, _firestore.currentUser)().uid}/applications/${appId}`);
1308
+
1309
+ const appSnapshot = await appRef.get();
1310
+
1311
+ if (!appSnapshot.exists) {
1312
+ throw new Error(`Application with ID of ${appId} doesn't exist.`);
1313
+ }
1314
+
1315
+ const buildsResult = await appRef.collection("builds").orderBy("createdAt", "desc").limit(1).get();
1316
+
1317
+ if (buildsResult.empty) {
1318
+ return null;
1319
+ } else {
1320
+ return buildsResult.docs[0].id;
1321
+ }
1322
+ };
1323
+
1324
+ exports.default = _default;
1325
+ },{"./firestore":"../lib/utilities/firestore.js","./logger":"../lib/utilities/logger.js"}],"../lib/utilities/projectConfig/loadConfig.js":[function(require,module,exports) {
1326
+ "use strict";
1327
+
1328
+ Object.defineProperty(exports, "__esModule", {
1329
+ value: true
1330
+ });
1331
+ exports.default = void 0;
1332
+
1333
+ // This is its own file just so we can mock it more easily
1334
+ var _default = configPath => require(configPath);
1335
+
1336
+ exports.default = _default;
1337
+ },{}],"../lib/utilities/projectConfig/resolveConfigPaths.js":[function(require,module,exports) {
1338
+ "use strict";
1339
+
1340
+ Object.defineProperty(exports, "__esModule", {
1341
+ value: true
1342
+ });
1343
+ exports.default = void 0;
1344
+
1345
+ var path = _interopRequireWildcard(require("path"));
1346
+
1347
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
1348
+
1349
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
1350
+
1351
+ var _default = ({
1352
+ config,
1353
+ projectRoot
1354
+ }) => {
1355
+ const appRoot = config.appPath ? path.isAbsolute(config.appPath) ? config.appPath : path.join(projectRoot, config.appPath) : projectRoot;
1356
+
1357
+ const transformIfExists = (value, transformer) => value ? transformer(value) : undefined;
1358
+
1359
+ const resolvePath = filePath => path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath);
1360
+
1361
+ const result = { ...config,
1362
+ appPath: appRoot,
1363
+ icon: resolvePath(config.icon)
1364
+ };
1365
+
1366
+ if (config.extraContentFiles) {
1367
+ result.extraContentFiles = transformIfExists(config.extraContentFiles, extraContentFiles => extraContentFiles.map(extraContentFile => ({ ...extraContentFile,
1368
+ from: resolvePath(extraContentFile.from)
1369
+ })));
1370
+ }
1371
+
1372
+ if (config.extraResources) {
1373
+ result.extraResources = transformIfExists(config.extraResources, extraResources => extraResources.map(extraResource => ({ ...extraResource,
1374
+ from: resolvePath(extraResource.from)
1375
+ })));
1376
+ }
1377
+
1378
+ if (config.linux) {
1379
+ result.linux = { ...config.linux
1380
+ };
1381
+
1382
+ if (config.linux.icon) {
1383
+ result.linux.icon = resolvePath(config.linux.icon);
1384
+ }
1385
+ }
1386
+
1387
+ if (config.mac) {
1388
+ result.mac = { ...config.mac
1389
+ };
1390
+
1391
+ if (config.mac.entitlements) {
1392
+ result.mac.entitlements = resolvePath(config.mac.entitlements);
1393
+ }
1394
+
1395
+ if (config.mac.icon) {
1396
+ result.mac.icon = resolvePath(config.mac.icon);
1397
+ }
1398
+ }
1399
+
1400
+ if (config.dmg) {
1401
+ if (config.dmg.background) {
1402
+ result.dmg.background = resolvePath(config.dmg.background);
1403
+ }
1404
+ }
1405
+
1406
+ if (config.windows) {
1407
+ result.windows = { ...config.windows
1408
+ };
1409
+
1410
+ if (config.windows.icon) {
1411
+ result.windows.icon = resolvePath(config.windows.icon);
1412
+ }
1413
+ }
1414
+
1415
+ return result;
1416
+ };
1417
+
1418
+ exports.default = _default;
1419
+ },{}],"../lib/utilities/projectConfig/schema/packageJSON.js":[function(require,module,exports) {
1420
+ "use strict";
1421
+
1422
+ Object.defineProperty(exports, "__esModule", {
1423
+ value: true
1424
+ });
1425
+ exports.default = void 0;
1426
+
1427
+ var _default = context => {
1428
+ return {
1429
+ type: "object",
1430
+ required: ["author", "dependencies", "devDependencies", "homepage", "name", "version"],
1431
+ properties: {
1432
+ author: {
1433
+ npmAuthor: {}
1434
+ },
1435
+ dependencies: {
1436
+ type: "object",
1437
+ required: ["@todesktop/runtime"],
1438
+ // custom keyword that checks package names aren't included in dependencies
1439
+ excludedDependencies: {
1440
+ dependencyKey: "dependencies",
1441
+ blacklist: ["@todesktop/cli"]
1442
+ },
1443
+ properties: {
1444
+ "@todesktop/runtime": {
1445
+ type: "string"
1446
+ }
1447
+ }
1448
+ },
1449
+ devDependencies: {
1450
+ type: "object",
1451
+ required: ["electron"],
1452
+ properties: {
1453
+ electron: {
1454
+ type: "string",
1455
+ semanticVersion: {
1456
+ packageName: "electron",
1457
+ mustBeExact: true
1458
+ }
1459
+ }
1460
+ }
1461
+ },
1462
+ name: {
1463
+ type: "string",
1464
+ minLength: 1
1465
+ },
1466
+ scripts: {
1467
+ type: "object",
1468
+ properties: {
1469
+ "todesktop:beforeInstall": {
1470
+ type: "string",
1471
+ file: {
1472
+ from: context.projectRoot,
1473
+ mustBeFile: true
1474
+ }
1475
+ },
1476
+ "todesktop:afterPack": {
1477
+ type: "string",
1478
+ file: {
1479
+ from: context.projectRoot,
1480
+ mustBeFile: true
1481
+ }
1482
+ }
1483
+ }
1484
+ },
1485
+ version: {
1486
+ type: "string",
1487
+ semanticVersion: {}
1488
+ }
1489
+ }
1490
+ };
1491
+ };
1492
+
1493
+ exports.default = _default;
1494
+ },{}],"../lib/utilities/projectConfig/validatePackageJSON.js":[function(require,module,exports) {
1495
+ "use strict";
1496
+
1497
+ Object.defineProperty(exports, "__esModule", {
1498
+ value: true
1499
+ });
1500
+ exports.default = void 0;
1501
+
1502
+ var _ajv = _interopRequireDefault(require("ajv"));
1503
+
1504
+ var _betterAjvErrors = _interopRequireDefault(require("better-ajv-errors"));
1505
+
1506
+ var _addCustomKeywords = _interopRequireDefault(require("./addCustomKeywords"));
1507
+
1508
+ var _packageJSON = _interopRequireDefault(require("./schema/packageJSON"));
1509
+
1510
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1511
+
1512
+ var _default = (pkg, pkgPath, context) => {
1513
+ const ajv = new _ajv.default({
1514
+ allErrors: true,
1515
+ jsonPointers: true
1516
+ });
1517
+ (0, _addCustomKeywords.default)(ajv, context);
1518
+ const schema = (0, _packageJSON.default)(context);
1519
+ const validate = ajv.compile(schema);
1520
+
1521
+ if (!validate(pkg)) {
1522
+ const output = (0, _betterAjvErrors.default)(schema, pkg, validate.errors, {
1523
+ indent: 2
1524
+ });
1525
+ const error = new Error(`package.json invalid (${pkgPath}); \n${output}`);
1526
+ error.isValidationError = true; // This throws and bubbles all the way up to the user
1527
+
1528
+ throw error;
1529
+ }
1530
+ };
1531
+
1532
+ exports.default = _default;
1533
+ },{"./addCustomKeywords":"../lib/utilities/projectConfig/addCustomKeywords.js","./schema/packageJSON":"../lib/utilities/projectConfig/schema/packageJSON.js"}],"../lib/utilities/projectConfig/addCustomKeywords.js":[function(require,module,exports) {
1534
+ "use strict";
1535
+
1536
+ Object.defineProperty(exports, "__esModule", {
1537
+ value: true
1538
+ });
1539
+ exports.default = void 0;
1540
+
1541
+ var _emailRegex = _interopRequireDefault(require("email-regex"));
1542
+
1543
+ var fs = _interopRequireWildcard(require("fs"));
1544
+
1545
+ var path = _interopRequireWildcard(require("path"));
1546
+
1547
+ var _parseAuthor = _interopRequireDefault(require("parse-author"));
1548
+
1549
+ var semver = _interopRequireWildcard(require("semver"));
1550
+
1551
+ var _validatePackageJSON = _interopRequireDefault(require("./validatePackageJSON"));
1552
+
1553
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
1554
+
1555
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
1556
+
1557
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1558
+
1559
+ /*
1560
+ See https://ajv.js.org/custom.html
1561
+ */
1562
+ var _default = (ajv, context) => {
1563
+ // validate that dependencies object doesn't contain packageNames in the blacklist
1564
+ ajv.addKeyword("excludedDependencies", {
1565
+ validate: function validate(schema, data) {
1566
+ let matchingPackages = schema.blacklist.filter(packageName => data[packageName]);
1567
+
1568
+ if (matchingPackages.length) {
1569
+ validate.errors = [{
1570
+ keyword: "Dependency",
1571
+ message: `${matchingPackages.join(", ")} should not be in ${schema.dependencyKey}`,
1572
+ dataPath: `/${schema.dependencyKey}`
1573
+ }];
1574
+ return false;
1575
+ }
1576
+
1577
+ return true;
1578
+ }
1579
+ });
1580
+ ajv.addKeyword("email", {
1581
+ type: "string",
1582
+ minLength: 5,
1583
+ validate: function validate(schema, data) {
1584
+ if (!(0, _emailRegex.default)({
1585
+ exact: true
1586
+ }).test(data)) {
1587
+ validate.errors = [{
1588
+ keyword: "email",
1589
+ message: "invalid"
1590
+ }];
1591
+ return false;
1592
+ }
1593
+
1594
+ return true;
1595
+ }
1596
+ });
1597
+ ajv.addKeyword("file", {
1598
+ type: "string",
1599
+ validate: function validate(schema, data) {
1600
+ const mustBeDirectory = schema.mustBeDirectory || schema.mustBeElectronApp; // Value is empty
1601
+
1602
+ if (!data.trim().length) {
1603
+ if (schema.isOptional) {
1604
+ return true;
1605
+ }
1606
+
1607
+ validate.errors = [{
1608
+ keyword: schema.mustBeDirectory ? "Directory" : "File",
1609
+ message: "is empty"
1610
+ }];
1611
+ return false;
1612
+ }
1613
+
1614
+ const filePath = path.isAbsolute(data) ? data : path.join(schema.from, data); // Isn't in project
1615
+
1616
+ if (path.relative(schema.from, filePath).startsWith("..")) {
1617
+ validate.errors = [{
1618
+ keyword: mustBeDirectory ? "Directory" : "File",
1619
+ message: `is not in project (${filePath})`
1620
+ }];
1621
+ return false;
1622
+ } // Extension isn't allowed
1623
+
1624
+
1625
+ if (schema.extensions && !schema.extensions.includes(path.extname(filePath).substr(1))) {
1626
+ validate.errors = [{
1627
+ keyword: "File extension",
1628
+ message: `invalid. ${path.extname(data)} Must be${schema.extensions > 1 ? "one of the following:" : ""} "${schema.extensions.join('", "')}"`
1629
+ }];
1630
+ return false;
1631
+ } // Doesn't exist
1632
+
1633
+
1634
+ if (!fs.existsSync(filePath)) {
1635
+ validate.errors = [{
1636
+ keyword: mustBeDirectory ? "Directory" : "File",
1637
+ message: `does not exist (${filePath})`
1638
+ }];
1639
+ return false;
1640
+ }
1641
+
1642
+ const stats = fs.statSync(filePath);
1643
+
1644
+ if (mustBeDirectory && stats.isFile()) {
1645
+ validate.errors = [{
1646
+ keyword: "Directory",
1647
+ message: `must be a directory, not a file (${filePath})`
1648
+ }];
1649
+ return false;
1650
+ } else if (schema.mustBeFile && stats.isDirectory()) {
1651
+ validate.errors = [{
1652
+ keyword: "File",
1653
+ message: `must be a file, not a directory (${filePath})`
1654
+ }];
1655
+ return false;
1656
+ }
1657
+
1658
+ if (schema.mustBeElectronApp) {
1659
+ const appRoot = path.resolve(filePath);
1660
+ const pkgPath = path.join(appRoot, "package.json");
1661
+
1662
+ if (!fs.existsSync(pkgPath)) {
1663
+ validate.errors = [{
1664
+ keyword: "App",
1665
+ message: `invalid. There is no package.json at ${pkgPath}`
1666
+ }];
1667
+ return false;
1668
+ }
1669
+
1670
+ let pkg;
1671
+
1672
+ try {
1673
+ pkg = require(pkgPath);
1674
+ } catch (e) {
1675
+ validate.errors = [{
1676
+ keyword: "App",
1677
+ message: `invalid. Invalid JSON in package.json (${pkgPath})`
1678
+ }];
1679
+ return false;
1680
+ }
1681
+
1682
+ context.projectRoot = appRoot; // This throws and bubbles all the way up to the user
1683
+
1684
+ (0, _validatePackageJSON.default)(pkg, pkgPath, context); // Validate that either an index.js or valid "main" property exists
1685
+
1686
+ const mainFilePath = pkg.main;
1687
+
1688
+ if (mainFilePath) {
1689
+ const resolvedMainFilePath = path.join(appRoot, mainFilePath);
1690
+
1691
+ if (!fs.existsSync(resolvedMainFilePath)) {
1692
+ validate.errors = [{
1693
+ keyword: "App",
1694
+ message: `invalid. The "main" file specified in your package.json (${mainFilePath}) does not exist (${resolvedMainFilePath})`
1695
+ }];
1696
+ return false;
1697
+ }
1698
+ } else {
1699
+ if (!fs.existsSync(path.join(appRoot, "index.js"))) {
1700
+ validate.errors = [{
1701
+ keyword: "App",
1702
+ message: 'invalid. There is neither a "main" property in your package.json nor an index.js at the root of your app'
1703
+ }];
1704
+ return false;
1705
+ }
1706
+ }
1707
+ }
1708
+
1709
+ return true;
1710
+ },
1711
+ errors: true
1712
+ });
1713
+ ajv.addKeyword("npmAuthor", {
1714
+ validate: function validate(schema, data) {
1715
+ const dataType = typeof data;
1716
+
1717
+ if (dataType === "undefined") {
1718
+ return true;
1719
+ } else if (dataType === "string") {
1720
+ const parsedAuthor = (0, _parseAuthor.default)(data);
1721
+
1722
+ if (!parsedAuthor || !parsedAuthor.email) {
1723
+ validate.errors = [{
1724
+ keyword: "author",
1725
+ message: 'invalid. If you\'re using a string, it must look something like "Barney Rubble <b@rubble.com>", see https://docs.npmjs.com/files/package.json#people-fields-author-contributors'
1726
+ }];
1727
+ return false;
1728
+ }
1729
+ } else if (dataType === "object") {
1730
+ if (typeof data.name === "undefined") {
1731
+ validate.errors = [{
1732
+ keyword: "author",
1733
+ message: `invalid. "name" property is missing.`
1734
+ }];
1735
+ return false;
1736
+ } else {
1737
+ if (typeof data.name !== "string") {
1738
+ validate.errors = [{
1739
+ keyword: "author",
1740
+ message: `.name invalid. It must be a string`
1741
+ }];
1742
+ return false;
1743
+ }
1744
+
1745
+ if (typeof data.email === "undefined") {
1746
+ validate.errors = [{
1747
+ keyword: "author",
1748
+ message: `invalid. "email" property is missing.`
1749
+ }];
1750
+ return false;
1751
+ } else {
1752
+ if (typeof data.email === "string") {
1753
+ if (!(0, _emailRegex.default)({
1754
+ exact: true
1755
+ }).test(data.email)) {
1756
+ validate.errors = [{
1757
+ keyword: "author",
1758
+ message: `.email invalid. It does not look like an email.`
1759
+ }];
1760
+ return false;
1761
+ }
1762
+ } else {
1763
+ validate.errors = [{
1764
+ keyword: "author",
1765
+ message: `.email invalid. It must be a string.`
1766
+ }];
1767
+ return false;
1768
+ }
1769
+ }
1770
+ }
1771
+ } else {
1772
+ // Neither object nor string
1773
+ validate.errors = [{
1774
+ keyword: "author",
1775
+ message: "invalid. It must either be an object or string. See https://docs.npmjs.com/files/package.json#people-fields-author-contributors"
1776
+ }];
1777
+ return false;
1778
+ }
1779
+
1780
+ return true;
1781
+ },
1782
+ errors: true
1783
+ });
1784
+ ajv.addKeyword("semanticVersion", {
1785
+ type: "string",
1786
+ minLength: 5,
1787
+ validate: function validate(schema, data) {
1788
+ const keyword = (schema.packageName ? `${schema.packageName} ` : "") + "version";
1789
+
1790
+ if (!(semver.valid(data) || semver.validRange(data))) {
1791
+ validate.errors = [{
1792
+ keyword,
1793
+ message: "invalid. It must be a semantic version (see https://semver.org/)"
1794
+ }];
1795
+ return false;
1796
+ }
1797
+
1798
+ if (schema.mustBeExact && (data.startsWith("~") || data.startsWith("^"))) {
1799
+ validate.errors = [{
1800
+ keyword,
1801
+ message: "invalid. It must be an exact version. Good: 9.0.0. Bad: ^9.0.0"
1802
+ }];
1803
+ return false;
1804
+ }
1805
+
1806
+ return true;
1807
+ }
1808
+ });
1809
+ };
1810
+
1811
+ exports.default = _default;
1812
+ },{"./validatePackageJSON":"../lib/utilities/projectConfig/validatePackageJSON.js"}],"../lib/utilities/projectConfig/schema/full.js":[function(require,module,exports) {
1813
+ "use strict";
1814
+
1815
+ Object.defineProperty(exports, "__esModule", {
1816
+ value: true
1817
+ });
1818
+ exports.default = void 0;
1819
+
1820
+ const getItemOrArrayOfItemsSchema = itemSchema => {
1821
+ return {
1822
+ oneOf: [itemSchema, {
1823
+ type: "array",
1824
+ items: itemSchema
1825
+ }]
1826
+ };
1827
+ };
1828
+
1829
+ var _default = context => {
1830
+ const getIconSchema = (additionalAllowedExtensions = []) => {
1831
+ return {
1832
+ type: "string",
1833
+ file: {
1834
+ from: context.projectRoot,
1835
+ extensions: ["icns", "png", ...additionalAllowedExtensions],
1836
+ mustBeFile: true
1837
+ },
1838
+ minLength: 3
1839
+ };
1840
+ };
1841
+
1842
+ return {
1843
+ type: "object",
1844
+ required: ["id", "icon", "schemaVersion"],
1845
+ properties: {
1846
+ appId: {
1847
+ type: "string",
1848
+ minLength: 1
1849
+ },
1850
+ appFiles: {
1851
+ type: "array",
1852
+ items: {
1853
+ type: "string",
1854
+ minLength: 1
1855
+ },
1856
+ minItems: 1
1857
+ },
1858
+ appProtocolScheme: {
1859
+ type: "string",
1860
+ minLength: 1
1861
+ },
1862
+ appPath: {
1863
+ type: "string",
1864
+ file: {
1865
+ from: context.projectRoot,
1866
+ isOptional: true,
1867
+ mustBeElectronApp: true
1868
+ }
1869
+ },
1870
+ copyright: {
1871
+ type: "string",
1872
+ minLength: 1
1873
+ },
1874
+ electronMirror: {
1875
+ type: "string",
1876
+ format: "uri"
1877
+ },
1878
+ electronVersion: {
1879
+ type: "string",
1880
+ minLength: 1
1881
+ },
1882
+ extraContentFiles: {
1883
+ type: "array",
1884
+ items: {
1885
+ type: "object",
1886
+ required: ["from"],
1887
+ properties: {
1888
+ from: {
1889
+ type: "string",
1890
+ file: {
1891
+ from: context.projectRoot
1892
+ }
1893
+ },
1894
+ to: {
1895
+ type: "string"
1896
+ }
1897
+ }
1898
+ }
1899
+ },
1900
+ extraResources: {
1901
+ type: "array",
1902
+ items: {
1903
+ type: "object",
1904
+ required: ["from"],
1905
+ properties: {
1906
+ from: {
1907
+ type: "string",
1908
+ file: {
1909
+ from: context.projectRoot
1910
+ }
1911
+ },
1912
+ to: {
1913
+ type: "string"
1914
+ }
1915
+ }
1916
+ }
1917
+ },
1918
+ fileAssociations: {
1919
+ type: "array",
1920
+ items: {
1921
+ type: "object",
1922
+ required: ["ext"],
1923
+ properties: {
1924
+ ext: getItemOrArrayOfItemsSchema({
1925
+ type: "string",
1926
+ minLength: 1
1927
+ }),
1928
+ description: {
1929
+ type: "string",
1930
+ minLength: 1
1931
+ },
1932
+ name: {
1933
+ type: "string",
1934
+ minLength: 1
1935
+ },
1936
+ mimeType: {
1937
+ type: "string",
1938
+ minLength: 1
1939
+ },
1940
+ icon: {
1941
+ type: "string",
1942
+ minLength: 1
1943
+ },
1944
+ role: {
1945
+ type: "string",
1946
+ minLength: 1
1947
+ },
1948
+ isPackage: {
1949
+ type: "boolean"
1950
+ },
1951
+ rank: {
1952
+ type: "string",
1953
+ minLength: 1
1954
+ }
1955
+ }
1956
+ },
1957
+ minItems: 1
1958
+ },
1959
+ filesForDistribution: {
1960
+ type: "array",
1961
+ items: {
1962
+ type: "string",
1963
+ minLength: 1
1964
+ },
1965
+ minItems: 1
1966
+ },
1967
+ icon: getIconSchema(),
1968
+ linux: {
1969
+ properties: {
1970
+ category: {
1971
+ type: "string",
1972
+ minLength: 1
1973
+ },
1974
+ icon: getIconSchema()
1975
+ }
1976
+ },
1977
+ id: {
1978
+ type: "string",
1979
+ minLength: 1
1980
+ },
1981
+ mac: {
1982
+ properties: {
1983
+ category: {
1984
+ type: "string",
1985
+ minLength: 1
1986
+ },
1987
+ additionalBinariesToSign: {
1988
+ type: "array",
1989
+ items: {
1990
+ type: "string",
1991
+ minLength: 1
1992
+ }
1993
+ },
1994
+ entitlements: {
1995
+ type: "string",
1996
+ file: {
1997
+ from: context.projectRoot,
1998
+ extensions: ["plist"],
1999
+ mustBeFile: true
2000
+ },
2001
+ minLength: 1
2002
+ },
2003
+ extendInfo: {
2004
+ type: "object"
2005
+ },
2006
+ icon: getIconSchema()
2007
+ }
2008
+ },
2009
+ dmg: {
2010
+ properties: {
2011
+ background: {
2012
+ type: "string",
2013
+ file: {
2014
+ from: context.projectRoot,
2015
+ extensions: ["tiff"],
2016
+ mustBeFile: true
2017
+ },
2018
+ minLength: 1
2019
+ },
2020
+ artifactName: {
2021
+ type: "string",
2022
+ minLength: 1
2023
+ },
2024
+ backgroundColor: {
2025
+ type: "string",
2026
+ minLength: 1
2027
+ },
2028
+ iconSize: {
2029
+ type: "number"
2030
+ },
2031
+ iconTextSize: {
2032
+ type: "number"
2033
+ },
2034
+ title: {
2035
+ type: "string",
2036
+ minLength: 1
2037
+ },
2038
+ contents: {
2039
+ type: "array",
2040
+ items: {
2041
+ type: "object",
2042
+ properties: {
2043
+ x: {
2044
+ type: "number"
2045
+ },
2046
+ y: {
2047
+ type: "number"
2048
+ }
2049
+ }
2050
+ }
2051
+ },
2052
+ window: {
2053
+ type: "object",
2054
+ properties: {
2055
+ x: {
2056
+ type: "number"
2057
+ },
2058
+ y: {
2059
+ type: "number"
2060
+ },
2061
+ width: {
2062
+ type: "number"
2063
+ },
2064
+ height: {
2065
+ type: "number"
2066
+ }
2067
+ }
2068
+ }
2069
+ }
2070
+ },
2071
+ schemaVersion: {
2072
+ type: "number",
2073
+ minimum: 1,
2074
+ maximum: 1
2075
+ },
2076
+ snap: {
2077
+ properties: {
2078
+ after: {
2079
+ type: "array",
2080
+ items: {
2081
+ type: "string",
2082
+ minLength: 1
2083
+ }
2084
+ },
2085
+ appPartStage: {
2086
+ type: "array",
2087
+ items: {
2088
+ type: "string",
2089
+ minLength: 1
2090
+ }
2091
+ },
2092
+ assumes: getItemOrArrayOfItemsSchema({
2093
+ type: "string",
2094
+ minLength: 1
2095
+ }),
2096
+ autoStart: {
2097
+ type: "boolean"
2098
+ },
2099
+ buildPackages: {
2100
+ type: "array",
2101
+ items: {
2102
+ type: "string",
2103
+ minLength: 1
2104
+ }
2105
+ },
2106
+ confinement: {
2107
+ type: "string",
2108
+ enum: ["classic", "devmode", "strict"]
2109
+ },
2110
+ environment: {
2111
+ type: "object"
2112
+ },
2113
+ grade: {
2114
+ type: "string",
2115
+ enum: ["devel", "stable"]
2116
+ },
2117
+ layout: {
2118
+ type: "object"
2119
+ },
2120
+ plugs: {
2121
+ type: "array",
2122
+ items: {
2123
+ anyOf: [{
2124
+ type: "string",
2125
+ minLength: 1
2126
+ }, {
2127
+ type: "object"
2128
+ }]
2129
+ }
2130
+ },
2131
+ stagePackages: {
2132
+ type: "array",
2133
+ items: {
2134
+ type: "string",
2135
+ minLength: 1
2136
+ }
2137
+ },
2138
+ summary: {
2139
+ type: "string",
2140
+ maxLength: 78
2141
+ },
2142
+ useTemplateApp: {
2143
+ type: "boolean"
2144
+ }
2145
+ }
2146
+ },
2147
+ uploadSizeLimit: {
2148
+ type: "number"
2149
+ },
2150
+ windows: {
2151
+ properties: {
2152
+ icon: getIconSchema(["ico"])
2153
+ }
2154
+ }
2155
+ }
2156
+ };
2157
+ };
2158
+
2159
+ exports.default = _default;
2160
+ },{}],"../lib/utilities/projectConfig/validateConfig.js":[function(require,module,exports) {
2161
+ "use strict";
2162
+
2163
+ Object.defineProperty(exports, "__esModule", {
2164
+ value: true
2165
+ });
2166
+ exports.default = void 0;
2167
+
2168
+ var _ajv = _interopRequireDefault(require("ajv"));
2169
+
2170
+ var _betterAjvErrors = _interopRequireDefault(require("better-ajv-errors"));
2171
+
2172
+ var _addCustomKeywords = _interopRequireDefault(require("./addCustomKeywords"));
2173
+
2174
+ var _full = _interopRequireDefault(require("./schema/full"));
2175
+
2176
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2177
+
2178
+ var _default = ({
2179
+ config,
2180
+ projectRoot
2181
+ }) => {
2182
+ const context = {
2183
+ projectRoot
2184
+ };
2185
+ const schema = (0, _full.default)(context);
2186
+ const ajv = new _ajv.default({
2187
+ allErrors: true,
2188
+ jsonPointers: true
2189
+ });
2190
+ (0, _addCustomKeywords.default)(ajv, context);
2191
+ const validate = ajv.compile(schema);
2192
+
2193
+ if (!validate(config)) {
2194
+ const output = (0, _betterAjvErrors.default)(schema, config, validate.errors, {
2195
+ indent: 2
2196
+ });
2197
+ throw new Error(`todesktop.json invalid. \nLearn more here: https://www.npmjs.com/package/@todesktop/cli#project-configuration-todesktopjson \n\n${output}`);
2198
+ }
2199
+
2200
+ if (config.productName) {
2201
+ throw new Error(`todesktop.json invalid.
2202
+
2203
+ The "productName" property is no longer supported in todesktop.json. Please remove it and add it to your app's package.json instead.
2204
+
2205
+ We made this change because Electron also uses the "productName" if it exists in your app's package.json. If you do not add it to your package.json, your app name will default to the value of the "name" property in your package.json.`);
2206
+ }
2207
+ };
2208
+
2209
+ exports.default = _default;
2210
+ },{"./addCustomKeywords":"../lib/utilities/projectConfig/addCustomKeywords.js","./schema/full":"../lib/utilities/projectConfig/schema/full.js"}],"../lib/utilities/projectConfig/getProjectConfig.js":[function(require,module,exports) {
2211
+ "use strict";
2212
+
2213
+ Object.defineProperty(exports, "__esModule", {
2214
+ value: true
2215
+ });
2216
+ exports.default = void 0;
2217
+
2218
+ var _path = require("path");
2219
+
2220
+ var _findUp = _interopRequireDefault(require("find-up"));
2221
+
2222
+ var _loadConfig = _interopRequireDefault(require("./loadConfig"));
2223
+
2224
+ var _resolveConfigPaths = _interopRequireDefault(require("./resolveConfigPaths"));
2225
+
2226
+ var _validateConfig = _interopRequireDefault(require("./validateConfig"));
2227
+
2228
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2229
+
2230
+ var _default = () => {
2231
+ const configPath = _findUp.default.sync("todesktop.json");
2232
+
2233
+ if (!configPath) {
2234
+ throw new Error("Can not find todesktop.json in this folder or any parent folders");
2235
+ }
2236
+
2237
+ const projectRoot = (0, _path.dirname)(configPath); // This will throw if it's not valid JSON
2238
+
2239
+ const config = (0, _loadConfig.default)(configPath);
2240
+ config.appPath = config.appPath || "."; // This will throw if invalid
2241
+
2242
+ (0, _validateConfig.default)({
2243
+ config,
2244
+ projectRoot
2245
+ });
2246
+ const result = (0, _resolveConfigPaths.default)({
2247
+ config,
2248
+ projectRoot
2249
+ });
2250
+ return {
2251
+ config: result,
2252
+ unprocessedConfig: config,
2253
+ projectRoot
2254
+ };
2255
+ };
2256
+
2257
+ exports.default = _default;
2258
+ },{"./loadConfig":"../lib/utilities/projectConfig/loadConfig.js","./resolveConfigPaths":"../lib/utilities/projectConfig/resolveConfigPaths.js","./validateConfig":"../lib/utilities/projectConfig/validateConfig.js"}],"../lib/utilities/logForCI.js":[function(require,module,exports) {
2259
+ "use strict";
2260
+
2261
+ Object.defineProperty(exports, "__esModule", {
2262
+ value: true
2263
+ });
2264
+ exports.default = void 0;
2265
+
2266
+ var _isCi = _interopRequireDefault(require("is-ci"));
2267
+
2268
+ var _logger = _interopRequireDefault(require("./logger"));
2269
+
2270
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2271
+
2272
+ var _default = (...args) => {
2273
+ _logger.default.info({
2274
+ args
2275
+ }, "logForCI");
2276
+
2277
+ if (!_isCi.default) {
2278
+ return;
2279
+ }
2280
+
2281
+ console.log(...args);
2282
+ };
2283
+
2284
+ exports.default = _default;
2285
+ },{"./logger":"../lib/utilities/logger.js"}],"../lib/components/ReleaseBuild.js":[function(require,module,exports) {
2286
+ "use strict";
2287
+
2288
+ Object.defineProperty(exports, "__esModule", {
2289
+ value: true
2290
+ });
2291
+ exports.default = void 0;
2292
+
2293
+ var _ink = require("ink");
2294
+
2295
+ var _inkLink = _interopRequireDefault(require("ink-link"));
2296
+
2297
+ var _inkSelectInput = _interopRequireDefault(require("ink-select-input"));
2298
+
2299
+ var _propTypes = _interopRequireDefault(require("prop-types"));
2300
+
2301
+ var _react = _interopRequireWildcard(require("react"));
2302
+
2303
+ var _CustomSelectInputIndicator = _interopRequireDefault(require("./CustomSelectInputIndicator"));
2304
+
2305
+ var _CustomSelectInputItem = _interopRequireDefault(require("./CustomSelectInputItem"));
2306
+
2307
+ var _ErrorDisplay = _interopRequireDefault(require("./ErrorDisplay"));
2308
+
2309
+ var _getBuildById = _interopRequireDefault(require("../utilities/getBuildById"));
2310
+
2311
+ var _getCallableFirebaseFunction = _interopRequireDefault(require("../utilities/getCallableFirebaseFunction"));
2312
+
2313
+ var _getLatestBuildId = _interopRequireDefault(require("../utilities/getLatestBuildId"));
2314
+
2315
+ var _getProjectConfig = _interopRequireDefault(require("../utilities/projectConfig/getProjectConfig"));
2316
+
2317
+ var _logForCI = _interopRequireDefault(require("../utilities/logForCI"));
2318
+
2319
+ var _useExit = _interopRequireDefault(require("../utilities/useExit"));
2320
+
2321
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
2322
+
2323
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
2324
+
2325
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2326
+
2327
+ const getValidationErrorMessageDisplay = (build, validationMessage) => {
2328
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, {
2329
+ flexDirection: "column"
2330
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, {
2331
+ bold: true,
2332
+ color: "red"
2333
+ }, "Can't release ", build.appName, " v", build.appVersion), /*#__PURE__*/_react.default.createElement(_ink.Box, {
2334
+ marginBottom: 1,
2335
+ marginTop: 1
2336
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, null, validationMessage)), /*#__PURE__*/_react.default.createElement(_ink.Text, {
2337
+ bold: true
2338
+ }, "See web UI for more information: "), /*#__PURE__*/_react.default.createElement(_ink.Text, null, /*#__PURE__*/_react.default.createElement(_inkLink.default, {
2339
+ fallback: false,
2340
+ url: build.url
2341
+ }, build.url)));
2342
+ };
2343
+
2344
+ const ReleaseBuild = ({
2345
+ commandUsed,
2346
+ id,
2347
+ shouldConfirm
2348
+ }) => {
2349
+ const exit = (0, _useExit.default)();
2350
+ const [{
2351
+ appId,
2352
+ arbitraryMessageComponent,
2353
+ build,
2354
+ error,
2355
+ hasConfirmed,
2356
+ hasBeenValidatedSuccesfully,
2357
+ isComplete,
2358
+ isReleasing
2359
+ }, setState] = (0, _react.useState)({
2360
+ appId: null,
2361
+ build: null,
2362
+ error: null,
2363
+ hasConfirmed: false,
2364
+ hasBeenValidatedSuccesfully: false,
2365
+ isComplete: false,
2366
+ isReleasing: false,
2367
+ arbitraryMessageComponent: null
2368
+ });
2369
+
2370
+ const onError = e => {
2371
+ const error = e.response ? e.response.data : e;
2372
+ (0, _logForCI.default)(error);
2373
+ setState(prevState => ({ ...prevState,
2374
+ error
2375
+ }));
2376
+ };
2377
+
2378
+ (0, _react.useEffect)(() => {
2379
+ if (build) {
2380
+ return;
2381
+ } // This will throw if validation fails:
2382
+
2383
+
2384
+ const config = (0, _getProjectConfig.default)().config;
2385
+ const appId = config.id;
2386
+
2387
+ const loadBuild = buildId => {
2388
+ (0, _getBuildById.default)({
2389
+ appId,
2390
+ buildId
2391
+ }).then(buildResult => {
2392
+ if (!buildResult) {
2393
+ throw new Error(`No such build ${buildId} for application ${appId}`);
2394
+ }
2395
+
2396
+ setState(previousState => ({ ...previousState,
2397
+ appId,
2398
+ build: buildResult
2399
+ }));
2400
+ }).catch(onError);
2401
+ };
2402
+
2403
+ if (id) {
2404
+ loadBuild(id);
2405
+ } else {
2406
+ (0, _getLatestBuildId.default)({
2407
+ appId
2408
+ }).catch(onError).then(buildId => {
2409
+ if (!buildId) {
2410
+ setState(previousState => ({ ...previousState,
2411
+ arbitraryMessageComponent: /*#__PURE__*/_react.default.createElement(_ink.Text, null, "There are no builds yet")
2412
+ }));
2413
+ return;
2414
+ }
2415
+
2416
+ return loadBuild(buildId);
2417
+ });
2418
+ }
2419
+ }, [build, id]);
2420
+ (0, _react.useEffect)(() => {
2421
+ if (!build || hasBeenValidatedSuccesfully || arbitraryMessageComponent) {
2422
+ return;
2423
+ }
2424
+
2425
+ let validationMessage;
2426
+
2427
+ if (build.releasedAt) {
2428
+ validationMessage = `It has already been released.`;
2429
+ } else if (build.status !== "succeeded") {
2430
+ validationMessage = `The build must have completed successfully. Actual build status: ${build.status}`;
2431
+ }
2432
+
2433
+ if (validationMessage) {
2434
+ setState(previousState => ({ ...previousState,
2435
+ arbitraryMessageComponent: getValidationErrorMessageDisplay(build, validationMessage),
2436
+ hasBeenValidatedSuccesfully: false
2437
+ }));
2438
+ } else {
2439
+ setState(previousState => ({ ...previousState,
2440
+ hasBeenValidatedSuccesfully: true
2441
+ }));
2442
+ }
2443
+ }, [arbitraryMessageComponent, build, hasBeenValidatedSuccesfully]);
2444
+ (0, _react.useEffect)(() => {
2445
+ if (!hasBeenValidatedSuccesfully || shouldConfirm && !hasConfirmed || isReleasing || isComplete) {
2446
+ return;
2447
+ }
2448
+
2449
+ setState(previousState => ({ ...previousState,
2450
+ isReleasing: true
2451
+ }));
2452
+ (0, _getCallableFirebaseFunction.default)("releaseBuild")({
2453
+ appId,
2454
+ buildId: build.id
2455
+ }).then(() => {
2456
+ (0, _logForCI.default)("Released!");
2457
+ setState(previousState => ({ ...previousState,
2458
+ isReleasing: false,
2459
+ isComplete: true
2460
+ }));
2461
+ }).catch(e => {
2462
+ if (["failed-precondition", "not-found"].includes(e.code)) {
2463
+ setState(previousState => ({ ...previousState,
2464
+ arbitraryMessageComponent: getValidationErrorMessageDisplay(build, e.message),
2465
+ isReleasing: false
2466
+ }));
2467
+ } else {
2468
+ onError(new Error("Unexpected internal error while releasing build"));
2469
+ }
2470
+ });
2471
+ }, [appId, build, hasConfirmed, hasBeenValidatedSuccesfully, id, isComplete, isReleasing, shouldConfirm]); // Exit once complete
2472
+
2473
+ (0, _react.useEffect)(() => {
2474
+ if (isComplete) {
2475
+ setTimeout(exit, 10);
2476
+ return;
2477
+ }
2478
+
2479
+ if (arbitraryMessageComponent) {
2480
+ setTimeout(() => exit(new Error("Validation failed")), 10);
2481
+ }
2482
+ }, [arbitraryMessageComponent, exit, isComplete]);
2483
+
2484
+ if (error) {
2485
+ return /*#__PURE__*/_react.default.createElement(_ErrorDisplay.default, {
2486
+ commandUsed: commandUsed,
2487
+ error: error
2488
+ });
2489
+ }
2490
+
2491
+ if (arbitraryMessageComponent) {
2492
+ return arbitraryMessageComponent;
2493
+ }
2494
+
2495
+ if (hasBeenValidatedSuccesfully && shouldConfirm && !hasConfirmed) {
2496
+ const items = [{
2497
+ label: "Yes",
2498
+ value: "yes"
2499
+ }, {
2500
+ label: "No",
2501
+ value: "no"
2502
+ }];
2503
+
2504
+ const onSubmit = item => {
2505
+ if (item.value === "no") {
2506
+ setTimeout(exit, 10);
2507
+ return;
2508
+ }
2509
+
2510
+ setState(previousState => ({ ...previousState,
2511
+ hasConfirmed: true
2512
+ }));
2513
+ };
2514
+
2515
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, {
2516
+ flexDirection: "column"
2517
+ }, /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "This will release build ", build.id, " as "), /*#__PURE__*/_react.default.createElement(_ink.Text, {
2518
+ bold: true
2519
+ }, build.appName, " v", build.appVersion), /*#__PURE__*/_react.default.createElement(_ink.Text, null, ", are you sure?")), /*#__PURE__*/_react.default.createElement(_ink.Box, {
2520
+ marginBottom: 1,
2521
+ marginTop: 1
2522
+ }, /*#__PURE__*/_react.default.createElement(_inkSelectInput.default, {
2523
+ indicatorComponent: _CustomSelectInputIndicator.default,
2524
+ initialIndex: 1,
2525
+ itemComponent: _CustomSelectInputItem.default,
2526
+ items: items,
2527
+ onSelect: onSubmit
2528
+ })), /*#__PURE__*/_react.default.createElement(_ink.Text, {
2529
+ dimColor: true
2530
+ }, "Your users will be auto-updated to this version. You can use --force to bypass this confirmation in future"));
2531
+ }
2532
+
2533
+ if (isReleasing) {
2534
+ return /*#__PURE__*/_react.default.createElement(_ink.Text, null, "Releasing...");
2535
+ }
2536
+
2537
+ if (isComplete) {
2538
+ return /*#__PURE__*/_react.default.createElement(_ink.Text, {
2539
+ bold: true,
2540
+ color: "greenBright"
2541
+ }, "Released!");
2542
+ }
2543
+
2544
+ return /*#__PURE__*/_react.default.createElement(_ink.Text, null, "...");
2545
+ };
2546
+
2547
+ ReleaseBuild.propTypes = {
2548
+ id: (props, propName, componentName) => {
2549
+ if ([props.id, props.shouldReleaseLatest].filter(Boolean).length !== 1) {
2550
+ return new Error(`Exactly one of 'id' and 'shouldReleaseLatest' must be specified in '${componentName}'`);
2551
+ }
2552
+
2553
+ const type = typeof props.id;
2554
+
2555
+ if (!["string", "undefined"].includes(type)) {
2556
+ return new Error(`'id' is a '${type}', not a string, in '${componentName}'.`);
2557
+ }
2558
+ },
2559
+ commandUsed: _propTypes.default.string.isRequired,
2560
+ shouldReleaseLatest: (props, propName, componentName) => {
2561
+ if ([props.id, props.shouldReleaseLatest].filter(Boolean).length !== 1) {
2562
+ return new Error(`Exactly one of 'id' and 'shouldReleaseLatest' must be specified in '${componentName}'`);
2563
+ }
2564
+
2565
+ const type = typeof props.shouldReleaseLatest;
2566
+
2567
+ if (!["boolean", "undefined"].includes(type)) {
2568
+ return new Error(`'shouldReleaseLatest' is a '${type}', not a boolean, in '${componentName}'.`);
2569
+ }
2570
+ },
2571
+ shouldConfirm: _propTypes.default.bool.isRequired
2572
+ };
2573
+ var _default = ReleaseBuild;
2574
+ exports.default = _default;
2575
+ },{"./CustomSelectInputIndicator":"../lib/components/CustomSelectInputIndicator.js","./CustomSelectInputItem":"../lib/components/CustomSelectInputItem.js","./ErrorDisplay":"../lib/components/ErrorDisplay.js","../utilities/getBuildById":"../lib/utilities/getBuildById.js","../utilities/getCallableFirebaseFunction":"../lib/utilities/getCallableFirebaseFunction.js","../utilities/getLatestBuildId":"../lib/utilities/getLatestBuildId.js","../utilities/projectConfig/getProjectConfig":"../lib/utilities/projectConfig/getProjectConfig.js","../utilities/logForCI":"../lib/utilities/logForCI.js","../utilities/useExit":"../lib/utilities/useExit.js"}],"../lib/components/TableEnd.js":[function(require,module,exports) {
2576
+ "use strict";
2577
+
2578
+ Object.defineProperty(exports, "__esModule", {
2579
+ value: true
2580
+ });
2581
+ exports.default = void 0;
2582
+
2583
+ var _ink = require("ink");
2584
+
2585
+ var _propTypes = _interopRequireDefault(require("prop-types"));
2586
+
2587
+ var _react = _interopRequireDefault(require("react"));
2588
+
2589
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2590
+
2591
+ /*
2592
+ See Table component
2593
+ */
2594
+ const TableEnd = ({
2595
+ keyDetails,
2596
+ ...props
2597
+ }) => {
2598
+ let content = "└";
2599
+ content += Object.values(keyDetails).map(({
2600
+ width
2601
+ }) => "─".repeat(width + 2)).join("┴");
2602
+ content += "┘";
2603
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, props, /*#__PURE__*/_react.default.createElement(_ink.Text, null, content));
2604
+ };
2605
+
2606
+ TableEnd.propTypes = {
2607
+ keyDetails: _propTypes.default.object.isRequired
2608
+ };
2609
+ var _default = TableEnd;
2610
+ exports.default = _default;
2611
+ },{}],"../lib/components/TableHead.js":[function(require,module,exports) {
2612
+ "use strict";
2613
+
2614
+ Object.defineProperty(exports, "__esModule", {
2615
+ value: true
2616
+ });
2617
+ exports.default = void 0;
2618
+
2619
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
2620
+
2621
+ var _ink = require("ink");
2622
+
2623
+ var _propTypes = _interopRequireDefault(require("prop-types"));
2624
+
2625
+ var _react = _interopRequireWildcard(require("react"));
2626
+
2627
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
2628
+
2629
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
2630
+
2631
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2632
+
2633
+ /*
2634
+ See Table component
2635
+ */
2636
+ const TableHead = ({
2637
+ keyDetails,
2638
+ ...props
2639
+ }) => {
2640
+ let topLine = "┌";
2641
+ topLine += Object.values(keyDetails).map(({
2642
+ width
2643
+ }) => "─".repeat(width + 2)).join("┬");
2644
+ topLine += "┐";
2645
+ const contentLineElements = Object.values(keyDetails).map(({
2646
+ key,
2647
+ width
2648
+ }, index) => {
2649
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, {
2650
+ key: key
2651
+ }, index > 0 ? /*#__PURE__*/_react.default.createElement(_ink.Text, null, " \u2502 ") : null, /*#__PURE__*/_react.default.createElement(_ink.Box, {
2652
+ width: width
2653
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, {
2654
+ bold: true
2655
+ }, key)));
2656
+ });
2657
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, (0, _extends2.default)({
2658
+ flexDirection: "column"
2659
+ }, props), /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, topLine)), /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "\u2502 "), contentLineElements, /*#__PURE__*/_react.default.createElement(_ink.Text, null, " \u2502"))));
2660
+ };
2661
+
2662
+ TableHead.propTypes = {
2663
+ bottomLinePrefix: _propTypes.default.string,
2664
+ keyDetails: _propTypes.default.object.isRequired
2665
+ };
2666
+ var _default = TableHead;
2667
+ exports.default = _default;
2668
+ },{}],"../lib/components/TableRow.js":[function(require,module,exports) {
2669
+ "use strict";
2670
+
2671
+ Object.defineProperty(exports, "__esModule", {
2672
+ value: true
2673
+ });
2674
+ exports.default = void 0;
2675
+
2676
+ var _ink = require("ink");
2677
+
2678
+ var _propTypes = _interopRequireDefault(require("prop-types"));
2679
+
2680
+ var _react = _interopRequireWildcard(require("react"));
2681
+
2682
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
2683
+
2684
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
2685
+
2686
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2687
+
2688
+ /*
2689
+ See Table component
2690
+ */
2691
+ const TableRow = ({
2692
+ data,
2693
+ getCellTextProps = ({
2694
+ props
2695
+ }) => props,
2696
+ keyDetails,
2697
+ textProps = {}
2698
+ }) => {
2699
+ let topLine = "├";
2700
+ topLine += Object.values(keyDetails).map(({
2701
+ width
2702
+ }) => "─".repeat(width + 2)).join("┼");
2703
+ topLine += "┤";
2704
+
2705
+ const content = /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "\u2502 "), Object.entries(data).map(([key, value], index) => {
2706
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, {
2707
+ key: key
2708
+ }, index > 0 ? /*#__PURE__*/_react.default.createElement(_ink.Text, null, " \u2502 ") : null, /*#__PURE__*/_react.default.createElement(_ink.Box, {
2709
+ width: keyDetails[key].width
2710
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, getCellTextProps({
2711
+ key,
2712
+ props: textProps,
2713
+ rowData: data,
2714
+ value
2715
+ }), value)));
2716
+ }), /*#__PURE__*/_react.default.createElement(_ink.Text, null, " \u2502"));
2717
+
2718
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ink.Box, {
2719
+ flexDirection: "column"
2720
+ }, /*#__PURE__*/_react.default.createElement(_ink.Text, null, topLine), /*#__PURE__*/_react.default.createElement(_ink.Box, null, content)));
2721
+ };
2722
+
2723
+ TableRow.propTypes = {
2724
+ data: _propTypes.default.object.isRequired,
2725
+ getCellTextProps: _propTypes.default.func,
2726
+ keyDetails: _propTypes.default.object.isRequired,
2727
+ textProps: _propTypes.default.object
2728
+ };
2729
+ var _default = TableRow;
2730
+ exports.default = _default;
2731
+ },{}],"../lib/utilities/getKeyDetails.js":[function(require,module,exports) {
2732
+ "use strict";
2733
+
2734
+ Object.defineProperty(exports, "__esModule", {
2735
+ value: true
2736
+ });
2737
+ exports.default = void 0;
2738
+
2739
+ // This is used to get the column widths for tables
2740
+ var _default = data => {
2741
+ const result = {};
2742
+ Object.keys(data[0]).forEach(key => {
2743
+ result[key] = {
2744
+ key,
2745
+ width: Math.max(key.length, data.map(item => item[key].toString().length).sort((a, b) => b - a)[0])
2746
+ };
2747
+ });
2748
+ return result;
2749
+ };
2750
+
2751
+ exports.default = _default;
2752
+ },{}],"../lib/components/SelectTable.js":[function(require,module,exports) {
2753
+ "use strict";
2754
+
2755
+ Object.defineProperty(exports, "__esModule", {
2756
+ value: true
2757
+ });
2758
+ exports.default = void 0;
2759
+
2760
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
2761
+
2762
+ var _ink = require("ink");
2763
+
2764
+ var _inkSelectInput = _interopRequireDefault(require("ink-select-input"));
2765
+
2766
+ var _propTypes = _interopRequireDefault(require("prop-types"));
2767
+
2768
+ var _react = _interopRequireDefault(require("react"));
2769
+
2770
+ var _CustomSelectInputIndicator = _interopRequireDefault(require("./CustomSelectInputIndicator"));
2771
+
2772
+ var _TableEnd = _interopRequireDefault(require("./TableEnd"));
2773
+
2774
+ var _TableHead = _interopRequireDefault(require("./TableHead"));
2775
+
2776
+ var _TableRow = _interopRequireDefault(require("./TableRow"));
2777
+
2778
+ var _getKeyDetails = _interopRequireDefault(require("../utilities/getKeyDetails"));
2779
+
2780
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2781
+
2782
+ const CustomIndicator = props => /*#__PURE__*/_react.default.createElement(_CustomSelectInputIndicator.default, (0, _extends2.default)({
2783
+ marginTop: 1
2784
+ }, props));
2785
+ /*
2786
+ This is like if <Table/> and ink-select-input had a baby.
2787
+ Read the block comment at the top of <Table/> first.
2788
+ */
2789
+
2790
+
2791
+ const SelectTable = ({
2792
+ data,
2793
+ onSelect
2794
+ }) => {
2795
+ const keyDetails = (0, _getKeyDetails.default)(data);
2796
+
2797
+ const getSelectItems = () => {
2798
+ return data.map((rowData, index) => {
2799
+ return {
2800
+ index,
2801
+ key: index,
2802
+ value: rowData
2803
+ };
2804
+ });
2805
+ };
2806
+
2807
+ const ItemComponent = ({
2808
+ index,
2809
+ isSelected
2810
+ }) => {
2811
+ return /*#__PURE__*/_react.default.createElement(_TableRow.default, {
2812
+ data: data[index],
2813
+ key: index,
2814
+ keyDetails: keyDetails,
2815
+ textProps: {
2816
+ bold: isSelected,
2817
+ color: isSelected ? undefined : "gray"
2818
+ }
2819
+ });
2820
+ };
2821
+
2822
+ ItemComponent.propTypes = {
2823
+ index: _propTypes.default.number,
2824
+ isSelected: _propTypes.default.bool
2825
+ };
2826
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, {
2827
+ flexDirection: "column"
2828
+ }, /*#__PURE__*/_react.default.createElement(_TableHead.default, {
2829
+ keyDetails: keyDetails,
2830
+ marginLeft: 2
2831
+ }), /*#__PURE__*/_react.default.createElement(_inkSelectInput.default, {
2832
+ indicatorComponent: CustomIndicator,
2833
+ itemComponent: ItemComponent,
2834
+ items: getSelectItems(),
2835
+ onSelect: onSelect
2836
+ }), /*#__PURE__*/_react.default.createElement(_TableEnd.default, {
2837
+ keyDetails: keyDetails,
2838
+ marginLeft: 2
2839
+ }));
2840
+ };
2841
+
2842
+ SelectTable.propTypes = {
2843
+ data: (props, propName, componentName) => {
2844
+ const type = typeof props.data;
2845
+
2846
+ if (Array.isArray("array")) {
2847
+ return new Error(`'data' prop must be an array ('${type}' given) in ${componentName} component`);
2848
+ }
2849
+
2850
+ if (props.data.length === 0) {
2851
+ return new Error(`'data' prop must not be empty, in ${componentName} component`);
2852
+ }
2853
+ },
2854
+ onSelect: _propTypes.default.func
2855
+ };
2856
+ var _default = SelectTable;
2857
+ exports.default = _default;
2858
+ },{"./CustomSelectInputIndicator":"../lib/components/CustomSelectInputIndicator.js","./TableEnd":"../lib/components/TableEnd.js","./TableHead":"../lib/components/TableHead.js","./TableRow":"../lib/components/TableRow.js","../utilities/getKeyDetails":"../lib/utilities/getKeyDetails.js"}],"../lib/utilities/getBuilds.js":[function(require,module,exports) {
2859
+ "use strict";
2860
+
2861
+ Object.defineProperty(exports, "__esModule", {
2862
+ value: true
2863
+ });
2864
+ exports.default = void 0;
2865
+
2866
+ var _firestore = _interopRequireWildcard(require("./firestore"));
2867
+
2868
+ var _logger = _interopRequireDefault(require("./logger"));
2869
+
2870
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2871
+
2872
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
2873
+
2874
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
2875
+
2876
+ var _default = async ({
2877
+ addWhereClauses = query => query,
2878
+ appId,
2879
+ limit = 5,
2880
+ startAfter
2881
+ }) => {
2882
+ _logger.default.debug({
2883
+ appId,
2884
+ limit,
2885
+ startAfter
2886
+ }, "getBuilds");
2887
+
2888
+ const appRef = _firestore.default.doc(`users/${(0, _firestore.currentUser)().uid}/applications/${appId}`);
2889
+
2890
+ const appSnapshot = await appRef.get();
2891
+
2892
+ if (!appSnapshot.exists) {
2893
+ throw new Error(`Application with ID of ${appId} doesn't exist.`);
2894
+ }
2895
+
2896
+ let query = addWhereClauses(appRef.collection("builds")).orderBy("createdAt", "desc");
2897
+
2898
+ if (startAfter) {
2899
+ query = query.startAfter(startAfter);
2900
+ }
2901
+
2902
+ const buildsResult = await query.limit(limit).get();
2903
+
2904
+ if (buildsResult.empty) {
2905
+ return [];
2906
+ }
2907
+
2908
+ return buildsResult.docs.map(doc => doc.data());
2909
+ };
2910
+
2911
+ exports.default = _default;
2912
+ },{"./firestore":"../lib/utilities/firestore.js","./logger":"../lib/utilities/logger.js"}],"../lib/utilities/getRelativeDateFromDateString.js":[function(require,module,exports) {
2913
+ "use strict";
2914
+
2915
+ Object.defineProperty(exports, "__esModule", {
2916
+ value: true
2917
+ });
2918
+ exports.default = void 0;
2919
+
2920
+ var dateFns = _interopRequireWildcard(require("date-fns"));
2921
+
2922
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
2923
+
2924
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
2925
+
2926
+ var _default = input => dateFns.formatDistance(new Date(input), new Date()) + " ago";
2927
+
2928
+ exports.default = _default;
2929
+ },{}],"../lib/utilities/useInput.js":[function(require,module,exports) {
2930
+ "use strict";
2931
+
2932
+ Object.defineProperty(exports, "__esModule", {
2933
+ value: true
2934
+ });
2935
+ exports.default = void 0;
2936
+
2937
+ var _isCi = _interopRequireDefault(require("is-ci"));
2938
+
2939
+ var _ink = require("ink");
2940
+
2941
+ var _useExit = _interopRequireDefault(require("./useExit"));
2942
+
2943
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2944
+
2945
+ let hasSubscribed = false;
2946
+ let ctrlCSubscriptions = [];
2947
+
2948
+ const onStdin = (data, exit) => {
2949
+ let input = String(data);
2950
+ let wasCtrlPressed = false;
2951
+
2952
+ if (input <= "\u001A" && input !== "\r") {
2953
+ input = String.fromCharCode(input.charCodeAt(0) + "a".charCodeAt(0) - 1);
2954
+ wasCtrlPressed = true;
2955
+ }
2956
+
2957
+ if (wasCtrlPressed && input === "c") {
2958
+ ctrlCSubscriptions.forEach(subscription => subscription());
2959
+ setTimeout(exit, 10);
2960
+ }
2961
+ };
2962
+ /*
2963
+ See https://github.com/vadimdemedes/pastel/issues/38
2964
+ */
2965
+
2966
+
2967
+ var _default = () => {
2968
+ if (_isCi.default) {
2969
+ return () => () => {};
2970
+ }
2971
+
2972
+ const exit = (0, _useExit.default)();
2973
+ const {
2974
+ stdin
2975
+ } = (0, _ink.useStdin)();
2976
+ return (callback, useInputOptions, stdInOptions = {}) => {
2977
+ const onStdinData = data => onStdin(data, exit);
2978
+
2979
+ if (stdInOptions.onCtrlCPressed) {
2980
+ ctrlCSubscriptions.push(stdInOptions.onCtrlCPressed);
2981
+ }
2982
+
2983
+ if (!hasSubscribed) {
2984
+ hasSubscribed = true; // This is based on the Ink (useInput) source
2985
+
2986
+ stdin.on("data", onStdinData);
2987
+ }
2988
+
2989
+ let cleanUpInputHook = (0, _ink.useInput)(callback, useInputOptions);
2990
+ return () => {
2991
+ if (hasSubscribed) {
2992
+ stdin.off("data", onStdinData);
2993
+ }
2994
+
2995
+ if (cleanUpInputHook) {
2996
+ cleanUpInputHook();
2997
+ }
2998
+ };
2999
+ };
3000
+ };
3001
+
3002
+ exports.default = _default;
3003
+ },{"./useExit":"../lib/utilities/useExit.js"}],"../lib/components/PickBuildForRelease.js":[function(require,module,exports) {
3004
+ "use strict";
3005
+
3006
+ Object.defineProperty(exports, "__esModule", {
3007
+ value: true
3008
+ });
3009
+ exports.default = void 0;
3010
+
3011
+ var _ink = require("ink");
3012
+
3013
+ var _propTypes = _interopRequireDefault(require("prop-types"));
3014
+
3015
+ var _react = _interopRequireWildcard(require("react"));
3016
+
3017
+ var _ErrorDisplay = _interopRequireDefault(require("./ErrorDisplay"));
3018
+
3019
+ var _ReleaseBuild = _interopRequireDefault(require("./ReleaseBuild"));
3020
+
3021
+ var _SelectTable = _interopRequireDefault(require("./SelectTable"));
3022
+
3023
+ var _getBuilds = _interopRequireDefault(require("../utilities/getBuilds"));
3024
+
3025
+ var _getProjectConfig = _interopRequireDefault(require("../utilities/projectConfig/getProjectConfig"));
3026
+
3027
+ var _getRelativeDateFromDateString = _interopRequireDefault(require("../utilities/getRelativeDateFromDateString"));
3028
+
3029
+ var _logForCI = _interopRequireDefault(require("../utilities/logForCI"));
3030
+
3031
+ var _useExit = _interopRequireDefault(require("../utilities/useExit"));
3032
+
3033
+ var _useInput = _interopRequireDefault(require("../utilities/useInput"));
3034
+
3035
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
3036
+
3037
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
3038
+
3039
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3040
+
3041
+ const PickBuildForRelease = ({
3042
+ commandUsed,
3043
+ shouldConfirm
3044
+ }) => {
3045
+ const exit = (0, _useExit.default)();
3046
+ const [{
3047
+ error,
3048
+ builds,
3049
+ chosenBuildId,
3050
+ isLoading
3051
+ }, setState] = (0, _react.useState)({
3052
+ error: null,
3053
+ builds: null,
3054
+ chosenBuildId: null,
3055
+ isLoading: true
3056
+ });
3057
+ const onInput = (0, _useInput.default)();
3058
+ (0, _react.useEffect)(() => {
3059
+ if (builds) {
3060
+ return;
3061
+ }
3062
+
3063
+ let config;
3064
+
3065
+ try {
3066
+ // This will throw if validation fails:
3067
+ config = (0, _getProjectConfig.default)().config;
3068
+ } catch (e) {
3069
+ setState(previousState => ({ ...previousState,
3070
+ error: e
3071
+ }));
3072
+ return;
3073
+ }
3074
+
3075
+ (0, _getBuilds.default)({
3076
+ addWhereClauses: query => query.where("status", "==", "succeeded"),
3077
+ appId: config.id,
3078
+ limit: 50
3079
+ }).then(buildsResult => {
3080
+ setState(previousState => ({ ...previousState,
3081
+ builds: buildsResult.filter(buildResult => !buildResult.releasedAt).slice(0, 5),
3082
+ isLoading: false
3083
+ }));
3084
+ }).catch(e => {
3085
+ (0, _logForCI.default)(e);
3086
+ setState(previousState => ({ ...previousState,
3087
+ error: e,
3088
+ isLoading: false
3089
+ }));
3090
+ });
3091
+ }, [builds]);
3092
+ onInput((input, key) => {
3093
+ if (!builds || !builds.length || chosenBuildId) {
3094
+ return;
3095
+ }
3096
+
3097
+ if (key.escape) {
3098
+ exit();
3099
+ }
3100
+ });
3101
+
3102
+ if (error) {
3103
+ return /*#__PURE__*/_react.default.createElement(_ErrorDisplay.default, {
3104
+ commandUsed: commandUsed,
3105
+ error: error
3106
+ });
3107
+ }
3108
+
3109
+ if (isLoading) {
3110
+ return /*#__PURE__*/_react.default.createElement(_ink.Text, null, "Loading...");
3111
+ }
3112
+
3113
+ if (chosenBuildId) {
3114
+ return /*#__PURE__*/_react.default.createElement(_ReleaseBuild.default, {
3115
+ commandUsed: commandUsed,
3116
+ id: chosenBuildId,
3117
+ shouldConfirm: shouldConfirm
3118
+ });
3119
+ }
3120
+
3121
+ if (builds.length) {
3122
+ const data = builds.map(build => ({
3123
+ ID: build.id,
3124
+ Version: build.appVersion || "unknown",
3125
+ "Creation date": (0, _getRelativeDateFromDateString.default)(build.createdAt)
3126
+ }));
3127
+
3128
+ const onSelect = item => setState(previousState => ({ ...previousState,
3129
+ chosenBuildId: item.value.ID
3130
+ }));
3131
+
3132
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "Which build would you like to release?")), /*#__PURE__*/_react.default.createElement(_SelectTable.default, {
3133
+ data: data,
3134
+ onSelect: onSelect
3135
+ }), /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, {
3136
+ dimColor: true
3137
+ }, "Showing the latest ", builds.length, " unreleased successful builds")));
3138
+ } else {
3139
+ return /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, null, "No elligible builds found "), /*#__PURE__*/_react.default.createElement(_ink.Text, {
3140
+ dimColor: true
3141
+ }, "(i.e. unreleased and successful)"));
3142
+ }
3143
+ };
3144
+
3145
+ PickBuildForRelease.propTypes = {
3146
+ commandUsed: _propTypes.default.string.isRequired,
3147
+ shouldConfirm: _propTypes.default.bool.isRequired
3148
+ };
3149
+ var _default = PickBuildForRelease;
3150
+ exports.default = _default;
3151
+ },{"./ErrorDisplay":"../lib/components/ErrorDisplay.js","./ReleaseBuild":"../lib/components/ReleaseBuild.js","./SelectTable":"../lib/components/SelectTable.js","../utilities/getBuilds":"../lib/utilities/getBuilds.js","../utilities/projectConfig/getProjectConfig":"../lib/utilities/projectConfig/getProjectConfig.js","../utilities/getRelativeDateFromDateString":"../lib/utilities/getRelativeDateFromDateString.js","../utilities/logForCI":"../lib/utilities/logForCI.js","../utilities/useExit":"../lib/utilities/useExit.js","../utilities/useInput":"../lib/utilities/useInput.js"}],"../lib/utilities/exitIfCLIOutOfDate.js":[function(require,module,exports) {
3152
+ "use strict";
3153
+
3154
+ Object.defineProperty(exports, "__esModule", {
3155
+ value: true
3156
+ });
3157
+ exports.default = void 0;
3158
+
3159
+ var _chalk = _interopRequireDefault(require("chalk"));
3160
+
3161
+ var _isInstalledGlobally = _interopRequireDefault(require("is-installed-globally"));
3162
+
3163
+ var _latestVersion = _interopRequireDefault(require("latest-version"));
3164
+
3165
+ var _pkgUp = _interopRequireDefault(require("pkg-up"));
3166
+
3167
+ var _semver = _interopRequireDefault(require("semver"));
3168
+
3169
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3170
+
3171
+ var _default = () => {
3172
+ // Ignore during tests
3173
+ if (process.env.AVA_PATH) {
3174
+ return;
3175
+ }
3176
+
3177
+ const pkg = require(_pkgUp.default.sync({
3178
+ cwd: __dirname
3179
+ }));
3180
+
3181
+ (0, _latestVersion.default)(pkg.name).then(latest => {
3182
+ if (_semver.default.gt(latest, pkg.version)) {
3183
+ const commandToUpdate = _chalk.default.greenBright(`npm install ${_isInstalledGlobally.default ? "-g" : "--save-dev"} @todesktop/cli`);
3184
+
3185
+ console.log(`Your version of @todesktop/cli is out of date.\nRun ${commandToUpdate} to update to v${latest}.`);
3186
+
3187
+ if (!_semver.default.satisfies(latest, `^${pkg.version}`)) {
3188
+ console.log(`CLI is exiting because it is out out of date.`);
3189
+ process.exit(1);
3190
+ }
3191
+ }
3192
+ });
3193
+ };
3194
+
3195
+ exports.default = _default;
3196
+ },{}],"../package.json":[function(require,module,exports) {
3197
+ module.exports = {
3198
+ "private": false,
3199
+ "publishConfig": {
3200
+ "access": "public"
3201
+ },
3202
+ "name": "@todesktop/cli",
3203
+ "version": "1.1.1",
3204
+ "license": "MIT",
3205
+ "author": "Dave Jeffery <dave@todesktop.com> (http://www.todesktop.com/)",
3206
+ "homepage": "https://todesktop.com/cli",
3207
+ "bugs": {
3208
+ "email": "dave@todesktop.com"
3209
+ },
3210
+ "bin": {
3211
+ "todesktop": "./build/cli.js"
3212
+ },
3213
+ "engines": {
3214
+ "node": ">=12"
3215
+ },
3216
+ "scripts": {
3217
+ "prepare": "npx force-resolutions",
3218
+ "dev": "cp-cli dev.env .env && pastel dev",
3219
+ "dev:prod": "cp-cli prod.env .env && pastel dev",
3220
+ "build": "cross-env NODE_ENV=production pastel build && cp-cli prod.env .env && cp node_modules/pastel/boot.js build/boot.js && sed -i'.bak' 's@pastel\\/boot@.\\/boot@g' build/cli.js",
3221
+ "lint": "eslint .",
3222
+ "lint--fix": "eslint . --fix",
3223
+ "release": "npm run build && npx np --tag=latest",
3224
+ "release-beta": "npm run build && npx np --any-branch --no-tests --tag=beta",
3225
+ "test": "npm run build && ava",
3226
+ "test--watch": "npm test -- --watch"
3227
+ },
3228
+ "files": ["build", "docs", ".env", "LICENSE", "README.md"],
3229
+ "dependencies": {
3230
+ "@sentry/node": "^5.27.2",
3231
+ "ajv": "^6.12.6",
3232
+ "analytics-node": "^4.0.1",
3233
+ "archiver": "^5.2.0",
3234
+ "axios": "^0.21.1",
3235
+ "better-ajv-errors": "^1.2.0",
3236
+ "bunyan": "^1.8.14",
3237
+ "camelcase-keys": "^5.2.0",
3238
+ "chalk": "^4.1.0",
3239
+ "conf": "^7.1.2",
3240
+ "date-fns": "^2.28.0",
3241
+ "decamelize": "^1.2.0",
3242
+ "del": "^6.0.0",
3243
+ "dotenv": "^8.2.0",
3244
+ "du": "^1.0.0",
3245
+ "email-regex": "^4.0.0",
3246
+ "fast-glob": "^3.2.4",
3247
+ "final-form": "^4.20.1",
3248
+ "find-up": "^5.0.0",
3249
+ "firebase": "^7.24.0",
3250
+ "git-rev-sync": "^3.0.2",
3251
+ "ink": "^3.2.0",
3252
+ "ink-gradient": "^2.0.0",
3253
+ "ink-link": "^2.0.0",
3254
+ "ink-progress-bar": "^3.0.0",
3255
+ "ink-select-input": "^4.2.1",
3256
+ "ink-text-input": "^4.0.1",
3257
+ "is-installed-globally": "^0.3.2",
3258
+ "latest-version": "^5.1.0",
3259
+ "lodash.throttle": "^4.1.1",
3260
+ "parse-author": "^2.0.0",
3261
+ "pkg-up": "^3.1.0",
3262
+ "pretty-bytes": "^5.4.1",
3263
+ "prop-types": "^15.7.2",
3264
+ "react": "^17.0.2",
3265
+ "react-final-form": "^6.5.1",
3266
+ "semver": "^7.3.2",
3267
+ "stream-to-array": "^2.3.0",
3268
+ "superagent": "^7.1.3",
3269
+ "uuid": "^8.3.1",
3270
+ "xdg-basedir": "^4.0.0",
3271
+ "yargs": "^15.4.1"
3272
+ },
3273
+ "devDependencies": {
3274
+ "@ava/babel": "^1.0.1",
3275
+ "@babel/core": "^7.12.3",
3276
+ "@babel/plugin-transform-runtime": "^7.12.1",
3277
+ "@babel/preset-env": "^7.11.5",
3278
+ "@babel/register": "^7.12.1",
3279
+ "@types/bunyan": "^1.8.6",
3280
+ "ava": "^4.3.1",
3281
+ "babel-preset-es2015": "^6.24.1",
3282
+ "cp-cli": "^2.0.0",
3283
+ "cross-env": "^7.0.2",
3284
+ "eslint": "^7.6.0",
3285
+ "eslint-config-prettier": "^6.11.0",
3286
+ "eslint-config-standard": "^14.1.1",
3287
+ "eslint-plugin-import": "^2.22.1",
3288
+ "eslint-plugin-node": "^11.1.0",
3289
+ "eslint-plugin-prettier": "^3.1.4",
3290
+ "eslint-plugin-promise": "^4.2.1",
3291
+ "eslint-plugin-react": "^7.21.4",
3292
+ "eslint-plugin-react-hooks": "^4.2.0",
3293
+ "eslint-plugin-standard": "^4.0.1",
3294
+ "execa": "^4.0.3",
3295
+ "extract-zip": "^2.0.1",
3296
+ "fs-extra": "^9.0.1",
3297
+ "husky": "^4.3.0",
3298
+ "is-ci": "^2.0.0",
3299
+ "lint-staged": "^10.2.11",
3300
+ "pastel": "^1.1.1",
3301
+ "prettier": "^2.1.2",
3302
+ "proxyquire": "^2.1.3",
3303
+ "sinon": "^9.0.3"
3304
+ },
3305
+ "ava": {
3306
+ "files": ["test/**/*.js", "!test/fixtures/**/*", "!test/utilities/**/*"],
3307
+ "require": ["@babel/register"],
3308
+ "timeout": "10m"
3309
+ },
3310
+ "lint-staged": {
3311
+ "**/*.js": ["eslint . --fix", "git add"]
3312
+ },
3313
+ "husky": {
3314
+ "hooks": {
3315
+ "pre-commit": "lint-staged"
3316
+ }
3317
+ },
3318
+ "overrides": {
3319
+ "pastel": {
3320
+ "parcel-bundler": {
3321
+ "deasync": "0.1.24"
3322
+ }
3323
+ }
3324
+ },
3325
+ "resolutions": {
3326
+ "pastel/parcel-bundler/deasync": "0.1.24",
3327
+ "ink": "3.2.0",
3328
+ "react": "17.0.2"
3329
+ }
3330
+ };
3331
+ },{}],"../lib/utilities/initSentry.js":[function(require,module,exports) {
3332
+ "use strict";
3333
+
3334
+ Object.defineProperty(exports, "__esModule", {
3335
+ value: true
3336
+ });
3337
+ exports.default = void 0;
3338
+
3339
+ var Sentry = _interopRequireWildcard(require("@sentry/node"));
3340
+
3341
+ var _os = _interopRequireDefault(require("os"));
3342
+
3343
+ var _package = _interopRequireDefault(require("../../package.json"));
3344
+
3345
+ var _configStore = require("../utilities/configStore");
3346
+
3347
+ var _getProjectConfig = _interopRequireDefault(require("../utilities/projectConfig/getProjectConfig"));
3348
+
3349
+ var _path = _interopRequireDefault(require("path"));
3350
+
3351
+ var _getEnvironmentVariables = _interopRequireDefault(require("./getEnvironmentVariables"));
3352
+
3353
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3354
+
3355
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
3356
+
3357
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
3358
+
3359
+ var _default = () => {
3360
+ const {
3361
+ TODESKTOP_CLI_SENTRY_DSN
3362
+ } = (0, _getEnvironmentVariables.default)();
3363
+
3364
+ if (!TODESKTOP_CLI_SENTRY_DSN) {
3365
+ // Don't initialise Sentry
3366
+ return;
3367
+ }
3368
+
3369
+ Sentry.init({
3370
+ dsn: TODESKTOP_CLI_SENTRY_DSN
3371
+ });
3372
+ Sentry.configureScope(scope => {
3373
+ try {
3374
+ scope.setUser({
3375
+ email: (0, _configStore.getAuthConfig)().email
3376
+ });
3377
+ } catch (err) {}
3378
+
3379
+ try {
3380
+ scope.setContext("os", {
3381
+ name: _os.default.platform(),
3382
+ version: _os.default.release()
3383
+ });
3384
+ } catch (err) {}
3385
+
3386
+ try {
3387
+ scope.setContext("runtime", {
3388
+ name: "Node.js",
3389
+ version: process.version
3390
+ });
3391
+ } catch (err) {}
3392
+
3393
+ try {
3394
+ scope.setContext("app", {
3395
+ app_name: _package.default.name,
3396
+ app_version: _package.default.version
3397
+ });
3398
+ } catch (err) {}
3399
+
3400
+ try {
3401
+ const configResult = (0, _getProjectConfig.default)();
3402
+ scope.setExtra("config", configResult);
3403
+ } catch (err) {}
3404
+ });
3405
+ };
3406
+
3407
+ exports.default = _default;
3408
+ },{"../../package.json":"../package.json","../utilities/configStore":"../lib/utilities/configStore.js","../utilities/projectConfig/getProjectConfig":"../lib/utilities/projectConfig/getProjectConfig.js","./getEnvironmentVariables":"../lib/utilities/getEnvironmentVariables.js"}],"../lib/utilities/onCommand.js":[function(require,module,exports) {
3409
+ "use strict";
3410
+
3411
+ Object.defineProperty(exports, "__esModule", {
3412
+ value: true
3413
+ });
3414
+ exports.default = void 0;
3415
+
3416
+ var _exitIfCLIOutOfDate = _interopRequireDefault(require("./exitIfCLIOutOfDate"));
3417
+
3418
+ var _initSentry = _interopRequireDefault(require("./initSentry"));
3419
+
3420
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3421
+
3422
+ const defaultOptions = {
3423
+ sentry: true,
3424
+ exitIfOutOfDate: true
3425
+ };
3426
+
3427
+ var _default = options => {
3428
+ const {
3429
+ sentry,
3430
+ exitIfOutOfDate
3431
+ } = { ...defaultOptions,
3432
+ ...options
3433
+ };
3434
+
3435
+ if (sentry) {
3436
+ (0, _initSentry.default)();
3437
+ }
3438
+
3439
+ if (exitIfOutOfDate) {
3440
+ (0, _exitIfCLIOutOfDate.default)();
3441
+ }
3442
+ };
3443
+
3444
+ exports.default = _default;
3445
+ },{"./exitIfCLIOutOfDate":"../lib/utilities/exitIfCLIOutOfDate.js","./initSentry":"../lib/utilities/initSentry.js"}],"../lib/utilities/useAnalytics.js":[function(require,module,exports) {
3446
+ "use strict";
3447
+
3448
+ Object.defineProperty(exports, "__esModule", {
3449
+ value: true
3450
+ });
3451
+ exports.useAnalyticsCommand = void 0;
3452
+
3453
+ var _react = require("react");
3454
+
3455
+ var _firestore = require("./firestore");
3456
+
3457
+ var _analytics = require("./analytics");
3458
+
3459
+ var _logger = _interopRequireDefault(require("../utilities/logger"));
3460
+
3461
+ var _getProjectConfig = _interopRequireDefault(require("../utilities/projectConfig/getProjectConfig"));
3462
+
3463
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3464
+
3465
+ const useAnalyticsCommand = (command, flags = {}, properties = {}) => {
3466
+ const [hasAttemptedTracking, setTrackingAttempt] = (0, _react.useState)(false);
3467
+
3468
+ _logger.default.info({
3469
+ command,
3470
+ flags,
3471
+ properties
3472
+ }, "useAnalyticsCommand");
3473
+
3474
+ try {
3475
+ if (flags.projectPath) {
3476
+ properties = { ...properties,
3477
+ ...(0, _getProjectConfig.default)()
3478
+ };
3479
+ }
3480
+ } catch (err) {}
3481
+
3482
+ (0, _react.useEffect)(() => {
3483
+ const authUnsubscribe = (0, _firestore.onUserAuth)(async user => {
3484
+ /**
3485
+ * Only identify if there's a user id (stops use of anon id).
3486
+ * Subsequent track callback will thus always be tied to a user.
3487
+ */
3488
+ if (user.uid) {
3489
+ (0, _analytics.identify)(user.uid, {
3490
+ email: user.email,
3491
+ displayName: user.displayName
3492
+ }, () => {
3493
+ (0, _analytics.track)(_analytics.ANALYTICS_EVENT.CLI_COMMAND, { ...properties,
3494
+ flags,
3495
+ command
3496
+ }, () => setTrackingAttempt(true));
3497
+ authUnsubscribe && authUnsubscribe();
3498
+ });
3499
+ }
3500
+ }); // if it takes longer than 5 secs to identify a user, just set the
3501
+ // tracking attempt to true so that other commands aren't waiting
3502
+ // forever to terminate (see whoami component)
3503
+
3504
+ setTimeout(() => setTrackingAttempt(true), 5000);
3505
+ }, []); // leave empty - this should only ever execute once (on mount)
3506
+
3507
+ return {
3508
+ hasAttemptedTracking
3509
+ };
3510
+ };
3511
+
3512
+ exports.useAnalyticsCommand = useAnalyticsCommand;
3513
+ },{"./firestore":"../lib/utilities/firestore.js","./analytics":"../lib/utilities/analytics.js","../utilities/logger":"../lib/utilities/logger.js","../utilities/projectConfig/getProjectConfig":"../lib/utilities/projectConfig/getProjectConfig.js"}],"release.js":[function(require,module,exports) {
3514
+ "use strict";
3515
+
3516
+ Object.defineProperty(exports, "__esModule", {
3517
+ value: true
3518
+ });
3519
+ exports.default = void 0;
3520
+
3521
+ var _ink = require("ink");
3522
+
3523
+ var _propTypes = _interopRequireDefault(require("prop-types"));
3524
+
3525
+ var _react = _interopRequireWildcard(require("react"));
3526
+
3527
+ var _checkIfReactIsUsable = _interopRequireDefault(require("../lib/utilities/checkIfReactIsUsable"));
3528
+
3529
+ var _LoginHOC = _interopRequireDefault(require("../lib/components/LoginHOC"));
3530
+
3531
+ var _ErrorBoundary = _interopRequireDefault(require("../lib/components/ErrorBoundary"));
3532
+
3533
+ var _ReleaseBuild = _interopRequireDefault(require("../lib/components/ReleaseBuild"));
3534
+
3535
+ var _PickBuildForRelease = _interopRequireDefault(require("../lib/components/PickBuildForRelease"));
3536
+
3537
+ var _onCommand = _interopRequireDefault(require("../lib/utilities/onCommand"));
3538
+
3539
+ var _useAnalytics = require("../lib/utilities/useAnalytics");
3540
+
3541
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
3542
+
3543
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
3544
+
3545
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
3546
+
3547
+ (0, _onCommand.default)(); /// Release a build
3548
+
3549
+ const ReleaseCommand = ({
3550
+ id,
3551
+ force,
3552
+ latest: shouldReleaseLatest
3553
+ }) => {
3554
+ (0, _checkIfReactIsUsable.default)();
3555
+ (0, _useAnalytics.useAnalyticsCommand)("release", {
3556
+ id,
3557
+ force,
3558
+ shouldReleaseLatest
3559
+ }); // TODO: remove some time in the future
3560
+
3561
+ if (id && id.startsWith(".")) {
3562
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_ink.Box, null, /*#__PURE__*/_react.default.createElement(_ink.Text, {
3563
+ bold: true,
3564
+ color: "red"
3565
+ }, "todesktop release <project-path>"), /*#__PURE__*/_react.default.createElement(_ink.Text, null, " is no longer supported. Run this instead:")), /*#__PURE__*/_react.default.createElement(_ink.Text, {
3566
+ bold: true,
3567
+ color: "greenBright"
3568
+ }, "todesktop build && todesktop release --latest --force"));
3569
+ }
3570
+
3571
+ const getContents = () => {
3572
+ if (id) {
3573
+ return /*#__PURE__*/_react.default.createElement(_ReleaseBuild.default, {
3574
+ commandUsed: "todesktop release <id>",
3575
+ id: id,
3576
+ shouldConfirm: !force
3577
+ });
3578
+ } else if (shouldReleaseLatest) {
3579
+ return /*#__PURE__*/_react.default.createElement(_ReleaseBuild.default, {
3580
+ commandUsed: "todesktop release --latest",
3581
+ shouldReleaseLatest: true,
3582
+ shouldConfirm: !force
3583
+ });
3584
+ } else {
3585
+ return /*#__PURE__*/_react.default.createElement(_PickBuildForRelease.default, {
3586
+ commandUsed: "todesktop builds",
3587
+ shouldConfirm: !force
3588
+ });
3589
+ }
3590
+ };
3591
+
3592
+ return /*#__PURE__*/_react.default.createElement(_ErrorBoundary.default, null, /*#__PURE__*/_react.default.createElement(_LoginHOC.default, null, getContents()));
3593
+ };
3594
+
3595
+ ReleaseCommand.propTypes = {
3596
+ /// A specific build ID to release
3597
+ id: _propTypes.default.string,
3598
+ /// Skips interactive confirmation step
3599
+ force: _propTypes.default.bool,
3600
+ /// Release the latest build
3601
+ latest: _propTypes.default.bool
3602
+ };
3603
+ ReleaseCommand.positionalArgs = ["id"];
3604
+ var _default = ReleaseCommand;
3605
+ exports.default = _default;
3606
+ },{"../lib/utilities/checkIfReactIsUsable":"../lib/utilities/checkIfReactIsUsable.js","../lib/components/LoginHOC":"../lib/components/LoginHOC.js","../lib/components/ErrorBoundary":"../lib/components/ErrorBoundary.js","../lib/components/ReleaseBuild":"../lib/components/ReleaseBuild.js","../lib/components/PickBuildForRelease":"../lib/components/PickBuildForRelease.js","../lib/utilities/onCommand":"../lib/utilities/onCommand.js","../lib/utilities/useAnalytics":"../lib/utilities/useAnalytics.js"}]},{},["release.js"], null)
90
3607
  //# sourceMappingURL=/release.js.map