bknd
Version:
Lightweight Firebase/Supabase alternative built to run anywhere — incl. Next.js, React Router, Astro, Cloudflare, Bun, Node, AWS Lambda & more.
2 lines (1 loc) • 13.4 kB
JavaScript
var J=Object.create;var L=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var ee=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var te=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of W(e))!Z.call(t,o)&&o!==n&&L(t,o,{get:()=>e[o],enumerable:!(r=Q(e,o))||r.enumerable});return t};var ne=(t,e,n)=>(n=t!=null?J(X(t)):{},te(e||!t||!t.__esModule?L(n,"default",{value:t,enumerable:!0}):n,t));var P=ee((Je,T)=>{"use strict";var v=process||{},I=v.argv||[],x=v.env||{},ge=!(x.NO_COLOR||I.includes("--no-color"))&&(!!x.FORCE_COLOR||I.includes("--color")||v.platform==="win32"||(v.stdout||{}).isTTY&&x.TERM!=="dumb"||!!x.CI),be=(t,e,n=t)=>r=>{let o=""+r,i=o.indexOf(e,t.length);return~i?t+ye(o,e,n,i)+e:t+o+e},ye=(t,e,n,r)=>{let o="",i=0;do o+=t.substring(i,r)+n,i=r+e.length,r=t.indexOf(e,i);while(~r);return o+t.substring(i)},K=(t=ge)=>{let e=t?be:()=>String;return{isColorSupported:t,reset:e("\x1B[0m","\x1B[0m"),bold:e("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:e("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:e("\x1B[3m","\x1B[23m"),underline:e("\x1B[4m","\x1B[24m"),inverse:e("\x1B[7m","\x1B[27m"),hidden:e("\x1B[8m","\x1B[28m"),strikethrough:e("\x1B[9m","\x1B[29m"),black:e("\x1B[30m","\x1B[39m"),red:e("\x1B[31m","\x1B[39m"),green:e("\x1B[32m","\x1B[39m"),yellow:e("\x1B[33m","\x1B[39m"),blue:e("\x1B[34m","\x1B[39m"),magenta:e("\x1B[35m","\x1B[39m"),cyan:e("\x1B[36m","\x1B[39m"),white:e("\x1B[37m","\x1B[39m"),gray:e("\x1B[90m","\x1B[39m"),bgBlack:e("\x1B[40m","\x1B[49m"),bgRed:e("\x1B[41m","\x1B[49m"),bgGreen:e("\x1B[42m","\x1B[49m"),bgYellow:e("\x1B[43m","\x1B[49m"),bgBlue:e("\x1B[44m","\x1B[49m"),bgMagenta:e("\x1B[45m","\x1B[49m"),bgCyan:e("\x1B[46m","\x1B[49m"),bgWhite:e("\x1B[47m","\x1B[49m"),blackBright:e("\x1B[90m","\x1B[39m"),redBright:e("\x1B[91m","\x1B[39m"),greenBright:e("\x1B[92m","\x1B[39m"),yellowBright:e("\x1B[93m","\x1B[39m"),blueBright:e("\x1B[94m","\x1B[39m"),magentaBright:e("\x1B[95m","\x1B[39m"),cyanBright:e("\x1B[96m","\x1B[39m"),whiteBright:e("\x1B[97m","\x1B[39m"),bgBlackBright:e("\x1B[100m","\x1B[49m"),bgRedBright:e("\x1B[101m","\x1B[49m"),bgGreenBright:e("\x1B[102m","\x1B[49m"),bgYellowBright:e("\x1B[103m","\x1B[49m"),bgBlueBright:e("\x1B[104m","\x1B[49m"),bgMagentaBright:e("\x1B[105m","\x1B[49m"),bgCyanBright:e("\x1B[106m","\x1B[49m"),bgWhiteBright:e("\x1B[107m","\x1B[49m")}};T.exports=K();T.exports.createColors=K});import{KyselyPluginRunner as oe,SqliteConnection as re,SqliteIntrospector as ie}from"bknd/data";import{Kysely as se,ParseJSONResultsPlugin as ae}from"kysely";import{D1Dialect as le}from"kysely-d1";var B=class extends le{createIntrospector(e){return new ie(e,{excludeTables:["_cf_KV","_cf_METADATA"]})}},m=class extends re{constructor(n){let r=[new ae],o=new se({dialect:new B({database:n.binding}),plugins:r});super(o,{},r);this.config=n}supported={batching:!0};get client(){return this.config.binding}async batch(n){let r=this.config.binding,o=await r.batch(n.map(a=>{let{sql:l,parameters:c}=a.compile();return r.prepare(l).bind(...c)})),i=new oe(this.plugins),s=[];for(let a of o){let l=await i.transformResultRows(a.results);s.push(l)}return s}};import{Hono as Ae}from"hono";import{serveStatic as je}from"hono/cloudflare-workers";import{createRuntimeApp as De}from"bknd/adapter";import{registries as ce}from"bknd";import{isDebug as de}from"bknd/core";import{StringEnum as pe}from"bknd/utils";import{guessMimeType as D,StorageAdapter as ue}from"bknd/media";function y(t,e){let n=[];for(let r in t)try{t[r]&&t[r].constructor.name===e&&n.push({key:r,value:t[r]})}catch{}return n}function E(t,e){let n=y(t,e);if(n.length===0)throw new Error(`No ${e} found in bindings`);return n[0]}import*as me from"@sinclair/typebox";var{Type:_}=me;function N(t=[]){return _.Object({binding:t.length>0?pe(t):_.Optional(_.String())},{title:"R2",description:"Cloudflare R2 storage"})}function F(t){let e=y(t,"R2Bucket");ce.media.register("r2",class extends O{constructor(r){let o=e.find(i=>i.key===r.binding);if(!o)throw new Error(`No R2Bucket found with key ${r.binding}`);super(o?.value);this.config=r}getSchema(){return N(e.map(r=>r.key))}toJSON(){return{...super.toJSON(),config:this.config}}})}var O=class extends ue{constructor(n){super();this.bucket=n}getName(){return"r2"}getSchema(){return N()}async putObject(n,r){try{return(await this.bucket.put(n,r))?.etag}catch{return}}async listObjects(n){return(await this.bucket.list({limit:50})).objects.map(o=>({key:o.key,size:o.size,last_modified:o.uploaded}))}async headObject(n){return await this.bucket.head(n)}async objectExists(n){return await this.headObject(n)!==null}async getObject(n,r){let o,i=new Headers({"Accept-Ranges":"bytes","Content-Type":D(n)});if(r.has("range")){let s=de()?{}:{range:r,onlyIf:r};if(o=await this.bucket.get(n,s),!o)return new Response(null,{status:404});if(o.range){let a="offset"in o.range?o.range.offset:0,l="end"in o.range?o.range.end:o.size-1;i.set("Content-Range",`bytes ${a}-${l}/${o.size}`),i.set("Connection","keep-alive"),i.set("Vary","Accept-Encoding")}}else if(o=await this.bucket.get(n),o===null)return new Response(null,{status:404});return this.writeHttpMetadata(i,o),i.set("etag",o.httpEtag),i.set("Content-Length",String(o.size)),i.set("Last-Modified",o.uploaded.toUTCString()),new Response(o.body,{status:o.range?206:200,headers:i})}writeHttpMetadata(n,r){let o=r.httpMetadata;(!o||Object.keys(o).length===0)&&(o={contentType:D(r.key)});for(let[i,s]of Object.entries(o)){let a=i.replace(/([A-Z])/g,"-$1").toLowerCase();n.set(a,s)}}async getObjectMeta(n){let r=await this.headObject(n);if(!r)throw new Error("Object not found");return{type:String(r.httpMetadata?.contentType??D(n)),size:r.size}}async deleteObject(n){await this.bucket.delete(n)}getObjectUrl(n){throw new Error("Method getObjectUrl not implemented.")}toJSON(n){return{type:this.getName(),config:{}}}};import{App as he}from"bknd";import{makeConfig as ke}from"bknd/adapter";var H=(t,e)=>typeof t=="string"?[1,"1","true"].includes(t):!!(t||e);var fe={cli_log_level:{key:"BKND_CLI_LOG_LEVEL",validate:t=>{if(typeof t=="string"&&["log","info","warn","error","debug"].includes(t.toLowerCase()))return t.toLowerCase()}},cli_create_ref:{key:"BKND_CLI_CREATE_REF",validate:t=>typeof t=="string"?t:void 0},cli_telemetry:{key:"BKND_CLI_TELEMETRY",validate:t=>{if(!(typeof t>"u"))return H(t,!0)}},modules_debug:{key:"BKND_MODULES_DEBUG",validate:H}},R=(t,e,n)=>{try{let r=n?.source??process.env,o=fe[t],i=r[o.key],s=o.validate(i);if(typeof s<"u")return n?.onValid?.(s),s;n?.onFallback?.(i)}catch{n?.onFallback?.(void 0)}return e};var p=ne(P(),1);function xe(){try{let t=process||{},e=t.argv||[],n=t.env||{};return!(n.NO_COLOR||e.includes("--no-color"))&&(!!n.FORCE_COLOR||e.includes("--color")||t.platform==="win32"||(t.stdout||{}).isTTY&&n.TERM!=="dumb"||!!n.CI)}catch{return!1}}var S={critical:{prefix:"CRT",color:p.default.red,args_color:p.default.red,original:console.error},error:{prefix:"ERR",color:p.default.red,args_color:p.default.red,original:console.error},warn:{prefix:"WRN",color:p.default.yellow,args_color:p.default.yellow,original:console.warn},info:{prefix:"INF",color:p.default.cyan,original:console.info},log:{prefix:"LOG",color:p.default.dim,args_color:p.default.dim,original:console.log},debug:{prefix:"DBG",color:p.default.yellow,args_color:p.default.dim,original:console.debug}};function ve(t,e){let n=xe(),r=S[t],o=r.color(`[${r.prefix}]`),i=e.map(s=>"args_color"in r&&n&&typeof s=="string"?r.args_color(s):s);return r.original(o,p.default.gray(z()),...i)}var $=R("cli_log_level","log"),C=globalThis.__consoleConfig??={level:$},U=Object.keys(S),f=new Proxy(C,{get:(t,e)=>{switch(e){case"original":return console;case"setLevel":return o=>{C.level=o};case"resetLevel":return()=>{C.level=$}}let n=U.indexOf(C.level),r=U.indexOf(e);return e in S&&r<=n?(...o)=>ve(e,o):()=>null}});import V from"dayjs";import Ce from"dayjs/plugin/weekOfYear.js";V.extend(Ce);function z(t){return V(t).format("YYYY-MM-DD HH:mm:ss")}import{setCookie as we}from"hono/cookie";var u={exec_async_event_id:"cf_register_waituntil",cache_endpoint:"/__bknd/cache",do_endpoint:"/__bknd/do",d1_session:{cookie:"cf_d1_session",header:"x-cf-d1-session"}};function Be(t,e){if(!t)return null;for(let n of t.split("; ")){let[r,o]=n.split("=");if(r===e&&o)return decodeURIComponent(o)}return null}function Ee(t){let e=u.d1_session.header,n=u.d1_session.cookie,r=t.d1?.transport;return{get:o=>{if(!(!o||!t.d1?.session)){if(!r||r==="cookie"){let i=o.headers.get("Cookie");if(i){let s=Be(i,n);if(s)return s}}if((!r||r==="header")&&o.headers.has(e))return o.headers.get(e)}},set:(o,i)=>{if(!i||!t.d1?.session)return;let s=i.getBookmark();s&&((!r||r==="header")&&o.header(e,s),(!r||r==="cookie")&&we(o,n,s,{httpOnly:!0,secure:!0,sameSite:"Lax",maxAge:60*5}))}}}var q=!1;function h(t,e){q||(F(e?.env),q=!0);let n=ke(t,e?.env);if(e?.env){let r=t.bindings?.(e?.env),o=Ee(t),i=o.get(e.request),s;if(!n.connection){let a;if(r?.db)f.log("Using database from bindings"),a=r.db;else if(Object.keys(e).length>0){let l=E(e.env,"D1Database");l&&(f.log(`Using database from env "${l.key}"`),a=l.value)}if(a)t.d1?.session?(s=a.withSession(i??t.d1?.first),n.connection=new m({binding:s})):n.connection=new m({binding:a});else throw new Error("No database connection given")}t.d1?.session&&(n.options={...n.options,manager:{...n.options?.manager,onServerInit:a=>{a.use(async(l,c)=>{o.set(l,s),await c()})}}})}return n}function b(t,e){t.emgr.onEvent(he.Events.AppBeforeResponse,async n=>{e.waitUntil(n.params.app.emgr.executeAsyncs())},{mode:"sync",id:u.exec_async_event_id})}async function G(t,e,n){return await De(h(t,e),e?.env,n)}async function k(t,e,n={}){return await G({...t,onBuilt:async r=>{b(r,e.ctx),await t.onBuilt?.(r)}},e,n)}import{App as _e}from"bknd";import{createRuntimeApp as Oe}from"bknd/adapter";async function A(t,e){let{env:n,ctx:r}=e,{kv:o}=t.bindings?.(n);if(!o)throw new Error("kv namespace is not defined in cloudflare.bindings");let i=t.key??"app",s=await o.get(i),a=s?JSON.parse(s):void 0;async function l(d){r.waitUntil(o.put(i,JSON.stringify(d)))}let c=await Oe({...h(t,e),initialConfig:a,onBuilt:async d=>{b(d,r),d.module.server.client.get(u.cache_endpoint,async g=>(await o.delete(i),g.json({message:"Cache cleared"}))),await t.onBuilt?.(d)},beforeBuild:async d=>{d.emgr.onEvent(_e.Events.AppConfigUpdatedEvent,async({params:{app:g}})=>{l(g.toJSON(!0))},"sync"),await t.beforeBuild?.(d)}},e);return s||l(c.toJSON(!0)),c}import{DurableObject as Re}from"cloudflare:workers";import{createRuntimeApp as Te,makeConfig as Se}from"bknd/adapter";async function M(t,e){let{dobj:n}=t.bindings?.(e.env);if(!n)throw new Error("durable object is not defined in cloudflare.bindings");let r=t.key??"app";[t.onBuilt,t.beforeBuild].some(d=>d)&&f.warn("onBuilt and beforeBuild are not supported with DurableObject mode");let o=performance.now(),i=n.idFromName(r),s=n.get(i),a=Se(t,e.env),l=await s.fire(e.request,{config:a,keepAliveSeconds:t.keepAliveSeconds}),c=new Headers(l.headers);return c.set("X-TTDO",String(performance.now()-o)),new Response(l.body,{status:l.status,statusText:l.statusText,headers:c})}var j=class extends Re{id=Math.random().toString(36).slice(2);app;interval;async fire(e,n){let r=0;if(!this.app){let s=performance.now(),a=n.config;a?.connection&&"type"in a.connection&&a.connection.type==="libsql"&&(a.connection.config.protocol="wss"),this.app=await Te({...a,onBuilt:async l=>{b(l,this.ctx),l.modules.server.get(u.do_endpoint,async c=>{let d=c.req.raw.cf?c.req.raw.cf:c.env.cf;return c.json({id:this.id,keepAliveSeconds:n?.keepAliveSeconds??0,colo:d.colo})}),await this.onBuilt(l)},adminOptions:{html:n.html},beforeBuild:async l=>{await this.beforeBuild(l)}}),r=performance.now()-s}n?.keepAliveSeconds&&this.keepAlive(n.keepAliveSeconds);let o=await this.app.fetch(e),i=new Headers(o.headers);return i.set("X-BuildTime",r.toString()),i.set("X-DO-ID",this.id),new Response(o.body,{status:o.status,statusText:o.statusText,headers:i})}async onBuilt(e){}async beforeBuild(e){}keepAlive(e){this.interval&&clearInterval(this.interval);let n=0;this.interval=setInterval(()=>{n+=1,n===e?(console.log("cleared"),clearInterval(this.interval)):n%30===0&&(console.log("ping"),this.app?.modules.ctx().connection.ping())},1e3)}};function jt(t={}){return{async fetch(e,n,r){let o=new URL(e.url);if(t.manifest&&t.static==="assets")f.warn("manifest is not useful with static 'assets'");else if(!t.manifest&&t.static==="kv")throw new Error("manifest is required with static 'kv'");if(t.manifest&&t.static==="kv"){let l=o.pathname.slice(1),c=JSON.parse(t.manifest);if(l&&l in c){let d=new Ae;return d.all("*",async(g,Y)=>{let w=await je({path:`./${l}`,manifest:t.manifest})(g,Y);return w instanceof Response?(w.headers.set("Cache-Control","public, max-age=31536000"),w):g.notFound()}),d.fetch(e,n)}}let i={request:e,env:n,ctx:r},s=t.mode??"warm",a;switch(s){case"fresh":a=await k(t,i,{force:!0});break;case"warm":a=await k(t,i);break;case"cache":a=await A(t,i);break;case"durable":return await M(t,i);default:throw new Error(`Unknown mode ${s}`)}return a.fetch(e,n,r)}}}function Nt(t){return new m(t)}export{m as D1Connection,j as DurableBkndApp,u as constants,Nt as d1,E as getBinding,y as getBindings,A as getCached,M as getDurable,k as getFresh,G as makeApp,jt as serve};