@querykitjs/mongoose 3.0.0 → 3.0.1
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 +9 -0
- package/README.md +9 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/skills/querykit-mongoose/SKILL.md +1 -0
package/README.en.md
CHANGED
|
@@ -294,6 +294,15 @@ const p2 = await usersRepository.findCursor({ limit: 20, cursor: p1.meta.next_cu
|
|
|
294
294
|
const back = await usersRepository.findCursor({ cursor: p2.meta.prev_cursor, direction: "backward" });
|
|
295
295
|
```
|
|
296
296
|
|
|
297
|
+
### A stable order across offset pages
|
|
298
|
+
|
|
299
|
+
`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.
|
|
300
|
+
|
|
301
|
+
- 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.
|
|
302
|
+
- `findAll` and `findOne` keep their order: they do not page.
|
|
303
|
+
- The order equals `findCursor`'s.
|
|
304
|
+
- ⚠️ **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.
|
|
305
|
+
|
|
297
306
|
### Cursor: ties and signing
|
|
298
307
|
|
|
299
308
|
- The seek key is `(cursorKey, _id)`: with a non-unique `cursorKey` (for example a shared `createdAt`) no row is skipped or repeated. When `cursorKey` is the primary key itself the seek uses that one field.
|
package/README.md
CHANGED
|
@@ -294,6 +294,15 @@ const p2 = await usersRepository.findCursor({ limit: 20, cursor: p1.meta.next_cu
|
|
|
294
294
|
const back = await usersRepository.findCursor({ cursor: p2.meta.prev_cursor, direction: "backward" });
|
|
295
295
|
```
|
|
296
296
|
|
|
297
|
+
### Offset sahifalarda barqaror tartib
|
|
298
|
+
|
|
299
|
+
`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.
|
|
300
|
+
|
|
301
|
+
- 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.
|
|
302
|
+
- `findAll` va `findOne` tartibi o'zgarmaydi: ular sahifalamaydi.
|
|
303
|
+
- Tartib `findCursor` tartibi bilan bir xil.
|
|
304
|
+
- ⚠️ **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.
|
|
305
|
+
|
|
297
306
|
### Cursor: teng qiymatlar va imzo
|
|
298
307
|
|
|
299
308
|
- Seek kaliti `(cursorKey, _id)`: `cursorKey` unikal bo'lmasa ham (masalan bir xil `createdAt`) hech bir qator tushib qolmaydi va takrorlanmaydi. `cursorKey` primary key'ning o'zi bo'lsa — bitta maydonli seek.
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var core=require('@querykitjs/core'),internal=require('@querykitjs/core/internal');function F(e,t){let o=t==="id"?"_id":t;return o==="_id"?"_id":e.schema.path(o)?o:void 0}function E(e,t){return !!e.schema.path(t)}function G(e,t,o,n=E(e,"createdAt")?"createdAt":void 0){let u={};for(let l of internal.normalizeSort(t,o)){let y=F(e,l.key);y?u[y]=l.direction==="desc"?-1:1:internal.reportSkip(o,{site:"sort",key:l.key,reason:"unknown-key"});}return Object.keys(u).length===0&&(n?u[n]=-1:u._id=-1),u}var H=new Set(core.TEXT_FILTER_OPERATORS),P=Symbol("querykit.invalid-value"),Y=e=>H.has(e);function J(e,t){return e.schema.path(t)?.instance==="Date"}function j(e,t,o){let n=e.schema.path(t);if(!n||o===null||o===void 0||!ke.has(n.instance))return o;if(o instanceof Date)return Number.isNaN(o.getTime())?P:o;try{let u=n.cast(o);if(u instanceof Date)return Number.isNaN(u.getTime())?P:u;if(u==null)return P;let l=n.enumValues;return n.instance==="String"&&l&&l.length>0&&!l.includes(u)?P:u}catch{return P}}var ke=new Set(["Date","Number","Boolean","ObjectId","String","Decimal128"]);function Z(e,t,o,n){if(n===void 0||H.has(o))return n;if(Array.isArray(n)){let l=[];for(let y of n){let d=j(e,t,y);if(d===P)return P;l.push(d);}return l}let u=j(e,t,n);return u===P?P:u}var Q=e=>String(e??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=e=>{let t="";for(let o of String(e??""))o==="%"?t.endsWith(".*")||(t+=".*"):o==="_"?t+=".":t+=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return `^${t}$`},ee=e=>Array.isArray(e)&&e.length===2?[e[0],e[1]]:void 0,te={"=":e=>({$eq:e}),eq:e=>({$eq:e}),"!=":e=>({$nin:[e,null]}),ne:e=>({$nin:[e,null]}),">":e=>({$gt:e}),gt:e=>({$gt:e}),">=":e=>({$gte:e}),gte:e=>({$gte:e}),"<":e=>({$lt:e}),lt:e=>({$lt:e}),"<=":e=>({$lte:e}),lte:e=>({$lte:e}),contains:e=>({$regex:Q(e),$options:"i"}),"%_%":e=>({$regex:Q(e),$options:"i"}),startsWith:e=>({$regex:`^${Q(e)}`,$options:"i"}),"%_":e=>({$regex:`^${Q(e)}`,$options:"i"}),endsWith:e=>({$regex:`${Q(e)}$`,$options:"i"}),"_%":e=>({$regex:`${Q(e)}$`,$options:"i"}),like:e=>({$regex:v(e)}),ilike:e=>({$regex:v(e),$options:"i"}),notLike:e=>({$not:{$regex:v(e)},$ne:null}),in:e=>Array.isArray(e)?{$in:e}:void 0,notIn:e=>Array.isArray(e)?{$nin:[...e,null]}:void 0,between:e=>{let t=ee(e);return t?{$gte:t[0],$lte:t[1]}:void 0},notBetween:e=>{let t=ee(e);return t?{$not:{$gte:t[0],$lte:t[1]},$ne:null}:void 0},isNull:()=>({$eq:null}),isNotNull:()=>({$ne:null})};var B=e=>typeof e=="object"&&e!==null,ne=e=>B(e)&&"key"in e&&!("and"in e)&&!("or"in e)&&!("not"in e);function _(e,t){let o=t.filter(n=>n!==void 0);if(o.length!==0)return o.length===1?o[0]:{[e]:o}}function oe(e,t,o){let n=t.operation??"=",u=te[n];if(!u)throw new Error(`Unsupported filter operator: "${n}"`);let l=F(e,t.key);if(!l){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"unknown-key"});return}if(Y(n)&&J(e,l)){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let y=Z(e,l,n,t.value);if(y===P){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let d=u(y);if(d===void 0){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}return {[l]:d}}function I(e,t,o){if(ne(t))return oe(e,t,o);if(B(t)){if("and"in t)return _("$and",t.and.map(n=>I(e,n,o)));if("or"in t)return _("$or",t.or.map(n=>I(e,n,o)));if("not"in t)return U(e,t.not,o);if(internal.isRaw(t))return t;throw new core.QueryKitError({source:e.modelName,site:"filter",key:Object.keys(t)[0]??"",reason:"forbidden-key"})}}function U(e,t,o){if(ne(t)){let u=oe(e,t,o);if(!u)return;let l=t.operation??"=",y=l==="isNull"||l==="isNotNull"?void 0:F(e,t.key);return y?{$and:[{[y]:{$ne:null}},{$nor:[u]}]}:{$nor:[u]}}if(B(t)){if("and"in t)return _("$or",t.and.map(u=>U(e,u,o)));if("or"in t)return _("$and",t.or.map(u=>U(e,u,o)));if("not"in t)return I(e,t.not,o)}let n=I(e,t,o);return n?{$nor:[n]}:void 0}function N(e,t,o){if(t!==void 0)return Array.isArray(t)?_("$and",t.map(n=>I(e,n,o))):I(e,t,o)}var re=e=>Object.entries(e).filter(([,t])=>t).map(([t])=>t);function ie(e,t){let o=t.forcedColumns?re(t.forcedColumns):void 0;if(t.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=t.allowedColumns?new Set(t.allowedColumns):void 0;if(t.allowedColumns&&n.size===0)throw new Error("buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full document).");let u=d=>o?o.includes(d):n?n.has(d):true,l=d=>{let R=d.filter(A=>n.has(A));return R.length>0?R:[...n]};return {guarded:!!(o??n),permits:u,projection:d=>{let R=d?re(d):[],A=o??(n?l(R):R);if(A.length===0)return;let a={},T=false;for(let w of A){let b=F(e,w);b&&(a[b]=1,b==="_id"&&(T=true));}if(Object.keys(a).length!==0)return T||(a._id=0),a}}}function ue(e,t,o){let n=t,u=F(n,e.timestamps?.deletedAt??"deletedAt")??"deletedAt",l=E(n,u),y=e.timestamps?.createdAt!==void 0,d=F(n,e.timestamps?.createdAt??"createdAt"),R=!!n.schema.options?.timestamps,A=E(n,"updatedAt")&&!R,a=m=>A?{...m,updatedAt:new Date}:m,T=Qe(n,o),w={source:n.modelName,strict:e.strict,onSkipped:e.onSkippedCondition},b=m=>G(n,m,w,d),r=m=>internal.checkWith(m,o.relations,Ce,w.source),i=(m,x)=>{let D=[m,T,l&&!x?{[u]:{$eq:null}}:void 0].filter(C=>C!==void 0);return D.length===0?{}:D.length===1?D[0]:{$and:D}},s=(m,x)=>i(N(n,m,w),x),c=(m,x,D)=>{let C={key:x,operation:"=",value:D};return m?Array.isArray(m)?[...m,C]:{and:[m,C]}:[C]},g=ie(n,o),p=o.maxTimeMS??e.maxTimeMS,h=m=>{let x=e.getSession();return x&&m.session(x),Ie.has(m.op??"")&&Ee(m,n.modelName,p),m},S=(m,x)=>{let D=n.find(m,g.projection(x.columns));return x.sort&&(D=D.sort(x.sort)),typeof x.skip=="number"&&(D=D.skip(x.skip)),typeof x.limit=="number"&&(D=D.limit(x.limit)),D=ce(D,x.with),h(D).lean().exec()},f=m=>h(n.countDocuments(m)).exec(),k=internal.resolvePolicy({source:n.modelName,fieldOf:m=>F(n,m),primaryKey:"_id",createdAt:y?d:d??F(n,"created_at"),filterable:o.filterable,sortable:o.sortable,allowedColumns:o.allowedColumns,forcedColumns:o.forcedColumns,limits:{...e.limits,...o.limits}});return {...g,policy:k,maxTimeMS:p,runtime:e,m:n,diag:w,hasDeletedAt:l,deletedAtPath:u,forUpdate:a,sortSpec:b,withOf:r,composeWhere:s,mutationWhere:(m,x)=>{if(internal.isAllRows(m))return i(void 0);internal.isEmptyFilter(m)&&internal.refuseEmptyFilter(w.source,x),k.checkFilter(m);let D=N(n,m,w);return D===void 0?internal.refuseEmptyFilter(w.source,x):i(D)},withId:c,applyPopulate:ce,attachSession:h,runFind:S,countWhere:f}}var Ce={columns:"select",nested:"populate",filters:["match"],logical:["$and","$or","$nor"],paging:["limit","skip"],options:"options"};function ce(e,t){if(t)for(let o of Object.keys(t)){let n=t[o];n&&e.populate(typeof n=="object"?{path:o,...n}:o);}return e}var M=e=>e===void 0?[]:Array.isArray(e)?e:[e];function Qe(e,t){let o=internal.scopeConditions(t.scope);for(let n of o)if(!F(e,n.key))throw new core.QueryKitError({source:e.modelName,site:"filter",key:n.key,reason:"unknown-key"});return o.length?N(e,o):void 0}var Ie=new Set(["find","findOne","countDocuments","distinct"]),q=e=>typeof e=="object"&&e!==null&&(e.codeName==="MaxTimeMSExpired"||e.code===50);function Ee(e,t,o){e.maxTimeMS(o);let n=e.exec.bind(e);e.exec=(async(...u)=>{try{return await n(...u)}catch(l){throw q(l)?new core.QueryKitTimeoutError(t,o,{cause:l}):l}});}function ae(e){let{runtime:t,m:o,diag:n,permits:u,policy:l,maxTimeMS:y,composeWhere:d}=e,R=a=>{let T=u(a)?F(o,a):void 0;return T||internal.reportSkip(n,{site:"aggregate",key:a,reason:"unknown-key"}),T},A=a=>{try{let T=o.find(a);return T.cast(o),T.getFilter()}catch{return a}};return {async aggregate(a){l.checkFilter(a.filter);for(let p of [a.groupBy,a.sum,a.avg,a.min,a.max].flatMap(h=>h===void 0?[]:Array.isArray(h)?h:[h]))l.checkAggregateKey(p);let T=M(a.groupBy).filter(p=>!!R(p)),w=A(d(a.filter,a.withDeleted)),r={_id:T.length?Object.fromEntries(T.map(p=>[p,`$${R(p)??p}`])):null};a.count&&(r.count={$sum:1});let i=(p,h,S)=>{for(let f of h){let k=R(f);k&&(r[`${S}_${f}`]={[p]:`$${k}`});}};i("$sum",M(a.sum),"sum"),i("$avg",M(a.avg),"avg"),i("$min",M(a.min),"min"),i("$max",M(a.max),"max");let s=o.aggregate([{$match:w},{$group:r}]),c=t.getSession();c&&(s=s.session(c)),s=s.option({maxTimeMS:y});let g;try{g=await s.exec();}catch(p){throw q(p)?new core.QueryKitTimeoutError(o.modelName,y,{cause:p}):p}return g.map(({_id:p,...h})=>({...typeof p=="object"&&p?p:{},...h}))}}}function le(e){let{runtime:t,m:o,diag:n,guarded:u,permits:l,projection:y,policy:d,withOf:R,composeWhere:A,applyPopulate:a,attachSession:T}=e;return {async findCursor(w={}){let b=internal.clampPageSize(w.limit,t.defaultLimit,t.maxLimit),r=w.cursorKey??"id";d.checkFilter(w.filter),w.cursorKey!==void 0&&d.checkCursorKey(r);let i=w.order??"asc",s=w.direction??"forward",c=F(o,r);if(!c)throw new core.QueryKitError({source:n.source,site:"cursorKey",key:r,reason:"unknown-key"});let g=await internal.decodeCursorToken(w.cursor,{source:n.source,secret:t.cursorSecret,key:r}),p=g===void 0?void 0:j(o,c,g.k),h=g===void 0?void 0:j(o,"_id",g.id);if(p===P||h===P)throw new core.QueryKitError({source:n.source,site:"cursorKey",key:r,reason:"invalid-value"});let S=A(w.filter,w.withDeleted),f=s==="forward"?i==="asc":i==="desc",k=f?"$gt":"$lt",$=c!=="_id",m=g===void 0?void 0:$?{$or:[{[c]:{[k]:p}},{[c]:p,_id:{[k]:h}}]}:{[c]:{[k]:p}},x=m?Object.keys(S).length?{$and:[S,m]}:m:S,D=y(w.columns),C=D?{...D,[c]:1,_id:1}:void 0,z=O=>D!==void 0&&!!D[O],X=D===void 0?[]:[c,"_id"].filter(O=>u&&(!l(O)||!z(O))||O==="_id"&&O!==c&&!z(O)),K=o.find(x,C).sort($?{[c]:f?1:-1,_id:f?1:-1}:{[c]:f?1:-1}).limit(b+1);K=a(K,R(w.with));let we=await T(K).lean().exec(),V=await internal.cursorPage(we,{limit:b,direction:s,hasCursor:g!==void 0,cursorField:c,idField:"_id",secret:t.cursorSecret});return X.length>0&&(V.data=V.data.map(O=>Object.fromEntries(Object.entries(O).filter(([he])=>!X.includes(he))))),V}}}var fe=1e3,Ve="\0";function me(e,t){let{runtime:o,m:n,hasDeletedAt:u,deletedAtPath:l,forUpdate:y,composeWhere:d,mutationWhere:R,withId:A,attachSession:a}=e,T=i=>internal.clampPageSize(i.limit,o.defaultLimit,o.maxLimit),w=i=>({...internal.scopeDefaults(t.scope),...i,...internal.scopeDefaults(t.scope)}),b=(i,s)=>{let c=M(s.target),g=w(i),p={};for(let k of c){let $=F(n,k);if(!$)throw new Error(`upsert: unknown target field "${k}".`);p[$]=g[k];}let h=s.set?{...s.set}:Object.fromEntries(Object.entries(g).filter(([k])=>!c.includes(k))),S=Object.fromEntries(Object.entries(g).filter(([k])=>!c.includes(k)&&!(k in h))),f={};return Object.keys(h).length&&(f.$set=h),Object.keys(S).length&&(f.$setOnInsert=S),{filter:p,update:f}},r=async(i,s)=>{let c=n.findOneAndUpdate(i,s,{returnDocument:"after"});return await a(c).lean().exec()??void 0};return {async create(i){let[s]=await n.create([w(i)],{session:o.getSession()});return s.toObject()},async createMany(i){return i.length===0?[]:(await n.insertMany(i.map(w),{session:o.getSession()})).map(c=>c.toObject())},async upsert(i,s){let{filter:c,update:g}=b(i,s),p=n.findOneAndUpdate(c,g,{returnDocument:"after",upsert:true});return await a(p).lean().exec()},async upsertMany(i,s){if(i.length===0)return [];let c=i.map(f=>b(f,s));for(let f=0;f<c.length;f+=fe){let k=c.slice(f,f+fe).map($=>({updateOne:{filter:$.filter,update:$.update,upsert:true}}));await n.bulkWrite(k,{session:o.getSession()});}let g=await a(n.find({$or:c.map(f=>f.filter)})).lean().exec(),p=M(s.target).map(f=>F(n,f)).filter(f=>!!f),h=f=>p.map(k=>String(f[k])).join(Ve),S=new Map(g.map(f=>[h(f),f]));return c.map(f=>S.get(h(f.filter))).filter(f=>!!f)},updateById(i,s,c="id"){return r(d(A(void 0,c,i)),y(s))},async updateWhere(i,s,c={}){let g=R(i,"updateWhere"),{matchedCount:p}=await a(n.updateMany(g,y(s))).exec();if(!c.returning)return {count:p};let h=await a(n.find(g).limit(T(c.returning))).lean().exec();return {count:p,rows:h}},async deleteById(i,s="id"){let c=d(A(void 0,s,i));return await a(n.findOneAndDelete(c)).lean().exec()??void 0},async deleteWhere(i,s={}){let c=R(i,"deleteWhere"),g=s.returning?await a(n.find(c).limit(T(s.returning))).lean().exec():void 0,{deletedCount:p}=await a(n.deleteMany(c)).exec();return g?{count:p,rows:g}:{count:p}},async softDelete(i,s="id"){if(!u)throw new Error("softDelete: schema has no deletedAt path.");return r(d(A(void 0,s,i),false),y({[l]:new Date}))},async restore(i,s="id"){if(!u)throw new Error("restore: schema has no deletedAt path.");return r(d(A(void 0,s,i),true),y({[l]:null}))}}}function ge(e){let{runtime:t,m:o,policy:n,projection:u,sortSpec:l,withOf:y,composeWhere:d,withId:R,applyPopulate:A,attachSession:a,runFind:T,countWhere:w}=e,b=r=>{n.checkFilter(r.filter),n.checkSort(r.sort);};return {async findAll(r={}){return b(r),await T(d(r.filter,r.withDeleted),{sort:l(r.sort),columns:r.columns,with:y(r.with)})},async findOne(r={}){b(r);let i=o.findOne(d(r.filter,r.withDeleted),u(r.columns));return i=i.sort(l(r.sort)),i=A(i,y(r.with)),await a(i).lean().exec()??void 0},async findById(r,i={}){let{idKey:s="id",filter:c,columns:g,with:p}=i;n.checkFilter(c);let h=o.findOne(d(R(c,s,r),i.withDeleted),u(g));return h=A(h,p),await a(h).lean().exec()??void 0},async findList(r={}){b(r);let i=internal.clampPage(r.page),s=internal.clampPageSize(r.perPage,t.defaultPerPage,t.maxPerPage);n.checkPage({page:i,perPage:s});let c=d(r.filter,r.withDeleted),g=S=>T(c,{sort:l(r.sort),columns:r.columns,with:y(r.with),limit:S,skip:(i-1)*s});if(r.withTotal===false)return internal.offsetPageWithoutTotal(await g(s+1),i,s);let[p,h]=await Promise.all([g(s),w(c)]);return {data:p,meta:internal.offsetMeta(i,s,h)}},async findInfinite(r={}){let i=internal.clampPageSize(r.limit,t.defaultLimit,t.maxLimit),s=internal.clampOffset(r.offset);b(r),n.checkPage({offset:s});let c=await T(d(r.filter,r.withDeleted),{sort:l(r.sort),columns:r.columns,with:y(r.with),limit:i+1,skip:s});return internal.infinitePage(c,i,s)},async count(r){return n.checkFilter(r),w(d(r))},async exists(r){return n.checkFilter(r),await w(d(r))>0}}}function W(e,t,o={}){let n=ue(e,t,o);return {model:t,...ge(n),...le(n),...me(n,o),...ae(n),scoped(l){return W(e,t,{...o,scope:{...o.scope,...l}})}}}var Ze=2e3;function et(e,t={}){let o=internal.createContextStore(),n={getSession:()=>o.get()?.session,defaultPerPage:t.defaultPerPage??core.DEFAULT_PER_PAGE,defaultLimit:t.defaultLimit??core.DEFAULT_LIMIT,maxPerPage:t.maxPerPage??core.DEFAULT_MAX_PER_PAGE,maxLimit:t.maxLimit??core.DEFAULT_MAX_LIMIT,strict:t.strict??false,onSkippedCondition:t.onSkippedCondition,limits:t.limits,cursorSecret:t.cursorSecret,timestamps:t.timestamps,maxTimeMS:t.maxTimeMS??Ze};function u(y,d,R){let A=typeof d=="function"?void 0:d,a=typeof d=="function"?d:R,T=W(n,y,A);return a?{...T,...a(T)}:T}return {repository:u,transaction:async y=>{if(o.get()?.session)return y();let d=await e.startSession();try{let R;return await d.withTransaction(async()=>{R=await o.run({session:d},y);}),R}finally{await d.endSession();}}}}function ot(){return core.createFilters()}Object.defineProperty(exports,"f",{enumerable:true,get:function(){return core.f}});exports.buildRepository=W;exports.createFilters=ot;exports.createRegistry=et;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var core=require('@querykitjs/core'),internal=require('@querykitjs/core/internal');function S(e,t){let o=t==="id"?"_id":t;return o==="_id"?"_id":e.schema.path(o)?o:void 0}function E(e,t){return !!e.schema.path(t)}function U(e,t,o,n=E(e,"createdAt")?"createdAt":void 0){let c={};for(let l of internal.normalizeSort(t,o)){let g=S(e,l.key);g?c[g]=l.direction==="desc"?-1:1:internal.reportSkip(o,{site:"sort",key:l.key,reason:"unknown-key"});}return Object.keys(c).length===0&&(n?c[n]=-1:c._id=-1),c}function H(e,t,o,n){let c=U(e,t,o,n);return "_id"in c?c:{...c,_id:Object.values(c)[0]}}var Y=new Set(core.TEXT_FILTER_OPERATORS),P=Symbol("querykit.invalid-value"),J=e=>Y.has(e);function Z(e,t){return e.schema.path(t)?.instance==="Date"}function j(e,t,o){let n=e.schema.path(t);if(!n||o===null||o===void 0||!xe.has(n.instance))return o;if(o instanceof Date)return Number.isNaN(o.getTime())?P:o;try{let c=n.cast(o);if(c instanceof Date)return Number.isNaN(c.getTime())?P:c;if(c==null)return P;let l=n.enumValues;return n.instance==="String"&&l&&l.length>0&&!l.includes(c)?P:c}catch{return P}}var xe=new Set(["Date","Number","Boolean","ObjectId","String","Decimal128"]);function ee(e,t,o,n){if(n===void 0||Y.has(o))return n;if(Array.isArray(n)){let l=[];for(let g of n){let d=j(e,t,g);if(d===P)return P;l.push(d);}return l}let c=j(e,t,n);return c===P?P:c}var Q=e=>String(e??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),B=e=>{let t="";for(let o of String(e??""))o==="%"?t.endsWith(".*")||(t+=".*"):o==="_"?t+=".":t+=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return `^${t}$`},te=e=>Array.isArray(e)&&e.length===2?[e[0],e[1]]:void 0,ne={"=":e=>({$eq:e}),eq:e=>({$eq:e}),"!=":e=>({$nin:[e,null]}),ne:e=>({$nin:[e,null]}),">":e=>({$gt:e}),gt:e=>({$gt:e}),">=":e=>({$gte:e}),gte:e=>({$gte:e}),"<":e=>({$lt:e}),lt:e=>({$lt:e}),"<=":e=>({$lte:e}),lte:e=>({$lte:e}),contains:e=>({$regex:Q(e),$options:"i"}),"%_%":e=>({$regex:Q(e),$options:"i"}),startsWith:e=>({$regex:`^${Q(e)}`,$options:"i"}),"%_":e=>({$regex:`^${Q(e)}`,$options:"i"}),endsWith:e=>({$regex:`${Q(e)}$`,$options:"i"}),"_%":e=>({$regex:`${Q(e)}$`,$options:"i"}),like:e=>({$regex:B(e)}),ilike:e=>({$regex:B(e),$options:"i"}),notLike:e=>({$not:{$regex:B(e)},$ne:null}),in:e=>Array.isArray(e)?{$in:e}:void 0,notIn:e=>Array.isArray(e)?{$nin:[...e,null]}:void 0,between:e=>{let t=te(e);return t?{$gte:t[0],$lte:t[1]}:void 0},notBetween:e=>{let t=te(e);return t?{$not:{$gte:t[0],$lte:t[1]},$ne:null}:void 0},isNull:()=>({$eq:null}),isNotNull:()=>({$ne:null})};var z=e=>typeof e=="object"&&e!==null,oe=e=>z(e)&&"key"in e&&!("and"in e)&&!("or"in e)&&!("not"in e);function _(e,t){let o=t.filter(n=>n!==void 0);if(o.length!==0)return o.length===1?o[0]:{[e]:o}}function re(e,t,o){let n=t.operation??"=",c=ne[n];if(!c)throw new Error(`Unsupported filter operator: "${n}"`);let l=S(e,t.key);if(!l){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"unknown-key"});return}if(J(n)&&Z(e,l)){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let g=ee(e,l,n,t.value);if(g===P){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let d=c(g);if(d===void 0){internal.reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}return {[l]:d}}function I(e,t,o){if(oe(t))return re(e,t,o);if(z(t)){if("and"in t)return _("$and",t.and.map(n=>I(e,n,o)));if("or"in t)return _("$or",t.or.map(n=>I(e,n,o)));if("not"in t)return q(e,t.not,o);if(internal.isRaw(t))return t;throw new core.QueryKitError({source:e.modelName,site:"filter",key:Object.keys(t)[0]??"",reason:"forbidden-key"})}}function q(e,t,o){if(oe(t)){let c=re(e,t,o);if(!c)return;let l=t.operation??"=",g=l==="isNull"||l==="isNotNull"?void 0:S(e,t.key);return g?{$and:[{[g]:{$ne:null}},{$nor:[c]}]}:{$nor:[c]}}if(z(t)){if("and"in t)return _("$or",t.and.map(c=>q(e,c,o)));if("or"in t)return _("$and",t.or.map(c=>q(e,c,o)));if("not"in t)return I(e,t.not,o)}let n=I(e,t,o);return n?{$nor:[n]}:void 0}function W(e,t,o){if(t!==void 0)return Array.isArray(t)?_("$and",t.map(n=>I(e,n,o))):I(e,t,o)}var ie=e=>Object.entries(e).filter(([,t])=>t).map(([t])=>t);function se(e,t){let o=t.forcedColumns?ie(t.forcedColumns):void 0;if(t.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=t.allowedColumns?new Set(t.allowedColumns):void 0;if(t.allowedColumns&&n.size===0)throw new Error("buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full document).");let c=d=>o?o.includes(d):n?n.has(d):true,l=d=>{let w=d.filter(F=>n.has(F));return w.length>0?w:[...n]};return {guarded:!!(o??n),permits:c,projection:d=>{let w=d?ie(d):[],F=o??(n?l(w):w);if(F.length===0)return;let u={},D=false;for(let y of F){let b=S(e,y);b&&(u[b]=1,b==="_id"&&(D=true));}if(Object.keys(u).length!==0)return D||(u._id=0),u}}}function ae(e,t,o){let n=t,c=S(n,e.timestamps?.deletedAt??"deletedAt")??"deletedAt",l=E(n,c),g=e.timestamps?.createdAt!==void 0,d=S(n,e.timestamps?.createdAt??"createdAt"),w=!!n.schema.options?.timestamps,F=E(n,"updatedAt")&&!w,u=m=>F?{...m,updatedAt:new Date}:m,D=Ie(n,o),y={source:n.modelName,strict:e.strict,onSkipped:e.onSkippedCondition},b=m=>U(n,m,y,d),x=m=>H(n,m,y,d),r=m=>internal.checkWith(m,o.relations,Qe,y.source),i=(m,T)=>{let k=[m,D,l&&!T?{[c]:{$eq:null}}:void 0].filter(C=>C!==void 0);return k.length===0?{}:k.length===1?k[0]:{$and:k}},s=(m,T)=>i(W(n,m,y),T),f=(m,T,k)=>{let C={key:T,operation:"=",value:k};return m?Array.isArray(m)?[...m,C]:{and:[m,C]}:[C]},a=se(n,o),h=o.maxTimeMS??e.maxTimeMS,A=m=>{let T=e.getSession();return T&&m.session(T),Ee.has(m.op??"")&&je(m,n.modelName,h),m},p=(m,T)=>{let k=n.find(m,a.projection(T.columns));return T.sort&&(k=k.sort(T.sort)),typeof T.skip=="number"&&(k=k.skip(T.skip)),typeof T.limit=="number"&&(k=k.limit(T.limit)),k=ue(k,T.with),A(k).lean().exec()},R=m=>A(n.countDocuments(m)).exec(),$=internal.resolvePolicy({source:n.modelName,fieldOf:m=>S(n,m),primaryKey:"_id",createdAt:g?d:d??S(n,"created_at"),filterable:o.filterable,sortable:o.sortable,allowedColumns:o.allowedColumns,forcedColumns:o.forcedColumns,limits:{...e.limits,...o.limits}});return {...a,policy:$,maxTimeMS:h,runtime:e,m:n,diag:y,hasDeletedAt:l,deletedAtPath:c,forUpdate:u,sortSpec:b,listSortSpec:x,withOf:r,composeWhere:s,mutationWhere:(m,T)=>{if(internal.isAllRows(m))return i(void 0);internal.isEmptyFilter(m)&&internal.refuseEmptyFilter(y.source,T),$.checkFilter(m);let k=W(n,m,y);return k===void 0?internal.refuseEmptyFilter(y.source,T):i(k)},withId:f,applyPopulate:ue,attachSession:A,runFind:p,countWhere:R}}var Qe={columns:"select",nested:"populate",filters:["match"],logical:["$and","$or","$nor"],paging:["limit","skip"],options:"options"};function ue(e,t){if(t)for(let o of Object.keys(t)){let n=t[o];n&&e.populate(typeof n=="object"?{path:o,...n}:o);}return e}var M=e=>e===void 0?[]:Array.isArray(e)?e:[e];function Ie(e,t){let o=internal.scopeConditions(t.scope);for(let n of o)if(!S(e,n.key))throw new core.QueryKitError({source:e.modelName,site:"filter",key:n.key,reason:"unknown-key"});return o.length?W(e,o):void 0}var Ee=new Set(["find","findOne","countDocuments","distinct"]),X=e=>typeof e=="object"&&e!==null&&(e.codeName==="MaxTimeMSExpired"||e.code===50);function je(e,t,o){e.maxTimeMS(o);let n=e.exec.bind(e);e.exec=(async(...c)=>{try{return await n(...c)}catch(l){throw X(l)?new core.QueryKitTimeoutError(t,o,{cause:l}):l}});}function de(e){let{runtime:t,m:o,diag:n,permits:c,policy:l,maxTimeMS:g,composeWhere:d}=e,w=u=>{let D=c(u)?S(o,u):void 0;return D||internal.reportSkip(n,{site:"aggregate",key:u,reason:"unknown-key"}),D},F=u=>{try{let D=o.find(u);return D.cast(o),D.getFilter()}catch{return u}};return {async aggregate(u){l.checkFilter(u.filter);for(let a of [u.groupBy,u.sum,u.avg,u.min,u.max].flatMap(h=>h===void 0?[]:Array.isArray(h)?h:[h]))l.checkAggregateKey(a);let D=M(u.groupBy).filter(a=>!!w(a)),y=F(d(u.filter,u.withDeleted)),x={_id:D.length?Object.fromEntries(D.map(a=>[a,`$${w(a)??a}`])):null};u.count&&(x.count={$sum:1});let r=(a,h,A)=>{for(let p of h){let R=w(p);R&&(x[`${A}_${p}`]={[a]:`$${R}`});}};r("$sum",M(u.sum),"sum"),r("$avg",M(u.avg),"avg"),r("$min",M(u.min),"min"),r("$max",M(u.max),"max");let i=o.aggregate([{$match:y},{$group:x}]),s=t.getSession();s&&(i=i.session(s)),i=i.option({maxTimeMS:g});let f;try{f=await i.exec();}catch(a){throw X(a)?new core.QueryKitTimeoutError(o.modelName,g,{cause:a}):a}return f.map(({_id:a,...h})=>({...typeof a=="object"&&a?a:{},...h}))}}}function pe(e){let{runtime:t,m:o,diag:n,guarded:c,permits:l,projection:g,policy:d,withOf:w,composeWhere:F,applyPopulate:u,attachSession:D}=e;return {async findCursor(y={}){let b=internal.clampPageSize(y.limit,t.defaultLimit,t.maxLimit),x=y.cursorKey??"id";d.checkFilter(y.filter),y.cursorKey!==void 0&&d.checkCursorKey(x);let r=y.order??"asc",i=y.direction??"forward",s=S(o,x);if(!s)throw new core.QueryKitError({source:n.source,site:"cursorKey",key:x,reason:"unknown-key"});let f=await internal.decodeCursorToken(y.cursor,{source:n.source,secret:t.cursorSecret,key:x}),a=f===void 0?void 0:j(o,s,f.k),h=f===void 0?void 0:j(o,"_id",f.id);if(a===P||h===P)throw new core.QueryKitError({source:n.source,site:"cursorKey",key:x,reason:"invalid-value"});let A=F(y.filter,y.withDeleted),p=i==="forward"?r==="asc":r==="desc",R=p?"$gt":"$lt",$=s!=="_id",L=f===void 0?void 0:$?{$or:[{[s]:{[R]:a}},{[s]:a,_id:{[R]:h}}]}:{[s]:{[R]:a}},m=L?Object.keys(A).length?{$and:[A,L]}:L:A,T=g(y.columns),k=T?{...T,[s]:1,_id:1}:void 0,C=O=>T!==void 0&&!!T[O],G=T===void 0?[]:[s,"_id"].filter(O=>c&&(!l(O)||!C(O))||O==="_id"&&O!==s&&!C(O)),v=o.find(m,k).sort($?{[s]:p?1:-1,_id:p?1:-1}:{[s]:p?1:-1}).limit(b+1);v=u(v,w(y.with));let he=await D(v).lean().exec(),V=await internal.cursorPage(he,{limit:b,direction:i,hasCursor:f!==void 0,cursorField:s,idField:"_id",secret:t.cursorSecret});return G.length>0&&(V.data=V.data.map(O=>Object.fromEntries(Object.entries(O).filter(([Te])=>!G.includes(Te))))),V}}}var me=1e3,Ve="\0";function ye(e,t){let{runtime:o,m:n,hasDeletedAt:c,deletedAtPath:l,forUpdate:g,composeWhere:d,mutationWhere:w,withId:F,attachSession:u}=e,D=r=>internal.clampPageSize(r.limit,o.defaultLimit,o.maxLimit),y=r=>({...internal.scopeDefaults(t.scope),...r,...internal.scopeDefaults(t.scope)}),b=(r,i)=>{let s=M(i.target),f=y(r),a={};for(let R of s){let $=S(n,R);if(!$)throw new Error(`upsert: unknown target field "${R}".`);a[$]=f[R];}let h=i.set?{...i.set}:Object.fromEntries(Object.entries(f).filter(([R])=>!s.includes(R))),A=Object.fromEntries(Object.entries(f).filter(([R])=>!s.includes(R)&&!(R in h))),p={};return Object.keys(h).length&&(p.$set=h),Object.keys(A).length&&(p.$setOnInsert=A),{filter:a,update:p}},x=async(r,i)=>{let s=n.findOneAndUpdate(r,i,{returnDocument:"after"});return await u(s).lean().exec()??void 0};return {async create(r){let[i]=await n.create([y(r)],{session:o.getSession()});return i.toObject()},async createMany(r){return r.length===0?[]:(await n.insertMany(r.map(y),{session:o.getSession()})).map(s=>s.toObject())},async upsert(r,i){let{filter:s,update:f}=b(r,i),a=n.findOneAndUpdate(s,f,{returnDocument:"after",upsert:true});return await u(a).lean().exec()},async upsertMany(r,i){if(r.length===0)return [];let s=r.map(p=>b(p,i));for(let p=0;p<s.length;p+=me){let R=s.slice(p,p+me).map($=>({updateOne:{filter:$.filter,update:$.update,upsert:true}}));await n.bulkWrite(R,{session:o.getSession()});}let f=await u(n.find({$or:s.map(p=>p.filter)})).lean().exec(),a=M(i.target).map(p=>S(n,p)).filter(p=>!!p),h=p=>a.map(R=>String(p[R])).join(Ve),A=new Map(f.map(p=>[h(p),p]));return s.map(p=>A.get(h(p.filter))).filter(p=>!!p)},updateById(r,i,s="id"){return x(d(F(void 0,s,r)),g(i))},async updateWhere(r,i,s={}){let f=w(r,"updateWhere"),{matchedCount:a}=await u(n.updateMany(f,g(i))).exec();if(!s.returning)return {count:a};let h=await u(n.find(f).limit(D(s.returning))).lean().exec();return {count:a,rows:h}},async deleteById(r,i="id"){let s=d(F(void 0,i,r));return await u(n.findOneAndDelete(s)).lean().exec()??void 0},async deleteWhere(r,i={}){let s=w(r,"deleteWhere"),f=i.returning?await u(n.find(s).limit(D(i.returning))).lean().exec():void 0,{deletedCount:a}=await u(n.deleteMany(s)).exec();return f?{count:a,rows:f}:{count:a}},async softDelete(r,i="id"){if(!c)throw new Error("softDelete: schema has no deletedAt path.");return x(d(F(void 0,i,r),false),g({[l]:new Date}))},async restore(r,i="id"){if(!c)throw new Error("restore: schema has no deletedAt path.");return x(d(F(void 0,i,r),true),g({[l]:null}))}}}function we(e){let{runtime:t,m:o,policy:n,projection:c,sortSpec:l,listSortSpec:g,withOf:d,composeWhere:w,withId:F,applyPopulate:u,attachSession:D,runFind:y,countWhere:b}=e,x=r=>{n.checkFilter(r.filter),n.checkSort(r.sort);};return {async findAll(r={}){return x(r),await y(w(r.filter,r.withDeleted),{sort:l(r.sort),columns:r.columns,with:d(r.with)})},async findOne(r={}){x(r);let i=o.findOne(w(r.filter,r.withDeleted),c(r.columns));return i=i.sort(l(r.sort)),i=u(i,d(r.with)),await D(i).lean().exec()??void 0},async findById(r,i={}){let{idKey:s="id",filter:f,columns:a,with:h}=i;n.checkFilter(f);let A=o.findOne(w(F(f,s,r),i.withDeleted),c(a));return A=u(A,h),await D(A).lean().exec()??void 0},async findList(r={}){x(r);let i=internal.clampPage(r.page),s=internal.clampPageSize(r.perPage,t.defaultPerPage,t.maxPerPage);n.checkPage({page:i,perPage:s});let f=w(r.filter,r.withDeleted),a=p=>y(f,{sort:g(r.sort),columns:r.columns,with:d(r.with),limit:p,skip:(i-1)*s});if(r.withTotal===false)return internal.offsetPageWithoutTotal(await a(s+1),i,s);let[h,A]=await Promise.all([a(s),b(f)]);return {data:h,meta:internal.offsetMeta(i,s,A)}},async findInfinite(r={}){let i=internal.clampPageSize(r.limit,t.defaultLimit,t.maxLimit),s=internal.clampOffset(r.offset);x(r),n.checkPage({offset:s});let f=await y(w(r.filter,r.withDeleted),{sort:g(r.sort),columns:r.columns,with:d(r.with),limit:i+1,skip:s});return internal.infinitePage(f,i,s)},async count(r){return n.checkFilter(r),b(w(r))},async exists(r){return n.checkFilter(r),await b(w(r))>0}}}function K(e,t,o={}){let n=ae(e,t,o);return {model:t,...we(n),...pe(n),...ye(n,o),...de(n),scoped(l){return K(e,t,{...o,scope:{...o.scope,...l}})}}}var et=2e3;function tt(e,t={}){let o=internal.createContextStore(),n={getSession:()=>o.get()?.session,defaultPerPage:t.defaultPerPage??core.DEFAULT_PER_PAGE,defaultLimit:t.defaultLimit??core.DEFAULT_LIMIT,maxPerPage:t.maxPerPage??core.DEFAULT_MAX_PER_PAGE,maxLimit:t.maxLimit??core.DEFAULT_MAX_LIMIT,strict:t.strict??false,onSkippedCondition:t.onSkippedCondition,limits:t.limits,cursorSecret:t.cursorSecret,timestamps:t.timestamps,maxTimeMS:t.maxTimeMS??et};function c(g,d,w){let F=typeof d=="function"?void 0:d,u=typeof d=="function"?d:w,D=K(n,g,F);return u?{...D,...u(D)}:D}return {repository:c,transaction:async g=>{if(o.get()?.session)return g();let d=await e.startSession();try{let w;return await d.withTransaction(async()=>{w=await o.run({session:d},g);}),w}finally{await d.endSession();}}}}function rt(){return core.createFilters()}Object.defineProperty(exports,"f",{enumerable:true,get:function(){return core.f}});exports.buildRepository=K;exports.createFilters=rt;exports.createRegistry=tt;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|