@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/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` (task 013). Default `true`. */
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 (task 014, R21): `{ model?, columns, filterable?, nested? }` opens it for a
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, task 013).
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, task 012). With it a token that was not
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 (task 014; default `createdAt`, `deletedAt`): the default
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 (task 012). */
363
+ /** Signs cursor tokens. */
364
364
  cursorSecret?: string;
365
- /** createdAt / deletedAt field names (task 014); default `createdAt`, `deletedAt`. */
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