@a2lix/schemql
Version:
A lightweight TypeScript library that enhances your SQL workflow by combining raw SQL with targeted type safety and schema validation
1 lines • 3.06 kB
JavaScript
var e=class{constructor(e){this.options=e,this.createQueryExecutor=e=>t=>async n=>{let i=typeof n==`function`?n(this.createSqlHelper()):n;if(typeof t.params==`function`){let n=e(i),a=async e=>{let i=await n(await this.validateAndStringifyParams({...t,params:e}));return t.resultSchema?await r(t.resultSchema,i):i};return(async function*(){for await(let e of t.params())yield await a(e)})()}if(Array.isArray(t.params)){let n=e(i),a=await this.validateAndStringifyParams({...t,params:t.params}),o=async e=>{let i=await n(e);return t.resultSchema?await r(t.resultSchema,i):i};return(async function*(){for(let e of a)yield await o(e)})()}let a=await this.validateAndStringifyParams({...t,params:t.params}),o=await e(i)(a);return t.resultSchema?await r(t.resultSchema,o):o},this.createIterativeExecutor=e=>t=>async n=>{let i=typeof n==`function`?n(this.createSqlHelper()):n,a=await this.validateAndStringifyParams({...t,params:t.params});return(async function*(){for await(let n of e(i)(a)())yield t.resultSchema?await r(t.resultSchema,n):n})()},this.validateAndStringifyParams=async e=>{if(e.params===void 0)return;let n=e.paramsSchema?await r(e.paramsSchema,e.params):e.params;return this.options.shouldStringifyObjectParams||this.options.stringifyObjectParams?Array.isArray(n)?n.map(e=>t(e)):t(n):n},this.createSqlHelper=()=>({sql:(e,...t)=>this.processLiteralExpressions(e,t),sqlCond:(e,t,n=``)=>`§${e?t:n}`,sqlRaw:e=>`§${e}`}),this.processLiteralExpressions=(e,t)=>e.reduce((e,n,r)=>{let i=t[r];return`${e}${n}${i===void 0?``:this.processLiteralExpression(i)}`},``),this.processLiteralExpression=e=>{if(typeof e==`object`){let t=Object.entries(e);if(t.length===1){let[e,n]=t[0];return this.options.quoteSqlIdentifiers?`"${e}" ("${Array.isArray(n)?n.join(`", "`):String(n)}")`:`${e} (${Array.isArray(n)?n.join(`, `):String(n)})`}}if(typeof e==`string`)switch(!0){case e.startsWith(`@`):{let t=e.indexOf(` $.`);if(t!==-1)return`'${e.slice(t+1)}'`;let r=e,i=r.indexOf(` ->`);if(i!==-1){let e=n(r.slice(i+1));r=`${r.slice(0,i)}${e}`}return r.endsWith(`-`)?r.split(`.`)[1]?.slice(0,-1)??``:r.slice(1)}case e.startsWith(`$`):case e.startsWith(`§`):return e.slice(1);default:return e}return String(e)},this.first=this.createQueryExecutor(this.options.adapter.queryFirst),this.firstOrThrow=this.createQueryExecutor(this.options.adapter.queryFirstOrThrow),this.all=this.createQueryExecutor(this.options.adapter.queryAll),this.iterate=this.createIterativeExecutor(this.options.adapter.queryIterate)}};const t=e=>Object.entries(e).reduce((e,[t,n])=>(e[t]=typeof n==`object`&&n?JSON.stringify(n):n,e),{}),n=e=>e.split(/(?=->)/).reduce((e,t)=>{let n=t.startsWith(`->>`)?`->>`:`->`;return`${e}${n}'${t.replace(n,``)}'`},``),r=async(e,t)=>{let n=e[`~standard`].validate(t);if(n instanceof Promise&&(n=await n),n.issues)throw Error(`Validation failed: ${JSON.stringify(n.issues,null,2)}`);return n.value},i=(e,t)=>{if(typeof e==`string`)try{return JSON.parse(e)}catch(e){t.addIssue({code:`custom`,message:e.message})}return e};export{e as SchemQl,i as parseJsonPreprocessor};