UNPKG

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.9 kB
var P=Object.create;var j=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&&j(t,o,{get:()=>e[o],enumerable:!(r=Q(e,o))||r.enumerable});return t};var ne=(t,e,n)=>(n=t!=null?P(X(t)):{},te(e||!t||!t.__esModule?j(n,"default",{value:t,enumerable:!0}):n,t));var q=ee(($e,O)=>{"use strict";var C=process||{},K=C.argv||[],v=C.env||{},ce=!(v.NO_COLOR||K.includes("--no-color"))&&(!!v.FORCE_COLOR||K.includes("--color")||C.platform==="win32"||(C.stdout||{}).isTTY&&v.TERM!=="dumb"||!!v.CI),le=(t,e,n=t)=>r=>{let o=""+r,i=o.indexOf(e,t.length);return~i?t+de(o,e,n,i)+e:t+o+e},de=(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)},F=(t=ce)=>{let e=t?le:()=>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")}};O.exports=F();O.exports.createColors=F});import{genericSqlite as oe}from"bknd";function b(t){let e=t.binding;return oe("d1-sqlite",e,n=>{let r=(i,s)=>e.prepare(i).bind(...s||[]),o=i=>{if(i.error)throw new Error(i.error);let s=i.meta.changes>0?n.parseBigInt(i.meta.changes):void 0;return{insertId:i.meta.last_row_id?n.parseBigInt(i.meta.last_row_id):void 0,numAffectedRows:s,rows:i.results,meta:i.meta}};return{db:e,batch:async i=>(await e.batch(i.map(({sql:a,parameters:c})=>r(a,c)))).map(o),query:n.buildQueryFn({all:async(i,s)=>{let a=r(i,s);return o(await a.all()).rows},run:async(i,s)=>{let a=r(i,s);return o(await a.run())}}),close:()=>{}}},{supports:{batching:!0,softscans:!1},excludeTables:["_cf_KV","_cf_METADATA"]})}import{Hono as De}from"hono";import{serveStatic as _e}from"hono/cloudflare-workers";import{createRuntimeApp as Ce}from"bknd/adapter";import{Connection as G}from"bknd";import{sqlite as me}from"bknd/adapter/sqlite";import{makeConfig as ge}from"bknd/adapter";import{registries as re,isDebug as ie,guessMimeType as D}from"bknd";function y(t,e){let n=[];for(let r in t)try{t[r]&&(t[r].constructor.name===e||String(t[r])===`[object ${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{s as _}from"bknd/utils";import{StorageAdapter as se}from"bknd";function L(t=[]){return _.object({binding:t.length>0?_.string({enum:t}):_.string().optional()},{title:"R2",description:"Cloudflare R2 storage"})}function R(t){let e=y(t,"R2Bucket");re.media.register("r2",class extends x{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 L(e.map(r=>r.key))}toJSON(){return{...super.toJSON(),config:this.config}}})}var x=class extends se{constructor(n){super();this.bucket=n}getName(){return"r2"}getSchema(){return L()}async putObject(n,r){try{return(await this.bucket.put(this.getKey(n),r))?.etag}catch{return}}async listObjects(n=""){return(await this.bucket.list({limit:50,prefix:this.getKey(n)})).objects.map(o=>({key:o.key.replace(this.getKey(""),""),size:o.size,last_modified:o.uploaded}))}async headObject(n){return await this.bucket.head(this.getKey(n))}async objectExists(n){return await this.headObject(n)!==null}async getObject(n,r){let o,i=this.getKey(n),s=new Headers({"Accept-Ranges":"bytes","Content-Type":D(i)}),a=r.has("range");if(a){let c=ie()?{}:{range:r,onlyIf:r};if(o=await this.bucket.get(i,c),!o)return new Response(null,{status:404});if(o.range){let d="offset"in o.range?o.range.offset:0,l="end"in o.range?o.range.end:o.size-1;s.set("Content-Range",`bytes ${d}-${l}/${o.size}`),s.set("Connection","keep-alive"),s.set("Vary","Accept-Encoding")}}else if(o=await this.bucket.get(i),o===null)return new Response(null,{status:404});return this.writeHttpMetadata(s,o),s.set("etag",o.httpEtag),s.set("Content-Length",String(o.size)),s.set("Last-Modified",o.uploaded.toUTCString()),new Response(o.body,{status:a?206:200,headers:s})}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(this.getKey(n))}getObjectUrl(n){throw new Error("Method getObjectUrl not implemented.")}getKey(n){return n}toJSON(n){return{type:this.getName(),config:{}}}};import{App as be}from"bknd";import N from"dayjs";import ae from"dayjs/plugin/weekOfYear.js";N.extend(ae);function I(t){return N(t).format("YYYY-MM-DD HH:mm:ss")}var u=ne(q(),1);var U=(t,e)=>typeof t=="string"?[1,"1","true"].includes(t):!!(t||e);var ue={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 U(t,!0)}},modules_debug:{key:"BKND_MODULES_DEBUG",validate:U}},$=(t,e,n)=>{try{let r=n?.source??process.env,o=ue[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};function pe(){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:u.default.red,args_color:u.default.red,original:console.error},error:{prefix:"ERR",color:u.default.red,args_color:u.default.red,original:console.error},warn:{prefix:"WRN",color:u.default.yellow,args_color:u.default.yellow,original:console.warn},info:{prefix:"INF",color:u.default.cyan,original:console.info},log:{prefix:"LOG",color:u.default.dim,args_color:u.default.dim,original:console.log},debug:{prefix:"DBG",color:u.default.yellow,args_color:u.default.dim,original:console.debug}};function fe(t,e){let n=pe(),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,u.default.gray(I()),...i)}var z=$("cli_log_level","log"),h=globalThis.__consoleConfig??={level:z},H=Object.keys(S),f=new Proxy(h,{get:(t,e)=>{switch(e){case"original":return console;case"setLevel":return o=>{h.level=o};case"resetLevel":return()=>{h.level=z}}let n=H.indexOf(h.level),r=H.indexOf(e);return e in S&&r<=n?(...o)=>fe(e,o):()=>null}});import{setCookie as ye}from"hono/cookie";var p={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 xe(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 ve(t){let e=p.d1_session.header,n=p.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=xe(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")&&ye(o,n,s,{httpOnly:!0,secure:!0,sameSite:"Lax",maxAge:60*5}))}}}var V=!1;function k(t,e){!V&&t.registerMedia!==!1&&(typeof t.registerMedia=="function"?t.registerMedia(e?.env):R(e?.env),V=!0);let n=ge(t,e?.env);if(G.isConnection(n.connection)){if(t.d1?.session)throw new Error("D1 session don't work when D1 is directly given as connection. Define it in bindings instead.")}else if(n.connection)n.connection=me(n.connection);else if(e?.env){let r=t.bindings?.(e?.env),o=ve(t),i=o.get(e.request),s,a;if(r?.db)f.debug("Using database from bindings"),a=r.db;else{let c=E(e.env,"D1Database");c&&(f.debug(`Using database from env "${c.key}"`),a=c.value)}if(a)if(t.d1?.session){if(s=a.withSession(i??t.d1?.first),!s)throw new Error("Couldn't create session");n.connection=b({binding:s}),n.options={...n.options,manager:{...n.options?.manager,onServerInit:c=>{c.use(async(d,l)=>{o.set(d,s),await l()})}}}}else n.connection=b({binding:a})}if(!G.isConnection(n.connection))throw new Error("Couldn't find database connection");return n}function g(t,e){t.emgr.onEvent(be.Events.AppBeforeResponse,async n=>{e.waitUntil(n.params.app.emgr.executeAsyncs())},{mode:"sync",id:p.exec_async_event_id})}async function Y(t,e,n){return await Ce(k(t,e),e?.env,n)}async function w(t,e,n={}){return await Y({...t,onBuilt:async r=>{g(r,e.ctx),await t.onBuilt?.(r)}},e,n)}import{App as he}from"bknd";import{createRuntimeApp as ke}from"bknd/adapter";async function T(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 c(l){r.waitUntil(o.put(i,JSON.stringify(l)))}let d=await ke({...k(t,e),initialConfig:a,onBuilt:async l=>{g(l,r),l.module.server.client.get(p.cache_endpoint,async m=>(await o.delete(i),m.json({message:"Cache cleared"}))),await t.onBuilt?.(l)},beforeBuild:async l=>{l.emgr.onEvent(he.Events.AppConfigUpdatedEvent,async({params:{app:m}})=>{c(m.toJSON(!0))},"sync"),await t.beforeBuild?.(l)}},e);return s||c(d.toJSON(!0)),d}import{DurableObject as we}from"cloudflare:workers";import{createRuntimeApp as Be,makeConfig as Ee}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(l=>l)&&f.warn("onBuilt and beforeBuild are not supported with DurableObject mode");let o=performance.now(),i=n.idFromName(r),s=n.get(i),a=Ee(t,e.env),c=await s.fire(e.request,{config:a,keepAliveSeconds:t.keepAliveSeconds}),d=new Headers(c.headers);return d.set("X-TTDO",String(performance.now()-o)),new Response(c.body,{status:c.status,statusText:c.statusText,headers:d})}var A=class extends we{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,this.app=await Be({...a,onBuilt:async c=>{g(c,this.ctx),c.modules.server.get(p.do_endpoint,async d=>{let l=d.req.raw.cf?d.req.raw.cf:d.env.cf;return d.json({id:this.id,keepAliveSeconds:n?.keepAliveSeconds??0,colo:l.colo})}),await this.onBuilt(c)},adminOptions:{html:n.html},beforeBuild:async c=>{await this.beforeBuild(c)}}),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 ht(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 c=o.pathname.slice(1),d=JSON.parse(t.manifest);if(c&&c in d){let l=new De;return l.all("*",async(m,J)=>{let B=await _e({path:`./${c}`,manifest:t.manifest})(m,J);return B instanceof Response?(B.headers.set("Cache-Control","public, max-age=31536000"),B):m.notFound()}),l.fetch(e,n)}}let i={request:e,env:n,ctx:r},s=t.mode??"warm",a;switch(s){case"fresh":a=await w(t,i,{force:!0});break;case"warm":a=await w(t,i);break;case"cache":a=await T(t,i);break;case"durable":return await M(t,i);default:throw new Error(`Unknown mode ${s}`)}return a.fetch(e,n,r)}}}import{registries as jt}from"bknd";function Bt(t){return b(t)}export{A as DurableBkndApp,x as StorageR2Adapter,p as constants,Bt as d1,b as d1Sqlite,E as getBinding,y as getBindings,T as getCached,M as getDurable,w as getFresh,Y as makeApp,R as registerMedia,jt as registries,ht as serve};