create-bunny-launcher
Version:
Configure your static sites with bunny.net in a single cli command 🐰
3 lines (2 loc) • 3.32 kB
JavaScript
import { createRequire } from 'module';const require = createRequire(import.meta.url);
import{useSuspenseQuery as M}from"@tanstack/react-query";import Q from"fs-extra";import{argument as V}from"pastel";import{z as C}from"zod";import B from"node:path";import{option as k}from"pastel";import L from"untildify";import{z as O}from"zod";import N from"node:path";import v from"untildify";import{z as l}from"zod";var c="~/.bunny/credentials",m=N.resolve(v(c)),w=l.object({accessKey:l.string(),email:l.string(),id:l.string(),name:l.string().optional(),profile:l.string()});var z=c,D=O.preprocess(e=>{if(process.env.BUNNY_SHARED_CREDENTIALS_FILE&&!e){let t=process.env.BUNNY_SHARED_CREDENTIALS_FILE.trim();return B.resolve(L(t))}return e},O.string().trim().optional().default(m)),P=D.describe(k({alias:"c",defaultValueDescription:z,description:"Bunny shared credentials file path",valueDescription:"file-path"}));import{stringify as I}from"smol-toml";function K(e,t){return e.reduce((i,r)=>{let{[t]:n,...o}=r;return(typeof n=="string"||typeof n=="number"||typeof n=="symbol")&&(i[n]=o),i},{})}function f(e){return I(K(e.map(t=>({...t,profile:t.profile??t.accessKey})),"profile"))}import G from"camelcase-keys";import H from"fast-deep-equal/es6/index.js";import y from"fs-extra";import U from"is-obj";import F from"p-map";import{parse as Y}from"smol-toml";import _ from"node:os";var d=_.cpus().length;function E(e,t){return e.filter((i,r)=>r===e.findIndex(n=>n[t]===i[t]))}import{createBunnyApiClient as $}from"bunny-sdk";import q from"is-obj";function j({firstName:e,lastName:t}){if(e&&t)return`${e} ${t}`;if(t)return t;if(e)return e}async function u({accessKey:e,profile:t=e}){let r=await $({accessKey:e}).user.get().catch(o=>{throw q(o)&&"responseStatusCode"in o&&o.responseStatusCode===401?new Error(`Cannot find user with accessKey "${e}"`):o});if(!r)throw new Error(`Cannot find user with accessKey "${e}"`);let n=j({firstName:r.firstName,lastName:r.lastName});return{accessKey:e,email:r.email,id:r.id,...n&&{name:n},profile:t}}async function S({accessKey:e=[],credentialsPath:t=m,profile:i=[]}={}){let r=typeof e=="string"?[e]:e,n=typeof i=="string"?[i]:i,o=await y.pathExists(t),s=[];if(o){let a=await y.readFile(t,"utf8"),R=Y(a),g=!1;if(s=await F(Object.entries(R),async([p,T])=>{let x=w.parse({...U(T)?G({...T,profile:p}):{}}),b=await u({accessKey:x.accessKey,profile:p});return H(x,b)||(g=!0),b},{concurrency:d}),g){let p=f(s);await y.outputFile(t,p)}}let A=await F(r,async a=>u({accessKey:a,profile:a}),{concurrency:d}),h=E([...s,...A],"profile");return n.length>0?h.filter(a=>n.includes(a.profile??"")):h}var W=C.object({sharedCredentialsFile:P}),J=C.tuple([C.string().trim().optional().describe(V({description:"Bunny user profile, accessKey, email, id, or name to remove from the shared credentials file. If empty, removes all credentials.",name:"user"}))]);function X({args:e,options:t}){return M({async queryFn(){let i=t.sharedCredentialsFile,r=await S({credentialsPath:i}),n=r.length;if(r=e[0]?r.filter(s=>s.profile!==e[0]&&s.accessKey!==e[0]&&s.email!==e[0]&&s.id!==e[0]&&s.name!==e[0]):[],r.length===n)throw new Error(`Could not find "${e[0]}" in credentials file`);let o=f(r);return await Q.outputFile(i,o),e[0]},queryKey:["logout",e[0],t.sharedCredentialsFile]}),null}export{J as args,X as default,W as options};