UNPKG

create-bunny-launcher

Version:

Configure your static sites with bunny.net in a single cli command 🐰

3 lines (2 loc) 37.8 kB
import { createRequire } from 'module';const require = createRequire(import.meta.url); import"ink";import oi from"react";import pt from"is-obj";import Qe from"prettier";import dt from"tildify";import Go from"deepmerge";function Ie(e){return Go(e,{})}import Wo from"is-obj";function N(e){if(!Wo(e))return!1;for(let r in e)if(Object.hasOwn(e,r))return!1;return!0}import{option as $o}from"pastel";import Vo from"yn";import{z as je}from"zod";var z=!1,Y=je.preprocess(e=>process.env.BUNNY_IMAGE_OPTIMIZER&&typeof e!="boolean"&&!e?Vo(process.env.BUNNY_IMAGE_OPTIMIZER.trim()):e,je.coerce.boolean().optional().default(z)),ze=Y.describe($o({description:"Enable Bunny Optimizer",valueDescription:"boolean"}));import{kebabCase as Zo}from"change-case";import{option as Qo}from"pastel";import{z as Ye}from"zod";var g="main",J=Ye.preprocess(e=>process.env.BUNNY_MAIN_STAGE&&!e?process.env.BUNNY_MAIN_STAGE:e,Ye.string().trim().optional().default(g).transform(e=>Zo(e))),Je=J.describe(Qo({defaultValueDescription:g,description:"Main deployment stage",valueDescription:"string"}));import{option as Xo}from"pastel";import et from"yn";import{z as Le}from"zod";var L=!1,K=Le.preprocess(e=>process.env.BUNNY_NOT_FOUND_SPA&&typeof e!="boolean"&&!e?et(process.env.BUNNY_NOT_FOUND_SPA.trim()):e,Le.coerce.boolean().optional().default(L)),Ke=K.describe(Xo({description:"Rewrite status codes from 404 to 200 to serve a SPA (single page application)",valueDescription:"boolean"}));import{option as rt}from"pastel";import ot from"yn";import{z as He}from"zod";var H=!1,C=He.preprocess(e=>process.env.BUNNY_REFERRERS_BLOCK_NONE_REFERRER&&typeof e!="boolean"&&!e?ot(process.env.BUNNY_REFERRERS_BLOCK_NONE_REFERRER.trim()):e,He.coerce.boolean().optional().default(H)),qe=C.describe(rt({description:"Block all requests with an empty referer header",valueDescription:"boolean"}));import it from"node:path";import{option as at}from"pastel";import st from"untildify";import{z as We}from"zod";import tt from"node:path";import nt from"untildify";import{z as h}from"zod";var q="~/.bunny/credentials",S=tt.resolve(nt(q)),Ge=h.object({accessKey:h.string(),email:h.string(),id:h.string(),name:h.string().optional(),profile:h.string()});var G=q,W=We.preprocess(e=>{if(process.env.BUNNY_SHARED_CREDENTIALS_FILE&&!e){let r=process.env.BUNNY_SHARED_CREDENTIALS_FILE.trim();return it.resolve(st(r))}return e},We.string().trim().optional().default(S)),$e=W.describe(at({alias:"c",defaultValueDescription:G,description:"Bunny shared credentials file path",valueDescription:"file-path"}));import{option as mt}from"pastel";import ct from"yn";import{z as Ve}from"zod";var $=!0,V=Ve.preprocess(e=>process.env.BUNNY_WRITE_CONFIG&&typeof e!="boolean"&&!e?ct(process.env.BUNNY_WRITE_CONFIG.trim()):e,Ve.coerce.boolean().optional().default($)),Ze=V.describe(mt({description:"Write the config to a file upon validation",valueDescription:"boolean"}));async function Xe({config:e,cwd:r=process.cwd()}){let o=Ie(e);return lt(o),ut(o),o=JSON.parse(JSON.stringify(o)),er(o),await ft({cwd:r,text:JSON.stringify(o)})}function er(e){for(let r of Object.keys(e)){let o=e[r];if((o===void 0||N(o))&&!Array.isArray(o)){delete e[r];continue}pt(o)&&er(o)}}function lt(e){e.sharedCredentialsFile===G&&delete e.sharedCredentialsFile,e.imageOptimizer===z&&delete e.imageOptimizer,e.mainStage===g&&delete e.mainStage,e.notFound?.spa===L&&delete e.notFound.spa,e.referrers?.blockNoneReferrer===H&&delete e.referrers.blockNoneReferrer,e.writeConfig===$&&delete e.writeConfig}function ut(e){e.sharedCredentialsFile&&=dt(e.sharedCredentialsFile),e.domain?.name&&(e.domain.name=new URL(e.domain.name).hostname),e.domain?.aliases&&(e.domain.aliases=e.domain.aliases.map(r=>new URL(r).hostname))}async function ft({cwd:e=process.cwd(),text:r}){let o=await Qe.resolveConfig(e)??void 0;return await Qe.format(r,{...o,parser:"json"})}import Eo from"fs-extra";import Hn from"node:path";import"change-case";import{execa as ia}from"execa";import sa from"node:path";import{match as gt,P as x}from"ts-pattern";function rr(e){return gt(e).with(x.array("npm"),()=>"npm").with(x.array("pnpm"),()=>"pnpm").with(x.array("bun"),()=>"bun").with(x.array("yarn"),()=>"yarn").otherwise(()=>{})}import{findUp as ht}from"find-up";async function or({cwd:e=process.cwd()}={}){return(await Promise.all([D({cwd:e,lockFile:"package-lock.json",packageManager:"npm"}),D({cwd:e,lockFile:"pnpm-lock.yaml",packageManager:"pnpm"}),D({cwd:e,lockFile:"bun.lockb",packageManager:"bun"}),D({cwd:e,lockFile:"yarn.lock",packageManager:"yarn"})])).filter(Boolean)}async function D({cwd:e=process.cwd(),lockFile:r,packageManager:o}){return await ht(r,{cwd:e})?o:void 0}import{readPackageUp as yt}from"read-package-up";import{match as bt,P as A}from"ts-pattern";async function tr({cwd:e=process.cwd()}={}){let r=await yt({cwd:e});if(!r)return;let o=r?.packageJson?.packageManager;if(o){let n=bt(o).with(A.string.startsWith("npm"),()=>"npm").with(A.string.startsWith("pnpm"),()=>"pnpm").with(A.string.startsWith("bun"),()=>"bun").with(A.string.startsWith("yarn"),()=>"yarn").otherwise(()=>{});if(n)return n}if(r?.packageJson?.engines?.npm)return"npm"}async function nr({cwd:e}){let r=await tr({cwd:e});if(r)return r;let o=await or({cwd:e}),t=rr(o);if(t)return t}import Nt from"camelcase-keys";import Ct from"fast-deep-equal/es6/index.js";import X from"fs-extra";import St from"is-obj";import cr from"p-map";import{parse as xt}from"smol-toml";import kt from"node:os";var Z=kt.cpus().length;function ir(e,r){return e.filter((o,t)=>t===e.findIndex(n=>n[r]===o[r]))}import{createBunnyApiClient as wt}from"bunny-sdk";import vt from"is-obj";function ar({firstName:e,lastName:r}){if(e&&r)return`${e} ${r}`;if(r)return r;if(e)return e}async function Q({accessKey:e,profile:r=e}){let t=await wt({accessKey:e}).user.get().catch(i=>{throw vt(i)&&"responseStatusCode"in i&&i.responseStatusCode===401?new Error(`Cannot find user with accessKey "${e}"`):i});if(!t)throw new Error(`Cannot find user with accessKey "${e}"`);let n=ar({firstName:t.firstName,lastName:t.lastName});return{accessKey:e,email:t.email,id:t.id,...n&&{name:n},profile:r}}import{stringify as Pt}from"smol-toml";function sr(e,r){return e.reduce((o,t)=>{let{[r]:n,...i}=t;return(typeof n=="string"||typeof n=="number"||typeof n=="symbol")&&(o[n]=i),o},{})}function mr(e){return Pt(sr(e.map(r=>({...r,profile:r.profile??r.accessKey})),"profile"))}async function pr({accessKey:e=[],credentialsPath:r=S,profile:o=[]}={}){let t=typeof e=="string"?[e]:e,n=typeof o=="string"?[o]:o,i=await X.pathExists(r),a=[];if(i){let m=await X.readFile(r,"utf8"),l=xt(m),v=!1;if(a=await cr(Object.entries(l),async([P,Oe])=>{let Me=Ge.parse({...St(Oe)?Nt({...Oe,profile:P}):{}}),Ue=await Q({accessKey:Me.accessKey,profile:P});return Ct(Me,Ue)||(v=!0),Ue},{concurrency:Z}),v){let P=mr(a);await X.outputFile(r,P)}}let p=await cr(t,async m=>Q({accessKey:m,profile:m}),{concurrency:Z}),f=ir([...a,...p],"profile");return n.length>0?f.filter(m=>n.includes(m.profile??"")):f}import{resolve4 as Et,resolve6 as _t}from"node:dns/promises";import{BlockList as Bt}from"node:net";import{getDomain as Tt}from"tldts";import ee from"is-cidr";import{isIP as re,isIPv4 as oe,isIPv6 as te}from"node:net";function dr(e,r){if(re(r)){if(oe(r)){e.addAddress(r,"ipv4");return}if(te(r)){e.addAddress(r,"ipv6");return}}if(ee(r)){if(ee.v4(r)){let[o,t]=r.split("/");if(o&&t){e.addSubnet(o,Number(t),"ipv4");return}}if(ee.v6(r)){let[o,t]=r.split("/");if(o&&t){e.addSubnet(o,Number(t),"ipv6");return}}}if(r.includes("-")){let[o,t]=r.split("-");if(o&&t&&re(o)&&re(t)){if(oe(o)&&oe(t)){e.addRange(o,t,"ipv4");return}if(te(o)&&te(t)){e.addRange(o,t,"ipv6");return}}}}import{isIP as Dt,isIPv4 as At,isIPv6 as Rt}from"node:net";function lr(e,r){if(Dt(r)){if(At(r))return e.check(r,"ipv4");if(Rt(r))return e.check(r,"ipv6")}}function ur(e){return e.status==="fulfilled"}function fr(e){if(!e.ok)throw new Error(`${e.status} ${e.statusText}`,{cause:e});return e}async function R(e){let r=Tt(e),o=new URL(e);if(!r)throw new Error(`Cannot resolve domain for "${o.hostname}"`);try{let[t,n,i]=await Promise.all([Promise.allSettled([Et(r),_t(r)]),gr("https://bunnycdn.com/api/system/edgeserverlist"),gr("https://bunnycdn.com/api/system/edgeserverlist/IPv6")]),a=t.filter(ur).flatMap(l=>l.value),p=new Bt,f=[...n,...i];for(let l of f)dr(p,l);let m=!0;for(let l of a)if(lr(p,l)!==!0){m=!1;break}return{isChecked:m,records:a,type:"aname"}}catch(t){throw new Error(`Cannot resolve ANAME record or CNAME Flattening for "${r}"`,{cause:t})}}async function gr(e){return fetch(e,{headers:{"content-type":"json"}}).then(fr).then(async r=>r.json())}import{resolveCname as Ft}from"node:dns/promises";import{getSubdomain as Ot}from"tldts";async function E(e,r=".b-cdn.net"){r=r.toLowerCase();let o=new URL(e),t=Ot(e);if(t===null)throw new Error(`Cannot resolve subdomain for "${o.hostname}"`);if(t==="")throw new Error(`CNAME records cannot be used for the root domain "${o.hostname}". Instead, consider switching nameservers, or consider using an ANAME record or CNAME Flattening with Anycast DNS.`);try{let n=await Ft(o.hostname),i=!0;for(let a of n)if(!a.toLowerCase().endsWith(r)){i=!1;break}return{isChecked:i,records:n,type:"cname"}}catch(n){throw new Error(`Cannot resolve CNAME records for domain "${o.hostname}"`,{cause:n})}}import{resolveNs as Mt}from"node:dns/promises";import{getDomain as Ut}from"tldts";async function _(e){let r=Ut(e),o=new URL(e);if(!r)throw new Error(`Cannot resolve domain for "${o.hostname}"`);try{let t=await Mt(r),n=!0;return t[0]?.toLowerCase()!=="kiki.bunny.net"&&(n=!1),t[1]?.toLowerCase()!=="coco.bunny.net"&&(n=!1),t.length>2&&(n=!1),{isChecked:n,records:t,type:"nameserver"}}catch(t){throw new Error(`Cannot resolve NS records for "${r}"`,{cause:t})}}async function hr(e,r,o=".b-cdn.net"){switch(r){case"nameserver":return _(e);case"aname":return R(e);case"cname":return E(e,o)}}async function yr({domainName:e,pullZoneDomain:r=".b-cdn.net"}){let[o,t,n]=await Promise.allSettled([_(e),R(e),E(e,r)]);if(o.status==="fulfilled"&&o.value.isChecked)return o.value;if(t.status==="fulfilled"&&t.value.isChecked)return t.value;if(n.status==="fulfilled"&&n.value.isChecked)return n.value}import br from"fs-extra";import kr from"node:path";async function d({cwd:e=process.cwd(),fileName:r}){let o=kr.resolve(e,r);return br.pathExists(o)}async function w({cwd:e=process.cwd(),fileName:r}){let o=kr.resolve(e,r);if(await d({cwd:e,fileName:r}))return br.readFile(o,"utf8")}import{readPackage as It}from"read-pkg";async function B({cwd:e}){let o=await d({cwd:e,fileName:"package.json"})?await It({cwd:e}):{},t=Object.keys(o?.dependencies??{}),n=Object.keys(o?.devDependencies??{}),i=Object.keys(o?.peerDependencies??{}),a=Object.keys(o?.optionalDependencies??{});return[...t,...n,...i,...a]}async function wr({cwd:e=process.cwd()}={}){let r=await jt({cwd:e});if(r.packageJson){if(r.packageJson.includes("@angular-devkit/build-angular")&&r.packageJson.includes("@analogjs/platform"))return"analog";if(r.packageJson.includes("@angular-devkit/build-angular")&&!r.packageJson.includes("@analogjs/platform"))return"angular";if(r.packageJson.includes("astro")&&!r.packageJson.includes("@astrojs/starlight"))return"astro";if(r.packageJson.includes("astro")&&r.packageJson.includes("@astrojs/starlight"))return"starlight";if(r.packageJson.includes("@docusaurus/core"))return"docusaurus";if(r.packageJson.includes("@11ty/eleventy"))return"eleventy";if(r.packageJson.includes("ember-cli"))return"ember";if(r.packageJson.includes("gatsby"))return"gatsby";if(r.packageJson.includes("hexo"))return"hexo";if(r.packageJson.includes("hono"))return"hono";if(r.packageJson.includes("metalsmith"))return"metalsmith";if(r.packageJson.includes("next"))return"nextjs";if(r.packageJson.includes("nuxt"))return"nuxt";if(r.packageJson.includes("@builder.io/qwik-city"))return"qwik";if(r.packageJson.includes("@solidjs/start"))return"solid";if(r.packageJson.includes("@sveltejs/kit"))return"svelte";if(r.packageJson.includes("umi"))return"umijs";if(r.packageJson.includes("vitepress"))return"vitepress";if(r.packageJson.includes("vite"))return r.packageJson.includes("lit")?"vite-lit":r.packageJson.includes("preact")&&r.packageJson.includes("@preact/preset-vite")?"vite-preact":r.packageJson.includes("@builder.io/qwik")?"vite-qwik":r.packageJson.includes("react")&&r.packageJson.includes("react-dom")?"vite-react":r.packageJson.includes("solid-js")&&r.packageJson.includes("vite-plugin-solid")?"vite-solid":r.packageJson.includes("svelte")&&r.packageJson.includes("@sveltejs/vite-plugin-svelte")&&!r.packageJson.includes("@sveltejs/kit")?"vite-svelte":r.packageJson.includes("vue")&&r.packageJson.includes("@vitejs/plugin-vue")?"vite-vue":"vite-vanilla"}if(r.gemfile){if(r.gemfile.includes("jekyll"))return"jekyll";if(r.gemfile.includes("middleman")&&!r.slateSh)return"middleman";if(r.gemfile.includes("middleman")&&r.slateSh)return"slate"}return r.indexHtml?.includes("docsify")?"docsify":r.hugoToml?"hugo":r.bookToml?"mdbook":r.mkdocsYml?"mkdocs":r.pelicanconfPy?"pelican":!r.pelicanconfPy&&(r.makeFile?.includes("SPHINX")||r.makeBat?.includes("SPHINX"))?"sphinx":r.configToml?"zola":"other"}async function jt({cwd:e=process.cwd()}){let[r,o,t,n,i,a,p,f,m,l,v]=await Promise.all([B({cwd:e}),w({cwd:e,fileName:"Gemfile"}),w({cwd:e,fileName:"index.html"}),w({cwd:e,fileName:"Makefile"}),w({cwd:e,fileName:"make.bat"}),d({cwd:e,fileName:"hugo.toml"}),d({cwd:e,fileName:"book.toml"}),d({cwd:e,fileName:"slate.sh"}),d({cwd:e,fileName:"mkdocs.yml"}),d({cwd:e,fileName:"pelicanconf.py"}),d({cwd:e,fileName:"config.toml"})]);return{bookToml:p,configToml:v,gemfile:o,hugoToml:a,indexHtml:t,makeBat:i,makeFile:n,mkdocsYml:m,packageJson:r,pelicanconfPy:l,slateSh:f}}import{locatePath as zt}from"locate-path";import T from"node:path";async function vr({cwd:e=process.cwd(),outDir:r}){let o=T.resolve(e,r),t=await zt([T.join(o,"404.html"),T.join(o,"404/index.html"),T.join(o,"200.html")]);if(t)return t.slice(o.length)}import Jt from"fs-extra";import Lt from"node:path";import{option as Yt}from"pastel";import{z as Pr}from"zod";var ne="https://bunny-launcher.net/static/json-schema/bunny-launcher/schema.json",ie=Pr.preprocess(e=>process.env.BUNNY_SCHEMA&&!e?process.env.BUNNY_SCHEMA:e,Pr.string().trim()),Nr=ie.optional().describe(Yt({defaultValueDescription:ne,description:"$schema for json schema config autocomplete",valueDescription:"string"}));async function Cr({cwd:e=process.cwd(),schema:r}={}){let o="./node_modules/bunny-launcher/schema.json";if(!r?.includes(o)){if((await B({cwd:e})).includes("bunny-launcher"))return o;let n=Lt.join(e,o);if(await Jt.pathExists(n))return o}return r??ne}import{z as c}from"zod";var Sr=["CU","IR","KP","SY"];import{option as Kt}from"pastel";import{z as Dr}from"zod";var Ht=/^[^:]+:.+$/g,xr=Dr.string().trim().min(3).refine(e=>Ht.test(e),"Credentials must match format username:password"),ae=Dr.preprocess(e=>process.env.BUNNY_BASIC_AUTH_CREDENTIALS&&!e?process.env.BUNNY_BASIC_AUTH_CREDENTIALS.split(","):e,xr.or(xr.array()).optional().transform(e=>typeof e=="string"?[e]:e)),Ar=ae.describe(Kt({description:'The "username:password" combination to protect your website with basic auth',valueDescription:"username:password"}));import{option as qt}from"pastel";import{z as Er}from"zod";var Rr=Er.string().trim(),se=Er.preprocess(e=>process.env.BUNNY_BASIC_AUTH_PASSWORDLESS_STAGES&&!e?process.env.BUNNY_BASIC_AUTH_PASSWORDLESS_STAGES.split(","):e,Rr.or(Rr.array()).optional().transform(e=>typeof e=="string"?[e]:e)),_r=se.describe(qt({description:"Website stages that can be accessed without basic auth",valueDescription:"string"}));import{option as Gt}from"pastel";import{z as Br}from"zod";function y(e){if(typeof e=="string"){let r=e;return r=r.trim(),r=r.at(0)==="/"?r:`/${r}`,r}return e}var me=Br.preprocess(e=>process.env.BUNNY_BASIC_AUTH_PATHS&&!e?process.env.BUNNY_BASIC_AUTH_PATHS.split(",").map(y):Array.isArray(e)?e.reduce((r,o)=>(typeof o=="string"&&r.push(y(o)),r),[]):y(e),Br.string().trim().optional()),Tr=me.describe(Gt({description:"The website URL paths protected with basic auth",valueDescription:"string"}));import{option as Wt}from"pastel";import $t from"yn";import{z as Fr}from"zod";var ce=Fr.preprocess(e=>process.env.BUNNY_BUILD_BEFORE_DEPLOY&&typeof e!="boolean"&&!e?$t(process.env.BUNNY_BUILD_BEFORE_DEPLOY.trim()):e,Fr.coerce.boolean().optional().default(!1)),Or=ce.describe(Wt({description:"Build the project before deploying it",valueDescription:"boolean"}));import{option as Vt}from"pastel";import{z as pe}from"zod";var de=pe.preprocess(e=>{if(process.env.BUNNY_BUILD_COMMANDS&&!e)try{return JSON.parse(process.env.BUNNY_BUILD_COMMANDS)}catch{return process.env.BUNNY_BUILD_COMMANDS}if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return Array.isArray(e)?e.reduce((r,o)=>{if(typeof o=="string")try{let t=JSON.parse(o);return Array.isArray(t)?(r.push(...t),r):(r.push(t),r)}catch{return r}return r},[]):e},pe.string().or(pe.string().array()).optional().transform(e=>typeof e=="string"?[e]:e)),Mr=de.describe(Vt({description:"Command used to build your website",valueDescription:"string|json"}));import{option as Zt}from"pastel";import{z as Ir}from"zod";var Ur=["analog","angular","astro","docsify","docusaurus","eleventy","ember","gatsby","hexo","hono","hugo","jekyll","mdbook","metalsmith","middleman","mkdocs","nextjs","nuxt","other","pelican","qwik","slate","solid","sphinx","starlight","svelte","umijs","vite-lit","vite-preact","vite-qwik","vite-react","vite-solid","vite-svelte","vite-vanilla","vite-vue","vitepress","zola"],F={analog:{build:{commands:["npm run build"],framework:"analog",outDir:"dist/client"},notFound:{spa:!0}},angular:{build:{commands:["npm run build"],framework:"angular",outDir:"dist/*/browser"},notFound:{spa:!0}},astro:{build:{commands:["npm run build"],framework:"astro",outDir:"dist"}},docsify:{build:{commands:[],framework:"docsify",outDir:"./"},notFound:{spa:!0}},docusaurus:{build:{commands:["npm run build"],framework:"docusaurus",outDir:"build"}},eleventy:{build:{commands:["npx --yes @11ty/eleventy"],framework:"eleventy",outDir:"_site"}},ember:{build:{commands:["npm run build"],framework:"ember",outDir:"dist"},notFound:{spa:!0}},gatsby:{build:{commands:["npm run build"],framework:"gatsby",outDir:"public"}},hexo:{build:{commands:["npm run build"],framework:"hexo",outDir:"public"}},hono:{build:{commands:["npx tsx src/build"],framework:"hono",outDir:"static"}},hugo:{build:{commands:["hugo --cleanDestinationDir"],framework:"hugo",outDir:"public"}},jekyll:{build:{commands:["jekyll build"],framework:"jekyll",outDir:"_site"}},mdbook:{build:{commands:["mdbook build"],framework:"mdbook",outDir:"book"}},metalsmith:{build:{commands:["npm run build"],framework:"metalsmith",outDir:"build"}},middleman:{build:{commands:["middleman build --clean"],framework:"middleman",outDir:"build"}},mkdocs:{build:{commands:["mkdocs build"],framework:"mkdocs",outDir:"site"}},nextjs:{build:{commands:["npm run build"],framework:"nextjs",outDir:"out"}},nuxt:{build:{commands:["npm run generate"],framework:"nuxt",outDir:".output/public"}},other:{build:{commands:[],framework:"other",outDir:"./"}},pelican:{build:{commands:["pelican content"],framework:"pelican",outDir:"output"}},qwik:{build:{commands:["npm run build","npm run build.server"],framework:"qwik",outDir:"dist"}},slate:{build:{commands:["bundle exec middleman build --clean"],framework:"slate",outDir:"build"}},solid:{build:{commands:["npm run build"],framework:"solid",outDir:".output/public"}},sphinx:{build:{commands:["make html"],framework:"sphinx",outDir:"build/html"}},starlight:{build:{commands:["npm run build"],framework:"starlight",outDir:"dist"}},svelte:{build:{commands:["npm run build"],framework:"svelte",outDir:"build"}},umijs:{build:{commands:["npm run build"],framework:"umijs",outDir:"dist"}},"vite-lit":{build:{commands:["npm run build"],framework:"vite-lit",outDir:"dist"},notFound:{spa:!0}},"vite-preact":{build:{commands:["npm run build"],framework:"vite-preact",outDir:"dist"},notFound:{spa:!0}},"vite-qwik":{build:{commands:["npm run build"],framework:"vite-qwik",outDir:"dist"},notFound:{spa:!0}},"vite-react":{build:{commands:["npm run build"],framework:"vite-react",outDir:"dist"},notFound:{spa:!0}},"vite-solid":{build:{commands:["npm run build"],framework:"vite-solid",outDir:"dist"},notFound:{spa:!0}},"vite-svelte":{build:{commands:["npm run build"],framework:"vite-svelte",outDir:"dist"},notFound:{spa:!0}},"vite-vanilla":{build:{commands:["npm run build"],framework:"vite-vanilla",outDir:"dist"}},"vite-vue":{build:{commands:["npm run build"],framework:"vite-vue",outDir:"dist"},notFound:{spa:!0}},vitepress:{build:{commands:["npm run docs:build"],framework:"vitepress",outDir:"*/.vitepress/dist"}},zola:{build:{commands:["zola build"],framework:"zola",outDir:"public"}}};var le=Ir.preprocess(e=>process.env.BUNNY_BUILD_FRAMEWORK&&!e?process.env.BUNNY_BUILD_FRAMEWORK.trim():e,Ir.enum(Ur)),jr=le.optional().describe(Zt({description:"Website framework",valueDescription:"string"}));import{option as Qt}from"pastel";import{z as zr}from"zod";var ue=zr.preprocess(e=>process.env.BUNNY_BUILD_OUT_DIR&&!e?process.env.BUNNY_BUILD_OUT_DIR:e,zr.string().trim()),Yr=ue.optional().describe(Qt({defaultValueDescription:F.other.build.outDir,description:"Website output directory to deploy",valueDescription:"path"}));import{option as Xt}from"pastel";import{z as Jr}from"zod";var Lr=["npm","pnpm","bun","yarn"],fe=Jr.preprocess(e=>process.env.BUNNY_BUILD_PACKAGE_MANAGER&&!e?process.env.BUNNY_BUILD_PACKAGE_MANAGER.trim():e,Jr.enum(Lr).optional()),Kr=fe.describe(Xt({description:"Nodejs package manager",valueDescription:Lr.join("|")}));import{option as rn}from"pastel";import{z as on}from"zod";import{z as en}from"zod";var b=en.string().min(2).max(2).toUpperCase();var ge=on.preprocess(e=>process.env.BUNNY_COUNTRIES_ALLOWED&&!e?process.env.BUNNY_COUNTRIES_ALLOWED.split(","):e,b.or(b.array()).optional().transform(e=>typeof e=="string"?[e]:e)),Hr=ge.describe(rn({description:"Allowed country",valueDescription:"string"}));import{option as tn}from"pastel";import{z as nn}from"zod";var he=nn.preprocess(e=>process.env.BUNNY_COUNTRIES_BLOCKED&&!e?process.env.BUNNY_COUNTRIES_BLOCKED.split(","):e,b.or(b.array()).optional().transform(e=>typeof e=="string"?[e]:e)),qr=he.describe(tn({description:"Blocked country",valueDescription:"string"}));import an from"is-plain-obj";import{option as sn}from"pastel";import{z as O}from"zod";var ye=O.preprocess(e=>{if(process.env.BUNNY_CUSTOM_HEADERS&&!e)try{return JSON.parse(process.env.BUNNY_CUSTOM_HEADERS)}catch{return process.env.BUNNY_CUSTOM_HEADERS}if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return Array.isArray(e)?e.reduce((r,o)=>{if(typeof o=="string")try{let t=JSON.parse(o);if(an(t))return{...r,...t}}catch{return r}return r},{}):e},O.record(O.string().trim(),O.string().trim()).optional()),Gr=ye.describe(sn({description:"Website custom headers via edge rules",valueDescription:"json"}));import{sanitizeUrl as cn}from"@braintree/sanitize-url";import{option as pn}from"pastel";import{z as $r}from"zod";var mn=/^[a-z]/i;function u(e){if(typeof e=="string"){let r=e.trim();if(r.startsWith("http://"))return`https://${r.slice(7)}`;if(r.startsWith("https://"))return r;if(mn.test(r))return`https://${r}`}return e}var Wr=$r.string().url().startsWith("https://").transform(cn),be=$r.preprocess(e=>process.env.BUNNY_DOMAIN_ALIASES&&!e?process.env.BUNNY_DOMAIN_ALIASES.split(",").map(u):Array.isArray(e)?e.reduce((r,o)=>(typeof o=="string"&&r.push(u(o)),r),[]):u(e),Wr.or(Wr.array())).optional().transform(e=>typeof e=="string"?[e]:e),Vr=be.optional().describe(pn({description:"Domain alias to redirect",valueDescription:"string"}));import{sanitizeUrl as dn}from"@braintree/sanitize-url";import{argument as ln,option as un}from"pastel";import{z as Zr}from"zod";var M=Zr.preprocess(e=>process.env.BUNNY_DOMAIN_NAME&&!e?u(process.env.BUNNY_DOMAIN_NAME):typeof e=="string"?u(e):e,Zr.string().url().startsWith("https://").transform(dn)),Qr=M.optional().describe(un({alias:"d",description:"Domain name",valueDescription:"string"})),Bm=M.describe(ln({name:"domain-name"}));import{option as fn}from"pastel";import{z as eo}from"zod";var Xr=["101domain.com","123-reg.co.uk","alibabacloud.com","aws.amazon.com","blacknight.com","bluehost.com/fastdomain","bluehost.com/hostmonster","bluehost.com/ipage","cloudflare.com","directnic.com","dnsimple.com","domain.com","domaindiscount24.com","dreamhost.com","dynadot.com","easydns.com","enom.com","flokinet.is","freenom.com","freeparking.co.nz","gandi.net","gname.com","godaddy.com","hostgator.com","hostico.com","hostinger.com","hover.com","internetbs.net","ionos.com","iwantmyname.com","melbourneit.au","moniker.com","name.com","namebright.com","namecheap.com","namesilo.com","networksolutions.com","nic.ru","nomeo.be","onamae.com","one.com","onlydomains.com","other","ovhcloud.com/en","porkbun.com","rackspace.com","realtimeregister.com","reg.ru","register.com","register.it","spaceship.com","squarespace.com","tsohost.com","uniteddomains.com","web.com","west.cn","wix.com","wordpress.com","yola.com"];var ke=eo.preprocess(e=>process.env.BUNNY_DOMAIN_REGISTRAR&&!e?process.env.BUNNY_DOMAIN_REGISTRAR.trim():e,eo.enum(Xr).optional()),ro=ke.describe(fn({description:"Domain registrar where you purchased your domain name",valueDescription:"string"}));import{option as gn}from"pastel";import{z as oo}from"zod";var to=["cname","nameserver","aname"],we=oo.preprocess(e=>process.env.BUNNY_DOMAIN_TYPE&&!e?process.env.BUNNY_DOMAIN_TYPE.trim():e,oo.enum(to)),no=we.optional().describe(gn({description:"Domain linking type",valueDescription:to.join("|")}));import{option as kn}from"pastel";import{z as wn}from"zod";import{z as s}from"zod";var io={ForceSsl:0,RedirectToUrl:1,ChangeOriginUrl:2,OverrideCacheTime:3,BlockRequest:4,SetResponseHeader:5,SetRequestHeader:6,ForceDownload:7,DisableTokenAuthentication:8,EnableTokenAuthentication:9,OverrideCacheTimePublic:10,IgnoreQueryStringCacheVary:11,DisableBunnyOptimizer:12,ForceCompression:13,SetStatusCode:14,BypassPermaCache:15,OverrideBrowserCacheTime:16,OriginStorage:17,SetNetworkRateLimit:18,SetConnectionLimit:19,SetRequestsPerSecondLimit:20},hn={Url:0,RequestHeader:1,ResponseHeader:2,FileOrUrlExtension:3,CountryCode2Letter:4,RemoteIp:5,QueryString:6,RandomChancePercent:7,StatusCode:8,RequestMethod:9,CookieValue:10,CountryStateCode:11},ao={MatchAny:0,MatchAll:1,MatchNone:2},yn=s.object({ActionType:s.nativeEnum(io),ActionParameter1:s.string().nullable().optional(),ActionParameter2:s.string().nullable().optional()}),bn=s.object({Type:s.nativeEnum(hn),PatternMatches:s.string().array(),PatternMatchingType:s.nativeEnum(ao),Parameter1:s.string().nullable().optional()}),ve=s.object({ActionType:s.nativeEnum(io),ActionParameter1:s.string().nullable().optional(),ActionParameter2:s.string().nullable().optional(),Triggers:bn.array(),ExtraActions:yn.array(),TriggerMatchingType:s.nativeEnum(ao),Description:s.string().optional(),Enabled:s.boolean()});var Pe=wn.preprocess(e=>{if(process.env.BUNNY_EDGE_RULES&&!e)try{return JSON.parse(process.env.BUNNY_EDGE_RULES)}catch{return process.env.BUNNY_EDGE_RULES}if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return Array.isArray(e)?e.reduce((r,o)=>{if(typeof o=="string")try{let t=JSON.parse(o);return Array.isArray(t)?(r.push(...t),r):(r.push(t),r)}catch{return r}return r},[]):e},ve.or(ve.array()).optional().transform(e=>{if(e!==void 0)return Array.isArray(e)?e.filter(Boolean):[e]})),so=Pe.describe(kn({description:"Configured edge rules for your website",valueDescription:"json"}));import{option as Pn}from"pastel";import{z as Nn}from"zod";import{z as vn}from"zod";var Ne=vn.string().ip();var Ce=Nn.preprocess(e=>process.env.BUNNY_IPS_BLOCKED&&!e?process.env.BUNNY_IPS_BLOCKED.split(","):e,Ne.or(Ne.array()).optional().transform(e=>typeof e=="string"?[e]:e)),mo=Ce.describe(Pn({description:"Blocked IP address",valueDescription:"ip"}));import{option as Cn}from"pastel";import{z as Se}from"zod";var xe=Se.preprocess(e=>process.env.BUNNY_LOGGING_STORAGE_ZONE&&!e?process.env.BUNNY_LOGGING_STORAGE_ZONE.trim():e,Se.string().trim().or(Se.coerce.number().positive()).optional()),co=xe.describe(Cn({description:"Permanent log storage name or id",valueDescription:"string|number"}));import{option as Sn}from"pastel";import{z as po}from"zod";var De=po.preprocess(e=>(process.env.BUNNY_NOT_FOUND_PATH&&!e&&(e=process.env.BUNNY_NOT_FOUND_PATH),y(e)),po.string().trim().optional()),lo=De.describe(Sn({description:"Not found fallback path",valueDescription:"string"}));import{option as xn}from"pastel";import{z as uo}from"zod";var fo=["performance","cost"],Ae=uo.preprocess(e=>process.env.BUNNY_OPTIMIZE&&!e?process.env.BUNNY_OPTIMIZE.trim():e,uo.enum(fo)),go=Ae.optional().describe(xn({description:"Optimize performance or cost. This setting cannot be changed without first removing the existing website.",valueDescription:fo.join("|")}));import{option as Dn}from"pastel";import{z as yo}from"zod";var ho=yo.string().trim().min(1),Re=yo.preprocess(e=>process.env.BUNNY_PROFILE&&!e?process.env.BUNNY_PROFILE.split(","):e,ho.or(ho.array()).optional().transform(e=>typeof e=="string"?[e]:e)),bo=Re.describe(Dn({alias:"p",description:"Bunny user profile name",valueDescription:"string"}));import An from"is-plain-obj";import{option as Rn}from"pastel";import{z as U}from"zod";var Ee=U.preprocess(e=>{if(process.env.BUNNY_REDIRECTS&&!e)try{return JSON.parse(process.env.BUNNY_REDIRECTS)}catch{return process.env.BUNNY_REDIRECTS}if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return Array.isArray(e)?e.reduce((r,o)=>{if(typeof o=="string")try{let t=JSON.parse(o);if(An(t))return{...r,...t}}catch{return r}return r},{}):e},U.record(U.string().trim(),U.string().trim()).optional()),ko=Ee.describe(Rn({description:"Website redirects via edge rules",valueDescription:"json"}));import{option as _n}from"pastel";import{z as Bn}from"zod";import{z as En}from"zod";var k=En.string();var _e=Bn.preprocess(e=>process.env.BUNNY_REFERRERS_ALLOWED&&!e?process.env.BUNNY_REFERRERS_ALLOWED.split(","):e,k.or(k.array()).optional().transform(e=>typeof e=="string"?[e]:e)),wo=_e.describe(_n({description:"Allowed referrer",valueDescription:"string"}));import{option as Tn}from"pastel";import{z as Fn}from"zod";var Be=Fn.preprocess(e=>process.env.BUNNY_REFERRERS_BLOCKED&&!e?process.env.BUNNY_REFERRERS_BLOCKED.split(","):e,k.or(k.array()).optional().transform(e=>typeof e=="string"?[e]:e)),vo=Be.describe(Tn({description:"Blocked referrer",valueDescription:"string"}));import{kebabCase as On}from"change-case";import{option as Mn}from"pastel";import{username as Un}from"username";import In from"yn";import{z as Po}from"zod";var No=In(process.env.CI)?g:await Un(),Te=Po.preprocess(e=>(process.env.BUNNY_STAGE&&!e?process.env.BUNNY_STAGE:e)??No,Po.string().trim().transform(e=>On(e))),Co=Te.describe(Mn({alias:"s",defaultValueDescription:No,description:"Deployment stage",valueDescription:"string"}));import{coerce as Yn,valid as Jn}from"semver";import{z as Ln}from"zod";import{Text as Oc}from"ink";import{readPackageUp as jn}from"read-package-up";import{jsx as Ic}from"react/jsx-runtime";var zn=await jn({cwd:import.meta.dirname}),{version:I}=zn.packageJson;var So=Ln.string().min(5).refine(e=>Jn(Yn(e))).optional().default(I);var xo=".bunny/launcher.json",Kn=c.object({$schema:ie,basicAuth:c.object({credentials:ae,passwordlessStages:se,patterns:me}).optional(),build:c.object({beforeDeploy:ce,commands:de,framework:le,outDir:ue,packageManager:fe}).optional(),countries:c.object({allowed:ge}).or(c.object({blocked:he})).default({blocked:Sr}).optional(),customHeaders:ye,domain:c.object({aliases:be,name:M,registrar:ke,type:we}),edgeRules:Pe,imageOptimizer:Y,ips:c.object({blocked:Ce}).optional(),logging:c.object({storageZone:xe}).optional(),mainStage:J,notFound:c.object({path:De,spa:K}).optional(),optimize:Ae,profiles:Re,redirects:Ee,referrers:c.object({allowed:_e,blockNoneReferrer:C}).or(c.object({blocked:Be,blockNoneReferrer:C})).optional(),sharedCredentialsFile:W,stage:Te,version:So,writeConfig:V}).strict(),j=Kn.deepPartial();async function Do({config:e,cwd:r=process.cwd(),runtime:o}){let t=await pr({accessKey:o.accessKey,credentialsPath:e.sharedCredentialsFile,profile:e.profile});if(!o.accessKey&&!e.profile&&t.length===1){let i=t[0];o.accessKey=i.accessKey,e.profile=i.profile}if(!o.accessKey&&e.profile){let i=t.find(a=>a.profile===e.profile);o.accessKey=i?.accessKey}if(e.build??={},e.notFound??={},!e.build.framework){let i=await wr(),a=F[i];e.build.framework??=a.build.framework,e.build.commands=e.build.commands?.length===0?a.build.commands:e.build.commands,e.build.outDir??=a.build.outDir,e.build.packageManager??=await nr({cwd:r}),e.notFound.spa??=a.notFound?.spa??!1}e.notFound.path=await vr({cwd:r,outDir:e.build.outDir??"./"}),e.domain??={},o.domain??={},o.names??={};let n=`${o.names.pullZoneDomain??""}.b-cdn.net`;if(e.domain.name&&e.domain.type&&!o.domain.isChecked){let{isChecked:i,records:a}=await hr(e.domain.name,e.domain.type,n);o.domain.isChecked=i,o.domain.records=a}if(e.domain.name&&!e.domain.type){let i=await yr({domainName:e.domain.name,pullZoneDomain:n});i&&(e.domain.type=i.type,o.domain.isChecked=i.isChecked,o.domain.records=i.records)}return o.accessKey&&!o.name&&(o.name=resolveNames()),o.accessKey&&e.domain&&o.name&&o.domain.isChecked&&(e.domain.type==="nameserver"||e.domain.type==="cname")&&(e.domain.type,e.domain.type),e.$schema=await Cr({cwd:r,schema:e.$schema}),{config:j.parse(e),runtime:o}}import Ao from"deepmerge";function Ro({config:e,options:r,runtime:o}){let t={$schema:r.schema,basicAuth:{credentials:r.basicAuthCredential,passwordlessStages:r.basicAuthPasswordlessStage,paths:r.basicAuthPattern},build:{beforeDeploy:r.buildBeforeDeploy,commands:r.buildCommand,framework:r.buildFramework,outDir:r.buildOutDir,packageManager:r.buildPackageManager},countries:(r.countryAllowed?.length??0)>0?{allowed:r.countryAllowed}:{blocked:r.countryBlocked},customHeaders:r.customHeader,domain:{name:r.domainName,registrar:r.domainRegistrar,type:r.domainType},edgeRules:r.edgeRule,imageOptimizer:r.imageOptimizer,ips:{blocked:r.ipBlocked},logging:{storageZone:r.loggingStorageZone},notFound:{path:r.notFoundPath,spa:r.notFoundSpa},optimize:r.optimize,profile:r.profile?r.profile.at(-1):void 0,redirects:r.redirect,referrers:(r.referrerAllowed?.length??0)>0?{allowed:r.referrerAllowed,blockNoneReferrer:r.referrersBlockNoneReferrer}:{blocked:r.referrerBlocked,blockNoneReferrer:r.referrersBlockNoneReferrer},sharedCredentialsFile:r.sharedCredentialsFile,version:I},n={accessKey:r.accessKey?r.accessKey.at(-1):r.accessKey,stage:r.stage};return{config:Ao(e,t),runtime:Ao(o,n)}}async function _o({cwd:e=process.cwd(),options:r}){let o={},t=Hn.resolve(e,xo),i=await Eo.pathExists(t)?await Eo.readJson(t):{},a=j.parse(i),p=Ro({config:a,options:r,runtime:o});return Do({config:p.config,cwd:e,runtime:p.runtime})}import{z as Zn}from"zod";import{option as qn}from"pastel";import{z as To}from"zod";var Bo=To.string().trim().uuid(),Gn=To.preprocess(e=>process.env.BUNNY_ACCESS_KEY&&!e?process.env.BUNNY_ACCESS_KEY.split(","):e,Bo.or(Bo.array()).optional().transform(e=>typeof e=="string"?[e]:e)),Fo=Gn.describe(qn({alias:"k",description:"Bunny API Access Key",valueDescription:"uuid"}));import{option as Wn}from"pastel";import $n from"yn";import{z as Oo}from"zod";var Vn=Oo.preprocess(e=>process.env.BUNNY_INTERACTIVE&&typeof e!="boolean"&&!e?$n(process.env.BUNNY_INTERACTIVE.trim()):e,Oo.coerce.boolean().optional().default(!1)),Mo=Vn.describe(Wn({description:"Ask questions to fill in missing config values",valueDescription:"boolean"}));var Uo=Zn.object({accessKey:Fo,basicAuthCredential:Ar,basicAuthPasswordlessStage:_r,basicAuthPattern:Tr,buildBeforeDeploy:Or,buildCommand:Mr,buildFramework:jr,buildOutDir:Yr,buildPackageManager:Kr,countryAllowed:Hr,countryBlocked:qr,customHeader:Gr,domainAlias:Vr,domainName:Qr,domainRegistrar:ro,domainType:no,edgeRule:so,imageOptimizer:ze,interactive:Mo,ipBlocked:mo,loggingStorageZone:co,mainStage:Je,notFoundPath:lo,notFoundSpa:Ke,optimize:go,profile:bo,redirect:ko,referrerAllowed:wo,referrerBlocked:vo,referrerBlockNoneReferrer:qe,schema:Nr,sharedCredentialsFile:$e,stage:Co,writeConfig:Ze});import{createAction as Fe,createReducer as Xn}from"@reduxjs/toolkit";import Yo from"deepmerge";import jo from"react";function Io(e){return e.at(0).toUpperCase()+e.slice(1)}function Qn(e,r){return Object.fromEntries(Object.entries(r).map(([o,t])=>[`dispatch${Io(o)}`,(...n)=>{e(t(...n))}]))}function zo(e,r,o){let[t,n]=jo.useReducer(e,r),i=jo.useMemo(()=>Qn(n,o),[n,o]);return[t,i]}var Jo=Fe("config/update"),Lo=Fe("config/done"),Ko=Fe("config/error"),ei={done:Lo,error:Ko,update:Jo},Ho={config:{},done:!1,error:null,question:"",runtime:{}},ri=Xn(Ho,e=>e.addCase(Jo,(r,o)=>{if(r.config=Yo(r.config,o.payload.config),r.runtime=Yo(r.runtime,o.payload.runtime),N(r.config))return r.question="",r;if(!r.runtime.accessKey)return r.question="runtime/accessKey",r;if(!r.config.profile)return r.question="config/profile",r;if(!r.config?.domain?.name)return r.question="config/domain/name",r;if(!r.runtime.domainIsChecked){if(!r.config?.domain?.type)return r.question="config/domain/type",r;if(!r.config?.domain?.registrar)return r.question="config/domain/registrar",r}return r.config.build?.framework==="other"&&!r.config.build.outDir?(r.question="config/build/outDir",r):(r.config.optimize||(r.question="config/performance"),r)}).addCase(Lo,r=>{r.done=!0}).addCase(Ko,(r,o)=>{r.error=o.payload}));function qo(){return zo(ri,Ho,ei)}var ti=Uo;function ni({options:e}){let[r,{dispatchUpdate:o}]=qo();return oi.useEffect(()=>{_o({options:e}).then(t=>{o(t),Xe({config:t.config}).then(n=>{console.log(n)})})},[e,o]),null}export{ni as default,ti as options};