query-weaver 0.0.5 → 0.0.6
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/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +3 -3
- package/dist/index.esm.mjs +1 -1
- package/dist/index.esm.mjs.map +3 -3
- package/dist/query-helper.d.ts +22 -15
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var ye=Object.create;var j=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var fe=Object.getPrototypeOf,de=Object.prototype.hasOwnProperty;var me=(e,r)=>{for(var t in r)j(e,t,{get:r[t],enumerable:!0})},Y=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of ce(r))!de.call(e,u)&&u!==t&&j(e,u,{get:()=>r[u],enumerable:!(n=ge(r,u))||n.enumerable});return e};var he=(e,r,t)=>(t=e!=null?ye(fe(e)):{},Y(r||!e||!e.__esModule?j(t,"default",{value:e,enumerable:!0}):t,e)),we=e=>Y(j({},"__esModule",{value:!0}),e);var N=(e,r,t)=>{if(!r.has(e))throw TypeError("Cannot "+t)};var i=(e,r,t)=>(N(e,r,"read from private field"),t?t.call(e):r.get(e)),l=(e,r,t)=>{if(r.has(e))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(e):r.set(e,t)},y=(e,r,t,n)=>(N(e,r,"write to private field"),n?n.call(e,t):r.set(e,t),t);var g=(e,r,t)=>(N(e,r,"access private method"),t);var xe={};me(xe,{AND:()=>K,OR:()=>X,QueryHelper:()=>v,WHERE:()=>w,WHERE_AND:()=>ie,WHERE_OR:()=>L,and:()=>ue,buildClauses:()=>k,buildDelete:()=>P,buildInsert:()=>$,buildKeys:()=>M,buildUpdate:()=>V,buildValues:()=>U,ident:()=>ee,isQueryFragment:()=>x,isQueryTemplateStyle:()=>S,json:()=>re,or:()=>ne,pgIdent:()=>Z,pgString:()=>q,raw:()=>te,sql:()=>s,useQueryHelper:()=>Te,where:()=>se,where_and:()=>oe,where_or:()=>ae});module.exports=we(xe);var W=he(require("pg-escape"));function Z(e){return e.split(".").map(r=>W.default.ident(r)).join(".")}function q(e){return e===null?"NULL":typeof e=="boolean"?e?"true":"false":Array.isArray(e)?"ARRAY["+e.map(q).join(",")+"]":typeof e=="object"?W.default.literal(JSON.stringify(e)):W.default.literal(String(e))}var m=class{constructor(){this.text="";this.values=[];this.embed="";Object.defineProperties(this,{text:{enumerable:!0,get(){return this.compiled.text}},values:{enumerable:!0,get(){return this.compiled.values}},embed:{enumerable:!0,get(){return this.compiled.embed}}})}get compiled(){let r=[],t=this.toString({valueFn:u=>(r.push(u),"$"+r.length)}),n=this.toString();return{text:t,values:r,embed:n}}},F,D=class extends m{constructor(t){super();l(this,F,void 0);y(this,F,t)}toString(t){return(t?.valueFn??q)(i(this,F))}};F=new WeakMap;var O,I=class extends m{constructor(t){super();l(this,O,void 0);y(this,O,t)}toString(t){return(t?.identFn??Z)(i(this,O))}};O=new WeakMap;var A,_=class extends m{constructor(t){super();l(this,A,void 0);y(this,A,String(t))}toString(){return i(this,A)}};A=new WeakMap;function x(e){return e instanceof m}function f(e){return new I(e)}function z(e){return typeof e>"u"||x(e)?e:new D(e)}function h(e){return typeof e>"u"||x(e)?e:Array.isArray(e)?new c(e.map(h)):new _(e)}function G(e){return typeof e>"u"||x(e)?e:h(JSON.stringify(e))}var S=e=>{if(!Array.isArray(e)||typeof e?.[0]!="object"||e[0]===null||!("raw"in e[0])||!Array.isArray(e[0]))return!1;let[r,...t]=e;return r.length-1===t.length};function B(e,r){if(e.length-1!==r.length)throw new Error("Invalid call of the function");return e.flatMap((t,n)=>n?[r[n-1],t]:[t])}var T,o,c=class extends m{constructor(...t){super();l(this,T,[]);l(this,o,void 0);if(y(this,o,{prefix:"",glue:"",suffix:"",empty:"",wrapperFn:n=>n}),Array.isArray(t[0])){let[n,u]=t;y(this,o,{...i(this,o),...u}),this.push(...n)}else{let[n]=t;y(this,o,{...i(this,o),...n})}}setSewingPattern(t="",n="",u="",a=""){return y(this,o,{...i(this,o),prefix:t,glue:n,suffix:u,empty:a}),this}push(...t){return i(this,T).push(...t.map(h).filter(n=>n!==void 0)),this}append(...t){return this.push(...t)}join(t=", "){return i(this,o).glue=t,this}prefix(t=" "){return i(this,o).prefix=t,this}suffix(t=" "){return i(this,o).suffix=t,this}empty(t=""){return i(this,o).empty=t,this}toString(t){return i(this,T).length===0?i(this,o).empty:i(this,o).prefix+i(this,o).wrapperFn(i(this,T).map(n=>n.toString(t)).join(i(this,o).glue),t)+i(this,o).suffix}};T=new WeakMap,o=new WeakMap;function s(...e){let r;if(S(e)){let[t,...n]=e;r=[new c(B(t.map(h),n.map(z)))]}else r=e.map(z);return new c(r)}var ee=f;function te(...e){return new c(e.map(h))}function re(...e){let r,t=(n,u)=>(u?.valueFn||q)(n);if(S(e)){let[n,...u]=e;r=[new c(B(n.map(h),u.map(G)),{wrapperFn:t})]}else r=e.map(n=>new c([G(n)],{wrapperFn:t}));return new c(r)}function k(...e){let r=new c,t=n=>{if(n!==void 0&&n!==null){if(typeof n=="string"){r.push(h(n));return}if(x(n)){r.push(n);return}if(Array.isArray(n)){n.forEach(t);return}if(typeof n=="object"){for(let u in n)if(n[u]!==void 0){if(x(n[u])){r.push(s`${f(u)} ${n[u]}`);continue}if(n[u]===null){r.push(s`${f(u)} IS NULL`);continue}if(Array.isArray(n[u])){r.push(s`${f(u)} = ANY (${n[u]})`);continue}r.push(s`${f(u)} = ${n[u]}`)}return}}};return t(e),r}function X(...e){return k(e).setSewingPattern("((",") OR (","))","false")}function K(...e){return k(e).setSewingPattern("((",") AND (","))","true")}function w(...e){return k(e).setSewingPattern("WHERE ((",") AND (","))","")}function L(...e){return k(e).setSewingPattern("WHERE ((",") OR (","))","")}function U(e){if(!Array.isArray(e)){if(typeof e!="object")throw new Error("buildValues: The argument must be an array");e=[e]}if(e.length===0)throw new Error("buildValues: Array must contain elements at least one");let r=e.map(u=>typeof u=="object"?Object.values(u):u),t=r[0].length;if(r.some(u=>u.length!==t))throw new Error("buildValues: Array must all be the same length");let n=s(...r.map(u=>s(...u).join(", "))).setSewingPattern("(","), (",")");return s`VALUES ${n}`}function M(e){if(Array.isArray(e)||(e=[e]),e.length==0||!e[0]||typeof e[0]!="object")throw new Error("Invalid call of the function");let r=Object.keys(e[0]),t=r.join();if(e.some(n=>Object.keys(n).join()!==t))throw new Error("buildKeys: All objects must have the same key");return s(...r.map(f)).setSewingPattern("(",", ",")")}function $(e,r,t){Array.isArray(r)||(r=[r]);let n=M(r),u=U(r.map(Object.values));return s`INSERT INTO ${f(e)} ${n} ${u}`.append(t).join(" ")}function V(e,r,t,n){let u=new c;for(let a in r){let E=r[a];E!==void 0&&u.push(s`${f(a)} = ${E}`)}return s`UPDATE ${f(e)} SET ${u.join(", ")} ${w(t)}`.append(n).join(" ")}function P(e,r,t){return s`DELETE FROM ${f(e)} ${w(r)}`.append(t).join(" ")}var ne=X,ue=K,se=w,ie=w,oe=w,ae=L;s.raw=te;s.ident=ee;s.json=re;s.WHERE=w;s.WHERE_AND=ie;s.WHERE_OR=L;s.AND=K;s.OR=X;s.where=se;s.where_and=oe;s.where_or=ae;s.and=ue;s.or=ne;s.insert=$;s.update=V;s.delete=P;s.keys=M;s.values=U;function Qe(e,r){return e={...e},Object.defineProperties(e,Object.fromEntries(Object.keys(e).map(t=>[t,r.includes(t)?{}:{enumerable:!1}]))),e}var b,Q,C,pe,p,d,v=class{constructor(r,t={}){l(this,C);l(this,p);l(this,b,void 0);l(this,Q,void 0);y(this,b,r),y(this,Q,t)}async insert(r,t,n){let u=$(r,t,n);return await g(this,p,d).call(this,[u])}async update(r,t,n,u){let a=V(r,t,n,u);return await g(this,p,d).call(this,[a])}async delete(r,t,n){let u=P(r,t,n);return await g(this,p,d).call(this,[u])}async query(...r){return g(this,p,d).call(this,r)}async getRows(...r){return g(this,p,d).call(this,r).then(t=>t.rows)}async getRow(...r){return g(this,p,d).call(this,r).then(t=>t.rows?.[0])}async getOne(...r){return g(this,p,d).call(this,r).then(t=>Object.values(t.rows?.[0])?.[0])}async getCount(...r){return g(this,p,d).call(this,r).then(t=>t.rowCount)}async exec(...r){return g(this,p,d).call(this,r).then(t=>t.rowCount)}};b=new WeakMap,Q=new WeakMap,C=new WeakSet,pe=function(r){if(S(r)){let[u,...a]=r;return s(u,...a)}let[t,n]=r;return typeof t=="object"&&t&&"text"in t?t:{text:t,values:n??[]}},p=new WeakSet,d=async function(r){let t=g(this,C,pe).call(this,r);i(this,Q)?.beforeQuery?.(t);let n=await i(this,b).query(t).catch(u=>{throw i(this,Q)?.onError?.(t,u),u});return i(this,Q)?.afterQuery?.({...t,results:Qe(n,["command","rowCount","rows"])}),n};function Te(e,r){let t=new v(e,r),n=new Proxy(e,{get(u,a,E){let H=a in t?t:a in u?u:void 0,R=H&&Reflect.get(H,a);return R&&R instanceof Function?function(...le){let J=R.apply(this===E?H:this,le);return J===u?n:J}:R===u?n:R}});return n}0&&(module.exports={AND,OR,QueryHelper,WHERE,WHERE_AND,WHERE_OR,and,buildClauses,buildDelete,buildInsert,buildKeys,buildUpdate,buildValues,ident,isQueryFragment,isQueryTemplateStyle,json,or,pgIdent,pgString,raw,sql,useQueryHelper,where,where_and,where_or});
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/query-weaver.ts", "../src/query-helper.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './query-weaver';\nexport * from './query-helper';\n", "import pgescape from 'pg-escape';\n\ntype EscapeFunction = (v: unknown) => string;\nexport type FieldValues = Record<string, unknown>;\nexport type WhereArg =\n | string\n | FieldValues\n | QueryFragment\n | undefined\n | WhereArg[];\n\nexport function pgIdent(s: string) {\n // '.' is a special for us\n return s\n .split('.')\n .map((x) => pgescape.ident(x))\n .join('.');\n}\n\n// fallback function for when the EscapeFunction is not specified\nexport function pgString(s: unknown): string {\n if (s === null) return 'NULL';\n if (typeof s === 'boolean') return s ? 'true' : 'false';\n if (Array.isArray(s)) return 'ARRAY[' + s.map(pgString).join(',') + ']';\n if (typeof s === 'object') return pgescape.literal(JSON.stringify(s));\n return pgescape.literal(String(s));\n}\n\ntype QueryFragmentToStringOptions = {\n valueFn?: EscapeFunction;\n identFn?: EscapeFunction;\n};\n\nexport interface QueryFragment {\n text: string;\n values?: unknown[];\n embed?: string;\n sql?: string;\n\n toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nabstract class QueryFragmentBase implements QueryFragment {\n // XXX: entries for defineProperties\n text: string = '';\n values?: unknown[] | undefined = [];\n embed?: string = '';\n\n get compiled() {\n const values = [] as unknown[];\n const text = this.toString({\n valueFn: (x: unknown) => {\n values.push(x);\n return '$' + values.length;\n },\n });\n const embed = this.toString();\n\n return {\n text,\n values,\n embed,\n };\n }\n\n constructor() {\n Object.defineProperties(this, {\n text: {\n enumerable: true,\n get() {\n return this.compiled.text;\n },\n },\n values: {\n enumerable: true,\n get() {\n return this.compiled.values;\n },\n },\n embed: {\n enumerable: true,\n get() {\n return this.compiled.embed;\n },\n },\n });\n }\n\n abstract toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nclass QueryFragmentValue extends QueryFragmentBase {\n #value: unknown;\n\n constructor(value: unknown) {\n super();\n this.#value = value;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.valueFn ?? pgString)(this.#value);\n }\n}\n\nclass QueryFragmentIdent extends QueryFragmentBase {\n #ident: string;\n\n constructor(ident: string) {\n super();\n this.#ident = ident;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.identFn ?? pgIdent)(this.#ident);\n }\n}\n\n// we exploits String constructor\nclass QueryFragmentRawString extends QueryFragmentBase {\n #string: string;\n\n constructor(s: unknown) {\n super();\n this.#string = String(s);\n }\n\n /* toString(_?: QueryFragmentToStringOptions) { */\n toString() {\n return this.#string;\n }\n}\n\nexport function isQueryFragment(x: unknown): x is QueryFragment {\n return x instanceof QueryFragmentBase;\n}\n\nfunction makeIdent(name: string) {\n return new QueryFragmentIdent(name);\n}\n\nfunction makeValue(x: unknown): QueryFragment | undefined {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return new QueryFragmentValue(x);\n}\n\nfunction makeRaw(text: unknown | unknown[]): QueryFragment | undefined {\n if (typeof text === 'undefined' || isQueryFragment(text)) return text;\n if (Array.isArray(text)) return new QueryFragments(text.map(makeRaw));\n return new QueryFragmentRawString(text);\n}\n\nfunction makeJsonValue(x: unknown) {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return makeRaw(JSON.stringify(x));\n}\n\ntype QueryFragmentsOptions = {\n prefix?: string;\n glue?: string;\n suffix?: string;\n empty?: string;\n\n wrapperFn?: (s: string, opts?: QueryFragmentToStringOptions) => string;\n};\n\nexport type QueryTemplateStyle = [\n text: TemplateStringsArray,\n ...values: unknown[]\n];\nexport const isQueryTemplateStyle = (\n args: unknown\n): args is QueryTemplateStyle => {\n if (!Array.isArray(args)) return false;\n if (typeof args?.[0] !== 'object' || args[0] === null || !('raw' in args[0]))\n return false;\n if (!Array.isArray(args[0])) return false;\n const [texts, ...values] = args;\n return texts.length - 1 === values.length;\n};\n\nfunction sewTemplateTextsAndValues<T = unknown, R = unknown>(\n texts: T[],\n values: R[]\n) {\n if (texts.length - 1 !== values.length)\n throw new Error('Invalid call of the function');\n return texts.flatMap((text, idx) => (idx ? [values[idx - 1], text] : [text]));\n}\n\nclass QueryFragments extends QueryFragmentBase {\n #list: QueryFragment[] = [];\n #opts: Required<QueryFragmentsOptions>;\n\n constructor(\n ...args:\n | []\n | [values: (QueryFragment | undefined)[], opts?: QueryFragmentsOptions]\n | [opts?: QueryFragmentsOptions]\n ) {\n super();\n this.#opts = {\n prefix: '',\n glue: '',\n suffix: '',\n empty: '',\n wrapperFn: (x) => x,\n };\n\n if (Array.isArray(args[0])) {\n const [values, opts] = args as [\n values: (QueryFragment | undefined)[],\n opts?: QueryFragmentsOptions\n ];\n this.#opts = { ...this.#opts, ...opts };\n this.push(...values);\n } else {\n const [opts] = args as [opts?: QueryFragmentsOptions];\n this.#opts = { ...this.#opts, ...opts };\n }\n }\n\n setSewingPattern(\n prefix: string = '',\n glue: string = '',\n suffix: string = '',\n empty: string = ''\n ) {\n this.#opts = { ...this.#opts, prefix, glue, suffix, empty };\n return this;\n }\n\n push(...args: (QueryFragment | string | undefined)[]) {\n this.#list.push(\n ...(args.map(makeRaw).filter((x) => x !== undefined) as QueryFragment[])\n );\n return this;\n }\n\n // alias\n append(...args: (QueryFragment | string | undefined)[]) {\n return this.push(...args);\n }\n\n join(glue: string = ', ') {\n this.#opts.glue = glue;\n return this;\n }\n\n prefix(prefix: string = ' ') {\n this.#opts.prefix = prefix;\n return this;\n }\n\n suffix(suffix: string = ' ') {\n this.#opts.suffix = suffix;\n return this;\n }\n\n empty(empty: string = '') {\n this.#opts.empty = empty;\n return this;\n }\n\n toString(opts?: QueryFragmentToStringOptions): string {\n if (this.#list.length === 0) return this.#opts.empty;\n return (\n this.#opts.prefix +\n this.#opts.wrapperFn(\n this.#list.map((x) => x.toString(opts)).join(this.#opts.glue),\n opts\n ) +\n this.#opts.suffix\n );\n }\n}\n\nexport function sql(\n ...args:\n | [texts: TemplateStringsArray, ...values: unknown[]]\n | [...values: unknown[]]\n): QueryFragments {\n let fragments: (QueryFragment | undefined)[];\n if (isQueryTemplateStyle(args)) {\n // sql`...` comes here\n const [texts, ...values] = args as [\n texts: TemplateStringsArray,\n values: unknown[]\n ];\n // template string looks like a single QueryFragment for user\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(texts.map(makeRaw), values.map(makeValue))\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(makeValue);\n }\n\n return new QueryFragments(fragments);\n}\n\nexport const ident = makeIdent;\n\nexport function raw(...args: unknown[]) {\n return new QueryFragments(args.map(makeRaw));\n}\n\nexport function json(\n ...args:\n | [...json: unknown[]]\n | [texts: TemplateStringsArray, ...args: unknown[]]\n) {\n let fragments: (QueryFragment | undefined)[];\n const wrapperFn = (x: string, opts?: QueryFragmentToStringOptions) =>\n (opts?.valueFn || pgString)(x);\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(\n texts.map(makeRaw),\n values.map(makeJsonValue)\n ),\n { wrapperFn }\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(\n (x) => new QueryFragments([makeJsonValue(x)], { wrapperFn })\n );\n }\n\n return new QueryFragments(fragments);\n}\n\nexport function buildClauses(...args: WhereArg[]) {\n const clauses = new QueryFragments();\n\n const parse = (val: WhereArg) => {\n if (val === undefined) return;\n if (val === null) return;\n\n if (typeof val === 'string') {\n clauses.push(makeRaw(val));\n return;\n }\n\n if (isQueryFragment(val)) {\n clauses.push(val);\n return;\n }\n\n if (Array.isArray(val)) {\n val.forEach(parse);\n return;\n }\n\n if (typeof val === 'object') {\n for (const key in val) {\n if (val[key] === undefined) continue;\n\n if (isQueryFragment(val[key])) {\n clauses.push(sql`${makeIdent(key)} ${val[key]}`);\n continue;\n }\n\n if (val[key] === null) {\n clauses.push(sql`${makeIdent(key)} IS NULL`);\n continue;\n }\n\n if (Array.isArray(val[key])) {\n clauses.push(sql`${makeIdent(key)} = ANY (${val[key]})`);\n continue;\n }\n\n // \u305D\u308C\u4EE5\u5916\n clauses.push(sql`${makeIdent(key)} = ${val[key]}`);\n }\n return;\n }\n };\n\n parse(args);\n\n return clauses;\n}\n\nexport function OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') OR (', '))', 'false');\n}\n\nexport function AND(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') AND (', '))', 'true');\n}\n\nexport function WHERE(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') AND (', '))', '');\n}\n\nexport function WHERE_OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') OR (', '))', '');\n}\n\nexport function buildValues(fvs: (FieldValues | unknown[])[]) {\n if (!Array.isArray(fvs)) {\n if (typeof fvs !== 'object')\n throw new Error('buildValues: The argument must be an array');\n fvs = [fvs];\n }\n if (fvs.length === 0)\n throw new Error('buildValues: Array must contain elements at least one');\n\n const array = fvs.map((x) => (typeof x === 'object' ? Object.values(x) : x));\n\n const sig = array[0].length;\n if (array.some((arg) => arg.length !== sig)) {\n throw new Error('buildValues: Array must all be the same length');\n }\n\n const values = sql(\n ...array.map((v) => sql(...v).join(', '))\n ).setSewingPattern('(', '), (', ')');\n return sql`VALUES ${values}`;\n}\n\nexport function buildKeys(fvs: FieldValues[] | FieldValues) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n if (fvs.length == 0 || !fvs[0] || typeof fvs[0] !== 'object')\n throw new Error('Invalid call of the function');\n\n const ks = Object.keys(fvs[0]);\n const sig = ks.join();\n if (fvs.some((fv) => Object.keys(fv).join() !== sig)) {\n throw new Error('buildKeys: All objects must have the same key');\n }\n\n return sql(...ks.map(makeIdent)).setSewingPattern('(', ', ', ')');\n}\n\nexport function buildInsert(\n table: string,\n fvs: FieldValues[] | FieldValues,\n appendix?: string | QueryFragment\n) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n\n const keys = buildKeys(fvs);\n const values = buildValues(fvs.map(Object.values));\n\n return sql`INSERT INTO ${makeIdent(table)} ${keys} ${values}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildUpdate(\n table: string,\n fv: FieldValues,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n const pairs = new QueryFragments();\n\n for (const k in fv) {\n const val = fv[k];\n if (val === undefined) continue;\n\n pairs.push(sql`${makeIdent(k)} = ${val}`);\n }\n\n return sql`UPDATE ${makeIdent(table)} SET ${pairs.join(', ')} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildDelete(\n table: string,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n return sql`DELETE FROM ${makeIdent(table)} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\n// aliases\nexport const or = OR;\nexport const and = AND;\nexport const where = WHERE;\nexport const WHERE_AND = WHERE;\nexport const where_and = WHERE;\nexport const where_or = WHERE_OR;\n\n// expose via `sql`\nsql.raw = raw;\nsql.ident = ident;\nsql.json = json;\nsql.WHERE = WHERE;\nsql.WHERE_AND = WHERE_AND;\nsql.WHERE_OR = WHERE_OR;\nsql.AND = AND;\nsql.OR = OR;\nsql.where = where;\nsql.where_and = where_and;\nsql.where_or = where_or;\nsql.and = and;\nsql.or = or;\nsql.insert = buildInsert;\nsql.update = buildUpdate;\nsql.delete = buildDelete;\nsql.keys = buildKeys;\nsql.values = buildValues;\n\nexport default {\n sql,\n raw,\n ident,\n json,\n WHERE,\n WHERE_AND,\n WHERE_OR,\n AND,\n OR,\n where,\n where_and,\n where_or,\n and,\n or,\n buildInsert,\n buildUpdate,\n buildDelete,\n buildValues,\n};\n", "import type pg from 'pg';\nimport type {\n QueryFragment,\n FieldValues,\n WhereArg,\n QueryTemplateStyle,\n} from './query-weaver';\nimport {\n sql,\n buildInsert,\n buildUpdate,\n buildDelete,\n isQueryTemplateStyle,\n} from './query-weaver';\n\n// pg (almost) compatible types to relief and reduce their requirements\ntype pgQueryResultCustom<R> = {\n rowCount: number;\n rows: R[];\n fields?: Partial<pg.FieldDef>[];\n};\ntype pgQueryResult<R> = Omit<\n Partial<pg.QueryResult>,\n keyof pgQueryResultCustom<R>\n> &\n pgQueryResultCustom<R>;\n\nexport interface Queryable {\n query: <T extends pg.QueryResultRow>(queryConfig: {\n text: string;\n values?: unknown[];\n }) => Promise<pgQueryResult<T>>;\n}\n\ntype QueryHelperOptions = {\n placeHolderFn?: (v: unknown, values: unknown[]) => string;\n\n beforeQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n afterQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n onError?: <T extends pg.QueryConfig<unknown[]>>(ctx: T, e: Error) => void;\n};\n\ntype QueryTemplateOrSimpleQuery =\n | QueryTemplateStyle\n | [query: string, values?: unknown[]]\n | [query: pg.QueryConfig<unknown[]>];\n\nfunction hidePropertyExcludes(target: object, keys: string[]) {\n target = { ...target };\n Object.defineProperties(\n target,\n Object.fromEntries(\n Object.keys(target).map((k) => [\n k,\n keys.includes(k) ? {} : { enumerable: false },\n ])\n )\n );\n return target;\n}\n\n/**\n * Query Helper\n */\nexport class QueryHelper {\n #db: Queryable;\n #opts: QueryHelperOptions;\n\n constructor(db: Queryable, opts: QueryHelperOptions = {}) {\n this.#db = db;\n this.#opts = opts;\n }\n\n #parseQueryTemplateStyle(\n args: QueryTemplateOrSimpleQuery\n ): pg.QueryConfig<unknown[]> {\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n return sql(texts, ...values);\n }\n\n const [query, values] = args;\n\n if (typeof query === 'object' && query && 'text' in query) {\n return query;\n }\n\n return { text: query, values: values ?? [] };\n }\n\n async #query<T extends pg.QueryResultRow>(args: QueryTemplateOrSimpleQuery) {\n const query = this.#parseQueryTemplateStyle(args);\n\n this.#opts?.beforeQuery?.(query);\n\n const results = await this.#db.query<T>(query).catch((e) => {\n this.#opts?.onError?.(query, e);\n throw e;\n });\n\n this.#opts?.afterQuery?.({\n ...query,\n results: hidePropertyExcludes(results, ['command', 'rowCount', 'rows']),\n });\n\n return results;\n }\n\n // ==================================================================================================\n // query executors\n\n async insert<T extends pg.QueryResultRow>(\n table: string,\n fv: FieldValues,\n appendix?: string | QueryFragment\n ) {\n const query = buildInsert(table, fv, appendix);\n return await this.#query<T>([query]);\n }\n\n async update<T extends pg.QueryResultRow>(\n table: string,\n fv: FieldValues,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildUpdate(table, fv, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async delete<T extends pg.QueryResultRow>(\n table: string,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildDelete(table, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async query<T extends pg.QueryResultRow>(\n ...args: QueryTemplateOrSimpleQuery\n ) {\n return this.#query<T>(args);\n }\n\n async getRows<T extends pg.QueryResultRow>(\n ...args: QueryTemplateOrSimpleQuery\n ) {\n return this.#query<T>(args).then((x) => x.rows);\n }\n\n async getRow<T extends pg.QueryResultRow>(\n ...args: QueryTemplateOrSimpleQuery\n ) {\n return this.#query<T>(args).then((x) => x.rows?.[0]);\n }\n\n async getOne<T = unknown>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => Object.values(x.rows?.[0])?.[0] as T);\n }\n\n async getCount(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => x.rowCount);\n }\n async exec(...args: QueryTemplateOrSimpleQuery) {\n // same as getCount\n return this.#query(args).then((x) => x.rowCount);\n }\n}\n\n/**\n * Returns a proxy object that overrides the queryable instance `db` by Query Helper utilities\n * @param db - Queryable object to be wrapped\n */\nexport function useQueryHelper<T extends Queryable>(\n db: T,\n opts?: QueryHelperOptions\n): Omit<T, keyof QueryHelper> & QueryHelper {\n const qh = new QueryHelper(db, opts);\n return new Proxy(db, {\n get(db, key, receiver) {\n const target = key in qh ? qh : key in db ? db : undefined;\n\n const value = target && Reflect.get(target, key);\n\n if (value && value instanceof Function) {\n return function (this: unknown, ...args: unknown[]) {\n return value.apply(this === receiver ? target : this, args);\n };\n }\n\n return value;\n },\n }) as T & QueryHelper;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["src_exports", "__export", "AND", "OR", "QueryHelper", "WHERE", "WHERE_AND", "WHERE_OR", "and", "buildClauses", "buildDelete", "buildInsert", "buildKeys", "buildUpdate", "buildValues", "ident", "isQueryFragment", "isQueryTemplateStyle", "json", "or", "pgIdent", "pgString", "raw", "sql", "useQueryHelper", "where", "where_and", "where_or", "__toCommonJS", "import_pg_escape", "pgIdent", "s", "x", "pgescape", "pgString", "QueryFragmentBase", "values", "text", "embed", "_value", "QueryFragmentValue", "value", "__privateAdd", "__privateSet", "opts", "__privateGet", "_ident", "QueryFragmentIdent", "ident", "_string", "QueryFragmentRawString", "isQueryFragment", "makeIdent", "name", "makeValue", "makeRaw", "QueryFragments", "makeJsonValue", "isQueryTemplateStyle", "args", "texts", "sewTemplateTextsAndValues", "idx", "_list", "_opts", "prefix", "glue", "suffix", "empty", "sql", "fragments", "raw", "json", "wrapperFn", "buildClauses", "clauses", "parse", "val", "key", "OR", "fv", "AND", "WHERE", "WHERE_OR", "buildValues", "fvs", "array", "sig", "arg", "v", "buildKeys", "ks", "buildInsert", "table", "appendix", "keys", "buildUpdate", "where", "pairs", "k", "buildDelete", "or", "and", "WHERE_AND", "where_and", "where_or", "hidePropertyExcludes", "target", "keys", "k", "_db", "_opts", "_parseQueryTemplateStyle", "parseQueryTemplateStyle_fn", "_query", "query_fn", "QueryHelper", "db", "opts", "__privateAdd", "__privateSet", "table", "fv", "appendix", "query", "buildInsert", "__privateMethod", "where", "buildUpdate", "buildDelete", "args", "x", "isQueryTemplateStyle", "texts", "values", "sql", "__privateGet", "results", "e", "useQueryHelper", "qh", "key", "receiver", "value"]
|
|
4
|
+
"sourcesContent": ["export * from './query-weaver';\nexport * from './query-helper';\n", "import pgescape from 'pg-escape';\n\ntype EscapeFunction = (v: unknown) => string;\nexport type FieldValues = Record<string, unknown>;\nexport type WhereArg =\n | string\n | FieldValues\n | QueryFragment\n | undefined\n | WhereArg[];\n\nexport function pgIdent(s: string) {\n // '.' is a special for us\n return s\n .split('.')\n .map((x) => pgescape.ident(x))\n .join('.');\n}\n\n// fallback function for when the EscapeFunction is not specified\nexport function pgString(s: unknown): string {\n if (s === null) return 'NULL';\n if (typeof s === 'boolean') return s ? 'true' : 'false';\n if (Array.isArray(s)) return 'ARRAY[' + s.map(pgString).join(',') + ']';\n if (typeof s === 'object') return pgescape.literal(JSON.stringify(s));\n return pgescape.literal(String(s));\n}\n\ntype QueryFragmentToStringOptions = {\n valueFn?: EscapeFunction;\n identFn?: EscapeFunction;\n};\n\nexport interface QueryFragment {\n text: string;\n values?: unknown[];\n embed?: string;\n sql?: string;\n\n toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nabstract class QueryFragmentBase implements QueryFragment {\n // XXX: entries for defineProperties\n text: string = '';\n values?: unknown[] | undefined = [];\n embed?: string = '';\n\n get compiled() {\n const values = [] as unknown[];\n const text = this.toString({\n valueFn: (x: unknown) => {\n values.push(x);\n return '$' + values.length;\n },\n });\n const embed = this.toString();\n\n return {\n text,\n values,\n embed,\n };\n }\n\n constructor() {\n Object.defineProperties(this, {\n text: {\n enumerable: true,\n get() {\n return this.compiled.text;\n },\n },\n values: {\n enumerable: true,\n get() {\n return this.compiled.values;\n },\n },\n embed: {\n enumerable: true,\n get() {\n return this.compiled.embed;\n },\n },\n });\n }\n\n abstract toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nclass QueryFragmentValue extends QueryFragmentBase {\n #value: unknown;\n\n constructor(value: unknown) {\n super();\n this.#value = value;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.valueFn ?? pgString)(this.#value);\n }\n}\n\nclass QueryFragmentIdent extends QueryFragmentBase {\n #ident: string;\n\n constructor(ident: string) {\n super();\n this.#ident = ident;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.identFn ?? pgIdent)(this.#ident);\n }\n}\n\n// we exploits String constructor\nclass QueryFragmentRawString extends QueryFragmentBase {\n #string: string;\n\n constructor(s: unknown) {\n super();\n this.#string = String(s);\n }\n\n /* toString(_?: QueryFragmentToStringOptions) { */\n toString() {\n return this.#string;\n }\n}\n\nexport function isQueryFragment(x: unknown): x is QueryFragment {\n return x instanceof QueryFragmentBase;\n}\n\nfunction makeIdent(name: string) {\n return new QueryFragmentIdent(name);\n}\n\nfunction makeValue(x: unknown): QueryFragment | undefined {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return new QueryFragmentValue(x);\n}\n\nfunction makeRaw(text: unknown | unknown[]): QueryFragment | undefined {\n if (typeof text === 'undefined' || isQueryFragment(text)) return text;\n if (Array.isArray(text)) return new QueryFragments(text.map(makeRaw));\n return new QueryFragmentRawString(text);\n}\n\nfunction makeJsonValue(x: unknown) {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return makeRaw(JSON.stringify(x));\n}\n\ntype QueryFragmentsOptions = {\n prefix?: string;\n glue?: string;\n suffix?: string;\n empty?: string;\n\n wrapperFn?: (s: string, opts?: QueryFragmentToStringOptions) => string;\n};\n\nexport type QueryTemplateStyle = [\n text: TemplateStringsArray,\n ...values: unknown[]\n];\nexport const isQueryTemplateStyle = (\n args: unknown\n): args is QueryTemplateStyle => {\n if (!Array.isArray(args)) return false;\n if (typeof args?.[0] !== 'object' || args[0] === null || !('raw' in args[0]))\n return false;\n if (!Array.isArray(args[0])) return false;\n const [texts, ...values] = args;\n return texts.length - 1 === values.length;\n};\n\nfunction sewTemplateTextsAndValues<T = unknown, R = unknown>(\n texts: T[],\n values: R[]\n) {\n if (texts.length - 1 !== values.length)\n throw new Error('Invalid call of the function');\n return texts.flatMap((text, idx) => (idx ? [values[idx - 1], text] : [text]));\n}\n\nclass QueryFragments extends QueryFragmentBase {\n #list: QueryFragment[] = [];\n #opts: Required<QueryFragmentsOptions>;\n\n constructor(\n ...args:\n | []\n | [values: (QueryFragment | undefined)[], opts?: QueryFragmentsOptions]\n | [opts?: QueryFragmentsOptions]\n ) {\n super();\n this.#opts = {\n prefix: '',\n glue: '',\n suffix: '',\n empty: '',\n wrapperFn: (x) => x,\n };\n\n if (Array.isArray(args[0])) {\n const [values, opts] = args as [\n values: (QueryFragment | undefined)[],\n opts?: QueryFragmentsOptions\n ];\n this.#opts = { ...this.#opts, ...opts };\n this.push(...values);\n } else {\n const [opts] = args as [opts?: QueryFragmentsOptions];\n this.#opts = { ...this.#opts, ...opts };\n }\n }\n\n setSewingPattern(\n prefix: string = '',\n glue: string = '',\n suffix: string = '',\n empty: string = ''\n ) {\n this.#opts = { ...this.#opts, prefix, glue, suffix, empty };\n return this;\n }\n\n push(...args: (QueryFragment | string | undefined)[]) {\n this.#list.push(\n ...(args.map(makeRaw).filter((x) => x !== undefined) as QueryFragment[])\n );\n return this;\n }\n\n // alias\n append(...args: (QueryFragment | string | undefined)[]) {\n return this.push(...args);\n }\n\n join(glue: string = ', ') {\n this.#opts.glue = glue;\n return this;\n }\n\n prefix(prefix: string = ' ') {\n this.#opts.prefix = prefix;\n return this;\n }\n\n suffix(suffix: string = ' ') {\n this.#opts.suffix = suffix;\n return this;\n }\n\n empty(empty: string = '') {\n this.#opts.empty = empty;\n return this;\n }\n\n toString(opts?: QueryFragmentToStringOptions): string {\n if (this.#list.length === 0) return this.#opts.empty;\n return (\n this.#opts.prefix +\n this.#opts.wrapperFn(\n this.#list.map((x) => x.toString(opts)).join(this.#opts.glue),\n opts\n ) +\n this.#opts.suffix\n );\n }\n}\n\nexport function sql(\n ...args:\n | [texts: TemplateStringsArray, ...values: unknown[]]\n | [...values: unknown[]]\n): QueryFragments {\n let fragments: (QueryFragment | undefined)[];\n if (isQueryTemplateStyle(args)) {\n // sql`...` comes here\n const [texts, ...values] = args as [\n texts: TemplateStringsArray,\n values: unknown[]\n ];\n // template string looks like a single QueryFragment for user\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(texts.map(makeRaw), values.map(makeValue))\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(makeValue);\n }\n\n return new QueryFragments(fragments);\n}\n\nexport const ident = makeIdent;\n\nexport function raw(...args: unknown[]) {\n return new QueryFragments(args.map(makeRaw));\n}\n\nexport function json(\n ...args:\n | [...json: unknown[]]\n | [texts: TemplateStringsArray, ...args: unknown[]]\n) {\n let fragments: (QueryFragment | undefined)[];\n const wrapperFn = (x: string, opts?: QueryFragmentToStringOptions) =>\n (opts?.valueFn || pgString)(x);\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(\n texts.map(makeRaw),\n values.map(makeJsonValue)\n ),\n { wrapperFn }\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(\n (x) => new QueryFragments([makeJsonValue(x)], { wrapperFn })\n );\n }\n\n return new QueryFragments(fragments);\n}\n\nexport function buildClauses(...args: WhereArg[]) {\n const clauses = new QueryFragments();\n\n const parse = (val: WhereArg) => {\n if (val === undefined) return;\n if (val === null) return;\n\n if (typeof val === 'string') {\n clauses.push(makeRaw(val));\n return;\n }\n\n if (isQueryFragment(val)) {\n clauses.push(val);\n return;\n }\n\n if (Array.isArray(val)) {\n val.forEach(parse);\n return;\n }\n\n if (typeof val === 'object') {\n for (const key in val) {\n if (val[key] === undefined) continue;\n\n if (isQueryFragment(val[key])) {\n clauses.push(sql`${makeIdent(key)} ${val[key]}`);\n continue;\n }\n\n if (val[key] === null) {\n clauses.push(sql`${makeIdent(key)} IS NULL`);\n continue;\n }\n\n if (Array.isArray(val[key])) {\n clauses.push(sql`${makeIdent(key)} = ANY (${val[key]})`);\n continue;\n }\n\n // \u305D\u308C\u4EE5\u5916\n clauses.push(sql`${makeIdent(key)} = ${val[key]}`);\n }\n return;\n }\n };\n\n parse(args);\n\n return clauses;\n}\n\nexport function OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') OR (', '))', 'false');\n}\n\nexport function AND(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') AND (', '))', 'true');\n}\n\nexport function WHERE(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') AND (', '))', '');\n}\n\nexport function WHERE_OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') OR (', '))', '');\n}\n\nexport function buildValues(fvs: (FieldValues | unknown[])[]) {\n if (!Array.isArray(fvs)) {\n if (typeof fvs !== 'object')\n throw new Error('buildValues: The argument must be an array');\n fvs = [fvs];\n }\n if (fvs.length === 0)\n throw new Error('buildValues: Array must contain elements at least one');\n\n const array = fvs.map((x) => (typeof x === 'object' ? Object.values(x) : x));\n\n const sig = array[0].length;\n if (array.some((arg) => arg.length !== sig)) {\n throw new Error('buildValues: Array must all be the same length');\n }\n\n const values = sql(\n ...array.map((v) => sql(...v).join(', '))\n ).setSewingPattern('(', '), (', ')');\n return sql`VALUES ${values}`;\n}\n\nexport function buildKeys(fvs: FieldValues[] | FieldValues) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n if (fvs.length == 0 || !fvs[0] || typeof fvs[0] !== 'object')\n throw new Error('Invalid call of the function');\n\n const ks = Object.keys(fvs[0]);\n const sig = ks.join();\n if (fvs.some((fv) => Object.keys(fv).join() !== sig)) {\n throw new Error('buildKeys: All objects must have the same key');\n }\n\n return sql(...ks.map(makeIdent)).setSewingPattern('(', ', ', ')');\n}\n\nexport function buildInsert(\n table: string,\n fvs: FieldValues[] | FieldValues,\n appendix?: string | QueryFragment\n) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n\n const keys = buildKeys(fvs);\n const values = buildValues(fvs.map(Object.values));\n\n return sql`INSERT INTO ${makeIdent(table)} ${keys} ${values}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildUpdate(\n table: string,\n fv: FieldValues,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n const pairs = new QueryFragments();\n\n for (const k in fv) {\n const val = fv[k];\n if (val === undefined) continue;\n\n pairs.push(sql`${makeIdent(k)} = ${val}`);\n }\n\n return sql`UPDATE ${makeIdent(table)} SET ${pairs.join(', ')} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildDelete(\n table: string,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n return sql`DELETE FROM ${makeIdent(table)} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\n// aliases\nexport const or = OR;\nexport const and = AND;\nexport const where = WHERE;\nexport const WHERE_AND = WHERE;\nexport const where_and = WHERE;\nexport const where_or = WHERE_OR;\n\n// expose via `sql`\nsql.raw = raw;\nsql.ident = ident;\nsql.json = json;\nsql.WHERE = WHERE;\nsql.WHERE_AND = WHERE_AND;\nsql.WHERE_OR = WHERE_OR;\nsql.AND = AND;\nsql.OR = OR;\nsql.where = where;\nsql.where_and = where_and;\nsql.where_or = where_or;\nsql.and = and;\nsql.or = or;\nsql.insert = buildInsert;\nsql.update = buildUpdate;\nsql.delete = buildDelete;\nsql.keys = buildKeys;\nsql.values = buildValues;\n\nexport default {\n sql,\n raw,\n ident,\n json,\n WHERE,\n WHERE_AND,\n WHERE_OR,\n AND,\n OR,\n where,\n where_and,\n where_or,\n and,\n or,\n buildInsert,\n buildUpdate,\n buildDelete,\n buildValues,\n};\n", "import type pg from 'pg';\nimport type {\n QueryFragment,\n FieldValues,\n WhereArg,\n QueryTemplateStyle,\n} from './query-weaver';\nimport {\n sql,\n buildInsert,\n buildUpdate,\n buildDelete,\n isQueryTemplateStyle,\n} from './query-weaver';\n\nexport type QueryResultRow = pg.QueryResultRow;\n\n// pg (almost) compatible types to relief and reduce their requirements\nexport type QueryResult<T extends QueryResultRow> = {\n rowCount: number;\n rows: T[];\n fields?: Partial<pg.FieldDef>[];\n};\n\nexport interface Queryable {\n query: <T extends QueryResultRow>(queryConfig: {\n text: string;\n values?: unknown[];\n }) => Promise<QueryResult<T>>;\n}\n\ntype pgQueryResult<X extends Queryable, T extends QueryResultRow> = X extends {\n query(...args: unknown[]): Promise<pg.QueryResult<T>>;\n}\n ? pg.QueryResult<T>\n : QueryResult<T>;\n\ntype QueryHelperOptions = {\n beforeQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n afterQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n onError?: <T extends pg.QueryConfig<unknown[]>>(ctx: T, e: Error) => void;\n};\n\ntype QueryTemplateOrSimpleQuery =\n | QueryTemplateStyle\n | [query: string, values?: unknown[]]\n | [query: pg.QueryConfig<unknown[]>];\n\nfunction hidePropertyExcludes(target: object, keys: string[]) {\n target = { ...target };\n Object.defineProperties(\n target,\n Object.fromEntries(\n Object.keys(target).map((k) => [\n k,\n keys.includes(k) ? {} : { enumerable: false },\n ])\n )\n );\n return target;\n}\n\n/**\n * Query Helper\n */\nexport class QueryHelper<X extends Queryable> {\n #db: X;\n #opts: QueryHelperOptions;\n\n constructor(db: X, opts: QueryHelperOptions = {}) {\n this.#db = db;\n this.#opts = opts;\n }\n\n #parseQueryTemplateStyle(\n args: QueryTemplateOrSimpleQuery\n ): pg.QueryConfig<unknown[]> {\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n return sql(texts, ...values);\n }\n\n const [query, values] = args;\n\n if (typeof query === 'object' && query && 'text' in query) {\n return query;\n }\n\n return { text: query, values: values ?? [] };\n }\n\n async #query<T extends QueryResultRow>(\n args: QueryTemplateOrSimpleQuery\n ): Promise<pgQueryResult<X, T>> {\n const query = this.#parseQueryTemplateStyle(args);\n\n this.#opts?.beforeQuery?.(query);\n\n const results = await this.#db.query<T>(query).catch((e) => {\n this.#opts?.onError?.(query, e);\n throw e;\n });\n\n this.#opts?.afterQuery?.({\n ...query,\n results: hidePropertyExcludes(results, ['command', 'rowCount', 'rows']),\n });\n\n return results as pgQueryResult<X, T>;\n }\n\n // ==================================================================================================\n // query executors\n\n async insert<T extends QueryResultRow>(\n table: string,\n fv: FieldValues,\n appendix?: string | QueryFragment\n ) {\n const query = buildInsert(table, fv, appendix);\n return await this.#query<T>([query]);\n }\n\n async update<T extends QueryResultRow>(\n table: string,\n fv: FieldValues,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildUpdate(table, fv, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async delete<T extends QueryResultRow>(\n table: string,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildDelete(table, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async query<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query<T>(args);\n }\n\n async getRows<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query<T>(args).then((x) => x.rows);\n }\n\n async getRow<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query<T>(args).then((x) => x.rows?.[0]);\n }\n\n async getOne<T = unknown>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => Object.values(x.rows?.[0])?.[0] as T);\n }\n\n async getCount(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => x.rowCount);\n }\n async exec(...args: QueryTemplateOrSimpleQuery) {\n // same as getCount\n return this.#query(args).then((x) => x.rowCount);\n }\n}\n\ntype Overwrite<T, Q> = Omit<T, keyof Q> & Q;\ntype MethodChainRewrite<T, Q> = {\n [K in keyof T]: T[K] extends (...args: infer R) => T\n ? (...args: R) => Override<T, Q>\n : T[K] extends T\n ? Override<T, Q>\n : T[K];\n};\ntype Override<T, Q> = Overwrite<MethodChainRewrite<T, Q>, Q>;\n\n/**\n * Returns a proxy object that overrides the queryable instance `db` by Query Helper utilities\n * @param db - Queryable object to be wrapped\n */\nexport function useQueryHelper<T extends Queryable>(\n db: T,\n opts?: QueryHelperOptions\n): Override<T, QueryHelper<T>> {\n const qh = new QueryHelper<T>(db, opts);\n const proxy: unknown = new Proxy(db, {\n get(db, key, receiver) {\n const target = key in qh ? qh : key in db ? db : undefined;\n const value = target && Reflect.get(target, key);\n\n if (value && value instanceof Function) {\n return function (this: unknown, ...args: unknown[]) {\n const result = value.apply(this === receiver ? target : this, args);\n return result === db ? proxy : result;\n };\n }\n\n return value === db ? proxy : value;\n },\n });\n\n return proxy as Override<T, QueryHelper<T>>;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["src_exports", "__export", "AND", "OR", "QueryHelper", "WHERE", "WHERE_AND", "WHERE_OR", "and", "buildClauses", "buildDelete", "buildInsert", "buildKeys", "buildUpdate", "buildValues", "ident", "isQueryFragment", "isQueryTemplateStyle", "json", "or", "pgIdent", "pgString", "raw", "sql", "useQueryHelper", "where", "where_and", "where_or", "__toCommonJS", "import_pg_escape", "pgIdent", "s", "x", "pgescape", "pgString", "QueryFragmentBase", "values", "text", "embed", "_value", "QueryFragmentValue", "value", "__privateAdd", "__privateSet", "opts", "__privateGet", "_ident", "QueryFragmentIdent", "ident", "_string", "QueryFragmentRawString", "isQueryFragment", "makeIdent", "name", "makeValue", "makeRaw", "QueryFragments", "makeJsonValue", "isQueryTemplateStyle", "args", "texts", "sewTemplateTextsAndValues", "idx", "_list", "_opts", "prefix", "glue", "suffix", "empty", "sql", "fragments", "raw", "json", "wrapperFn", "buildClauses", "clauses", "parse", "val", "key", "OR", "fv", "AND", "WHERE", "WHERE_OR", "buildValues", "fvs", "array", "sig", "arg", "v", "buildKeys", "ks", "buildInsert", "table", "appendix", "keys", "buildUpdate", "where", "pairs", "k", "buildDelete", "or", "and", "WHERE_AND", "where_and", "where_or", "hidePropertyExcludes", "target", "keys", "k", "_db", "_opts", "_parseQueryTemplateStyle", "parseQueryTemplateStyle_fn", "_query", "query_fn", "QueryHelper", "db", "opts", "__privateAdd", "__privateSet", "table", "fv", "appendix", "query", "buildInsert", "__privateMethod", "where", "buildUpdate", "buildDelete", "args", "x", "isQueryTemplateStyle", "texts", "values", "sql", "__privateGet", "results", "e", "useQueryHelper", "qh", "proxy", "key", "receiver", "value", "result"]
|
|
7
7
|
}
|
package/dist/index.esm.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var q=(e,r,t)=>{if(!r.has(e))throw TypeError("Cannot "+t)};var i=(e,r,t)=>(q(e,r,"read from private field"),t?t.call(e):r.get(e)),l=(e,r,t)=>{if(r.has(e))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(e):r.set(e,t)},y=(e,r,t,n)=>(q(e,r,"write to private field"),n?n.call(e,t):r.set(e,t),t);var g=(e,r,t)=>(q(e,r,"access private method"),t);import $ from"pg-escape";function B(e){return e.split(".").map(r=>$.ident(r)).join(".")}function C(e){return e===null?"NULL":typeof e=="boolean"?e?"true":"false":Array.isArray(e)?"ARRAY["+e.map(C).join(",")+"]":typeof e=="object"?$.literal(JSON.stringify(e)):$.literal(String(e))}var m=class{constructor(){this.text="";this.values=[];this.embed="";Object.defineProperties(this,{text:{enumerable:!0,get(){return this.compiled.text}},values:{enumerable:!0,get(){return this.compiled.values}},embed:{enumerable:!0,get(){return this.compiled.embed}}})}get compiled(){let r=[],t=this.toString({valueFn:u=>(r.push(u),"$"+r.length)}),n=this.toString();return{text:t,values:r,embed:n}}},F,V=class extends m{constructor(t){super();l(this,F,void 0);y(this,F,t)}toString(t){return(t?.valueFn??C)(i(this,F))}};F=new WeakMap;var O,P=class extends m{constructor(t){super();l(this,O,void 0);y(this,O,t)}toString(t){return(t?.identFn??B)(i(this,O))}};O=new WeakMap;var A,v=class extends m{constructor(t){super();l(this,A,void 0);y(this,A,String(t))}toString(){return i(this,A)}};A=new WeakMap;function R(e){return e instanceof m}function f(e){return new P(e)}function X(e){return typeof e>"u"||R(e)?e:new V(e)}function h(e){return typeof e>"u"||R(e)?e:Array.isArray(e)?new c(e.map(h)):new v(e)}function K(e){return typeof e>"u"||R(e)?e:h(JSON.stringify(e))}var b=e=>{if(!Array.isArray(e)||typeof e?.[0]!="object"||e[0]===null||!("raw"in e[0])||!Array.isArray(e[0]))return!1;let[r,...t]=e;return r.length-1===t.length};function L(e,r){if(e.length-1!==r.length)throw new Error("Invalid call of the function");return e.flatMap((t,n)=>n?[r[n-1],t]:[t])}var Q,o,c=class extends m{constructor(...t){super();l(this,Q,[]);l(this,o,void 0);if(y(this,o,{prefix:"",glue:"",suffix:"",empty:"",wrapperFn:n=>n}),Array.isArray(t[0])){let[n,u]=t;y(this,o,{...i(this,o),...u}),this.push(...n)}else{let[n]=t;y(this,o,{...i(this,o),...n})}}setSewingPattern(t="",n="",u="",a=""){return y(this,o,{...i(this,o),prefix:t,glue:n,suffix:u,empty:a}),this}push(...t){return i(this,Q).push(...t.map(h).filter(n=>n!==void 0)),this}append(...t){return this.push(...t)}join(t=", "){return i(this,o).glue=t,this}prefix(t=" "){return i(this,o).prefix=t,this}suffix(t=" "){return i(this,o).suffix=t,this}empty(t=""){return i(this,o).empty=t,this}toString(t){return i(this,Q).length===0?i(this,o).empty:i(this,o).prefix+i(this,o).wrapperFn(i(this,Q).map(n=>n.toString(t)).join(i(this,o).glue),t)+i(this,o).suffix}};Q=new WeakMap,o=new WeakMap;function s(...e){let r;if(b(e)){let[t,...n]=e;r=[new c(L(t.map(h),n.map(X)))]}else r=e.map(X);return new c(r)}var ee=f;function te(...e){return new c(e.map(h))}function re(...e){let r,t=(n,u)=>(u?.valueFn||C)(n);if(b(e)){let[n,...u]=e;r=[new c(L(n.map(h),u.map(K)),{wrapperFn:t})]}else r=e.map(n=>new c([K(n)],{wrapperFn:t}));return new c(r)}function E(...e){let r=new c,t=n=>{if(n!==void 0&&n!==null){if(typeof n=="string"){r.push(h(n));return}if(R(n)){r.push(n);return}if(Array.isArray(n)){n.forEach(t);return}if(typeof n=="object"){for(let u in n)if(n[u]!==void 0){if(R(n[u])){r.push(s`${f(u)} ${n[u]}`);continue}if(n[u]===null){r.push(s`${f(u)} IS NULL`);continue}if(Array.isArray(n[u])){r.push(s`${f(u)} = ANY (${n[u]})`);continue}r.push(s`${f(u)} = ${n[u]}`)}return}}};return t(e),r}function U(...e){return E(e).setSewingPattern("((",") OR (","))","false")}function M(...e){return E(e).setSewingPattern("((",") AND (","))","true")}function T(...e){return E(e).setSewingPattern("WHERE ((",") AND (","))","")}function J(...e){return E(e).setSewingPattern("WHERE ((",") OR (","))","")}function Y(e){if(!Array.isArray(e)){if(typeof e!="object")throw new Error("buildValues: The argument must be an array");e=[e]}if(e.length===0)throw new Error("buildValues: Array must contain elements at least one");let r=e.map(u=>typeof u=="object"?Object.values(u):u),t=r[0].length;if(r.some(u=>u.length!==t))throw new Error("buildValues: Array must all be the same length");let n=s(...r.map(u=>s(...u).join(", "))).setSewingPattern("(","), (",")");return s`VALUES ${n}`}function z(e){if(Array.isArray(e)||(e=[e]),e.length==0||!e[0]||typeof e[0]!="object")throw new Error("Invalid call of the function");let r=Object.keys(e[0]),t=r.join();if(e.some(n=>Object.keys(n).join()!==t))throw new Error("buildKeys: All objects must have the same key");return s(...r.map(f)).setSewingPattern("(",", ",")")}function H(e,r,t){Array.isArray(r)||(r=[r]);let n=z(r),u=Y(r.map(Object.values));return s`INSERT INTO ${f(e)} ${n} ${u}`.append(t).join(" ")}function N(e,r,t,n){let u=new c;for(let a in r){let k=r[a];k!==void 0&&u.push(s`${f(a)} = ${k}`)}return s`UPDATE ${f(e)} SET ${u.join(", ")} ${T(t)}`.append(n).join(" ")}function D(e,r,t){return s`DELETE FROM ${f(e)} ${T(r)}`.append(t).join(" ")}var ne=U,ue=M,se=T,ie=T,oe=T,ae=J;s.raw=te;s.ident=ee;s.json=re;s.WHERE=T;s.WHERE_AND=ie;s.WHERE_OR=J;s.AND=M;s.OR=U;s.where=se;s.where_and=oe;s.where_or=ae;s.and=ue;s.or=ne;s.insert=H;s.update=N;s.delete=D;s.keys=z;s.values=Y;function pe(e,r){return e={...e},Object.defineProperties(e,Object.fromEntries(Object.keys(e).map(t=>[t,r.includes(t)?{}:{enumerable:!1}]))),e}var S,w,j,G,p,d,I=class{constructor(r,t={}){l(this,j);l(this,p);l(this,S,void 0);l(this,w,void 0);y(this,S,r),y(this,w,t)}async insert(r,t,n){let u=H(r,t,n);return await g(this,p,d).call(this,[u])}async update(r,t,n,u){let a=N(r,t,n,u);return await g(this,p,d).call(this,[a])}async delete(r,t,n){let u=D(r,t,n);return await g(this,p,d).call(this,[u])}async query(...r){return g(this,p,d).call(this,r)}async getRows(...r){return g(this,p,d).call(this,r).then(t=>t.rows)}async getRow(...r){return g(this,p,d).call(this,r).then(t=>t.rows?.[0])}async getOne(...r){return g(this,p,d).call(this,r).then(t=>Object.values(t.rows?.[0])?.[0])}async getCount(...r){return g(this,p,d).call(this,r).then(t=>t.rowCount)}async exec(...r){return g(this,p,d).call(this,r).then(t=>t.rowCount)}};S=new WeakMap,w=new WeakMap,j=new WeakSet,G=function(r){if(b(r)){let[u,...a]=r;return s(u,...a)}let[t,n]=r;return typeof t=="object"&&t&&"text"in t?t:{text:t,values:n??[]}},p=new WeakSet,d=async function(r){let t=g(this,j,G).call(this,r);i(this,w)?.beforeQuery?.(t);let n=await i(this,S).query(t).catch(u=>{throw i(this,w)?.onError?.(t,u),u});return i(this,w)?.afterQuery?.({...t,results:pe(n,["command","rowCount","rows"])}),n};function de(e,r){let t=new I(e,r),n=new Proxy(e,{get(u,a,k){let W=a in t?t:a in u?u:void 0,x=W&&Reflect.get(W,a);return x&&x instanceof Function?function(...Z){let _=x.apply(this===k?W:this,Z);return _===u?n:_}:x===u?n:x}});return n}export{M as AND,U as OR,I as QueryHelper,T as WHERE,ie as WHERE_AND,J as WHERE_OR,ue as and,E as buildClauses,D as buildDelete,H as buildInsert,z as buildKeys,N as buildUpdate,Y as buildValues,ee as ident,R as isQueryFragment,b as isQueryTemplateStyle,re as json,ne as or,B as pgIdent,C as pgString,te as raw,s as sql,de as useQueryHelper,se as where,oe as where_and,ae as where_or};
|
|
2
2
|
//# sourceMappingURL=index.esm.mjs.map
|
package/dist/index.esm.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/query-weaver.ts", "../src/query-helper.ts"],
|
|
4
|
-
"sourcesContent": ["import pgescape from 'pg-escape';\n\ntype EscapeFunction = (v: unknown) => string;\nexport type FieldValues = Record<string, unknown>;\nexport type WhereArg =\n | string\n | FieldValues\n | QueryFragment\n | undefined\n | WhereArg[];\n\nexport function pgIdent(s: string) {\n // '.' is a special for us\n return s\n .split('.')\n .map((x) => pgescape.ident(x))\n .join('.');\n}\n\n// fallback function for when the EscapeFunction is not specified\nexport function pgString(s: unknown): string {\n if (s === null) return 'NULL';\n if (typeof s === 'boolean') return s ? 'true' : 'false';\n if (Array.isArray(s)) return 'ARRAY[' + s.map(pgString).join(',') + ']';\n if (typeof s === 'object') return pgescape.literal(JSON.stringify(s));\n return pgescape.literal(String(s));\n}\n\ntype QueryFragmentToStringOptions = {\n valueFn?: EscapeFunction;\n identFn?: EscapeFunction;\n};\n\nexport interface QueryFragment {\n text: string;\n values?: unknown[];\n embed?: string;\n sql?: string;\n\n toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nabstract class QueryFragmentBase implements QueryFragment {\n // XXX: entries for defineProperties\n text: string = '';\n values?: unknown[] | undefined = [];\n embed?: string = '';\n\n get compiled() {\n const values = [] as unknown[];\n const text = this.toString({\n valueFn: (x: unknown) => {\n values.push(x);\n return '$' + values.length;\n },\n });\n const embed = this.toString();\n\n return {\n text,\n values,\n embed,\n };\n }\n\n constructor() {\n Object.defineProperties(this, {\n text: {\n enumerable: true,\n get() {\n return this.compiled.text;\n },\n },\n values: {\n enumerable: true,\n get() {\n return this.compiled.values;\n },\n },\n embed: {\n enumerable: true,\n get() {\n return this.compiled.embed;\n },\n },\n });\n }\n\n abstract toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nclass QueryFragmentValue extends QueryFragmentBase {\n #value: unknown;\n\n constructor(value: unknown) {\n super();\n this.#value = value;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.valueFn ?? pgString)(this.#value);\n }\n}\n\nclass QueryFragmentIdent extends QueryFragmentBase {\n #ident: string;\n\n constructor(ident: string) {\n super();\n this.#ident = ident;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.identFn ?? pgIdent)(this.#ident);\n }\n}\n\n// we exploits String constructor\nclass QueryFragmentRawString extends QueryFragmentBase {\n #string: string;\n\n constructor(s: unknown) {\n super();\n this.#string = String(s);\n }\n\n /* toString(_?: QueryFragmentToStringOptions) { */\n toString() {\n return this.#string;\n }\n}\n\nexport function isQueryFragment(x: unknown): x is QueryFragment {\n return x instanceof QueryFragmentBase;\n}\n\nfunction makeIdent(name: string) {\n return new QueryFragmentIdent(name);\n}\n\nfunction makeValue(x: unknown): QueryFragment | undefined {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return new QueryFragmentValue(x);\n}\n\nfunction makeRaw(text: unknown | unknown[]): QueryFragment | undefined {\n if (typeof text === 'undefined' || isQueryFragment(text)) return text;\n if (Array.isArray(text)) return new QueryFragments(text.map(makeRaw));\n return new QueryFragmentRawString(text);\n}\n\nfunction makeJsonValue(x: unknown) {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return makeRaw(JSON.stringify(x));\n}\n\ntype QueryFragmentsOptions = {\n prefix?: string;\n glue?: string;\n suffix?: string;\n empty?: string;\n\n wrapperFn?: (s: string, opts?: QueryFragmentToStringOptions) => string;\n};\n\nexport type QueryTemplateStyle = [\n text: TemplateStringsArray,\n ...values: unknown[]\n];\nexport const isQueryTemplateStyle = (\n args: unknown\n): args is QueryTemplateStyle => {\n if (!Array.isArray(args)) return false;\n if (typeof args?.[0] !== 'object' || args[0] === null || !('raw' in args[0]))\n return false;\n if (!Array.isArray(args[0])) return false;\n const [texts, ...values] = args;\n return texts.length - 1 === values.length;\n};\n\nfunction sewTemplateTextsAndValues<T = unknown, R = unknown>(\n texts: T[],\n values: R[]\n) {\n if (texts.length - 1 !== values.length)\n throw new Error('Invalid call of the function');\n return texts.flatMap((text, idx) => (idx ? [values[idx - 1], text] : [text]));\n}\n\nclass QueryFragments extends QueryFragmentBase {\n #list: QueryFragment[] = [];\n #opts: Required<QueryFragmentsOptions>;\n\n constructor(\n ...args:\n | []\n | [values: (QueryFragment | undefined)[], opts?: QueryFragmentsOptions]\n | [opts?: QueryFragmentsOptions]\n ) {\n super();\n this.#opts = {\n prefix: '',\n glue: '',\n suffix: '',\n empty: '',\n wrapperFn: (x) => x,\n };\n\n if (Array.isArray(args[0])) {\n const [values, opts] = args as [\n values: (QueryFragment | undefined)[],\n opts?: QueryFragmentsOptions\n ];\n this.#opts = { ...this.#opts, ...opts };\n this.push(...values);\n } else {\n const [opts] = args as [opts?: QueryFragmentsOptions];\n this.#opts = { ...this.#opts, ...opts };\n }\n }\n\n setSewingPattern(\n prefix: string = '',\n glue: string = '',\n suffix: string = '',\n empty: string = ''\n ) {\n this.#opts = { ...this.#opts, prefix, glue, suffix, empty };\n return this;\n }\n\n push(...args: (QueryFragment | string | undefined)[]) {\n this.#list.push(\n ...(args.map(makeRaw).filter((x) => x !== undefined) as QueryFragment[])\n );\n return this;\n }\n\n // alias\n append(...args: (QueryFragment | string | undefined)[]) {\n return this.push(...args);\n }\n\n join(glue: string = ', ') {\n this.#opts.glue = glue;\n return this;\n }\n\n prefix(prefix: string = ' ') {\n this.#opts.prefix = prefix;\n return this;\n }\n\n suffix(suffix: string = ' ') {\n this.#opts.suffix = suffix;\n return this;\n }\n\n empty(empty: string = '') {\n this.#opts.empty = empty;\n return this;\n }\n\n toString(opts?: QueryFragmentToStringOptions): string {\n if (this.#list.length === 0) return this.#opts.empty;\n return (\n this.#opts.prefix +\n this.#opts.wrapperFn(\n this.#list.map((x) => x.toString(opts)).join(this.#opts.glue),\n opts\n ) +\n this.#opts.suffix\n );\n }\n}\n\nexport function sql(\n ...args:\n | [texts: TemplateStringsArray, ...values: unknown[]]\n | [...values: unknown[]]\n): QueryFragments {\n let fragments: (QueryFragment | undefined)[];\n if (isQueryTemplateStyle(args)) {\n // sql`...` comes here\n const [texts, ...values] = args as [\n texts: TemplateStringsArray,\n values: unknown[]\n ];\n // template string looks like a single QueryFragment for user\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(texts.map(makeRaw), values.map(makeValue))\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(makeValue);\n }\n\n return new QueryFragments(fragments);\n}\n\nexport const ident = makeIdent;\n\nexport function raw(...args: unknown[]) {\n return new QueryFragments(args.map(makeRaw));\n}\n\nexport function json(\n ...args:\n | [...json: unknown[]]\n | [texts: TemplateStringsArray, ...args: unknown[]]\n) {\n let fragments: (QueryFragment | undefined)[];\n const wrapperFn = (x: string, opts?: QueryFragmentToStringOptions) =>\n (opts?.valueFn || pgString)(x);\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(\n texts.map(makeRaw),\n values.map(makeJsonValue)\n ),\n { wrapperFn }\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(\n (x) => new QueryFragments([makeJsonValue(x)], { wrapperFn })\n );\n }\n\n return new QueryFragments(fragments);\n}\n\nexport function buildClauses(...args: WhereArg[]) {\n const clauses = new QueryFragments();\n\n const parse = (val: WhereArg) => {\n if (val === undefined) return;\n if (val === null) return;\n\n if (typeof val === 'string') {\n clauses.push(makeRaw(val));\n return;\n }\n\n if (isQueryFragment(val)) {\n clauses.push(val);\n return;\n }\n\n if (Array.isArray(val)) {\n val.forEach(parse);\n return;\n }\n\n if (typeof val === 'object') {\n for (const key in val) {\n if (val[key] === undefined) continue;\n\n if (isQueryFragment(val[key])) {\n clauses.push(sql`${makeIdent(key)} ${val[key]}`);\n continue;\n }\n\n if (val[key] === null) {\n clauses.push(sql`${makeIdent(key)} IS NULL`);\n continue;\n }\n\n if (Array.isArray(val[key])) {\n clauses.push(sql`${makeIdent(key)} = ANY (${val[key]})`);\n continue;\n }\n\n // \u305D\u308C\u4EE5\u5916\n clauses.push(sql`${makeIdent(key)} = ${val[key]}`);\n }\n return;\n }\n };\n\n parse(args);\n\n return clauses;\n}\n\nexport function OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') OR (', '))', 'false');\n}\n\nexport function AND(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') AND (', '))', 'true');\n}\n\nexport function WHERE(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') AND (', '))', '');\n}\n\nexport function WHERE_OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') OR (', '))', '');\n}\n\nexport function buildValues(fvs: (FieldValues | unknown[])[]) {\n if (!Array.isArray(fvs)) {\n if (typeof fvs !== 'object')\n throw new Error('buildValues: The argument must be an array');\n fvs = [fvs];\n }\n if (fvs.length === 0)\n throw new Error('buildValues: Array must contain elements at least one');\n\n const array = fvs.map((x) => (typeof x === 'object' ? Object.values(x) : x));\n\n const sig = array[0].length;\n if (array.some((arg) => arg.length !== sig)) {\n throw new Error('buildValues: Array must all be the same length');\n }\n\n const values = sql(\n ...array.map((v) => sql(...v).join(', '))\n ).setSewingPattern('(', '), (', ')');\n return sql`VALUES ${values}`;\n}\n\nexport function buildKeys(fvs: FieldValues[] | FieldValues) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n if (fvs.length == 0 || !fvs[0] || typeof fvs[0] !== 'object')\n throw new Error('Invalid call of the function');\n\n const ks = Object.keys(fvs[0]);\n const sig = ks.join();\n if (fvs.some((fv) => Object.keys(fv).join() !== sig)) {\n throw new Error('buildKeys: All objects must have the same key');\n }\n\n return sql(...ks.map(makeIdent)).setSewingPattern('(', ', ', ')');\n}\n\nexport function buildInsert(\n table: string,\n fvs: FieldValues[] | FieldValues,\n appendix?: string | QueryFragment\n) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n\n const keys = buildKeys(fvs);\n const values = buildValues(fvs.map(Object.values));\n\n return sql`INSERT INTO ${makeIdent(table)} ${keys} ${values}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildUpdate(\n table: string,\n fv: FieldValues,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n const pairs = new QueryFragments();\n\n for (const k in fv) {\n const val = fv[k];\n if (val === undefined) continue;\n\n pairs.push(sql`${makeIdent(k)} = ${val}`);\n }\n\n return sql`UPDATE ${makeIdent(table)} SET ${pairs.join(', ')} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildDelete(\n table: string,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n return sql`DELETE FROM ${makeIdent(table)} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\n// aliases\nexport const or = OR;\nexport const and = AND;\nexport const where = WHERE;\nexport const WHERE_AND = WHERE;\nexport const where_and = WHERE;\nexport const where_or = WHERE_OR;\n\n// expose via `sql`\nsql.raw = raw;\nsql.ident = ident;\nsql.json = json;\nsql.WHERE = WHERE;\nsql.WHERE_AND = WHERE_AND;\nsql.WHERE_OR = WHERE_OR;\nsql.AND = AND;\nsql.OR = OR;\nsql.where = where;\nsql.where_and = where_and;\nsql.where_or = where_or;\nsql.and = and;\nsql.or = or;\nsql.insert = buildInsert;\nsql.update = buildUpdate;\nsql.delete = buildDelete;\nsql.keys = buildKeys;\nsql.values = buildValues;\n\nexport default {\n sql,\n raw,\n ident,\n json,\n WHERE,\n WHERE_AND,\n WHERE_OR,\n AND,\n OR,\n where,\n where_and,\n where_or,\n and,\n or,\n buildInsert,\n buildUpdate,\n buildDelete,\n buildValues,\n};\n", "import type pg from 'pg';\nimport type {\n QueryFragment,\n FieldValues,\n WhereArg,\n QueryTemplateStyle,\n} from './query-weaver';\nimport {\n sql,\n buildInsert,\n buildUpdate,\n buildDelete,\n isQueryTemplateStyle,\n} from './query-weaver';\n\n// pg (almost) compatible types to relief and reduce their requirements\ntype pgQueryResultCustom<R> = {\n rowCount: number;\n rows: R[];\n fields?: Partial<pg.FieldDef>[];\n};\ntype pgQueryResult<R> = Omit<\n Partial<pg.QueryResult>,\n keyof pgQueryResultCustom<R>\n> &\n pgQueryResultCustom<R>;\n\nexport interface Queryable {\n query: <T extends pg.QueryResultRow>(queryConfig: {\n text: string;\n values?: unknown[];\n }) => Promise<pgQueryResult<T>>;\n}\n\ntype QueryHelperOptions = {\n placeHolderFn?: (v: unknown, values: unknown[]) => string;\n\n beforeQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n afterQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n onError?: <T extends pg.QueryConfig<unknown[]>>(ctx: T, e: Error) => void;\n};\n\ntype QueryTemplateOrSimpleQuery =\n | QueryTemplateStyle\n | [query: string, values?: unknown[]]\n | [query: pg.QueryConfig<unknown[]>];\n\nfunction hidePropertyExcludes(target: object, keys: string[]) {\n target = { ...target };\n Object.defineProperties(\n target,\n Object.fromEntries(\n Object.keys(target).map((k) => [\n k,\n keys.includes(k) ? {} : { enumerable: false },\n ])\n )\n );\n return target;\n}\n\n/**\n * Query Helper\n */\nexport class QueryHelper {\n #db: Queryable;\n #opts: QueryHelperOptions;\n\n constructor(db: Queryable, opts: QueryHelperOptions = {}) {\n this.#db = db;\n this.#opts = opts;\n }\n\n #parseQueryTemplateStyle(\n args: QueryTemplateOrSimpleQuery\n ): pg.QueryConfig<unknown[]> {\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n return sql(texts, ...values);\n }\n\n const [query, values] = args;\n\n if (typeof query === 'object' && query && 'text' in query) {\n return query;\n }\n\n return { text: query, values: values ?? [] };\n }\n\n async #query<T extends pg.QueryResultRow>(args: QueryTemplateOrSimpleQuery) {\n const query = this.#parseQueryTemplateStyle(args);\n\n this.#opts?.beforeQuery?.(query);\n\n const results = await this.#db.query<T>(query).catch((e) => {\n this.#opts?.onError?.(query, e);\n throw e;\n });\n\n this.#opts?.afterQuery?.({\n ...query,\n results: hidePropertyExcludes(results, ['command', 'rowCount', 'rows']),\n });\n\n return results;\n }\n\n // ==================================================================================================\n // query executors\n\n async insert<T extends pg.QueryResultRow>(\n table: string,\n fv: FieldValues,\n appendix?: string | QueryFragment\n ) {\n const query = buildInsert(table, fv, appendix);\n return await this.#query<T>([query]);\n }\n\n async update<T extends pg.QueryResultRow>(\n table: string,\n fv: FieldValues,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildUpdate(table, fv, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async delete<T extends pg.QueryResultRow>(\n table: string,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildDelete(table, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async query<T extends pg.QueryResultRow>(\n ...args: QueryTemplateOrSimpleQuery\n ) {\n return this.#query<T>(args);\n }\n\n async getRows<T extends pg.QueryResultRow>(\n ...args: QueryTemplateOrSimpleQuery\n ) {\n return this.#query<T>(args).then((x) => x.rows);\n }\n\n async getRow<T extends pg.QueryResultRow>(\n ...args: QueryTemplateOrSimpleQuery\n ) {\n return this.#query<T>(args).then((x) => x.rows?.[0]);\n }\n\n async getOne<T = unknown>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => Object.values(x.rows?.[0])?.[0] as T);\n }\n\n async getCount(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => x.rowCount);\n }\n async exec(...args: QueryTemplateOrSimpleQuery) {\n // same as getCount\n return this.#query(args).then((x) => x.rowCount);\n }\n}\n\n/**\n * Returns a proxy object that overrides the queryable instance `db` by Query Helper utilities\n * @param db - Queryable object to be wrapped\n */\nexport function useQueryHelper<T extends Queryable>(\n db: T,\n opts?: QueryHelperOptions\n): Omit<T, keyof QueryHelper> & QueryHelper {\n const qh = new QueryHelper(db, opts);\n return new Proxy(db, {\n get(db, key, receiver) {\n const target = key in qh ? qh : key in db ? db : undefined;\n\n const value = target && Reflect.get(target, key);\n\n if (value && value instanceof Function) {\n return function (this: unknown, ...args: unknown[]) {\n return value.apply(this === receiver ? target : this, args);\n };\n }\n\n return value;\n },\n }) as T & QueryHelper;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["pgescape", "pgIdent", "s", "x", "pgescape", "pgString", "QueryFragmentBase", "values", "text", "embed", "_value", "QueryFragmentValue", "value", "__privateAdd", "__privateSet", "opts", "__privateGet", "_ident", "QueryFragmentIdent", "ident", "_string", "QueryFragmentRawString", "isQueryFragment", "makeIdent", "name", "makeValue", "makeRaw", "QueryFragments", "makeJsonValue", "isQueryTemplateStyle", "args", "texts", "sewTemplateTextsAndValues", "idx", "_list", "_opts", "prefix", "glue", "suffix", "empty", "sql", "fragments", "raw", "json", "wrapperFn", "buildClauses", "clauses", "parse", "val", "key", "OR", "fv", "AND", "WHERE", "WHERE_OR", "buildValues", "fvs", "array", "sig", "arg", "v", "buildKeys", "ks", "buildInsert", "table", "appendix", "keys", "buildUpdate", "where", "pairs", "k", "buildDelete", "or", "and", "WHERE_AND", "where_and", "where_or", "hidePropertyExcludes", "target", "keys", "k", "_db", "_opts", "_parseQueryTemplateStyle", "parseQueryTemplateStyle_fn", "_query", "query_fn", "QueryHelper", "db", "opts", "__privateAdd", "__privateSet", "table", "fv", "appendix", "query", "buildInsert", "__privateMethod", "where", "buildUpdate", "buildDelete", "args", "x", "isQueryTemplateStyle", "texts", "values", "sql", "__privateGet", "results", "e", "useQueryHelper", "qh", "key", "receiver", "value"]
|
|
4
|
+
"sourcesContent": ["import pgescape from 'pg-escape';\n\ntype EscapeFunction = (v: unknown) => string;\nexport type FieldValues = Record<string, unknown>;\nexport type WhereArg =\n | string\n | FieldValues\n | QueryFragment\n | undefined\n | WhereArg[];\n\nexport function pgIdent(s: string) {\n // '.' is a special for us\n return s\n .split('.')\n .map((x) => pgescape.ident(x))\n .join('.');\n}\n\n// fallback function for when the EscapeFunction is not specified\nexport function pgString(s: unknown): string {\n if (s === null) return 'NULL';\n if (typeof s === 'boolean') return s ? 'true' : 'false';\n if (Array.isArray(s)) return 'ARRAY[' + s.map(pgString).join(',') + ']';\n if (typeof s === 'object') return pgescape.literal(JSON.stringify(s));\n return pgescape.literal(String(s));\n}\n\ntype QueryFragmentToStringOptions = {\n valueFn?: EscapeFunction;\n identFn?: EscapeFunction;\n};\n\nexport interface QueryFragment {\n text: string;\n values?: unknown[];\n embed?: string;\n sql?: string;\n\n toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nabstract class QueryFragmentBase implements QueryFragment {\n // XXX: entries for defineProperties\n text: string = '';\n values?: unknown[] | undefined = [];\n embed?: string = '';\n\n get compiled() {\n const values = [] as unknown[];\n const text = this.toString({\n valueFn: (x: unknown) => {\n values.push(x);\n return '$' + values.length;\n },\n });\n const embed = this.toString();\n\n return {\n text,\n values,\n embed,\n };\n }\n\n constructor() {\n Object.defineProperties(this, {\n text: {\n enumerable: true,\n get() {\n return this.compiled.text;\n },\n },\n values: {\n enumerable: true,\n get() {\n return this.compiled.values;\n },\n },\n embed: {\n enumerable: true,\n get() {\n return this.compiled.embed;\n },\n },\n });\n }\n\n abstract toString(opts?: QueryFragmentToStringOptions): string;\n}\n\nclass QueryFragmentValue extends QueryFragmentBase {\n #value: unknown;\n\n constructor(value: unknown) {\n super();\n this.#value = value;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.valueFn ?? pgString)(this.#value);\n }\n}\n\nclass QueryFragmentIdent extends QueryFragmentBase {\n #ident: string;\n\n constructor(ident: string) {\n super();\n this.#ident = ident;\n }\n\n toString(opts?: QueryFragmentToStringOptions) {\n return (opts?.identFn ?? pgIdent)(this.#ident);\n }\n}\n\n// we exploits String constructor\nclass QueryFragmentRawString extends QueryFragmentBase {\n #string: string;\n\n constructor(s: unknown) {\n super();\n this.#string = String(s);\n }\n\n /* toString(_?: QueryFragmentToStringOptions) { */\n toString() {\n return this.#string;\n }\n}\n\nexport function isQueryFragment(x: unknown): x is QueryFragment {\n return x instanceof QueryFragmentBase;\n}\n\nfunction makeIdent(name: string) {\n return new QueryFragmentIdent(name);\n}\n\nfunction makeValue(x: unknown): QueryFragment | undefined {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return new QueryFragmentValue(x);\n}\n\nfunction makeRaw(text: unknown | unknown[]): QueryFragment | undefined {\n if (typeof text === 'undefined' || isQueryFragment(text)) return text;\n if (Array.isArray(text)) return new QueryFragments(text.map(makeRaw));\n return new QueryFragmentRawString(text);\n}\n\nfunction makeJsonValue(x: unknown) {\n if (typeof x === 'undefined' || isQueryFragment(x)) return x;\n return makeRaw(JSON.stringify(x));\n}\n\ntype QueryFragmentsOptions = {\n prefix?: string;\n glue?: string;\n suffix?: string;\n empty?: string;\n\n wrapperFn?: (s: string, opts?: QueryFragmentToStringOptions) => string;\n};\n\nexport type QueryTemplateStyle = [\n text: TemplateStringsArray,\n ...values: unknown[]\n];\nexport const isQueryTemplateStyle = (\n args: unknown\n): args is QueryTemplateStyle => {\n if (!Array.isArray(args)) return false;\n if (typeof args?.[0] !== 'object' || args[0] === null || !('raw' in args[0]))\n return false;\n if (!Array.isArray(args[0])) return false;\n const [texts, ...values] = args;\n return texts.length - 1 === values.length;\n};\n\nfunction sewTemplateTextsAndValues<T = unknown, R = unknown>(\n texts: T[],\n values: R[]\n) {\n if (texts.length - 1 !== values.length)\n throw new Error('Invalid call of the function');\n return texts.flatMap((text, idx) => (idx ? [values[idx - 1], text] : [text]));\n}\n\nclass QueryFragments extends QueryFragmentBase {\n #list: QueryFragment[] = [];\n #opts: Required<QueryFragmentsOptions>;\n\n constructor(\n ...args:\n | []\n | [values: (QueryFragment | undefined)[], opts?: QueryFragmentsOptions]\n | [opts?: QueryFragmentsOptions]\n ) {\n super();\n this.#opts = {\n prefix: '',\n glue: '',\n suffix: '',\n empty: '',\n wrapperFn: (x) => x,\n };\n\n if (Array.isArray(args[0])) {\n const [values, opts] = args as [\n values: (QueryFragment | undefined)[],\n opts?: QueryFragmentsOptions\n ];\n this.#opts = { ...this.#opts, ...opts };\n this.push(...values);\n } else {\n const [opts] = args as [opts?: QueryFragmentsOptions];\n this.#opts = { ...this.#opts, ...opts };\n }\n }\n\n setSewingPattern(\n prefix: string = '',\n glue: string = '',\n suffix: string = '',\n empty: string = ''\n ) {\n this.#opts = { ...this.#opts, prefix, glue, suffix, empty };\n return this;\n }\n\n push(...args: (QueryFragment | string | undefined)[]) {\n this.#list.push(\n ...(args.map(makeRaw).filter((x) => x !== undefined) as QueryFragment[])\n );\n return this;\n }\n\n // alias\n append(...args: (QueryFragment | string | undefined)[]) {\n return this.push(...args);\n }\n\n join(glue: string = ', ') {\n this.#opts.glue = glue;\n return this;\n }\n\n prefix(prefix: string = ' ') {\n this.#opts.prefix = prefix;\n return this;\n }\n\n suffix(suffix: string = ' ') {\n this.#opts.suffix = suffix;\n return this;\n }\n\n empty(empty: string = '') {\n this.#opts.empty = empty;\n return this;\n }\n\n toString(opts?: QueryFragmentToStringOptions): string {\n if (this.#list.length === 0) return this.#opts.empty;\n return (\n this.#opts.prefix +\n this.#opts.wrapperFn(\n this.#list.map((x) => x.toString(opts)).join(this.#opts.glue),\n opts\n ) +\n this.#opts.suffix\n );\n }\n}\n\nexport function sql(\n ...args:\n | [texts: TemplateStringsArray, ...values: unknown[]]\n | [...values: unknown[]]\n): QueryFragments {\n let fragments: (QueryFragment | undefined)[];\n if (isQueryTemplateStyle(args)) {\n // sql`...` comes here\n const [texts, ...values] = args as [\n texts: TemplateStringsArray,\n values: unknown[]\n ];\n // template string looks like a single QueryFragment for user\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(texts.map(makeRaw), values.map(makeValue))\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(makeValue);\n }\n\n return new QueryFragments(fragments);\n}\n\nexport const ident = makeIdent;\n\nexport function raw(...args: unknown[]) {\n return new QueryFragments(args.map(makeRaw));\n}\n\nexport function json(\n ...args:\n | [...json: unknown[]]\n | [texts: TemplateStringsArray, ...args: unknown[]]\n) {\n let fragments: (QueryFragment | undefined)[];\n const wrapperFn = (x: string, opts?: QueryFragmentToStringOptions) =>\n (opts?.valueFn || pgString)(x);\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n fragments = [\n new QueryFragments(\n sewTemplateTextsAndValues(\n texts.map(makeRaw),\n values.map(makeJsonValue)\n ),\n { wrapperFn }\n ),\n ];\n } else {\n // normal function call\n fragments = args.map(\n (x) => new QueryFragments([makeJsonValue(x)], { wrapperFn })\n );\n }\n\n return new QueryFragments(fragments);\n}\n\nexport function buildClauses(...args: WhereArg[]) {\n const clauses = new QueryFragments();\n\n const parse = (val: WhereArg) => {\n if (val === undefined) return;\n if (val === null) return;\n\n if (typeof val === 'string') {\n clauses.push(makeRaw(val));\n return;\n }\n\n if (isQueryFragment(val)) {\n clauses.push(val);\n return;\n }\n\n if (Array.isArray(val)) {\n val.forEach(parse);\n return;\n }\n\n if (typeof val === 'object') {\n for (const key in val) {\n if (val[key] === undefined) continue;\n\n if (isQueryFragment(val[key])) {\n clauses.push(sql`${makeIdent(key)} ${val[key]}`);\n continue;\n }\n\n if (val[key] === null) {\n clauses.push(sql`${makeIdent(key)} IS NULL`);\n continue;\n }\n\n if (Array.isArray(val[key])) {\n clauses.push(sql`${makeIdent(key)} = ANY (${val[key]})`);\n continue;\n }\n\n // \u305D\u308C\u4EE5\u5916\n clauses.push(sql`${makeIdent(key)} = ${val[key]}`);\n }\n return;\n }\n };\n\n parse(args);\n\n return clauses;\n}\n\nexport function OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') OR (', '))', 'false');\n}\n\nexport function AND(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('((', ') AND (', '))', 'true');\n}\n\nexport function WHERE(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') AND (', '))', '');\n}\n\nexport function WHERE_OR(...fv: WhereArg[]) {\n return buildClauses(fv).setSewingPattern('WHERE ((', ') OR (', '))', '');\n}\n\nexport function buildValues(fvs: (FieldValues | unknown[])[]) {\n if (!Array.isArray(fvs)) {\n if (typeof fvs !== 'object')\n throw new Error('buildValues: The argument must be an array');\n fvs = [fvs];\n }\n if (fvs.length === 0)\n throw new Error('buildValues: Array must contain elements at least one');\n\n const array = fvs.map((x) => (typeof x === 'object' ? Object.values(x) : x));\n\n const sig = array[0].length;\n if (array.some((arg) => arg.length !== sig)) {\n throw new Error('buildValues: Array must all be the same length');\n }\n\n const values = sql(\n ...array.map((v) => sql(...v).join(', '))\n ).setSewingPattern('(', '), (', ')');\n return sql`VALUES ${values}`;\n}\n\nexport function buildKeys(fvs: FieldValues[] | FieldValues) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n if (fvs.length == 0 || !fvs[0] || typeof fvs[0] !== 'object')\n throw new Error('Invalid call of the function');\n\n const ks = Object.keys(fvs[0]);\n const sig = ks.join();\n if (fvs.some((fv) => Object.keys(fv).join() !== sig)) {\n throw new Error('buildKeys: All objects must have the same key');\n }\n\n return sql(...ks.map(makeIdent)).setSewingPattern('(', ', ', ')');\n}\n\nexport function buildInsert(\n table: string,\n fvs: FieldValues[] | FieldValues,\n appendix?: string | QueryFragment\n) {\n if (!Array.isArray(fvs)) fvs = [fvs];\n\n const keys = buildKeys(fvs);\n const values = buildValues(fvs.map(Object.values));\n\n return sql`INSERT INTO ${makeIdent(table)} ${keys} ${values}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildUpdate(\n table: string,\n fv: FieldValues,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n const pairs = new QueryFragments();\n\n for (const k in fv) {\n const val = fv[k];\n if (val === undefined) continue;\n\n pairs.push(sql`${makeIdent(k)} = ${val}`);\n }\n\n return sql`UPDATE ${makeIdent(table)} SET ${pairs.join(', ')} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\nexport function buildDelete(\n table: string,\n where?: WhereArg,\n appendix?: string | QueryFragment\n) {\n return sql`DELETE FROM ${makeIdent(table)} ${WHERE(where)}`\n .append(appendix)\n .join(' ');\n}\n\n// aliases\nexport const or = OR;\nexport const and = AND;\nexport const where = WHERE;\nexport const WHERE_AND = WHERE;\nexport const where_and = WHERE;\nexport const where_or = WHERE_OR;\n\n// expose via `sql`\nsql.raw = raw;\nsql.ident = ident;\nsql.json = json;\nsql.WHERE = WHERE;\nsql.WHERE_AND = WHERE_AND;\nsql.WHERE_OR = WHERE_OR;\nsql.AND = AND;\nsql.OR = OR;\nsql.where = where;\nsql.where_and = where_and;\nsql.where_or = where_or;\nsql.and = and;\nsql.or = or;\nsql.insert = buildInsert;\nsql.update = buildUpdate;\nsql.delete = buildDelete;\nsql.keys = buildKeys;\nsql.values = buildValues;\n\nexport default {\n sql,\n raw,\n ident,\n json,\n WHERE,\n WHERE_AND,\n WHERE_OR,\n AND,\n OR,\n where,\n where_and,\n where_or,\n and,\n or,\n buildInsert,\n buildUpdate,\n buildDelete,\n buildValues,\n};\n", "import type pg from 'pg';\nimport type {\n QueryFragment,\n FieldValues,\n WhereArg,\n QueryTemplateStyle,\n} from './query-weaver';\nimport {\n sql,\n buildInsert,\n buildUpdate,\n buildDelete,\n isQueryTemplateStyle,\n} from './query-weaver';\n\nexport type QueryResultRow = pg.QueryResultRow;\n\n// pg (almost) compatible types to relief and reduce their requirements\nexport type QueryResult<T extends QueryResultRow> = {\n rowCount: number;\n rows: T[];\n fields?: Partial<pg.FieldDef>[];\n};\n\nexport interface Queryable {\n query: <T extends QueryResultRow>(queryConfig: {\n text: string;\n values?: unknown[];\n }) => Promise<QueryResult<T>>;\n}\n\ntype pgQueryResult<X extends Queryable, T extends QueryResultRow> = X extends {\n query(...args: unknown[]): Promise<pg.QueryResult<T>>;\n}\n ? pg.QueryResult<T>\n : QueryResult<T>;\n\ntype QueryHelperOptions = {\n beforeQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n afterQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;\n onError?: <T extends pg.QueryConfig<unknown[]>>(ctx: T, e: Error) => void;\n};\n\ntype QueryTemplateOrSimpleQuery =\n | QueryTemplateStyle\n | [query: string, values?: unknown[]]\n | [query: pg.QueryConfig<unknown[]>];\n\nfunction hidePropertyExcludes(target: object, keys: string[]) {\n target = { ...target };\n Object.defineProperties(\n target,\n Object.fromEntries(\n Object.keys(target).map((k) => [\n k,\n keys.includes(k) ? {} : { enumerable: false },\n ])\n )\n );\n return target;\n}\n\n/**\n * Query Helper\n */\nexport class QueryHelper<X extends Queryable> {\n #db: X;\n #opts: QueryHelperOptions;\n\n constructor(db: X, opts: QueryHelperOptions = {}) {\n this.#db = db;\n this.#opts = opts;\n }\n\n #parseQueryTemplateStyle(\n args: QueryTemplateOrSimpleQuery\n ): pg.QueryConfig<unknown[]> {\n if (isQueryTemplateStyle(args)) {\n const [texts, ...values] = args;\n return sql(texts, ...values);\n }\n\n const [query, values] = args;\n\n if (typeof query === 'object' && query && 'text' in query) {\n return query;\n }\n\n return { text: query, values: values ?? [] };\n }\n\n async #query<T extends QueryResultRow>(\n args: QueryTemplateOrSimpleQuery\n ): Promise<pgQueryResult<X, T>> {\n const query = this.#parseQueryTemplateStyle(args);\n\n this.#opts?.beforeQuery?.(query);\n\n const results = await this.#db.query<T>(query).catch((e) => {\n this.#opts?.onError?.(query, e);\n throw e;\n });\n\n this.#opts?.afterQuery?.({\n ...query,\n results: hidePropertyExcludes(results, ['command', 'rowCount', 'rows']),\n });\n\n return results as pgQueryResult<X, T>;\n }\n\n // ==================================================================================================\n // query executors\n\n async insert<T extends QueryResultRow>(\n table: string,\n fv: FieldValues,\n appendix?: string | QueryFragment\n ) {\n const query = buildInsert(table, fv, appendix);\n return await this.#query<T>([query]);\n }\n\n async update<T extends QueryResultRow>(\n table: string,\n fv: FieldValues,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildUpdate(table, fv, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async delete<T extends QueryResultRow>(\n table: string,\n where: WhereArg,\n appendix?: string | QueryFragment\n ) {\n const query = buildDelete(table, where, appendix);\n return await this.#query<T>([query]);\n }\n\n async query<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query<T>(args);\n }\n\n async getRows<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query<T>(args).then((x) => x.rows);\n }\n\n async getRow<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query<T>(args).then((x) => x.rows?.[0]);\n }\n\n async getOne<T = unknown>(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => Object.values(x.rows?.[0])?.[0] as T);\n }\n\n async getCount(...args: QueryTemplateOrSimpleQuery) {\n return this.#query(args).then((x) => x.rowCount);\n }\n async exec(...args: QueryTemplateOrSimpleQuery) {\n // same as getCount\n return this.#query(args).then((x) => x.rowCount);\n }\n}\n\ntype Overwrite<T, Q> = Omit<T, keyof Q> & Q;\ntype MethodChainRewrite<T, Q> = {\n [K in keyof T]: T[K] extends (...args: infer R) => T\n ? (...args: R) => Override<T, Q>\n : T[K] extends T\n ? Override<T, Q>\n : T[K];\n};\ntype Override<T, Q> = Overwrite<MethodChainRewrite<T, Q>, Q>;\n\n/**\n * Returns a proxy object that overrides the queryable instance `db` by Query Helper utilities\n * @param db - Queryable object to be wrapped\n */\nexport function useQueryHelper<T extends Queryable>(\n db: T,\n opts?: QueryHelperOptions\n): Override<T, QueryHelper<T>> {\n const qh = new QueryHelper<T>(db, opts);\n const proxy: unknown = new Proxy(db, {\n get(db, key, receiver) {\n const target = key in qh ? qh : key in db ? db : undefined;\n const value = target && Reflect.get(target, key);\n\n if (value && value instanceof Function) {\n return function (this: unknown, ...args: unknown[]) {\n const result = value.apply(this === receiver ? target : this, args);\n return result === db ? proxy : result;\n };\n }\n\n return value === db ? proxy : value;\n },\n });\n\n return proxy as Override<T, QueryHelper<T>>;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["pgescape", "pgIdent", "s", "x", "pgescape", "pgString", "QueryFragmentBase", "values", "text", "embed", "_value", "QueryFragmentValue", "value", "__privateAdd", "__privateSet", "opts", "__privateGet", "_ident", "QueryFragmentIdent", "ident", "_string", "QueryFragmentRawString", "isQueryFragment", "makeIdent", "name", "makeValue", "makeRaw", "QueryFragments", "makeJsonValue", "isQueryTemplateStyle", "args", "texts", "sewTemplateTextsAndValues", "idx", "_list", "_opts", "prefix", "glue", "suffix", "empty", "sql", "fragments", "raw", "json", "wrapperFn", "buildClauses", "clauses", "parse", "val", "key", "OR", "fv", "AND", "WHERE", "WHERE_OR", "buildValues", "fvs", "array", "sig", "arg", "v", "buildKeys", "ks", "buildInsert", "table", "appendix", "keys", "buildUpdate", "where", "pairs", "k", "buildDelete", "or", "and", "WHERE_AND", "where_and", "where_or", "hidePropertyExcludes", "target", "keys", "k", "_db", "_opts", "_parseQueryTemplateStyle", "parseQueryTemplateStyle_fn", "_query", "query_fn", "QueryHelper", "db", "opts", "__privateAdd", "__privateSet", "table", "fv", "appendix", "query", "buildInsert", "__privateMethod", "where", "buildUpdate", "buildDelete", "args", "x", "isQueryTemplateStyle", "texts", "values", "sql", "__privateGet", "results", "e", "useQueryHelper", "qh", "proxy", "key", "receiver", "value", "result"]
|
|
7
7
|
}
|
package/dist/query-helper.d.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import type pg from 'pg';
|
|
2
2
|
import type { QueryFragment, FieldValues, WhereArg, QueryTemplateStyle } from './query-weaver';
|
|
3
|
-
type
|
|
3
|
+
export type QueryResultRow = pg.QueryResultRow;
|
|
4
|
+
export type QueryResult<T extends QueryResultRow> = {
|
|
4
5
|
rowCount: number;
|
|
5
|
-
rows:
|
|
6
|
+
rows: T[];
|
|
6
7
|
fields?: Partial<pg.FieldDef>[];
|
|
7
8
|
};
|
|
8
|
-
type pgQueryResult<R> = Omit<Partial<pg.QueryResult>, keyof pgQueryResultCustom<R>> & pgQueryResultCustom<R>;
|
|
9
9
|
export interface Queryable {
|
|
10
|
-
query: <T extends
|
|
10
|
+
query: <T extends QueryResultRow>(queryConfig: {
|
|
11
11
|
text: string;
|
|
12
12
|
values?: unknown[];
|
|
13
|
-
}) => Promise<
|
|
13
|
+
}) => Promise<QueryResult<T>>;
|
|
14
14
|
}
|
|
15
|
+
type pgQueryResult<X extends Queryable, T extends QueryResultRow> = X extends {
|
|
16
|
+
query(...args: unknown[]): Promise<pg.QueryResult<T>>;
|
|
17
|
+
} ? pg.QueryResult<T> : QueryResult<T>;
|
|
15
18
|
type QueryHelperOptions = {
|
|
16
|
-
placeHolderFn?: (v: unknown, values: unknown[]) => string;
|
|
17
19
|
beforeQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;
|
|
18
20
|
afterQuery?: <T extends pg.QueryConfig<unknown[]>>(ctx: T) => void;
|
|
19
21
|
onError?: <T extends pg.QueryConfig<unknown[]>>(ctx: T, e: Error) => void;
|
|
@@ -22,22 +24,27 @@ type QueryTemplateOrSimpleQuery = QueryTemplateStyle | [query: string, values?:
|
|
|
22
24
|
/**
|
|
23
25
|
* Query Helper
|
|
24
26
|
*/
|
|
25
|
-
export declare class QueryHelper {
|
|
27
|
+
export declare class QueryHelper<X extends Queryable> {
|
|
26
28
|
#private;
|
|
27
|
-
constructor(db:
|
|
28
|
-
insert<T extends
|
|
29
|
-
update<T extends
|
|
30
|
-
delete<T extends
|
|
31
|
-
query<T extends
|
|
32
|
-
getRows<T extends
|
|
33
|
-
getRow<T extends
|
|
29
|
+
constructor(db: X, opts?: QueryHelperOptions);
|
|
30
|
+
insert<T extends QueryResultRow>(table: string, fv: FieldValues, appendix?: string | QueryFragment): Promise<pgQueryResult<X, T>>;
|
|
31
|
+
update<T extends QueryResultRow>(table: string, fv: FieldValues, where: WhereArg, appendix?: string | QueryFragment): Promise<pgQueryResult<X, T>>;
|
|
32
|
+
delete<T extends QueryResultRow>(table: string, where: WhereArg, appendix?: string | QueryFragment): Promise<pgQueryResult<X, T>>;
|
|
33
|
+
query<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery): Promise<pgQueryResult<X, T>>;
|
|
34
|
+
getRows<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery): Promise<T[]>;
|
|
35
|
+
getRow<T extends QueryResultRow>(...args: QueryTemplateOrSimpleQuery): Promise<T>;
|
|
34
36
|
getOne<T = unknown>(...args: QueryTemplateOrSimpleQuery): Promise<T>;
|
|
35
37
|
getCount(...args: QueryTemplateOrSimpleQuery): Promise<number>;
|
|
36
38
|
exec(...args: QueryTemplateOrSimpleQuery): Promise<number>;
|
|
37
39
|
}
|
|
40
|
+
type Overwrite<T, Q> = Omit<T, keyof Q> & Q;
|
|
41
|
+
type MethodChainRewrite<T, Q> = {
|
|
42
|
+
[K in keyof T]: T[K] extends (...args: infer R) => T ? (...args: R) => Override<T, Q> : T[K] extends T ? Override<T, Q> : T[K];
|
|
43
|
+
};
|
|
44
|
+
type Override<T, Q> = Overwrite<MethodChainRewrite<T, Q>, Q>;
|
|
38
45
|
/**
|
|
39
46
|
* Returns a proxy object that overrides the queryable instance `db` by Query Helper utilities
|
|
40
47
|
* @param db - Queryable object to be wrapped
|
|
41
48
|
*/
|
|
42
|
-
export declare function useQueryHelper<T extends Queryable>(db: T, opts?: QueryHelperOptions):
|
|
49
|
+
export declare function useQueryHelper<T extends Queryable>(db: T, opts?: QueryHelperOptions): Override<T, QueryHelper<T>>;
|
|
43
50
|
export {};
|