@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/dist/index.d.ts
CHANGED
|
@@ -84,7 +84,7 @@ type AggregateRow = Record<string, unknown>;
|
|
|
84
84
|
interface OffsetParams<TDoc = Record<string, unknown>> extends QueryParams<TDoc> {
|
|
85
85
|
page?: number;
|
|
86
86
|
perPage?: number;
|
|
87
|
-
/** `false` — no count query: `perPage + 1` rows are read, `total_items` / `total_pages` are `null
|
|
87
|
+
/** `false` — no count query: `perPage + 1` rows are read, `total_items` / `total_pages` are `null`. Default `true`. */
|
|
88
88
|
withTotal?: boolean;
|
|
89
89
|
}
|
|
90
90
|
type OffsetMeta = Core.OffsetMeta;
|
|
@@ -116,7 +116,7 @@ interface CursorResult<T> {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
119
|
-
* Relation field → its rule (
|
|
119
|
+
* Relation field → its rule (R21): `{ model?, columns, filterable?, nested? }` opens it for a
|
|
120
120
|
* client `with` (`columns` required — a list or `"*"`). A bare model (`{ author: User }`) still types
|
|
121
121
|
* `with`, but opens nothing: `with: { author: … }` is `forbidden-key`, `site: "with"`.
|
|
122
122
|
*/
|
|
@@ -220,7 +220,7 @@ interface Repository<TDoc = Record<string, unknown>, TRel extends Record<string,
|
|
|
220
220
|
/** Update one document by id; returns the updated doc (or undefined). */
|
|
221
221
|
updateById(id: Id, patch: Partial<Insert<TDoc>>, idKey?: FieldKey<TDoc>): Promise<Row<TDoc> | undefined>;
|
|
222
222
|
/**
|
|
223
|
-
* Update every document matching the filter in one `updateMany` → `{ count }` (matched
|
|
223
|
+
* Update every document matching the filter in one `updateMany` → `{ count }` (matched).
|
|
224
224
|
* No filter only with `{ all: true }` (the scope still applies); an empty or fully skipped
|
|
225
225
|
* filter is `QueryKitError` `empty-filter`. The filter passes the request policy like a read.
|
|
226
226
|
*/
|
|
@@ -296,12 +296,12 @@ interface RegistryOptions {
|
|
|
296
296
|
*/
|
|
297
297
|
maxTimeMS?: number;
|
|
298
298
|
/**
|
|
299
|
-
* Signs cursor tokens (HMAC-SHA256
|
|
299
|
+
* Signs cursor tokens (HMAC-SHA256). With it a token that was not
|
|
300
300
|
* issued by this server — or was changed — is `invalid-value`.
|
|
301
301
|
*/
|
|
302
302
|
cursorSecret?: string;
|
|
303
303
|
/**
|
|
304
|
-
* The createdAt / deletedAt field names (
|
|
304
|
+
* The createdAt / deletedAt field names (default `createdAt`, `deletedAt`): the default
|
|
305
305
|
* sort and the default `sortable` use `createdAt`, soft delete uses `deletedAt`.
|
|
306
306
|
*/
|
|
307
307
|
timestamps?: {
|
|
@@ -360,9 +360,9 @@ interface RepoRuntime {
|
|
|
360
360
|
limits?: Partial<QueryLimits>;
|
|
361
361
|
/** Read time limit in ms; a repository's own `maxTimeMS` wins. */
|
|
362
362
|
maxTimeMS: number;
|
|
363
|
-
/** Signs cursor tokens
|
|
363
|
+
/** Signs cursor tokens. */
|
|
364
364
|
cursorSecret?: string;
|
|
365
|
-
/** createdAt / deletedAt field names
|
|
365
|
+
/** createdAt / deletedAt field names; default `createdAt`, `deletedAt`. */
|
|
366
366
|
timestamps?: {
|
|
367
367
|
createdAt?: string;
|
|
368
368
|
deletedAt?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {TEXT_FILTER_OPERATORS,DEFAULT_MAX_LIMIT,DEFAULT_MAX_PER_PAGE,DEFAULT_LIMIT,DEFAULT_PER_PAGE,createFilters,QueryKitTimeoutError,QueryKitError}from'@querykitjs/core';export{f}from'@querykitjs/core';import {createContextStore,resolvePolicy,isAllRows,isEmptyFilter,refuseEmptyFilter,clampPageSize,decodeCursorToken,cursorPage,clampOffset,infinitePage,clampPage,offsetPageWithoutTotal,offsetMeta,scopeConditions,checkWith,reportSkip,scopeDefaults,normalizeSort,isRaw}from'@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 normalizeSort(t,o)){let y=F(e,l.key);y?u[y]=l.direction==="desc"?-1:1: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(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){reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"unknown-key"});return}if(Y(n)&&J(e,l)){reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let y=Z(e,l,n,t.value);if(y===P){reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let d=u(y);if(d===void 0){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(isRaw(t))return t;throw new 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=>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=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(isAllRows(m))return i(void 0);isEmptyFilter(m)&&refuseEmptyFilter(w.source,x),k.checkFilter(m);let D=N(n,m,w);return D===void 0?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=scopeConditions(t.scope);for(let n of o)if(!F(e,n.key))throw new 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 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||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 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=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 QueryKitError({source:n.source,site:"cursorKey",key:r,reason:"unknown-key"});let g=await 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 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 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=>clampPageSize(i.limit,o.defaultLimit,o.maxLimit),w=i=>({...scopeDefaults(t.scope),...i,...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=clampPage(r.page),s=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 offsetPageWithoutTotal(await g(s+1),i,s);let[p,h]=await Promise.all([g(s),w(c)]);return {data:p,meta:offsetMeta(i,s,h)}},async findInfinite(r={}){let i=clampPageSize(r.limit,t.defaultLimit,t.maxLimit),s=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 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=createContextStore(),n={getSession:()=>o.get()?.session,defaultPerPage:t.defaultPerPage??DEFAULT_PER_PAGE,defaultLimit:t.defaultLimit??DEFAULT_LIMIT,maxPerPage:t.maxPerPage??DEFAULT_MAX_PER_PAGE,maxLimit:t.maxLimit??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 createFilters()}export{W as buildRepository,ot as createFilters,et as createRegistry};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {TEXT_FILTER_OPERATORS,DEFAULT_MAX_LIMIT,DEFAULT_MAX_PER_PAGE,DEFAULT_LIMIT,DEFAULT_PER_PAGE,createFilters,QueryKitTimeoutError,QueryKitError}from'@querykitjs/core';export{f}from'@querykitjs/core';import {createContextStore,resolvePolicy,isAllRows,isEmptyFilter,refuseEmptyFilter,clampPageSize,decodeCursorToken,cursorPage,clampOffset,infinitePage,clampPage,offsetPageWithoutTotal,offsetMeta,scopeConditions,checkWith,reportSkip,scopeDefaults,normalizeSort,isRaw}from'@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 normalizeSort(t,o)){let g=S(e,l.key);g?c[g]=l.direction==="desc"?-1:1: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(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){reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"unknown-key"});return}if(J(n)&&Z(e,l)){reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let g=ee(e,l,n,t.value);if(g===P){reportSkip(o,{site:"filter",key:t.key,operation:n,reason:"invalid-value"});return}let d=c(g);if(d===void 0){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(isRaw(t))return t;throw new 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=>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(),$=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(isAllRows(m))return i(void 0);isEmptyFilter(m)&&refuseEmptyFilter(y.source,T),$.checkFilter(m);let k=W(n,m,y);return k===void 0?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=scopeConditions(t.scope);for(let n of o)if(!S(e,n.key))throw new 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 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||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 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=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 QueryKitError({source:n.source,site:"cursorKey",key:x,reason:"unknown-key"});let f=await 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 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 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=>clampPageSize(r.limit,o.defaultLimit,o.maxLimit),y=r=>({...scopeDefaults(t.scope),...r,...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=clampPage(r.page),s=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 offsetPageWithoutTotal(await a(s+1),i,s);let[h,A]=await Promise.all([a(s),b(f)]);return {data:h,meta:offsetMeta(i,s,A)}},async findInfinite(r={}){let i=clampPageSize(r.limit,t.defaultLimit,t.maxLimit),s=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 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=createContextStore(),n={getSession:()=>o.get()?.session,defaultPerPage:t.defaultPerPage??DEFAULT_PER_PAGE,defaultLimit:t.defaultLimit??DEFAULT_LIMIT,maxPerPage:t.maxPerPage??DEFAULT_MAX_PER_PAGE,maxLimit:t.maxLimit??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 createFilters()}export{K as buildRepository,rt as createFilters,tt as createRegistry};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|