sumak 0.0.4 → 0.0.5

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.
Files changed (121) hide show
  1. package/README.md +255 -5
  2. package/dist/ast/expression.d.mts +26 -0
  3. package/dist/ast/expression.mjs +140 -0
  4. package/dist/ast/nodes.d.mts +298 -0
  5. package/dist/ast/nodes.mjs +59 -0
  6. package/dist/ast/transformer.d.mts +10 -0
  7. package/dist/ast/transformer.mjs +140 -0
  8. package/dist/ast/typed-expression.d.mts +37 -0
  9. package/dist/ast/typed-expression.mjs +77 -0
  10. package/dist/ast/visitor.d.mts +13 -0
  11. package/dist/ast/visitor.mjs +11 -0
  12. package/dist/builder/delete.d.mts +18 -0
  13. package/dist/builder/delete.mjs +94 -0
  14. package/dist/builder/eb.d.mts +210 -0
  15. package/dist/builder/eb.mjs +399 -0
  16. package/dist/builder/expression.d.mts +5 -0
  17. package/dist/builder/expression.mjs +10 -0
  18. package/dist/builder/insert.d.mts +40 -0
  19. package/dist/builder/insert.mjs +146 -0
  20. package/dist/builder/merge.d.mts +20 -0
  21. package/dist/builder/merge.mjs +100 -0
  22. package/dist/builder/raw.d.mts +2 -0
  23. package/dist/builder/raw.mjs +4 -0
  24. package/dist/builder/select.d.mts +38 -0
  25. package/dist/builder/select.mjs +242 -0
  26. package/dist/builder/typed-delete.d.mts +43 -0
  27. package/dist/builder/typed-delete.mjs +77 -0
  28. package/dist/builder/typed-insert.d.mts +74 -0
  29. package/dist/builder/typed-insert.mjs +136 -0
  30. package/dist/builder/typed-merge.d.mts +31 -0
  31. package/dist/builder/typed-merge.mjs +93 -0
  32. package/dist/builder/typed-select.d.mts +125 -0
  33. package/dist/builder/typed-select.mjs +217 -0
  34. package/dist/builder/typed-update.d.mts +55 -0
  35. package/dist/builder/typed-update.mjs +102 -0
  36. package/dist/builder/update.d.mts +18 -0
  37. package/dist/builder/update.mjs +102 -0
  38. package/dist/dialect/mssql.d.mts +2 -0
  39. package/dist/dialect/mssql.mjs +9 -0
  40. package/dist/dialect/mysql.d.mts +2 -0
  41. package/dist/dialect/mysql.mjs +9 -0
  42. package/dist/dialect/pg.d.mts +2 -0
  43. package/dist/dialect/pg.mjs +9 -0
  44. package/dist/dialect/sqlite.d.mts +2 -0
  45. package/dist/dialect/sqlite.mjs +9 -0
  46. package/dist/dialect/types.d.mts +6 -0
  47. package/dist/dialect/types.mjs +1 -0
  48. package/dist/errors.d.mts +12 -0
  49. package/dist/errors.mjs +24 -0
  50. package/dist/index.d.mts +49 -806
  51. package/dist/index.mjs +46 -3
  52. package/dist/mssql.d.mts +2 -2
  53. package/dist/mssql.mjs +2 -1
  54. package/dist/mysql.d.mts +2 -2
  55. package/dist/mysql.mjs +2 -1
  56. package/dist/pg.d.mts +2 -2
  57. package/dist/pg.mjs +2 -1
  58. package/dist/plugin/camel-case.d.mts +11 -0
  59. package/dist/plugin/camel-case.mjs +16 -0
  60. package/dist/plugin/hooks.d.mts +72 -0
  61. package/dist/plugin/hooks.mjs +49 -0
  62. package/dist/plugin/plugin-manager.d.mts +17 -0
  63. package/dist/plugin/plugin-manager.mjs +37 -0
  64. package/dist/plugin/soft-delete.d.mts +27 -0
  65. package/dist/plugin/soft-delete.mjs +52 -0
  66. package/dist/plugin/types.d.mts +19 -0
  67. package/dist/plugin/types.mjs +1 -0
  68. package/dist/plugin/with-schema.d.mts +21 -0
  69. package/dist/plugin/with-schema.mjs +53 -0
  70. package/dist/printer/base.d.mts +48 -0
  71. package/dist/printer/base.mjs +450 -0
  72. package/dist/printer/document.d.mts +45 -0
  73. package/dist/printer/document.mjs +153 -0
  74. package/dist/printer/formatter.d.mts +5 -0
  75. package/dist/printer/formatter.mjs +134 -0
  76. package/dist/printer/mssql.d.mts +10 -0
  77. package/dist/printer/mssql.mjs +161 -0
  78. package/dist/printer/mysql.d.mts +8 -0
  79. package/dist/printer/mysql.mjs +41 -0
  80. package/dist/printer/pg.d.mts +6 -0
  81. package/dist/printer/pg.mjs +9 -0
  82. package/dist/printer/sqlite.d.mts +8 -0
  83. package/dist/printer/sqlite.mjs +29 -0
  84. package/dist/printer/types.d.mts +11 -0
  85. package/dist/printer/types.mjs +1 -0
  86. package/dist/schema/column.d.mts +52 -0
  87. package/dist/schema/column.mjs +120 -0
  88. package/dist/schema/index.d.mts +6 -0
  89. package/dist/schema/index.mjs +4 -0
  90. package/dist/schema/table.d.mts +37 -0
  91. package/dist/schema/table.mjs +7 -0
  92. package/dist/schema/type-utils.d.mts +46 -0
  93. package/dist/schema/type-utils.mjs +1 -0
  94. package/dist/schema/types.d.mts +64 -0
  95. package/dist/schema/types.mjs +1 -0
  96. package/dist/schema.d.mts +2 -2
  97. package/dist/schema.mjs +1 -1
  98. package/dist/sqlite.d.mts +2 -2
  99. package/dist/sqlite.mjs +2 -1
  100. package/dist/sumak.d.mts +98 -0
  101. package/dist/sumak.mjs +132 -0
  102. package/dist/types.d.mts +14 -0
  103. package/dist/types.mjs +1 -0
  104. package/dist/utils/identifier.d.mts +3 -0
  105. package/dist/utils/identifier.mjs +14 -0
  106. package/dist/utils/param.d.mts +2 -0
  107. package/dist/utils/param.mjs +8 -0
  108. package/package.json +1 -1
  109. package/dist/_chunks/base.mjs +0 -1
  110. package/dist/_chunks/errors.mjs +0 -1
  111. package/dist/_chunks/index.d.mts +0 -136
  112. package/dist/_chunks/mssql.d.mts +0 -11
  113. package/dist/_chunks/mssql.mjs +0 -1
  114. package/dist/_chunks/mysql.d.mts +0 -9
  115. package/dist/_chunks/mysql.mjs +0 -1
  116. package/dist/_chunks/pg.d.mts +0 -7
  117. package/dist/_chunks/pg.mjs +0 -1
  118. package/dist/_chunks/schema.mjs +0 -1
  119. package/dist/_chunks/sqlite.d.mts +0 -9
  120. package/dist/_chunks/sqlite.mjs +0 -1
  121. package/dist/_chunks/types.d.mts +0 -338
package/dist/index.mjs CHANGED
@@ -1,3 +1,46 @@
1
- import{i as e,n as t,r as n,t as r}from"./_chunks/base.mjs";import{n as i,t as a}from"./_chunks/pg.mjs";import{i as o,n as s,r as ee,t as te}from"./_chunks/errors.mjs";import{n as ne,t as re}from"./_chunks/mssql.mjs";import{n as ie,t as ae}from"./_chunks/mysql.mjs";import{n as oe,t as se}from"./_chunks/sqlite.mjs";import{C as ce,S as le,_ as ue,a as de,b as fe,c as pe,d as me,f as he,g as ge,h as _e,i as ve,l as ye,m as be,n as xe,o as Se,p as Ce,r as we,s as Te,t as Ee,u as De,v as Oe,x as ke,y as Ae}from"./_chunks/schema.mjs";function c(e,t,n,r){return{type:`merge`,target:e,source:t,sourceAlias:n,on:r,whens:[],ctes:[]}}function je(e,t,n){return Object.freeze({type:`table_ref`,name:e,alias:t,schema:n})}function l(){return{type:`select`,distinct:!1,columns:[],joins:[],groupBy:[],orderBy:[],ctes:[],forUpdate:!1}}function u(e){return{type:`insert`,table:e,columns:[],values:[],returning:[],ctes:[]}}function d(e){return{type:`update`,table:e,set:[],returning:[],ctes:[]}}function f(e){return{type:`delete`,table:e,returning:[],ctes:[]}}function p(e,t){return{type:`column_ref`,column:e,table:t}}function Me(e,t,n){return{type:`column_ref`,column:e,table:n,alias:t}}function m(e){return{type:`literal`,value:e}}function h(e){return{type:`star`,table:e}}function g(e,t){return{type:`param`,index:e,value:t}}function Ne(e,t=[]){return{type:`raw`,sql:e,params:t}}function Pe(e,t){return{type:`subquery`,query:e,alias:t}}function _(e,t,n){return{type:`function_call`,name:e,args:t,alias:n}}function v(e,t,n){return{type:`binary_op`,op:e,left:t,right:n}}function y(e,t,n=`prefix`){return{type:`unary_op`,op:e,operand:t,position:n}}function b(e,t){return v(`AND`,e,t)}function Fe(e,t){return v(`OR`,e,t)}function Ie(e,t){return v(`=`,e,t)}function Le(e,t){return v(`!=`,e,t)}function Re(e,t){return v(`>`,e,t)}function ze(e,t){return v(`>=`,e,t)}function Be(e,t){return v(`<`,e,t)}function Ve(e,t){return v(`<=`,e,t)}function He(e,t){return v(`LIKE`,e,t)}function Ue(e,t,n,r=!1){return{type:`between`,expr:e,low:t,high:n,negated:r}}function We(e,t,n=!1){return{type:`in`,expr:e,values:t,negated:n}}function x(e,t=!1){return{type:`is_null`,expr:e,negated:t}}function Ge(e,t){return{type:`cast`,expr:e,dataType:t}}function S(e,t=!1){return{type:`exists`,query:e,negated:t}}function Ke(e){return y(`NOT`,e)}var qe=class{transform(e){switch(e.type){case`select`:return this.transformSelect(e);case`insert`:return this.transformInsert(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);case`merge`:return this.transformMerge(e);default:return this.transformExpression(e)}}transformSelect(e){return{...e,columns:e.columns.map(e=>this.transformExpression(e)),where:e.where?this.transformExpression(e.where):void 0,having:e.having?this.transformExpression(e.having):void 0,joins:e.joins.map(e=>({...e,on:e.on?this.transformExpression(e.on):void 0})),orderBy:e.orderBy.map(e=>({...e,expr:this.transformExpression(e.expr)}))}}transformInsert(e){return{...e,values:e.values.map(e=>e.map(e=>this.transformExpression(e)))}}transformUpdate(e){return{...e,set:e.set.map(e=>({...e,value:this.transformExpression(e.value)})),where:e.where?this.transformExpression(e.where):void 0}}transformDelete(e){return{...e,where:e.where?this.transformExpression(e.where):void 0}}transformMerge(e){return{...e,on:this.transformExpression(e.on),whens:e.whens.map(e=>e.type===`matched`?{...e,condition:e.condition?this.transformExpression(e.condition):void 0,set:e.set?.map(e=>({...e,value:this.transformExpression(e.value)}))}:{...e,condition:e.condition?this.transformExpression(e.condition):void 0,values:e.values.map(e=>this.transformExpression(e))})}}transformExpression(e){switch(e.type){case`binary_op`:return{...e,left:this.transformExpression(e.left),right:this.transformExpression(e.right)};case`unary_op`:return{...e,operand:this.transformExpression(e.operand)};case`function_call`:return{...e,args:e.args.map(e=>this.transformExpression(e))};case`between`:return{...e,expr:this.transformExpression(e.expr),low:this.transformExpression(e.low),high:this.transformExpression(e.high)};case`in`:return{...e,expr:this.transformExpression(e.expr),values:Array.isArray(e.values)?e.values.map(e=>this.transformExpression(e)):e.values};case`is_null`:return{...e,expr:this.transformExpression(e.expr)};case`cast`:return{...e,expr:this.transformExpression(e.expr)};case`json_access`:return{...e,expr:this.transformExpression(e.expr)};case`array_expr`:return{...e,elements:e.elements.map(e=>this.transformExpression(e))};case`window_function`:return{...e,fn:this.transformExpression(e.fn),partitionBy:e.partitionBy.map(e=>this.transformExpression(e)),orderBy:e.orderBy.map(e=>({...e,expr:this.transformExpression(e.expr)}))};case`aliased_expr`:return{...e,expr:this.transformExpression(e.expr)};case`full_text_search`:return{...e,columns:e.columns.map(e=>this.transformExpression(e)),query:this.transformExpression(e.query)};default:return e}}};function Je(e,t){switch(e.type){case`select`:return t.visitSelect(e);case`insert`:return t.visitInsert(e);case`update`:return t.visitUpdate(e);case`delete`:return t.visitDelete(e);case`merge`:return t.visitMerge(e);default:return t.visitExpression(e)}}var C=class e{node;paramIndex;constructor(e,t=0){this.node=e??c({type:`table_ref`,name:``},{type:`table_ref`,name:``},`src`,{type:`literal`,value:!0}),this.paramIndex=t}into(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,target:n},this.paramIndex)}using(t,n){let r=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,source:r,sourceAlias:n},this.paramIndex)}on(t){return new e({...this.node,on:t},this.paramIndex)}whenMatched(t){return new e({...this.node,whens:[...this.node.whens,t]},this.paramIndex)}whenNotMatched(t){return new e({...this.node,whens:[...this.node.whens,t]},this.paramIndex)}whenMatchedUpdate(e,t){let n={type:`matched`,action:`update`,set:e,condition:t};return this.whenMatched(n)}whenMatchedDelete(e){let t={type:`matched`,action:`delete`,condition:e};return this.whenMatched(t)}whenNotMatchedInsert(e,t,n){let r={type:`not_matched`,columns:e,values:t,condition:n};return this.whenNotMatched(r)}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]},this.paramIndex)}build(){return{...this.node}}};function Ye(e){return new C().into(e)}var w=class e{node;constructor(e){this.node=e??l()}columns(...t){let n=t.map(e=>typeof e==`string`?p(e):e);return new e({...this.node,columns:[...this.node.columns,...n]})}allColumns(){return new e({...this.node,columns:[...this.node.columns,h()]})}distinct(){return new e({...this.node,distinct:!0})}from(t,n){if(typeof t==`string`){let r={type:`table_ref`,name:t,alias:n};return new e({...this.node,from:r})}return n&&t.type!==`subquery`?new e({...this.node,from:{...t,alias:n}}):new e({...this.node,from:t})}where(t){return new e({...this.node,where:t})}join(t,n,r,i){let a={type:`join`,joinType:t,table:typeof n==`string`?{type:`table_ref`,name:n,alias:i}:n,on:r};return new e({...this.node,joins:[...this.node.joins,a]})}innerJoin(e,t,n){return this.join(`INNER`,e,t,n)}leftJoin(e,t,n){return this.join(`LEFT`,e,t,n)}rightJoin(e,t,n){return this.join(`RIGHT`,e,t,n)}groupBy(...t){let n=t.map(e=>typeof e==`string`?p(e):e);return new e({...this.node,groupBy:[...this.node.groupBy,...n]})}having(t){return new e({...this.node,having:t})}orderBy(t,n=`ASC`,r){let i={expr:typeof t==`string`?p(t):t,direction:n,nulls:r};return new e({...this.node,orderBy:[...this.node.orderBy,i]})}limit(t){return new e({...this.node,limit:t})}offset(t){return new e({...this.node,offset:t})}forSystemTime(t){return!this.node.from||this.node.from.type!==`table_ref`?this:new e({...this.node,from:{...this.node.from,temporal:t}})}forUpdate(){return new e({...this.node,forUpdate:!0})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}union(e){return this.setOp(`UNION`,e)}unionAll(e){return this.setOp(`UNION ALL`,e)}intersect(e){return this.setOp(`INTERSECT`,e)}except(e){return this.setOp(`EXCEPT`,e)}setOp(t,n){return new e({...this.node,setOp:{op:t,query:n}})}build(){return{...this.node}}};function Xe(...e){let t=new w;return e.length>0?t.columns(...e):t.allColumns()}var T=class e{node;paramIndex;constructor(e,t=0){this.node=e??u({type:`table_ref`,name:``}),this.paramIndex=t}into(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n},this.paramIndex)}columns(...t){return new e({...this.node,columns:[...this.node.columns,...t]},this.paramIndex)}values(...t){let n=this.paramIndex,r=t.map(e=>{let t=g(n,e);return n++,t});return new e({...this.node,values:[...this.node.values,r]},n)}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]},this.paramIndex)}onConflictDoNothing(...t){let n={columns:t,action:`nothing`};return new e({...this.node,onConflict:n},this.paramIndex)}onConflictDoUpdate(t,n,r){let i={columns:t,action:{set:n},where:r};return new e({...this.node,onConflict:i},this.paramIndex)}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]},this.paramIndex)}build(){return{...this.node}}};function Ze(e){return new T().into(e)}var E=class e{node;constructor(e){this.node=e??d({type:`table_ref`,name:``})}table(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n})}set(t,n){return new e({...this.node,set:[...this.node.set,{column:t,value:n}]})}where(t){return new e({...this.node,where:t})}from(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,from:n})}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}build(){return{...this.node}}};function Qe(e){return new E().table(e)}var D=class e{node;constructor(e){this.node=e??f({type:`table_ref`,name:``})}from(t){let n=typeof t==`string`?{type:`table_ref`,name:t}:t;return new e({...this.node,table:n})}where(t){return new e({...this.node,where:t})}returning(...t){return new e({...this.node,returning:[...this.node.returning,...t]})}with(t,n,r=!1){let i={name:t,query:n,recursive:r};return new e({...this.node,ctes:[...this.node.ctes,i]})}build(){return{...this.node}}};function $e(e){return new D().from(e)}const O=new Set(`SELECT.FROM.WHERE.AND.OR.JOIN.INNER JOIN.LEFT JOIN.RIGHT JOIN.FULL JOIN.CROSS JOIN.ON.GROUP BY.HAVING.ORDER BY.LIMIT.OFFSET.INSERT INTO.VALUES.UPDATE.SET.DELETE FROM.RETURNING.WITH.WITH RECURSIVE.UNION.UNION ALL.INTERSECT.EXCEPT.FOR UPDATE.ON CONFLICT.DO NOTHING.DO UPDATE SET`.split(`.`));function et(e,t={}){let n=t.indent??` `,r=[],i=0,a=tt(e),o=0;for(;o<a.length;){let e=a[o];if(e===`(`){i++,k(r,e),o++;continue}if(e===`)`){i=Math.max(0,i-1),k(r,e),o++;continue}let t=o+1<a.length?`${e} ${a[o+1]}`:``,s=o+2<a.length?`${e} ${a[o+1]} ${a[o+2]}`:``;if(O.has(s.toUpperCase())){r.push(`${n.repeat(i)}${s}`),o+=3;continue}if(O.has(t.toUpperCase())){r.push(`${n.repeat(i)}${t}`),o+=2;continue}if(O.has(e.toUpperCase())){r.push(`${n.repeat(i)}${e}`),o++;continue}k(r,e),o++}return r.join(`
2
- `)}function k(e,t){e.length===0?e.push(t):e[e.length-1]+=` ${t}`}function tt(e){let t=[],n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i===`'`||i===`"`){for(n+=i,r++;r<e.length&&e[r]!==i;){if(e[r]===i&&r+1<e.length&&e[r+1]===i){n+=i+i,r+=2;continue}n+=e[r],r++}r<e.length&&(n+=e[r]);continue}if(i===`(`||i===`)`){n.trim()&&(t.push(n.trim()),n=``),t.push(i);continue}if(i===`,`||i===`;`){n.trim()&&(t.push(n.trim()),n=``),t.push(i);continue}if(/\s/.test(i)){n.trim()&&(t.push(n.trim()),n=``);continue}n+=i}return n.trim()&&t.push(n.trim()),t}function A(){return{tag:`empty`}}function j(e){return{tag:`text`,text:e}}function M(){return{tag:`line`}}function nt(e,t){return{tag:`nest`,indent:e,doc:t}}function rt(e){return{tag:`group`,doc:e}}function N(...e){let t=e.filter(e=>e.tag!==`empty`);return t.length===0?A():t.length===1?t[0]:{tag:`concat`,docs:t}}function it(e,t){if(t.length===0)return A();let n=[];for(let r=0;r<t.length;r++)r>0&&n.push(e),n.push(t[r]);return N(...n)}function at(e){return N(j(e),M())}function ot(e,t=80){let n=``,r=0,i=[[0,`break`,e]];for(;i.length>0;){let[e,a,o]=i.pop();switch(o.tag){case`empty`:break;case`text`:n+=o.text,r+=o.text.length;break;case`line`:a===`flat`?(n+=` `,r+=1):(n+=`
3
- `+` `.repeat(e),r=e);break;case`nest`:i.push([e+o.indent,a,o.doc]);break;case`group`:if(a===`flat`)i.push([e,`flat`,o.doc]);else{let n=st(o.doc);n!==null&&r+n<=t?i.push([e,`flat`,o.doc]):i.push([e,`break`,o.doc])}break;case`concat`:for(let t=o.docs.length-1;t>=0;t--)i.push([e,a,o.docs[t]]);break}}return n}function st(e){let t=0,n=[e];for(;n.length>0;){let e=n.pop();switch(e.tag){case`empty`:break;case`text`:t+=e.text.length;break;case`line`:t+=1;break;case`nest`:n.push(e.doc);break;case`group`:n.push(e.doc);break;case`concat`:for(let t=e.docs.length-1;t>=0;t--)n.push(e.docs[t]);break}}return t}var P=class{_node;constructor(e,t){this._node=p(e,t)}eq(e){return z(R(`=`,this._node,L(e)))}neq(e){return z(R(`!=`,this._node,L(e)))}gt(e){return z(R(`>`,this._node,L(e)))}gte(e){return z(R(`>=`,this._node,L(e)))}lt(e){return z(R(`<`,this._node,L(e)))}lte(e){return z(R(`<=`,this._node,L(e)))}like(e){return z(R(`LIKE`,this._node,m(e)))}in(e){return z({type:`in`,expr:this._node,values:e.map(e=>L(e)),negated:!1})}notIn(e){return z({type:`in`,expr:this._node,values:e.map(e=>L(e)),negated:!0})}isNull(){return z({type:`is_null`,expr:this._node,negated:!1})}isNotNull(){return z({type:`is_null`,expr:this._node,negated:!0})}between(e,t){return z({type:`between`,expr:this._node,low:L(e),high:L(t),negated:!1})}eqCol(e){return z(R(`=`,this._node,e._node))}toExpr(){return z(this._node)}};let F=0;function I(){F=0}function L(e){return g(F++,e)}function R(e,t,n){return{type:`binary_op`,op:e,left:t,right:n}}function z(e){return{node:e}}function B(e){return new Proxy({},{get(e,t){return new P(t,void 0)}})}function ct(e,t){return z(b(e.node,t.node))}function lt(e,t){return z(Fe(e.node,t.node))}function ut(e){return z(m(e))}function dt(e,...t){return z(_(e,t.map(e=>e.node)))}function ft(){return z(_(`COUNT`,[h()]))}function pt(e){return z(_(`SUM`,[e.node]))}function mt(e){return z(_(`AVG`,[e.node]))}function ht(e){return z(_(`MIN`,[e.node]))}function gt(e){return z(_(`MAX`,[e.node]))}function _t(e,t){return z(_(`COALESCE`,[e.node,t.node]))}function vt(e){return z(Ke(e.node))}function yt(e){return z(S(e))}function bt(e){return z(S(e,!0))}function xt(e,t){return z(Ge(e.node,t))}function St(e,t,n=`->`){return z({type:`json_access`,expr:e.node,path:t,operator:n})}function Ct(e,t,n){return z({type:`full_text_search`,columns:e.map(e=>e.node),query:t.node,mode:n?.mode,language:n?.language})}function wt(e){return new V(e?e.node:void 0,[])}var V=class e{_operand;_whens;_else;constructor(e,t,n){this._operand=e,this._whens=t,this._else=n}when(t,n){return new e(this._operand,[...this._whens,{condition:t.node,result:n.node}])}else_(t){return new e(this._operand,this._whens,t.node)}end(){return z({type:`case`,operand:this._operand,whens:this._whens,else_:this._else})}};function H(e){return e.node}var U=class e{_builder;constructor(e){this._builder=new D().from(e)}_with(t){let n=new e(``);return n._builder=t,n}where(e){if(typeof e==`function`){I();let t=this._builder.build().table.name,n=e(B(t));return this._with(this._builder.where(H(n)))}return this._with(this._builder.where(H(e)))}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new W(new D({...this._builder.build(),returning:t}))}returningAll(){return new W(new D({...this._builder.build(),returning:[h()]}))}with(e,t,n=!1){return this._with(this._builder.with(e,t,n))}build(){return this._builder.build()}compile(e){return e.print(this.build())}},W=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},G=class e{_builder;_paramIdx;constructor(e,t=0){this._builder=new T().into(e),this._paramIdx=t}_withBuilder(t,n){let r=new e(``);return r._builder=t,r._paramIdx=n,r}values(e){let t=Object.entries(e),n=t.map(([e])=>e),r=t.map(([e,t])=>{let n=g(this._paramIdx,t);return this._paramIdx++,n}),i=this._builder;return i.build().columns.length===0&&(i=i.columns(...n)),i=new T({...i.build(),values:[...i.build().values,r]},this._paramIdx),this._withBuilder(i,this._paramIdx)}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new K(new T({...this._builder.build(),returning:t},this._paramIdx))}returningAll(){return new K(new T({...this._builder.build(),returning:[h()]},this._paramIdx))}onConflictDoNothing(...e){return this._withBuilder(this._builder.onConflictDoNothing(...e),this._paramIdx)}onConflictDoUpdate(e,t){return this._withBuilder(this._builder.onConflictDoUpdate(e,t.map(e=>({column:e.column,value:H(e.value)}))),this._paramIdx)}with(e,t,n=!1){return this._withBuilder(this._builder.with(e,t,n),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},K=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}};function q(e,t){let n=e=>new Proxy({},{get(t,n){return new P(n,e)}});return{target:n(e),source:n(t)}}var J=class e{_builder;_targetTable;_sourceAlias;_paramIdx;constructor(e,t,n,r,i=0){this._targetTable=e,this._sourceAlias=n,this._paramIdx=i,this._builder=new C().into(e).using(t,n).on(H(r))}_with(t,n){let r=new e(``,``,``,{node:{type:`literal`,value:!0}});return r._builder=t,r._targetTable=this._targetTable,r._sourceAlias=this._sourceAlias,r._paramIdx=n,r}whenMatchedThenUpdate(e,t){let n=this._paramIdx,r=[];for(let[t,i]of Object.entries(e))i!==void 0&&(r.push({column:t,value:g(n,i)}),n++);let i;return t&&(I(),i=H(t(q(this._targetTable,this._sourceAlias)))),this._with(this._builder.whenMatchedUpdate(r,i),n)}whenMatchedThenDelete(e){let t;return e&&(I(),t=H(e(q(this._targetTable,this._sourceAlias)))),this._with(this._builder.whenMatchedDelete(t),this._paramIdx)}whenNotMatchedThenInsert(e,t){let n=this._paramIdx,r=Object.entries(e),i=r.map(([e])=>e),a=r.map(([e,t])=>{let r=g(n,t);return n++,r}),o;return t&&(I(),o=H(t(q(this._targetTable,this._sourceAlias)))),this._with(this._builder.whenNotMatchedInsert(i,a,o),n)}with(e,t,n=!1){return this._with(this._builder.with(e,t,n),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Y=class e{_builder;_table;constructor(e,t){this._builder=e,this._table=t??``}select(...t){return new e(this._builder.columns(...t),this._table)}selectAll(){return new e(this._builder.allColumns(),this._table)}selectExpr(t,n){let r=Et(H(t),n);return new e(this._builder.columns(r),this._table)}distinct(){return new e(this._builder.distinct(),this._table)}where(t){if(typeof t==`function`){I();let n=t(B(this._table));return new e(this._builder.where(H(n)),this._table)}return new e(this._builder.where(H(t)),this._table)}innerJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.innerJoin(t,H(r)),this._table)}leftJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.leftJoin(t,H(r)),this._table)}rightJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.rightJoin(t,H(r)),this._table)}groupBy(...t){return new e(this._builder.groupBy(...t),this._table)}having(t){if(typeof t==`function`){I();let n=t(B(this._table));return new e(this._builder.having(H(n)),this._table)}return new e(this._builder.having(H(t)),this._table)}orderBy(t,n=`ASC`,r){return new e(this._builder.orderBy(t,n,r),this._table)}limit(t){return new e(this._builder.limit({type:`literal`,value:t}),this._table)}offset(t){return new e(this._builder.offset({type:`literal`,value:t}),this._table)}forSystemTime(t){return new e(this._builder.forSystemTime(t),this._table)}forUpdate(){return new e(this._builder.forUpdate(),this._table)}with(t,n,r=!1){return new e(this._builder.with(t,n,r),this._table)}union(t){return new e(this._builder.union(t.build()),this._table)}unionAll(t){return new e(this._builder.unionAll(t.build()),this._table)}intersect(t){return new e(this._builder.intersect(t.build()),this._table)}except(t){return new e(this._builder.except(t.build()),this._table)}fullJoin(t,n){let r=X(n,this._table,t);return new e(this._builder.join(`FULL`,t,H(r)),this._table)}crossJoin(t){return new e(this._builder.join(`CROSS`,t),this._table)}build(){return this._builder.build()}compile(e){return e.print(this.build())}};function Tt(e,t){return new Proxy({},{get(e,t){return new Proxy({},{get(e,n){return new P(n,t)}})}})}function Et(e,t){return e.type===`column_ref`||e.type===`function_call`||e.type===`json_access`||e.type===`window_function`?{...e,alias:t}:{type:`aliased_expr`,expr:e,alias:t}}function X(e,t,n){return typeof e==`function`?e(Tt(t,n)):e}var Z=class e{_builder;_paramIdx;constructor(e,t=0){this._builder=new E().table(e),this._paramIdx=t}_with(t,n){let r=new e(``);return r._builder=t,r._paramIdx=n,r}set(e){let t=this._builder,n=this._paramIdx;for(let[r,i]of Object.entries(e))i!==void 0&&(t=t.set(r,g(n,i)),n++);return this._with(t,n)}setExpr(e,t){return this._with(this._builder.set(e,H(t)),this._paramIdx)}where(e){if(typeof e==`function`){I();let t=e(B(this._table));return this._with(this._builder.where(H(t)),this._paramIdx)}return this._with(this._builder.where(H(e)),this._paramIdx)}get _table(){return this._builder.build().table.name}returning(...e){let t=e.map(e=>({type:`column_ref`,column:e}));return new Q(new E({...this._builder.build(),returning:t}))}returningAll(){return new Q(new E({...this._builder.build(),returning:[h()]}))}from(e){return this._with(this._builder.from(e),this._paramIdx)}with(e,t,n=!1){return this._with(this._builder.with(e,t,n),this._paramIdx)}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Q=class{_builder;constructor(e){this._builder=e}build(){return this._builder.build()}compile(e){return e.print(this.build())}},Dt=class{_hooks=new Map;hook(e,t){return this._hooks.has(e)||this._hooks.set(e,[]),this._hooks.get(e).push(t),()=>{let n=this._hooks.get(e);if(n){let e=n.indexOf(t);e!==-1&&n.splice(e,1)}}}callHook(e,...t){let n=this._hooks.get(e);if(!n||n.length===0)return;let r;for(let i of n){let n=i(...t);n!==void 0&&(r=n,e!==`result:transform`&&t[0]&&typeof t[0]==`object`&&`node`in t[0]&&(t[0].node=n))}return r}hasHook(e){let t=this._hooks.get(e);return t!==void 0&&t.length>0}removeHook(e){this._hooks.delete(e)}removeAllHooks(){this._hooks.clear()}},Ot=class{plugins;constructor(e){this.plugins=Object.freeze([...e])}transformNode(e){let t=e;for(let e of this.plugins)e.transformNode&&(t=e.transformNode(t));return t}transformQuery(e){let t=e;for(let e of this.plugins)e.transformQuery&&(t=e.transformQuery(t));return t}transformResult(e){let t=e;for(let e of this.plugins)e.transformResult&&(t=e.transformResult(t));return t}};function kt(e){return new $(e.dialect,e.plugins??[])}var $=class{_dialect;_plugins;_hooks;constructor(e,t=[]){this._dialect=e,this._plugins=new Ot(t),this._hooks=new Dt}hook(e,t){return this._hooks.hook(e,t)}selectFrom(e,t){return new Y(new w().from(e,t),e)}insertInto(e){return new G(e)}update(e){return new Z(e)}deleteFrom(e){return new U(e)}mergeInto(e,t,n,r){let i=e=>new Proxy({},{get(t,n){return new P(n,e)}});return new J(e,t,n,r({target:i(e),source:i(n)}))}compile(e){let t=this._plugins.transformNode(e),n=this._extractTableName(t);switch(t.type){case`select`:{let e=this._hooks.callHook(`select:before`,{node:t,table:n});e&&(t=e);break}case`insert`:{let e=this._hooks.callHook(`insert:before`,{node:t,table:n});e&&(t=e);break}case`update`:{let e=this._hooks.callHook(`update:before`,{node:t,table:n});e&&(t=e);break}case`delete`:{let e=this._hooks.callHook(`delete:before`,{node:t,table:n});e&&(t=e);break}}let r=this._hooks.callHook(`query:before`,{node:t,table:n});r&&(t=r);let i=this._dialect.createPrinter().print(t);i=this._plugins.transformQuery(i);let a=this._hooks.callHook(`query:after`,{node:t,table:n,query:i});return a&&(i=a),i}transformResult(e){let t=this._plugins.transformResult(e),n=this._hooks.callHook(`result:transform`,t);return n&&(t=n),t}printer(){return this._dialect.createPrinter()}_extractTableName(e){switch(e.type){case`select`:return e.from?.type===`table_ref`?e.from.name:void 0;case`insert`:return e.table.name;case`update`:return e.table.name;case`delete`:return e.table.name;case`merge`:return e.target.name;default:return}}},At=class{name=`with-schema`;schema;constructor(e){this.schema=e}transformNode(e){switch(e.type){case`select`:return this.transformSelect(e);case`insert`:return this.transformInsert(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return e}}addSchema(e){return e.schema?e:{...e,schema:this.schema}}transformSelect(e){return{...e,from:e.from?e.from.type===`table_ref`?this.addSchema(e.from):e.from:void 0,joins:e.joins.map(e=>({...e,table:e.table.type===`table_ref`?this.addSchema(e.table):e.table}))}}transformInsert(e){return{...e,table:this.addSchema(e.table)}}transformUpdate(e){return{...e,table:this.addSchema(e.table),from:e.from?this.addSchema(e.from):void 0}}transformDelete(e){return{...e,table:this.addSchema(e.table)}}},jt=class{name=`soft-delete`;tables;column;constructor(e){this.tables=new Set(e.tables),this.column=e.column??`deleted_at`}transformNode(e){switch(e.type){case`select`:return this.transformSelect(e);case`update`:return this.transformUpdate(e);case`delete`:return this.transformDelete(e);default:return e}}isTargetTable(e){return this.tables.has(e)}softDeleteCondition(){return x(p(this.column))}addCondition(e){let t=this.softDeleteCondition();return e?b(e,t):t}transformSelect(e){return!e.from||e.from.type!==`table_ref`||!this.isTargetTable(e.from.name)?e:{...e,where:this.addCondition(e.where)}}transformUpdate(e){return this.isTargetTable(e.table.name)?{...e,where:this.addCondition(e.where)}:e}transformDelete(e){return this.isTargetTable(e.table.name)?{...e,where:this.addCondition(e.where)}:e}},Mt=class{name=`camel-case`;transformResult(e){return e.map(e=>{let t={};for(let n of Object.keys(e))t[Nt(n)]=e[n];return t})}};function Nt(e){return e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}export{qe as ASTTransformer,r as BasePrinter,Mt as CamelCasePlugin,V as CaseBuilder,P as Col,xe as ColumnBuilder,D as DeleteBuilder,te as EmptyQueryError,Dt as Hookable,T as InsertBuilder,s as InvalidExpressionError,C as MergeBuilder,ne as MssqlPrinter,ie as MysqlPrinter,i as PgPrinter,Ot as PluginManager,w as SelectBuilder,jt as SoftDeletePlugin,oe as SqlitePrinter,$ as Sumak,ee as SumakError,U as TypedDeleteBuilder,W as TypedDeleteReturningBuilder,G as TypedInsertBuilder,K as TypedInsertReturningBuilder,J as TypedMergeBuilder,Y as TypedSelectBuilder,Z as TypedUpdateBuilder,Q as TypedUpdateReturningBuilder,o as UnsupportedDialectFeatureError,E as UpdateBuilder,At as WithSchemaPlugin,ct as and,mt as avg,Ue as between,we as bigint,ve as bigserial,v as binOp,de as boolean,Se as bytea,wt as case_,xt as cast,Te as char,_t as coalesce,p as col,Me as colAs,ft as count,f as createDeleteNode,u as createInsertNode,c as createMergeNode,l as createSelectNode,d as createUpdateNode,pe as date,Ee as defineTable,$e as deleteFrom,N as docConcat,A as docEmpty,rt as docGroup,it as docJoin,M as docLine,nt as docNest,ot as docRender,j as docText,at as docTextLine,ye as doublePrecision,De as enumType,Ie as eq,yt as exists,_ as fn,t as formatParam,et as formatSQL,Re as gt,ze as gte,We as inList,Ze as insert,me as integer,x as isNull,he as json,St as jsonRef,Ce as jsonb,He as like,m as lit,Be as lt,Ve as lte,gt as max,Ye as merge,ht as min,re as mssqlDialect,ae as mysqlDialect,Le as neq,vt as not,bt as notExists,be as numeric,lt as or,g as param,a as pgDialect,n as quoteIdentifier,e as quoteTableRef,Ne as raw,_e as real,I as resetParams,Xe as select,ge as serial,ue as smallint,dt as sqlFn,se as sqliteDialect,h as star,Pe as subquery,pt as sum,kt as sumak,je as tableRef,Oe as text,Ct as textSearch,Ae as time,fe as timestamp,ke as timestamptz,y as unaryOp,Qe as update,le as uuid,ut as val,ce as varchar,Je as visitNode};
1
+ export { createDeleteNode, createInsertNode, createMergeNode, createSelectNode, createUpdateNode, tableRef } from "./ast/nodes.mjs";
2
+
3
+ export { between, binOp, col, colAs, eq, fn, gt, gte, inList, isNull, like, lit, lt, lte, neq, param, raw, star, subquery, unaryOp } from "./ast/expression.mjs";
4
+ export { ASTTransformer } from "./ast/transformer.mjs";
5
+ export { visitNode } from "./ast/visitor.mjs";
6
+
7
+ export { merge, MergeBuilder } from "./builder/merge.mjs";
8
+ export { select, SelectBuilder } from "./builder/select.mjs";
9
+ export { insert, InsertBuilder } from "./builder/insert.mjs";
10
+ export { update, UpdateBuilder } from "./builder/update.mjs";
11
+ export { deleteFrom, DeleteBuilder } from "./builder/delete.mjs";
12
+
13
+ export { BasePrinter } from "./printer/base.mjs";
14
+ export { PgPrinter } from "./printer/pg.mjs";
15
+ export { MssqlPrinter } from "./printer/mssql.mjs";
16
+ export { MysqlPrinter } from "./printer/mysql.mjs";
17
+ export { SqlitePrinter } from "./printer/sqlite.mjs";
18
+ export { formatSQL } from "./printer/formatter.mjs";
19
+ export { concat as docConcat, empty as docEmpty, group as docGroup, join as docJoin, line as docLine, nest as docNest, render as docRender, text as docText, textLine as docTextLine } from "./printer/document.mjs";
20
+
21
+ export { pgDialect } from "./dialect/pg.mjs";
22
+ export { mssqlDialect } from "./dialect/mssql.mjs";
23
+ export { mysqlDialect } from "./dialect/mysql.mjs";
24
+ export { sqliteDialect } from "./dialect/sqlite.mjs";
25
+
26
+ export { quoteIdentifier, quoteTableRef } from "./utils/identifier.mjs";
27
+ export { formatParam } from "./utils/param.mjs";
28
+
29
+ export { bigint, bigserial, boolean, bytea, char, ColumnBuilder, date, defineTable, doublePrecision, enumType, integer, json, jsonb, numeric, real, serial, smallint, text, time, timestamp, timestamptz, uuid, varchar } from "./schema/index.mjs";
30
+
31
+ export { abs, and, avg, case_, CaseBuilder, cast, ceil, coalesce, Col, concat, count, countDistinct, currentTimestamp, denseRank, exists, filter, floor, greatest, jsonRef, lag, lead, least, length, lower, max, min, not, notExists, now, ntile, nullif, or, over, rank, resetParams, round, rowNumber, sqlFn, substring, sum, textSearch, trim, upper, val, WindowBuilder } from "./builder/eb.mjs";
32
+
33
+ export { sumak, Sumak } from "./sumak.mjs";
34
+ export { TypedSelectBuilder } from "./builder/typed-select.mjs";
35
+ export { TypedInsertBuilder, TypedInsertReturningBuilder } from "./builder/typed-insert.mjs";
36
+ export { TypedUpdateBuilder, TypedUpdateReturningBuilder } from "./builder/typed-update.mjs";
37
+ export { TypedDeleteBuilder, TypedDeleteReturningBuilder } from "./builder/typed-delete.mjs";
38
+ export { TypedMergeBuilder } from "./builder/typed-merge.mjs";
39
+ export { PluginManager } from "./plugin/plugin-manager.mjs";
40
+ export { WithSchemaPlugin } from "./plugin/with-schema.mjs";
41
+ export { SoftDeletePlugin } from "./plugin/soft-delete.mjs";
42
+ export { CamelCasePlugin } from "./plugin/camel-case.mjs";
43
+
44
+ export { Hookable } from "./plugin/hooks.mjs";
45
+
46
+ export { EmptyQueryError, InvalidExpressionError, SumakError, UnsupportedDialectFeatureError } from "./errors.mjs";
package/dist/mssql.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as MssqlPrinter, t as mssqlDialect } from "./_chunks/mssql.mjs";
2
- export { MssqlPrinter, mssqlDialect };
1
+ export { MssqlPrinter } from "./printer/mssql.mjs";
2
+ export { mssqlDialect } from "./dialect/mssql.mjs";
package/dist/mssql.mjs CHANGED
@@ -1 +1,2 @@
1
- import{n as e,t}from"./_chunks/mssql.mjs";export{e as MssqlPrinter,t as mssqlDialect};
1
+ export { MssqlPrinter } from "./printer/mssql.mjs";
2
+ export { mssqlDialect } from "./dialect/mssql.mjs";
package/dist/mysql.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as MysqlPrinter, t as mysqlDialect } from "./_chunks/mysql.mjs";
2
- export { MysqlPrinter, mysqlDialect };
1
+ export { MysqlPrinter } from "./printer/mysql.mjs";
2
+ export { mysqlDialect } from "./dialect/mysql.mjs";
package/dist/mysql.mjs CHANGED
@@ -1 +1,2 @@
1
- import{n as e,t}from"./_chunks/mysql.mjs";export{e as MysqlPrinter,t as mysqlDialect};
1
+ export { MysqlPrinter } from "./printer/mysql.mjs";
2
+ export { mysqlDialect } from "./dialect/mysql.mjs";
package/dist/pg.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as PgPrinter, t as pgDialect } from "./_chunks/pg.mjs";
2
- export { PgPrinter, pgDialect };
1
+ export { PgPrinter } from "./printer/pg.mjs";
2
+ export { pgDialect } from "./dialect/pg.mjs";
package/dist/pg.mjs CHANGED
@@ -1 +1,2 @@
1
- import{n as e,t}from"./_chunks/pg.mjs";export{e as PgPrinter,t as pgDialect};
1
+ export { PgPrinter } from "./printer/pg.mjs";
2
+ export { pgDialect } from "./dialect/pg.mjs";
@@ -0,0 +1,11 @@
1
+ import type { SumakPlugin } from "./types.mjs";
2
+ /**
3
+ * Plugin that converts snake_case result column names to camelCase.
4
+ *
5
+ * This plugin operates on results only — it does NOT transform the AST.
6
+ * Use it when your database uses snake_case but your TypeScript code uses camelCase.
7
+ */
8
+ export declare class CamelCasePlugin implements SumakPlugin {
9
+ readonly name = "camel-case";
10
+ transformResult(rows: Record<string, unknown>[]): Record<string, unknown>[];
11
+ }
@@ -0,0 +1,16 @@
1
+
2
+ export class CamelCasePlugin {
3
+ name = "camel-case";
4
+ transformResult(rows) {
5
+ return rows.map((row) => {
6
+ const result = {};
7
+ for (const key of Object.keys(row)) {
8
+ result[toCamelCase(key)] = row[key];
9
+ }
10
+ return result;
11
+ });
12
+ }
13
+ }
14
+ function toCamelCase(str) {
15
+ return str.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
16
+ }
@@ -0,0 +1,72 @@
1
+ import type { ASTNode, DeleteNode, InsertNode, SelectNode, UpdateNode } from "../ast/nodes.mjs";
2
+ import type { CompiledQuery } from "../types.mjs";
3
+ /**
4
+ * Hook context passed to hook handlers.
5
+ */
6
+ export interface HookContext<T extends ASTNode = ASTNode> {
7
+ /** The AST node being processed */
8
+ node: T;
9
+ /** Table name (if applicable) */
10
+ table?: string;
11
+ /** Compiled query (only in after hooks) */
12
+ query?: CompiledQuery;
13
+ }
14
+ /**
15
+ * All available hook points in the query lifecycle.
16
+ */
17
+ export interface SumakHooks {
18
+ /** Fires before any query is compiled. Can modify the AST. */
19
+ "query:before": (ctx: HookContext) => ASTNode | void;
20
+ /** Fires after a query is compiled to SQL. Can modify the compiled query. */
21
+ "query:after": (ctx: HookContext & {
22
+ query: CompiledQuery;
23
+ }) => CompiledQuery | void;
24
+ /** Fires before SELECT compilation. Can modify the SelectNode. */
25
+ "select:before": (ctx: HookContext<SelectNode>) => SelectNode | void;
26
+ /** Fires before INSERT compilation. Can modify the InsertNode. */
27
+ "insert:before": (ctx: HookContext<InsertNode>) => InsertNode | void;
28
+ /** Fires before UPDATE compilation. Can modify the UpdateNode. */
29
+ "update:before": (ctx: HookContext<UpdateNode>) => UpdateNode | void;
30
+ /** Fires before DELETE compilation. Can modify the DeleteNode. */
31
+ "delete:before": (ctx: HookContext<DeleteNode>) => DeleteNode | void;
32
+ /** Transform result rows. */
33
+ "result:transform": (rows: Record<string, unknown>[]) => Record<string, unknown>[];
34
+ }
35
+ export type HookName = keyof SumakHooks;
36
+ /**
37
+ * Hookable system — register and execute hooks.
38
+ *
39
+ * ```ts
40
+ * const hooks = new Hookable();
41
+ * hooks.hook("select:before", (ctx) => {
42
+ * // Add soft delete filter
43
+ * return { ...ctx.node, where: addSoftDelete(ctx.node.where) };
44
+ * });
45
+ * ```
46
+ */
47
+ export declare class Hookable {
48
+ private _hooks;
49
+ /**
50
+ * Register a hook handler.
51
+ * Returns an unregister function.
52
+ */
53
+ hook<K extends HookName>(name: K, handler: SumakHooks[K]): () => void;
54
+ /**
55
+ * Execute all handlers for a hook.
56
+ * For AST hooks: each handler can return a modified node, which feeds into the next.
57
+ * For result hooks: each handler transforms the rows.
58
+ */
59
+ callHook<K extends HookName>(name: K, ...args: Parameters<SumakHooks[K]>): ReturnType<SumakHooks[K]> | undefined;
60
+ /**
61
+ * Check if any handlers are registered for a hook.
62
+ */
63
+ hasHook(name: HookName): boolean;
64
+ /**
65
+ * Remove all handlers for a hook.
66
+ */
67
+ removeHook(name: HookName): void;
68
+ /**
69
+ * Remove all hooks.
70
+ */
71
+ removeAllHooks(): void;
72
+ }
@@ -0,0 +1,49 @@
1
+
2
+ export class Hookable {
3
+ _hooks = new Map();
4
+
5
+ hook(name, handler) {
6
+ if (!this._hooks.has(name)) {
7
+ this._hooks.set(name, []);
8
+ }
9
+ this._hooks.get(name).push(handler);
10
+ return () => {
11
+ const handlers = this._hooks.get(name);
12
+ if (handlers) {
13
+ const idx = handlers.indexOf(handler);
14
+ if (idx !== -1) handlers.splice(idx, 1);
15
+ }
16
+ };
17
+ }
18
+
19
+ callHook(name, ...args) {
20
+ const handlers = this._hooks.get(name);
21
+ if (!handlers || handlers.length === 0) return undefined;
22
+ let result = undefined;
23
+ for (const handler of handlers) {
24
+ const ret = handler(...args);
25
+ if (ret !== undefined) {
26
+ result = ret;
27
+
28
+ if (name !== "result:transform" && args[0] && typeof args[0] === "object" && "node" in args[0]) {
29
+ ;
30
+ args[0].node = ret;
31
+ }
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+
37
+ hasHook(name) {
38
+ const handlers = this._hooks.get(name);
39
+ return handlers !== undefined && handlers.length > 0;
40
+ }
41
+
42
+ removeHook(name) {
43
+ this._hooks.delete(name);
44
+ }
45
+
46
+ removeAllHooks() {
47
+ this._hooks.clear();
48
+ }
49
+ }
@@ -0,0 +1,17 @@
1
+ import type { ASTNode } from "../ast/nodes.mjs";
2
+ import type { CompiledQuery } from "../types.mjs";
3
+ import type { SumakPlugin } from "./types.mjs";
4
+ /**
5
+ * Manages plugin execution pipeline.
6
+ * Plugins are applied sequentially in registration order.
7
+ */
8
+ export declare class PluginManager {
9
+ private readonly plugins;
10
+ constructor(plugins: SumakPlugin[]);
11
+ /** Apply all transformNode phases in order. */
12
+ transformNode(node: ASTNode): ASTNode;
13
+ /** Apply all transformQuery phases in order. */
14
+ transformQuery(query: CompiledQuery): CompiledQuery;
15
+ /** Apply all transformResult phases in order. */
16
+ transformResult(rows: Record<string, unknown>[]): Record<string, unknown>[];
17
+ }
@@ -0,0 +1,37 @@
1
+
2
+ export class PluginManager {
3
+ plugins;
4
+ constructor(plugins) {
5
+ this.plugins = Object.freeze([...plugins]);
6
+ }
7
+
8
+ transformNode(node) {
9
+ let result = node;
10
+ for (const plugin of this.plugins) {
11
+ if (plugin.transformNode) {
12
+ result = plugin.transformNode(result);
13
+ }
14
+ }
15
+ return result;
16
+ }
17
+
18
+ transformQuery(query) {
19
+ let result = query;
20
+ for (const plugin of this.plugins) {
21
+ if (plugin.transformQuery) {
22
+ result = plugin.transformQuery(result);
23
+ }
24
+ }
25
+ return result;
26
+ }
27
+
28
+ transformResult(rows) {
29
+ let result = rows;
30
+ for (const plugin of this.plugins) {
31
+ if (plugin.transformResult) {
32
+ result = plugin.transformResult(result);
33
+ }
34
+ }
35
+ return result;
36
+ }
37
+ }
@@ -0,0 +1,27 @@
1
+ import type { ASTNode } from "../ast/nodes.mjs";
2
+ import type { SumakPlugin } from "./types.mjs";
3
+ /**
4
+ * Plugin that automatically adds `WHERE deleted_at IS NULL` to
5
+ * SELECT, UPDATE, and DELETE queries for configured tables.
6
+ *
7
+ * ```ts
8
+ * const plugin = new SoftDeletePlugin({ tables: ["users", "posts"] });
9
+ * // SELECT * FROM "users" → SELECT * FROM "users" WHERE "deleted_at" IS NULL
10
+ * ```
11
+ */
12
+ export declare class SoftDeletePlugin implements SumakPlugin {
13
+ readonly name = "soft-delete";
14
+ private tables;
15
+ private column;
16
+ constructor(config: {
17
+ tables: string[];
18
+ column?: string;
19
+ });
20
+ transformNode(node: ASTNode): ASTNode;
21
+ private isTargetTable;
22
+ private softDeleteCondition;
23
+ private addCondition;
24
+ private transformSelect;
25
+ private transformUpdate;
26
+ private transformDelete;
27
+ }
@@ -0,0 +1,52 @@
1
+ import { and, col, isNull } from "../ast/expression.mjs";
2
+
3
+ export class SoftDeletePlugin {
4
+ name = "soft-delete";
5
+ tables;
6
+ column;
7
+ constructor(config) {
8
+ this.tables = new Set(config.tables);
9
+ this.column = config.column ?? "deleted_at";
10
+ }
11
+ transformNode(node) {
12
+ switch (node.type) {
13
+ case "select": return this.transformSelect(node);
14
+ case "update": return this.transformUpdate(node);
15
+ case "delete": return this.transformDelete(node);
16
+ default: return node;
17
+ }
18
+ }
19
+ isTargetTable(tableName) {
20
+ return this.tables.has(tableName);
21
+ }
22
+ softDeleteCondition() {
23
+ return isNull(col(this.column));
24
+ }
25
+ addCondition(existing) {
26
+ const condition = this.softDeleteCondition();
27
+ return existing ? and(existing, condition) : condition;
28
+ }
29
+ transformSelect(node) {
30
+ if (!node.from || node.from.type !== "table_ref" || !this.isTargetTable(node.from.name)) {
31
+ return node;
32
+ }
33
+ return {
34
+ ...node,
35
+ where: this.addCondition(node.where)
36
+ };
37
+ }
38
+ transformUpdate(node) {
39
+ if (!this.isTargetTable(node.table.name)) return node;
40
+ return {
41
+ ...node,
42
+ where: this.addCondition(node.where)
43
+ };
44
+ }
45
+ transformDelete(node) {
46
+ if (!this.isTargetTable(node.table.name)) return node;
47
+ return {
48
+ ...node,
49
+ where: this.addCondition(node.where)
50
+ };
51
+ }
52
+ }
@@ -0,0 +1,19 @@
1
+ import type { ASTNode } from "../ast/nodes.mjs";
2
+ import type { CompiledQuery } from "../types.mjs";
3
+ /**
4
+ * Plugin interface for sumak.
5
+ *
6
+ * Plugins can intercept at three points:
7
+ * 1. transformNode — modify the AST before compilation
8
+ * 2. transformQuery — modify the compiled SQL after generation
9
+ * 3. transformResult — modify result rows after execution
10
+ */
11
+ export interface SumakPlugin {
12
+ readonly name: string;
13
+ /** Transform AST before compilation. Return a new node (never mutate). */
14
+ transformNode?(node: ASTNode): ASTNode;
15
+ /** Transform compiled query after SQL generation. */
16
+ transformQuery?(query: CompiledQuery): CompiledQuery;
17
+ /** Transform result rows after execution. */
18
+ transformResult?(rows: Record<string, unknown>[]): Record<string, unknown>[];
19
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import type { ASTNode } from "../ast/nodes.mjs";
2
+ import type { SumakPlugin } from "./types.mjs";
3
+ /**
4
+ * Plugin that prepends a schema name to all table references.
5
+ *
6
+ * ```ts
7
+ * const plugin = new WithSchemaPlugin("public");
8
+ * // SELECT * FROM "users" → SELECT * FROM "public"."users"
9
+ * ```
10
+ */
11
+ export declare class WithSchemaPlugin implements SumakPlugin {
12
+ readonly name = "with-schema";
13
+ private schema;
14
+ constructor(schema: string);
15
+ transformNode(node: ASTNode): ASTNode;
16
+ private addSchema;
17
+ private transformSelect;
18
+ private transformInsert;
19
+ private transformUpdate;
20
+ private transformDelete;
21
+ }
@@ -0,0 +1,53 @@
1
+
2
+ export class WithSchemaPlugin {
3
+ name = "with-schema";
4
+ schema;
5
+ constructor(schema) {
6
+ this.schema = schema;
7
+ }
8
+ transformNode(node) {
9
+ switch (node.type) {
10
+ case "select": return this.transformSelect(node);
11
+ case "insert": return this.transformInsert(node);
12
+ case "update": return this.transformUpdate(node);
13
+ case "delete": return this.transformDelete(node);
14
+ default: return node;
15
+ }
16
+ }
17
+ addSchema(ref) {
18
+ if (ref.schema) return ref;
19
+ return {
20
+ ...ref,
21
+ schema: this.schema
22
+ };
23
+ }
24
+ transformSelect(node) {
25
+ return {
26
+ ...node,
27
+ from: node.from ? node.from.type === "table_ref" ? this.addSchema(node.from) : node.from : undefined,
28
+ joins: node.joins.map((j) => ({
29
+ ...j,
30
+ table: j.table.type === "table_ref" ? this.addSchema(j.table) : j.table
31
+ }))
32
+ };
33
+ }
34
+ transformInsert(node) {
35
+ return {
36
+ ...node,
37
+ table: this.addSchema(node.table)
38
+ };
39
+ }
40
+ transformUpdate(node) {
41
+ return {
42
+ ...node,
43
+ table: this.addSchema(node.table),
44
+ from: node.from ? this.addSchema(node.from) : undefined
45
+ };
46
+ }
47
+ transformDelete(node) {
48
+ return {
49
+ ...node,
50
+ table: this.addSchema(node.table)
51
+ };
52
+ }
53
+ }
@@ -0,0 +1,48 @@
1
+ import type { AliasedExprNode, ArrayExprNode, ASTNode, BetweenNode, BinaryOpNode, CaseNode, CastNode, ColumnRefNode, CTENode, DeleteNode, ExistsNode, ExplainNode, ExpressionNode, FrameBound, FrameSpec, FunctionCallNode, InNode, InsertNode, IsNullNode, JoinNode, JsonAccessNode, LiteralNode, OnConflictNode, OrderByNode, ParamNode, RawNode, SelectNode, StarNode, SubqueryNode, TableRefNode, UnaryOpNode, UpdateNode, WindowFunctionNode } from "../ast/nodes.mjs";
2
+ import type { FullTextSearchNode, MergeNode, MergeWhenMatched, MergeWhenNotMatched } from "../ast/nodes.mjs";
3
+ import type { CompiledQuery, SQLDialect } from "../types.mjs";
4
+ import type { Printer } from "./types.mjs";
5
+ export declare class BasePrinter implements Printer {
6
+ protected params: unknown[];
7
+ protected dialect: SQLDialect;
8
+ constructor(dialect: SQLDialect);
9
+ print(node: ASTNode): CompiledQuery;
10
+ protected printNode(node: ASTNode): string;
11
+ protected printSelect(node: SelectNode): string;
12
+ protected printInsert(node: InsertNode): string;
13
+ protected printOnConflict(node: OnConflictNode): string;
14
+ protected printUpdate(node: UpdateNode): string;
15
+ protected printDelete(node: DeleteNode): string;
16
+ protected printExpression(node: ExpressionNode): string;
17
+ protected printColumnRef(node: ColumnRefNode): string;
18
+ protected printLiteral(node: LiteralNode): string;
19
+ protected printBinaryOp(node: BinaryOpNode): string;
20
+ protected printUnaryOp(node: UnaryOpNode): string;
21
+ protected printFunctionCall(node: FunctionCallNode): string;
22
+ protected printParam(node: ParamNode): string;
23
+ protected printRaw(node: RawNode): string;
24
+ protected printSubquery(node: SubqueryNode): string;
25
+ protected printBetween(node: BetweenNode): string;
26
+ protected printIn(node: InNode): string;
27
+ protected printIsNull(node: IsNullNode): string;
28
+ protected printCase(node: CaseNode): string;
29
+ protected printCast(node: CastNode): string;
30
+ protected printExists(node: ExistsNode): string;
31
+ protected printStar(node: StarNode): string;
32
+ protected printTableRef(ref: TableRefNode): string;
33
+ protected printTemporalClause(clause: import("../ast/nodes.ts").TemporalClause): string;
34
+ protected printJoin(node: JoinNode): string;
35
+ protected printOrderBy(node: OrderByNode): string;
36
+ protected printCTEs(ctes: CTENode[]): string;
37
+ protected printJsonAccess(node: JsonAccessNode): string;
38
+ protected printArrayExpr(node: ArrayExprNode): string;
39
+ protected printWindowFunction(node: WindowFunctionNode): string;
40
+ protected printFrameSpec(frame: FrameSpec): string;
41
+ protected printFrameBound(bound: FrameBound): string;
42
+ protected printMerge(node: MergeNode): string;
43
+ protected printMergeWhenMatched(when: MergeWhenMatched): string;
44
+ protected printMergeWhenNotMatched(when: MergeWhenNotMatched): string;
45
+ protected printAliasedExpr(node: AliasedExprNode): string;
46
+ protected printExplain(node: ExplainNode): string;
47
+ protected printFullTextSearch(node: FullTextSearchNode): string;
48
+ }