UNPKG

bknd

Version:

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

31 lines (30 loc) 15.2 kB
var ye=Object.create;var h=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var ge=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty;var be=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),he=(t,e)=>{for(var r in e)h(t,r,{get:e[r],enumerable:!0})},ve=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of xe(e))!fe.call(t,o)&&o!==r&&h(t,o,{get:()=>e[o],enumerable:!(n=de(e,o))||n.enumerable});return t};var we=(t,e,r)=>(r=t!=null?ye(ge(t)):{},ve(e||!t||!t.__esModule?h(r,"default",{value:t,enumerable:!0}):r,t));var H=be((ze,v)=>{"use strict";var y=process||{},$=y.argv||[],m=y.env||{},Se=!(m.NO_COLOR||$.includes("--no-color"))&&(!!m.FORCE_COLOR||$.includes("--color")||y.platform==="win32"||(y.stdout||{}).isTTY&&m.TERM!=="dumb"||!!m.CI),Ee=(t,e,r=t)=>n=>{let o=""+n,i=o.indexOf(e,t.length);return~i?t+De(o,e,r,i)+e:t+o+e},De=(t,e,r,n)=>{let o="",i=0;do o+=t.substring(i,n)+r,i=n+e.length,n=t.indexOf(e,i);while(~n);return o+t.substring(i)},z=(t=Se)=>{let e=t?Ee:()=>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")}};v.exports=z();v.exports.createColors=z});import{Database as ue}from"bun:sqlite";import W from"dayjs";import Ce from"dayjs/plugin/weekOfYear.js";W.extend(Ce);function Y(t){return W(t).format("YYYY-MM-DD HH:mm:ss")}var l=we(H(),1);var J=(t,e)=>typeof t=="string"?[1,"1","true"].includes(t):!!(t||e);var Te={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 J(t,!0)}},modules_debug:{key:"BKND_MODULES_DEBUG",validate:J}},Z=(t,e,r)=>{try{let n=r?.source??process.env,o=Te[t],i=n[o.key],s=o.validate(i);if(typeof s<"u")return r?.onValid?.(s),s;r?.onFallback?.(i)}catch{r?.onFallback?.(void 0)}return e};function Re(){try{let t=process||{},e=t.argv||[],r=t.env||{};return!(r.NO_COLOR||e.includes("--no-color"))&&(!!r.FORCE_COLOR||e.includes("--color")||t.platform==="win32"||(t.stdout||{}).isTTY&&r.TERM!=="dumb"||!!r.CI)}catch{return!1}}var w={critical:{prefix:"CRT",color:l.default.red,args_color:l.default.red,original:console.error},error:{prefix:"ERR",color:l.default.red,args_color:l.default.red,original:console.error},warn:{prefix:"WRN",color:l.default.yellow,args_color:l.default.yellow,original:console.warn},info:{prefix:"INF",color:l.default.cyan,original:console.info},log:{prefix:"LOG",color:l.default.dim,args_color:l.default.dim,original:console.log},debug:{prefix:"DBG",color:l.default.yellow,args_color:l.default.dim,original:console.debug}};function Be(t,e){let r=Re(),n=w[t],o=n.color(`[${n.prefix}]`),i=e.map(s=>"args_color"in n&&r&&typeof s=="string"?n.args_color(s):s);return n.original(o,l.default.gray(Y()),...i)}var ee=Z("cli_log_level","log"),d=globalThis.__consoleConfig??={level:ee},X=Object.keys(w),C=new Proxy(d,{get:(t,e)=>{switch(e){case"original":return console;case"setLevel":return o=>{d.level=o};case"resetLevel":return()=>{d.level=ee}}let r=X.indexOf(d.level),n=X.indexOf(e);return e in w&&n<=r?(...o)=>Be(e,o):()=>null}});var a=class{_returning;static slug="untitled-event";params;returned=!1;validate(e){throw new S(this,e)}clone(e){let r=new this.constructor(e);return r.returned=!0,r}constructor(e){this.params=e}};var c=class extends Error{constructor(e,r){super(`Expected "${e}", got "${r}"`)}},S=class extends Error{constructor(r,n){super(`Event "${r.constructor.slug}" returned without validation`);this.data=n}};import{sql as ke}from"kysely";var u=class{plugins;constructor(e=[]){this.plugins=new Set(e)}async transformResultRows(e){let r=e;for(let n of this.plugins)r=(await n.transformResult({queryId:"1",result:{rows:r}})).rows;return r}};var te=["text","integer","real","blob","date","datetime","timestamp","boolean","json"],re=Symbol.for("bknd:connection"),x=class{constructor(e,r={},n=[]){this.fn=r;this.plugins=n;this.kysely=e,this[re]=!0,this.pluginRunner=new u(n)}initialized=!1;pluginRunner;supported={batching:!1,softscans:!0};kysely;client;async init(){this.initialized=!0}static isConnection(e){return e?e[re]===!0:!1}getIntrospector(){return this.kysely.introspection}supports(e){return this.supported[e]??!1}async ping(){return(await ke`SELECT 1`.execute(this.kysely)).rows.length>0}async transformResultRows(e){return await this.pluginRunner.transformResultRows(e)}async executeQueries(...e){return Promise.all(e.map(async r=>await this.kysely.executeQuery(r)))}async executeQuery(e){return(await this.executeQueries(e))[0]}getCompiled(...e){return e.map(r=>"compile"in r?r.compile():r)}async withTransformedRows(e,r){return await Promise.all(e.map(async n=>{let o=r??"rows",{[o]:i,...s}=n;return{...s,rows:await this.transformResultRows(i)}}))}validateFieldSpecType(e){if(!te.includes(e))throw new Error(`Invalid field type "${e}". Allowed types are: ${te.join(", ")}`);return!0}toDriver(e,r){return e}fromDriver(e,r){return e}async close(){}};function ne(t,e,r={}){return{create(...n){return new class extends t{createIntrospector(o){return new e(o,r)}}(...n)}}}var E=class extends a{static slug="mutator-insert-before";validate(e){let{entity:r}=this.params;if(!r.isValidData(e,"create"))throw C.warn("MutatorInsertBefore.validate: invalid",{entity:r.name,data:e}),new c("EntityData","invalid");return this.clone({entity:r,data:e})}},D=class extends a{static slug="mutator-insert-after"},T=class extends a{static slug="mutator-update-before";validate(e){let{entity:r,entityId:n}=this.params;if(!r.isValidData(e,"update"))throw C.warn("MutatorUpdateBefore.validate: invalid",{entity:r.name,entityId:n,data:e}),new c("EntityData","invalid");return this.clone({entityId:n,entity:r,data:e})}},R=class extends a{static slug="mutator-update-after"},B=class extends a{static slug="mutator-delete-before"},k=class extends a{static slug="mutator-delete-after"},oe={MutatorInsertBefore:E,MutatorInsertAfter:D,MutatorUpdateBefore:T,MutatorUpdateAfter:R,MutatorDeleteBefore:B,MutatorDeleteAfter:k},F=class extends a{static slug="repository-find-one-before"},_=class extends a{static slug="repository-find-one-after"},P=class extends a{static slug="repository-find-many-before";static another="one"},O=class extends a{static slug="repository-find-many-after"},ie={RepositoryFindOneBefore:F,RepositoryFindOneAfter:_,RepositoryFindManyBefore:P,RepositoryFindManyAfter:O};var M={};he(M,{FileAccessEvent:()=>Q,FileDeletedEvent:()=>I,FileUploadedEvent:()=>q});var q=class extends a{static slug="file-uploaded";validate(e){if(typeof e!="object")throw new c("object",typeof e);return this.clone({...e,...this.params})}},I=class extends a{static slug="file-deleted"},Q=class extends a{static slug="file-access"};import{SqliteQueryCompiler as Fe,SqliteAdapter as _e,SqliteIntrospector as Pe,CompiledQuery as L,RawNode as se,IdentifierNode as Oe}from"kysely";var j=class{constructor(t){this.createDriver=t}createDriver;createQueryCompiler(){return new Fe}createAdapter(){return new _e}createIntrospector(t){return new Pe(t)}},qe=class{promise;resolve;async lock(){for(;this.promise;)await this.promise;this.promise=new Promise(t=>{this.resolve=t})}unlock(){let t=this.resolve;this.promise=void 0,this.resolve=void 0,t?.()}};async function K(t,e,r,n,o){await r.executeQuery(o(se.createWithChildren([se.createWithSql(`${t} `),Oe.create(n)]),e()))}var A=class{mutex=new qe;conn;savepoint;releaseSavepoint;rollbackToSavepoint;init;constructor(t){this.init=()=>import("kysely").then(({createQueryId:e})=>{e&&(this.savepoint=K.bind(null,"savepoint",e),this.releaseSavepoint=K.bind(null,"release",e),this.rollbackToSavepoint=K.bind(null,"rollback to",e))}).then(t)}async acquireConnection(){return await this.mutex.lock(),this.conn}async beginTransaction(t){await t.executeQuery(L.raw("begin"))}async commitTransaction(t){await t.executeQuery(L.raw("commit"))}async rollbackTransaction(t){await t.executeQuery(L.raw("rollback"))}async releaseConnection(){this.mutex.unlock()}};function N(t){return async(e,r,n)=>{let o=await t.all(r,n);return e||o.length?{rows:o}:{rows:[],...await t.run("select 1")}}}function U(t){return t==null?void 0:BigInt(t)}import{SelectQueryNode as ae}from"kysely";var Ie=class extends A{db;constructor(t,e){super(async()=>{this.db=await t(),this.conn=new Qe(this.db),await e?.(this.conn)})}async destroy(){await this.db?.close()}},Qe=class{constructor(t){this.db=t}async*streamQuery({parameters:t,query:e,sql:r}){if(!this.db.iterator)throw new Error("streamQuery() is not supported.");let n=this.db.iterator(ae.is(e),r,t);for await(let o of n)yield{rows:[o]}}async executeQuery({parameters:t,query:e,sql:r}){return await this.db.query(ae.is(e),r,t)}},le=class extends j{constructor(t,e){super(()=>new Ie(t,e))}};import{ParseJSONResultsPlugin as je,Kysely as Ae}from"kysely";import{jsonArrayFrom as Ne,jsonBuildObject as Ue,jsonObjectFrom as Ge}from"kysely/helpers/sqlite";import{sql as pe}from"kysely";import{ParseJSONResultsPlugin as Me,DEFAULT_MIGRATION_TABLE as Le,DEFAULT_MIGRATION_LOCK_TABLE as Ke}from"kysely";var g=class{constructor(e,r={}){this.db=e;this._excludeTables=r.excludeTables??[],this._plugins=r.plugins??[new Me]}_excludeTables=[];_plugins;getExcludedTableNames(){return[...this._excludeTables,Le,Ke]}async executeWithPlugins(e){let r=await e.execute(this.db);return await new u(this._plugins??[]).transformResultRows(r.rows)}async getMetadata(e){return{tables:await this.getTables(e)}}async getIndices(e){return(await this.getSchemaSpec()).flatMap(n=>n.indices).filter(n=>!e||n.table===e)}async getTables(e={withInternalKyselyTables:!1}){return(await this.getSchemaSpec()).map(n=>({name:n.name,isView:n.isView,columns:n.columns}))}};var f=class extends g{async getSchemas(){return[]}async getSchemaSpec(){let e=this.getExcludedTableNames().map(o=>`'${o}'`).join(", "),r=pe` SELECT m.name, m.type, m.sql, (SELECT json_group_array( json_object( 'name', p.name, 'type', p.type, 'notnull', p."notnull", 'default', p.dflt_value, 'primary_key', p.pk )) FROM pragma_table_info(m.name) p) AS columns, (SELECT json_group_array( json_object( 'name', i.name, 'origin', i.origin, 'partial', i.partial, 'sql', im.sql, 'columns', (SELECT json_group_array( json_object( 'name', ii.name, 'seqno', ii.seqno )) FROM pragma_index_info(i.name) ii) )) FROM pragma_index_list(m.name) i LEFT JOIN sqlite_master im ON im.name = i.name AND im.type = 'index' ) AS indices FROM sqlite_master m WHERE m.type IN ('table', 'view') and m.name not like 'sqlite_%' and m.name not in (${pe.raw(e)}) `;return(await this.executeWithPlugins(r)).map(o=>({name:o.name,isView:o.type==="view",columns:o.columns?.map(i=>{let s=o.sql?.split(/[\(\),]/)?.find(p=>p.toLowerCase().includes("autoincrement"))?.trimStart()?.split(/\s+/)?.[0]?.replace(/["`]/g,"");return{name:i.name,dataType:i.type,isNullable:!i.notnull,isAutoIncrementing:i.name===s,hasDefaultValue:i.dflt_value!=null,comment:void 0}})??[],indices:o.indices?.map(i=>({name:i.name,table:o.name,isUnique:i.sql?.match(/unique/i)!=null,columns:i.columns.map(s=>({name:s.name,order:s.seqno}))}))??[]}))}};var b=class extends x{name="sqlite";constructor(e){let{excludeTables:r,dialect:n,dialectArgs:o=[],additionalPlugins:i}=e,s=[new je,...i??[]],p=new Ae({dialect:ne(n,f,{excludeTables:r,plugins:s}).create(...o),plugins:s});super(p,{jsonArrayFrom:Ne,jsonObjectFrom:Ge,jsonBuildObject:Ue,...e.customFn??{}},s)}getFieldSchema(e){this.validateFieldSpecType(e.type);let r=e.type;switch(e.type){case"json":r="text";break}return[e.name,r,n=>{if(e.primary)return e.type==="integer"?n.primaryKey().notNull().autoIncrement():n.primaryKey().notNull();if(e.references){let o=n.references(e.references);return e.onDelete&&(o=o.onDelete(e.onDelete)),e.onUpdate&&(o=o.onUpdate(e.onUpdate)),o}return n}]}toDriver(e,r){return r.type==="boolean"?e?1:0:typeof e>"u"?null:e}fromDriver(e,r){return r.type==="boolean"&&typeof e=="number"?e===1:e}};var G=class extends b{constructor(r,n,o){super({dialect:le,dialectArgs:[n,o?.onCreateConnection],additionalPlugins:o?.additionalPlugins,excludeTables:o?.excludeTables});this.db=r;this.executor=n;if(this.client=r,o?.name&&(this.name=o.name),o?.supports)for(let[i,s]of Object.entries(o.supports))s!==void 0&&(this.supported[i]=s)}name="generic-sqlite";#e;async getExecutor(){return this.#e||(this.#e=await this.executor()),this.#e}async executeQueries(...r){let n=await this.getExecutor();if(!n.batch)return super.executeQueries(...r);let i=this.getCompiled(...r).map(p=>({sql:p.sql,parameters:p.parameters})),s=await n.batch(i);return this.withTransformedRows(s)}};function V(t,e,r,n){return new G(e,()=>r(ce),{name:t,...n})}var ce={parseBigInt:U,buildQueryFn:N};try{let{emitWarning:t}=process;process.emitWarning=(e,...r)=>{if(!e.includes("SQLite is an experimental feature"))return t(e,...r)}}catch{}var Vt={...M},Yt={...oe,...ie};function me(t){let e;return t?"database"in t?e=t.database:e=new ue(t.url):e=new ue(":memory:"),V("bun-sqlite",e,r=>{let n=o=>e.prepare(o);return{db:e,query:r.buildQueryFn({all:(o,i)=>n(o).all(...i||[]),run:(o,i)=>{let{changes:s,lastInsertRowid:p}=n(o).run(...i||[]);return{insertId:r.parseBigInt(p),numAffectedRows:r.parseBigInt(s)}}}),close:()=>e.close()}})}function nr(t){return me(t)}export{nr as sqlite};