sqlite-prepare
Version:
A type-safe SQL query builder for Cloudflare D1
3 lines (2 loc) • 3.12 kB
JavaScript
function r(r){return null==r?null:r instanceof Date||r instanceof Uint8Array||r instanceof ArrayBuffer?r:r&&"object"==typeof r?"__raw"in r&&!0===r.__raw?{__raw:!0,query:r.query,params:r.params}:"__fragment"in r&&!0===r.__fragment?r:"query"in r&&"params"in r?{__subquery:!0,query:r.query,params:r.params}:JSON.stringify(r):r}function n(n,...e){let t,a=[];if("string"==typeof n)t=n,a=e.map(r).flatMap((r=>"object"==typeof r&&null!==r&&("__subquery"in r||"__fragment"in r||"__raw"in r)?r.params||[]:[r]));else{t="";for(let o=0;o<n.length;o++)if(t+=n[o],o<e.length){const n=e[o];if(Array.isArray(n))0===n.length?t+="(NULL)":(t+="("+n.map((()=>"?")).join(", ")+")",a.push(...n.map(r).flatMap((r=>"object"==typeof r&&null!==r&&("__subquery"in r||"__fragment"in r||"__raw"in r)?r.params||[]:[r]))));else if(n&&"object"==typeof n)if("__raw"in n||"__fragment"in n)t+=n.query,n.params&&a.push(...n.params);else if("query"in n&&"params"in n)t+="("+n.query+")",a.push(...n.params);else{const e=r(n);"object"==typeof e&&null!==e&&("__raw"in e||"__fragment"in e||"__subquery"in e)?(t+=e.query,e.params&&a.push(...e.params)):(t+="?",a.push(e))}else t+="?",a.push(r(n))}}return{query:t,params:a}}const e=n;function t(r,...n){if("string"!=typeof r){let e="";return r.forEach(((r,t)=>{e+=r+(void 0!==n[t]?n[t]:"")})),{__raw:!0,query:e}}const e=n[0]||[];return{__raw:!0,query:r,...e.length>0?{params:e}:{}}}const a=t;function o(r,e,...t){const a=n(e,...t);return r.prepare(a.query).bind(...a.params)}const i=o;function u(r){return r}function s(n,e){const t=Array.isArray(e)?e:[e];if(0===t.length)throw new Error("Values array cannot be empty");const a=[],o=new Set;for(const r of t)Object.keys(r).forEach((r=>o.add(r)));const i=Array.from(o),u=t.map((n=>{const e={};for(const t of i){const a=t in n?n[t]:null;e[t]=r(a)}return e})).map((r=>`(${i.map((n=>{const e=r[n];if("object"==typeof e&&null!==e){if("__raw"in e||"__fragment"in e)return a.push(...e.params||[]),e.query;if("__subquery"in e)return a.push(...e.params),`(${e.query})`}return a.push(e),"?"})).join(", ")})`)).join(", ");return{__fragment:!0,query:`INSERT INTO ${n} (${i.join(", ")}) VALUES ${u}`,params:a}}const f=s,y=u;function p(r,...e){const t=n(r,...e);return{__fragment:!0,query:t.query,params:t.params}}const c=p;function _(r,n){const e="string"==typeof r?t(r):r;if(Array.isArray(n)){if(!n.includes(e.query))throw new Error(`Query "${e.query}" is not in the allowed list`);return e}if(function(r){return"function"==typeof r&&1===r.length}(n)){if("string"==typeof r){if(!n(r))throw new Error(`Query "${r}" is not valid`)}else if(!n(e.query))throw new Error(`Query "${e.query}" is not valid`)}else{if(!function(r){return"function"==typeof r&&2===r.length}(n))throw new Error("Invalid validator type");if(!n(e,!0))throw new Error(`Query "${e.query}" is not valid`)}return e}const l=_,m=r=>{if(!r)throw new Error("Database connection is not established.");return o.bind(null,r)};export{e as b,n as build,c as f,p as fragment,f as i,s as insert,u as into,y as it,i as pp,o as prepare,a as r,t as raw,l as v,_ as validate,m as wrapD1};
//# sourceMappingURL=index.esm.js.map