UNPKG

bknd

Version:

Lightweight Firebase/Supabase alternative built to run anywhere — incl. Next.js, React Router, Astro, Cloudflare, Bun, Node, AWS Lambda & more.

1 lines 2.4 kB
import {s,jsc,mergeObject,pickHeaders2}from'bknd/utils';import {showRoutes}from'hono/dev';import {App,EntityTypescript}from'bknd';var g=s.partialObject({dpr:s.number({minimum:1,maximum:3}),fit:s.string({enum:["scale-down","contain","cover","crop","pad"]}),format:s.string({enum:["auto","avif","webp","jpeg","baseline-jpeg","json"],default:"auto"}),height:s.number(),width:s.number(),metadata:s.string({enum:["copyright","keep","none"]}),quality:s.number({minimum:1,maximum:100})});function x({accessUrl:e="/_plugin/image/optimize",resolvePath:t="/api/media/file",explain:o=false,defaultOptions:n={},fixedOptions:r={}}={}){if(["/api","/admin","/_optimize"].includes(e)||e.length<2)throw new Error(`Disallowed accessUrl: ${e}`);return m=>({name:"cf-image-optimization",onBuilt:()=>{o&&m.server.get(e,async s=>s.json({searchParams:g.toJSON()})),m.server.get(`${e}/:path{.+$}`,jsc("query",g),async s=>{let u=s.req.raw,y=new URL(u.url);if(!m.module.media?.storage)throw new Error("No media storage configured");let c=s.req.param("path");if(!c)throw new Error("No url provided");let h=`${y.origin}${t}/${c}`,a=mergeObject(structuredClone(n),s.req.valid("query"),structuredClone(r));if(a.format&&a.format==="auto"){let l=u.headers.get("Accept");/image\/avif/.test(l)?a.format="avif":/image\/webp/.test(l)&&(a.format="webp");}let w=new Request(h,{headers:u.headers}),p=await fetch(w,{cf:{image:a}}),f=pickHeaders2(p.headers,["Content-Type","Content-Length","Age","Date","Last-Modified"]);return f.set("Cache-Control","public, max-age=31536000, immutable"),new Response(p.body,{status:p.status,statusText:p.statusText,headers:f})});}})}function v({once:e=false}={}){let t=false;return o=>({name:"bknd-show-routes",onBuilt:()=>{e&&t||(t=true,showRoutes(o.server));}})}function P({enabled:e=true,includeSecrets:t=false,write:o}){let n=true;return r=>({name:"bknd-sync-config",onBuilt:async()=>{e&&(r.emgr.onEvent(App.Events.AppConfigUpdatedEvent,async()=>{await o?.(r.toJSON(t));},{id:"sync-config"}),n&&(n=false,await o?.(r.toJSON(true))));}})}function z({enabled:e=true,write:t}){let o=true;return n=>({name:"bknd-sync-types",onBuilt:async()=>{e&&(n.emgr.onEvent(App.Events.AppConfigUpdatedEvent,async()=>{await t?.(new EntityTypescript(n.em));},{id:"sync-types"}),o&&(o=false,await t?.(new EntityTypescript(n.em))));}})}export{x as cloudflareImageOptimization,v as showRoutes,P as syncConfig,z as syncTypes};