@querykitjs/mongodb 1.0.0 → 1.0.2
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/README.en.md +10 -0
- package/README.md +10 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{repository-CPlf87mC.d.cts → repository-Cy267Ude.d.cts} +3 -3
- package/dist/{repository-CPlf87mC.d.ts → repository-Cy267Ude.d.ts} +3 -3
- package/package.json +2 -2
- package/skills/querykit-mongodb/SKILL.md +1 -0
package/README.en.md
CHANGED
|
@@ -88,6 +88,16 @@ A client filters and sorts only by the fields the server allows, with the operat
|
|
|
88
88
|
- `findInfinite({ limit, offset })` — infinite scroll (`has_more`, `next_offset`).
|
|
89
89
|
- `findCursor({ cursorKey, limit, cursor, order, direction })` — keyset; ties on `cursorKey` are broken by `_id`, so no row is skipped or repeated; with `cursorSecret` the tokens are signed and an unsigned one is refused.
|
|
90
90
|
|
|
91
|
+
### A stable order across offset pages
|
|
92
|
+
|
|
93
|
+
`findList` and `findInfinite` always end the order on the primary key, in the first key's direction: `sort: [{ key: "age", direction: "desc" }]` → `age` desc, then `_id` desc. A row with an equal value cannot repeat or go missing between pages.
|
|
94
|
+
|
|
95
|
+
- The primary key does not count against `maxSortFields` and need not be in `sortable`; whether a client may sort by it does not change. A sort that already holds it gets no second copy.
|
|
96
|
+
- `findAll` and `findOne` keep their order: they do not page.
|
|
97
|
+
- The order equals `findCursor`'s.
|
|
98
|
+
- ⚠️ **Index cost.** With no compound `(col, _id)` index MongoDB sorts this order in memory; an index on `(col)` alone is not enough. On a large collection add `{ col: 1, _id: 1 }`, which serves both directions. `findCursor` needs the same index.
|
|
99
|
+
- `explainFind` shows the plan of `findAll`, which has no such key.
|
|
100
|
+
|
|
91
101
|
## Relations (`with`)
|
|
92
102
|
|
|
93
103
|
Not in this version: `$lookup` is not built, so any `with` is `forbidden-key` (`site: "with"`). Load related documents with a second repository call.
|
package/README.md
CHANGED
|
@@ -88,6 +88,16 @@ Mijoz faqat server ruxsat bergan maydonlar bo'yicha, ruxsat berilgan operatorlar
|
|
|
88
88
|
- `findInfinite({ limit, offset })` — infinite scroll (`has_more`, `next_offset`).
|
|
89
89
|
- `findCursor({ cursorKey, limit, cursor, order, direction })` — keyset; `cursorKey` dagi tengliklar `_id` bilan ajratiladi, shuning uchun hech bir qator tushib qolmaydi yoki takrorlanmaydi; `cursorSecret` bilan tokenlar imzolanadi, imzosizi rad etiladi.
|
|
90
90
|
|
|
91
|
+
### Offset sahifalarda barqaror tartib
|
|
92
|
+
|
|
93
|
+
`findList` va `findInfinite` tartibi doim primary key bilan tugaydi, birinchi kalit yo'nalishida: `sort: [{ key: "age", direction: "desc" }]` → `age` desc, keyin `_id` desc. Teng qiymatli qator sahifalar orasida takrorlanmaydi va tushib qolmaydi.
|
|
94
|
+
|
|
95
|
+
- Primary key `maxSortFields` ga sanalmaydi va `sortable` da bo'lishi shart emas; mijoz u bo'yicha saralay olishi o'zgarmaydi. Sort'da allaqachon bo'lsa, qayta qo'shilmaydi.
|
|
96
|
+
- `findAll` va `findOne` tartibi o'zgarmaydi: ular sahifalamaydi.
|
|
97
|
+
- Tartib `findCursor` tartibi bilan bir xil.
|
|
98
|
+
- ⚠️ **Indeks narxi.** `(col, _id)` compound indeksisiz MongoDB bu tartibni xotirada saralaydi, faqat `(col)` indeksi yetmaydi. Katta collection'da `{ col: 1, _id: 1 }` qo'ying; u ikkala yo'nalishga xizmat qiladi. `findCursor` ga ham shu indeks kerak.
|
|
99
|
+
- `explainFind` `findAll` rejasini ko'rsatadi, unda bu kalit yo'q.
|
|
100
|
+
|
|
91
101
|
## Relation'lar (`with`)
|
|
92
102
|
|
|
93
103
|
Bu versiyada yo'q: `$lookup` qurilmagan, shuning uchun har qanday `with` — `forbidden-key` (`site: "with"`). Bog'liq hujjatlarni ikkinchi repository chaqiruvi bilan yuklang.
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var core=require('@querykitjs/core'),internal=require('@querykitjs/core/internal'),mongodb=require('mongodb');var he=new Set(["optional","nullable","default","prefault","readonly","catch","nonoptional"]),Te={string:"string",number:"number",boolean:"boolean",date:"date"};function ke(t){let e=t.def;for(;he.has(e.type)&&e.innerType;)e=e.innerType.def;return e.type==="enum"&&e.entries?{kind:"string",values:Object.values(e.entries)}:e.type==="literal"&&e.values?{kind:typeof e.values[0]=="number"?"number":"string",values:e.values}:{kind:Te[e.type]??"other"}}function z(t,e,o=["_id"]){let n=new Map;for(let[s,l]of Object.entries(e.shape))n.set(s,ke(l));for(let s of o)n.set(s,{kind:"objectId"});return n.has("_id")||n.set("_id",{kind:"objectId"}),{source:t,fields:n}}function b(t,e){let o=e==="id"?"_id":e;return t.fields.has(o)?o:void 0}var X=(t,e)=>t.fields.get(e)?.kind;function G(t,e,o,n=b(t,"createdAt")?"createdAt":void 0){let s={};for(let l of internal.normalizeSort(e,o)){let f=b(t,l.key);f?s[f]=l.direction==="desc"?-1:1:internal.reportSkip(o,{site:"sort",key:l.key,reason:"unknown-key"});}return Object.keys(s).length===0&&(n?s[n]=-1:s._id=-1),s}var H=new Set(core.TEXT_FILTER_OPERATORS),x=Symbol("querykit.invalid-value"),Y=t=>H.has(t),xe=/^-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;function Se(t,e){switch(t.kind){case "string":return typeof e=="string"||typeof e=="number"||typeof e=="boolean"?String(e):x;case "number":return typeof e=="number"?Number.isFinite(e)?e:x:typeof e=="string"&&xe.test(e.trim())?Number(e):x;case "boolean":return typeof e=="boolean"?e:e==="true"?true:e==="false"?false:x;case "date":{if(!(e instanceof Date)&&typeof e!="string"&&typeof e!="number")return x;let o=new Date(e);return Number.isNaN(o.getTime())?x:o}case "objectId":return e instanceof mongodb.ObjectId?e:typeof e=="string"&&mongodb.ObjectId.isValid(e)&&e.length===24?new mongodb.ObjectId(e):x;case "other":return typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:x}}function _(t,e,o){let n=t.fields.get(e);if(!n||o===null||o===void 0)return o;let s=Se(n,o);return s===x||n.values&&!n.values.includes(s)?x:s}function Z(t,e,o,n){if(n===void 0)return n;if(H.has(o))return typeof n=="string"?n:x;if(Array.isArray(n)){let l=[];for(let f of n){let p=_(t,e,f);if(p===x)return x;l.push(p);}return l}let s=_(t,e,n);return s===x?x:s}var E=t=>String(t??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),V=t=>{let e="";for(let o of String(t??""))o==="%"?e.endsWith(".*")||(e+=".*"):o==="_"?e+=".":e+=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return `^${e}$`},J=t=>Array.isArray(t)&&t.length===2?[t[0],t[1]]:void 0,ee={"=":t=>({$eq:t}),eq:t=>({$eq:t}),"!=":t=>({$nin:[t,null]}),ne:t=>({$nin:[t,null]}),">":t=>({$gt:t}),gt:t=>({$gt:t}),">=":t=>({$gte:t}),gte:t=>({$gte:t}),"<":t=>({$lt:t}),lt:t=>({$lt:t}),"<=":t=>({$lte:t}),lte:t=>({$lte:t}),contains:t=>({$regex:E(t),$options:"i"}),"%_%":t=>({$regex:E(t),$options:"i"}),startsWith:t=>({$regex:`^${E(t)}`,$options:"i"}),"%_":t=>({$regex:`^${E(t)}`,$options:"i"}),endsWith:t=>({$regex:`${E(t)}$`,$options:"i"}),"_%":t=>({$regex:`${E(t)}$`,$options:"i"}),like:t=>({$regex:V(t)}),ilike:t=>({$regex:V(t),$options:"i"}),notLike:t=>({$not:{$regex:V(t)},$ne:null}),in:t=>Array.isArray(t)?{$in:t}:void 0,notIn:t=>Array.isArray(t)?{$nin:[...t,null]}:void 0,between:t=>{let e=J(t);return e?{$gte:e[0],$lte:e[1]}:void 0},notBetween:t=>{let e=J(t);return e?{$not:{$gte:e[0],$lte:e[1]},$ne:null}:void 0},isNull:()=>({$eq:null}),isNotNull:()=>({$ne:null})};var q=t=>typeof t=="object"&&t!==null,te=t=>q(t)&&"key"in t&&!("and"in t)&&!("or"in t)&&!("not"in t);function K(t,e){let o=e.filter(n=>n!==void 0);if(o.length!==0)return o.length===1?o[0]:{[t]:o}}function ne(t,e,o){let n=e.operation??"=",s=ee[n];if(!s)throw new Error(`Unsupported filter operator: "${n}"`);let l=b(t,e.key);if(!l){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"unknown-key"});return}if(Y(n)&&X(t,l)==="date"){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"invalid-value"});return}let f=Z(t,l,n,e.value);if(f===x){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"invalid-value"});return}let p=s(f);if(p===void 0){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"invalid-value"});return}return {[l]:p}}function M(t,e,o){if(te(e))return ne(t,e,o);if(q(e)){if("and"in e)return K("$and",e.and.map(n=>M(t,n,o)));if("or"in e)return K("$or",e.or.map(n=>M(t,n,o)));if("not"in e)return B(t,e.not,o);if(internal.isRaw(e))return e;throw new core.QueryKitError({source:t.source,site:"filter",key:Object.keys(e)[0]??"",reason:"forbidden-key"})}}function B(t,e,o){if(te(e)){let s=ne(t,e,o);if(!s)return;let l=e.operation??"=",f=l==="isNull"||l==="isNotNull"?void 0:b(t,e.key);return f?{$and:[{[f]:{$ne:null}},{$nor:[s]}]}:{$nor:[s]}}if(q(e)){if("and"in e)return K("$or",e.and.map(s=>B(t,s,o)));if("or"in e)return K("$and",e.or.map(s=>B(t,s,o)));if("not"in e)return M(t,e.not,o)}let n=M(t,e,o);return n?{$nor:[n]}:void 0}function L(t,e,o){if(e!==void 0)return Array.isArray(e)?K("$and",e.map(n=>M(t,n,o))):M(t,e,o)}var oe=t=>Object.entries(t).filter(([,e])=>e).map(([e])=>e);function re(t,e){let o=e.forcedColumns?oe(e.forcedColumns):void 0;if(e.forcedColumns&&o.length===0)throw new Error("buildRepository: forcedColumns must select at least one field (an empty selection would return the full document).");let n=e.allowedColumns?new Set(e.allowedColumns):void 0;if(e.allowedColumns&&n.size===0)throw new Error("buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full document).");let s=p=>o?o.includes(p):n?n.has(p):true,l=p=>{let D=p.filter(u=>n.has(u));return D.length>0?D:[...n]};return {guarded:!!(o??n),permits:s,projection:p=>{let D=p?oe(p):[],u=o??(n?l(D):D);if(u.length===0)return;let h={},F=false;for(let k of u){let r=b(t,k);r&&(h[r]=1,r==="_id"&&(F=true));}if(Object.keys(h).length!==0)return F||(h._id=0),h}}}var Qe={columns:"projection",nested:"with",filters:["match"],logical:["$and","$or","$nor"],paging:["limit","skip"],options:"options"},_e=t=>typeof t=="object"&&t!==null&&(t.codeName==="MaxTimeMSExpired"||t.code===50);function se(t,e,o){let n=z(e.collectionName,o.schema,o.objectId),s=b(n,t.timestamps?.deletedAt??"deletedAt")??"deletedAt",l=n.fields.has(s),f=t.timestamps?.createdAt!==void 0,p=b(n,t.timestamps?.createdAt??"createdAt"),D=n.fields.has("updatedAt"),u=d=>D?{...d,updatedAt:new Date}:d,h={source:n.source,strict:t.strict,onSkipped:t.onSkippedCondition},F=k(n);function k(d){let y=internal.scopeConditions(o.scope);for(let P of y)if(!b(d,P.key))throw new core.QueryKitError({source:d.source,site:"filter",key:P.key,reason:"unknown-key"});return y.length?L(d,y):void 0}let r=d=>G(n,d,h,p),w=d=>{internal.checkWith(d,void 0,Qe,h.source);},T=(d,y)=>{let P=[d,F,l&&!y?{[s]:{$eq:null}}:void 0].filter(A=>A!==void 0);return P.length===0?{}:P.length===1?P[0]:{$and:P}},m=(d,y)=>T(L(n,d,h),y),i=(d,y,P)=>{let A={key:y,operation:"=",value:P};return d?Array.isArray(d)?[...d,A]:{and:[d,A]}:[A]},c=re(n,o),a=o.maxTimeMS??t.maxTimeMS,R=()=>{let d=t.getSession();return d?{session:d}:{}},S=async d=>{try{return await d({maxTimeMS:a,...R()})}catch(y){throw _e(y)?new core.QueryKitTimeoutError(n.source,a,{cause:y}):y}},O=(d,y)=>S(P=>{let A={...P},Q=c.projection(y.columns);return Q&&(A.projection=Q),y.sort&&(A.sort=y.sort),typeof y.skip=="number"&&(A.skip=y.skip),typeof y.limit=="number"&&(A.limit=y.limit),e.find(d,A).toArray()}),I=d=>S(y=>e.countDocuments(d,y)),g=internal.resolvePolicy({source:n.source,fieldOf:d=>b(n,d),primaryKey:"_id",createdAt:f?p:p??b(n,"created_at"),filterable:o.filterable,sortable:o.sortable,allowedColumns:o.allowedColumns,forcedColumns:o.forcedColumns,limits:{...t.limits,...o.limits}});return {...c,runtime:t,collection:e,shape:n,diag:h,hasDeletedAt:l,deletedAtPath:s,forUpdate:u,sortSpec:r,withOf:w,policy:g,maxTimeMS:a,composeWhere:m,mutationWhere:(d,y)=>{if(internal.isAllRows(d))return T(void 0);internal.isEmptyFilter(d)&&internal.refuseEmptyFilter(h.source,y),g.checkFilter(d);let P=L(n,d,h);return P===void 0?internal.refuseEmptyFilter(h.source,y):T(P)},withId:i,session:R,timed:S,runFind:O,countWhere:I}}var j=t=>t===void 0?[]:Array.isArray(t)?t:[t];function ce(t){let{collection:e,shape:o,diag:n,permits:s,policy:l,composeWhere:f,timed:p}=t,D=u=>{let h=s(u)?b(o,u):void 0;return h||internal.reportSkip(n,{site:"aggregate",key:u,reason:"unknown-key"}),h};return {async aggregate(u){l.checkFilter(u.filter);for(let m of [u.groupBy,u.sum,u.avg,u.min,u.max].flatMap(i=>j(i)))l.checkAggregateKey(m);let h=j(u.groupBy).filter(m=>!!D(m)),k={_id:h.length?Object.fromEntries(h.map(m=>[m,`$${D(m)??m}`])):null};u.count&&(k.count={$sum:1});let r=(m,i,c)=>{for(let a of i){let R=D(a);R&&(k[`${c}_${a}`]={[m]:`$${R}`});}};r("$sum",j(u.sum),"sum"),r("$avg",j(u.avg),"avg"),r("$min",j(u.min),"min"),r("$max",j(u.max),"max");let w=[{$match:f(u.filter,u.withDeleted)},{$group:k}];return (await p(m=>e.aggregate(w,m).toArray())).map(({_id:m,...i})=>({...typeof m=="object"&&m?m:{},...i}))}}}function ue(t){let{runtime:e,collection:o,shape:n,diag:s,guarded:l,permits:f,projection:p,policy:D,withOf:u,composeWhere:h,timed:F}=t;return {async findCursor(k={}){let r=internal.clampPageSize(k.limit,e.defaultLimit,e.maxLimit),w=k.cursorKey??"id";D.checkFilter(k.filter),k.cursorKey!==void 0&&D.checkCursorKey(w);let T=k.order??"asc",m=k.direction??"forward",i=b(n,w);if(!i)throw new core.QueryKitError({source:s.source,site:"cursorKey",key:w,reason:"unknown-key"});let c=await internal.decodeCursorToken(k.cursor,{source:s.source,secret:e.cursorSecret,key:w}),a=c===void 0?void 0:_(n,i,c.k),R=c===void 0?void 0:_(n,"_id",c.id);if(a===x||R===x)throw new core.QueryKitError({source:s.source,site:"cursorKey",key:w,reason:"invalid-value"});let S=h(k.filter,k.withDeleted),O=m==="forward"?T==="asc":T==="desc",I=O?"$gt":"$lt",g=i!=="_id",$=c===void 0?void 0:g?{$or:[{[i]:{[I]:a}},{[i]:a,_id:{[I]:R}}]}:{[i]:{[I]:a}},d=$?Object.keys(S).length?{$and:[S,$]}:$:S,y=p(k.columns),P=y?{...y,[i]:1,_id:1}:void 0,A=C=>y!==void 0&&!!y[C],Q=y===void 0?[]:[i,"_id"].filter(C=>l&&(!f(C)||!A(C))||C==="_id"&&C!==i&&!A(C));u(k.with);let ge=g?{[i]:O?1:-1,_id:O?1:-1}:{[i]:O?1:-1},De=await F(C=>o.find(d,{...C,...P?{projection:P}:{},sort:ge,limit:r+1}).toArray()),U=await internal.cursorPage(De,{limit:r,direction:m,hasCursor:c!==void 0,cursorField:i,idField:"_id",secret:e.cursorSecret});return Q.length>0&&(U.data=U.data.map(C=>Object.fromEntries(Object.entries(C).filter(([we])=>!Q.includes(we))))),U}}}var le=1e3,ve="\0";function fe(t,e){let{runtime:o,collection:n,shape:s,hasDeletedAt:l,deletedAtPath:f,forUpdate:p,composeWhere:D,mutationWhere:u,withId:h,session:F,runFind:k}=t,r=i=>internal.clampPageSize(i.limit,o.defaultLimit,o.maxLimit),w=i=>({...internal.scopeDefaults(e.scope),...i,...internal.scopeDefaults(e.scope)}),T=(i,c)=>{let a=j(c.target),R=w(i),S={};for(let $ of a){let d=b(s,$);if(!d)throw new Error(`upsert: unknown target field "${$}".`);S[d]=R[$];}let O=c.set?{...c.set}:Object.fromEntries(Object.entries(R).filter(([$])=>!a.includes($))),I=Object.fromEntries(Object.entries(R).filter(([$])=>!a.includes($)&&!($ in O))),g={};return Object.keys(O).length&&(g.$set=O),Object.keys(I).length&&(g.$setOnInsert=I),{filter:S,update:g}},m=async(i,c)=>await n.findOneAndUpdate(i,{$set:c},{returnDocument:"after",...F()})??void 0;return {async create(i){let c=w(i),{insertedId:a}=await n.insertOne(c,F());return {...c,_id:a}},async createMany(i){if(i.length===0)return [];let c=i.map(w),{insertedIds:a}=await n.insertMany(c,F());return c.map((R,S)=>({...R,_id:a[S]}))},async upsert(i,c){let{filter:a,update:R}=T(i,c);return await n.findOneAndUpdate(a,R,{returnDocument:"after",upsert:true,...F()})},async upsertMany(i,c){if(i.length===0)return [];let a=i.map(g=>T(g,c));for(let g=0;g<a.length;g+=le){let $=a.slice(g,g+le).map(d=>({updateOne:{filter:d.filter,update:d.update,upsert:true}}));await n.bulkWrite($,F());}let R=await k({$or:a.map(g=>g.filter)},{}),S=j(c.target).map(g=>b(s,g)).filter(g=>!!g),O=g=>S.map($=>String(g[$])).join(ve),I=new Map(R.map(g=>[O(g),g]));return a.map(g=>I.get(O(g.filter))).filter(g=>!!g)},updateById(i,c,a="id"){return m(D(h(void 0,a,i)),p(c))},async updateWhere(i,c,a={}){let R=u(i,"updateWhere"),{matchedCount:S}=await n.updateMany(R,{$set:p(c)},F());if(!a.returning)return {count:S};let O=await k(R,{limit:r(a.returning)});return {count:S,rows:O}},async deleteById(i,c="id"){return await n.findOneAndDelete(D(h(void 0,c,i)),F())??void 0},async deleteWhere(i,c={}){let a=u(i,"deleteWhere"),R=c.returning?await k(a,{limit:r(c.returning)}):void 0,{deletedCount:S}=await n.deleteMany(a,F());return R?{count:S,rows:R}:{count:S}},async softDelete(i,c="id"){if(!l)throw new Error("softDelete: schema has no deletedAt field.");return m(D(h(void 0,c,i),false),p({[f]:new Date}))},async restore(i,c="id"){if(!l)throw new Error("restore: schema has no deletedAt field.");return m(D(h(void 0,c,i),true),p({[f]:null}))}}}var pe=Symbol.for("querykit.mongodb.explain");function ye(t){let{runtime:e,collection:o,policy:n,sortSpec:s,withOf:l,composeWhere:f,withId:p,runFind:D,countWhere:u,timed:h}=t,F=r=>{n.checkFilter(r.filter),n.checkSort(r.sort),l(r.with);},k=async(r,w)=>{let[T]=await D(f(w,r.withDeleted),{sort:s(r.sort),columns:r.columns,limit:1});return T};return {async findAll(r={}){return F(r),await D(f(r.filter,r.withDeleted),{sort:s(r.sort),columns:r.columns})},async findOne(r={}){return F(r),await k(r,r.filter)},async findById(r,w={}){let{idKey:T="id",filter:m}=w;return n.checkFilter(m),l(w.with),await k({...w,sort:void 0},p(m,T,r))},async findList(r={}){F(r);let w=internal.clampPage(r.page),T=internal.clampPageSize(r.perPage,e.defaultPerPage,e.maxPerPage);n.checkPage({page:w,perPage:T});let m=f(r.filter,r.withDeleted),i=R=>D(m,{sort:s(r.sort),columns:r.columns,limit:R,skip:(w-1)*T});if(r.withTotal===false)return internal.offsetPageWithoutTotal(await i(T+1),w,T);let[c,a]=await Promise.all([i(T),u(m)]);return {data:c,meta:internal.offsetMeta(w,T,a)}},async findInfinite(r={}){let w=internal.clampPageSize(r.limit,e.defaultLimit,e.maxLimit),T=internal.clampOffset(r.offset);F(r),n.checkPage({offset:T});let m=await D(f(r.filter,r.withDeleted),{sort:s(r.sort),columns:r.columns,limit:w+1,skip:T});return internal.infinitePage(m,w,T)},async count(r){return n.checkFilter(r),u(f(r))},async exists(r){return n.checkFilter(r),await u(f(r))>0},async[pe](r={}){F(r);let w=f(r.filter,r.withDeleted);return h(T=>o.find(w,{...T,sort:s(r.sort)}).explain("queryPlanner"))}}}function N(t,e,o){let n=se(t,e,o);return {collection:e,...ye(n),...ue(n),...fe(n,o),...ce(n),scoped(l){return N(t,e,{...o,scope:{...o.scope,...l}})}}}var et=2e3;function tt(t,e={}){let o=internal.createContextStore(),n={getSession:()=>o.get()?.session,defaultPerPage:e.defaultPerPage??core.DEFAULT_PER_PAGE,defaultLimit:e.defaultLimit??core.DEFAULT_LIMIT,maxPerPage:e.maxPerPage??core.DEFAULT_MAX_PER_PAGE,maxLimit:e.maxLimit??core.DEFAULT_MAX_LIMIT,strict:e.strict??false,onSkippedCondition:e.onSkippedCondition,limits:e.limits,cursorSecret:e.cursorSecret,timestamps:e.timestamps,maxTimeMS:e.maxTimeMS??et};function s(f,p,D){let u=N(n,f,p);return D?{...u,...D(u)}:u}return {repository:s,transaction:async f=>o.get()?.session?f():t.withSession(async p=>{let D;return await p.withTransaction(async()=>{D=await o.run({session:p},f);}),D})}}function rt(){return core.createFilters()}Object.defineProperty(exports,"f",{enumerable:true,get:function(){return core.f}});exports.buildRepository=N;exports.createFilters=rt;exports.createRegistry=tt;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var core=require('@querykitjs/core'),internal=require('@querykitjs/core/internal'),mongodb=require('mongodb');var he=new Set(["optional","nullable","default","prefault","readonly","catch","nonoptional"]),Re={string:"string",number:"number",boolean:"boolean",date:"date"};function ke(t){let e=t.def;for(;he.has(e.type)&&e.innerType;)e=e.innerType.def;return e.type==="enum"&&e.entries?{kind:"string",values:Object.values(e.entries)}:e.type==="literal"&&e.values?{kind:typeof e.values[0]=="number"?"number":"string",values:e.values}:{kind:Re[e.type]??"other"}}function G(t,e,o=["_id"]){let n=new Map;for(let[s,p]of Object.entries(e.shape))n.set(s,ke(p));for(let s of o)n.set(s,{kind:"objectId"});return n.has("_id")||n.set("_id",{kind:"objectId"}),{source:t,fields:n}}function F(t,e){let o=e==="id"?"_id":e;return t.fields.has(o)?o:void 0}var H=(t,e)=>t.fields.get(e)?.kind;function V(t,e,o,n=F(t,"createdAt")?"createdAt":void 0){let s={};for(let p of internal.normalizeSort(e,o)){let w=F(t,p.key);w?s[w]=p.direction==="desc"?-1:1:internal.reportSkip(o,{site:"sort",key:p.key,reason:"unknown-key"});}return Object.keys(s).length===0&&(n?s[n]=-1:s._id=-1),s}function Y(t,e,o,n){let s=V(t,e,o,n);return "_id"in s?s:{...s,_id:Object.values(s)[0]}}var Z=new Set(core.TEXT_FILTER_OPERATORS),b=Symbol("querykit.invalid-value"),J=t=>Z.has(t),xe=/^-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;function $e(t,e){switch(t.kind){case "string":return typeof e=="string"||typeof e=="number"||typeof e=="boolean"?String(e):b;case "number":return typeof e=="number"?Number.isFinite(e)?e:b:typeof e=="string"&&xe.test(e.trim())?Number(e):b;case "boolean":return typeof e=="boolean"?e:e==="true"?true:e==="false"?false:b;case "date":{if(!(e instanceof Date)&&typeof e!="string"&&typeof e!="number")return b;let o=new Date(e);return Number.isNaN(o.getTime())?b:o}case "objectId":return e instanceof mongodb.ObjectId?e:typeof e=="string"&&mongodb.ObjectId.isValid(e)&&e.length===24?new mongodb.ObjectId(e):b;case "other":return typeof e=="string"||typeof e=="number"||typeof e=="boolean"?e:b}}function _(t,e,o){let n=t.fields.get(e);if(!n||o===null||o===void 0)return o;let s=$e(n,o);return s===b||n.values&&!n.values.includes(s)?b:s}function ee(t,e,o,n){if(n===void 0)return n;if(Z.has(o))return typeof n=="string"?n:b;if(Array.isArray(n)){let p=[];for(let w of n){let a=_(t,e,w);if(a===b)return b;p.push(a);}return p}let s=_(t,e,n);return s===b?b:s}var M=t=>String(t??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),q=t=>{let e="";for(let o of String(t??""))o==="%"?e.endsWith(".*")||(e+=".*"):o==="_"?e+=".":e+=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return `^${e}$`},te=t=>Array.isArray(t)&&t.length===2?[t[0],t[1]]:void 0,ne={"=":t=>({$eq:t}),eq:t=>({$eq:t}),"!=":t=>({$nin:[t,null]}),ne:t=>({$nin:[t,null]}),">":t=>({$gt:t}),gt:t=>({$gt:t}),">=":t=>({$gte:t}),gte:t=>({$gte:t}),"<":t=>({$lt:t}),lt:t=>({$lt:t}),"<=":t=>({$lte:t}),lte:t=>({$lte:t}),contains:t=>({$regex:M(t),$options:"i"}),"%_%":t=>({$regex:M(t),$options:"i"}),startsWith:t=>({$regex:`^${M(t)}`,$options:"i"}),"%_":t=>({$regex:`^${M(t)}`,$options:"i"}),endsWith:t=>({$regex:`${M(t)}$`,$options:"i"}),"_%":t=>({$regex:`${M(t)}$`,$options:"i"}),like:t=>({$regex:q(t)}),ilike:t=>({$regex:q(t),$options:"i"}),notLike:t=>({$not:{$regex:q(t)},$ne:null}),in:t=>Array.isArray(t)?{$in:t}:void 0,notIn:t=>Array.isArray(t)?{$nin:[...t,null]}:void 0,between:t=>{let e=te(t);return e?{$gte:e[0],$lte:e[1]}:void 0},notBetween:t=>{let e=te(t);return e?{$not:{$gte:e[0],$lte:e[1]},$ne:null}:void 0},isNull:()=>({$eq:null}),isNotNull:()=>({$ne:null})};var X=t=>typeof t=="object"&&t!==null,oe=t=>X(t)&&"key"in t&&!("and"in t)&&!("or"in t)&&!("not"in t);function K(t,e){let o=e.filter(n=>n!==void 0);if(o.length!==0)return o.length===1?o[0]:{[t]:o}}function re(t,e,o){let n=e.operation??"=",s=ne[n];if(!s)throw new Error(`Unsupported filter operator: "${n}"`);let p=F(t,e.key);if(!p){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"unknown-key"});return}if(J(n)&&H(t,p)==="date"){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"invalid-value"});return}let w=ee(t,p,n,e.value);if(w===b){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"invalid-value"});return}let a=s(w);if(a===void 0){internal.reportSkip(o,{site:"filter",key:e.key,operation:n,reason:"invalid-value"});return}return {[p]:a}}function Q(t,e,o){if(oe(e))return re(t,e,o);if(X(e)){if("and"in e)return K("$and",e.and.map(n=>Q(t,n,o)));if("or"in e)return K("$or",e.or.map(n=>Q(t,n,o)));if("not"in e)return z(t,e.not,o);if(internal.isRaw(e))return e;throw new core.QueryKitError({source:t.source,site:"filter",key:Object.keys(e)[0]??"",reason:"forbidden-key"})}}function z(t,e,o){if(oe(e)){let s=re(t,e,o);if(!s)return;let p=e.operation??"=",w=p==="isNull"||p==="isNotNull"?void 0:F(t,e.key);return w?{$and:[{[w]:{$ne:null}},{$nor:[s]}]}:{$nor:[s]}}if(X(e)){if("and"in e)return K("$or",e.and.map(s=>z(t,s,o)));if("or"in e)return K("$and",e.or.map(s=>z(t,s,o)));if("not"in e)return Q(t,e.not,o)}let n=Q(t,e,o);return n?{$nor:[n]}:void 0}function N(t,e,o){if(e!==void 0)return Array.isArray(e)?K("$and",e.map(n=>Q(t,n,o))):Q(t,e,o)}var ie=t=>Object.entries(t).filter(([,e])=>e).map(([e])=>e);function se(t,e){let o=e.forcedColumns?ie(e.forcedColumns):void 0;if(e.forcedColumns&&o.length===0)throw new Error("buildRepository: forcedColumns must select at least one field (an empty selection would return the full document).");let n=e.allowedColumns?new Set(e.allowedColumns):void 0;if(e.allowedColumns&&n.size===0)throw new Error("buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full document).");let s=a=>o?o.includes(a):n?n.has(a):true,p=a=>{let T=a.filter(l=>n.has(l));return T.length>0?T:[...n]};return {guarded:!!(o??n),permits:s,projection:a=>{let T=a?ie(a):[],l=o??(n?p(T):T);if(l.length===0)return;let m={},$=false;for(let g of l){let S=F(t,g);S&&(m[S]=1,S==="_id"&&($=true));}if(Object.keys(m).length!==0)return $||(m._id=0),m}}}var _e={columns:"projection",nested:"with",filters:["match"],logical:["$and","$or","$nor"],paging:["limit","skip"],options:"options"},Ke=t=>typeof t=="object"&&t!==null&&(t.codeName==="MaxTimeMSExpired"||t.code===50);function de(t,e,o){let n=G(e.collectionName,o.schema,o.objectId),s=F(n,t.timestamps?.deletedAt??"deletedAt")??"deletedAt",p=n.fields.has(s),w=t.timestamps?.createdAt!==void 0,a=F(n,t.timestamps?.createdAt??"createdAt"),T=n.fields.has("updatedAt"),l=u=>T?{...u,updatedAt:new Date}:u,m={source:n.source,strict:t.strict,onSkipped:t.onSkippedCondition},$=g(n);function g(u){let D=internal.scopeConditions(o.scope);for(let O of D)if(!F(u,O.key))throw new core.QueryKitError({source:u.source,site:"filter",key:O.key,reason:"unknown-key"});return D.length?N(u,D):void 0}let S=u=>V(n,u,m,a),r=u=>Y(n,u,m,a),R=u=>{internal.checkWith(u,void 0,_e,m.source);},c=(u,D)=>{let O=[u,$,p&&!D?{[s]:{$eq:null}}:void 0].filter(A=>A!==void 0);return O.length===0?{}:O.length===1?O[0]:{$and:O}},i=(u,D)=>c(N(n,u,m),D),d=(u,D,O)=>{let A={key:D,operation:"=",value:O};return u?Array.isArray(u)?[...u,A]:{and:[u,A]}:[A]},f=se(n,o),h=o.maxTimeMS??t.maxTimeMS,k=()=>{let u=t.getSession();return u?{session:u}:{}},P=async u=>{try{return await u({maxTimeMS:h,...k()})}catch(D){throw Ke(D)?new core.QueryKitTimeoutError(n.source,h,{cause:D}):D}},I=(u,D)=>P(O=>{let A={...O},L=f.projection(D.columns);return L&&(A.projection=L),D.sort&&(A.sort=D.sort),typeof D.skip=="number"&&(A.skip=D.skip),typeof D.limit=="number"&&(A.limit=D.limit),e.find(u,A).toArray()}),y=u=>P(D=>e.countDocuments(u,D)),x=internal.resolvePolicy({source:n.source,fieldOf:u=>F(n,u),primaryKey:"_id",createdAt:w?a:a??F(n,"created_at"),filterable:o.filterable,sortable:o.sortable,allowedColumns:o.allowedColumns,forcedColumns:o.forcedColumns,limits:{...t.limits,...o.limits}});return {...f,runtime:t,collection:e,shape:n,diag:m,hasDeletedAt:p,deletedAtPath:s,forUpdate:l,sortSpec:S,listSortSpec:r,withOf:R,policy:x,maxTimeMS:h,composeWhere:i,mutationWhere:(u,D)=>{if(internal.isAllRows(u))return c(void 0);internal.isEmptyFilter(u)&&internal.refuseEmptyFilter(m.source,D),x.checkFilter(u);let O=N(n,u,m);return O===void 0?internal.refuseEmptyFilter(m.source,D):c(O)},withId:d,session:k,timed:P,runFind:I,countWhere:y}}var j=t=>t===void 0?[]:Array.isArray(t)?t:[t];function ue(t){let{collection:e,shape:o,diag:n,permits:s,policy:p,composeWhere:w,timed:a}=t,T=l=>{let m=s(l)?F(o,l):void 0;return m||internal.reportSkip(n,{site:"aggregate",key:l,reason:"unknown-key"}),m};return {async aggregate(l){p.checkFilter(l.filter);for(let c of [l.groupBy,l.sum,l.avg,l.min,l.max].flatMap(i=>j(i)))p.checkAggregateKey(c);let m=j(l.groupBy).filter(c=>!!T(c)),g={_id:m.length?Object.fromEntries(m.map(c=>[c,`$${T(c)??c}`])):null};l.count&&(g.count={$sum:1});let S=(c,i,d)=>{for(let f of i){let h=T(f);h&&(g[`${d}_${f}`]={[c]:`$${h}`});}};S("$sum",j(l.sum),"sum"),S("$avg",j(l.avg),"avg"),S("$min",j(l.min),"min"),S("$max",j(l.max),"max");let r=[{$match:w(l.filter,l.withDeleted)},{$group:g}];return (await a(c=>e.aggregate(r,c).toArray())).map(({_id:c,...i})=>({...typeof c=="object"&&c?c:{},...i}))}}}function le(t){let{runtime:e,collection:o,shape:n,diag:s,guarded:p,permits:w,projection:a,policy:T,withOf:l,composeWhere:m,timed:$}=t;return {async findCursor(g={}){let S=internal.clampPageSize(g.limit,e.defaultLimit,e.maxLimit),r=g.cursorKey??"id";T.checkFilter(g.filter),g.cursorKey!==void 0&&T.checkCursorKey(r);let R=g.order??"asc",c=g.direction??"forward",i=F(n,r);if(!i)throw new core.QueryKitError({source:s.source,site:"cursorKey",key:r,reason:"unknown-key"});let d=await internal.decodeCursorToken(g.cursor,{source:s.source,secret:e.cursorSecret,key:r}),f=d===void 0?void 0:_(n,i,d.k),h=d===void 0?void 0:_(n,"_id",d.id);if(f===b||h===b)throw new core.QueryKitError({source:s.source,site:"cursorKey",key:r,reason:"invalid-value"});let k=m(g.filter,g.withDeleted),P=c==="forward"?R==="asc":R==="desc",I=P?"$gt":"$lt",y=i!=="_id",x=d===void 0?void 0:y?{$or:[{[i]:{[I]:f}},{[i]:f,_id:{[I]:h}}]}:{[i]:{[I]:f}},E=x?Object.keys(k).length?{$and:[k,x]}:x:k,u=a(g.columns),D=u?{...u,[i]:1,_id:1}:void 0,O=C=>u!==void 0&&!!u[C],A=u===void 0?[]:[i,"_id"].filter(C=>p&&(!w(C)||!O(C))||C==="_id"&&C!==i&&!O(C));l(g.with);let L=y?{[i]:P?1:-1,_id:P?1:-1}:{[i]:P?1:-1},we=await $(C=>o.find(E,{...C,...D?{projection:D}:{},sort:L,limit:S+1}).toArray()),v=await internal.cursorPage(we,{limit:S,direction:c,hasCursor:d!==void 0,cursorField:i,idField:"_id",secret:e.cursorSecret});return A.length>0&&(v.data=v.data.map(C=>Object.fromEntries(Object.entries(C).filter(([Te])=>!A.includes(Te))))),v}}}var pe=1e3,Ve="\0";function me(t,e){let{runtime:o,collection:n,shape:s,hasDeletedAt:p,deletedAtPath:w,forUpdate:a,composeWhere:T,mutationWhere:l,withId:m,session:$,runFind:g}=t,S=i=>internal.clampPageSize(i.limit,o.defaultLimit,o.maxLimit),r=i=>({...internal.scopeDefaults(e.scope),...i,...internal.scopeDefaults(e.scope)}),R=(i,d)=>{let f=j(d.target),h=r(i),k={};for(let x of f){let E=F(s,x);if(!E)throw new Error(`upsert: unknown target field "${x}".`);k[E]=h[x];}let P=d.set?{...d.set}:Object.fromEntries(Object.entries(h).filter(([x])=>!f.includes(x))),I=Object.fromEntries(Object.entries(h).filter(([x])=>!f.includes(x)&&!(x in P))),y={};return Object.keys(P).length&&(y.$set=P),Object.keys(I).length&&(y.$setOnInsert=I),{filter:k,update:y}},c=async(i,d)=>await n.findOneAndUpdate(i,{$set:d},{returnDocument:"after",...$()})??void 0;return {async create(i){let d=r(i),{insertedId:f}=await n.insertOne(d,$());return {...d,_id:f}},async createMany(i){if(i.length===0)return [];let d=i.map(r),{insertedIds:f}=await n.insertMany(d,$());return d.map((h,k)=>({...h,_id:f[k]}))},async upsert(i,d){let{filter:f,update:h}=R(i,d);return await n.findOneAndUpdate(f,h,{returnDocument:"after",upsert:true,...$()})},async upsertMany(i,d){if(i.length===0)return [];let f=i.map(y=>R(y,d));for(let y=0;y<f.length;y+=pe){let x=f.slice(y,y+pe).map(E=>({updateOne:{filter:E.filter,update:E.update,upsert:true}}));await n.bulkWrite(x,$());}let h=await g({$or:f.map(y=>y.filter)},{}),k=j(d.target).map(y=>F(s,y)).filter(y=>!!y),P=y=>k.map(x=>String(y[x])).join(Ve),I=new Map(h.map(y=>[P(y),y]));return f.map(y=>I.get(P(y.filter))).filter(y=>!!y)},updateById(i,d,f="id"){return c(T(m(void 0,f,i)),a(d))},async updateWhere(i,d,f={}){let h=l(i,"updateWhere"),{matchedCount:k}=await n.updateMany(h,{$set:a(d)},$());if(!f.returning)return {count:k};let P=await g(h,{limit:S(f.returning)});return {count:k,rows:P}},async deleteById(i,d="id"){return await n.findOneAndDelete(T(m(void 0,d,i)),$())??void 0},async deleteWhere(i,d={}){let f=l(i,"deleteWhere"),h=d.returning?await g(f,{limit:S(d.returning)}):void 0,{deletedCount:k}=await n.deleteMany(f,$());return h?{count:k,rows:h}:{count:k}},async softDelete(i,d="id"){if(!p)throw new Error("softDelete: schema has no deletedAt field.");return c(T(m(void 0,d,i),false),a({[w]:new Date}))},async restore(i,d="id"){if(!p)throw new Error("restore: schema has no deletedAt field.");return c(T(m(void 0,d,i),true),a({[w]:null}))}}}var ye=Symbol.for("querykit.mongodb.explain");function De(t){let{runtime:e,collection:o,policy:n,sortSpec:s,listSortSpec:p,withOf:w,composeWhere:a,withId:T,runFind:l,countWhere:m,timed:$}=t,g=r=>{n.checkFilter(r.filter),n.checkSort(r.sort),w(r.with);},S=async(r,R)=>{let[c]=await l(a(R,r.withDeleted),{sort:s(r.sort),columns:r.columns,limit:1});return c};return {async findAll(r={}){return g(r),await l(a(r.filter,r.withDeleted),{sort:s(r.sort),columns:r.columns})},async findOne(r={}){return g(r),await S(r,r.filter)},async findById(r,R={}){let{idKey:c="id",filter:i}=R;return n.checkFilter(i),w(R.with),await S({...R,sort:void 0},T(i,c,r))},async findList(r={}){g(r);let R=internal.clampPage(r.page),c=internal.clampPageSize(r.perPage,e.defaultPerPage,e.maxPerPage);n.checkPage({page:R,perPage:c});let i=a(r.filter,r.withDeleted),d=k=>l(i,{sort:p(r.sort),columns:r.columns,limit:k,skip:(R-1)*c});if(r.withTotal===false)return internal.offsetPageWithoutTotal(await d(c+1),R,c);let[f,h]=await Promise.all([d(c),m(i)]);return {data:f,meta:internal.offsetMeta(R,c,h)}},async findInfinite(r={}){let R=internal.clampPageSize(r.limit,e.defaultLimit,e.maxLimit),c=internal.clampOffset(r.offset);g(r),n.checkPage({offset:c});let i=await l(a(r.filter,r.withDeleted),{sort:p(r.sort),columns:r.columns,limit:R+1,skip:c});return internal.infinitePage(i,R,c)},async count(r){return n.checkFilter(r),m(a(r))},async exists(r){return n.checkFilter(r),await m(a(r))>0},async[ye](r={}){g(r);let R=a(r.filter,r.withDeleted);return $(c=>o.find(R,{...c,sort:s(r.sort)}).explain("queryPlanner"))}}}function U(t,e,o){let n=de(t,e,o);return {collection:e,...De(n),...le(n),...me(n,o),...ue(n),scoped(p){return U(t,e,{...o,scope:{...o.scope,...p}})}}}var tt=2e3;function nt(t,e={}){let o=internal.createContextStore(),n={getSession:()=>o.get()?.session,defaultPerPage:e.defaultPerPage??core.DEFAULT_PER_PAGE,defaultLimit:e.defaultLimit??core.DEFAULT_LIMIT,maxPerPage:e.maxPerPage??core.DEFAULT_MAX_PER_PAGE,maxLimit:e.maxLimit??core.DEFAULT_MAX_LIMIT,strict:e.strict??false,onSkippedCondition:e.onSkippedCondition,limits:e.limits,cursorSecret:e.cursorSecret,timestamps:e.timestamps,maxTimeMS:e.maxTimeMS??tt};function s(w,a,T){let l=U(n,w,a);return T?{...l,...T(l)}:l}return {repository:s,transaction:async w=>o.get()?.session?w():t.withSession(async a=>{let T;return await a.withTransaction(async()=>{T=await o.run({session:a},w);}),T})}}function it(){return core.createFilters()}Object.defineProperty(exports,"f",{enumerable:true,get:function(){return core.f}});exports.buildRepository=U;exports.createFilters=it;exports.createRegistry=nt;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|