squel 6.2.1 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [6.3.0](https://github.com/hiddentao/squel/compare/v6.2.1...v6.3.0) (2026-06-13)
6
+
7
+
8
+ ### Features
9
+
10
+ * **mssql:** apply/cross_apply/outer_apply to mssql flavour ([#409](https://github.com/hiddentao/squel/issues/409)) ([25afd5e](https://github.com/hiddentao/squel/commit/25afd5eb045958d288f2376e1bf4c0292431b0f4))
11
+
5
12
  ## [6.2.1](https://github.com/hiddentao/squel/compare/v6.2.0...v6.2.1) (2026-06-13)
6
13
 
7
14
  ## [6.2.0](https://github.com/hiddentao/squel/compare/v6.1.0...v6.2.0) (2026-06-13)
package/README.md CHANGED
@@ -406,6 +406,24 @@ squel.useFlavour("mssql")
406
406
  // INSERT INTO users (name) OUTPUT INSERTED.id VALUES ('John')
407
407
  ```
408
408
 
409
+ #### CROSS/OUTER APPLY (MSSQL)
410
+
411
+ Provides `CROSS APPLY` and `OUTER APPLY` support for the MSSQL flavour:
412
+
413
+ ```javascript
414
+ // MSSQL CROSS/OUTER APPLY
415
+ squel.useFlavour("mssql")
416
+ .select()
417
+ .from("table1")
418
+ .cross_apply("table2", "t2")
419
+ .outer_apply(
420
+ squel.select().from("bar").where("bar.id = table1.id"),
421
+ "s"
422
+ )
423
+ .toString()
424
+ // SELECT * FROM table1 CROSS APPLY table2 t2 OUTER APPLY (SELECT * FROM bar WHERE (bar.id = table1.id)) s
425
+ ```
426
+
409
427
  ## Non-standard SQL flavours
410
428
 
411
429
  Squel supports the standard SQL commands and reserved words. A number of database engines provide their own non-standard commands; Squel makes it easy to load different "flavours" of SQL that augment the core builders with engine-specific features.
@@ -1 +1 @@
1
- (()=>{var{defineProperty:k,getOwnPropertyNames:z,getOwnPropertyDescriptor:A}=Object,Q=Object.prototype.hasOwnProperty;function V(c){return this[c]}var q=(c)=>{var n=(P??=new WeakMap).get(c),h;if(n)return n;if(n=k({},"__esModule",{value:!0}),c&&typeof c==="object"||typeof c==="function"){for(var a of z(c))if(!Q.call(n,a))k(n,a,{get:V.bind(c,a),enumerable:!(h=A(c,a))||h.enumerable})}return P.set(c,n),n},P;var C=(c)=>c;function D(c,n){this[c]=C.bind(null,n)}var I=(c,n)=>{for(var h in n)k(c,h,{get:n[h],enumerable:!0,configurable:!0,set:D.bind(n,h)})};var U={};I(U,{squel:()=>S,default:()=>H});var v={name:"squel",version:"6.2.1",description:"SQL query string builder",keywords:["sql","database","rdbms","query-builder","mysql","postgres","mssql"],author:"Ramesh Nair <ram@hiddentao.com> (http://www.hiddentao.com/)",contributors:["Ramesh Nair <ram@hiddentao.com> (http://www.hiddentao.com/)","Sergej Brjuchanov <serges@seznam.cz>"],license:"MIT",repository:{type:"git",url:"https://github.com/hiddentao/squel.git"},homepage:"https://github.com/hiddentao/squel",bugs:{url:"https://github.com/hiddentao/squel/issues"},type:"module",main:"./dist/cjs/index.js",module:"./dist/esm/index.js",types:"./dist/types/index.d.ts",exports:{".":{types:"./dist/types/index.d.ts",import:"./dist/esm/index.js",require:"./dist/cjs/index.js"},"./browser":"./dist/browser/squel.min.js"},files:["dist","README.md","LICENSE.md","CHANGELOG.md"],engines:{node:">=18.0.0"},publishConfig:{access:"public",provenance:!0},scripts:{build:"bun run scripts/build.ts",test:"bun test","test:coverage":"bun test --coverage --coverage-reporter=lcov","test:watch":"bun test --watch",lint:"biome check --write ./src ./tests ./scripts",format:"biome format --write ./src ./tests ./scripts",check:"biome check ./src ./tests ./scripts",typecheck:"tsc --noEmit",prepare:"husky",prepublishOnly:"bun run build && bun run test"},dependencies:{},devDependencies:{"@biomejs/biome":"^1.9.4","@commitlint/cli":"^19.8.1","@commitlint/config-conventional":"^19.8.1","@types/bun":"latest","@types/node":"^22.0.0","commit-and-tag-version":"^12.6.0",husky:"^9.1.7",typescript:"^5.3.0"}};function _(c,n){return c.length?c+n:c}function m(c,...n){if(c&&n){for(let h of n)if(h&&typeof h==="object")for(let a of Object.getOwnPropertyNames(h))c[a]=h[a]}return c}function x(c){return!!c&&c.constructor.prototype===Object.prototype}function B(c){return!!c&&c.constructor.prototype===Array.prototype}function F(c){if(!c)return c;let n=c;if(typeof n.clone==="function")return n.clone();if(x(c)||B(c)){let h=new n.constructor;for(let a of Object.getOwnPropertyNames(c))if(typeof n[a]!=="function"&&a!=="_queryBuilder")h[a]=F(n[a]);return h}return JSON.parse(JSON.stringify(c))}function O(c,n,h){let a=typeof n;if(a!=="function"&&a!=="string")throw Error("type must be a class constructor or string");if(typeof h!=="function")throw Error("handler must be a function");for(let e of c)if(e.type===n){e.handler=h;return}c.push({type:n,handler:h})}function E(c,n,h){return T(c,n)||T(c,h)}function T(c,n){for(let h of n)if(typeof c===h.type||typeof h.type!=="string"&&c instanceof h.type)return h.handler;return}function N(c=null){let n={isSquelBuilder(e){return!!e&&!!e._toParamString}},h=(e)=>{return!n.isSquelBuilder(e)||!e.options.rawNesting};n.DefaultQueryBuilderOptions={autoQuoteTableNames:!1,autoQuoteFieldNames:!1,autoQuoteAliasNames:!0,useAsForTableAliasNames:!1,nameQuoteCharacter:"`",tableAliasQuoteCharacter:"`",fieldAliasQuoteCharacter:'"',valueHandlers:[],parameterCharacter:"?",numberedParameters:!1,numberedParametersPrefix:"$",numberedParametersStartAt:1,replaceSingleQuotes:!1,singleQuoteReplacement:"''",separator:" ",stringFormatter:null,rawNesting:!1},n.globalValueHandlers=[],n.registerValueHandler=(e,t)=>{O(n.globalValueHandlers,e,t)},n.Cloneable=class{clone(){let e=new this.constructor;return m(e,F(m({},this)))}},n.BaseBuilder=class extends n.Cloneable{options;constructor(e){super();let t=JSON.parse(JSON.stringify(n.DefaultQueryBuilderOptions));t.stringFormatter=n.DefaultQueryBuilderOptions.stringFormatter,this.options=m(t,e)}registerValueHandler(e,t){return O(this.options.valueHandlers,e,t),this}_sanitizeExpression(e){if(!n.isSquelBuilder(e)){if(typeof e!=="string")throw Error("expression must be a string or builder instance")}return e}_sanitizeName(e,t){if(typeof e!=="string")throw Error(`${t} must be a string`);return e}_sanitizeField(e){if(!n.isSquelBuilder(e))return this._sanitizeName(e,"field name");return e}_sanitizeBaseBuilder(e){if(n.isSquelBuilder(e))return e;throw Error("must be a builder instance")}_sanitizeTable(e,t){if(typeof e!=="string")try{return this._sanitizeBaseBuilder(e)}catch(r){throw Error("table name must be a string or a builder")}return this._sanitizeName(e,"table")}_sanitizeTableAlias(e){return this._sanitizeName(e,"table alias")}_sanitizeFieldAlias(e){return this._sanitizeName(e,"field alias")}_sanitizeLimitOffset(e){let t=Number.parseInt(e,10);if(t<0||Number.isNaN(t))throw Error("limit/offset must be >= 0");return t}_sanitizeValue(e){let t=typeof e;if(e===null);else if(t==="string"||t==="number"||t==="boolean");else if(n.isSquelBuilder(e));else if(!E(e,this.options.valueHandlers,n.globalValueHandlers))throw Error("field value must be a string, number, boolean, null or one of the registered custom value types");return e}_escapeValue(e){return this.options.replaceSingleQuotes&&e?e.replace(/'/g,this.options.singleQuoteReplacement):e}_formatTableName(e){if(this.options.autoQuoteTableNames){let t=this.options.nameQuoteCharacter;e=`${t}${e}${t}`}return e}_formatFieldAlias(e){if(this.options.autoQuoteAliasNames){let t=this.options.fieldAliasQuoteCharacter;e=`${t}${e}${t}`}return e}_formatTableAlias(e){if(this.options.autoQuoteAliasNames){let t=this.options.tableAliasQuoteCharacter;e=`${t}${e}${t}`}return this.options.useAsForTableAliasNames?`AS ${e}`:e}_formatFieldName(e,t={}){if(this.options.autoQuoteFieldNames){let r=this.options.nameQuoteCharacter;if(t.ignorePeriodsForFieldNameQuotes)e=`${r}${e}${r}`;else e=e.split(".").map((s)=>s==="*"?s:`${r}${s}${r}`).join(".")}return e}_formatCustomValue(e,t,r){let s=E(e,this.options.valueHandlers,n.globalValueHandlers);if(s){if(e=s(e,t,r),e?.rawNesting)return{formatted:!0,rawNesting:!0,value:e.value}}return{formatted:!!s,value:e}}_formatValueForParamArray(e,t={}){if(B(e))return e.map((r)=>this._formatValueForParamArray(r,t));return this._formatCustomValue(e,!0,t).value}_formatValueForQueryString(e,t={}){let{rawNesting:r,formatted:s,value:l}=this._formatCustomValue(e,!1,t),i=l;if(s){if(r)return i;return this._applyNestingFormatting(i,h(e))}if(B(i))i=i.map((o)=>this._formatValueForQueryString(o)),i=this._applyNestingFormatting(i.join(", "),h(i));else{let o=typeof i;if(i===null)i="NULL";else if(o==="boolean")i=i?"TRUE":"FALSE";else if(n.isSquelBuilder(i))i=this._applyNestingFormatting(i.toString(),h(i));else if(o!=="number"){if(o==="string"&&this.options.stringFormatter)return this.options.stringFormatter(i);if(t.dontQuote)i=`${i}`;else i=`'${this._escapeValue(i)}'`}}return i}_applyNestingFormatting(e,t=!0){if(e&&typeof e==="string"&&t&&!this.options.rawNesting){let r=e.startsWith("(")&&e.endsWith(")");if(r){let s=0,l=1;while(e.length-1>++s){let i=e.charAt(s);if(i==="(")l++;else if(i===")"){if(l--,l<1){r=!1;break}}}}if(!r)e=`(${e})`}return e}_buildString(e,t,r={}){let{nested:s,buildParameterized:l,formattingOptions:i}=r;t=t||[],e=e||"";let o="",u=-1,d=[],y=this.options.parameterCharacter,f=0;while(e.length>f)if(e.substring(f,f+y.length)===y){let p=t[++u];if(l)if(n.isSquelBuilder(p)){let w=p._toParamString({buildParameterized:l,nested:!0});o+=w.text,w.values.forEach((b)=>d.push(b))}else if(p=this._formatValueForParamArray(p,i),B(p)){let w=p.map(()=>y).join(", ");o+=`(${w})`,p.forEach((b)=>d.push(b))}else o+=y,d.push(p);else o+=this._formatValueForQueryString(p,i);f+=y.length}else o+=e.charAt(f),f++;return{text:this._applyNestingFormatting(o,!!s),values:d}}_buildManyStrings(e,t,r={}){let s=[],l=[];for(let o=0;e.length>o;++o){let u=e[o],d=t[o],{text:y,values:f}=this._buildString(u,d,{buildParameterized:r.buildParameterized,nested:!1});s.push(y),f.forEach((p)=>l.push(p))}let i=s.join(this.options.separator);return{text:i.length?this._applyNestingFormatting(i,!!r.nested):"",values:l}}_toParamString(e){throw Error("Not yet implemented")}toString(e={}){return this._toParamString(e).text}toParam(e={}){return this._toParamString({...e,buildParameterized:!0})}},n.Expression=class extends n.BaseBuilder{_nodes;constructor(e){super(e);this._nodes=[]}and(e,...t){return e=this._sanitizeExpression(e),this._nodes.push({type:"AND",expr:e,para:t}),this}or(e,...t){return e=this._sanitizeExpression(e),this._nodes.push({type:"OR",expr:e,para:t}),this}_toParamString(e={}){let t=[],r=[];for(let s of this._nodes){let{type:l,expr:i,para:o}=s,{text:u,values:d}=n.isSquelBuilder(i)?i._toParamString({buildParameterized:e.buildParameterized,nested:!0}):this._buildString(i,o,{buildParameterized:e.buildParameterized});if(t.length)t.push(l);t.push(u),d.forEach((y)=>r.push(y))}return t=t.join(" "),{text:this._applyNestingFormatting(t,!!e.nested),values:r}}},n.Case=class extends n.BaseBuilder{_fieldName=null;_cases;_elseValue=null;constructor(e,t={}){super(t);let r=null;if(x(e))t=e;else if(e)r=this._sanitizeField(e);this._fieldName=r,this.options=m({...n.DefaultQueryBuilderOptions},t),this._cases=[]}when(e,...t){return this._cases.unshift({expression:e,values:t||[]}),this}then(e){if(this._cases.length===0)throw Error("when() needs to be called first");return this._cases[0].result=e,this}else(e){return this._elseValue=e,this}_toParamString(e={}){let t="",r=[];for(let{expression:s,values:l,result:i}of this._cases){t=_(t," ");let o=this._buildString(s,l,{buildParameterized:e.buildParameterized,nested:!0});t+=`WHEN ${o.text} THEN ${this._formatValueForQueryString(i)}`,o.values.forEach((u)=>r.push(u))}if(t.length){if(t+=` ELSE ${this._formatValueForQueryString(this._elseValue)} END`,this._fieldName)t=`${this._fieldName} ${t}`;t=`CASE ${t}`}else t=this._formatValueForQueryString(this._elseValue);return{text:t,values:r}}},n.Over=class extends n.BaseBuilder{_funcExpr;_funcParams;_partitionFields;_orderFields;_rows;_range;constructor(e,t=[],r){super(r);this._funcExpr=e,this._funcParams=t||[],this._partitionFields=[],this._orderFields=[],this._rows=null,this._range=null}partitionBy(...e){let t=[];for(let r of e)if(B(r))t=t.concat(r);else t.push(r);for(let r of t)this._partitionFields.push(this._sanitizeField(r));return this}orderBy(e,t,...r){e=this._sanitizeField(e);let s;if(typeof t==="string")s=t;else if(t===void 0)s="ASC";else if(t===null)s=null;else s=t?"ASC":"DESC";return this._orderFields.push({field:e,dir:s,values:r||[]}),this}rowsBetween(e,t){if(t===void 0)this._rows=`ROWS BETWEEN ${e}`;else this._rows=`ROWS BETWEEN ${e} AND ${t}`;return this._range=null,this}rangeBetween(e,t){if(t===void 0)this._range=`RANGE BETWEEN ${e}`;else this._range=`RANGE BETWEEN ${e} AND ${t}`;return this._rows=null,this}_toParamString(e={}){let t=[],r;if(n.isSquelBuilder(this._funcExpr))r=this._funcExpr._toParamString({buildParameterized:e.buildParameterized});else r=this._buildString(this._funcExpr,this._funcParams,{buildParameterized:e.buildParameterized});r.values.forEach((i)=>t.push(i));let s="";if(this._partitionFields.length>0){let i="";for(let o of this._partitionFields)if(i=_(i,", "),n.isSquelBuilder(o)){let u=o._toParamString({buildParameterized:e.buildParameterized});i+=u.text,u.values.forEach((d)=>t.push(d))}else i+=this._formatFieldName(o);s=`PARTITION BY ${i}`}if(this._orderFields.length>0){let i="";for(let{field:o,dir:u,values:d}of this._orderFields){i=_(i,", ");let y;if(n.isSquelBuilder(o))y=o._toParamString({buildParameterized:e.buildParameterized});else y=this._buildString(o,d,{buildParameterized:e.buildParameterized});if(i+=y.text,y.values.forEach((f)=>t.push(f)),u!==null)i+=` ${u}`}s=_(s," ")+`ORDER BY ${i}`}let l=this._rows||this._range;if(l)s=_(s," ")+l;return{text:`${r.text} OVER (${s})`,values:t}}},n.JsonExtract=class extends n.BaseBuilder{_field;_path;constructor(e,t,r){super(r);this._field=e,this._path=t}_toParamString(e={}){let t=[],r="";if(n.isSquelBuilder(this._field)){let o=this._field._toParamString({buildParameterized:e.buildParameterized});r=o.text,o.values.forEach((u)=>t.push(u))}else r=this._formatFieldName(this._field);let s=this._path;if(s.startsWith("$"))s=s.slice(1);if(s.startsWith("."))s=s.slice(1);let l=s.split(".").filter(Boolean),i="";if(c==="postgres")if(l.length===0)i=r;else{i=r;for(let o=0;o<l.length;o++){let u=o===l.length-1?"->>":"->";i+=`${u}'${l[o]}'`}}else if(c==="mssql")i=`JSON_VALUE(${r}, '${this._path}')`;else i=`json_extract(${r}, '${this._path}')`;return{text:i,values:t}}},n.Block=class extends n.BaseBuilder{constructor(e){super(e)}exposedMethods(){let e={},t=this;while(t){for(let r of Object.getOwnPropertyNames(t))if(r!=="constructor"&&typeof t[r]==="function"&&!r.startsWith("_")&&!n.Block.prototype[r])e[r]=t[r];t=Object.getPrototypeOf(t)}return e}},n.StringBlock=class extends n.Block{_str;constructor(e,t){super(e);this._str=t}_toParamString(e={}){return{text:this._str,values:[]}}},n.FunctionBlock=class extends n.Block{_strings;_values;constructor(e){super(e);this._strings=[],this._values=[]}function(e,...t){this._strings.push(e),this._values.push(t)}_toParamString(e={}){return this._buildManyStrings(this._strings,this._values,e)}},n.registerValueHandler(n.FunctionBlock,(e,t=!1)=>{return t?e.toParam():e.toString()}),n.AbstractTableBlock=class extends n.Block{_tables;constructor(e,t){super(e);this._tables=[]}_table(e,t=null){if(t=t?this._sanitizeTableAlias(t):t,e=this._sanitizeTable(e),this.options.singleTable)this._tables=[];this._tables.push({table:e,alias:t})}_hasTable(){return this._tables.length>0}_toParamString(e={}){let t="",r=[];if(this._hasTable()){for(let{table:s,alias:l}of this._tables){t=_(t,", ");let i;if(n.isSquelBuilder(s)){let{text:o,values:u}=s._toParamString({buildParameterized:e.buildParameterized,nested:!0});i=o,u.forEach((d)=>r.push(d))}else i=this._formatTableName(s);if(l)i+=` ${this._formatTableAlias(l)}`;t+=i}if(this.options.prefix)t=`${this.options.prefix} ${t}`}return{text:t,values:r}}},n.TargetTableBlock=class extends n.AbstractTableBlock{target(e){this._table(e)}},n.UpdateTableBlock=class extends n.AbstractTableBlock{table(e,t=null){this._table(e,t)}_toParamString(e={}){if(!this._hasTable())throw Error("table() needs to be called");return super._toParamString(e)}},n.FromTableBlock=class extends n.AbstractTableBlock{constructor(e){super(m({},e,{prefix:"FROM"}))}from(e,t=null){this._table(e,t)}},n.IntoTableBlock=class extends n.AbstractTableBlock{constructor(e){super(m({},e,{prefix:"INTO",singleTable:!0}))}into(e){this._table(e)}_toParamString(e={}){if(!this._hasTable())throw Error("into() needs to be called");return super._toParamString(e)}},n.GetFieldBlock=class extends n.Block{_fields;constructor(e){super(e);this._fields=[]}fields(e,t={}){if(B(e))for(let r of e)this.field(r,null,t);else for(let r in e){let s=e[r];this.field(r,s,t)}}field(e,t=null,r={}){if(t=t?this._sanitizeFieldAlias(t):t,e=this._sanitizeField(e),this._fields.filter((l)=>l.name===e&&l.alias===t).length)return this;this._fields.push({name:e,alias:t,options:r});return}_toParamString(e={}){let{queryBuilder:t,buildParameterized:r}=e,s="",l=[];for(let i of this._fields){s=_(s,", ");let{name:o,alias:u,options:d}=i;if(typeof o==="string")s+=this._formatFieldName(o,d);else{let y=o._toParamString({nested:!0,buildParameterized:r});s+=y.text,y.values.forEach((f)=>l.push(f))}if(u)s+=` AS ${this._formatFieldAlias(u)}`}if(!s.length){if(t?.getBlock(n.FromTableBlock)?._hasTable())s="*"}return{text:s,values:l}}},n.AbstractSetFieldBlock=class extends n.Block{_fields;_values;_valueOptions;constructor(e){super(e);this._fields=[],this._values=[[]],this._valueOptions=[[]]}_reset(){this._fields=[],this._values=[[]],this._valueOptions=[[]]}_set(e,t,r={}){if(this._values.length>1)throw Error("Cannot set multiple rows of fields this way.");if(typeof t<"u")t=this._sanitizeValue(t);e=this._sanitizeField(e);let s=this._fields.indexOf(e);if(s===-1)this._fields.push(e),s=this._fields.length-1;this._values[0][s]=t,this._valueOptions[0][s]=r}_setFields(e,t={}){if(typeof e!=="object")throw Error(`Expected an object but got ${typeof e}`);for(let r in e)this._set(r,e[r],t)}_setFieldsRows(e,t={}){if(!B(e))throw Error(`Expected an array of objects but got ${typeof e}`);this._reset();for(let r=0;e.length>r;++r){let s=e[r];for(let l in s){let i=s[l];l=this._sanitizeField(l),i=this._sanitizeValue(i);let o=this._fields.indexOf(l);if(r>0&&o===-1)throw Error("All fields in subsequent rows must match the fields in the first row");if(o===-1)this._fields.push(l),o=this._fields.length-1;if(!B(this._values[r]))this._values[r]=[],this._valueOptions[r]=[];this._values[r][o]=i,this._valueOptions[r][o]=t}}}},n.SetFieldBlock=class extends n.AbstractSetFieldBlock{set(e,t,r){this._set(e,t,r)}setFields(e,t){this._setFields(e,t)}_toParamString(e={}){let{buildParameterized:t}=e;if(this._fields.length<=0)throw Error("set() needs to be called");let r="",s=[];for(let l=0;l<this._fields.length;++l){r=_(r,", ");let i=this._formatFieldName(this._fields[l]),o=this._values[0][l];if(i.indexOf("=")<0)i=`${i} = ${this.options.parameterCharacter}`;let u=this._buildString(i,[o],{buildParameterized:t,formattingOptions:this._valueOptions[0][l]});r+=u.text,u.values.forEach((d)=>s.push(d))}return{text:`SET ${r}`,values:s}}},n.InsertFieldValueBlock=class extends n.AbstractSetFieldBlock{set(e,t,r={}){this._set(e,t,r)}setFields(e,t){this._setFields(e,t)}setFieldsRows(e,t){this._setFieldsRows(e,t)}_toParamString(e={}){let{buildParameterized:t}=e,r=this._fields.map((i)=>this._formatFieldName(i)).join(", "),s=[],l=[];for(let i=0;i<this._values.length;++i){s[i]="";for(let o=0;o<this._values[i].length;++o){let u=this._buildString(this.options.parameterCharacter,[this._values[i][o]],{buildParameterized:t,formattingOptions:this._valueOptions[i][o]});u.values.forEach((d)=>l.push(d)),s[i]=_(s[i],", "),s[i]+=u.text}}return{text:r.length?`(${r}) VALUES (${s.join("), (")})`:"",values:l}}},n.InsertFieldsFromQueryBlock=class extends n.Block{_fields;_query=null;constructor(e){super(e);this._fields=[]}fromQuery(e,t){this._fields=e.map((r)=>this._sanitizeField(r)),this._query=this._sanitizeBaseBuilder(t)}_toParamString(e={}){let t="",r=[];if(this._fields.length&&this._query){let{text:s,values:l}=this._query._toParamString({buildParameterized:e.buildParameterized,nested:!0});t=`(${this._fields.join(", ")}) ${this._applyNestingFormatting(s)}`,r=l}return{text:t,values:r}}},n.DistinctBlock=class extends n.Block{_useDistinct=!1;distinct(){this._useDistinct=!0}_toParamString(){return{text:this._useDistinct?"DISTINCT":"",values:[]}}},n.GroupByBlock=class extends n.Block{_groups;constructor(e){super(e);this._groups=[]}group(e){this._groups.push(this._sanitizeField(e))}_toParamString(e={}){return{text:this._groups.length?`GROUP BY ${this._groups.join(", ")}`:"",values:[]}}},n.AbstractVerbSingleValueBlock=class extends n.Block{_value=null;constructor(e){super(e)}_setValue(e){this._value=e!==null?this._sanitizeLimitOffset(e):e}_toParamString(e={}){let t=this._value!==null?`${this.options.verb} ${this.options.parameterCharacter}`:"",r=this._value!==null?[this._value]:[];return this._buildString(t,r,e)}},n.OffsetBlock=class extends n.AbstractVerbSingleValueBlock{constructor(e){super(m({},e,{verb:"OFFSET"}))}offset(e){this._setValue(e)}},n.LimitBlock=class extends n.AbstractVerbSingleValueBlock{constructor(e){super(m({},e,{verb:"LIMIT"}))}limit(e){this._setValue(e)}},n.AbstractConditionBlock=class extends n.Block{_conditions;constructor(e){super(e);this._conditions=[]}_condition(e,...t){e=this._sanitizeExpression(e),this._conditions.push({expr:e,values:t||[]})}_toParamString(e={}){let t=[],r=[];for(let{expr:l,values:i}of this._conditions){let o=n.isSquelBuilder(l)?l._toParamString({buildParameterized:e.buildParameterized}):this._buildString(l,i,{buildParameterized:e.buildParameterized});if(o.text.length)t.push(o.text);o.values.forEach((u)=>r.push(u))}let s=t.join(") AND (");return{text:s.length?`${this.options.verb} (${s})`:"",values:r}}},n.WhereBlock=class extends n.AbstractConditionBlock{constructor(e){super(m({},e,{verb:"WHERE"}))}where(e,...t){this._condition(e,...t)}},n.HavingBlock=class extends n.AbstractConditionBlock{constructor(e){super(m({},e,{verb:"HAVING"}))}having(e,...t){this._condition(e,...t)}},n.OrderByBlock=class extends n.Block{_orders;constructor(e){super(e);this._orders=[]}order(e,t,...r){e=this._sanitizeField(e);let s;if(typeof t==="string")s=t;else if(t===void 0)s="ASC";else if(t===null)s=null;else s=t?"ASC":"DESC";this._orders.push({field:e,dir:s,values:r||[]})}_toParamString(e={}){let t="",r=[];for(let{field:s,dir:l,values:i}of this._orders){t=_(t,", ");let o=this._buildString(s,i,{buildParameterized:e.buildParameterized});if(t+=o.text,B(o.values))o.values.forEach((u)=>r.push(u));if(l!==null)t+=` ${l}`}return{text:t.length?`ORDER BY ${t}`:"",values:r}}},n.JoinBlock=class extends n.Block{_joins;constructor(e){super(e);this._joins=[]}join(e,t=null,r=null,s="INNER"){e=this._sanitizeTable(e,!0),t=t?this._sanitizeTableAlias(t):t,r=r?this._sanitizeExpression(r):r,this._joins.push({type:s,table:e,alias:t,condition:r})}left_join(e,t=null,r=null){this.join(e,t,r,"LEFT")}right_join(e,t=null,r=null){this.join(e,t,r,"RIGHT")}outer_join(e,t=null,r=null){this.join(e,t,r,"OUTER")}left_outer_join(e,t=null,r=null){this.join(e,t,r,"LEFT OUTER")}full_join(e,t=null,r=null){this.join(e,t,r,"FULL")}cross_join(e,t=null,r=null){this.join(e,t,r,"CROSS")}_toParamString(e={}){let t="",r=[];for(let{type:s,table:l,alias:i,condition:o}of this._joins){t=_(t,this.options.separator);let u;if(n.isSquelBuilder(l)){let d=l._toParamString({buildParameterized:e.buildParameterized,nested:!0});d.values.forEach((y)=>r.push(y)),u=d.text}else u=this._formatTableName(l);if(t+=`${s} JOIN ${u}`,i)t+=` ${this._formatTableAlias(i)}`;if(o){t+=" ON ";let d;if(n.isSquelBuilder(o))d=o._toParamString({buildParameterized:e.buildParameterized});else d=this._buildString(o,[],{buildParameterized:e.buildParameterized});t+=this._applyNestingFormatting(d.text),d.values.forEach((y)=>r.push(y))}}return{text:t,values:r}}},n.UnionBlock=class extends n.Block{_unions;constructor(e){super(e);this._unions=[]}union(e,t="UNION"){e=this._sanitizeTable(e),this._unions.push({type:t,table:e})}union_all(e){this.union(e,"UNION ALL")}_toParamString(e={}){let t="",r=[];for(let{type:s,table:l}of this._unions){t=_(t,this.options.separator);let i;if(l instanceof n.BaseBuilder){let o=l._toParamString({buildParameterized:e.buildParameterized,nested:!0});i=o.text,o.values.forEach((u)=>r.push(u))}else t=this._formatTableName(l),i="";t+=`${s} ${i}`}return{text:t,values:r}}},n.ForBlock=class extends n.Block{_forStr;constructor(e){super(e);this._forStr=null}for(e){this._forStr=e}_toParamString(){return{text:this._forStr!==null?`FOR ${this._forStr}`:"",values:[]}}},n.WithBlock=class extends n.Block{_tables;constructor(e){super(e);this._tables=[]}with(e,t){this._tables.push({alias:e,table:t,recursive:!1})}withRecursive(e,t){this._tables.push({alias:e,table:t,recursive:!0})}_toParamString(e={}){let t=[],r=[],s=!1;for(let{alias:o,table:u,recursive:d}of this._tables){if(d)s=!0;let y=u._toParamString({buildParameterized:e.buildParameterized,nested:!0});t.push(`${o} AS ${y.text}`),y.values.forEach((f)=>r.push(f))}if(!t.length)return{text:"",values:[]};let l=this.options.useRecursiveKeyword===!1;return{text:`${s&&!l?"WITH RECURSIVE":"WITH"} ${t.join(", ")}`,values:r}}},n.ReturningBlock=class extends n.Block{_fields;constructor(e){super(e);this._fields=[]}returning(e,t=null,r={}){if(t=t?this._sanitizeFieldAlias(t):t,e=this._sanitizeField(e),this._fields.filter((l)=>l.name===e&&l.alias===t).length)return this;this._fields.push({name:e,alias:t,options:r})}_toParamString(e={}){let{buildParameterized:t}=e,r="",s=[];for(let l of this._fields){r=_(r,", ");let{name:i,alias:o,options:u}=l;if(typeof i==="string")r+=this._formatFieldName(i,u);else{let d=i._toParamString({nested:!0,buildParameterized:t});r+=d.text,d.values.forEach((y)=>s.push(y))}if(o)r+=` AS ${this._formatFieldAlias(o)}`}return{text:r.length>0?`RETURNING ${r}`:"",values:s}}},n.QueryBuilder=class extends n.BaseBuilder{blocks;constructor(e,t){super(e);this.blocks=t||[];for(let r of this.blocks){Object.defineProperty(r,"_queryBuilder",{value:this,enumerable:!1,writable:!0,configurable:!0});let s=r.exposedMethods();for(let l in s){let i=s[l];if(this[l]!==void 0)throw Error(`Builder already has a builder method called: ${l}`);((o,u,d)=>{this[u]=(...y)=>{let f=d.call(o,...y);if(f!==void 0&&f!==o)return f;return this}})(r,l,i)}}}registerValueHandler(e,t){for(let r of this.blocks)r.registerValueHandler(e,t);return super.registerValueHandler(e,t),this}updateOptions(e){this.options=m(this.options,e);for(let t of this.blocks)t.options=m(t.options,e)}_toParamString(e={}){let t=m({},this.options,e),r=this.blocks.map((u)=>u._toParamString({buildParameterized:t.buildParameterized,queryBuilder:this})),s=r.map((u)=>u.text),l=r.map((u)=>u.values),i=s.filter((u)=>u.length>0).join(t.separator),o=[];if(l.forEach((u)=>u.forEach((d)=>o.push(d))),!t.nested){if(t.numberedParameters){let u=t.numberedParametersStartAt!==void 0?t.numberedParametersStartAt:1,d=t.parameterCharacter.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");i=i.replace(new RegExp(d,"g"),()=>{return`${t.numberedParametersPrefix}${u++}`})}}return{text:this._applyNestingFormatting(i,!!t.nested),values:o}}clone(){let e=this.blocks.map((t)=>t.clone());return new this.constructor(this.options,e)}getBlock(e){return this.blocks.find((t)=>t instanceof e)}},n.Select=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"SELECT"),new n.FunctionBlock(e),new n.DistinctBlock(e),new n.GetFieldBlock(e),new n.FromTableBlock(e),new n.JoinBlock(e),new n.WhereBlock(e),new n.GroupByBlock(e),new n.HavingBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e),new n.OffsetBlock(e),new n.UnionBlock(e),new n.ForBlock(e)];super(e,t)}},n.Update=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"UPDATE"),new n.UpdateTableBlock(e),new n.SetFieldBlock(e),new n.WhereBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e),new n.ReturningBlock(e)];super(e,t)}},n.Delete=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"DELETE"),new n.TargetTableBlock(e),new n.FromTableBlock(m({},e,{singleTable:!0})),new n.JoinBlock(e),new n.WhereBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e),new n.ReturningBlock(e)];super(e,t)}},n.Insert=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"INSERT"),new n.IntoTableBlock(e),new n.InsertFieldValueBlock(e),new n.InsertFieldsFromQueryBlock(e),new n.ReturningBlock(e)];super(e,t)}};let a={VERSION:v.version,flavour:c,expr:(e)=>new n.Expression(e),case:(e,t)=>new n.Case(e,t),select:(e,t)=>new n.Select(e,t),update:(e,t)=>new n.Update(e,t),insert:(e,t)=>new n.Insert(e,t),delete:(e,t)=>new n.Delete(e,t),str:(...e)=>{let t=new n.FunctionBlock;return t.function(...e),t},rstr:(...e)=>{let t=new n.FunctionBlock({rawNesting:!0});return t.function(...e),t},over:(e,...t)=>new n.Over(e,t),jsonExtract:(e,t)=>new n.JsonExtract(e,t),registerValueHandler:n.registerValueHandler};return a.remove=a.delete,a.cls=n,a}var g=N();g.flavours={};g.useFlavour=function(n=null){if(!n)return g;if(g.flavours[n]instanceof Function){let h=N(n);return g.flavours[n].call(null,h),h.flavours=g.flavours,h.useFlavour=g.useFlavour,h}throw Error(`Flavour not available: ${n}`)};var S=g;g.flavours.mysql=(c)=>{let n=c.cls;class h{builder;block;constructor(a,e){this.builder=a;this.block=e}}n.MysqlOnDuplicateKeyUpdateBlock=class extends n.AbstractSetFieldBlock{onDupUpdate(a,e,t){this._set(a,e,t)}onDuplicateKeyUpdate(){let a=new h(this._queryBuilder,this);return new Proxy(a,{get(e,t,r){if(t==="set")return(l,i,o)=>{return e.block._set(l,i,o),r};let s=e.builder[t];if(typeof s==="function")return(...l)=>{let i=s.apply(e.builder,l);return i===e.builder?r:i};return s}})}_toParamString(a={}){let e="",t=[];for(let r=0;r<this._fields.length;++r){e=_(e,", ");let s=this._fields[r],l=this._values[0][r],i=this._valueOptions[0][r];if(typeof l>"u")e+=s;else{let o=this._buildString(`${s} = ${this.options.parameterCharacter}`,[l],{buildParameterized:a.buildParameterized,formattingOptions:i});e+=o.text,o.values.forEach((u)=>t.push(u))}}return{text:!e.length?"":`ON DUPLICATE KEY UPDATE ${e}`,values:t}}},n.Insert=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"INSERT"),new n.IntoTableBlock(a),new n.InsertFieldValueBlock(a),new n.InsertFieldsFromQueryBlock(a),new n.MysqlOnDuplicateKeyUpdateBlock(a)];super(a,e)}},n.Replace=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"REPLACE"),new n.IntoTableBlock(a),new n.InsertFieldValueBlock(a),new n.InsertFieldsFromQueryBlock(a)];super(a,e)}},c.replace=(a,e)=>new n.Replace(a,e)};g.flavours.postgres=(c)=>{let n=c.cls;n.DefaultQueryBuilderOptions.numberedParameters=!0,n.DefaultQueryBuilderOptions.numberedParametersStartAt=1,n.DefaultQueryBuilderOptions.autoQuoteAliasNames=!1,n.DefaultQueryBuilderOptions.useAsForTableAliasNames=!0;class h{builder;block;constructor(a,e){this.builder=a;this.block=e}}n.PostgresOnConflictKeyUpdateBlock=class extends n.AbstractSetFieldBlock{_onConflict;_dupFields;constructor(a){super(a);this._onConflict=!1,this._dupFields=[]}onConflict(a,e){if(this._onConflict=!0,a){if(!B(a))a=[a];this._dupFields=a.map(this._sanitizeField.bind(this))}if(e)Object.keys(e).forEach((t)=>{this._set(t,e[t])});return this._queryBuilder}doUpdate(){let a=new h(this._queryBuilder,this);return new Proxy(a,{get(e,t,r){if(t==="set")return(l,i,o)=>{return e.block._set(l,i,o),r};let s=e.builder[t];if(typeof s==="function")return(...l)=>{let i=s.apply(e.builder,l);return i===e.builder?r:i};return s}})}doNothing(){return this._onConflict=!0,this._fields=[],this._values=[[]],this._valueOptions=[[]],this._queryBuilder}_toParamString(a={}){let e="",t=[];for(let s=0;s<this._fields.length;++s){e=_(e,", ");let l=this._fields[s],i=this._values[0][s],o=this._valueOptions[0][s];if(typeof i>"u")e+=l;else{let u=this._buildString(`${l} = ${this.options.parameterCharacter}`,[i],{buildParameterized:a.buildParameterized,formattingOptions:o});e+=u.text,u.values.forEach((d)=>t.push(d))}}let r={text:"",values:t};if(this._onConflict){let s=this._dupFields.length?`(${this._dupFields.join(", ")}) `:"",l=e.length?`UPDATE SET ${e}`:"NOTHING";r.text=`ON CONFLICT ${s}DO ${l}`}return r}},n.UsingBlock=class extends n.AbstractTableBlock{constructor(a){super({...a,prefix:"USING"})}using(a,e=null){this._table(a,e)}},n.DistinctOnBlock=class extends n.Block{_useDistinct=!1;_distinctFields;constructor(a){super(a);this._distinctFields=[]}distinct(...a){this._useDistinct=!0,a.forEach((e)=>{this._distinctFields.push(this._sanitizeField(e))})}_toParamString(){let a="";if(this._useDistinct){if(a="DISTINCT",this._distinctFields.length)a+=` ON (${this._distinctFields.join(", ")})`}return{text:a,values:[]}}},n.Select=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"SELECT"),new n.FunctionBlock(a),new n.DistinctOnBlock(a),new n.GetFieldBlock(a),new n.FromTableBlock(a),new n.JoinBlock(a),new n.WhereBlock(a),new n.GroupByBlock(a),new n.HavingBlock(a),new n.OrderByBlock(a),new n.LimitBlock(a),new n.OffsetBlock(a),new n.UnionBlock(a),new n.ForBlock(a)];super(a,e)}},n.Insert=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"INSERT"),new n.IntoTableBlock(a),new n.InsertFieldValueBlock(a),new n.InsertFieldsFromQueryBlock(a),new n.PostgresOnConflictKeyUpdateBlock(a),new n.ReturningBlock(a)];super(a,e)}},n.Update=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"UPDATE"),new n.UpdateTableBlock(a),new n.SetFieldBlock(a),new n.FromTableBlock(a),new n.WhereBlock(a),new n.OrderByBlock(a),new n.LimitBlock(a),new n.ReturningBlock(a)];super(a,e)}},n.Delete=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"DELETE"),new n.TargetTableBlock(a),new n.FromTableBlock({...a,singleTable:!0}),new n.UsingBlock(a),new n.JoinBlock(a),new n.WhereBlock(a),new n.OrderByBlock(a),new n.LimitBlock(a),new n.ReturningBlock(a)];super(a,e)}}};var $=function(c){c=this._sanitizeLimitOffset(c),this._parent._limits=c};g.flavours.mssql=(c)=>{let n=c.cls;n.DefaultQueryBuilderOptions.replaceSingleQuotes=!0,n.DefaultQueryBuilderOptions.autoQuoteAliasNames=!1,n.DefaultQueryBuilderOptions.numberedParametersPrefix="@",n.DefaultQueryBuilderOptions.useRecursiveKeyword=!1,c.registerValueHandler(Date,(e)=>{let t=e;return`'${t.getUTCFullYear()}-${t.getUTCMonth()+1}-${t.getUTCDate()} ${t.getUTCHours()}:${t.getUTCMinutes()}:${t.getUTCSeconds()}'`}),n.MssqlLimitOffsetTopBlock=class extends n.Block{_limits;_offsets;ParentBlock;LimitBlock;TopBlock;OffsetBlock;constructor(e){super(e);this._limits=null,this._offsets=null,this.ParentBlock=class extends n.Block{_parent;constructor(t){super(t.options);this._parent=t}},this.LimitBlock=class extends this.ParentBlock{limit;constructor(t){super(t);this.limit=$}_toParamString(){let t="";if(this._parent._limits&&this._parent._offsets)t=`FETCH NEXT ${this._parent._limits} ROWS ONLY`;return{text:t,values:[]}}},this.TopBlock=class extends this.ParentBlock{top;constructor(t){super(t);this.top=$}_toParamString(){let t="";if(this._parent._limits&&!this._parent._offsets)t=`TOP (${this._parent._limits})`;return{text:t,values:[]}}},this.OffsetBlock=class extends this.ParentBlock{offset(t){this._parent._offsets=this._sanitizeLimitOffset(t)}_toParamString(){let t="";if(this._parent._offsets)t=`OFFSET ${this._parent._offsets} ROWS`;return{text:t,values:[]}}}}LIMIT(){return new this.LimitBlock(this)}TOP(){return new this.TopBlock(this)}OFFSET(){return new this.OffsetBlock(this)}},n.MssqlUpdateTopBlock=class extends n.Block{_limits;limit;top;constructor(e){super(e);this._limits=null;let t=(r)=>{this._limits=this._sanitizeLimitOffset(r)};this.limit=t,this.top=t}_toParamString(){return{text:this._limits?`TOP (${this._limits})`:"",values:[]}}},n.MssqlInsertFieldValueBlock=class extends n.InsertFieldValueBlock{_outputs;constructor(e){super(e);this._outputs=[]}outputs(e){for(let t in e)this.output(t,e[t])}output(e,t=null){if(typeof e==="string")e=this._sanitizeField(e),t=t?this._sanitizeFieldAlias(t):t,this._outputs.push({name:`INSERTED.${e}`,alias:t});else if(Array.isArray(e))e.forEach((r)=>{this.output(r)})}_toParamString(e){let t=super._toParamString(e);if(t.text.length&&this._outputs.length>0){let s=`OUTPUT ${this._outputs.map((i)=>{let o=i.name;if(i.alias)o+=` AS ${this._formatFieldAlias(i.alias)}`;return o}).join(", ")} `,l=t.text.indexOf("VALUES");t.text=t.text.substring(0,l)+s+t.text.substring(l)}return t}},n.MssqlUpdateDeleteOutputBlock=class extends n.Block{_outputs;constructor(e){super(e);this._outputs=[]}outputs(e){for(let t in e)this.output(t,e[t])}output(e,t=null){e=this._sanitizeField(e),t=t?this._sanitizeFieldAlias(t):t,this._outputs.push({name:this.options.forDelete?`DELETED.${e}`:`INSERTED.${e}`,alias:t})}_toParamString(e){let t="";if(this._outputs.length){for(let r of this._outputs)if(t=_(t,", "),t+=r.name,r.alias)t+=` AS ${this._formatFieldAlias(r.alias)}`;t=`OUTPUT ${t}`}return{text:t,values:[]}}},n.Select=class extends n.QueryBuilder{constructor(e,t=null){let r=new n.MssqlLimitOffsetTopBlock(e);t=t||[new n.WithBlock(e),new n.StringBlock(e,"SELECT"),new n.DistinctBlock(e),r.TOP(),new n.GetFieldBlock(e),new n.FromTableBlock(e),new n.JoinBlock(e),new n.WhereBlock(e),new n.GroupByBlock(e),new n.HavingBlock(e),new n.OrderByBlock(e),r.OFFSET(),r.LIMIT(),new n.UnionBlock(e)];super(e,t)}},n.Update=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"UPDATE"),new n.MssqlUpdateTopBlock(e),new n.UpdateTableBlock(e),new n.SetFieldBlock(e),new n.MssqlUpdateDeleteOutputBlock(e),new n.WhereBlock(e)];super(e,t)}},n.Delete=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"DELETE"),new n.TargetTableBlock(e),new n.FromTableBlock(m({},e,{singleTable:!0})),new n.JoinBlock(e),new n.MssqlUpdateDeleteOutputBlock(m({},e,{forDelete:!0})),new n.WhereBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e)];super(e,t)}},n.Insert=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"INSERT"),new n.IntoTableBlock(e),new n.MssqlInsertFieldValueBlock(e),new n.InsertFieldsFromQueryBlock(e)];super(e,t)}},n.MergeIntoBlock=class extends n.Block{_table=null;_alias=null;into(e,t=null){this._table=this._sanitizeTable(e),this._alias=t?this._sanitizeTableAlias(t):null}_toParamString(){if(!this._table)throw Error("into() needs to be called");let e=this._formatTableName(this._table);if(this._alias)e+=` AS ${this._formatTableAlias(this._alias)}`;return{text:e,values:[]}}},n.MergeUsingBlock=class extends n.Block{_source=null;_alias=null;_condition=null;using(e,t=null,r=null){this._source=typeof e==="string"?this._sanitizeTable(e):this._sanitizeBaseBuilder(e),this._alias=t?this._sanitizeTableAlias(t):null,this._condition=r?this._sanitizeExpression(r):null}_toParamString(e={}){if(!this._source)throw Error("using() needs to be called");let t="",r=[];if(typeof this._source==="string")t=this._formatTableName(this._source);else{let l=this._source._toParamString({buildParameterized:e.buildParameterized,nested:!0});t=l.text,l.values.forEach((i)=>r.push(i))}if(this._alias)t+=` AS ${this._formatTableAlias(this._alias)}`;let s="";if(this._condition){let l;if(typeof this._condition==="string")l=this._buildString(this._condition,[],{buildParameterized:e.buildParameterized});else l=this._condition._toParamString({buildParameterized:e.buildParameterized});s=` ON ${this._applyNestingFormatting(l.text)}`,l.values.forEach((i)=>r.push(i))}return{text:`USING ${t}${s}`,values:r}}};class h{builder;clause;constructor(e,t){this.builder=e;this.clause=t}update(e){return this.clause.action={type:"UPDATE",fields:e},this.builder}delete(){return this.clause.action={type:"DELETE"},this.builder}}class a{builder;clause;constructor(e,t){this.builder=e;this.clause=t}insert(e){return this.clause.action={type:"INSERT",fields:e},this.builder}}n.MergeWhenBlock=class extends n.Block{_clauses;constructor(e){super(e);this._clauses=[]}whenMatched(e=null){let t={type:"MATCHED",condition:e,action:null};return this._clauses.push(t),new h(this._queryBuilder,t)}whenNotMatched(e=null){let t={type:"NOT_MATCHED",condition:e,action:null};return this._clauses.push(t),new a(this._queryBuilder,t)}_toParamString(e={}){let t="",r=[];for(let s of this._clauses){if(!s.action)continue;t=_(t," ");let l="";if(s.condition){let u=this._buildString(s.condition,[],{buildParameterized:e.buildParameterized});l=` AND ${u.text}`,u.values.forEach((d)=>r.push(d))}let i="";if(s.action.type==="UPDATE"){let u="";for(let d of Object.keys(s.action.fields)){u=_(u,", ");let y=s.action.fields[d];if(y&&typeof y._toParamString==="function"){let f=y._toParamString({buildParameterized:e.buildParameterized});u+=`${this._formatFieldName(d)} = ${f.text}`,f.values.forEach((p)=>r.push(p))}else{let f=this._buildString(`${this._formatFieldName(d)} = ${this.options.parameterCharacter}`,[y],{buildParameterized:e.buildParameterized});u+=f.text,f.values.forEach((p)=>r.push(p))}}i=`THEN UPDATE SET ${u}`}else if(s.action.type==="DELETE")i="THEN DELETE";else if(s.action.type==="INSERT"){let u=Object.keys(s.action.fields).map((y)=>this._formatFieldName(y)).join(", "),d="";for(let y of Object.keys(s.action.fields)){d=_(d,", ");let f=s.action.fields[y];if(f&&typeof f._toParamString==="function"){let p=f._toParamString({buildParameterized:e.buildParameterized});d+=p.text,p.values.forEach((w)=>r.push(w))}else{let p=this._buildString(this.options.parameterCharacter,[f],{buildParameterized:e.buildParameterized});d+=p.text,p.values.forEach((w)=>r.push(w))}}i=`THEN INSERT (${u}) VALUES (${d})`}let o=s.type==="MATCHED"?"WHEN MATCHED":"WHEN NOT MATCHED";t+=`${o}${l} ${i}`}return{text:t.length?`${t};`:"",values:r}}},n.Merge=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"MERGE INTO"),new n.MergeIntoBlock(e),new n.MergeUsingBlock(e),new n.MergeWhenBlock(e)];super(e,t)}},c.merge=(e,t)=>new n.Merge(e,t)};var H=S;})();
1
+ (()=>{var{defineProperty:k,getOwnPropertyNames:z,getOwnPropertyDescriptor:A}=Object,Q=Object.prototype.hasOwnProperty;function V(c){return this[c]}var q=(c)=>{var n=(P??=new WeakMap).get(c),h;if(n)return n;if(n=k({},"__esModule",{value:!0}),c&&typeof c==="object"||typeof c==="function"){for(var a of z(c))if(!Q.call(n,a))k(n,a,{get:V.bind(c,a),enumerable:!(h=A(c,a))||h.enumerable})}return P.set(c,n),n},P;var C=(c)=>c;function D(c,n){this[c]=C.bind(null,n)}var R=(c,n)=>{for(var h in n)k(c,h,{get:n[h],enumerable:!0,configurable:!0,set:D.bind(n,h)})};var U={};R(U,{squel:()=>S,default:()=>H});var v={name:"squel",version:"6.3.0",description:"SQL query string builder",keywords:["sql","database","rdbms","query-builder","mysql","postgres","mssql"],author:"Ramesh Nair <ram@hiddentao.com> (http://www.hiddentao.com/)",contributors:["Ramesh Nair <ram@hiddentao.com> (http://www.hiddentao.com/)","Sergej Brjuchanov <serges@seznam.cz>"],license:"MIT",repository:{type:"git",url:"https://github.com/hiddentao/squel.git"},homepage:"https://github.com/hiddentao/squel",bugs:{url:"https://github.com/hiddentao/squel/issues"},type:"module",main:"./dist/cjs/index.js",module:"./dist/esm/index.js",types:"./dist/types/index.d.ts",exports:{".":{types:"./dist/types/index.d.ts",import:"./dist/esm/index.js",require:"./dist/cjs/index.js"},"./browser":"./dist/browser/squel.min.js"},files:["dist","README.md","LICENSE.md","CHANGELOG.md"],engines:{node:">=18.0.0"},publishConfig:{access:"public",provenance:!0},scripts:{build:"bun run scripts/build.ts",test:"bun test","test:coverage":"bun test --coverage --coverage-reporter=lcov","test:watch":"bun test --watch",lint:"biome check --write ./src ./tests ./scripts",format:"biome format --write ./src ./tests ./scripts",check:"biome check ./src ./tests ./scripts",typecheck:"tsc --noEmit",prepare:"husky",prepublishOnly:"bun run build && bun run test"},dependencies:{},devDependencies:{"@biomejs/biome":"^1.9.4","@commitlint/cli":"^19.8.1","@commitlint/config-conventional":"^19.8.1","@types/bun":"latest","@types/node":"^22.0.0","commit-and-tag-version":"^12.6.0",husky:"^9.1.7",typescript:"^5.3.0"}};function p(c,n){return c.length?c+n:c}function m(c,...n){if(c&&n){for(let h of n)if(h&&typeof h==="object")for(let a of Object.getOwnPropertyNames(h))c[a]=h[a]}return c}function x(c){return!!c&&c.constructor.prototype===Object.prototype}function B(c){return!!c&&c.constructor.prototype===Array.prototype}function F(c){if(!c)return c;let n=c;if(typeof n.clone==="function")return n.clone();if(x(c)||B(c)){let h=new n.constructor;for(let a of Object.getOwnPropertyNames(c))if(typeof n[a]!=="function"&&a!=="_queryBuilder")h[a]=F(n[a]);return h}return JSON.parse(JSON.stringify(c))}function O(c,n,h){let a=typeof n;if(a!=="function"&&a!=="string")throw Error("type must be a class constructor or string");if(typeof h!=="function")throw Error("handler must be a function");for(let e of c)if(e.type===n){e.handler=h;return}c.push({type:n,handler:h})}function T(c,n,h){return E(c,n)||E(c,h)}function E(c,n){for(let h of n)if(typeof c===h.type||typeof h.type!=="string"&&c instanceof h.type)return h.handler;return}function N(c=null){let n={isSquelBuilder(e){return!!e&&!!e._toParamString}},h=(e)=>{return!n.isSquelBuilder(e)||!e.options.rawNesting};n.DefaultQueryBuilderOptions={autoQuoteTableNames:!1,autoQuoteFieldNames:!1,autoQuoteAliasNames:!0,useAsForTableAliasNames:!1,nameQuoteCharacter:"`",tableAliasQuoteCharacter:"`",fieldAliasQuoteCharacter:'"',valueHandlers:[],parameterCharacter:"?",numberedParameters:!1,numberedParametersPrefix:"$",numberedParametersStartAt:1,replaceSingleQuotes:!1,singleQuoteReplacement:"''",separator:" ",stringFormatter:null,rawNesting:!1},n.globalValueHandlers=[],n.registerValueHandler=(e,t)=>{O(n.globalValueHandlers,e,t)},n.Cloneable=class{clone(){let e=new this.constructor;return m(e,F(m({},this)))}},n.BaseBuilder=class extends n.Cloneable{options;constructor(e){super();let t=JSON.parse(JSON.stringify(n.DefaultQueryBuilderOptions));t.stringFormatter=n.DefaultQueryBuilderOptions.stringFormatter,this.options=m(t,e)}registerValueHandler(e,t){return O(this.options.valueHandlers,e,t),this}_sanitizeExpression(e){if(!n.isSquelBuilder(e)){if(typeof e!=="string")throw Error("expression must be a string or builder instance")}return e}_sanitizeName(e,t){if(typeof e!=="string")throw Error(`${t} must be a string`);return e}_sanitizeField(e){if(!n.isSquelBuilder(e))return this._sanitizeName(e,"field name");return e}_sanitizeBaseBuilder(e){if(n.isSquelBuilder(e))return e;throw Error("must be a builder instance")}_sanitizeTable(e,t){if(typeof e!=="string")try{return this._sanitizeBaseBuilder(e)}catch(r){throw Error("table name must be a string or a builder")}return this._sanitizeName(e,"table")}_sanitizeTableAlias(e){return this._sanitizeName(e,"table alias")}_sanitizeFieldAlias(e){return this._sanitizeName(e,"field alias")}_sanitizeLimitOffset(e){let t=Number.parseInt(e,10);if(t<0||Number.isNaN(t))throw Error("limit/offset must be >= 0");return t}_sanitizeValue(e){let t=typeof e;if(e===null);else if(t==="string"||t==="number"||t==="boolean");else if(n.isSquelBuilder(e));else if(!T(e,this.options.valueHandlers,n.globalValueHandlers))throw Error("field value must be a string, number, boolean, null or one of the registered custom value types");return e}_escapeValue(e){return this.options.replaceSingleQuotes&&e?e.replace(/'/g,this.options.singleQuoteReplacement):e}_formatTableName(e){if(this.options.autoQuoteTableNames){let t=this.options.nameQuoteCharacter;e=`${t}${e}${t}`}return e}_formatFieldAlias(e){if(this.options.autoQuoteAliasNames){let t=this.options.fieldAliasQuoteCharacter;e=`${t}${e}${t}`}return e}_formatTableAlias(e){if(this.options.autoQuoteAliasNames){let t=this.options.tableAliasQuoteCharacter;e=`${t}${e}${t}`}return this.options.useAsForTableAliasNames?`AS ${e}`:e}_formatFieldName(e,t={}){if(this.options.autoQuoteFieldNames){let r=this.options.nameQuoteCharacter;if(t.ignorePeriodsForFieldNameQuotes)e=`${r}${e}${r}`;else e=e.split(".").map((s)=>s==="*"?s:`${r}${s}${r}`).join(".")}return e}_formatCustomValue(e,t,r){let s=T(e,this.options.valueHandlers,n.globalValueHandlers);if(s){if(e=s(e,t,r),e?.rawNesting)return{formatted:!0,rawNesting:!0,value:e.value}}return{formatted:!!s,value:e}}_formatValueForParamArray(e,t={}){if(B(e))return e.map((r)=>this._formatValueForParamArray(r,t));return this._formatCustomValue(e,!0,t).value}_formatValueForQueryString(e,t={}){let{rawNesting:r,formatted:s,value:l}=this._formatCustomValue(e,!1,t),i=l;if(s){if(r)return i;return this._applyNestingFormatting(i,h(e))}if(B(i))i=i.map((o)=>this._formatValueForQueryString(o)),i=this._applyNestingFormatting(i.join(", "),h(i));else{let o=typeof i;if(i===null)i="NULL";else if(o==="boolean")i=i?"TRUE":"FALSE";else if(n.isSquelBuilder(i))i=this._applyNestingFormatting(i.toString(),h(i));else if(o!=="number"){if(o==="string"&&this.options.stringFormatter)return this.options.stringFormatter(i);if(t.dontQuote)i=`${i}`;else i=`'${this._escapeValue(i)}'`}}return i}_applyNestingFormatting(e,t=!0){if(e&&typeof e==="string"&&t&&!this.options.rawNesting){let r=e.startsWith("(")&&e.endsWith(")");if(r){let s=0,l=1;while(e.length-1>++s){let i=e.charAt(s);if(i==="(")l++;else if(i===")"){if(l--,l<1){r=!1;break}}}}if(!r)e=`(${e})`}return e}_buildString(e,t,r={}){let{nested:s,buildParameterized:l,formattingOptions:i}=r;t=t||[],e=e||"";let o="",u=-1,d=[],y=this.options.parameterCharacter,f=0;while(e.length>f)if(e.substring(f,f+y.length)===y){let _=t[++u];if(l)if(n.isSquelBuilder(_)){let w=_._toParamString({buildParameterized:l,nested:!0});o+=w.text,w.values.forEach((b)=>d.push(b))}else if(_=this._formatValueForParamArray(_,i),B(_)){let w=_.map(()=>y).join(", ");o+=`(${w})`,_.forEach((b)=>d.push(b))}else o+=y,d.push(_);else o+=this._formatValueForQueryString(_,i);f+=y.length}else o+=e.charAt(f),f++;return{text:this._applyNestingFormatting(o,!!s),values:d}}_buildManyStrings(e,t,r={}){let s=[],l=[];for(let o=0;e.length>o;++o){let u=e[o],d=t[o],{text:y,values:f}=this._buildString(u,d,{buildParameterized:r.buildParameterized,nested:!1});s.push(y),f.forEach((_)=>l.push(_))}let i=s.join(this.options.separator);return{text:i.length?this._applyNestingFormatting(i,!!r.nested):"",values:l}}_toParamString(e){throw Error("Not yet implemented")}toString(e={}){return this._toParamString(e).text}toParam(e={}){return this._toParamString({...e,buildParameterized:!0})}},n.Expression=class extends n.BaseBuilder{_nodes;constructor(e){super(e);this._nodes=[]}and(e,...t){return e=this._sanitizeExpression(e),this._nodes.push({type:"AND",expr:e,para:t}),this}or(e,...t){return e=this._sanitizeExpression(e),this._nodes.push({type:"OR",expr:e,para:t}),this}_toParamString(e={}){let t=[],r=[];for(let s of this._nodes){let{type:l,expr:i,para:o}=s,{text:u,values:d}=n.isSquelBuilder(i)?i._toParamString({buildParameterized:e.buildParameterized,nested:!0}):this._buildString(i,o,{buildParameterized:e.buildParameterized});if(t.length)t.push(l);t.push(u),d.forEach((y)=>r.push(y))}return t=t.join(" "),{text:this._applyNestingFormatting(t,!!e.nested),values:r}}},n.Case=class extends n.BaseBuilder{_fieldName=null;_cases;_elseValue=null;constructor(e,t={}){super(t);let r=null;if(x(e))t=e;else if(e)r=this._sanitizeField(e);this._fieldName=r,this.options=m({...n.DefaultQueryBuilderOptions},t),this._cases=[]}when(e,...t){return this._cases.unshift({expression:e,values:t||[]}),this}then(e){if(this._cases.length===0)throw Error("when() needs to be called first");return this._cases[0].result=e,this}else(e){return this._elseValue=e,this}_toParamString(e={}){let t="",r=[];for(let{expression:s,values:l,result:i}of this._cases){t=p(t," ");let o=this._buildString(s,l,{buildParameterized:e.buildParameterized,nested:!0});t+=`WHEN ${o.text} THEN ${this._formatValueForQueryString(i)}`,o.values.forEach((u)=>r.push(u))}if(t.length){if(t+=` ELSE ${this._formatValueForQueryString(this._elseValue)} END`,this._fieldName)t=`${this._fieldName} ${t}`;t=`CASE ${t}`}else t=this._formatValueForQueryString(this._elseValue);return{text:t,values:r}}},n.Over=class extends n.BaseBuilder{_funcExpr;_funcParams;_partitionFields;_orderFields;_rows;_range;constructor(e,t=[],r){super(r);this._funcExpr=e,this._funcParams=t||[],this._partitionFields=[],this._orderFields=[],this._rows=null,this._range=null}partitionBy(...e){let t=[];for(let r of e)if(B(r))t=t.concat(r);else t.push(r);for(let r of t)this._partitionFields.push(this._sanitizeField(r));return this}orderBy(e,t,...r){e=this._sanitizeField(e);let s;if(typeof t==="string")s=t;else if(t===void 0)s="ASC";else if(t===null)s=null;else s=t?"ASC":"DESC";return this._orderFields.push({field:e,dir:s,values:r||[]}),this}rowsBetween(e,t){if(t===void 0)this._rows=`ROWS BETWEEN ${e}`;else this._rows=`ROWS BETWEEN ${e} AND ${t}`;return this._range=null,this}rangeBetween(e,t){if(t===void 0)this._range=`RANGE BETWEEN ${e}`;else this._range=`RANGE BETWEEN ${e} AND ${t}`;return this._rows=null,this}_toParamString(e={}){let t=[],r;if(n.isSquelBuilder(this._funcExpr))r=this._funcExpr._toParamString({buildParameterized:e.buildParameterized});else r=this._buildString(this._funcExpr,this._funcParams,{buildParameterized:e.buildParameterized});r.values.forEach((i)=>t.push(i));let s="";if(this._partitionFields.length>0){let i="";for(let o of this._partitionFields)if(i=p(i,", "),n.isSquelBuilder(o)){let u=o._toParamString({buildParameterized:e.buildParameterized});i+=u.text,u.values.forEach((d)=>t.push(d))}else i+=this._formatFieldName(o);s=`PARTITION BY ${i}`}if(this._orderFields.length>0){let i="";for(let{field:o,dir:u,values:d}of this._orderFields){i=p(i,", ");let y;if(n.isSquelBuilder(o))y=o._toParamString({buildParameterized:e.buildParameterized});else y=this._buildString(o,d,{buildParameterized:e.buildParameterized});if(i+=y.text,y.values.forEach((f)=>t.push(f)),u!==null)i+=` ${u}`}s=p(s," ")+`ORDER BY ${i}`}let l=this._rows||this._range;if(l)s=p(s," ")+l;return{text:`${r.text} OVER (${s})`,values:t}}},n.JsonExtract=class extends n.BaseBuilder{_field;_path;constructor(e,t,r){super(r);this._field=e,this._path=t}_toParamString(e={}){let t=[],r="";if(n.isSquelBuilder(this._field)){let o=this._field._toParamString({buildParameterized:e.buildParameterized});r=o.text,o.values.forEach((u)=>t.push(u))}else r=this._formatFieldName(this._field);let s=this._path;if(s.startsWith("$"))s=s.slice(1);if(s.startsWith("."))s=s.slice(1);let l=s.split(".").filter(Boolean),i="";if(c==="postgres")if(l.length===0)i=r;else{i=r;for(let o=0;o<l.length;o++){let u=o===l.length-1?"->>":"->";i+=`${u}'${l[o]}'`}}else if(c==="mssql")i=`JSON_VALUE(${r}, '${this._path}')`;else i=`json_extract(${r}, '${this._path}')`;return{text:i,values:t}}},n.Block=class extends n.BaseBuilder{constructor(e){super(e)}exposedMethods(){let e={},t=this;while(t){for(let r of Object.getOwnPropertyNames(t))if(r!=="constructor"&&typeof t[r]==="function"&&!r.startsWith("_")&&!n.Block.prototype[r])e[r]=t[r];t=Object.getPrototypeOf(t)}return e}},n.StringBlock=class extends n.Block{_str;constructor(e,t){super(e);this._str=t}_toParamString(e={}){return{text:this._str,values:[]}}},n.FunctionBlock=class extends n.Block{_strings;_values;constructor(e){super(e);this._strings=[],this._values=[]}function(e,...t){this._strings.push(e),this._values.push(t)}_toParamString(e={}){return this._buildManyStrings(this._strings,this._values,e)}},n.registerValueHandler(n.FunctionBlock,(e,t=!1)=>{return t?e.toParam():e.toString()}),n.AbstractTableBlock=class extends n.Block{_tables;constructor(e,t){super(e);this._tables=[]}_table(e,t=null){if(t=t?this._sanitizeTableAlias(t):t,e=this._sanitizeTable(e),this.options.singleTable)this._tables=[];this._tables.push({table:e,alias:t})}_hasTable(){return this._tables.length>0}_toParamString(e={}){let t="",r=[];if(this._hasTable()){for(let{table:s,alias:l}of this._tables){t=p(t,", ");let i;if(n.isSquelBuilder(s)){let{text:o,values:u}=s._toParamString({buildParameterized:e.buildParameterized,nested:!0});i=o,u.forEach((d)=>r.push(d))}else i=this._formatTableName(s);if(l)i+=` ${this._formatTableAlias(l)}`;t+=i}if(this.options.prefix)t=`${this.options.prefix} ${t}`}return{text:t,values:r}}},n.TargetTableBlock=class extends n.AbstractTableBlock{target(e){this._table(e)}},n.UpdateTableBlock=class extends n.AbstractTableBlock{table(e,t=null){this._table(e,t)}_toParamString(e={}){if(!this._hasTable())throw Error("table() needs to be called");return super._toParamString(e)}},n.FromTableBlock=class extends n.AbstractTableBlock{constructor(e){super(m({},e,{prefix:"FROM"}))}from(e,t=null){this._table(e,t)}},n.IntoTableBlock=class extends n.AbstractTableBlock{constructor(e){super(m({},e,{prefix:"INTO",singleTable:!0}))}into(e){this._table(e)}_toParamString(e={}){if(!this._hasTable())throw Error("into() needs to be called");return super._toParamString(e)}},n.GetFieldBlock=class extends n.Block{_fields;constructor(e){super(e);this._fields=[]}fields(e,t={}){if(B(e))for(let r of e)this.field(r,null,t);else for(let r in e){let s=e[r];this.field(r,s,t)}}field(e,t=null,r={}){if(t=t?this._sanitizeFieldAlias(t):t,e=this._sanitizeField(e),this._fields.filter((l)=>l.name===e&&l.alias===t).length)return this;this._fields.push({name:e,alias:t,options:r});return}_toParamString(e={}){let{queryBuilder:t,buildParameterized:r}=e,s="",l=[];for(let i of this._fields){s=p(s,", ");let{name:o,alias:u,options:d}=i;if(typeof o==="string")s+=this._formatFieldName(o,d);else{let y=o._toParamString({nested:!0,buildParameterized:r});s+=y.text,y.values.forEach((f)=>l.push(f))}if(u)s+=` AS ${this._formatFieldAlias(u)}`}if(!s.length){if(t?.getBlock(n.FromTableBlock)?._hasTable())s="*"}return{text:s,values:l}}},n.AbstractSetFieldBlock=class extends n.Block{_fields;_values;_valueOptions;constructor(e){super(e);this._fields=[],this._values=[[]],this._valueOptions=[[]]}_reset(){this._fields=[],this._values=[[]],this._valueOptions=[[]]}_set(e,t,r={}){if(this._values.length>1)throw Error("Cannot set multiple rows of fields this way.");if(typeof t<"u")t=this._sanitizeValue(t);e=this._sanitizeField(e);let s=this._fields.indexOf(e);if(s===-1)this._fields.push(e),s=this._fields.length-1;this._values[0][s]=t,this._valueOptions[0][s]=r}_setFields(e,t={}){if(typeof e!=="object")throw Error(`Expected an object but got ${typeof e}`);for(let r in e)this._set(r,e[r],t)}_setFieldsRows(e,t={}){if(!B(e))throw Error(`Expected an array of objects but got ${typeof e}`);this._reset();for(let r=0;e.length>r;++r){let s=e[r];for(let l in s){let i=s[l];l=this._sanitizeField(l),i=this._sanitizeValue(i);let o=this._fields.indexOf(l);if(r>0&&o===-1)throw Error("All fields in subsequent rows must match the fields in the first row");if(o===-1)this._fields.push(l),o=this._fields.length-1;if(!B(this._values[r]))this._values[r]=[],this._valueOptions[r]=[];this._values[r][o]=i,this._valueOptions[r][o]=t}}}},n.SetFieldBlock=class extends n.AbstractSetFieldBlock{set(e,t,r){this._set(e,t,r)}setFields(e,t){this._setFields(e,t)}_toParamString(e={}){let{buildParameterized:t}=e;if(this._fields.length<=0)throw Error("set() needs to be called");let r="",s=[];for(let l=0;l<this._fields.length;++l){r=p(r,", ");let i=this._formatFieldName(this._fields[l]),o=this._values[0][l];if(i.indexOf("=")<0)i=`${i} = ${this.options.parameterCharacter}`;let u=this._buildString(i,[o],{buildParameterized:t,formattingOptions:this._valueOptions[0][l]});r+=u.text,u.values.forEach((d)=>s.push(d))}return{text:`SET ${r}`,values:s}}},n.InsertFieldValueBlock=class extends n.AbstractSetFieldBlock{set(e,t,r={}){this._set(e,t,r)}setFields(e,t){this._setFields(e,t)}setFieldsRows(e,t){this._setFieldsRows(e,t)}_toParamString(e={}){let{buildParameterized:t}=e,r=this._fields.map((i)=>this._formatFieldName(i)).join(", "),s=[],l=[];for(let i=0;i<this._values.length;++i){s[i]="";for(let o=0;o<this._values[i].length;++o){let u=this._buildString(this.options.parameterCharacter,[this._values[i][o]],{buildParameterized:t,formattingOptions:this._valueOptions[i][o]});u.values.forEach((d)=>l.push(d)),s[i]=p(s[i],", "),s[i]+=u.text}}return{text:r.length?`(${r}) VALUES (${s.join("), (")})`:"",values:l}}},n.InsertFieldsFromQueryBlock=class extends n.Block{_fields;_query=null;constructor(e){super(e);this._fields=[]}fromQuery(e,t){this._fields=e.map((r)=>this._sanitizeField(r)),this._query=this._sanitizeBaseBuilder(t)}_toParamString(e={}){let t="",r=[];if(this._fields.length&&this._query){let{text:s,values:l}=this._query._toParamString({buildParameterized:e.buildParameterized,nested:!0});t=`(${this._fields.join(", ")}) ${this._applyNestingFormatting(s)}`,r=l}return{text:t,values:r}}},n.DistinctBlock=class extends n.Block{_useDistinct=!1;distinct(){this._useDistinct=!0}_toParamString(){return{text:this._useDistinct?"DISTINCT":"",values:[]}}},n.GroupByBlock=class extends n.Block{_groups;constructor(e){super(e);this._groups=[]}group(e){this._groups.push(this._sanitizeField(e))}_toParamString(e={}){return{text:this._groups.length?`GROUP BY ${this._groups.join(", ")}`:"",values:[]}}},n.AbstractVerbSingleValueBlock=class extends n.Block{_value=null;constructor(e){super(e)}_setValue(e){this._value=e!==null?this._sanitizeLimitOffset(e):e}_toParamString(e={}){let t=this._value!==null?`${this.options.verb} ${this.options.parameterCharacter}`:"",r=this._value!==null?[this._value]:[];return this._buildString(t,r,e)}},n.OffsetBlock=class extends n.AbstractVerbSingleValueBlock{constructor(e){super(m({},e,{verb:"OFFSET"}))}offset(e){this._setValue(e)}},n.LimitBlock=class extends n.AbstractVerbSingleValueBlock{constructor(e){super(m({},e,{verb:"LIMIT"}))}limit(e){this._setValue(e)}},n.AbstractConditionBlock=class extends n.Block{_conditions;constructor(e){super(e);this._conditions=[]}_condition(e,...t){e=this._sanitizeExpression(e),this._conditions.push({expr:e,values:t||[]})}_toParamString(e={}){let t=[],r=[];for(let{expr:l,values:i}of this._conditions){let o=n.isSquelBuilder(l)?l._toParamString({buildParameterized:e.buildParameterized}):this._buildString(l,i,{buildParameterized:e.buildParameterized});if(o.text.length)t.push(o.text);o.values.forEach((u)=>r.push(u))}let s=t.join(") AND (");return{text:s.length?`${this.options.verb} (${s})`:"",values:r}}},n.WhereBlock=class extends n.AbstractConditionBlock{constructor(e){super(m({},e,{verb:"WHERE"}))}where(e,...t){this._condition(e,...t)}},n.HavingBlock=class extends n.AbstractConditionBlock{constructor(e){super(m({},e,{verb:"HAVING"}))}having(e,...t){this._condition(e,...t)}},n.OrderByBlock=class extends n.Block{_orders;constructor(e){super(e);this._orders=[]}order(e,t,...r){e=this._sanitizeField(e);let s;if(typeof t==="string")s=t;else if(t===void 0)s="ASC";else if(t===null)s=null;else s=t?"ASC":"DESC";this._orders.push({field:e,dir:s,values:r||[]})}_toParamString(e={}){let t="",r=[];for(let{field:s,dir:l,values:i}of this._orders){t=p(t,", ");let o=this._buildString(s,i,{buildParameterized:e.buildParameterized});if(t+=o.text,B(o.values))o.values.forEach((u)=>r.push(u));if(l!==null)t+=` ${l}`}return{text:t.length?`ORDER BY ${t}`:"",values:r}}},n.JoinBlock=class extends n.Block{_joins;constructor(e){super(e);this._joins=[]}join(e,t=null,r=null,s="INNER"){e=this._sanitizeTable(e,!0),t=t?this._sanitizeTableAlias(t):t,r=r?this._sanitizeExpression(r):r,this._joins.push({type:s,table:e,alias:t,condition:r})}left_join(e,t=null,r=null){this.join(e,t,r,"LEFT")}right_join(e,t=null,r=null){this.join(e,t,r,"RIGHT")}outer_join(e,t=null,r=null){this.join(e,t,r,"OUTER")}left_outer_join(e,t=null,r=null){this.join(e,t,r,"LEFT OUTER")}full_join(e,t=null,r=null){this.join(e,t,r,"FULL")}cross_join(e,t=null,r=null){this.join(e,t,r,"CROSS")}_toParamString(e={}){let t="",r=[];for(let{type:s,table:l,alias:i,condition:o,isApply:u}of this._joins){t=p(t,this.options.separator);let d;if(n.isSquelBuilder(l)){let y=l._toParamString({buildParameterized:e.buildParameterized,nested:!0});y.values.forEach((f)=>r.push(f)),d=y.text}else d=this._formatTableName(l);if(u)t+=`${s} ${d}`;else t+=`${s} JOIN ${d}`;if(i)t+=` ${this._formatTableAlias(i)}`;if(o){t+=" ON ";let y;if(n.isSquelBuilder(o))y=o._toParamString({buildParameterized:e.buildParameterized});else y=this._buildString(o,[],{buildParameterized:e.buildParameterized});t+=this._applyNestingFormatting(y.text),y.values.forEach((f)=>r.push(f))}}return{text:t,values:r}}},n.UnionBlock=class extends n.Block{_unions;constructor(e){super(e);this._unions=[]}union(e,t="UNION"){e=this._sanitizeTable(e),this._unions.push({type:t,table:e})}union_all(e){this.union(e,"UNION ALL")}_toParamString(e={}){let t="",r=[];for(let{type:s,table:l}of this._unions){t=p(t,this.options.separator);let i;if(l instanceof n.BaseBuilder){let o=l._toParamString({buildParameterized:e.buildParameterized,nested:!0});i=o.text,o.values.forEach((u)=>r.push(u))}else t=this._formatTableName(l),i="";t+=`${s} ${i}`}return{text:t,values:r}}},n.ForBlock=class extends n.Block{_forStr;constructor(e){super(e);this._forStr=null}for(e){this._forStr=e}_toParamString(){return{text:this._forStr!==null?`FOR ${this._forStr}`:"",values:[]}}},n.WithBlock=class extends n.Block{_tables;constructor(e){super(e);this._tables=[]}with(e,t){this._tables.push({alias:e,table:t,recursive:!1})}withRecursive(e,t){this._tables.push({alias:e,table:t,recursive:!0})}_toParamString(e={}){let t=[],r=[],s=!1;for(let{alias:o,table:u,recursive:d}of this._tables){if(d)s=!0;let y=u._toParamString({buildParameterized:e.buildParameterized,nested:!0});t.push(`${o} AS ${y.text}`),y.values.forEach((f)=>r.push(f))}if(!t.length)return{text:"",values:[]};let l=this.options.useRecursiveKeyword===!1;return{text:`${s&&!l?"WITH RECURSIVE":"WITH"} ${t.join(", ")}`,values:r}}},n.ReturningBlock=class extends n.Block{_fields;constructor(e){super(e);this._fields=[]}returning(e,t=null,r={}){if(t=t?this._sanitizeFieldAlias(t):t,e=this._sanitizeField(e),this._fields.filter((l)=>l.name===e&&l.alias===t).length)return this;this._fields.push({name:e,alias:t,options:r})}_toParamString(e={}){let{buildParameterized:t}=e,r="",s=[];for(let l of this._fields){r=p(r,", ");let{name:i,alias:o,options:u}=l;if(typeof i==="string")r+=this._formatFieldName(i,u);else{let d=i._toParamString({nested:!0,buildParameterized:t});r+=d.text,d.values.forEach((y)=>s.push(y))}if(o)r+=` AS ${this._formatFieldAlias(o)}`}return{text:r.length>0?`RETURNING ${r}`:"",values:s}}},n.QueryBuilder=class extends n.BaseBuilder{blocks;constructor(e,t){super(e);this.blocks=t||[];for(let r of this.blocks){Object.defineProperty(r,"_queryBuilder",{value:this,enumerable:!1,writable:!0,configurable:!0});let s=r.exposedMethods();for(let l in s){let i=s[l];if(this[l]!==void 0)throw Error(`Builder already has a builder method called: ${l}`);((o,u,d)=>{this[u]=(...y)=>{let f=d.call(o,...y);if(f!==void 0&&f!==o)return f;return this}})(r,l,i)}}}registerValueHandler(e,t){for(let r of this.blocks)r.registerValueHandler(e,t);return super.registerValueHandler(e,t),this}updateOptions(e){this.options=m(this.options,e);for(let t of this.blocks)t.options=m(t.options,e)}_toParamString(e={}){let t=m({},this.options,e),r=this.blocks.map((u)=>u._toParamString({buildParameterized:t.buildParameterized,queryBuilder:this})),s=r.map((u)=>u.text),l=r.map((u)=>u.values),i=s.filter((u)=>u.length>0).join(t.separator),o=[];if(l.forEach((u)=>u.forEach((d)=>o.push(d))),!t.nested){if(t.numberedParameters){let u=t.numberedParametersStartAt!==void 0?t.numberedParametersStartAt:1,d=t.parameterCharacter.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");i=i.replace(new RegExp(d,"g"),()=>{return`${t.numberedParametersPrefix}${u++}`})}}return{text:this._applyNestingFormatting(i,!!t.nested),values:o}}clone(){let e=this.blocks.map((t)=>t.clone());return new this.constructor(this.options,e)}getBlock(e){return this.blocks.find((t)=>t instanceof e)}},n.Select=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"SELECT"),new n.FunctionBlock(e),new n.DistinctBlock(e),new n.GetFieldBlock(e),new n.FromTableBlock(e),new n.JoinBlock(e),new n.WhereBlock(e),new n.GroupByBlock(e),new n.HavingBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e),new n.OffsetBlock(e),new n.UnionBlock(e),new n.ForBlock(e)];super(e,t)}},n.Update=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"UPDATE"),new n.UpdateTableBlock(e),new n.SetFieldBlock(e),new n.WhereBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e),new n.ReturningBlock(e)];super(e,t)}},n.Delete=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"DELETE"),new n.TargetTableBlock(e),new n.FromTableBlock(m({},e,{singleTable:!0})),new n.JoinBlock(e),new n.WhereBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e),new n.ReturningBlock(e)];super(e,t)}},n.Insert=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"INSERT"),new n.IntoTableBlock(e),new n.InsertFieldValueBlock(e),new n.InsertFieldsFromQueryBlock(e),new n.ReturningBlock(e)];super(e,t)}};let a={VERSION:v.version,flavour:c,expr:(e)=>new n.Expression(e),case:(e,t)=>new n.Case(e,t),select:(e,t)=>new n.Select(e,t),update:(e,t)=>new n.Update(e,t),insert:(e,t)=>new n.Insert(e,t),delete:(e,t)=>new n.Delete(e,t),str:(...e)=>{let t=new n.FunctionBlock;return t.function(...e),t},rstr:(...e)=>{let t=new n.FunctionBlock({rawNesting:!0});return t.function(...e),t},over:(e,...t)=>new n.Over(e,t),jsonExtract:(e,t)=>new n.JsonExtract(e,t),registerValueHandler:n.registerValueHandler};return a.remove=a.delete,a.cls=n,a}var g=N();g.flavours={};g.useFlavour=function(n=null){if(!n)return g;if(g.flavours[n]instanceof Function){let h=N(n);return g.flavours[n].call(null,h),h.flavours=g.flavours,h.useFlavour=g.useFlavour,h}throw Error(`Flavour not available: ${n}`)};var S=g;g.flavours.mysql=(c)=>{let n=c.cls;class h{builder;block;constructor(a,e){this.builder=a;this.block=e}}n.MysqlOnDuplicateKeyUpdateBlock=class extends n.AbstractSetFieldBlock{onDupUpdate(a,e,t){this._set(a,e,t)}onDuplicateKeyUpdate(){let a=new h(this._queryBuilder,this);return new Proxy(a,{get(e,t,r){if(t==="set")return(l,i,o)=>{return e.block._set(l,i,o),r};let s=e.builder[t];if(typeof s==="function")return(...l)=>{let i=s.apply(e.builder,l);return i===e.builder?r:i};return s}})}_toParamString(a={}){let e="",t=[];for(let r=0;r<this._fields.length;++r){e=p(e,", ");let s=this._fields[r],l=this._values[0][r],i=this._valueOptions[0][r];if(typeof l>"u")e+=s;else{let o=this._buildString(`${s} = ${this.options.parameterCharacter}`,[l],{buildParameterized:a.buildParameterized,formattingOptions:i});e+=o.text,o.values.forEach((u)=>t.push(u))}}return{text:!e.length?"":`ON DUPLICATE KEY UPDATE ${e}`,values:t}}},n.Insert=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"INSERT"),new n.IntoTableBlock(a),new n.InsertFieldValueBlock(a),new n.InsertFieldsFromQueryBlock(a),new n.MysqlOnDuplicateKeyUpdateBlock(a)];super(a,e)}},n.Replace=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"REPLACE"),new n.IntoTableBlock(a),new n.InsertFieldValueBlock(a),new n.InsertFieldsFromQueryBlock(a)];super(a,e)}},c.replace=(a,e)=>new n.Replace(a,e)};g.flavours.postgres=(c)=>{let n=c.cls;n.DefaultQueryBuilderOptions.numberedParameters=!0,n.DefaultQueryBuilderOptions.numberedParametersStartAt=1,n.DefaultQueryBuilderOptions.autoQuoteAliasNames=!1,n.DefaultQueryBuilderOptions.useAsForTableAliasNames=!0;class h{builder;block;constructor(a,e){this.builder=a;this.block=e}}n.PostgresOnConflictKeyUpdateBlock=class extends n.AbstractSetFieldBlock{_onConflict;_dupFields;constructor(a){super(a);this._onConflict=!1,this._dupFields=[]}onConflict(a,e){if(this._onConflict=!0,a){if(!B(a))a=[a];this._dupFields=a.map(this._sanitizeField.bind(this))}if(e)Object.keys(e).forEach((t)=>{this._set(t,e[t])});return this._queryBuilder}doUpdate(){let a=new h(this._queryBuilder,this);return new Proxy(a,{get(e,t,r){if(t==="set")return(l,i,o)=>{return e.block._set(l,i,o),r};let s=e.builder[t];if(typeof s==="function")return(...l)=>{let i=s.apply(e.builder,l);return i===e.builder?r:i};return s}})}doNothing(){return this._onConflict=!0,this._fields=[],this._values=[[]],this._valueOptions=[[]],this._queryBuilder}_toParamString(a={}){let e="",t=[];for(let s=0;s<this._fields.length;++s){e=p(e,", ");let l=this._fields[s],i=this._values[0][s],o=this._valueOptions[0][s];if(typeof i>"u")e+=l;else{let u=this._buildString(`${l} = ${this.options.parameterCharacter}`,[i],{buildParameterized:a.buildParameterized,formattingOptions:o});e+=u.text,u.values.forEach((d)=>t.push(d))}}let r={text:"",values:t};if(this._onConflict){let s=this._dupFields.length?`(${this._dupFields.join(", ")}) `:"",l=e.length?`UPDATE SET ${e}`:"NOTHING";r.text=`ON CONFLICT ${s}DO ${l}`}return r}},n.UsingBlock=class extends n.AbstractTableBlock{constructor(a){super({...a,prefix:"USING"})}using(a,e=null){this._table(a,e)}},n.DistinctOnBlock=class extends n.Block{_useDistinct=!1;_distinctFields;constructor(a){super(a);this._distinctFields=[]}distinct(...a){this._useDistinct=!0,a.forEach((e)=>{this._distinctFields.push(this._sanitizeField(e))})}_toParamString(){let a="";if(this._useDistinct){if(a="DISTINCT",this._distinctFields.length)a+=` ON (${this._distinctFields.join(", ")})`}return{text:a,values:[]}}},n.Select=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"SELECT"),new n.FunctionBlock(a),new n.DistinctOnBlock(a),new n.GetFieldBlock(a),new n.FromTableBlock(a),new n.JoinBlock(a),new n.WhereBlock(a),new n.GroupByBlock(a),new n.HavingBlock(a),new n.OrderByBlock(a),new n.LimitBlock(a),new n.OffsetBlock(a),new n.UnionBlock(a),new n.ForBlock(a)];super(a,e)}},n.Insert=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"INSERT"),new n.IntoTableBlock(a),new n.InsertFieldValueBlock(a),new n.InsertFieldsFromQueryBlock(a),new n.PostgresOnConflictKeyUpdateBlock(a),new n.ReturningBlock(a)];super(a,e)}},n.Update=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"UPDATE"),new n.UpdateTableBlock(a),new n.SetFieldBlock(a),new n.FromTableBlock(a),new n.WhereBlock(a),new n.OrderByBlock(a),new n.LimitBlock(a),new n.ReturningBlock(a)];super(a,e)}},n.Delete=class extends n.QueryBuilder{constructor(a,e=null){e=e||[new n.WithBlock(a),new n.StringBlock(a,"DELETE"),new n.TargetTableBlock(a),new n.FromTableBlock({...a,singleTable:!0}),new n.UsingBlock(a),new n.JoinBlock(a),new n.WhereBlock(a),new n.OrderByBlock(a),new n.LimitBlock(a),new n.ReturningBlock(a)];super(a,e)}}};var $=function(c){c=this._sanitizeLimitOffset(c),this._parent._limits=c};g.flavours.mssql=(c)=>{let n=c.cls;n.DefaultQueryBuilderOptions.replaceSingleQuotes=!0,n.DefaultQueryBuilderOptions.autoQuoteAliasNames=!1,n.DefaultQueryBuilderOptions.numberedParametersPrefix="@",n.DefaultQueryBuilderOptions.useRecursiveKeyword=!1,c.registerValueHandler(Date,(e)=>{let t=e;return`'${t.getUTCFullYear()}-${t.getUTCMonth()+1}-${t.getUTCDate()} ${t.getUTCHours()}:${t.getUTCMinutes()}:${t.getUTCSeconds()}'`}),n.MssqlLimitOffsetTopBlock=class extends n.Block{_limits;_offsets;ParentBlock;LimitBlock;TopBlock;OffsetBlock;constructor(e){super(e);this._limits=null,this._offsets=null,this.ParentBlock=class extends n.Block{_parent;constructor(t){super(t.options);this._parent=t}},this.LimitBlock=class extends this.ParentBlock{limit;constructor(t){super(t);this.limit=$}_toParamString(){let t="";if(this._parent._limits&&this._parent._offsets)t=`FETCH NEXT ${this._parent._limits} ROWS ONLY`;return{text:t,values:[]}}},this.TopBlock=class extends this.ParentBlock{top;constructor(t){super(t);this.top=$}_toParamString(){let t="";if(this._parent._limits&&!this._parent._offsets)t=`TOP (${this._parent._limits})`;return{text:t,values:[]}}},this.OffsetBlock=class extends this.ParentBlock{offset(t){this._parent._offsets=this._sanitizeLimitOffset(t)}_toParamString(){let t="";if(this._parent._offsets)t=`OFFSET ${this._parent._offsets} ROWS`;return{text:t,values:[]}}}}LIMIT(){return new this.LimitBlock(this)}TOP(){return new this.TopBlock(this)}OFFSET(){return new this.OffsetBlock(this)}},n.MssqlUpdateTopBlock=class extends n.Block{_limits;limit;top;constructor(e){super(e);this._limits=null;let t=(r)=>{this._limits=this._sanitizeLimitOffset(r)};this.limit=t,this.top=t}_toParamString(){return{text:this._limits?`TOP (${this._limits})`:"",values:[]}}},n.MssqlInsertFieldValueBlock=class extends n.InsertFieldValueBlock{_outputs;constructor(e){super(e);this._outputs=[]}outputs(e){for(let t in e)this.output(t,e[t])}output(e,t=null){if(typeof e==="string")e=this._sanitizeField(e),t=t?this._sanitizeFieldAlias(t):t,this._outputs.push({name:`INSERTED.${e}`,alias:t});else if(Array.isArray(e))e.forEach((r)=>{this.output(r)})}_toParamString(e){let t=super._toParamString(e);if(t.text.length&&this._outputs.length>0){let s=`OUTPUT ${this._outputs.map((i)=>{let o=i.name;if(i.alias)o+=` AS ${this._formatFieldAlias(i.alias)}`;return o}).join(", ")} `,l=t.text.indexOf("VALUES");t.text=t.text.substring(0,l)+s+t.text.substring(l)}return t}},n.MssqlUpdateDeleteOutputBlock=class extends n.Block{_outputs;constructor(e){super(e);this._outputs=[]}outputs(e){for(let t in e)this.output(t,e[t])}output(e,t=null){e=this._sanitizeField(e),t=t?this._sanitizeFieldAlias(t):t,this._outputs.push({name:this.options.forDelete?`DELETED.${e}`:`INSERTED.${e}`,alias:t})}_toParamString(e){let t="";if(this._outputs.length){for(let r of this._outputs)if(t=p(t,", "),t+=r.name,r.alias)t+=` AS ${this._formatFieldAlias(r.alias)}`;t=`OUTPUT ${t}`}return{text:t,values:[]}}},n.MssqlJoinBlock=class extends n.JoinBlock{apply(e,t=null,r="CROSS"){e=this._sanitizeTable(e,!0),t=t?this._sanitizeTableAlias(t):t;let s=r.toUpperCase();if(!s.endsWith("APPLY"))s=`${s} APPLY`;this._joins.push({type:s,table:e,alias:t,condition:null,isApply:!0})}cross_apply(e,t=null){this.apply(e,t,"CROSS")}outer_apply(e,t=null){this.apply(e,t,"OUTER")}},n.Select=class extends n.QueryBuilder{constructor(e,t=null){let r=new n.MssqlLimitOffsetTopBlock(e);t=t||[new n.WithBlock(e),new n.StringBlock(e,"SELECT"),new n.DistinctBlock(e),r.TOP(),new n.GetFieldBlock(e),new n.FromTableBlock(e),new n.MssqlJoinBlock(e),new n.WhereBlock(e),new n.GroupByBlock(e),new n.HavingBlock(e),new n.OrderByBlock(e),r.OFFSET(),r.LIMIT(),new n.UnionBlock(e)];super(e,t)}},n.Update=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"UPDATE"),new n.MssqlUpdateTopBlock(e),new n.UpdateTableBlock(e),new n.SetFieldBlock(e),new n.MssqlUpdateDeleteOutputBlock(e),new n.WhereBlock(e)];super(e,t)}},n.Delete=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"DELETE"),new n.TargetTableBlock(e),new n.FromTableBlock(m({},e,{singleTable:!0})),new n.JoinBlock(e),new n.MssqlUpdateDeleteOutputBlock(m({},e,{forDelete:!0})),new n.WhereBlock(e),new n.OrderByBlock(e),new n.LimitBlock(e)];super(e,t)}},n.Insert=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"INSERT"),new n.IntoTableBlock(e),new n.MssqlInsertFieldValueBlock(e),new n.InsertFieldsFromQueryBlock(e)];super(e,t)}},n.MergeIntoBlock=class extends n.Block{_table=null;_alias=null;into(e,t=null){this._table=this._sanitizeTable(e),this._alias=t?this._sanitizeTableAlias(t):null}_toParamString(){if(!this._table)throw Error("into() needs to be called");let e=this._formatTableName(this._table);if(this._alias)e+=` AS ${this._formatTableAlias(this._alias)}`;return{text:e,values:[]}}},n.MergeUsingBlock=class extends n.Block{_source=null;_alias=null;_condition=null;using(e,t=null,r=null){this._source=typeof e==="string"?this._sanitizeTable(e):this._sanitizeBaseBuilder(e),this._alias=t?this._sanitizeTableAlias(t):null,this._condition=r?this._sanitizeExpression(r):null}_toParamString(e={}){if(!this._source)throw Error("using() needs to be called");let t="",r=[];if(typeof this._source==="string")t=this._formatTableName(this._source);else{let l=this._source._toParamString({buildParameterized:e.buildParameterized,nested:!0});t=l.text,l.values.forEach((i)=>r.push(i))}if(this._alias)t+=` AS ${this._formatTableAlias(this._alias)}`;let s="";if(this._condition){let l;if(typeof this._condition==="string")l=this._buildString(this._condition,[],{buildParameterized:e.buildParameterized});else l=this._condition._toParamString({buildParameterized:e.buildParameterized});s=` ON ${this._applyNestingFormatting(l.text)}`,l.values.forEach((i)=>r.push(i))}return{text:`USING ${t}${s}`,values:r}}};class h{builder;clause;constructor(e,t){this.builder=e;this.clause=t}update(e){return this.clause.action={type:"UPDATE",fields:e},this.builder}delete(){return this.clause.action={type:"DELETE"},this.builder}}class a{builder;clause;constructor(e,t){this.builder=e;this.clause=t}insert(e){return this.clause.action={type:"INSERT",fields:e},this.builder}}n.MergeWhenBlock=class extends n.Block{_clauses;constructor(e){super(e);this._clauses=[]}whenMatched(e=null){let t={type:"MATCHED",condition:e,action:null};return this._clauses.push(t),new h(this._queryBuilder,t)}whenNotMatched(e=null){let t={type:"NOT_MATCHED",condition:e,action:null};return this._clauses.push(t),new a(this._queryBuilder,t)}_toParamString(e={}){let t="",r=[];for(let s of this._clauses){if(!s.action)continue;t=p(t," ");let l="";if(s.condition){let u=this._buildString(s.condition,[],{buildParameterized:e.buildParameterized});l=` AND ${u.text}`,u.values.forEach((d)=>r.push(d))}let i="";if(s.action.type==="UPDATE"){let u="";for(let d of Object.keys(s.action.fields)){u=p(u,", ");let y=s.action.fields[d];if(y&&typeof y._toParamString==="function"){let f=y._toParamString({buildParameterized:e.buildParameterized});u+=`${this._formatFieldName(d)} = ${f.text}`,f.values.forEach((_)=>r.push(_))}else{let f=this._buildString(`${this._formatFieldName(d)} = ${this.options.parameterCharacter}`,[y],{buildParameterized:e.buildParameterized});u+=f.text,f.values.forEach((_)=>r.push(_))}}i=`THEN UPDATE SET ${u}`}else if(s.action.type==="DELETE")i="THEN DELETE";else if(s.action.type==="INSERT"){let u=Object.keys(s.action.fields).map((y)=>this._formatFieldName(y)).join(", "),d="";for(let y of Object.keys(s.action.fields)){d=p(d,", ");let f=s.action.fields[y];if(f&&typeof f._toParamString==="function"){let _=f._toParamString({buildParameterized:e.buildParameterized});d+=_.text,_.values.forEach((w)=>r.push(w))}else{let _=this._buildString(this.options.parameterCharacter,[f],{buildParameterized:e.buildParameterized});d+=_.text,_.values.forEach((w)=>r.push(w))}}i=`THEN INSERT (${u}) VALUES (${d})`}let o=s.type==="MATCHED"?"WHEN MATCHED":"WHEN NOT MATCHED";t+=`${o}${l} ${i}`}return{text:t.length?`${t};`:"",values:r}}},n.Merge=class extends n.QueryBuilder{constructor(e,t=null){t=t||[new n.WithBlock(e),new n.StringBlock(e,"MERGE INTO"),new n.MergeIntoBlock(e),new n.MergeUsingBlock(e),new n.MergeWhenBlock(e)];super(e,t)}},c.merge=(e,t)=>new n.Merge(e,t)};var H=S;})();
package/dist/cjs/index.js CHANGED
@@ -46,7 +46,7 @@ module.exports = __toCommonJS(exports_src);
46
46
  // package.json
47
47
  var package_default = {
48
48
  name: "squel",
49
- version: "6.2.1",
49
+ version: "6.3.0",
50
50
  description: "SQL query string builder",
51
51
  keywords: [
52
52
  "sql",
@@ -1260,7 +1260,7 @@ function _buildSquel(flavour = null) {
1260
1260
  _toParamString(options = {}) {
1261
1261
  let totalStr = "";
1262
1262
  const totalValues = [];
1263
- for (const { type, table, alias, condition } of this._joins) {
1263
+ for (const { type, table, alias, condition, isApply } of this._joins) {
1264
1264
  totalStr = _pad(totalStr, this.options.separator);
1265
1265
  let tableStr;
1266
1266
  if (cls.isSquelBuilder(table)) {
@@ -1273,7 +1273,11 @@ function _buildSquel(flavour = null) {
1273
1273
  } else {
1274
1274
  tableStr = this._formatTableName(table);
1275
1275
  }
1276
- totalStr += `${type} JOIN ${tableStr}`;
1276
+ if (isApply) {
1277
+ totalStr += `${type} ${tableStr}`;
1278
+ } else {
1279
+ totalStr += `${type} JOIN ${tableStr}`;
1280
+ }
1277
1281
  if (alias)
1278
1282
  totalStr += ` ${this._formatTableAlias(alias)}`;
1279
1283
  if (condition) {
@@ -2074,6 +2078,29 @@ squel.flavours.mssql = (_squel) => {
2074
2078
  return { text: totalStr, values: [] };
2075
2079
  }
2076
2080
  };
2081
+ cls.MssqlJoinBlock = class extends cls.JoinBlock {
2082
+ apply(table, alias = null, type = "CROSS") {
2083
+ table = this._sanitizeTable(table, true);
2084
+ alias = alias ? this._sanitizeTableAlias(alias) : alias;
2085
+ let applyType = type.toUpperCase();
2086
+ if (!applyType.endsWith("APPLY")) {
2087
+ applyType = `${applyType} APPLY`;
2088
+ }
2089
+ this._joins.push({
2090
+ type: applyType,
2091
+ table,
2092
+ alias,
2093
+ condition: null,
2094
+ isApply: true
2095
+ });
2096
+ }
2097
+ cross_apply(table, alias = null) {
2098
+ this.apply(table, alias, "CROSS");
2099
+ }
2100
+ outer_apply(table, alias = null) {
2101
+ this.apply(table, alias, "OUTER");
2102
+ }
2103
+ };
2077
2104
  cls.Select = class extends cls.QueryBuilder {
2078
2105
  constructor(options, blocks = null) {
2079
2106
  const limitOffsetTopBlock = new cls.MssqlLimitOffsetTopBlock(options);
@@ -2084,7 +2111,7 @@ squel.flavours.mssql = (_squel) => {
2084
2111
  limitOffsetTopBlock.TOP(),
2085
2112
  new cls.GetFieldBlock(options),
2086
2113
  new cls.FromTableBlock(options),
2087
- new cls.JoinBlock(options),
2114
+ new cls.MssqlJoinBlock(options),
2088
2115
  new cls.WhereBlock(options),
2089
2116
  new cls.GroupByBlock(options),
2090
2117
  new cls.HavingBlock(options),
@@ -2336,4 +2363,4 @@ squel.flavours.mssql = (_squel) => {
2336
2363
  // src/index.ts
2337
2364
  var src_default = core_default;
2338
2365
 
2339
- //# debugId=4D152D45BD38372364756E2164756E21
2366
+ //# debugId=5F717BC6364CC8E864756E2164756E21