@overlayed/cli 1.0.0 → 1.0.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.
- package/dist/cli.mjs +1 -1
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import{Command as e}from"@commander-js/extra-typings";import{scope as t,type as
|
|
|
6
6
|
`].join(` `)}function Pe(...e){return[m.blue(`ℹ`),...e,`
|
|
7
7
|
`].join(` `)}async function q(){let e=process.env.OVERLAYED_API_KEY,t=I.get();if(e&&t?.currentAccount&&G.write(K.warning(`Using OVERLAYED_API_KEY environment variable instead of stored credentials.`)),!e&&!t?.currentAccount)throw new U(`Not authenticated. Run 'overlayed login' or set OVERLAYED_API_KEY.`);try{return(await V()).data.email}catch(t){if(!x(t))throw t;switch(t.response?.status){case 401:case 403:throw e?new U(`Authentication failed. Your OVERLAYED_API_KEY may be invalid or expired.`):new U(`Authentication failed. Your API key may be invalid or expired. Run 'overlayed login' to re-authenticate.`);default:throw Error(`API error occurred. Please try again later.`)}}}async function J(){let e=await M();if(e.length===0)throw new U(`No config file found matching `+j);return e.length>1&&G.write(m.yellow(`
|
|
8
8
|
Multiple config files found matching ${j}, using the first one.
|
|
9
|
-
`)),e.at(0)}var Fe=class extends H{defaultIgnore=[`overlayed.config.ts`];constructor(e){super(e)}async bundle(){let e=await super.bundle();if(!Object.keys(e.files).some(e=>e.endsWith(`.html`)))throw new Ie;return e}},Ie=class extends Error{constructor(){super(`Site bundle must contain at least one HTML file`)}};async function Le(e={}){await q();try{await Re(e)}catch(e){if(e instanceof U&&process.exit(1),x(e)){let t=e.response?.status;throw new U(`Request to ${(e.config?.baseURL??``)+(e.config?.url??``)} failed with status ${t}. ${JSON.stringify(e.response?.data,null,2)}`)}throw e}}async function Re(e){let t=await new S([{title:`Locating overlayed.config.ts`,task:async t=>t.config=await Ve(e)},{task:async(t,n)=>{if(e.app||e.site){let n=[];if(e.app&&(t.config.app?n.push(`app`):G.write(K.warning(`${m.bold(`--app`)} flag provided but no app config found in overlayed.config.ts`))),e.site&&(t.config.site?n.push(`site`):G.write(K.warning(`${m.bold(`--site`)} flag provided but no site config found in overlayed.config.ts`))),n.length===0)throw Error(`No valid bundles selected. Ensure the selected bundle types have valid config in overlayed.config.ts`);t.targetBundles=n,G.write(m.green(`Selected bundles: `)+m.bold(n.join(`, `)))}else{let e=await n.prompt(C).run(...Be(t.config));t.targetBundles=e,G.write(m.green(`Selected bundles: `)+m.bold(e.join(`, `)))}}},{task:async(t,n)=>{t.bundleNames={};for(let r of t.targetBundles){let i=r===`app`?e.app:e.site;if(typeof i==`string`)t.bundleNames[r]=i;else{let e=await n.prompt(C).run(de,{message:`Enter a name for the ${r} bundle (leave empty for random name):`});t.bundleNames[r]=e.trim()||void 0}}},rendererOptions:{persistentOutput:!0}}]).run();function n(e,t){let n=new URL(`https://overlay.dev/deployments/jobs`);n.searchParams.set(`applicationId`,e);for(let e of t)n.searchParams.append(`jobId`,e);return n.toString()}let r=await new S([{title:`Uploading bundles`,task:e=>new S(e.targetBundles.map((e,t)=>({title:`Uploading ${e} bundle`,task:async n=>{n.jobIds??=[];let r=n.bundleNames[e],i=await ze(n.config,e,r);i&&(n.jobIds[t]=i.id)}})),{concurrent:!0,rendererOptions:{collapseSubtasks:!1}})},{title:`Waiting for bundles to be processed.`,task:t=>{if(e.wait===!1){if(t.jobIds.length>0){let e=n(t.config.applicationId,t.jobIds);G.write(m.yellow(`Skipping wait. Check bundle status in the dashboard: `)+m.blue(e))}return}return new S(t.jobIds.map((e,r)=>({title:`Waiting for ${m.bold(t.targetBundles[r])} bundle to be processed. This may take a couple minutes - you can wait for the bundles to appear in the dashboard here: ${m.blue(n(t.config.applicationId,t.jobIds))}`,task:async(t,i)=>{let a=0,o=t.targetBundles[r],s=n(t.config.applicationId,t.jobIds),c;for(;;){if(a++>100){i.title=`${m.red(`Timeout`)} - ${m.bold(o)} bundle processing is taking longer than expected. Check the dashboard: ${m.blue(s)}`;return}c=await be(t.config.applicationId,e);let n=c.data.status;if(n===`completed`){i.title=`${m.green(`Completed`)} - ${m.bold(o)} bundle has been processed successfully.`;break}if(n===`failed`){i.title=`${m.red(`Failed`)} - ${m.bold(o)} bundle processing failed.`;break}n===`pending`?i.title=`${m.yellow(`Queued`)} - ${m.bold(o)} bundle is queued for processing. Dashboard: ${m.blue(s)}`:n===`running`&&(i.title=`${m.green(`Running`)} - ${m.bold(o)} bundle is being processed. Dashboard: ${m.blue(s)}`),await new Promise(e=>setTimeout(e,3e3))}if(c.data.status===`failed`){let e=`An unknown error occurred.`;c.data.runs.length>0&&(e=c.data.runs[c.data.runs.length-1].error_message??e),i.title=`${m.red(`Failed`)} - ${m.bold(o)} bundle processing failed: ${e}`}}})),{concurrent:!0,exitOnError:!1,rendererOptions:{collapseSubtasks:!1}})}}]).run(t);if(r.jobIds.length>0){let e=n(r.config.applicationId,r.jobIds);G.write(``),G.write(m.green(`Bundle dashboard: `)+m.blue(e))}}async function ze(e,t,n){let r=await ve(e.applicationId,{type:t,name:n}),i=await e[t]?.bundle()??he(Error(`No bundle found for `+t));e.debug&&i.forEach(e=>{console.log(`Zipping: `,e)});let a=await i.generateAsync({type:`nodebuffer`});if(e.debug){let e=`.overlayed/tmp`;l(e),ee(`${e}/debug-${t}.zip`,a);return}return await Se(r.data.upload_request,a),(await ye(e.applicationId,r.data.asset_bundle_name)).data}function Be(e){let t=e=>`(Disabled: No config found for "${e}" in overlayed.config.ts)`;return[ue,{message:`Select your desired bundles to create and upload.`,shortcuts:{all:`a`,invert:`i`},choices:[{name:`App`,value:`app`,disabled:e.app?void 0:t(`app`)},{name:`Site`,value:`site`,disabled:e.site?void 0:t(`site`)}]}]}async function Ve(e){let[t,n]=await J();return{...t,applicationId:B(t.applicationId),app:He(t,n,e),site:Ue(t,n,e),debug:e.debug}}function He(e,t,n){let r=new Te(e),i=Y(t,e.app.baseDir);return n.debug&&console.log(`[App] Bundling files from: `,i),r.addGlobPattern(e.app.include,{ignore:e.app.exclude,cwd:i}),r}function Ue(e,t,n){if(!e.site)return;let r=new Fe(e),i=Y(t,e.site.baseDir);return n.debug&&console.log(`[Site] Bundling files from: `,i),r.addGlobPattern(e.site.include,{ignore:e.site.exclude,cwd:i}),r}function Y(e,t){return t?d.resolve(d.dirname(e),t):d.dirname(e)}const We=new e(`bundle`).description(`Bundle the app and site for deployment.`).addHelpText(`after`,`
|
|
9
|
+
`)),e.at(0)}var Fe=class extends H{defaultIgnore=[`overlayed.config.ts`];constructor(e){super(e)}async bundle(){let e=await super.bundle();if(!Object.keys(e.files).some(e=>e.endsWith(`.html`)))throw new Ie;return e}},Ie=class extends Error{constructor(){super(`Site bundle must contain at least one HTML file`)}};async function Le(e={}){await q();try{await Re(e)}catch(e){if(e instanceof U&&process.exit(1),x(e)){let t=e.response?.status;throw new U(`Request to ${(e.config?.baseURL??``)+(e.config?.url??``)} failed with status ${t}. ${JSON.stringify(e.response?.data,null,2)}`)}throw e}}async function Re(e){let t=await new S([{title:`Locating overlayed.config.ts`,task:async t=>t.config=await Ve(e)},{task:async(t,n)=>{if(e.app||e.site){let n=[];if(e.app&&(t.config.app?n.push(`app`):G.write(K.warning(`${m.bold(`--app`)} flag provided but no app config found in overlayed.config.ts`))),e.site&&(t.config.site?n.push(`site`):G.write(K.warning(`${m.bold(`--site`)} flag provided but no site config found in overlayed.config.ts`))),n.length===0)throw Error(`No valid bundles selected. Ensure the selected bundle types have valid config in overlayed.config.ts`);t.targetBundles=n,G.write(m.green(`Selected bundles: `)+m.bold(n.join(`, `)))}else{let e=await n.prompt(C).run(...Be(t.config));t.targetBundles=e,G.write(m.green(`Selected bundles: `)+m.bold(e.join(`, `)))}}},{task:async(t,n)=>{t.bundleNames={};for(let r of t.targetBundles){let i=r===`app`?e.app:e.site;if(typeof i==`string`)t.bundleNames[r]=i;else if(e.wait===!1)t.bundleNames[r]=void 0;else{let e=await n.prompt(C).run(de,{message:`Enter a name for the ${r} bundle (leave empty for random name):`});t.bundleNames[r]=e.trim()||void 0}}},rendererOptions:{persistentOutput:!0}}]).run();function n(e,t){let n=new URL(`https://overlay.dev/deployments/jobs`);n.searchParams.set(`applicationId`,e);for(let e of t)n.searchParams.append(`jobId`,e);return n.toString()}let r=await new S([{title:`Uploading bundles`,task:e=>new S(e.targetBundles.map((e,t)=>({title:`Uploading ${e} bundle`,task:async n=>{n.jobIds??=[];let r=n.bundleNames[e],i=await ze(n.config,e,r);i&&(n.jobIds[t]=i.id)}})),{concurrent:!0,rendererOptions:{collapseSubtasks:!1}})},{title:`Waiting for bundles to be processed.`,task:t=>{if(e.wait===!1){if(t.jobIds.length>0){let e=n(t.config.applicationId,t.jobIds);G.write(m.yellow(`Skipping wait. Check bundle status in the dashboard: `)+m.blue(e))}return}return new S(t.jobIds.map((e,r)=>({title:`Waiting for ${m.bold(t.targetBundles[r])} bundle to be processed. This may take a couple minutes - you can wait for the bundles to appear in the dashboard here: ${m.blue(n(t.config.applicationId,t.jobIds))}`,task:async(t,i)=>{let a=0,o=t.targetBundles[r],s=n(t.config.applicationId,t.jobIds),c;for(;;){if(a++>100){i.title=`${m.red(`Timeout`)} - ${m.bold(o)} bundle processing is taking longer than expected. Check the dashboard: ${m.blue(s)}`;return}c=await be(t.config.applicationId,e);let n=c.data.status;if(n===`completed`){i.title=`${m.green(`Completed`)} - ${m.bold(o)} bundle has been processed successfully.`;break}if(n===`failed`){i.title=`${m.red(`Failed`)} - ${m.bold(o)} bundle processing failed.`;break}n===`pending`?i.title=`${m.yellow(`Queued`)} - ${m.bold(o)} bundle is queued for processing. Dashboard: ${m.blue(s)}`:n===`running`&&(i.title=`${m.green(`Running`)} - ${m.bold(o)} bundle is being processed. Dashboard: ${m.blue(s)}`),await new Promise(e=>setTimeout(e,3e3))}if(c.data.status===`failed`){let e=`An unknown error occurred.`;c.data.runs.length>0&&(e=c.data.runs[c.data.runs.length-1].error_message??e),i.title=`${m.red(`Failed`)} - ${m.bold(o)} bundle processing failed: ${e}`}}})),{concurrent:!0,exitOnError:!1,rendererOptions:{collapseSubtasks:!1}})}}]).run(t);if(r.jobIds.length>0){let e=n(r.config.applicationId,r.jobIds);G.write(``),G.write(m.green(`Bundle dashboard: `)+m.blue(e))}}async function ze(e,t,n){let r=await ve(e.applicationId,{type:t,name:n}),i=await e[t]?.bundle()??he(Error(`No bundle found for `+t));e.debug&&i.forEach(e=>{console.log(`Zipping: `,e)});let a=await i.generateAsync({type:`nodebuffer`});if(e.debug){let e=`.overlayed/tmp`;l(e),ee(`${e}/debug-${t}.zip`,a);return}return await Se(r.data.upload_request,a),(await ye(e.applicationId,r.data.asset_bundle_name)).data}function Be(e){let t=e=>`(Disabled: No config found for "${e}" in overlayed.config.ts)`;return[ue,{message:`Select your desired bundles to create and upload.`,shortcuts:{all:`a`,invert:`i`},choices:[{name:`App`,value:`app`,disabled:e.app?void 0:t(`app`)},{name:`Site`,value:`site`,disabled:e.site?void 0:t(`site`)}]}]}async function Ve(e){let[t,n]=await J();return{...t,applicationId:B(t.applicationId),app:He(t,n,e),site:Ue(t,n,e),debug:e.debug}}function He(e,t,n){let r=new Te(e),i=Y(t,e.app.baseDir);return n.debug&&console.log(`[App] Bundling files from: `,i),r.addGlobPattern(e.app.include,{ignore:e.app.exclude,cwd:i}),r}function Ue(e,t,n){if(!e.site)return;let r=new Fe(e),i=Y(t,e.site.baseDir);return n.debug&&console.log(`[Site] Bundling files from: `,i),r.addGlobPattern(e.site.include,{ignore:e.site.exclude,cwd:i}),r}function Y(e,t){return t?d.resolve(d.dirname(e),t):d.dirname(e)}const We=new e(`bundle`).description(`Bundle the app and site for deployment.`).addHelpText(`after`,`
|
|
10
10
|
Documentation:
|
|
11
11
|
http://docs.overlayed.gg/cli/bundle
|
|
12
12
|
`).helpCommand(`overlayed bundle`).option(`--debug`,`Enable debug mode`,!1).option(`--app [name]`,`Bundle the app (optional: provide a custom name, random if omitted)`).option(`--site [name]`,`Bundle the site (optional: provide a custom name, random if omitted)`).option(`--no-wait`,`Skip waiting for bundle processing to complete`).action(Le);async function X(){await q();let[e]=await J(),t=F({...(await xe(B(e.applicationId))).data,siteUrl:``});G.write(K.success(`Initialized development environment for ${t.application.name}`))}const Ge=new e(`init`).description(`Initialize the local development environment.`).action(X);function Ke(e){return`https://overlay.dev${e}`}const qe=me(pe);async function Je(){let e=Ke(`/user-settings/api-keys?cli=true`);if(await Ye(e),!await fe({message:`To authenticate, you'll need an API Key. We've opened the page to create one in your browser.\n\n${K.info(e)}\n\nOnce you have it, enter it here:`,async validate(e){z(()=>e);try{let t={email:(await V()).data.email,apiKey:e},n=I.get();I.set({...n,currentAccount:t,accounts:n?.accounts.concat(t)??[t]})}catch(e){if(!x(e))return`Unknown error has occurred: ${e}`;switch(e.response?.status){case 401:case 403:return`Invalid API key, please try again.`;default:return`API error, please try again later.`}}return z(()=>I.get()?.currentAccount?.apiKey),!0}}))throw Error(`Login unknown error - this should never happen`);let t=I.get();if(!t?.currentAccount)throw Error(`Could not get config after login`);let n=t.currentAccount.email;G.write(K.success(`Authentication Complete - Logged in as ${n}`))}async function Ye(e){let t=process.platform,n;switch(t){case`darwin`:n=`open "${e}"`;break;case`win32`:n=`start "" "${e}"`;break;default:n=`xdg-open "${e}"`;break}try{await qe(n)}catch{}}const Xe=new e(`login`).description(`Authenticate with the Overlayed platform.`).helpCommand(`overlayed login`).action(Je);async function Ze(){let e=await q(),t=I.get();if(!t){G.write(K.normal(`Not currently logged in.`));return}let n=t.accounts.filter(t=>t.email!==e);I.set({...t,currentAccount:void 0,accounts:n}),G.write(K.normal(`Logged out from ${e}`))}const Qe=new e(`logout`).description(`Log out of the currently authenticated account.`).helpCommand(`overlayed logout`).action(Ze);async function $e(){let e=await q();return G.write(K.normal(`Logged in as ${e}`)),e}const et=new e(`whoami`).description(`Display information about the currently authenticated user.`).addHelpText(`after`,`
|