@swirls/cli 0.0.19 → 0.0.20
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/bash-complete.js +1 -1
- package/dist/cli.js +1 -1
- package/package.json +2 -2
package/dist/bash-complete.js
CHANGED
|
@@ -38,5 +38,5 @@ var Vt=Object.defineProperty;var f=(e,t)=>()=>(e&&(t=e(e=0)),t);var b=(e,t)=>{fo
|
|
|
38
38
|
</div>
|
|
39
39
|
</body>
|
|
40
40
|
</html>
|
|
41
|
-
`});import qt from"@clerk/clerk-js/headless/index.js";async function Te(e){let t=new er(e);return await t.load({standardBrowser:!1}),t}async function Re(e,t){let r=await e.client?.signIn.create({ticket:t,strategy:"ticket"});if(!r||!r.createdSessionId)throw new Error("Failed to sign in.");return{createdSessionId:r.createdSessionId}}var er,Ue=f(()=>{"use strict";i();er=qt.Clerk});async function K(e,t){await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)||await e.fsPromise.mkdir(t,{recursive:!0})}function U(e){if(!e.path)throw new Error("No `path` found in context.");if(!e.os)throw new Error("No `os` found in context.");let t=e.os.homedir();return e.path.join(t,".swirls")}var Z=f(()=>{"use strict";i()});import*as j from"zod";function Q(e){return`${U(e)}/credentials`}async function Ee(e){let t=Q(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}async function O(e){let t=Q(e),r=await e.fsPromise.readFile(t,"utf8");return j.parse(tr,JSON.parse(r))}async function X(e,t,r,o){let a=Q(e);await K(e,U(e)),await e.fsPromise.writeFile(a,JSON.stringify({idToken:t,jwt:r,sessionId:o}))}var tr,q=f(()=>{"use strict";i();Z();tr=j.object({idToken:j.string(),jwt:j.string(),sessionId:j.string()})});import rr from"open";function De(e=32){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=new Uint8Array(e);crypto.getRandomValues(r);let o="";for(let a of r)o+=t[a%t.length];return o}function Ae(e){let t=new URLSearchParams({client_id:e.clientId,redirect_uri:e.redirectUri,response_type:"code",scope:"openid profile email",state:e.state});rr(`${e.authorizeUri}?${t}`)}var $e=f(()=>{"use strict";i()});import*as v from"zod";var or,ir,N,ee=f(()=>{"use strict";i();or=v.object({API_URL:v.string(),OAUTH_AUTHORIZE_URL:v.string()}),ir={API_URL:"https://swirls.ai/api",OAUTH_AUTHORIZE_URL:"https://clerk.swirls.ai/oauth/authorize"},N=v.parse(or,ir)});import{withResult as ar}from"@byteslice/result";import{createORPCClient as sr,onError as nr}from"@orpc/client";import{RPCLink as cr}from"@orpc/client/fetch";async function u(e){let t=new cr({url:`${N.API_URL}/rpc`,headers:async()=>{let o=await ar(()=>O(e),c=>new Error("Failed to read credentials file",{cause:c.message}));if(o.failure)return{};let{idToken:a,jwt:s}=o.data;return{Authorization:`Bearer ${s||a}`}},interceptors:[nr(o=>{o instanceof Error&&o.name==="AbortError"||console.error(o)})]});return sr(t)}var P=f(()=>{"use strict";i();q();ee()});import{Box as lr,Text as ze}from"ink";import{jsx as _e,jsxs as mr}from"react/jsx-runtime";function p(e){return mr(lr,{flexDirection:"column",children:[_e(ze,{color:"red",children:e.message}),_e(ze,{children:"If this issue persists, send us an email at help@byteslice.co, and we can help you out."})]})}var y=f(()=>{"use strict";i()});import{Text as pr}from"ink";import{jsx as fr}from"react/jsx-runtime";function g(e){return fr(pr,{color:"green",children:e.message})}var k=f(()=>{"use strict";i()});import{Text as dr}from"ink";import{jsx as ur}from"react/jsx-runtime";function Be(e){return ur(dr,{color:"yellow",children:e.message})}var Oe=f(()=>{"use strict";i()});function gr(e){return`${U(e)}/project`}async function Ne(e){let t=gr(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}var Me=f(()=>{"use strict";i();Z()});var te={};b(te,{login:()=>hr,logout:()=>xr});import{withResult as C}from"@byteslice/result";import{render as L}from"ink";import{jsx as I}from"react/jsx-runtime";async function wr(e,t,r){let o=await C(async()=>await(await u(e)).cli.exchangeToken({code:r.code}),h=>new Error("Failed to exchange callback code for token",{cause:h.message}));if(o.failure)throw o.failure;await X(e,o.data.idToken,"","");let a=await C(async()=>await(await u(e)).cli.createSignInTicket(),h=>new Error("Failed to exchange ID token code for a sign-in ticket",{cause:h.message}));if(a.failure)throw a.failure;let s=await Te(t.clerkPublishableKey),c=await C(()=>Re(s,a.data.token),h=>new Error("Failed to create a new sign-in for this device",{cause:h.message}));if(c.failure)throw c.failure;let d=await C(async()=>await(await u(e)).cli.createJwt({sessionId:c.data.createdSessionId}),h=>new Error("Failed to create a session JWT",{cause:h.message}));if(d.failure)throw d.failure;let n=await C(()=>X(e,o.data.idToken,d.data,c.data.createdSessionId),h=>new Error("Failed to save your credentials to disk",{cause:h.message}));if(n.failure)throw n.failure}async function hr(){let e=await u(this),t=De(),r=await C(()=>e.cli.getConfig(),a=>new Error("Failed to retrieve authentication configuration",{cause:a.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),Ae({authorizeUri:N.OAUTH_AUTHORIZE_URL,clientId:r.data.clientId,redirectUri:G,state:t});let o=await C(()=>Le(async a=>{if(a.state!==t)throw new Error("Invalid state.");await wr(this,r.data,a)}),a=>a);o.failure&&(L(I(p,{message:o.failure.message})),process.exit(1)),L(I(g,{message:"Success! You are now logged in."}))}async function xr(){let e=await C(()=>O(this),s=>s);e.failure&&(L(I(p,{message:"There was an issue reading your credentials. You are probably already logged out."})),process.exit(1));let t=await u(this),r=await C(()=>t.cli.getConfig(),s=>new Error("Failed to retrieve authentication configuration",{cause:s.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),(await C(async()=>t.cli.revokeSession({sessionId:e.data.sessionId}),s=>s)).failure&&L(I(Be,{message:"There was an issue revoking your session. You are probably already logged out. Purging credentials file..."}));let a=await C(async()=>{await Ee(this),await Ne(this)},s=>s);if(a.failure)throw a.failure;L(I(g,{message:"Success! You are now logged out."}))}var re=f(()=>{"use strict";i();Ie();Ue();q();$e();P();y();k();Oe();ee();Me()});import{Box as Pr,Text as Ye}from"ink";import kr from"ink-spinner";import{jsx as Ve,jsxs as We}from"react/jsx-runtime";function Ge(e){return We(Pr,{children:[Ve(Ye,{color:"cyan",children:Ve(kr,{type:"dots"})}),We(Ye,{children:[" ",e.message]})]})}var Ke=f(()=>{"use strict";i()});import{existsSync as Sr}from"fs";import{resolve as jr}from"path";import{configFileName as Ze,configSchema as Fr}from"@swirls/sdk/config";import{createJiti as vr}from"jiti";async function Qe(){let e=jr(process.cwd(),Ze);if(!Sr(e))throw new Error(`Config file not found in project root: ${Ze}`);let r=await vr(import.meta.url).import(e,{default:!0});return Fr.parse(r)}var Xe=f(()=>{"use strict";i()});async function qe(e,t){let r=await u(e),{results:o}=await r.forms.listForms({projectId:t});function a(c){return c.schema!=null}return o.filter(a).map(c=>({id:c.id,name:c.name,schema:c.schema}))}var et=f(()=>{"use strict";i();P()});import tt from"fs/promises";import Lr from"path";async function M(e,t){let r=Lr.dirname(e);await tt.mkdir(r,{recursive:!0}),await tt.writeFile(e,t,"utf-8")}var oe=f(()=>{"use strict";i()});var rt={};b(rt,{generateCode:()=>Tr});import ie from"process";import{withResult as ae}from"@byteslice/result";import{generateFormsCode as Ir}from"@swirls/sdk/form/generate";import{render as E}from"ink";import{jsx as D}from"react/jsx-runtime";async function Tr(){let e=await ae(()=>Qe(),s=>new Error("Failed to load configuration",{cause:s}));e.failure&&(E(D(p,{message:e.failure.message})),ie.exit(1));let{projectId:t,genPath:r}=e.data;E(D(Ge,{message:"Generating form code..."}));let o=await ae(async()=>{let s=['// This file was generated by "@swirls/cli dev generate"',"// Do not edit this file manually",""],c=await qe(this,t);return Ir(c,s)},s=>new Error(`Failed to generate form code: ${s.message}`,{cause:s}));o.failure&&(E(D(p,{message:o.failure.message})),ie.exit(1));let a=await ae(()=>M(r,o.data),s=>new Error("Failed to write code file",{cause:s}));a.failure&&(E(D(p,{message:a.failure.message})),ie.exit(1)),E(D(g,{message:`Success! Generated code at ${r}`}))}var ot=f(()=>{"use strict";i();y();Ke();k();Xe();et();oe()});import{Box as it,render as Rr,Text as at}from"ink";import Ur from"ink-text-input";import{useState as st}from"react";import{z as Er}from"zod";import{jsx as H,jsxs as nt}from"react/jsx-runtime";function Dr(e){let[t,r]=st(""),[o,a]=st(null);return nt(it,{flexDirection:"column",children:[nt(it,{children:[H(at,{children:"Enter project ID (UUID): "}),H(Ur,{value:t,onChange:d=>{a(null),r(d)},onSubmit:d=>{if(a(null),d.trim()===""){setImmediate(()=>e.onInput());return}let n=Er.uuid().safeParse(d);if(!n.success){a("Invalid UUID. Please try again."),r("");return}setImmediate(()=>e.onInput(n.data))}})]}),o&&H(at,{color:"red",children:o})]})}async function ct(){return new Promise(e=>{let t=Rr(H(Dr,{onInput:r=>{t.unmount(),e(r)}}))})}var lt=f(()=>{"use strict";i()});var mt={};b(mt,{initializeConfig:()=>Or});import{existsSync as Ar}from"fs";import{resolve as $r}from"path";import se from"process";import{withResult as zr}from"@byteslice/result";import{configFileName as _r,generateConfig as Br}from"@swirls/sdk/config";import{render as ne}from"ink";import{jsx as ce}from"react/jsx-runtime";async function Or(){let e=$r(se.cwd(),_r);Ar(e)&&(ne(ce(p,{message:`Configuration already exists at ${e}.`})),se.exit(1));let t=await ct(),r=await zr(async()=>{let o=Br(t);await M(e,o)},o=>new Error("Failed to create configuration",{cause:o}));r.failure&&(ne(ce(p,{message:r.failure.message})),se.exit(1)),ne(ce(g,{message:`Success! Created configuration at ${e}`}))}var pt=f(()=>{"use strict";i();y();k();lt();oe()});import{render as Jr}from"ink";import Yr from"open";import{jsx as Wr}from"react/jsx-runtime";async function J(e){let t=`${Vr}/${e.id}`;await Yr(t),Jr(Wr(g,{message:`Opened project "${e.name}" in browser.`}))}var Vr,le=f(()=>{"use strict";i();k();Vr="https://swirls.ai/projects"});import{Box as me,render as Gr,Text as Kr}from"ink";import Zr from"ink-text-input";import{useState as Qr}from"react";import{jsx as fe,jsxs as pe}from"react/jsx-runtime";function Xr(e){let[t,r]=Qr(""),o=a=>{let s=a.trim().toLowerCase(),c=s===""||s==="y"||s==="yes";setImmediate(()=>e.onAnswer(c))};return fe(me,{flexDirection:"column",children:pe(me,{children:[pe(Kr,{children:[e.message," "]}),fe(Zr,{value:t,onChange:r,onSubmit:o})]})})}async function ut(e){let{above:t}=e??{};return new Promise(r=>{let o=Gr(pe(me,{flexDirection:"column",children:[t,fe(Xr,{message:"Open project in browser? (Y/n)",onAnswer:a=>{o.unmount(),r(a)}})]}))})}var gt=f(()=>{"use strict";i()});var ht={};b(ht,{createProject:()=>to});import{withResult as qr}from"@byteslice/result";import{render as eo}from"ink";import{jsx as wt}from"react/jsx-runtime";async function to(e,t){let r=await u(this),o=await qr(()=>r.projects.createProject({name:t}),s=>new Error(`Failed to create project: ${s.message}`,{cause:s}));o.failure&&(eo(wt(p,{message:o.failure.message})),process.exit(1)),await ut({above:wt(g,{message:`Success! Created "${t}" project: ${o.data.id}`})})&&await J(o.data)}var xt=f(()=>{"use strict";i();P();y();k();le();gt()});var bt={};b(bt,{openProject:()=>oo});import{withResult as ro}from"@byteslice/result";import{render as yt}from"ink";import{jsx as Ct}from"react/jsx-runtime";async function oo(e,t){let r=await u(this),o=await ro(()=>r.projects.getProject({projectId:t}),a=>new Error(`Failed to get project: ${a.message}`,{cause:a}));o.failure&&(yt(Ct(p,{message:o.failure.message})),process.exit(1)),o.data||(yt(Ct(p,{message:"Project not found."})),process.exit(1)),await J(o.data)}var Pt=f(()=>{"use strict";i();P();y();le()});import{Box as T,Text as Y}from"ink";import{Fragment as no}from"react";import{Fragment as po,jsx as x,jsxs as ue}from"react/jsx-runtime";function co(e){return typeof e=="boolean"?e?ue(po,{children:[x(Y,{color:"green",children:"\u2714"})," yes"]}):"no":String(e)}function lo(e,t){return t.map(r=>{let o=r.key in e?co(e[r.key]):null;return{column:r,value:o}})}function mo(e,t,r=1){return t.map(o=>{let a=String(o).length,s=e.map(d=>o in d&&(typeof d[o]=="string"||typeof d[o]=="number")?String(d[o]).length:0),c=Math.max(...s,a)+r*2;return{name:String(o),key:o,width:c}})}function de(e){return x(Y,{children:Array(e.width).fill("\u2500").join("")})}function jt(e){let t=mo(e.data,e.keys),r=t.reduce((o,a)=>o+a.width,0);return ue(T,{flexDirection:"column",width:r,children:[x(de,{width:r}),x(T,{flexDirection:"row",children:t.map(o=>x(T,{width:o.width,children:x(Y,{bold:!0,color:"blue",children:o.name})},o.name))}),x(de,{width:r}),x(T,{flexDirection:"column",children:e.data.map((o,a)=>{let s=lo(o,t);return ue(no,{children:[x(T,{flexDirection:"row",children:s.map(c=>x(T,{width:c.column.width,children:x(Y,{children:c.value})},c.column.name))}),x(de,{width:r})]},`row-${a}`)})})]})}var Ft=f(()=>{"use strict";i()});import{existsSync as fo}from"fs";import{resolve as uo}from"path";import{configFileName as vt,configSchema as go}from"@swirls/sdk/config";import{createJiti as wo}from"jiti";async function S(e){if(e)return e;let t=uo(process.cwd(),vt);if(!fo(t))throw new Error(`No project specified and no ${vt} found. Use --project flag or run from a project directory.`);let o=await wo(import.meta.url).import(t,{default:!0});return go.parse(o).projectId}var R=f(()=>{"use strict";i()});var It={};b(It,{list:()=>ho});import{withResult as Lt}from"@byteslice/result";import{render as ge}from"ink";import{jsx as we}from"react/jsx-runtime";async function ho(e,t){let r=await Lt(()=>S(e.project),n=>new Error(n.message));r.failure&&(ge(we(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await Lt(()=>o.buckets.listFiles({projectId:r.data,path:t}),n=>new Error(`Failed to list files: ${n.message}`,{cause:n}));a.failure&&(ge(we(p,{message:a.failure.message})),process.exit(1));let{files:s,folders:c}=a.data;if(c.length===0&&s.length===0){console.log("No files or folders found.");return}let d=[...c.map(n=>({type:"folder",name:n.name,size:"-"})),...s.map(n=>({type:"file",name:n.name,size:n.size?xo(n.size):"-"}))];ge(we(jt,{keys:["type","name","size"],data:d}))}function xo(e){if(e===0)return"0 B";let t=1024,r=["B","KB","MB","GB","TB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/t**o).toFixed(2))} ${r[o]}`}var Tt=f(()=>{"use strict";i();P();y();Ft();R()});var Rt={};b(Rt,{upload:()=>bo});import{readFile as yo}from"fs/promises";import{basename as Co}from"path";import{withResult as V}from"@byteslice/result";import{render as A}from"ink";import{jsx as $}from"react/jsx-runtime";async function bo(e,t,r){let o=await V(()=>S(e.project),w=>new Error(w.message));o.failure&&(A($(p,{message:o.failure.message})),process.exit(1));let a=await V(()=>yo(t),w=>new Error(`Failed to read file: ${w.message}`,{cause:w}));a.failure&&(A($(p,{message:a.failure.message})),process.exit(1));let s=Co(t),c=r?`${r}/${s}`:s,d=await u(this),n=await V(()=>d.buckets.createSignedUploadUrl({projectId:o.data,path:c}),w=>new Error(`Failed to get upload URL: ${w.message}`,{cause:w}));n.failure&&(A($(p,{message:n.failure.message})),process.exit(1));let h=await V(async()=>{let w=await fetch(n.data.signedUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream","x-upsert":"true"},body:a.data});if(!w.ok)throw new Error(`Upload failed: ${w.statusText}`);return w},w=>new Error(`Failed to upload file: ${w.message}`,{cause:w}));h.failure&&(A($(p,{message:h.failure.message})),process.exit(1)),A($(g,{message:`Uploaded ${s} to ${c}`}))}var Ut=f(()=>{"use strict";i();P();y();k();R()});var Et={};b(Et,{download:()=>ko});import{writeFile as Po}from"fs/promises";import{withResult as W}from"@byteslice/result";import{render as z}from"ink";import{jsx as _}from"react/jsx-runtime";async function ko(e,t,r){let o=await W(()=>S(e.project),n=>new Error(n.message));o.failure&&(z(_(p,{message:o.failure.message})),process.exit(1));let a=await u(this),s=await W(()=>a.buckets.createSignedUrl({projectId:o.data,path:t}),n=>new Error(`Failed to get download URL: ${n.message}`,{cause:n}));s.failure&&(z(_(p,{message:s.failure.message})),process.exit(1));let c=await W(async()=>{let n=await fetch(s.data.signedUrl);if(!n.ok)throw new Error(`Download failed: ${n.statusText}`);return n.arrayBuffer()},n=>new Error(`Failed to download file: ${n.message}`,{cause:n}));c.failure&&(z(_(p,{message:c.failure.message})),process.exit(1));let d=await W(()=>Po(r,Buffer.from(c.data)),n=>new Error(`Failed to write file: ${n.message}`,{cause:n}));d.failure&&(z(_(p,{message:d.failure.message})),process.exit(1)),z(_(g,{message:`Downloaded ${t} to ${r}`}))}var Dt=f(()=>{"use strict";i();P();y();k();R()});var $t={};b($t,{deleteFile:()=>So});import{withResult as At}from"@byteslice/result";import{render as he}from"ink";import{jsx as xe}from"react/jsx-runtime";async function So(e,t){let r=await At(()=>S(e.project),s=>new Error(s.message));r.failure&&(he(xe(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await At(()=>o.buckets.deleteFile({projectId:r.data,path:t}),s=>new Error(`Failed to delete file: ${s.message}`,{cause:s}));a.failure&&(he(xe(p,{message:a.failure.message})),process.exit(1)),he(xe(g,{message:`Deleted ${t}`}))}var zt=f(()=>{"use strict";i();P();y();k();R()});var Bt={};b(Bt,{url:()=>jo});import{withResult as _t}from"@byteslice/result";import{render as ye}from"ink";import{jsx as Ce}from"react/jsx-runtime";async function jo(e,t){let r=await _t(()=>S(e.project),s=>new Error(s.message));r.failure&&(ye(Ce(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await _t(()=>o.buckets.createSignedUrl({projectId:r.data,path:t,expiresIn:e.expires}),s=>new Error(`Failed to create signed URL: ${s.message}`,{cause:s}));a.failure&&(ye(Ce(p,{message:a.failure.message})),process.exit(1)),console.log(a.data.signedUrl),ye(Ce(g,{message:`URL expires at ${a.data.expiresAt}`}))}var Ot=f(()=>{"use strict";i();P();y();k();R()});i();import{proposeCompletions as Yt}from"@stricli/core";i();import{buildInstallCommand as Uo,buildUninstallCommand as Eo}from"@stricli/auto-complete";import{buildApplication as Do,buildRouteMap as Ao}from"@stricli/core";i();import{buildCommand as He,buildRouteMap as yr}from"@stricli/core";var Cr=He({loader:async()=>{let{login:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log in with an existing account"}}),br=He({loader:async()=>{let{logout:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log out of an existing account"}}),Je=yr({routes:{login:Cr,logout:br},docs:{brief:"Auth commands"}});i();import{buildCommand as ft,buildRouteMap as Nr}from"@stricli/core";var Mr=ft({loader:async()=>{let{generateCode:e}=await Promise.resolve().then(()=>(ot(),rt));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Generate application code and types"}}),Hr=ft({loader:async()=>{let{initializeConfig:e}=await Promise.resolve().then(()=>(pt(),mt));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Initialize Swirls configuration file"}}),dt=Nr({routes:{gen:Mr,init:Hr},docs:{brief:"Developer commands"}});i();import{buildCommand as kt,buildRouteMap as io}from"@stricli/core";var ao=kt({loader:async()=>{let{createProject:e}=await Promise.resolve().then(()=>(xt(),ht));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project name",parse:String,placeholder:"name"}]}},docs:{brief:"Create a new project"}}),so=kt({loader:async()=>{let{openProject:e}=await Promise.resolve().then(()=>(Pt(),bt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project ID",parse:String,placeholder:"project-id"}]}},docs:{brief:"Open project in browser"}}),St=io({routes:{create:ao,open:so},docs:{brief:"Project commands"}});i();import{buildCommand as B,buildRouteMap as Fo}from"@stricli/core";var vo=B({loader:async()=>{let{list:e}=await Promise.resolve().then(()=>(Tt(),It));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to list (optional)",parse:String,placeholder:"path",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"List files in storage"}}),Lo=B({loader:async()=>{let{upload:e}=await Promise.resolve().then(()=>(Ut(),Rt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Local file path to upload",parse:String,placeholder:"file"},{brief:"Destination path in storage (optional)",parse:String,placeholder:"dest",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Upload a file to storage"}}),Io=B({loader:async()=>{let{download:e}=await Promise.resolve().then(()=>(Dt(),Et));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"},{brief:"Local destination path",parse:String,placeholder:"dest"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Download a file from storage"}}),To=B({loader:async()=>{let{deleteFile:e}=await Promise.resolve().then(()=>(zt(),$t));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Delete a file from storage"}}),Ro=B({loader:async()=>{let{url:e}=await Promise.resolve().then(()=>(Ot(),Bt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0},expires:{kind:"parsed",brief:"Expiration time in seconds (default: 86400 = 24 hours)",parse:Number,optional:!0}}},docs:{brief:"Get a signed URL for a file"}}),Nt=Fo({routes:{list:vo,upload:Lo,download:Io,delete:To,url:Ro},docs:{brief:"Storage commands"}});var Mt="@swirls/cli",Ht="0.0.19",Jt="Swirls command line application";var $o=Ao({routes:{auth:Je,dev:dt,project:St,storage:Nt,install:Uo("cli",{bash:"__cli_bash_complete"}),uninstall:Eo("cli",{bash:!0})},docs:{brief:Jt,hideRoute:{install:!0,uninstall:!0}}}),Pe=Do($o,{name:Mt,versionInfo:{currentVersion:Ht}});i();import zo from"fs";import _o from"fs/promises";import Bo from"os";import Oo from"path";function ke(e){return{fs:zo,fsPromise:_o,os:Bo,path:Oo,process:e}}var Se=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&Se.push("");await Yt(Pe,Se,ke(process));try{for(let{completion:e}of await Yt(Pe,Se,ke(process)))process.stdout.write(`${e}
|
|
41
|
+
`});import qt from"@clerk/clerk-js/headless/index.js";async function Te(e){let t=new er(e);return await t.load({standardBrowser:!1}),t}async function Re(e,t){let r=await e.client?.signIn.create({ticket:t,strategy:"ticket"});if(!r||!r.createdSessionId)throw new Error("Failed to sign in.");return{createdSessionId:r.createdSessionId}}var er,Ue=f(()=>{"use strict";i();er=qt.Clerk});async function K(e,t){await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)||await e.fsPromise.mkdir(t,{recursive:!0})}function U(e){if(!e.path)throw new Error("No `path` found in context.");if(!e.os)throw new Error("No `os` found in context.");let t=e.os.homedir();return e.path.join(t,".swirls")}var Z=f(()=>{"use strict";i()});import*as j from"zod";function Q(e){return`${U(e)}/credentials`}async function Ee(e){let t=Q(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}async function O(e){let t=Q(e),r=await e.fsPromise.readFile(t,"utf8");return j.parse(tr,JSON.parse(r))}async function X(e,t,r,o){let a=Q(e);await K(e,U(e)),await e.fsPromise.writeFile(a,JSON.stringify({idToken:t,jwt:r,sessionId:o}))}var tr,q=f(()=>{"use strict";i();Z();tr=j.object({idToken:j.string(),jwt:j.string(),sessionId:j.string()})});import rr from"open";function De(e=32){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=new Uint8Array(e);crypto.getRandomValues(r);let o="";for(let a of r)o+=t[a%t.length];return o}function Ae(e){let t=new URLSearchParams({client_id:e.clientId,redirect_uri:e.redirectUri,response_type:"code",scope:"openid profile email",state:e.state});rr(`${e.authorizeUri}?${t}`)}var $e=f(()=>{"use strict";i()});import*as v from"zod";var or,ir,N,ee=f(()=>{"use strict";i();or=v.object({API_URL:v.string(),OAUTH_AUTHORIZE_URL:v.string()}),ir={API_URL:"https://swirls.ai/api",OAUTH_AUTHORIZE_URL:"https://clerk.swirls.ai/oauth/authorize"},N=v.parse(or,ir)});import{withResult as ar}from"@byteslice/result";import{createORPCClient as sr,onError as nr}from"@orpc/client";import{RPCLink as cr}from"@orpc/client/fetch";async function u(e){let t=new cr({url:`${N.API_URL}/rpc`,headers:async()=>{let o=await ar(()=>O(e),c=>new Error("Failed to read credentials file",{cause:c.message}));if(o.failure)return{};let{idToken:a,jwt:s}=o.data;return{Authorization:`Bearer ${s||a}`}},interceptors:[nr(o=>{o instanceof Error&&o.name==="AbortError"||console.error(o)})]});return sr(t)}var P=f(()=>{"use strict";i();q();ee()});import{Box as lr,Text as ze}from"ink";import{jsx as _e,jsxs as mr}from"react/jsx-runtime";function p(e){return mr(lr,{flexDirection:"column",children:[_e(ze,{color:"red",children:e.message}),_e(ze,{children:"If this issue persists, send us an email at help@byteslice.co, and we can help you out."})]})}var y=f(()=>{"use strict";i()});import{Text as pr}from"ink";import{jsx as fr}from"react/jsx-runtime";function g(e){return fr(pr,{color:"green",children:e.message})}var k=f(()=>{"use strict";i()});import{Text as dr}from"ink";import{jsx as ur}from"react/jsx-runtime";function Be(e){return ur(dr,{color:"yellow",children:e.message})}var Oe=f(()=>{"use strict";i()});function gr(e){return`${U(e)}/project`}async function Ne(e){let t=gr(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}var Me=f(()=>{"use strict";i();Z()});var te={};b(te,{login:()=>hr,logout:()=>xr});import{withResult as C}from"@byteslice/result";import{render as L}from"ink";import{jsx as I}from"react/jsx-runtime";async function wr(e,t,r){let o=await C(async()=>await(await u(e)).cli.exchangeToken({code:r.code}),h=>new Error("Failed to exchange callback code for token",{cause:h.message}));if(o.failure)throw o.failure;await X(e,o.data.idToken,"","");let a=await C(async()=>await(await u(e)).cli.createSignInTicket(),h=>new Error("Failed to exchange ID token code for a sign-in ticket",{cause:h.message}));if(a.failure)throw a.failure;let s=await Te(t.clerkPublishableKey),c=await C(()=>Re(s,a.data.token),h=>new Error("Failed to create a new sign-in for this device",{cause:h.message}));if(c.failure)throw c.failure;let d=await C(async()=>await(await u(e)).cli.createJwt({sessionId:c.data.createdSessionId}),h=>new Error("Failed to create a session JWT",{cause:h.message}));if(d.failure)throw d.failure;let n=await C(()=>X(e,o.data.idToken,d.data,c.data.createdSessionId),h=>new Error("Failed to save your credentials to disk",{cause:h.message}));if(n.failure)throw n.failure}async function hr(){let e=await u(this),t=De(),r=await C(()=>e.cli.getConfig(),a=>new Error("Failed to retrieve authentication configuration",{cause:a.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),Ae({authorizeUri:N.OAUTH_AUTHORIZE_URL,clientId:r.data.clientId,redirectUri:G,state:t});let o=await C(()=>Le(async a=>{if(a.state!==t)throw new Error("Invalid state.");await wr(this,r.data,a)}),a=>a);o.failure&&(L(I(p,{message:o.failure.message})),process.exit(1)),L(I(g,{message:"Success! You are now logged in."}))}async function xr(){let e=await C(()=>O(this),s=>s);e.failure&&(L(I(p,{message:"There was an issue reading your credentials. You are probably already logged out."})),process.exit(1));let t=await u(this),r=await C(()=>t.cli.getConfig(),s=>new Error("Failed to retrieve authentication configuration",{cause:s.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),(await C(async()=>t.cli.revokeSession({sessionId:e.data.sessionId}),s=>s)).failure&&L(I(Be,{message:"There was an issue revoking your session. You are probably already logged out. Purging credentials file..."}));let a=await C(async()=>{await Ee(this),await Ne(this)},s=>s);if(a.failure)throw a.failure;L(I(g,{message:"Success! You are now logged out."}))}var re=f(()=>{"use strict";i();Ie();Ue();q();$e();P();y();k();Oe();ee();Me()});import{Box as Pr,Text as Ye}from"ink";import kr from"ink-spinner";import{jsx as Ve,jsxs as We}from"react/jsx-runtime";function Ge(e){return We(Pr,{children:[Ve(Ye,{color:"cyan",children:Ve(kr,{type:"dots"})}),We(Ye,{children:[" ",e.message]})]})}var Ke=f(()=>{"use strict";i()});import{existsSync as Sr}from"fs";import{resolve as jr}from"path";import{configFileName as Ze,configSchema as Fr}from"@swirls/sdk/config";import{createJiti as vr}from"jiti";async function Qe(){let e=jr(process.cwd(),Ze);if(!Sr(e))throw new Error(`Config file not found in project root: ${Ze}`);let r=await vr(import.meta.url).import(e,{default:!0});return Fr.parse(r)}var Xe=f(()=>{"use strict";i()});async function qe(e,t){let r=await u(e),{results:o}=await r.forms.listForms({projectId:t});function a(c){return c.schema!=null}return o.filter(a).map(c=>({id:c.id,name:c.name,schema:c.schema}))}var et=f(()=>{"use strict";i();P()});import tt from"fs/promises";import Lr from"path";async function M(e,t){let r=Lr.dirname(e);await tt.mkdir(r,{recursive:!0}),await tt.writeFile(e,t,"utf-8")}var oe=f(()=>{"use strict";i()});var rt={};b(rt,{generateCode:()=>Tr});import ie from"process";import{withResult as ae}from"@byteslice/result";import{generateFormsCode as Ir}from"@swirls/sdk/form/generate";import{render as E}from"ink";import{jsx as D}from"react/jsx-runtime";async function Tr(){let e=await ae(()=>Qe(),s=>new Error("Failed to load configuration",{cause:s}));e.failure&&(E(D(p,{message:e.failure.message})),ie.exit(1));let{projectId:t,genPath:r}=e.data;E(D(Ge,{message:"Generating form code..."}));let o=await ae(async()=>{let s=['// This file was generated by "@swirls/cli dev generate"',"// Do not edit this file manually",""],c=await qe(this,t);return Ir(c,s)},s=>new Error(`Failed to generate form code: ${s.message}`,{cause:s}));o.failure&&(E(D(p,{message:o.failure.message})),ie.exit(1));let a=await ae(()=>M(r,o.data),s=>new Error("Failed to write code file",{cause:s}));a.failure&&(E(D(p,{message:a.failure.message})),ie.exit(1)),E(D(g,{message:`Success! Generated code at ${r}`}))}var ot=f(()=>{"use strict";i();y();Ke();k();Xe();et();oe()});import{Box as it,render as Rr,Text as at}from"ink";import Ur from"ink-text-input";import{useState as st}from"react";import{z as Er}from"zod";import{jsx as H,jsxs as nt}from"react/jsx-runtime";function Dr(e){let[t,r]=st(""),[o,a]=st(null);return nt(it,{flexDirection:"column",children:[nt(it,{children:[H(at,{children:"Enter project ID (UUID): "}),H(Ur,{value:t,onChange:d=>{a(null),r(d)},onSubmit:d=>{if(a(null),d.trim()===""){setImmediate(()=>e.onInput());return}let n=Er.uuid().safeParse(d);if(!n.success){a("Invalid UUID. Please try again."),r("");return}setImmediate(()=>e.onInput(n.data))}})]}),o&&H(at,{color:"red",children:o})]})}async function ct(){return new Promise(e=>{let t=Rr(H(Dr,{onInput:r=>{t.unmount(),e(r)}}))})}var lt=f(()=>{"use strict";i()});var mt={};b(mt,{initializeConfig:()=>Or});import{existsSync as Ar}from"fs";import{resolve as $r}from"path";import se from"process";import{withResult as zr}from"@byteslice/result";import{configFileName as _r,generateConfig as Br}from"@swirls/sdk/config";import{render as ne}from"ink";import{jsx as ce}from"react/jsx-runtime";async function Or(){let e=$r(se.cwd(),_r);Ar(e)&&(ne(ce(p,{message:`Configuration already exists at ${e}.`})),se.exit(1));let t=await ct(),r=await zr(async()=>{let o=Br(t);await M(e,o)},o=>new Error("Failed to create configuration",{cause:o}));r.failure&&(ne(ce(p,{message:r.failure.message})),se.exit(1)),ne(ce(g,{message:`Success! Created configuration at ${e}`}))}var pt=f(()=>{"use strict";i();y();k();lt();oe()});import{render as Jr}from"ink";import Yr from"open";import{jsx as Wr}from"react/jsx-runtime";async function J(e){let t=`${Vr}/${e.id}`;await Yr(t),Jr(Wr(g,{message:`Opened project "${e.name}" in browser.`}))}var Vr,le=f(()=>{"use strict";i();k();Vr="https://swirls.ai/projects"});import{Box as me,render as Gr,Text as Kr}from"ink";import Zr from"ink-text-input";import{useState as Qr}from"react";import{jsx as fe,jsxs as pe}from"react/jsx-runtime";function Xr(e){let[t,r]=Qr(""),o=a=>{let s=a.trim().toLowerCase(),c=s===""||s==="y"||s==="yes";setImmediate(()=>e.onAnswer(c))};return fe(me,{flexDirection:"column",children:pe(me,{children:[pe(Kr,{children:[e.message," "]}),fe(Zr,{value:t,onChange:r,onSubmit:o})]})})}async function ut(e){let{above:t}=e??{};return new Promise(r=>{let o=Gr(pe(me,{flexDirection:"column",children:[t,fe(Xr,{message:"Open project in browser? (Y/n)",onAnswer:a=>{o.unmount(),r(a)}})]}))})}var gt=f(()=>{"use strict";i()});var ht={};b(ht,{createProject:()=>to});import{withResult as qr}from"@byteslice/result";import{render as eo}from"ink";import{jsx as wt}from"react/jsx-runtime";async function to(e,t){let r=await u(this),o=await qr(()=>r.projects.createProject({name:t}),s=>new Error(`Failed to create project: ${s.message}`,{cause:s}));o.failure&&(eo(wt(p,{message:o.failure.message})),process.exit(1)),await ut({above:wt(g,{message:`Success! Created "${t}" project: ${o.data.id}`})})&&await J(o.data)}var xt=f(()=>{"use strict";i();P();y();k();le();gt()});var bt={};b(bt,{openProject:()=>oo});import{withResult as ro}from"@byteslice/result";import{render as yt}from"ink";import{jsx as Ct}from"react/jsx-runtime";async function oo(e,t){let r=await u(this),o=await ro(()=>r.projects.getProject({projectId:t}),a=>new Error(`Failed to get project: ${a.message}`,{cause:a}));o.failure&&(yt(Ct(p,{message:o.failure.message})),process.exit(1)),o.data||(yt(Ct(p,{message:"Project not found."})),process.exit(1)),await J(o.data)}var Pt=f(()=>{"use strict";i();P();y();le()});import{Box as T,Text as Y}from"ink";import{Fragment as no}from"react";import{Fragment as po,jsx as x,jsxs as ue}from"react/jsx-runtime";function co(e){return typeof e=="boolean"?e?ue(po,{children:[x(Y,{color:"green",children:"\u2714"})," yes"]}):"no":String(e)}function lo(e,t){return t.map(r=>{let o=r.key in e?co(e[r.key]):null;return{column:r,value:o}})}function mo(e,t,r=1){return t.map(o=>{let a=String(o).length,s=e.map(d=>o in d&&(typeof d[o]=="string"||typeof d[o]=="number")?String(d[o]).length:0),c=Math.max(...s,a)+r*2;return{name:String(o),key:o,width:c}})}function de(e){return x(Y,{children:Array(e.width).fill("\u2500").join("")})}function jt(e){let t=mo(e.data,e.keys),r=t.reduce((o,a)=>o+a.width,0);return ue(T,{flexDirection:"column",width:r,children:[x(de,{width:r}),x(T,{flexDirection:"row",children:t.map(o=>x(T,{width:o.width,children:x(Y,{bold:!0,color:"blue",children:o.name})},o.name))}),x(de,{width:r}),x(T,{flexDirection:"column",children:e.data.map((o,a)=>{let s=lo(o,t);return ue(no,{children:[x(T,{flexDirection:"row",children:s.map(c=>x(T,{width:c.column.width,children:x(Y,{children:c.value})},c.column.name))}),x(de,{width:r})]},`row-${a}`)})})]})}var Ft=f(()=>{"use strict";i()});import{existsSync as fo}from"fs";import{resolve as uo}from"path";import{configFileName as vt,configSchema as go}from"@swirls/sdk/config";import{createJiti as wo}from"jiti";async function S(e){if(e)return e;let t=uo(process.cwd(),vt);if(!fo(t))throw new Error(`No project specified and no ${vt} found. Use --project flag or run from a project directory.`);let o=await wo(import.meta.url).import(t,{default:!0});return go.parse(o).projectId}var R=f(()=>{"use strict";i()});var It={};b(It,{list:()=>ho});import{withResult as Lt}from"@byteslice/result";import{render as ge}from"ink";import{jsx as we}from"react/jsx-runtime";async function ho(e,t){let r=await Lt(()=>S(e.project),n=>new Error(n.message));r.failure&&(ge(we(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await Lt(()=>o.buckets.listFiles({projectId:r.data,path:t}),n=>new Error(`Failed to list files: ${n.message}`,{cause:n}));a.failure&&(ge(we(p,{message:a.failure.message})),process.exit(1));let{files:s,folders:c}=a.data;if(c.length===0&&s.length===0){console.log("No files or folders found.");return}let d=[...c.map(n=>({type:"folder",name:n.name,size:"-"})),...s.map(n=>({type:"file",name:n.name,size:n.size?xo(n.size):"-"}))];ge(we(jt,{keys:["type","name","size"],data:d}))}function xo(e){if(e===0)return"0 B";let t=1024,r=["B","KB","MB","GB","TB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/t**o).toFixed(2))} ${r[o]}`}var Tt=f(()=>{"use strict";i();P();y();Ft();R()});var Rt={};b(Rt,{upload:()=>bo});import{readFile as yo}from"fs/promises";import{basename as Co}from"path";import{withResult as V}from"@byteslice/result";import{render as A}from"ink";import{jsx as $}from"react/jsx-runtime";async function bo(e,t,r){let o=await V(()=>S(e.project),w=>new Error(w.message));o.failure&&(A($(p,{message:o.failure.message})),process.exit(1));let a=await V(()=>yo(t),w=>new Error(`Failed to read file: ${w.message}`,{cause:w}));a.failure&&(A($(p,{message:a.failure.message})),process.exit(1));let s=Co(t),c=r?`${r}/${s}`:s,d=await u(this),n=await V(()=>d.buckets.createSignedUploadUrl({projectId:o.data,path:c}),w=>new Error(`Failed to get upload URL: ${w.message}`,{cause:w}));n.failure&&(A($(p,{message:n.failure.message})),process.exit(1));let h=await V(async()=>{let w=await fetch(n.data.signedUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream","x-upsert":"true"},body:a.data});if(!w.ok)throw new Error(`Upload failed: ${w.statusText}`);return w},w=>new Error(`Failed to upload file: ${w.message}`,{cause:w}));h.failure&&(A($(p,{message:h.failure.message})),process.exit(1)),A($(g,{message:`Uploaded ${s} to ${c}`}))}var Ut=f(()=>{"use strict";i();P();y();k();R()});var Et={};b(Et,{download:()=>ko});import{writeFile as Po}from"fs/promises";import{withResult as W}from"@byteslice/result";import{render as z}from"ink";import{jsx as _}from"react/jsx-runtime";async function ko(e,t,r){let o=await W(()=>S(e.project),n=>new Error(n.message));o.failure&&(z(_(p,{message:o.failure.message})),process.exit(1));let a=await u(this),s=await W(()=>a.buckets.createSignedUrl({projectId:o.data,path:t}),n=>new Error(`Failed to get download URL: ${n.message}`,{cause:n}));s.failure&&(z(_(p,{message:s.failure.message})),process.exit(1));let c=await W(async()=>{let n=await fetch(s.data.signedUrl);if(!n.ok)throw new Error(`Download failed: ${n.statusText}`);return n.arrayBuffer()},n=>new Error(`Failed to download file: ${n.message}`,{cause:n}));c.failure&&(z(_(p,{message:c.failure.message})),process.exit(1));let d=await W(()=>Po(r,Buffer.from(c.data)),n=>new Error(`Failed to write file: ${n.message}`,{cause:n}));d.failure&&(z(_(p,{message:d.failure.message})),process.exit(1)),z(_(g,{message:`Downloaded ${t} to ${r}`}))}var Dt=f(()=>{"use strict";i();P();y();k();R()});var $t={};b($t,{deleteFile:()=>So});import{withResult as At}from"@byteslice/result";import{render as he}from"ink";import{jsx as xe}from"react/jsx-runtime";async function So(e,t){let r=await At(()=>S(e.project),s=>new Error(s.message));r.failure&&(he(xe(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await At(()=>o.buckets.deleteFile({projectId:r.data,path:t}),s=>new Error(`Failed to delete file: ${s.message}`,{cause:s}));a.failure&&(he(xe(p,{message:a.failure.message})),process.exit(1)),he(xe(g,{message:`Deleted ${t}`}))}var zt=f(()=>{"use strict";i();P();y();k();R()});var Bt={};b(Bt,{url:()=>jo});import{withResult as _t}from"@byteslice/result";import{render as ye}from"ink";import{jsx as Ce}from"react/jsx-runtime";async function jo(e,t){let r=await _t(()=>S(e.project),s=>new Error(s.message));r.failure&&(ye(Ce(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await _t(()=>o.buckets.createSignedUrl({projectId:r.data,path:t,expiresIn:e.expires}),s=>new Error(`Failed to create signed URL: ${s.message}`,{cause:s}));a.failure&&(ye(Ce(p,{message:a.failure.message})),process.exit(1)),console.log(a.data.signedUrl),ye(Ce(g,{message:`URL expires at ${a.data.expiresAt}`}))}var Ot=f(()=>{"use strict";i();P();y();k();R()});i();import{proposeCompletions as Yt}from"@stricli/core";i();import{buildInstallCommand as Uo,buildUninstallCommand as Eo}from"@stricli/auto-complete";import{buildApplication as Do,buildRouteMap as Ao}from"@stricli/core";i();import{buildCommand as He,buildRouteMap as yr}from"@stricli/core";var Cr=He({loader:async()=>{let{login:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log in with an existing account"}}),br=He({loader:async()=>{let{logout:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log out of an existing account"}}),Je=yr({routes:{login:Cr,logout:br},docs:{brief:"Auth commands"}});i();import{buildCommand as ft,buildRouteMap as Nr}from"@stricli/core";var Mr=ft({loader:async()=>{let{generateCode:e}=await Promise.resolve().then(()=>(ot(),rt));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Generate application code and types"}}),Hr=ft({loader:async()=>{let{initializeConfig:e}=await Promise.resolve().then(()=>(pt(),mt));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Initialize Swirls configuration file"}}),dt=Nr({routes:{gen:Mr,init:Hr},docs:{brief:"Developer commands"}});i();import{buildCommand as kt,buildRouteMap as io}from"@stricli/core";var ao=kt({loader:async()=>{let{createProject:e}=await Promise.resolve().then(()=>(xt(),ht));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project name",parse:String,placeholder:"name"}]}},docs:{brief:"Create a new project"}}),so=kt({loader:async()=>{let{openProject:e}=await Promise.resolve().then(()=>(Pt(),bt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project ID",parse:String,placeholder:"project-id"}]}},docs:{brief:"Open project in browser"}}),St=io({routes:{create:ao,open:so},docs:{brief:"Project commands"}});i();import{buildCommand as B,buildRouteMap as Fo}from"@stricli/core";var vo=B({loader:async()=>{let{list:e}=await Promise.resolve().then(()=>(Tt(),It));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to list (optional)",parse:String,placeholder:"path",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"List files in storage"}}),Lo=B({loader:async()=>{let{upload:e}=await Promise.resolve().then(()=>(Ut(),Rt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Local file path to upload",parse:String,placeholder:"file"},{brief:"Destination path in storage (optional)",parse:String,placeholder:"dest",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Upload a file to storage"}}),Io=B({loader:async()=>{let{download:e}=await Promise.resolve().then(()=>(Dt(),Et));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"},{brief:"Local destination path",parse:String,placeholder:"dest"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Download a file from storage"}}),To=B({loader:async()=>{let{deleteFile:e}=await Promise.resolve().then(()=>(zt(),$t));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Delete a file from storage"}}),Ro=B({loader:async()=>{let{url:e}=await Promise.resolve().then(()=>(Ot(),Bt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0},expires:{kind:"parsed",brief:"Expiration time in seconds (default: 86400 = 24 hours)",parse:Number,optional:!0}}},docs:{brief:"Get a signed URL for a file"}}),Nt=Fo({routes:{list:vo,upload:Lo,download:Io,delete:To,url:Ro},docs:{brief:"Storage commands"}});var Mt="@swirls/cli",Ht="0.0.20",Jt="Swirls command line application";var $o=Ao({routes:{auth:Je,dev:dt,project:St,storage:Nt,install:Uo("cli",{bash:"__cli_bash_complete"}),uninstall:Eo("cli",{bash:!0})},docs:{brief:Jt,hideRoute:{install:!0,uninstall:!0}}}),Pe=Do($o,{name:Mt,versionInfo:{currentVersion:Ht}});i();import zo from"fs";import _o from"fs/promises";import Bo from"os";import Oo from"path";function ke(e){return{fs:zo,fsPromise:_o,os:Bo,path:Oo,process:e}}var Se=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&Se.push("");await Yt(Pe,Se,ke(process));try{for(let{completion:e}of await Yt(Pe,Se,ke(process)))process.stdout.write(`${e}
|
|
42
42
|
`)}catch{}
|
package/dist/cli.js
CHANGED
|
@@ -38,4 +38,4 @@ var Jt=Object.defineProperty;var f=(e,t)=>()=>(e&&(t=e(e=0)),t);var b=(e,t)=>{fo
|
|
|
38
38
|
</div>
|
|
39
39
|
</body>
|
|
40
40
|
</html>
|
|
41
|
-
`});import Qt from"@clerk/clerk-js/headless/index.js";async function ve(e){let t=new Xt(e);return await t.load({standardBrowser:!1}),t}async function Le(e,t){let r=await e.client?.signIn.create({ticket:t,strategy:"ticket"});if(!r||!r.createdSessionId)throw new Error("Failed to sign in.");return{createdSessionId:r.createdSessionId}}var Xt,Ie=f(()=>{"use strict";i();Xt=Qt.Clerk});async function K(e,t){await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)||await e.fsPromise.mkdir(t,{recursive:!0})}function U(e){if(!e.path)throw new Error("No `path` found in context.");if(!e.os)throw new Error("No `os` found in context.");let t=e.os.homedir();return e.path.join(t,".swirls")}var Z=f(()=>{"use strict";i()});import*as j from"zod";function Q(e){return`${U(e)}/credentials`}async function Te(e){let t=Q(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}async function O(e){let t=Q(e),r=await e.fsPromise.readFile(t,"utf8");return j.parse(qt,JSON.parse(r))}async function X(e,t,r,o){let a=Q(e);await K(e,U(e)),await e.fsPromise.writeFile(a,JSON.stringify({idToken:t,jwt:r,sessionId:o}))}var qt,q=f(()=>{"use strict";i();Z();qt=j.object({idToken:j.string(),jwt:j.string(),sessionId:j.string()})});import er from"open";function Re(e=32){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=new Uint8Array(e);crypto.getRandomValues(r);let o="";for(let a of r)o+=t[a%t.length];return o}function Ue(e){let t=new URLSearchParams({client_id:e.clientId,redirect_uri:e.redirectUri,response_type:"code",scope:"openid profile email",state:e.state});er(`${e.authorizeUri}?${t}`)}var Ee=f(()=>{"use strict";i()});import*as v from"zod";var tr,rr,N,ee=f(()=>{"use strict";i();tr=v.object({API_URL:v.string(),OAUTH_AUTHORIZE_URL:v.string()}),rr={API_URL:"https://swirls.ai/api",OAUTH_AUTHORIZE_URL:"https://clerk.swirls.ai/oauth/authorize"},N=v.parse(tr,rr)});import{withResult as or}from"@byteslice/result";import{createORPCClient as ir,onError as ar}from"@orpc/client";import{RPCLink as sr}from"@orpc/client/fetch";async function u(e){let t=new sr({url:`${N.API_URL}/rpc`,headers:async()=>{let o=await or(()=>O(e),c=>new Error("Failed to read credentials file",{cause:c.message}));if(o.failure)return{};let{idToken:a,jwt:s}=o.data;return{Authorization:`Bearer ${s||a}`}},interceptors:[ar(o=>{o instanceof Error&&o.name==="AbortError"||console.error(o)})]});return ir(t)}var P=f(()=>{"use strict";i();q();ee()});import{Box as nr,Text as De}from"ink";import{jsx as Ae,jsxs as cr}from"react/jsx-runtime";function p(e){return cr(nr,{flexDirection:"column",children:[Ae(De,{color:"red",children:e.message}),Ae(De,{children:"If this issue persists, send us an email at help@byteslice.co, and we can help you out."})]})}var y=f(()=>{"use strict";i()});import{Text as lr}from"ink";import{jsx as mr}from"react/jsx-runtime";function g(e){return mr(lr,{color:"green",children:e.message})}var k=f(()=>{"use strict";i()});import{Text as pr}from"ink";import{jsx as fr}from"react/jsx-runtime";function $e(e){return fr(pr,{color:"yellow",children:e.message})}var ze=f(()=>{"use strict";i()});function dr(e){return`${U(e)}/project`}async function _e(e){let t=dr(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}var Be=f(()=>{"use strict";i();Z()});var te={};b(te,{login:()=>gr,logout:()=>wr});import{withResult as C}from"@byteslice/result";import{render as L}from"ink";import{jsx as I}from"react/jsx-runtime";async function ur(e,t,r){let o=await C(async()=>await(await u(e)).cli.exchangeToken({code:r.code}),h=>new Error("Failed to exchange callback code for token",{cause:h.message}));if(o.failure)throw o.failure;await X(e,o.data.idToken,"","");let a=await C(async()=>await(await u(e)).cli.createSignInTicket(),h=>new Error("Failed to exchange ID token code for a sign-in ticket",{cause:h.message}));if(a.failure)throw a.failure;let s=await ve(t.clerkPublishableKey),c=await C(()=>Le(s,a.data.token),h=>new Error("Failed to create a new sign-in for this device",{cause:h.message}));if(c.failure)throw c.failure;let d=await C(async()=>await(await u(e)).cli.createJwt({sessionId:c.data.createdSessionId}),h=>new Error("Failed to create a session JWT",{cause:h.message}));if(d.failure)throw d.failure;let n=await C(()=>X(e,o.data.idToken,d.data,c.data.createdSessionId),h=>new Error("Failed to save your credentials to disk",{cause:h.message}));if(n.failure)throw n.failure}async function gr(){let e=await u(this),t=Re(),r=await C(()=>e.cli.getConfig(),a=>new Error("Failed to retrieve authentication configuration",{cause:a.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),Ue({authorizeUri:N.OAUTH_AUTHORIZE_URL,clientId:r.data.clientId,redirectUri:G,state:t});let o=await C(()=>je(async a=>{if(a.state!==t)throw new Error("Invalid state.");await ur(this,r.data,a)}),a=>a);o.failure&&(L(I(p,{message:o.failure.message})),process.exit(1)),L(I(g,{message:"Success! You are now logged in."}))}async function wr(){let e=await C(()=>O(this),s=>s);e.failure&&(L(I(p,{message:"There was an issue reading your credentials. You are probably already logged out."})),process.exit(1));let t=await u(this),r=await C(()=>t.cli.getConfig(),s=>new Error("Failed to retrieve authentication configuration",{cause:s.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),(await C(async()=>t.cli.revokeSession({sessionId:e.data.sessionId}),s=>s)).failure&&L(I($e,{message:"There was an issue revoking your session. You are probably already logged out. Purging credentials file..."}));let a=await C(async()=>{await Te(this),await _e(this)},s=>s);if(a.failure)throw a.failure;L(I(g,{message:"Success! You are now logged out."}))}var re=f(()=>{"use strict";i();Fe();Ie();q();Ee();P();y();k();ze();ee();Be()});import{Box as Cr,Text as Me}from"ink";import br from"ink-spinner";import{jsx as He,jsxs as Je}from"react/jsx-runtime";function Ye(e){return Je(Cr,{children:[He(Me,{color:"cyan",children:He(br,{type:"dots"})}),Je(Me,{children:[" ",e.message]})]})}var Ve=f(()=>{"use strict";i()});import{existsSync as Pr}from"fs";import{resolve as kr}from"path";import{configFileName as We,configSchema as Sr}from"@swirls/sdk/config";import{createJiti as jr}from"jiti";async function Ge(){let e=kr(process.cwd(),We);if(!Pr(e))throw new Error(`Config file not found in project root: ${We}`);let r=await jr(import.meta.url).import(e,{default:!0});return Sr.parse(r)}var Ke=f(()=>{"use strict";i()});async function Ze(e,t){let r=await u(e),{results:o}=await r.forms.listForms({projectId:t});function a(c){return c.schema!=null}return o.filter(a).map(c=>({id:c.id,name:c.name,schema:c.schema}))}var Qe=f(()=>{"use strict";i();P()});import Xe from"fs/promises";import Fr from"path";async function M(e,t){let r=Fr.dirname(e);await Xe.mkdir(r,{recursive:!0}),await Xe.writeFile(e,t,"utf-8")}var oe=f(()=>{"use strict";i()});var qe={};b(qe,{generateCode:()=>Lr});import ie from"process";import{withResult as ae}from"@byteslice/result";import{generateFormsCode as vr}from"@swirls/sdk/form/generate";import{render as E}from"ink";import{jsx as D}from"react/jsx-runtime";async function Lr(){let e=await ae(()=>Ge(),s=>new Error("Failed to load configuration",{cause:s}));e.failure&&(E(D(p,{message:e.failure.message})),ie.exit(1));let{projectId:t,genPath:r}=e.data;E(D(Ye,{message:"Generating form code..."}));let o=await ae(async()=>{let s=['// This file was generated by "@swirls/cli dev generate"',"// Do not edit this file manually",""],c=await Ze(this,t);return vr(c,s)},s=>new Error(`Failed to generate form code: ${s.message}`,{cause:s}));o.failure&&(E(D(p,{message:o.failure.message})),ie.exit(1));let a=await ae(()=>M(r,o.data),s=>new Error("Failed to write code file",{cause:s}));a.failure&&(E(D(p,{message:a.failure.message})),ie.exit(1)),E(D(g,{message:`Success! Generated code at ${r}`}))}var et=f(()=>{"use strict";i();y();Ve();k();Ke();Qe();oe()});import{Box as tt,render as Ir,Text as rt}from"ink";import Tr from"ink-text-input";import{useState as ot}from"react";import{z as Rr}from"zod";import{jsx as H,jsxs as it}from"react/jsx-runtime";function Ur(e){let[t,r]=ot(""),[o,a]=ot(null);return it(tt,{flexDirection:"column",children:[it(tt,{children:[H(rt,{children:"Enter project ID (UUID): "}),H(Tr,{value:t,onChange:d=>{a(null),r(d)},onSubmit:d=>{if(a(null),d.trim()===""){setImmediate(()=>e.onInput());return}let n=Rr.uuid().safeParse(d);if(!n.success){a("Invalid UUID. Please try again."),r("");return}setImmediate(()=>e.onInput(n.data))}})]}),o&&H(rt,{color:"red",children:o})]})}async function at(){return new Promise(e=>{let t=Ir(H(Ur,{onInput:r=>{t.unmount(),e(r)}}))})}var st=f(()=>{"use strict";i()});var nt={};b(nt,{initializeConfig:()=>_r});import{existsSync as Er}from"fs";import{resolve as Dr}from"path";import se from"process";import{withResult as Ar}from"@byteslice/result";import{configFileName as $r,generateConfig as zr}from"@swirls/sdk/config";import{render as ne}from"ink";import{jsx as ce}from"react/jsx-runtime";async function _r(){let e=Dr(se.cwd(),$r);Er(e)&&(ne(ce(p,{message:`Configuration already exists at ${e}.`})),se.exit(1));let t=await at(),r=await Ar(async()=>{let o=zr(t);await M(e,o)},o=>new Error("Failed to create configuration",{cause:o}));r.failure&&(ne(ce(p,{message:r.failure.message})),se.exit(1)),ne(ce(g,{message:`Success! Created configuration at ${e}`}))}var ct=f(()=>{"use strict";i();y();k();st();oe()});import{render as Mr}from"ink";import Hr from"open";import{jsx as Yr}from"react/jsx-runtime";async function J(e){let t=`${Jr}/${e.id}`;await Hr(t),Mr(Yr(g,{message:`Opened project "${e.name}" in browser.`}))}var Jr,le=f(()=>{"use strict";i();k();Jr="https://swirls.ai/projects"});import{Box as me,render as Vr,Text as Wr}from"ink";import Gr from"ink-text-input";import{useState as Kr}from"react";import{jsx as fe,jsxs as pe}from"react/jsx-runtime";function Zr(e){let[t,r]=Kr(""),o=a=>{let s=a.trim().toLowerCase(),c=s===""||s==="y"||s==="yes";setImmediate(()=>e.onAnswer(c))};return fe(me,{flexDirection:"column",children:pe(me,{children:[pe(Wr,{children:[e.message," "]}),fe(Gr,{value:t,onChange:r,onSubmit:o})]})})}async function pt(e){let{above:t}=e??{};return new Promise(r=>{let o=Vr(pe(me,{flexDirection:"column",children:[t,fe(Zr,{message:"Open project in browser? (Y/n)",onAnswer:a=>{o.unmount(),r(a)}})]}))})}var ft=f(()=>{"use strict";i()});var ut={};b(ut,{createProject:()=>qr});import{withResult as Qr}from"@byteslice/result";import{render as Xr}from"ink";import{jsx as dt}from"react/jsx-runtime";async function qr(e,t){let r=await u(this),o=await Qr(()=>r.projects.createProject({name:t}),s=>new Error(`Failed to create project: ${s.message}`,{cause:s}));o.failure&&(Xr(dt(p,{message:o.failure.message})),process.exit(1)),await pt({above:dt(g,{message:`Success! Created "${t}" project: ${o.data.id}`})})&&await J(o.data)}var gt=f(()=>{"use strict";i();P();y();k();le();ft()});var xt={};b(xt,{openProject:()=>to});import{withResult as eo}from"@byteslice/result";import{render as wt}from"ink";import{jsx as ht}from"react/jsx-runtime";async function to(e,t){let r=await u(this),o=await eo(()=>r.projects.getProject({projectId:t}),a=>new Error(`Failed to get project: ${a.message}`,{cause:a}));o.failure&&(wt(ht(p,{message:o.failure.message})),process.exit(1)),o.data||(wt(ht(p,{message:"Project not found."})),process.exit(1)),await J(o.data)}var yt=f(()=>{"use strict";i();P();y();le()});import{Box as T,Text as Y}from"ink";import{Fragment as ao}from"react";import{Fragment as lo,jsx as x,jsxs as ue}from"react/jsx-runtime";function so(e){return typeof e=="boolean"?e?ue(lo,{children:[x(Y,{color:"green",children:"\u2714"})," yes"]}):"no":String(e)}function no(e,t){return t.map(r=>{let o=r.key in e?so(e[r.key]):null;return{column:r,value:o}})}function co(e,t,r=1){return t.map(o=>{let a=String(o).length,s=e.map(d=>o in d&&(typeof d[o]=="string"||typeof d[o]=="number")?String(d[o]).length:0),c=Math.max(...s,a)+r*2;return{name:String(o),key:o,width:c}})}function de(e){return x(Y,{children:Array(e.width).fill("\u2500").join("")})}function Pt(e){let t=co(e.data,e.keys),r=t.reduce((o,a)=>o+a.width,0);return ue(T,{flexDirection:"column",width:r,children:[x(de,{width:r}),x(T,{flexDirection:"row",children:t.map(o=>x(T,{width:o.width,children:x(Y,{bold:!0,color:"blue",children:o.name})},o.name))}),x(de,{width:r}),x(T,{flexDirection:"column",children:e.data.map((o,a)=>{let s=no(o,t);return ue(ao,{children:[x(T,{flexDirection:"row",children:s.map(c=>x(T,{width:c.column.width,children:x(Y,{children:c.value})},c.column.name))}),x(de,{width:r})]},`row-${a}`)})})]})}var kt=f(()=>{"use strict";i()});import{existsSync as mo}from"fs";import{resolve as po}from"path";import{configFileName as St,configSchema as fo}from"@swirls/sdk/config";import{createJiti as uo}from"jiti";async function S(e){if(e)return e;let t=po(process.cwd(),St);if(!mo(t))throw new Error(`No project specified and no ${St} found. Use --project flag or run from a project directory.`);let o=await uo(import.meta.url).import(t,{default:!0});return fo.parse(o).projectId}var R=f(()=>{"use strict";i()});var Ft={};b(Ft,{list:()=>go});import{withResult as jt}from"@byteslice/result";import{render as ge}from"ink";import{jsx as we}from"react/jsx-runtime";async function go(e,t){let r=await jt(()=>S(e.project),n=>new Error(n.message));r.failure&&(ge(we(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await jt(()=>o.buckets.listFiles({projectId:r.data,path:t}),n=>new Error(`Failed to list files: ${n.message}`,{cause:n}));a.failure&&(ge(we(p,{message:a.failure.message})),process.exit(1));let{files:s,folders:c}=a.data;if(c.length===0&&s.length===0){console.log("No files or folders found.");return}let d=[...c.map(n=>({type:"folder",name:n.name,size:"-"})),...s.map(n=>({type:"file",name:n.name,size:n.size?wo(n.size):"-"}))];ge(we(Pt,{keys:["type","name","size"],data:d}))}function wo(e){if(e===0)return"0 B";let t=1024,r=["B","KB","MB","GB","TB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/t**o).toFixed(2))} ${r[o]}`}var vt=f(()=>{"use strict";i();P();y();kt();R()});var Lt={};b(Lt,{upload:()=>yo});import{readFile as ho}from"fs/promises";import{basename as xo}from"path";import{withResult as V}from"@byteslice/result";import{render as A}from"ink";import{jsx as $}from"react/jsx-runtime";async function yo(e,t,r){let o=await V(()=>S(e.project),w=>new Error(w.message));o.failure&&(A($(p,{message:o.failure.message})),process.exit(1));let a=await V(()=>ho(t),w=>new Error(`Failed to read file: ${w.message}`,{cause:w}));a.failure&&(A($(p,{message:a.failure.message})),process.exit(1));let s=xo(t),c=r?`${r}/${s}`:s,d=await u(this),n=await V(()=>d.buckets.createSignedUploadUrl({projectId:o.data,path:c}),w=>new Error(`Failed to get upload URL: ${w.message}`,{cause:w}));n.failure&&(A($(p,{message:n.failure.message})),process.exit(1));let h=await V(async()=>{let w=await fetch(n.data.signedUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream","x-upsert":"true"},body:a.data});if(!w.ok)throw new Error(`Upload failed: ${w.statusText}`);return w},w=>new Error(`Failed to upload file: ${w.message}`,{cause:w}));h.failure&&(A($(p,{message:h.failure.message})),process.exit(1)),A($(g,{message:`Uploaded ${s} to ${c}`}))}var It=f(()=>{"use strict";i();P();y();k();R()});var Tt={};b(Tt,{download:()=>bo});import{writeFile as Co}from"fs/promises";import{withResult as W}from"@byteslice/result";import{render as z}from"ink";import{jsx as _}from"react/jsx-runtime";async function bo(e,t,r){let o=await W(()=>S(e.project),n=>new Error(n.message));o.failure&&(z(_(p,{message:o.failure.message})),process.exit(1));let a=await u(this),s=await W(()=>a.buckets.createSignedUrl({projectId:o.data,path:t}),n=>new Error(`Failed to get download URL: ${n.message}`,{cause:n}));s.failure&&(z(_(p,{message:s.failure.message})),process.exit(1));let c=await W(async()=>{let n=await fetch(s.data.signedUrl);if(!n.ok)throw new Error(`Download failed: ${n.statusText}`);return n.arrayBuffer()},n=>new Error(`Failed to download file: ${n.message}`,{cause:n}));c.failure&&(z(_(p,{message:c.failure.message})),process.exit(1));let d=await W(()=>Co(r,Buffer.from(c.data)),n=>new Error(`Failed to write file: ${n.message}`,{cause:n}));d.failure&&(z(_(p,{message:d.failure.message})),process.exit(1)),z(_(g,{message:`Downloaded ${t} to ${r}`}))}var Rt=f(()=>{"use strict";i();P();y();k();R()});var Et={};b(Et,{deleteFile:()=>Po});import{withResult as Ut}from"@byteslice/result";import{render as he}from"ink";import{jsx as xe}from"react/jsx-runtime";async function Po(e,t){let r=await Ut(()=>S(e.project),s=>new Error(s.message));r.failure&&(he(xe(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await Ut(()=>o.buckets.deleteFile({projectId:r.data,path:t}),s=>new Error(`Failed to delete file: ${s.message}`,{cause:s}));a.failure&&(he(xe(p,{message:a.failure.message})),process.exit(1)),he(xe(g,{message:`Deleted ${t}`}))}var Dt=f(()=>{"use strict";i();P();y();k();R()});var $t={};b($t,{url:()=>ko});import{withResult as At}from"@byteslice/result";import{render as ye}from"ink";import{jsx as Ce}from"react/jsx-runtime";async function ko(e,t){let r=await At(()=>S(e.project),s=>new Error(s.message));r.failure&&(ye(Ce(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await At(()=>o.buckets.createSignedUrl({projectId:r.data,path:t,expiresIn:e.expires}),s=>new Error(`Failed to create signed URL: ${s.message}`,{cause:s}));a.failure&&(ye(Ce(p,{message:a.failure.message})),process.exit(1)),console.log(a.data.signedUrl),ye(Ce(g,{message:`URL expires at ${a.data.expiresAt}`}))}var zt=f(()=>{"use strict";i();P();y();k();R()});i();import{run as Bo}from"@stricli/core";i();import{buildInstallCommand as To,buildUninstallCommand as Ro}from"@stricli/auto-complete";import{buildApplication as Uo,buildRouteMap as Eo}from"@stricli/core";i();import{buildCommand as Oe,buildRouteMap as hr}from"@stricli/core";var xr=Oe({loader:async()=>{let{login:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log in with an existing account"}}),yr=Oe({loader:async()=>{let{logout:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log out of an existing account"}}),Ne=hr({routes:{login:xr,logout:yr},docs:{brief:"Auth commands"}});i();import{buildCommand as lt,buildRouteMap as Br}from"@stricli/core";var Or=lt({loader:async()=>{let{generateCode:e}=await Promise.resolve().then(()=>(et(),qe));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Generate application code and types"}}),Nr=lt({loader:async()=>{let{initializeConfig:e}=await Promise.resolve().then(()=>(ct(),nt));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Initialize Swirls configuration file"}}),mt=Br({routes:{gen:Or,init:Nr},docs:{brief:"Developer commands"}});i();import{buildCommand as Ct,buildRouteMap as ro}from"@stricli/core";var oo=Ct({loader:async()=>{let{createProject:e}=await Promise.resolve().then(()=>(gt(),ut));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project name",parse:String,placeholder:"name"}]}},docs:{brief:"Create a new project"}}),io=Ct({loader:async()=>{let{openProject:e}=await Promise.resolve().then(()=>(yt(),xt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project ID",parse:String,placeholder:"project-id"}]}},docs:{brief:"Open project in browser"}}),bt=ro({routes:{create:oo,open:io},docs:{brief:"Project commands"}});i();import{buildCommand as B,buildRouteMap as So}from"@stricli/core";var jo=B({loader:async()=>{let{list:e}=await Promise.resolve().then(()=>(vt(),Ft));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to list (optional)",parse:String,placeholder:"path",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"List files in storage"}}),Fo=B({loader:async()=>{let{upload:e}=await Promise.resolve().then(()=>(It(),Lt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Local file path to upload",parse:String,placeholder:"file"},{brief:"Destination path in storage (optional)",parse:String,placeholder:"dest",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Upload a file to storage"}}),vo=B({loader:async()=>{let{download:e}=await Promise.resolve().then(()=>(Rt(),Tt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"},{brief:"Local destination path",parse:String,placeholder:"dest"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Download a file from storage"}}),Lo=B({loader:async()=>{let{deleteFile:e}=await Promise.resolve().then(()=>(Dt(),Et));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Delete a file from storage"}}),Io=B({loader:async()=>{let{url:e}=await Promise.resolve().then(()=>(zt(),$t));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0},expires:{kind:"parsed",brief:"Expiration time in seconds (default: 86400 = 24 hours)",parse:Number,optional:!0}}},docs:{brief:"Get a signed URL for a file"}}),_t=So({routes:{list:jo,upload:Fo,download:vo,delete:Lo,url:Io},docs:{brief:"Storage commands"}});var Bt="@swirls/cli",Ot="0.0.19",Nt="Swirls command line application";var Do=Eo({routes:{auth:Ne,dev:mt,project:bt,storage:_t,install:To("cli",{bash:"__cli_bash_complete"}),uninstall:Ro("cli",{bash:!0})},docs:{brief:Nt,hideRoute:{install:!0,uninstall:!0}}}),Mt=Uo(Do,{name:Bt,versionInfo:{currentVersion:Ot}});i();import Ao from"fs";import $o from"fs/promises";import zo from"os";import _o from"path";function Ht(e){return{fs:Ao,fsPromise:$o,os:zo,path:_o,process:e}}await Bo(Mt,process.argv.slice(2),Ht(process));
|
|
41
|
+
`});import Qt from"@clerk/clerk-js/headless/index.js";async function ve(e){let t=new Xt(e);return await t.load({standardBrowser:!1}),t}async function Le(e,t){let r=await e.client?.signIn.create({ticket:t,strategy:"ticket"});if(!r||!r.createdSessionId)throw new Error("Failed to sign in.");return{createdSessionId:r.createdSessionId}}var Xt,Ie=f(()=>{"use strict";i();Xt=Qt.Clerk});async function K(e,t){await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)||await e.fsPromise.mkdir(t,{recursive:!0})}function U(e){if(!e.path)throw new Error("No `path` found in context.");if(!e.os)throw new Error("No `os` found in context.");let t=e.os.homedir();return e.path.join(t,".swirls")}var Z=f(()=>{"use strict";i()});import*as j from"zod";function Q(e){return`${U(e)}/credentials`}async function Te(e){let t=Q(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}async function O(e){let t=Q(e),r=await e.fsPromise.readFile(t,"utf8");return j.parse(qt,JSON.parse(r))}async function X(e,t,r,o){let a=Q(e);await K(e,U(e)),await e.fsPromise.writeFile(a,JSON.stringify({idToken:t,jwt:r,sessionId:o}))}var qt,q=f(()=>{"use strict";i();Z();qt=j.object({idToken:j.string(),jwt:j.string(),sessionId:j.string()})});import er from"open";function Re(e=32){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=new Uint8Array(e);crypto.getRandomValues(r);let o="";for(let a of r)o+=t[a%t.length];return o}function Ue(e){let t=new URLSearchParams({client_id:e.clientId,redirect_uri:e.redirectUri,response_type:"code",scope:"openid profile email",state:e.state});er(`${e.authorizeUri}?${t}`)}var Ee=f(()=>{"use strict";i()});import*as v from"zod";var tr,rr,N,ee=f(()=>{"use strict";i();tr=v.object({API_URL:v.string(),OAUTH_AUTHORIZE_URL:v.string()}),rr={API_URL:"https://swirls.ai/api",OAUTH_AUTHORIZE_URL:"https://clerk.swirls.ai/oauth/authorize"},N=v.parse(tr,rr)});import{withResult as or}from"@byteslice/result";import{createORPCClient as ir,onError as ar}from"@orpc/client";import{RPCLink as sr}from"@orpc/client/fetch";async function u(e){let t=new sr({url:`${N.API_URL}/rpc`,headers:async()=>{let o=await or(()=>O(e),c=>new Error("Failed to read credentials file",{cause:c.message}));if(o.failure)return{};let{idToken:a,jwt:s}=o.data;return{Authorization:`Bearer ${s||a}`}},interceptors:[ar(o=>{o instanceof Error&&o.name==="AbortError"||console.error(o)})]});return ir(t)}var P=f(()=>{"use strict";i();q();ee()});import{Box as nr,Text as De}from"ink";import{jsx as Ae,jsxs as cr}from"react/jsx-runtime";function p(e){return cr(nr,{flexDirection:"column",children:[Ae(De,{color:"red",children:e.message}),Ae(De,{children:"If this issue persists, send us an email at help@byteslice.co, and we can help you out."})]})}var y=f(()=>{"use strict";i()});import{Text as lr}from"ink";import{jsx as mr}from"react/jsx-runtime";function g(e){return mr(lr,{color:"green",children:e.message})}var k=f(()=>{"use strict";i()});import{Text as pr}from"ink";import{jsx as fr}from"react/jsx-runtime";function $e(e){return fr(pr,{color:"yellow",children:e.message})}var ze=f(()=>{"use strict";i()});function dr(e){return`${U(e)}/project`}async function _e(e){let t=dr(e);await e.fsPromise.stat(t).then(()=>!0).catch(()=>!1)&&await e.fsPromise.unlink(t)}var Be=f(()=>{"use strict";i();Z()});var te={};b(te,{login:()=>gr,logout:()=>wr});import{withResult as C}from"@byteslice/result";import{render as L}from"ink";import{jsx as I}from"react/jsx-runtime";async function ur(e,t,r){let o=await C(async()=>await(await u(e)).cli.exchangeToken({code:r.code}),h=>new Error("Failed to exchange callback code for token",{cause:h.message}));if(o.failure)throw o.failure;await X(e,o.data.idToken,"","");let a=await C(async()=>await(await u(e)).cli.createSignInTicket(),h=>new Error("Failed to exchange ID token code for a sign-in ticket",{cause:h.message}));if(a.failure)throw a.failure;let s=await ve(t.clerkPublishableKey),c=await C(()=>Le(s,a.data.token),h=>new Error("Failed to create a new sign-in for this device",{cause:h.message}));if(c.failure)throw c.failure;let d=await C(async()=>await(await u(e)).cli.createJwt({sessionId:c.data.createdSessionId}),h=>new Error("Failed to create a session JWT",{cause:h.message}));if(d.failure)throw d.failure;let n=await C(()=>X(e,o.data.idToken,d.data,c.data.createdSessionId),h=>new Error("Failed to save your credentials to disk",{cause:h.message}));if(n.failure)throw n.failure}async function gr(){let e=await u(this),t=Re(),r=await C(()=>e.cli.getConfig(),a=>new Error("Failed to retrieve authentication configuration",{cause:a.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),Ue({authorizeUri:N.OAUTH_AUTHORIZE_URL,clientId:r.data.clientId,redirectUri:G,state:t});let o=await C(()=>je(async a=>{if(a.state!==t)throw new Error("Invalid state.");await ur(this,r.data,a)}),a=>a);o.failure&&(L(I(p,{message:o.failure.message})),process.exit(1)),L(I(g,{message:"Success! You are now logged in."}))}async function wr(){let e=await C(()=>O(this),s=>s);e.failure&&(L(I(p,{message:"There was an issue reading your credentials. You are probably already logged out."})),process.exit(1));let t=await u(this),r=await C(()=>t.cli.getConfig(),s=>new Error("Failed to retrieve authentication configuration",{cause:s.message}));r.failure&&(L(I(p,{message:r.failure.message})),process.exit(1)),(await C(async()=>t.cli.revokeSession({sessionId:e.data.sessionId}),s=>s)).failure&&L(I($e,{message:"There was an issue revoking your session. You are probably already logged out. Purging credentials file..."}));let a=await C(async()=>{await Te(this),await _e(this)},s=>s);if(a.failure)throw a.failure;L(I(g,{message:"Success! You are now logged out."}))}var re=f(()=>{"use strict";i();Fe();Ie();q();Ee();P();y();k();ze();ee();Be()});import{Box as Cr,Text as Me}from"ink";import br from"ink-spinner";import{jsx as He,jsxs as Je}from"react/jsx-runtime";function Ye(e){return Je(Cr,{children:[He(Me,{color:"cyan",children:He(br,{type:"dots"})}),Je(Me,{children:[" ",e.message]})]})}var Ve=f(()=>{"use strict";i()});import{existsSync as Pr}from"fs";import{resolve as kr}from"path";import{configFileName as We,configSchema as Sr}from"@swirls/sdk/config";import{createJiti as jr}from"jiti";async function Ge(){let e=kr(process.cwd(),We);if(!Pr(e))throw new Error(`Config file not found in project root: ${We}`);let r=await jr(import.meta.url).import(e,{default:!0});return Sr.parse(r)}var Ke=f(()=>{"use strict";i()});async function Ze(e,t){let r=await u(e),{results:o}=await r.forms.listForms({projectId:t});function a(c){return c.schema!=null}return o.filter(a).map(c=>({id:c.id,name:c.name,schema:c.schema}))}var Qe=f(()=>{"use strict";i();P()});import Xe from"fs/promises";import Fr from"path";async function M(e,t){let r=Fr.dirname(e);await Xe.mkdir(r,{recursive:!0}),await Xe.writeFile(e,t,"utf-8")}var oe=f(()=>{"use strict";i()});var qe={};b(qe,{generateCode:()=>Lr});import ie from"process";import{withResult as ae}from"@byteslice/result";import{generateFormsCode as vr}from"@swirls/sdk/form/generate";import{render as E}from"ink";import{jsx as D}from"react/jsx-runtime";async function Lr(){let e=await ae(()=>Ge(),s=>new Error("Failed to load configuration",{cause:s}));e.failure&&(E(D(p,{message:e.failure.message})),ie.exit(1));let{projectId:t,genPath:r}=e.data;E(D(Ye,{message:"Generating form code..."}));let o=await ae(async()=>{let s=['// This file was generated by "@swirls/cli dev generate"',"// Do not edit this file manually",""],c=await Ze(this,t);return vr(c,s)},s=>new Error(`Failed to generate form code: ${s.message}`,{cause:s}));o.failure&&(E(D(p,{message:o.failure.message})),ie.exit(1));let a=await ae(()=>M(r,o.data),s=>new Error("Failed to write code file",{cause:s}));a.failure&&(E(D(p,{message:a.failure.message})),ie.exit(1)),E(D(g,{message:`Success! Generated code at ${r}`}))}var et=f(()=>{"use strict";i();y();Ve();k();Ke();Qe();oe()});import{Box as tt,render as Ir,Text as rt}from"ink";import Tr from"ink-text-input";import{useState as ot}from"react";import{z as Rr}from"zod";import{jsx as H,jsxs as it}from"react/jsx-runtime";function Ur(e){let[t,r]=ot(""),[o,a]=ot(null);return it(tt,{flexDirection:"column",children:[it(tt,{children:[H(rt,{children:"Enter project ID (UUID): "}),H(Tr,{value:t,onChange:d=>{a(null),r(d)},onSubmit:d=>{if(a(null),d.trim()===""){setImmediate(()=>e.onInput());return}let n=Rr.uuid().safeParse(d);if(!n.success){a("Invalid UUID. Please try again."),r("");return}setImmediate(()=>e.onInput(n.data))}})]}),o&&H(rt,{color:"red",children:o})]})}async function at(){return new Promise(e=>{let t=Ir(H(Ur,{onInput:r=>{t.unmount(),e(r)}}))})}var st=f(()=>{"use strict";i()});var nt={};b(nt,{initializeConfig:()=>_r});import{existsSync as Er}from"fs";import{resolve as Dr}from"path";import se from"process";import{withResult as Ar}from"@byteslice/result";import{configFileName as $r,generateConfig as zr}from"@swirls/sdk/config";import{render as ne}from"ink";import{jsx as ce}from"react/jsx-runtime";async function _r(){let e=Dr(se.cwd(),$r);Er(e)&&(ne(ce(p,{message:`Configuration already exists at ${e}.`})),se.exit(1));let t=await at(),r=await Ar(async()=>{let o=zr(t);await M(e,o)},o=>new Error("Failed to create configuration",{cause:o}));r.failure&&(ne(ce(p,{message:r.failure.message})),se.exit(1)),ne(ce(g,{message:`Success! Created configuration at ${e}`}))}var ct=f(()=>{"use strict";i();y();k();st();oe()});import{render as Mr}from"ink";import Hr from"open";import{jsx as Yr}from"react/jsx-runtime";async function J(e){let t=`${Jr}/${e.id}`;await Hr(t),Mr(Yr(g,{message:`Opened project "${e.name}" in browser.`}))}var Jr,le=f(()=>{"use strict";i();k();Jr="https://swirls.ai/projects"});import{Box as me,render as Vr,Text as Wr}from"ink";import Gr from"ink-text-input";import{useState as Kr}from"react";import{jsx as fe,jsxs as pe}from"react/jsx-runtime";function Zr(e){let[t,r]=Kr(""),o=a=>{let s=a.trim().toLowerCase(),c=s===""||s==="y"||s==="yes";setImmediate(()=>e.onAnswer(c))};return fe(me,{flexDirection:"column",children:pe(me,{children:[pe(Wr,{children:[e.message," "]}),fe(Gr,{value:t,onChange:r,onSubmit:o})]})})}async function pt(e){let{above:t}=e??{};return new Promise(r=>{let o=Vr(pe(me,{flexDirection:"column",children:[t,fe(Zr,{message:"Open project in browser? (Y/n)",onAnswer:a=>{o.unmount(),r(a)}})]}))})}var ft=f(()=>{"use strict";i()});var ut={};b(ut,{createProject:()=>qr});import{withResult as Qr}from"@byteslice/result";import{render as Xr}from"ink";import{jsx as dt}from"react/jsx-runtime";async function qr(e,t){let r=await u(this),o=await Qr(()=>r.projects.createProject({name:t}),s=>new Error(`Failed to create project: ${s.message}`,{cause:s}));o.failure&&(Xr(dt(p,{message:o.failure.message})),process.exit(1)),await pt({above:dt(g,{message:`Success! Created "${t}" project: ${o.data.id}`})})&&await J(o.data)}var gt=f(()=>{"use strict";i();P();y();k();le();ft()});var xt={};b(xt,{openProject:()=>to});import{withResult as eo}from"@byteslice/result";import{render as wt}from"ink";import{jsx as ht}from"react/jsx-runtime";async function to(e,t){let r=await u(this),o=await eo(()=>r.projects.getProject({projectId:t}),a=>new Error(`Failed to get project: ${a.message}`,{cause:a}));o.failure&&(wt(ht(p,{message:o.failure.message})),process.exit(1)),o.data||(wt(ht(p,{message:"Project not found."})),process.exit(1)),await J(o.data)}var yt=f(()=>{"use strict";i();P();y();le()});import{Box as T,Text as Y}from"ink";import{Fragment as ao}from"react";import{Fragment as lo,jsx as x,jsxs as ue}from"react/jsx-runtime";function so(e){return typeof e=="boolean"?e?ue(lo,{children:[x(Y,{color:"green",children:"\u2714"})," yes"]}):"no":String(e)}function no(e,t){return t.map(r=>{let o=r.key in e?so(e[r.key]):null;return{column:r,value:o}})}function co(e,t,r=1){return t.map(o=>{let a=String(o).length,s=e.map(d=>o in d&&(typeof d[o]=="string"||typeof d[o]=="number")?String(d[o]).length:0),c=Math.max(...s,a)+r*2;return{name:String(o),key:o,width:c}})}function de(e){return x(Y,{children:Array(e.width).fill("\u2500").join("")})}function Pt(e){let t=co(e.data,e.keys),r=t.reduce((o,a)=>o+a.width,0);return ue(T,{flexDirection:"column",width:r,children:[x(de,{width:r}),x(T,{flexDirection:"row",children:t.map(o=>x(T,{width:o.width,children:x(Y,{bold:!0,color:"blue",children:o.name})},o.name))}),x(de,{width:r}),x(T,{flexDirection:"column",children:e.data.map((o,a)=>{let s=no(o,t);return ue(ao,{children:[x(T,{flexDirection:"row",children:s.map(c=>x(T,{width:c.column.width,children:x(Y,{children:c.value})},c.column.name))}),x(de,{width:r})]},`row-${a}`)})})]})}var kt=f(()=>{"use strict";i()});import{existsSync as mo}from"fs";import{resolve as po}from"path";import{configFileName as St,configSchema as fo}from"@swirls/sdk/config";import{createJiti as uo}from"jiti";async function S(e){if(e)return e;let t=po(process.cwd(),St);if(!mo(t))throw new Error(`No project specified and no ${St} found. Use --project flag or run from a project directory.`);let o=await uo(import.meta.url).import(t,{default:!0});return fo.parse(o).projectId}var R=f(()=>{"use strict";i()});var Ft={};b(Ft,{list:()=>go});import{withResult as jt}from"@byteslice/result";import{render as ge}from"ink";import{jsx as we}from"react/jsx-runtime";async function go(e,t){let r=await jt(()=>S(e.project),n=>new Error(n.message));r.failure&&(ge(we(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await jt(()=>o.buckets.listFiles({projectId:r.data,path:t}),n=>new Error(`Failed to list files: ${n.message}`,{cause:n}));a.failure&&(ge(we(p,{message:a.failure.message})),process.exit(1));let{files:s,folders:c}=a.data;if(c.length===0&&s.length===0){console.log("No files or folders found.");return}let d=[...c.map(n=>({type:"folder",name:n.name,size:"-"})),...s.map(n=>({type:"file",name:n.name,size:n.size?wo(n.size):"-"}))];ge(we(Pt,{keys:["type","name","size"],data:d}))}function wo(e){if(e===0)return"0 B";let t=1024,r=["B","KB","MB","GB","TB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/t**o).toFixed(2))} ${r[o]}`}var vt=f(()=>{"use strict";i();P();y();kt();R()});var Lt={};b(Lt,{upload:()=>yo});import{readFile as ho}from"fs/promises";import{basename as xo}from"path";import{withResult as V}from"@byteslice/result";import{render as A}from"ink";import{jsx as $}from"react/jsx-runtime";async function yo(e,t,r){let o=await V(()=>S(e.project),w=>new Error(w.message));o.failure&&(A($(p,{message:o.failure.message})),process.exit(1));let a=await V(()=>ho(t),w=>new Error(`Failed to read file: ${w.message}`,{cause:w}));a.failure&&(A($(p,{message:a.failure.message})),process.exit(1));let s=xo(t),c=r?`${r}/${s}`:s,d=await u(this),n=await V(()=>d.buckets.createSignedUploadUrl({projectId:o.data,path:c}),w=>new Error(`Failed to get upload URL: ${w.message}`,{cause:w}));n.failure&&(A($(p,{message:n.failure.message})),process.exit(1));let h=await V(async()=>{let w=await fetch(n.data.signedUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream","x-upsert":"true"},body:a.data});if(!w.ok)throw new Error(`Upload failed: ${w.statusText}`);return w},w=>new Error(`Failed to upload file: ${w.message}`,{cause:w}));h.failure&&(A($(p,{message:h.failure.message})),process.exit(1)),A($(g,{message:`Uploaded ${s} to ${c}`}))}var It=f(()=>{"use strict";i();P();y();k();R()});var Tt={};b(Tt,{download:()=>bo});import{writeFile as Co}from"fs/promises";import{withResult as W}from"@byteslice/result";import{render as z}from"ink";import{jsx as _}from"react/jsx-runtime";async function bo(e,t,r){let o=await W(()=>S(e.project),n=>new Error(n.message));o.failure&&(z(_(p,{message:o.failure.message})),process.exit(1));let a=await u(this),s=await W(()=>a.buckets.createSignedUrl({projectId:o.data,path:t}),n=>new Error(`Failed to get download URL: ${n.message}`,{cause:n}));s.failure&&(z(_(p,{message:s.failure.message})),process.exit(1));let c=await W(async()=>{let n=await fetch(s.data.signedUrl);if(!n.ok)throw new Error(`Download failed: ${n.statusText}`);return n.arrayBuffer()},n=>new Error(`Failed to download file: ${n.message}`,{cause:n}));c.failure&&(z(_(p,{message:c.failure.message})),process.exit(1));let d=await W(()=>Co(r,Buffer.from(c.data)),n=>new Error(`Failed to write file: ${n.message}`,{cause:n}));d.failure&&(z(_(p,{message:d.failure.message})),process.exit(1)),z(_(g,{message:`Downloaded ${t} to ${r}`}))}var Rt=f(()=>{"use strict";i();P();y();k();R()});var Et={};b(Et,{deleteFile:()=>Po});import{withResult as Ut}from"@byteslice/result";import{render as he}from"ink";import{jsx as xe}from"react/jsx-runtime";async function Po(e,t){let r=await Ut(()=>S(e.project),s=>new Error(s.message));r.failure&&(he(xe(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await Ut(()=>o.buckets.deleteFile({projectId:r.data,path:t}),s=>new Error(`Failed to delete file: ${s.message}`,{cause:s}));a.failure&&(he(xe(p,{message:a.failure.message})),process.exit(1)),he(xe(g,{message:`Deleted ${t}`}))}var Dt=f(()=>{"use strict";i();P();y();k();R()});var $t={};b($t,{url:()=>ko});import{withResult as At}from"@byteslice/result";import{render as ye}from"ink";import{jsx as Ce}from"react/jsx-runtime";async function ko(e,t){let r=await At(()=>S(e.project),s=>new Error(s.message));r.failure&&(ye(Ce(p,{message:r.failure.message})),process.exit(1));let o=await u(this),a=await At(()=>o.buckets.createSignedUrl({projectId:r.data,path:t,expiresIn:e.expires}),s=>new Error(`Failed to create signed URL: ${s.message}`,{cause:s}));a.failure&&(ye(Ce(p,{message:a.failure.message})),process.exit(1)),console.log(a.data.signedUrl),ye(Ce(g,{message:`URL expires at ${a.data.expiresAt}`}))}var zt=f(()=>{"use strict";i();P();y();k();R()});i();import{run as Bo}from"@stricli/core";i();import{buildInstallCommand as To,buildUninstallCommand as Ro}from"@stricli/auto-complete";import{buildApplication as Uo,buildRouteMap as Eo}from"@stricli/core";i();import{buildCommand as Oe,buildRouteMap as hr}from"@stricli/core";var xr=Oe({loader:async()=>{let{login:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log in with an existing account"}}),yr=Oe({loader:async()=>{let{logout:e}=await Promise.resolve().then(()=>(re(),te));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Log out of an existing account"}}),Ne=hr({routes:{login:xr,logout:yr},docs:{brief:"Auth commands"}});i();import{buildCommand as lt,buildRouteMap as Br}from"@stricli/core";var Or=lt({loader:async()=>{let{generateCode:e}=await Promise.resolve().then(()=>(et(),qe));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Generate application code and types"}}),Nr=lt({loader:async()=>{let{initializeConfig:e}=await Promise.resolve().then(()=>(ct(),nt));return e},parameters:{positional:{kind:"tuple",parameters:[]}},docs:{brief:"Initialize Swirls configuration file"}}),mt=Br({routes:{gen:Or,init:Nr},docs:{brief:"Developer commands"}});i();import{buildCommand as Ct,buildRouteMap as ro}from"@stricli/core";var oo=Ct({loader:async()=>{let{createProject:e}=await Promise.resolve().then(()=>(gt(),ut));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project name",parse:String,placeholder:"name"}]}},docs:{brief:"Create a new project"}}),io=Ct({loader:async()=>{let{openProject:e}=await Promise.resolve().then(()=>(yt(),xt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Project ID",parse:String,placeholder:"project-id"}]}},docs:{brief:"Open project in browser"}}),bt=ro({routes:{create:oo,open:io},docs:{brief:"Project commands"}});i();import{buildCommand as B,buildRouteMap as So}from"@stricli/core";var jo=B({loader:async()=>{let{list:e}=await Promise.resolve().then(()=>(vt(),Ft));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to list (optional)",parse:String,placeholder:"path",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"List files in storage"}}),Fo=B({loader:async()=>{let{upload:e}=await Promise.resolve().then(()=>(It(),Lt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Local file path to upload",parse:String,placeholder:"file"},{brief:"Destination path in storage (optional)",parse:String,placeholder:"dest",optional:!0}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Upload a file to storage"}}),vo=B({loader:async()=>{let{download:e}=await Promise.resolve().then(()=>(Rt(),Tt));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"},{brief:"Local destination path",parse:String,placeholder:"dest"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Download a file from storage"}}),Lo=B({loader:async()=>{let{deleteFile:e}=await Promise.resolve().then(()=>(Dt(),Et));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0}}},docs:{brief:"Delete a file from storage"}}),Io=B({loader:async()=>{let{url:e}=await Promise.resolve().then(()=>(zt(),$t));return e},parameters:{positional:{kind:"tuple",parameters:[{brief:"Path to file in storage",parse:String,placeholder:"path"}]},flags:{project:{kind:"parsed",brief:"Project ID (uses config if not specified)",parse:String,optional:!0},expires:{kind:"parsed",brief:"Expiration time in seconds (default: 86400 = 24 hours)",parse:Number,optional:!0}}},docs:{brief:"Get a signed URL for a file"}}),_t=So({routes:{list:jo,upload:Fo,download:vo,delete:Lo,url:Io},docs:{brief:"Storage commands"}});var Bt="@swirls/cli",Ot="0.0.20",Nt="Swirls command line application";var Do=Eo({routes:{auth:Ne,dev:mt,project:bt,storage:_t,install:To("cli",{bash:"__cli_bash_complete"}),uninstall:Ro("cli",{bash:!0})},docs:{brief:Nt,hideRoute:{install:!0,uninstall:!0}}}),Mt=Uo(Do,{name:Bt,versionInfo:{currentVersion:Ot}});i();import Ao from"fs";import $o from"fs/promises";import zo from"os";import _o from"path";function Ht(e){return{fs:Ao,fsPromise:$o,os:zo,path:_o,process:e}}await Bo(Mt,process.argv.slice(2),Ht(process));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swirls/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.20",
|
|
4
4
|
"description": "Swirls command line application",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Swirls",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"prebuild": "tsc -p tsconfig.json",
|
|
20
20
|
"build": "if [ \"$SWIRLS_ENV\" = 'production' ]; then tsup; elif command -v op >/dev/null 2>&1; then op run --no-masking --env-file=.env.development -- tsup; else tsup; fi",
|
|
21
|
-
"postbuild": "chmod +x ./dist/cli.js",
|
|
21
|
+
"postbuild": "chmod +x ./dist/cli.js ./dist/bash-complete.js",
|
|
22
22
|
"dev": "op run --no-masking --env-file=.env.development -- tsup --watch",
|
|
23
23
|
"pkg:publish": "bun publish",
|
|
24
24
|
"prepublishOnly": "SWIRLS_ENV=production bun run build"
|