New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

litdb

Package Overview
Dependencies
Maintainers
0
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

litdb - npm Package Compare versions

Comparing version 0.0.11 to 0.0.12

8

dist/index.d.ts

@@ -452,3 +452,3 @@ // Generated by dts-bundle-generator v9.5.1

refs<T extends readonly Constructor[]>(...classes_0: T): ConstructorToTypeRef<T>;
fragment(sql: string | Fragment, params?: Record<string, any>): Fragment;
sql(sql: string | Fragment, params?: Record<string, any>): Fragment;
from<Table_1 extends Constructor<any>>(table: Table_1 | TypeRef<InstanceType<Table_1>>, alias?: string): SelectQuery<[

@@ -797,3 +797,3 @@ Table_1

refs<T extends readonly Constructor[]>(...classes_0: T): ConstructorToTypeRef<T>;
fragment(sql: string | Fragment, params?: Record<string, any>): Fragment;
sql(sql: string | Fragment, params?: Record<string, any>): Fragment;
from<Table_1 extends Constructor<any>>(table: Table_1 | TypeRef<InstanceType<Table_1>>, alias?: string | undefined): SelectQuery<[

@@ -827,3 +827,3 @@ Table_1

refs<T extends readonly Constructor[]>(...classes_0: T): ConstructorToTypeRef<T>;
fragment(sql: string | Fragment, params?: Record<string, any>): Fragment;
sql(sql: string | Fragment, params?: Record<string, any>): Fragment;
from<Table_1 extends Constructor<any>>(table: Table_1 | TypeRef<InstanceType<Table_1>>, alias?: string | undefined): SelectQuery<[

@@ -857,3 +857,3 @@ Table_1

refs<T extends readonly Constructor[]>(...classes_0: T): ConstructorToTypeRef<T>;
fragment(sql: string | Fragment, params?: Record<string, any>): Fragment;
sql(sql: string | Fragment, params?: Record<string, any>): Fragment;
from<Table_1 extends Constructor<any>>(table: Table_1 | TypeRef<InstanceType<Table_1>>, alias?: string | undefined): SelectQuery<[

@@ -860,0 +860,0 @@ Table_1

@@ -890,3 +890,3 @@ // src/utils.ts

};
$.fragment = function(sql, params = {}) {
$.sql = function(sql, params = {}) {
return IS.rec(sql) ? { sql: mergeParams(params, sql), params } : { sql, params };

@@ -918,3 +918,3 @@ };

$.idEquals = function hasId(id) {
return (x) => $.fragment($`${x.id} = $id`, { id });
return (x) => $.sql($`${x.id} = $id`, { id });
};

@@ -1702,3 +1702,3 @@ $.log = function(obj) {

throw new Error(`Invalid argument sqlLimit(${offset}, ${limit})`);
const frag = offset ? this.$.fragment(`LIMIT \$limit OFFSET \$offset`, { offset, limit: limit ?? -1 }) : this.$.fragment(`LIMIT \$limit`, { limit });
const frag = offset ? this.$.sql(`LIMIT \$limit OFFSET \$offset`, { offset, limit: limit ?? -1 }) : this.$.sql(`LIMIT \$limit`, { limit });
return frag;

@@ -1771,3 +1771,3 @@ }

throw new Error(`Invalid argument sqlLimit(${offset}, ${limit})`);
const frag = offset ? this.driver.$.fragment(`LIMIT \$limit OFFSET \$offset`, { offset, limit: limit ?? -1 }) : this.driver.$.fragment(`LIMIT \$limit`, { limit });
const frag = offset ? this.driver.$.sql(`LIMIT \$limit OFFSET \$offset`, { offset, limit: limit ?? -1 }) : this.driver.$.sql(`LIMIT \$limit`, { limit });
return frag;

@@ -1865,3 +1865,3 @@ }

throw new Error(`Invalid argument sqlLimit(${offset}, ${limit})`);
const frag = offset ? limit ? this.$.fragment(`LIMIT \$offset, \$limit`, { offset, limit }) : this.$.fragment(`LIMIT \$offset, 18446744073709551615`, { offset }) : this.$.fragment(`LIMIT \$limit`, { limit });
const frag = offset ? limit ? this.$.sql(`LIMIT \$offset, \$limit`, { offset, limit }) : this.$.sql(`LIMIT \$offset, 18446744073709551615`, { offset }) : this.$.sql(`LIMIT \$limit`, { limit });
return frag;

@@ -1950,3 +1950,3 @@ }

throw new Error(`Invalid argument sqlLimit(${offset}, ${limit})`);
const frag = offset ? limit ? this.$.fragment(`LIMIT \$limit OFFSET \$offset`, { offset, limit }) : this.$.fragment(`OFFSET \$offset`, { offset }) : this.$.fragment(`LIMIT \$limit`, { limit });
const frag = offset ? limit ? this.$.sql(`LIMIT \$limit OFFSET \$offset`, { offset, limit }) : this.$.sql(`OFFSET \$offset`, { offset }) : this.$.sql(`LIMIT \$limit`, { limit });
return frag;

@@ -1953,0 +1953,0 @@ }

class IS{static arr(e){return Array.isArray(e)}static rec(e){return"object"==typeof e}static obj(e){return"object"==typeof e}static fn(e){return"function"==typeof e}static str(e){return"string"==typeof e}static num(e){return"number"==typeof e}static sym(e){return"symbol"==typeof e}static tpl(e){return IS.arr(e)&&"raw"in e}static date(e){return e&&"[object Date]"===Object.prototype.toString.call(e)&&!isNaN(e)}}function toDate(e){return e?IS.date(e)?e:"/"==e[0]?new Date(parseFloat(/Date\(([^)]+)\)/.exec(e)[1])):new Date(e):null}function propsWithValues(t){return Object.keys(t).filter(e=>null!=t[e])}function uniqueKeys(e){let t=[];return e.forEach(e=>Object.keys(e).forEach(e=>{-1===t.indexOf(e)&&t.push(e)})),t}function pick(r,e){return Array.isArray(r)?r.map(r=>e.reduce((e,t)=>({...e,[t]:r[t]}),{})):e.reduce((e,t)=>({...e,[t]:r[t]}),{})}function omit(e,r){if(Array.isArray(e))return e.map(e=>{let t={...e};return r.forEach(e=>delete t[e]),t});let t={...e};return r.forEach(e=>delete t[e]),t}function leftPart(e,t){return null==e?null:-1==(t=e.indexOf(t))?e:e.substring(0,t)}function toStr(e){return"symbol"==typeof e?":"+(e.description??""):""+e}function nextParam(e){return"_"+nextParamVal(e)}function nextParamVal(e){e=Object.keys(e).map(e=>"_"===e[0]?parseInt(e.substring(1)):NaN).filter(e=>!isNaN(e));return 0==e.length?1:Math.max(...e)+1}function mergeParams(t,r){let s=r.sql;if(Object.keys(r.params).some(e=>e in t)){var n,i,a,o,l=nextParamVal(t),u={};let e=0;for([n,i]of Object.entries(r.params))u[n]="_"+(l+e++);for([a,o]of Object.entries(r.params).reverse()){var c=u[a];s=s.replaceAll("$"+a,"$"+c),t[c]=o}}else for(var[e,h]of Object.entries(r.params))t[e]=h;return s}function asType(e){var t;if(IS.obj(e)||IS.fn(e))return t=e.$ref?e:void 0,!e?.$ref&&e.tables?e.table:t?t.$ref.cls:e;throw new Error("invalid argument: "+typeof e)}function asRef(e){return IS.obj(e)&&e.$ref?e:void 0}function snakeCase(e){return(e||"").replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase()}function clsName(e,...t){return t&&t.length?`${e}<${Array.from(t).map(e=>IS.str(e)?e:"name"in e?e.name:"constructor"in e&&"name"in e.constructor?e.constructor.name:"").join(",")}>`:e}function isQuoted(e){return e&&('"'==e[0]||"`"==e[0])}var type=Symbol("type");class Meta{cls;static metadata={};constructor(e){if(!(this.cls=e))throw new Error("Class must be provided");if(!e.$type)throw new Error(`Class ${e.name??e} have a $type property`)}static assertClass(e){if(!e)throw new Error("Class must be provided");var t=e?.constructor?.$id?e?.constructor:e.$id?e:null;if(t)return t;throw(t=e?.name??e?.constructor?.name)?IS.fn(e)||IS.fn(e.constructor)?new Error(t+" is not a Table class, missing @table?"):new Error(t+" is not a Table class with metadata, missing @table?"):new Error("Class or constructor function required")}static assertTable(e){e=Meta.assertClass(e);if(!e.$type?.table)throw new Error(e.name+" does not have a @table annotation");if(e.$props&&e.$props.find(e=>e.column))return e;throw new Error(e.name+" does not have any columns, mssing @column?")}static assert(e){var e=Meta.assertClass(e),t=e.$id;return Meta.metadata[t]??(Meta.metadata[t]=new Meta(Meta.assertTable(e)))}get name(){return this.cls.$type?.name??this.cls.name}get tableName(){var e=this.cls,t=e.$type?.table?.alias??e.$type?.name??e.name;if(t)return t;throw new Error("Table name not found for "+e.name)}get type(){return this.cls.$type}get table(){var e=this.type.table;if(e)return e;throw new Error("Table definition not found for "+this.cls.name)}get props(){return this.cls.$props??[]}get columns(){return this.props.filter(e=>e.column).map(e=>e.column)}}function converterFor(e,...t){var r,s={};for(r of t)s[r]=e;return s}class DateTimeConverter{static instance=new DateTimeConverter;toDb(e){e=toDate(e);return e?e.toISOString():null}fromDb(e){return e?toDate(e):null}}var DriverRequired="Missing Driver Implementation, see: https://github.com/litdb/litdb",DriverRequiredProxy=new Proxy({},{get:(e,t)=>{throw new Error(DriverRequired)}});function assertSql(e){if(IS.rec(e)&&e.sql)return e;throw e=IS.sym(e)?e.description:IS.arr(e)?"Array":""+e,new Error("Expected sql`...` fragment, received: "+e)}class Schema{dialect;constructor(e){this.dialect=e}converters={...converterFor(DateTimeConverter.instance,"DATE","DATETIME","TIMESTAMP","TIMESTAMPZ")};sqlTableNames(e){throw new Error(DriverRequired)}sqlColumnDefinition(e){throw new Error(DriverRequired)}sqlForeignKeyDefinition(e,t){throw new Error(DriverRequired)}sqlIndexDefinition(e,t){throw new Error(DriverRequired)}dropTable(e){e=Meta.assert(e);return"DROP TABLE IF EXISTS "+this.dialect.quoteTable(e.tableName)}createTable(e){let t=Meta.assert(e);var e=t.columns,r=[e.map(e=>this.sqlColumnDefinition(e)),e.filter(e=>e.references).map(e=>this.sqlForeignKeyDefinition(t.table,e))].filter(e=>e.length).map(e=>e.join(",\n ")).join(",\n ");let s=`CREATE TABLE ${this.dialect.quoteTable(t.tableName)} (
${r}
);
`;r=e.filter(e=>e.index).map(e=>this.sqlIndexDefinition(t.table,e)+";");return 0<r.length&&(s+=r.join("\n")),s}insert(e,t){e=Meta.assert(e);let r=e.props.filter(e=>e.column);var s=(r=t?.onlyProps?r.filter(e=>t.onlyProps.includes(e.name)):r).map(e=>e.column).filter(e=>!e.autoIncrement),n=s.map(e=>""+this.dialect.quoteColumn(e.name)).join(", "),s=s.map(e=>"$"+e.name).join(", ");return`INSERT INTO ${this.dialect.quoteTable(e.tableName)} (${n}) VALUES (${s})`}update(e,t){var e=Meta.assert(e),r=t?.onlyProps?e.props.filter(e=>t.onlyProps.includes(e.name)||e.column?.primaryKey):e.props.filter(e=>e.column);if(!r.filter(e=>e.column?.primaryKey).length)throw new Error(e.name+" does not have a PRIMARY KEY");var r=r.map(e=>e.column),s=r.filter(e=>!e.primaryKey),r=r.filter(e=>e.primaryKey),s=s.map(e=>this.dialect.quoteColumn(e.name)+"=$"+e.name).join(", "),r=r.map(e=>this.dialect.quoteColumn(e.name)+" = $"+e.name).join(" AND ");let n=`UPDATE ${this.dialect.quoteTable(e.tableName)} SET `+s;if(r)return n+=" WHERE "+r;throw new Error("No WHERE clause exists for UPDATE "+e.tableName)}delete(e,t){var r,e=Meta.assert(e);let s=e.props.filter(e=>e.column).map(e=>e.column).filter(e=>e.primaryKey).map(e=>this.dialect.quoteColumn(e.name)+" = $"+e.name).join(" AND "),n=(t?.where&&(r=s?" AND ":" WHERE ",t=IS.arr(t.where)?t.where:[t.where],s+=r+t.join(" AND ")),"DELETE FROM "+this.dialect.quoteTable(e.tableName));if(s)return n+=" WHERE "+s;throw new Error("No WHERE clause exists for DELETE "+e.tableName)}toDbBindings(r){let s=[];return Meta.assert(r.constructor).props.filter(e=>e.column).forEach(e=>{var t=r[e.column.name],e=this.converters[e.column.type];e?(e=e.toDb(t),s.push(e)):s.push(t)}),s}toDbObject(e,t){var r,s,n,i={};for(r of Meta.assert(e.constructor).props.filter(e=>e.column))t?.onlyProps&&!t.onlyProps.includes(r.name)||(s=e[r.name],(n=this.converters[r.column.type])?(n=n.toDb(s),i[r.column.name]=n):i[r.column.name]=s);return i}}class DbConnection{connection;driver;$;schema;constructor(e){this.connection=e,this.$=e.$,this.driver=e.driver,this.schema=this.$.schema=e.driver.schema}get sync(){if(null==this.driver.sync)throw new Error(this.$.name+" does not support sync APIs");return this.driver.sync}quote(e){return this.$.quote(e)}insert(e,t){return Promise.resolve(this.sync.insert(e,t))}insertAll(e,t){return Promise.resolve(this.sync.insertAll(e,t))}listTables(){return Promise.resolve(this.sync.listTables())}dropTable(e){return Promise.resolve(this.sync.dropTable(e))}createTable(e){return Promise.resolve(this.sync.createTable(e))}all(e,...t){return Promise.resolve(this.sync.all(e,...t))}one(e,...t){return Promise.resolve(this.sync.one(e,...t))}column(e,...t){return Promise.resolve(this.sync.column(e,...t))}value(e,...t){return Promise.resolve(this.sync.value(e,...t))}arrays(e,...t){return Promise.resolve(this.sync.arrays(e,...t))}array(e,...t){return Promise.resolve(this.sync.array(e,...t))}exec(e,...t){return Promise.resolve(this.sync.exec(e,...t))}run(e,...t){return Promise.resolve(this.sync.run(e,...t))}prepare(e,...t){if(IS.tpl(e))return[this.connection.prepare(e,...t),t];if(IS.str(e)){if("build"in e)return t=e.build(),[this.connection.prepare(t.sql),t.params];if("sql"in e)return[this.connection.prepare(e.sql),e.params??{}]}throw new Error("Invalid argument: "+toStr(e))}}class SyncDbConnection{connection;driver;$;schema;constructor(e){this.connection=e,this.$=e.$,this.driver=e.driver,this.schema=this.$.schema=e.driver.schema}quote(e){return this.$.quote(e)}insert(e,t){var r,s;return e?(r=e.constructor,t?.onlyProps||t?.onlyWithValues?(t={onlyProps:t?.onlyProps??propsWithValues(e)},s=this.connection.prepareSync(this.schema.insert(r,t)),t=this.schema.toDbObject(e,t),s.execSync(t)):(s=this.connection.prepareSync(this.schema.insert(r)),t=this.schema.toDbObject(e),s.execSync(t))):{changes:0,lastInsertRowid:0}}insertAll(e,t){var r={changes:0,lastInsertRowid:0};if(0!=e.length){var s=e[0].constructor;if(t?.onlyProps||t?.onlyWithValues)for(var n of e){n=this.insert(n,t);r.changes+=n.changes,r.lastInsertRowid=n.lastInsertRowid}else{var i,a=this.connection.prepareSync(this.schema.insert(s));for(i of e){var o=this.schema.toDbObject(i),o=a.execSync(o);r.changes+=o.changes,r.lastInsertRowid=o.lastInsertRowid}}}return r}update(e,t){var r,s;return e?(r=e.constructor,t?.onlyProps||t?.onlyWithValues?(s=r.$props.filter(e=>e.column?.primaryKey).map(e=>e.column.name),t={onlyProps:Array.from(new Set([...t?.onlyProps??propsWithValues(e),...s]))},s=this.connection.prepareSync(this.schema.update(r,t)),t=this.schema.toDbObject(e,t),s.execSync(t)):(s=this.connection.prepareSync(this.schema.update(r)),t=this.schema.toDbObject(e),s.execSync(t))):{changes:0,lastInsertRowid:0}}delete(e,t){var r;return e?(r=e.constructor,t=this.connection.prepareSync(this.schema.delete(r,t)),r=Meta.assert(r).props.filter(e=>e.column?.primaryKey).map(e=>e.name),e=this.schema.toDbObject(e,{onlyProps:r}),t.execSync(e)):{changes:0,lastInsertRowid:0}}listTables(){return this.column({sql:this.schema.sqlTableNames(),params:{}})}dropTable(e){return this.connection.prepareSync(this.schema.dropTable(e)).execSync()}createTable(e){return this.connection.prepareSync(this.schema.createTable(e)).execSync()}prepareSync(e,...t){var r;if(IS.tpl(e))return[this.connection.prepareSync(e,...t),t,void 0];if(IS.obj(e)){if("build"in e)return t=e.build(),[this.connection.prepareSync(t.sql),t.params??{},t.into];if("sql"in e)return t=e.sql,r=e.params??{},[this.connection.prepareSync(t),r,e.into]}throw new Error("Invalid argument: "+toStr(e))}all(e,...t){var[e,t,r]=this.prepareSync(e,...t);return r?(r=e.as(r),Array.isArray(t)?r.allSync(...t):r.allSync(t)):Array.isArray(t)?e.allSync(...t):e.allSync(t)}one(e,...t){var[e,t,r]=this.prepareSync(e,...t);return r?(r=e.as(r),Array.isArray(t)?r.oneSync(...t):r.oneSync(t)):Array.isArray(t)?e.oneSync(...t):e.oneSync(t)}column(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.arraysSync(...t).map(e=>e[0]):e.arraysSync(t).map(e=>e[0])}value(e,...t){var[e,t,r]=this.prepareSync(e,...t),e=Array.isArray(t)?e.valueSync(...t):e.valueSync(t);return r&&r===Boolean?!!e:e}arrays(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.arraysSync(...t):e.arraysSync(t)}array(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.arraySync(...t):e.arraySync(t)}exec(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.execSync(...t):e.execSync(t)}run(e,...t){var[e,t]=this.prepareSync(e,...t);Array.isArray(t)?e.runSync(...t):e.runSync(t)}}class ConnectionBase{driver;$;async;sync;schema;dialect;constructor(e){this.driver=e,this.$=e.$,this.schema=this.$.schema=e.schema,this.dialect=e.dialect,this.async=new DbConnection(this),this.sync=new SyncDbConnection(this)}prepare(e){throw new Error(DriverRequired)}prepareSync(e){throw new Error(DriverRequired)}}class DefaultStrategy{tableName(e){return e}columnName(e){return e}tableFromDef(e){return e.alias??e.name}}class SnakeCaseStrategy{tableName(e){return snakeCase(e)}columnName(e){return snakeCase(e)}tableFromDef(e){return snakeCase(e.alias??e.name)}}class FilterConnection{db;fn;$;orig;constructor(e,t){this.db=e,this.fn=t,this.orig=e.connection,(e.connection=this).$=e.$}get driver(){return this.db.driver}prepareSync(e,...t){return this.fn(e,t),this.orig.prepareSync(e,...t)}release(){this.db.connection=this.orig}}function useFilter(e,t){return new FilterConnection(e,t)}function alignLeft(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r+e+r.repeat(t+1-e.length)}function alignCenter(e,t,r=" "){var s,n;return t<0?"":(n=(e=e||"").length,s=Math.floor(t/2-n/2),n=Math.abs(n%2-t%2),r.repeat(s+1)+e+r.repeat(s+1+n))}function alignRight(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r.repeat(t+1-e.length)+e+r}function alignAuto(e,t,r=" "){var s=""+e;return s.length<=t?(IS.num(e)?alignRight:alignLeft)(s,t,r):s}class Inspect{static dump(e){return IS.rec(e)&&"sql"in(e=IS.fn(e.build)?e.build():e)&&"params"in e?[e.sql,"PARAMS "+Inspect.dump(e.params).replaceAll('"',"")].join("\n")+"\n":JSON.stringify(e,null,4).replace(/\\"/g,"")}static printDump(e){console.log(Inspect.dump(e))}static dumpTable(e){let s=e,n=uniqueKeys(s),i={};n.forEach(t=>{let r=t.length;s.forEach(e=>{var e=e[t];null!=e&&(e=(""+e).length)>r&&(r=e)}),i[t]=r});e=Object.keys(i).length,e=Object.keys(i).map(e=>i[e]).reduce((e,t)=>e+t,0)+2*e+(e+1);let a=[],t=(a.push(`+${"-".repeat(e-2)}+`),"|");return n.forEach(e=>t+=alignCenter(e,i[e])+"|"),a.push(t),a.push(`|${"-".repeat(e-2)}|`),s.forEach(t=>{let r="|";n.forEach(e=>r+=alignAuto(t[e],i[e])+"|"),a.push(r)}),a.push(`+${"-".repeat(e-2)}+`),a.join("\n")}static printDumpTable(e){console.log(Inspect.dumpTable(e))}}function Watch(e){try{var t=e();if(t)for(var r in t){console.log(r+":");var s=t[r];IS.arr(s)?console.table(s):IS.rec(s)?console.log(Inspect.dump(s)):console.log(toStr(s).trim()),console.log()}}catch(e){console.error(""+e)}}class Sql{static ops={equals:"=","=":"=",notEquals:"<>","!=":"!=",like:"LIKE",startsWith:"LIKE",endsWith:"LIKE",contains:"LIKE",notLike:"NOT LIKE",in:"IN",notIn:"NOT IN",isNull:"IS NULL",notNull:"IS NOT NULL"};static opKeys=Object.keys(Sql.ops);static create(m){function s(t,...s){if(IS.tpl(t)){let r="";var n={};for(let e=0;e<t.length;e++)if(r+=t[e],!(e>=s.length)){var i,a=s[e];if(IS.sym(a))r+=a.description??"";else if(IS.arr(a)){let e="";for(var o of a){var l="_"+(Object.keys(n).length+1);e.length&&(e+=","),e+="$"+l,n[l]=o}r+=e}else if(IS.rec(a)&&a.$ref)r+=m.quoteTable(Meta.assert(a.$ref.cls).tableName);else if(IS.obj(a)&&IS.fn(a.build)){var u,c=a.build();let t=["limit","offset"];if(Object.keys(c.params).some(e=>t.includes(e))){let e=nextParamVal(n);for(var h of t)h in c.params&&(u="_"+e++,c.params[u]=c.params[h],delete c.params[h],c.sql=c.sql.replaceAll("$"+h,"$"+u))}r+=mergeParams(n,c).replaceAll("\n","\n ")}else IS.obj(a)&&IS.str(a.sql)?r+=mergeParams(n,a).replaceAll("\n","\n "):a&&(i="_"+(Object.keys(n).length+1),r+="$"+i,n[i]=a)}return{sql:r,params:n}}if(IS.str(t))return{sql:t,params:s[0]};throw new Error(`sql(${typeof t}) is invalid`)}return s.schema=new Schema(m),s.dialect=m,s.quote=m.quote.bind(m),s.quoteColumn=m.quoteColumn.bind(m),s.quoteTable=m.quoteTable.bind(m),s.ref=function(r,s){let n=Meta.assert(r);null==s&&(s=m.quoteTable(n.tableName));return new Proxy({prefix:s?s+".":"",meta:n},{get:(e,t)=>"$ref"==t?{cls:r,as:s}:Symbol(e.prefix+((e,t)=>{var r=e.props.find(e=>e.name==t)?.column;if(r)return m.quoteColumn(r.name);throw new Error(e.name+" does not have a column property "+t)})(n,IS.str(t)?t:t.description))})},s.refs=function(...e){return e.map(e=>s.ref(e))},s.fragment=function(e,t={}){return IS.rec(e)?{sql:mergeParams(t,e),params:t}:{sql:e,params:t}},s.from=function(e,t){var r=asType(e),e=asRef(e)??s.ref(e,t??"");return new SelectQuery(s,[r],[Meta.assert(r)],[e])},s.update=function(e){return new UpdateQuery(s,[e],[Meta.assert(e)],[s.ref(e,"")])},s.deleteFrom=function(e){return new DeleteQuery(s,[e],[Meta.assert(e)],[s.ref(e,"")])},s.join=function(...e){return new SqlJoinBuilder(s,...e)},s.groupBy=function(...e){return new SqlGroupByBuilder(s,...e)},s.having=function(...e){return new SqlHavingBuilder(s,...e)},s.orderBy=function(...e){return new SqlOrderByBuilder(s,...e)},s.idEquals=function(t){return e=>s.fragment(s`${e.id} = $id`,{id:t})},s.log=function(e){console.log(Inspect.dump(e))},s.dump=function(e){console.log(Inspect.dumpTable(e))},s}}class SqlJoinBuilder{$;get table(){return this.tables[0]}tables;refs;exprs=[];params={};alias="";buildOn;constructor(e,...t){this.$=e,this.tables=t,this.refs=this.tables.map(e=>this.$.ref(e))}join(e,...t){return this.add("JOIN",e,...t)}leftJoin(e,...t){return this.add("LEFT JOIN",e,...t)}rightJoin(e,...t){return this.add("RIGHT JOIN",e,...t)}fullJoin(e,...t){return this.add("FULL JOIN",e,...t)}crossJoin(e,...t){return this.add("CROSS JOIN",e,...t)}add(e,t,...r){return Array.isArray(t)?this.exprs.push({type:e,expr:e=>this.$(t,...r)}):"function"==typeof t&&this.exprs.push({type:e,expr:e=>t.call(this,...e)}),this}as(e){return this.alias=e,this}build(e){null!=this.alias&&(e[0].$ref.as=this.$.ref(e[0].$ref.cls,this.alias));var t,r={},s=[];for(t of this.exprs){var n=t.expr(e),i=s.length?""+alignRight(t.type,5):"";s.push(i+" "+mergeParams(r,n))}var a=s.join("");return{type:this.exprs[0].type,on:a,params:r}}}class SqlBuilderBase{$;tables;params={};exprs=[];delimiter=", ";constructor(e,...t){this.$=e,this.tables=t}add(t,...r){return Array.isArray(t)?this.exprs.push(e=>this.$(t,...r)):"function"==typeof t&&this.exprs.push(e=>t.call(this,...e)),this}build(e){var t,r={},s=[];for(t of this.exprs){var n=t(e);s.push(mergeParams(r,n))}return{sql:s.join(this.delimiter),params:r}}}class SqlGroupByBuilder extends SqlBuilderBase{}class SqlOrderByBuilder extends SqlBuilderBase{}class SqlHavingBuilder extends SqlBuilderBase{constructor(e,...t){super(e,...t),this.delimiter="\n AND "}}var V={join:e=>{if(!IS.rec(e)&&!IS.fn(e))throw new Error("invalid argument: "+typeof e)}},EX={arg:e=>{throw new Error("invalid argument: "+typeof e)}};function joinOptions(e,t,r,s){var n,i;if(IS.rec(r))return r?.sql?({sql:n,params:i}=r,{type:e,cls:t,ref:s,on:n,params:i}):{type:e,cls:t,ref:s,as:r?.as,on:r?.on,params:r?.params};if(IS.fn(r))return{sql:n,params:i}=r.build(),{type:e,cls:t,on:n,params:i};throw new Error("Invalid Join Option: "+typeof r)}class WhereQuery{$;tables;metas;refs;get[type](){return clsName("WhereQuery",...this.tables)}constructor(e,t,r,s){this.$=e,this.tables=t,this.metas=r,this.refs=s}log(e){return console.log(this.toString(e)),this}_where=[];_joins=[];params={};get ref(){return this.refs[0]}get meta(){return this.metas[0]}get hasWhere(){return 0<this._where.length}refOf(e){for(var t of this.refs)if(e==t.$ref.cls)return t;return null}refsOf(...e){return e.map(e=>{var t=this.refOf(e);if(null==t)throw new Error(`Could not find ref for '${e.name}'`);return t})}createInstance(e,t){var r=Meta.assert(e);return t=t??this.$.ref(e),new this.constructor(this.$,[...this.tables,e],[...this.metas,r],[...this.refs,t])}copyInto(e){return e.params=Object.assign({},this.params),e._where=Array.from(this._where),e._joins=Array.from(this._joins),e}clone(){var e=new this.constructor(this.$,[...this.tables],[...this.metas],[...this.refs]);return this.copyInto(e),e}addJoin(e){var t=e.cls,r=e?.ref??(e.as?this.$.ref(t,e.as):void 0),r=this.createInstance(t,r),s=(this.copyInto(r),r);s.refs[0].$ref.as||(s.refs[0]=s.$.ref(s.meta.cls,s.quoteTable(s.meta.tableName)));let n="";var i,a=s;return IS.str(e.on)?n=e.params?a.mergeParams({sql:e.on,params:e.params}):e.on:IS.fn(e.on)&&(i=s.refs.slice(-2).concat([s.ref]),s=assertSql(e.on.call(s,...i)),n=a.mergeParams(s)),a._joins.push({type:e.type,table:t,on:n,params:e.params}),r}joinBuilder(e,t="JOIN"){var r=e.tables[0],r=this.createInstance(r),s=(this.copyInto(r),e.tables.map(e=>this.refOf(e)??this.$.ref(e)));let{type:n,on:i,params:a}=e.build(s,t);return i&&a&&(i=this.mergeParams({sql:i,params:a})),r._joins.push({type:n,on:i,params:a}),r}join(e,t){V.join(e);return!e?.$ref&&e.tables?this.joinBuilder(e,"JOIN"):this.addJoin(joinOptions("JOIN",asType(e),t,asRef(e)))}leftJoin(e,t){return V.join(e),this.addJoin(joinOptions("LEFT JOIN",asType(e),t,asRef(e)))}rightJoin(e,t){return V.join(e),this.addJoin(joinOptions("RIGHT JOIN",asType(e),t,asRef(e)))}fullJoin(e,t){return V.join(e),this.addJoin(joinOptions("FULL JOIN",asType(e),t,asRef(e)))}crossJoin(e,t){return V.join(e),this.addJoin(joinOptions("CROSS JOIN",asType(e),t,asRef(e)))}where(e,...t){return this.and(e,...t)}and(e,...t){return e||0!=t.length?IS.tpl(e)?this.condition("AND",this.$(e,...t)):IS.fn(e)?(t=assertSql(e.call(this,...this.refs)),this.condition("AND",t)):this.condition("AND",e):(this._where.length=0,this)}or(e,...t){return e||0!=t.length?IS.arr(e)?this.condition("OR",this.$(e,...t)):IS.fn(e)?(t=assertSql(e.call(this,...this.refs)),this.condition("OR",t)):this.condition("OR",e):(this._where.length=0,this)}condition(e,t){if("sql"in t&&"params"in t)this._where.push({condition:e,sql:this.mergeParams(t)});else if(t.rawSql){var r;for(r of Array.isArray(t.rawSql)?t.rawSql:[t.rawSql])this._where.push({condition:e,sql:r});this.addParams(t.params)}for(var[s,n]of Object.entries(t))Sql.opKeys.includes(s)?this.addWhere(e,Sql.ops[s],n,s):"op"===s&&Array.isArray(n)&&2<=n.length&&([s,n]=n,this.addWhere(e,s,n));return this}quote(e){return this.$.quote(e)}quoteTable(e){return this.$.quoteTable(e)}quoteColumn(e){var t=this.ref.$ref.as;return(t?t+".":"")+this.$.quoteColumn(e)}as(e){return this.refs[0]=this.$.ref(this.refs[0].$ref.cls,e),this}addParams(e){if(e&&IS.rec(e))for(var[t,r]of Object.entries(e))this.params[t]=r}mergeParams(e){return mergeParams(this.params,e)}addWhere(s,e,n,i){if(!s)throw new Error("condition is required");if(!e)throw new Error("sqlOp is required");if(!n)throw new Error("values is required");if("isNull"===i||"notNull"===i){if(!IS.arr(n))throw new Error(i+" requires an array of property names, but was: "+toStr(n));var r=[];for(let t of n){var a=this.meta.props.find(e=>e.name===t);if(!a)throw new Error(`Property ${t} not found in `+this.meta.name);if(!a.column)throw new Error(`Property ${t} is not a column`);r.push(a.column.name)}var t=r.map(e=>this.$.quoteColumn(e)+" "+Sql.ops[i]).join(` ${s} `);this._where.push({condition:s,sql:t})}else{if(!IS.rec(n))throw new Error(`Unsupported ${s} value: `+n);for(let[t,r]of Object.entries(n)){var o=this.meta.props.find(e=>e.name===t);if(!o)throw new Error(`Property ${t} not found in `+this.meta.name);if(!o.column)throw new Error(`Property ${t} is not a column`);var l=this.$.quoteColumn(o.column.name)+" "+e;if(IS.arr(r)){let e="";for(var u in r){e&&(e+=",");var c=nextParam(this.params);e+="$"+c,this.params[c]=u}this._where.push({condition:s,sql:l+` (${e})`})}else{this._where.push({condition:s,sql:l+" $"+o.name});l="startsWith"===i?r+"%":"endsWith"===i?"%"+r:"contains"===i?`%${r}%`:r;this.params[o.name]=l}}}}buildWhere(){if(0===this._where.length)return"";let e="\n WHERE ";for(var[t,{condition:r,sql:s}]of this._where.entries())0<t&&(e+=`
`;r=e.filter(e=>e.index).map(e=>this.sqlIndexDefinition(t.table,e)+";");return 0<r.length&&(s+=r.join("\n")),s}insert(e,t){e=Meta.assert(e);let r=e.props.filter(e=>e.column);var s=(r=t?.onlyProps?r.filter(e=>t.onlyProps.includes(e.name)):r).map(e=>e.column).filter(e=>!e.autoIncrement),n=s.map(e=>""+this.dialect.quoteColumn(e.name)).join(", "),s=s.map(e=>"$"+e.name).join(", ");return`INSERT INTO ${this.dialect.quoteTable(e.tableName)} (${n}) VALUES (${s})`}update(e,t){var e=Meta.assert(e),r=t?.onlyProps?e.props.filter(e=>t.onlyProps.includes(e.name)||e.column?.primaryKey):e.props.filter(e=>e.column);if(!r.filter(e=>e.column?.primaryKey).length)throw new Error(e.name+" does not have a PRIMARY KEY");var r=r.map(e=>e.column),s=r.filter(e=>!e.primaryKey),r=r.filter(e=>e.primaryKey),s=s.map(e=>this.dialect.quoteColumn(e.name)+"=$"+e.name).join(", "),r=r.map(e=>this.dialect.quoteColumn(e.name)+" = $"+e.name).join(" AND ");let n=`UPDATE ${this.dialect.quoteTable(e.tableName)} SET `+s;if(r)return n+=" WHERE "+r;throw new Error("No WHERE clause exists for UPDATE "+e.tableName)}delete(e,t){var r,e=Meta.assert(e);let s=e.props.filter(e=>e.column).map(e=>e.column).filter(e=>e.primaryKey).map(e=>this.dialect.quoteColumn(e.name)+" = $"+e.name).join(" AND "),n=(t?.where&&(r=s?" AND ":" WHERE ",t=IS.arr(t.where)?t.where:[t.where],s+=r+t.join(" AND ")),"DELETE FROM "+this.dialect.quoteTable(e.tableName));if(s)return n+=" WHERE "+s;throw new Error("No WHERE clause exists for DELETE "+e.tableName)}toDbBindings(r){let s=[];return Meta.assert(r.constructor).props.filter(e=>e.column).forEach(e=>{var t=r[e.column.name],e=this.converters[e.column.type];e?(e=e.toDb(t),s.push(e)):s.push(t)}),s}toDbObject(e,t){var r,s,n,i={};for(r of Meta.assert(e.constructor).props.filter(e=>e.column))t?.onlyProps&&!t.onlyProps.includes(r.name)||(s=e[r.name],(n=this.converters[r.column.type])?(n=n.toDb(s),i[r.column.name]=n):i[r.column.name]=s);return i}}class DbConnection{connection;driver;$;schema;constructor(e){this.connection=e,this.$=e.$,this.driver=e.driver,this.schema=this.$.schema=e.driver.schema}get sync(){if(null==this.driver.sync)throw new Error(this.$.name+" does not support sync APIs");return this.driver.sync}quote(e){return this.$.quote(e)}insert(e,t){return Promise.resolve(this.sync.insert(e,t))}insertAll(e,t){return Promise.resolve(this.sync.insertAll(e,t))}listTables(){return Promise.resolve(this.sync.listTables())}dropTable(e){return Promise.resolve(this.sync.dropTable(e))}createTable(e){return Promise.resolve(this.sync.createTable(e))}all(e,...t){return Promise.resolve(this.sync.all(e,...t))}one(e,...t){return Promise.resolve(this.sync.one(e,...t))}column(e,...t){return Promise.resolve(this.sync.column(e,...t))}value(e,...t){return Promise.resolve(this.sync.value(e,...t))}arrays(e,...t){return Promise.resolve(this.sync.arrays(e,...t))}array(e,...t){return Promise.resolve(this.sync.array(e,...t))}exec(e,...t){return Promise.resolve(this.sync.exec(e,...t))}run(e,...t){return Promise.resolve(this.sync.run(e,...t))}prepare(e,...t){if(IS.tpl(e))return[this.connection.prepare(e,...t),t];if(IS.str(e)){if("build"in e)return t=e.build(),[this.connection.prepare(t.sql),t.params];if("sql"in e)return[this.connection.prepare(e.sql),e.params??{}]}throw new Error("Invalid argument: "+toStr(e))}}class SyncDbConnection{connection;driver;$;schema;constructor(e){this.connection=e,this.$=e.$,this.driver=e.driver,this.schema=this.$.schema=e.driver.schema}quote(e){return this.$.quote(e)}insert(e,t){var r,s;return e?(r=e.constructor,t?.onlyProps||t?.onlyWithValues?(t={onlyProps:t?.onlyProps??propsWithValues(e)},s=this.connection.prepareSync(this.schema.insert(r,t)),t=this.schema.toDbObject(e,t),s.execSync(t)):(s=this.connection.prepareSync(this.schema.insert(r)),t=this.schema.toDbObject(e),s.execSync(t))):{changes:0,lastInsertRowid:0}}insertAll(e,t){var r={changes:0,lastInsertRowid:0};if(0!=e.length){var s=e[0].constructor;if(t?.onlyProps||t?.onlyWithValues)for(var n of e){n=this.insert(n,t);r.changes+=n.changes,r.lastInsertRowid=n.lastInsertRowid}else{var i,a=this.connection.prepareSync(this.schema.insert(s));for(i of e){var o=this.schema.toDbObject(i),o=a.execSync(o);r.changes+=o.changes,r.lastInsertRowid=o.lastInsertRowid}}}return r}update(e,t){var r,s;return e?(r=e.constructor,t?.onlyProps||t?.onlyWithValues?(s=r.$props.filter(e=>e.column?.primaryKey).map(e=>e.column.name),t={onlyProps:Array.from(new Set([...t?.onlyProps??propsWithValues(e),...s]))},s=this.connection.prepareSync(this.schema.update(r,t)),t=this.schema.toDbObject(e,t),s.execSync(t)):(s=this.connection.prepareSync(this.schema.update(r)),t=this.schema.toDbObject(e),s.execSync(t))):{changes:0,lastInsertRowid:0}}delete(e,t){var r;return e?(r=e.constructor,t=this.connection.prepareSync(this.schema.delete(r,t)),r=Meta.assert(r).props.filter(e=>e.column?.primaryKey).map(e=>e.name),e=this.schema.toDbObject(e,{onlyProps:r}),t.execSync(e)):{changes:0,lastInsertRowid:0}}listTables(){return this.column({sql:this.schema.sqlTableNames(),params:{}})}dropTable(e){return this.connection.prepareSync(this.schema.dropTable(e)).execSync()}createTable(e){return this.connection.prepareSync(this.schema.createTable(e)).execSync()}prepareSync(e,...t){var r;if(IS.tpl(e))return[this.connection.prepareSync(e,...t),t,void 0];if(IS.obj(e)){if("build"in e)return t=e.build(),[this.connection.prepareSync(t.sql),t.params??{},t.into];if("sql"in e)return t=e.sql,r=e.params??{},[this.connection.prepareSync(t),r,e.into]}throw new Error("Invalid argument: "+toStr(e))}all(e,...t){var[e,t,r]=this.prepareSync(e,...t);return r?(r=e.as(r),Array.isArray(t)?r.allSync(...t):r.allSync(t)):Array.isArray(t)?e.allSync(...t):e.allSync(t)}one(e,...t){var[e,t,r]=this.prepareSync(e,...t);return r?(r=e.as(r),Array.isArray(t)?r.oneSync(...t):r.oneSync(t)):Array.isArray(t)?e.oneSync(...t):e.oneSync(t)}column(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.arraysSync(...t).map(e=>e[0]):e.arraysSync(t).map(e=>e[0])}value(e,...t){var[e,t,r]=this.prepareSync(e,...t),e=Array.isArray(t)?e.valueSync(...t):e.valueSync(t);return r&&r===Boolean?!!e:e}arrays(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.arraysSync(...t):e.arraysSync(t)}array(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.arraySync(...t):e.arraySync(t)}exec(e,...t){var[e,t]=this.prepareSync(e,...t);return Array.isArray(t)?e.execSync(...t):e.execSync(t)}run(e,...t){var[e,t]=this.prepareSync(e,...t);Array.isArray(t)?e.runSync(...t):e.runSync(t)}}class ConnectionBase{driver;$;async;sync;schema;dialect;constructor(e){this.driver=e,this.$=e.$,this.schema=this.$.schema=e.schema,this.dialect=e.dialect,this.async=new DbConnection(this),this.sync=new SyncDbConnection(this)}prepare(e){throw new Error(DriverRequired)}prepareSync(e){throw new Error(DriverRequired)}}class DefaultStrategy{tableName(e){return e}columnName(e){return e}tableFromDef(e){return e.alias??e.name}}class SnakeCaseStrategy{tableName(e){return snakeCase(e)}columnName(e){return snakeCase(e)}tableFromDef(e){return snakeCase(e.alias??e.name)}}class FilterConnection{db;fn;$;orig;constructor(e,t){this.db=e,this.fn=t,this.orig=e.connection,(e.connection=this).$=e.$}get driver(){return this.db.driver}prepareSync(e,...t){return this.fn(e,t),this.orig.prepareSync(e,...t)}release(){this.db.connection=this.orig}}function useFilter(e,t){return new FilterConnection(e,t)}function alignLeft(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r+e+r.repeat(t+1-e.length)}function alignCenter(e,t,r=" "){var s,n;return t<0?"":(n=(e=e||"").length,s=Math.floor(t/2-n/2),n=Math.abs(n%2-t%2),r.repeat(s+1)+e+r.repeat(s+1+n))}function alignRight(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r.repeat(t+1-e.length)+e+r}function alignAuto(e,t,r=" "){var s=""+e;return s.length<=t?(IS.num(e)?alignRight:alignLeft)(s,t,r):s}class Inspect{static dump(e){return IS.rec(e)&&"sql"in(e=IS.fn(e.build)?e.build():e)&&"params"in e?[e.sql,"PARAMS "+Inspect.dump(e.params).replaceAll('"',"")].join("\n")+"\n":JSON.stringify(e,null,4).replace(/\\"/g,"")}static printDump(e){console.log(Inspect.dump(e))}static dumpTable(e){let s=e,n=uniqueKeys(s),i={};n.forEach(t=>{let r=t.length;s.forEach(e=>{var e=e[t];null!=e&&(e=(""+e).length)>r&&(r=e)}),i[t]=r});e=Object.keys(i).length,e=Object.keys(i).map(e=>i[e]).reduce((e,t)=>e+t,0)+2*e+(e+1);let a=[],t=(a.push(`+${"-".repeat(e-2)}+`),"|");return n.forEach(e=>t+=alignCenter(e,i[e])+"|"),a.push(t),a.push(`|${"-".repeat(e-2)}|`),s.forEach(t=>{let r="|";n.forEach(e=>r+=alignAuto(t[e],i[e])+"|"),a.push(r)}),a.push(`+${"-".repeat(e-2)}+`),a.join("\n")}static printDumpTable(e){console.log(Inspect.dumpTable(e))}}function Watch(e){try{var t=e();if(t)for(var r in t){console.log(r+":");var s=t[r];IS.arr(s)?console.table(s):IS.rec(s)?console.log(Inspect.dump(s)):console.log(toStr(s).trim()),console.log()}}catch(e){console.error(""+e)}}class Sql{static ops={equals:"=","=":"=",notEquals:"<>","!=":"!=",like:"LIKE",startsWith:"LIKE",endsWith:"LIKE",contains:"LIKE",notLike:"NOT LIKE",in:"IN",notIn:"NOT IN",isNull:"IS NULL",notNull:"IS NOT NULL"};static opKeys=Object.keys(Sql.ops);static create(m){function s(t,...s){if(IS.tpl(t)){let r="";var n={};for(let e=0;e<t.length;e++)if(r+=t[e],!(e>=s.length)){var i,a=s[e];if(IS.sym(a))r+=a.description??"";else if(IS.arr(a)){let e="";for(var o of a){var l="_"+(Object.keys(n).length+1);e.length&&(e+=","),e+="$"+l,n[l]=o}r+=e}else if(IS.rec(a)&&a.$ref)r+=m.quoteTable(Meta.assert(a.$ref.cls).tableName);else if(IS.obj(a)&&IS.fn(a.build)){var u,c=a.build();let t=["limit","offset"];if(Object.keys(c.params).some(e=>t.includes(e))){let e=nextParamVal(n);for(var h of t)h in c.params&&(u="_"+e++,c.params[u]=c.params[h],delete c.params[h],c.sql=c.sql.replaceAll("$"+h,"$"+u))}r+=mergeParams(n,c).replaceAll("\n","\n ")}else IS.obj(a)&&IS.str(a.sql)?r+=mergeParams(n,a).replaceAll("\n","\n "):a&&(i="_"+(Object.keys(n).length+1),r+="$"+i,n[i]=a)}return{sql:r,params:n}}if(IS.str(t))return{sql:t,params:s[0]};throw new Error(`sql(${typeof t}) is invalid`)}return s.schema=new Schema(m),s.dialect=m,s.quote=m.quote.bind(m),s.quoteColumn=m.quoteColumn.bind(m),s.quoteTable=m.quoteTable.bind(m),s.ref=function(r,s){let n=Meta.assert(r);null==s&&(s=m.quoteTable(n.tableName));return new Proxy({prefix:s?s+".":"",meta:n},{get:(e,t)=>"$ref"==t?{cls:r,as:s}:Symbol(e.prefix+((e,t)=>{var r=e.props.find(e=>e.name==t)?.column;if(r)return m.quoteColumn(r.name);throw new Error(e.name+" does not have a column property "+t)})(n,IS.str(t)?t:t.description))})},s.refs=function(...e){return e.map(e=>s.ref(e))},s.sql=function(e,t={}){return IS.rec(e)?{sql:mergeParams(t,e),params:t}:{sql:e,params:t}},s.from=function(e,t){var r=asType(e),e=asRef(e)??s.ref(e,t??"");return new SelectQuery(s,[r],[Meta.assert(r)],[e])},s.update=function(e){return new UpdateQuery(s,[e],[Meta.assert(e)],[s.ref(e,"")])},s.deleteFrom=function(e){return new DeleteQuery(s,[e],[Meta.assert(e)],[s.ref(e,"")])},s.join=function(...e){return new SqlJoinBuilder(s,...e)},s.groupBy=function(...e){return new SqlGroupByBuilder(s,...e)},s.having=function(...e){return new SqlHavingBuilder(s,...e)},s.orderBy=function(...e){return new SqlOrderByBuilder(s,...e)},s.idEquals=function(t){return e=>s.sql(s`${e.id} = $id`,{id:t})},s.log=function(e){console.log(Inspect.dump(e))},s.dump=function(e){console.log(Inspect.dumpTable(e))},s}}class SqlJoinBuilder{$;get table(){return this.tables[0]}tables;refs;exprs=[];params={};alias="";buildOn;constructor(e,...t){this.$=e,this.tables=t,this.refs=this.tables.map(e=>this.$.ref(e))}join(e,...t){return this.add("JOIN",e,...t)}leftJoin(e,...t){return this.add("LEFT JOIN",e,...t)}rightJoin(e,...t){return this.add("RIGHT JOIN",e,...t)}fullJoin(e,...t){return this.add("FULL JOIN",e,...t)}crossJoin(e,...t){return this.add("CROSS JOIN",e,...t)}add(e,t,...r){return Array.isArray(t)?this.exprs.push({type:e,expr:e=>this.$(t,...r)}):"function"==typeof t&&this.exprs.push({type:e,expr:e=>t.call(this,...e)}),this}as(e){return this.alias=e,this}build(e){null!=this.alias&&(e[0].$ref.as=this.$.ref(e[0].$ref.cls,this.alias));var t,r={},s=[];for(t of this.exprs){var n=t.expr(e),i=s.length?""+alignRight(t.type,5):"";s.push(i+" "+mergeParams(r,n))}var a=s.join("");return{type:this.exprs[0].type,on:a,params:r}}}class SqlBuilderBase{$;tables;params={};exprs=[];delimiter=", ";constructor(e,...t){this.$=e,this.tables=t}add(t,...r){return Array.isArray(t)?this.exprs.push(e=>this.$(t,...r)):"function"==typeof t&&this.exprs.push(e=>t.call(this,...e)),this}build(e){var t,r={},s=[];for(t of this.exprs){var n=t(e);s.push(mergeParams(r,n))}return{sql:s.join(this.delimiter),params:r}}}class SqlGroupByBuilder extends SqlBuilderBase{}class SqlOrderByBuilder extends SqlBuilderBase{}class SqlHavingBuilder extends SqlBuilderBase{constructor(e,...t){super(e,...t),this.delimiter="\n AND "}}var V={join:e=>{if(!IS.rec(e)&&!IS.fn(e))throw new Error("invalid argument: "+typeof e)}},EX={arg:e=>{throw new Error("invalid argument: "+typeof e)}};function joinOptions(e,t,r,s){var n,i;if(IS.rec(r))return r?.sql?({sql:n,params:i}=r,{type:e,cls:t,ref:s,on:n,params:i}):{type:e,cls:t,ref:s,as:r?.as,on:r?.on,params:r?.params};if(IS.fn(r))return{sql:n,params:i}=r.build(),{type:e,cls:t,on:n,params:i};throw new Error("Invalid Join Option: "+typeof r)}class WhereQuery{$;tables;metas;refs;get[type](){return clsName("WhereQuery",...this.tables)}constructor(e,t,r,s){this.$=e,this.tables=t,this.metas=r,this.refs=s}log(e){return console.log(this.toString(e)),this}_where=[];_joins=[];params={};get ref(){return this.refs[0]}get meta(){return this.metas[0]}get hasWhere(){return 0<this._where.length}refOf(e){for(var t of this.refs)if(e==t.$ref.cls)return t;return null}refsOf(...e){return e.map(e=>{var t=this.refOf(e);if(null==t)throw new Error(`Could not find ref for '${e.name}'`);return t})}createInstance(e,t){var r=Meta.assert(e);return t=t??this.$.ref(e),new this.constructor(this.$,[...this.tables,e],[...this.metas,r],[...this.refs,t])}copyInto(e){return e.params=Object.assign({},this.params),e._where=Array.from(this._where),e._joins=Array.from(this._joins),e}clone(){var e=new this.constructor(this.$,[...this.tables],[...this.metas],[...this.refs]);return this.copyInto(e),e}addJoin(e){var t=e.cls,r=e?.ref??(e.as?this.$.ref(t,e.as):void 0),r=this.createInstance(t,r),s=(this.copyInto(r),r);s.refs[0].$ref.as||(s.refs[0]=s.$.ref(s.meta.cls,s.quoteTable(s.meta.tableName)));let n="";var i,a=s;return IS.str(e.on)?n=e.params?a.mergeParams({sql:e.on,params:e.params}):e.on:IS.fn(e.on)&&(i=s.refs.slice(-2).concat([s.ref]),s=assertSql(e.on.call(s,...i)),n=a.mergeParams(s)),a._joins.push({type:e.type,table:t,on:n,params:e.params}),r}joinBuilder(e,t="JOIN"){var r=e.tables[0],r=this.createInstance(r),s=(this.copyInto(r),e.tables.map(e=>this.refOf(e)??this.$.ref(e)));let{type:n,on:i,params:a}=e.build(s,t);return i&&a&&(i=this.mergeParams({sql:i,params:a})),r._joins.push({type:n,on:i,params:a}),r}join(e,t){V.join(e);return!e?.$ref&&e.tables?this.joinBuilder(e,"JOIN"):this.addJoin(joinOptions("JOIN",asType(e),t,asRef(e)))}leftJoin(e,t){return V.join(e),this.addJoin(joinOptions("LEFT JOIN",asType(e),t,asRef(e)))}rightJoin(e,t){return V.join(e),this.addJoin(joinOptions("RIGHT JOIN",asType(e),t,asRef(e)))}fullJoin(e,t){return V.join(e),this.addJoin(joinOptions("FULL JOIN",asType(e),t,asRef(e)))}crossJoin(e,t){return V.join(e),this.addJoin(joinOptions("CROSS JOIN",asType(e),t,asRef(e)))}where(e,...t){return this.and(e,...t)}and(e,...t){return e||0!=t.length?IS.tpl(e)?this.condition("AND",this.$(e,...t)):IS.fn(e)?(t=assertSql(e.call(this,...this.refs)),this.condition("AND",t)):this.condition("AND",e):(this._where.length=0,this)}or(e,...t){return e||0!=t.length?IS.arr(e)?this.condition("OR",this.$(e,...t)):IS.fn(e)?(t=assertSql(e.call(this,...this.refs)),this.condition("OR",t)):this.condition("OR",e):(this._where.length=0,this)}condition(e,t){if("sql"in t&&"params"in t)this._where.push({condition:e,sql:this.mergeParams(t)});else if(t.rawSql){var r;for(r of Array.isArray(t.rawSql)?t.rawSql:[t.rawSql])this._where.push({condition:e,sql:r});this.addParams(t.params)}for(var[s,n]of Object.entries(t))Sql.opKeys.includes(s)?this.addWhere(e,Sql.ops[s],n,s):"op"===s&&Array.isArray(n)&&2<=n.length&&([s,n]=n,this.addWhere(e,s,n));return this}quote(e){return this.$.quote(e)}quoteTable(e){return this.$.quoteTable(e)}quoteColumn(e){var t=this.ref.$ref.as;return(t?t+".":"")+this.$.quoteColumn(e)}as(e){return this.refs[0]=this.$.ref(this.refs[0].$ref.cls,e),this}addParams(e){if(e&&IS.rec(e))for(var[t,r]of Object.entries(e))this.params[t]=r}mergeParams(e){return mergeParams(this.params,e)}addWhere(s,e,n,i){if(!s)throw new Error("condition is required");if(!e)throw new Error("sqlOp is required");if(!n)throw new Error("values is required");if("isNull"===i||"notNull"===i){if(!IS.arr(n))throw new Error(i+" requires an array of property names, but was: "+toStr(n));var r=[];for(let t of n){var a=this.meta.props.find(e=>e.name===t);if(!a)throw new Error(`Property ${t} not found in `+this.meta.name);if(!a.column)throw new Error(`Property ${t} is not a column`);r.push(a.column.name)}var t=r.map(e=>this.$.quoteColumn(e)+" "+Sql.ops[i]).join(` ${s} `);this._where.push({condition:s,sql:t})}else{if(!IS.rec(n))throw new Error(`Unsupported ${s} value: `+n);for(let[t,r]of Object.entries(n)){var o=this.meta.props.find(e=>e.name===t);if(!o)throw new Error(`Property ${t} not found in `+this.meta.name);if(!o.column)throw new Error(`Property ${t} is not a column`);var l=this.$.quoteColumn(o.column.name)+" "+e;if(IS.arr(r)){let e="";for(var u in r){e&&(e+=",");var c=nextParam(this.params);e+="$"+c,this.params[c]=u}this._where.push({condition:s,sql:l+` (${e})`})}else{this._where.push({condition:s,sql:l+" $"+o.name});l="startsWith"===i?r+"%":"endsWith"===i?"%"+r:"contains"===i?`%${r}%`:r;this.params[o.name]=l}}}}buildWhere(){if(0===this._where.length)return"";let e="\n WHERE ";for(var[t,{condition:r,sql:s}]of this._where.entries())0<t&&(e+=`
`+alignRight(r,5)),e+=s;return e}buildJoins(){if(0==this._joins.length)return"";let t="";for(let e=0;e<this._joins.length;e++){var{type:r,on:s}=this._joins[e],n=this.refs[e+1],i=this.metas[e+1],i=this.$.quoteTable(i.tableName),n=n.$ref.as,n=n&&n!==i?" "+n:"",s=IS.str(s)?" ON "+s:"",a=leftPart(r??"JOIN"," ").length<=4?" ":" ";t+=`

@@ -11,2 +11,2 @@ ${a}${r??"JOIN"} `+i+n+s}return t}into(e){var{sql:t,params:r}=this.build();return{sql:t,params:r,into:e}}build(){return{sql:this.buildWhere(),params:this.params}}toString(e){var t=this.build();if("debug"!=e&&"verbose"!=e)return Inspect.dump(t);var r=t.into,r=r&&(r.name||r.$type&&r.$type.name||r.constructor.name)||"",t=[Inspect.dump(t).trim(),[this[type]??"",r&&"["!=r[0]?" => "+r:""].join(""),""].join("\n");if("verbose"!==e)return t;var s,n,i={refs:this.refs.map(e=>e.$ref).map(e=>[Meta.assert(e.cls).tableName,e.as!=this.quote(Meta.assert(e.cls).tableName)?e.as:""].filter(e=>!!e).join(" "))};for([s,n]of Object.entries(this))"_"==s[0]&&IS.arr(n)&&n.length&&(i[s.substring(1)]=n);return[t.trimEnd(),Inspect.dump(i).replaceAll('"',""),""].join("\n")}}class SelectQuery extends WhereQuery{get[type](){return clsName("SelectQuery",...this.tables)}_select=[];_groupBy=[];_having=[];_orderBy=[];_skip;_take;_limit;copyInto(e){return super.copyInto(e),e._select=Array.from(this._select),e._groupBy=Array.from(this._groupBy),e._having=Array.from(this._having),e._skip=this._skip,e._take=this._take,e}clone(){return super.clone()}groupBy(e,...t){if(e||0!=t.length)if(Array.isArray(e)){t=this.$(e,...t);this._groupBy.push(this.mergeParams(t))}else if(IS.fn(e)){t=assertSql(e.call(this,...this.refs));this._groupBy.push(this.mergeParams(t))}else{if(!IS.rec(e))throw EX.arg(e);t=IS.fn(e.build)?e.build(this.refs):assertSql(e);this._groupBy.push(this.mergeParams(t))}else this._groupBy.length=0;return this}having(e,...t){if(e||0!=t.length)if(Array.isArray(e)){t=this.$(e,...t);this._having.push(this.mergeParams(t))}else if(IS.fn(e)){t=assertSql(e.call(this,...this.refs));this._having.push(this.mergeParams(t))}else{if(!IS.rec(e))throw EX.arg(e);t=IS.fn(e.build)?e.build(this.refs):assertSql(e);this._having.push(this.mergeParams(t))}else this._having.length=0;return this}orderBy(e,...t){if(e||0!=t.length)if(IS.arr(e)){t=this.$(e,...t);this._orderBy.push(this.mergeParams(t))}else if(IS.fn(e)){t=assertSql(e.call(this,...this.refs));this._orderBy.push(this.mergeParams(t))}else{if(!IS.rec(e))throw EX.arg(e);t=IS.fn(e.build)?e.build(this.refs):assertSql(e);this._orderBy.push(this.mergeParams(t))}else this._orderBy.length=0;return this}select(e,...r){if(e||0!==r.length)if(IS.str(e))this._select.push(e),1<=r.length&&this.addParams(r[0]);else if(Array.isArray(e))this._select.push(this.mergeParams(this.$(e,...r)));else if(IS.fn(e)){r=assertSql(e.call(this,...this.refs));this._select.push(this.mergeParams(r))}else{if(!IS.rec(e))throw new Error(`Invalid select(${typeof e})`);r=e;if(r.sql&&(e=r.sql,this._select.push(e.sql),this.addParams(e.params)),r.props)for(let t of r.props){var s=this.meta.props.find(e=>e.name==t)?.column;s&&this._select.push(this.quoteColumn(s.name))}if(r.columns)for(var t of r.columns)this._select.push(this.quoteColumn(t))}else this._select.length=0;return this}get hasSelect(){return 0<this._select.length}skip(e){return this.limit(this._take,e)}take(e){return this.limit(e,this._skip)}limit(e,t){return this._take=null==e?void 0:e,this._skip=null==t?void 0:t,"limit"in this.params&&delete this.params.limit,"offset"in this.params&&delete this.params.offset,null==e&&null==t?this._limit=void 0:(e=this.$.dialect.sqlLimit(this._skip,this._take),this._limit=this.mergeParams(e)),this}exists(){var e=this.clone();return e._select=["TRUE"],e._limit="LIMIT 1",e.into(Boolean)}rowCount(){var{sql:e,params:t}=this.build();return{sql:`SELECT COUNT(*) FROM (${e}) AS COUNT`,params:t,into:Number}}buildSelect(){return"SELECT "+(0<this._select.length?this._select:this.meta.columns.map(e=>this.quoteColumn(e.name))).join(", ")}buildFrom(){var e=this.quoteTable(this.meta.tableName);let t=`

ORDER BY `+this._orderBy.join(", ")}buildLimit(){return this._limit?`
`+this._limit:""}build(){return{sql:this.buildSelect()+this.buildFrom()+this.buildJoins()+this.buildWhere()+this.buildGroupBy()+this.buildHaving()+this.buildOrderBy()+this.buildLimit(),params:this.params,into:0==this._select.length?this.tables[0]:void 0}}}class UpdateQuery extends WhereQuery{get name(){return clsName("UpdateQuery",...this.tables)}_set=[];set(r,...e){if(r||(this._set.length=0),IS.tpl(r)){e=this.$(r,...e);this._set.push(this.mergeParams(e))}else if(IS.fn(r)){e=assertSql(r.call(this,...this.refs));this._set.push(this.mergeParams(e))}else{if(!IS.rec(r))throw EX.arg(r);if("sql"in r)this._set.push(this.mergeParams(r));else for(let[t,e]of Object.entries(r)){var s=this.meta.props.find(e=>e.name===t);if(!s)throw new Error(`Property ${t} not found in `+this.meta.name);if(!s.column)throw new Error(`Property ${t} is not a column`);this.params[s.name]=e,this._set.push(this.$.quote(s.column.name)+" = $"+s.name)}}return this}get hasSet(){return 0<this._set.length}buildUpdate(){var e=this._set.join(", ");return`UPDATE ${this.quoteTable(this.meta.tableName)} SET `+e+this.buildWhere()}build(){return{sql:this.buildUpdate(),params:this.params}}}class DeleteQuery extends WhereQuery{get[type](){return clsName("DeleteQuery",...this.tables)}buildDelete(){return"DELETE FROM "+this.quoteTable(this.meta.tableName)+this.buildWhere()}build(){return{sql:this.buildDelete(),params:this.params}}}function table(r){return function(e){var t=Object.assign({},r,{name:r?.alias??e.name});e.$id||(e.$id=Symbol(e.name)),e.$type??={name:e.name},e.$type.table=t}}function column(n,i){return function(e,t){var r=Object.assign({},i,{type:n,name:i?.alias??t}),e=("id"!==t&&!i?.autoIncrement||(r.primaryKey=!0),e.constructor.$id||(e.constructor.$id=Symbol(e.constructor.name)),e.constructor.$props??(e.constructor.$props=[]));let s=e.find(e=>e.name===t);s||(s={name:t},e.push(s)),s.column=r,IS.sym(s.column.type)&&(s.column.type=s.column.type.description)}}function Table(e,s){if(!s)throw new Error("Table definition is required");var t=e;t.$id||(t.$id=Symbol(e.name)),t.$type??={name:e.name},t.$type.table=s.table??{},t.$type.table.name??=e.name;let n=t.$props??(t.$props=[]);return Object.keys(s.columns??{}).forEach(t=>{var e=s.columns[t];if(!e)throw new Error(`Column definition for ${t} is missing`);if(!e.type)throw new Error(`Column type for ${t} is missing`);"id"!==t&&!e?.autoIncrement||(e.primaryKey=!0);let r=n.find(e=>e.name===t);r||(r={name:t},n.push(r)),r.column=e,r.column.name??=e.alias??t,IS.sym(r.column.type)&&(r.column.type=r.column.type.description)}),e}var DefaultValues={NOW:"{NOW}",MAX_TEXT:"{MAX_TEXT}",MAX_TEXT_UNICODE:"{MAX_TEXT_UNICODE}",TRUE:"{TRUE}",FALSE:"{FALSE}"};class SqliteDialect{$;strategy=new DefaultStrategy;constructor(){this.$=Sql.create(this)}quote(e){return isQuoted(e)?e:`"${e}"`}quoteTable(e){return isQuoted(e)?e:this.quote(this.strategy.tableName(e))}quoteColumn(e){return isQuoted(e)?e:this.quote(this.strategy.columnName(e))}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?this.$.fragment("LIMIT $limit OFFSET $offset",{offset:e,limit:t??-1}):this.$.fragment("LIMIT $limit",{limit:t})}}class SqliteSchema extends Schema{driver;constructor(e){super(e.dialect),this.driver=e}sqlTableNames(){return"SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%'"}sqlIndexDefinition(e,t){return`CREATE ${t.unique?"UNIQUE INDEX":"INDEX"} ${(`idx_${e.name}_`+t.name).toLowerCase()} ON ${this.dialect.quoteTable(e.name)} (${this.dialect.quoteColumn(t.name)})`}sqlForeignKeyDefinition(e,t){var r=t.references;if(!r)return"";let s=this.driver.$;var n=Array.isArray(r.table)?Meta.assert(r.table[0]):Meta.assert(r.table),i=Array.isArray(r.table)?Array.isArray(r.table[1])?r.table[1].map(e=>s.quoteColumn(e)).join(","):s.quoteColumn(r.table[1]):n.columns.filter(e=>e.primaryKey).map(e=>s.quoteColumn(e.name)).join(",");let a=`FOREIGN KEY (${s.quoteColumn(t.name)}) REFERENCES `+s.quoteTable(n.tableName)+(i?"("+i+")":"");return r.on&&(a+=` ON ${r.on[0]} `+r.on[1]),a}sqlColumnDefinition(e){var t=e.type;let r=this.driver.types.native.includes(t)?t:void 0;if(!r)for(var[s,n]of Object.entries(this.driver.types.map))if(n.includes(t)){r=s;break}r=r||t;let i=this.dialect.quoteColumn(e.name)+" "+r;return e.primaryKey&&(i+=" PRIMARY KEY"),e.autoIncrement&&(i+=" AUTOINCREMENT"),e.required&&(i+=" NOT NULL"),e.unique&&!e.index&&(i+=" UNIQUE"),e.defaultValue&&(e=this.driver.variables[e.defaultValue]??e.defaultValue,i+=" DEFAULT "+e),i}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?this.driver.$.fragment("LIMIT $limit OFFSET $offset",{offset:e,limit:t??-1}):this.driver.$.fragment("LIMIT $limit",{limit:t})}}class SqliteTypes{native=["INTEGER","SMALLINT","BIGINT","REAL","DOUBLE","FLOAT","NUMERIC","DECIMAL","BOOLEAN","DATE","DATETIME"];map={INTEGER:["INTERVAL","MONEY"],BLOB:["BLOB","BYTES","BIT"],TEXT:["UUID","JSON","JSONB","XML","TIME","TIMEZ","TIMESTAMP","TIMESTAMPZ"]}}class Sqlite{static connection;static driver;static schema;static init(){var e=Sqlite.connection=new SqliteConnection(new Sqlite),{driver:t,schema:r}=e;return Object.assign(Sqlite,{driver:t,schema:r}),e}name;dialect;schema;strategy=new DefaultStrategy;$;variables={[DefaultValues.NOW]:"CURRENT_TIMESTAMP",[DefaultValues.MAX_TEXT]:"TEXT",[DefaultValues.MAX_TEXT_UNICODE]:"TEXT",[DefaultValues.TRUE]:"1",[DefaultValues.FALSE]:"0"};types;converters={...converterFor(DateTimeConverter.instance,"DATE","DATETIME","TIMESTAMP","TIMESTAMPZ")};constructor(){this.name=this.constructor.name,this.dialect=new SqliteDialect,this.$=this.dialect.$,this.types=new SqliteTypes,this.schema=this.$.schema=new SqliteSchema(this)}}class SqliteConnection extends ConnectionBase{}class MySqlDialect{$;strategy=new DefaultStrategy;constructor(){this.$=Sql.create(this)}quote(e){return isQuoted(e)?e:"`"+e+"`"}quoteTable(e){return isQuoted(e)?e:this.quote(this.strategy.tableName(e))}quoteColumn(e){return isQuoted(e)?e:this.quote(this.strategy.columnName(e))}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?t?this.$.fragment("LIMIT $offset, $limit",{offset:e,limit:t}):this.$.fragment("LIMIT $offset, 18446744073709551615",{offset:e}):this.$.fragment("LIMIT $limit",{limit:t})}}class MySqlSchema extends SqliteSchema{}class MySqlTypes{native=["INTEGER","SMALLINT","BIGINT","DOUBLE","FLOAT","DECIMAL","NUMERIC","DECIMAL","BOOLEAN","DATE","DATETIME","TIME","TIMESTAMP","UUID","JSON","XML","BLOB"];map={DOUBLE:["REAL"],TIME:["TIMEZ"],TIMESTAMP:["TIMESTAMPZ"],INTEGER:["INTERVAL"],JSON:["JSONB"],TEXT:["XML"],BINARY:["BYTES"],"BINARY(1)":["BIT"],"DECIMAL(15,2)":["MONEY"]}}class MySql extends Sqlite{static connection;static driver;static schema;static init(){var e=MySql.connection=new MySqlConnection(new MySql),{driver:t,schema:r}=e;return Object.assign(MySql,{driver:t,schema:r}),e}constructor(){super(),this.dialect=new MySqlDialect,this.$=this.dialect.$,this.types=new MySqlTypes,this.schema=this.$.schema=new MySqlSchema(this)}}class MySqlConnection extends ConnectionBase{}class PostgreSqlDialect{$;strategy=new DefaultStrategy;constructor(){this.$=Sql.create(this)}quote(e){return isQuoted(e)?e:`"${e}"`}quoteTable(e){return isQuoted(e)?e:this.quote(this.strategy.tableName(e))}quoteColumn(e){return isQuoted(e)?e:this.quote(this.strategy.columnName(e))}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?t?this.$.fragment("LIMIT $limit OFFSET $offset",{offset:e,limit:t}):this.$.fragment("OFFSET $offset",{offset:e}):this.$.fragment("LIMIT $limit",{limit:t})}}class PostgreSqlSchema extends SqliteSchema{}class PostgreSqlTypes{native=["INTEGER","SMALLINT","BIGINT","REAL","DOUBLE","FLOAT","DECIMAL","NUMERIC","DECIMAL","MONEY","BOOLEAN","DATE","DATETIME","TIME","TIMEZ","TIMESTAMP","TIMESTAMPZ","INTERVAL","UUID","JSON","JSONB","XML","BLOB","BYTES","BIT"];map={}}class PostgreSql extends Sqlite{static connection;static driver;static schema;static init(){var e=PostgreSql.connection=new PostgreSqlConnection(new PostgreSql),{driver:t,schema:r}=e;return Object.assign(PostgreSql,{driver:t,schema:r}),e}constructor(){super(),this.dialect=new PostgreSqlDialect,this.$=this.dialect.$,this.types=new PostgreSqlTypes,this.schema=this.$.schema=new PostgreSqlSchema(this)}}class PostgreSqlConnection extends ConnectionBase{}var sqlite=Sqlite.init().$,mysql=MySql.init().$,postgres=PostgreSql.init().$;export{useFilter,toStr,table,sqlite,snakeCase,postgres,pick,omit,nextParamVal,nextParam,mysql,mergeParams,converterFor,column,asType,asRef,WhereQuery,Watch,UpdateQuery,Table,SyncDbConnection,SqliteTypes,SqliteSchema,SqliteDialect,Sqlite,Sql,SnakeCaseStrategy,SelectQuery,Schema,PostgreSqlTypes,PostgreSqlSchema,PostgreSqlDialect,PostgreSql,MySqlTypes,MySqlSchema,MySqlDialect,MySql,Meta,Inspect,IS,DeleteQuery,DefaultValues,DefaultStrategy,DbConnection,DateTimeConverter};
`+this._limit:""}build(){return{sql:this.buildSelect()+this.buildFrom()+this.buildJoins()+this.buildWhere()+this.buildGroupBy()+this.buildHaving()+this.buildOrderBy()+this.buildLimit(),params:this.params,into:0==this._select.length?this.tables[0]:void 0}}}class UpdateQuery extends WhereQuery{get name(){return clsName("UpdateQuery",...this.tables)}_set=[];set(r,...e){if(r||(this._set.length=0),IS.tpl(r)){e=this.$(r,...e);this._set.push(this.mergeParams(e))}else if(IS.fn(r)){e=assertSql(r.call(this,...this.refs));this._set.push(this.mergeParams(e))}else{if(!IS.rec(r))throw EX.arg(r);if("sql"in r)this._set.push(this.mergeParams(r));else for(let[t,e]of Object.entries(r)){var s=this.meta.props.find(e=>e.name===t);if(!s)throw new Error(`Property ${t} not found in `+this.meta.name);if(!s.column)throw new Error(`Property ${t} is not a column`);this.params[s.name]=e,this._set.push(this.$.quote(s.column.name)+" = $"+s.name)}}return this}get hasSet(){return 0<this._set.length}buildUpdate(){var e=this._set.join(", ");return`UPDATE ${this.quoteTable(this.meta.tableName)} SET `+e+this.buildWhere()}build(){return{sql:this.buildUpdate(),params:this.params}}}class DeleteQuery extends WhereQuery{get[type](){return clsName("DeleteQuery",...this.tables)}buildDelete(){return"DELETE FROM "+this.quoteTable(this.meta.tableName)+this.buildWhere()}build(){return{sql:this.buildDelete(),params:this.params}}}function table(r){return function(e){var t=Object.assign({},r,{name:r?.alias??e.name});e.$id||(e.$id=Symbol(e.name)),e.$type??={name:e.name},e.$type.table=t}}function column(n,i){return function(e,t){var r=Object.assign({},i,{type:n,name:i?.alias??t}),e=("id"!==t&&!i?.autoIncrement||(r.primaryKey=!0),e.constructor.$id||(e.constructor.$id=Symbol(e.constructor.name)),e.constructor.$props??(e.constructor.$props=[]));let s=e.find(e=>e.name===t);s||(s={name:t},e.push(s)),s.column=r,IS.sym(s.column.type)&&(s.column.type=s.column.type.description)}}function Table(e,s){if(!s)throw new Error("Table definition is required");var t=e;t.$id||(t.$id=Symbol(e.name)),t.$type??={name:e.name},t.$type.table=s.table??{},t.$type.table.name??=e.name;let n=t.$props??(t.$props=[]);return Object.keys(s.columns??{}).forEach(t=>{var e=s.columns[t];if(!e)throw new Error(`Column definition for ${t} is missing`);if(!e.type)throw new Error(`Column type for ${t} is missing`);"id"!==t&&!e?.autoIncrement||(e.primaryKey=!0);let r=n.find(e=>e.name===t);r||(r={name:t},n.push(r)),r.column=e,r.column.name??=e.alias??t,IS.sym(r.column.type)&&(r.column.type=r.column.type.description)}),e}var DefaultValues={NOW:"{NOW}",MAX_TEXT:"{MAX_TEXT}",MAX_TEXT_UNICODE:"{MAX_TEXT_UNICODE}",TRUE:"{TRUE}",FALSE:"{FALSE}"};class SqliteDialect{$;strategy=new DefaultStrategy;constructor(){this.$=Sql.create(this)}quote(e){return isQuoted(e)?e:`"${e}"`}quoteTable(e){return isQuoted(e)?e:this.quote(this.strategy.tableName(e))}quoteColumn(e){return isQuoted(e)?e:this.quote(this.strategy.columnName(e))}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?this.$.sql("LIMIT $limit OFFSET $offset",{offset:e,limit:t??-1}):this.$.sql("LIMIT $limit",{limit:t})}}class SqliteSchema extends Schema{driver;constructor(e){super(e.dialect),this.driver=e}sqlTableNames(){return"SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%'"}sqlIndexDefinition(e,t){return`CREATE ${t.unique?"UNIQUE INDEX":"INDEX"} ${(`idx_${e.name}_`+t.name).toLowerCase()} ON ${this.dialect.quoteTable(e.name)} (${this.dialect.quoteColumn(t.name)})`}sqlForeignKeyDefinition(e,t){var r=t.references;if(!r)return"";let s=this.driver.$;var n=Array.isArray(r.table)?Meta.assert(r.table[0]):Meta.assert(r.table),i=Array.isArray(r.table)?Array.isArray(r.table[1])?r.table[1].map(e=>s.quoteColumn(e)).join(","):s.quoteColumn(r.table[1]):n.columns.filter(e=>e.primaryKey).map(e=>s.quoteColumn(e.name)).join(",");let a=`FOREIGN KEY (${s.quoteColumn(t.name)}) REFERENCES `+s.quoteTable(n.tableName)+(i?"("+i+")":"");return r.on&&(a+=` ON ${r.on[0]} `+r.on[1]),a}sqlColumnDefinition(e){var t=e.type;let r=this.driver.types.native.includes(t)?t:void 0;if(!r)for(var[s,n]of Object.entries(this.driver.types.map))if(n.includes(t)){r=s;break}r=r||t;let i=this.dialect.quoteColumn(e.name)+" "+r;return e.primaryKey&&(i+=" PRIMARY KEY"),e.autoIncrement&&(i+=" AUTOINCREMENT"),e.required&&(i+=" NOT NULL"),e.unique&&!e.index&&(i+=" UNIQUE"),e.defaultValue&&(e=this.driver.variables[e.defaultValue]??e.defaultValue,i+=" DEFAULT "+e),i}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?this.driver.$.sql("LIMIT $limit OFFSET $offset",{offset:e,limit:t??-1}):this.driver.$.sql("LIMIT $limit",{limit:t})}}class SqliteTypes{native=["INTEGER","SMALLINT","BIGINT","REAL","DOUBLE","FLOAT","NUMERIC","DECIMAL","BOOLEAN","DATE","DATETIME"];map={INTEGER:["INTERVAL","MONEY"],BLOB:["BLOB","BYTES","BIT"],TEXT:["UUID","JSON","JSONB","XML","TIME","TIMEZ","TIMESTAMP","TIMESTAMPZ"]}}class Sqlite{static connection;static driver;static schema;static init(){var e=Sqlite.connection=new SqliteConnection(new Sqlite),{driver:t,schema:r}=e;return Object.assign(Sqlite,{driver:t,schema:r}),e}name;dialect;schema;strategy=new DefaultStrategy;$;variables={[DefaultValues.NOW]:"CURRENT_TIMESTAMP",[DefaultValues.MAX_TEXT]:"TEXT",[DefaultValues.MAX_TEXT_UNICODE]:"TEXT",[DefaultValues.TRUE]:"1",[DefaultValues.FALSE]:"0"};types;converters={...converterFor(DateTimeConverter.instance,"DATE","DATETIME","TIMESTAMP","TIMESTAMPZ")};constructor(){this.name=this.constructor.name,this.dialect=new SqliteDialect,this.$=this.dialect.$,this.types=new SqliteTypes,this.schema=this.$.schema=new SqliteSchema(this)}}class SqliteConnection extends ConnectionBase{}class MySqlDialect{$;strategy=new DefaultStrategy;constructor(){this.$=Sql.create(this)}quote(e){return isQuoted(e)?e:"`"+e+"`"}quoteTable(e){return isQuoted(e)?e:this.quote(this.strategy.tableName(e))}quoteColumn(e){return isQuoted(e)?e:this.quote(this.strategy.columnName(e))}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?t?this.$.sql("LIMIT $offset, $limit",{offset:e,limit:t}):this.$.sql("LIMIT $offset, 18446744073709551615",{offset:e}):this.$.sql("LIMIT $limit",{limit:t})}}class MySqlSchema extends SqliteSchema{}class MySqlTypes{native=["INTEGER","SMALLINT","BIGINT","DOUBLE","FLOAT","DECIMAL","NUMERIC","DECIMAL","BOOLEAN","DATE","DATETIME","TIME","TIMESTAMP","UUID","JSON","XML","BLOB"];map={DOUBLE:["REAL"],TIME:["TIMEZ"],TIMESTAMP:["TIMESTAMPZ"],INTEGER:["INTERVAL"],JSON:["JSONB"],TEXT:["XML"],BINARY:["BYTES"],"BINARY(1)":["BIT"],"DECIMAL(15,2)":["MONEY"]}}class MySql extends Sqlite{static connection;static driver;static schema;static init(){var e=MySql.connection=new MySqlConnection(new MySql),{driver:t,schema:r}=e;return Object.assign(MySql,{driver:t,schema:r}),e}constructor(){super(),this.dialect=new MySqlDialect,this.$=this.dialect.$,this.types=new MySqlTypes,this.schema=this.$.schema=new MySqlSchema(this)}}class MySqlConnection extends ConnectionBase{}class PostgreSqlDialect{$;strategy=new DefaultStrategy;constructor(){this.$=Sql.create(this)}quote(e){return isQuoted(e)?e:`"${e}"`}quoteTable(e){return isQuoted(e)?e:this.quote(this.strategy.tableName(e))}quoteColumn(e){return isQuoted(e)?e:this.quote(this.strategy.columnName(e))}sqlLimit(e,t){if(null==e&&null==t)throw new Error(`Invalid argument sqlLimit(${e}, ${t})`);return e?t?this.$.sql("LIMIT $limit OFFSET $offset",{offset:e,limit:t}):this.$.sql("OFFSET $offset",{offset:e}):this.$.sql("LIMIT $limit",{limit:t})}}class PostgreSqlSchema extends SqliteSchema{}class PostgreSqlTypes{native=["INTEGER","SMALLINT","BIGINT","REAL","DOUBLE","FLOAT","DECIMAL","NUMERIC","DECIMAL","MONEY","BOOLEAN","DATE","DATETIME","TIME","TIMEZ","TIMESTAMP","TIMESTAMPZ","INTERVAL","UUID","JSON","JSONB","XML","BLOB","BYTES","BIT"];map={}}class PostgreSql extends Sqlite{static connection;static driver;static schema;static init(){var e=PostgreSql.connection=new PostgreSqlConnection(new PostgreSql),{driver:t,schema:r}=e;return Object.assign(PostgreSql,{driver:t,schema:r}),e}constructor(){super(),this.dialect=new PostgreSqlDialect,this.$=this.dialect.$,this.types=new PostgreSqlTypes,this.schema=this.$.schema=new PostgreSqlSchema(this)}}class PostgreSqlConnection extends ConnectionBase{}var sqlite=Sqlite.init().$,mysql=MySql.init().$,postgres=PostgreSql.init().$;export{useFilter,toStr,table,sqlite,snakeCase,postgres,pick,omit,nextParamVal,nextParam,mysql,mergeParams,converterFor,column,asType,asRef,WhereQuery,Watch,UpdateQuery,Table,SyncDbConnection,SqliteTypes,SqliteSchema,SqliteDialect,Sqlite,Sql,SnakeCaseStrategy,SelectQuery,Schema,PostgreSqlTypes,PostgreSqlSchema,PostgreSqlDialect,PostgreSql,MySqlTypes,MySqlSchema,MySqlDialect,MySql,Meta,Inspect,IS,DeleteQuery,DefaultValues,DefaultStrategy,DbConnection,DateTimeConverter};
{
"name": "litdb",
"type": "module",
"version": "0.0.11",
"version": "0.0.12",
"main": "./dist/index.js",

@@ -6,0 +6,0 @@ "module": "./dist/index.js",

@@ -119,3 +119,3 @@ # litdb

const hasId = <Table extends { id:number }>(id:number) =>
(x:Table) => $.fragment($`${x.id} = $id`, { id })
(x:Table) => $.sql($`${x.id} = $id`, { id })

@@ -122,0 +122,0 @@ const contacts = db.all($.from(Contact).into(Contact)) // => Contact[]

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc