UNPKG

bknd

Version:

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

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