@cardog/corgi
Version:
Fast, offline VIN decoding for Node.js, browsers, and Cloudflare Workers. Powered by the NHTSA VPIC database.
1 lines • 3.3 kB
JavaScript
var p={level:"info",enabled:true,name:"app"},l={fatal:0,error:1,warn:2,info:3,debug:4,trace:5},u=class s{constructor(e={}){this.globalLevel="info";this.options={...p,...e},this.globalLevel=this.options.level||"info";}shouldLog(e){return this.options.enabled?l[e]<=l[this.globalLevel]:false}formatMessage(e,t="",r="",n){let i=new Date().toISOString(),o=t?`[${t}]`:"";if(n&&typeof n=="object")try{let g=JSON.stringify(n);return `${i} ${e.toUpperCase()} ${o} ${r} ${g}`}catch{return `${i} ${e.toUpperCase()} ${o} ${r} [Object cannot be stringified]`}return `${i} ${e.toUpperCase()} ${o} ${r} ${n!==void 0?n:""}`}trace(e,t=""){this.shouldLog("trace")&&console.debug(this.formatMessage("trace",this.options.name,t,e));}debug(e,t=""){this.shouldLog("debug")&&console.debug(this.formatMessage("debug",this.options.name,t,e));}info(e,t=""){this.shouldLog("info")&&console.log(this.formatMessage("info",this.options.name,t,e));}warn(e,t=""){this.shouldLog("warn")&&console.warn(this.formatMessage("warn",this.options.name,t,e));}error(e,t=""){this.shouldLog("error")&&console.error(this.formatMessage("error",this.options.name,t,e));}fatal(e,t=""){this.shouldLog("fatal")&&console.error(this.formatMessage("fatal",this.options.name,t,e));}child(e,t={}){let r=new s({...this.options,name:e}),n={trace:r.trace.bind(r),debug:r.debug.bind(r),info:r.info.bind(r),warn:r.warn.bind(r),error:r.error.bind(r)};return Object.keys(n).forEach(i=>{let o=i;r[o]=(g,d="")=>{n[o](typeof g=="object"&&g!==null?{...t,...g}:{...t,value:g},d);};}),r}setLevel(e){this.globalLevel=e;}},h=new u;function b(s,e={}){return h.child(s,e)}var a=b("BrowserDatabaseAdapter");function w(s){return s==null?"NULL":typeof s=="number"?s.toString():typeof s=="boolean"?s?"1":"0":`'${s.toString().replace(/'/g,"''")}'`}var c=class{constructor(e){this.queryCount=0;this.db=e,a.debug("Browser database adapter initialized");}async exec(e,t=[]){this.queryCount++;let r=this.queryCount;try{a.debug({queryId:r,query:e,paramCount:t.length},"Executing browser query");let n=Date.now(),i=t.reduce((d,L,m)=>d.replace("?",w(L)),e),o=this.db.exec(i),g=Date.now()-n;return !o||o.length===0?(a.debug({queryId:r,executionTime:g},"Query returned no results"),[{columns:[],values:[]}]):(a.debug({queryId:r,executionTime:g,resultCount:o.length,rowCount:o[0]?.values?.length||0},"Query completed"),o.map(d=>({columns:d.columns,values:d.values})))}catch(n){throw a.error({queryId:r,query:e,error:n},"Browser database query error"),n}}async close(){a.debug("Closing browser database connection"),this.db.close();}},f=class{async createAdapter(e){a.debug({pathOrUrl:e},"Creating browser database adapter");try{if(!window.SQL){a.debug("Loading SQL.js");let i=await window.initSqlJs({locateFile:o=>`/${o}`});window.SQL=i;}a.debug({pathOrUrl:e},"Fetching database");let t=await fetch(e);if(t&&"ok"in t&&!t.ok)throw new Error(`Failed to load database: ${t.statusText}`);let r;try{r=await t.arrayBuffer();}catch{a.debug("Using empty array buffer for tests"),r=new ArrayBuffer(8);}a.debug({size:r.byteLength/1024/1024},"Database loaded");let n=new window.SQL.Database(new Uint8Array(r));return new c(n)}catch(t){throw a.error({pathOrUrl:e,error:t},"Failed to create browser database adapter"),t}}};export{c as BrowserDatabaseAdapter,f as BrowserDatabaseAdapterFactory};