@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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/fields.ts","../src/internal/order-by.ts","../src/internal/coerce.ts","../src/internal/operators.ts","../src/internal/where.ts","../src/repository/projection.ts","../src/repository/context.ts","../src/repository/aggregate.ts","../src/repository/cursor.ts","../src/repository/mutate.ts","../src/repository/read.ts","../src/repository/index.ts","../src/registry.ts","../src/filters.ts"],"names":["resolveField","model","key","name","hasPath","path","buildSort","sort","diag","createdAt","spec","item","normalizeSort","field","reportSkip","TEXT_OPERATORS","TEXT_FILTER_OPERATORS","INVALID_VALUE","isTextOperator","operator","isDatePath","castForPath","value","CAST_INSTANCES","cast","enumValues","coerceCondition","items","esc","s","sqlLikeToRegex","pattern","out","ch","asTuple","v","operators","isObject","n","isFieldCondition","combine","kind","parts","valid","p","buildCondition","cond","build","fragment","buildNode","node","buildFalse","isRaw","QueryKitError","inner","op","buildWhere","filter","c","truthyKeys","selection","on","buildProjection","m","config","forcedKeys","allowed","permits","intersectAllowed","requested","hit","columns","keys","proj","includesId","k","buildRepoContext","runtime","deletedAtPath","hasDeletedAt","createdAtConfigured","createdAtPath","timestampsOn","stampUpdatedAt","forUpdate","patch","scopeWhere","buildScopeWhere","sortSpec","withOf","checkWith","WITH_DIALECT","combineWhere","userWhere","withDeleted","composeWhere","userFilter","withId","idKey","id","idCondition","guards","maxTimeMS","attachSession","q","READ_OPS","timeLimit","runFind","where","opts","applyPopulate","countWhere","policy","resolvePolicy","method","isAllRows","isEmptyFilter","refuseEmptyFilter","withRel","toArr","conditions","scopeConditions","condition","isTimeLimitError","error","source","exec","args","QueryKitTimeoutError","aggregateMethods","ctx","aggregable","castMatch","rawMatch","groupKeys","match","group","addAgg","prefix","agg","session","rows","_id","rest","cursorMethods","guarded","projection","params","limit","clampPageSize","cursorKey","order","direction","token","decodeCursorToken","cursorValue","idValue","baseWhere","ascInQuery","past","tieBreak","seek","selected","picked","hidden","page","cursorPage","row","CHUNK","KEY_SEPARATOR","mutateMethods","mutationWhere","returningLimit","returning","forInsert","values","scopeDefaults","buildUpsert","options","targetKeys","inserted","set","setOnInsert","update","updateOne","doc","d","entries","i","ops","e","targetFields","keyOf","o","f","byKey","r","count","readMethods","checked","clampPage","perPage","offsetPageWithoutTotal","data","totalItems","offsetMeta","offset","clampOffset","infinitePage","buildRepository","scope","DEFAULT_MAX_TIME_MS","createRegistry","connection","createContextStore","DEFAULT_PER_PAGE","DEFAULT_LIMIT","DEFAULT_MAX_PER_PAGE","DEFAULT_MAX_LIMIT","repository","arg2","arg3","repoOptions","extend","base","fn","result","createFilters","coreCreateFilters"],"mappings":"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","file":"index.js","sourcesContent":["import type { Model } from \"mongoose\";\n\n/** Any Mongoose model, regardless of its document type. */\nexport type AnyModel = Model<any>;\n\n/**\n * Map a public field key to a real Mongoose schema path. `\"id\"` is aliased to\n * `\"_id\"` so the wire contract stays identical across adapters. Unknown fields\n * return `undefined` (the caller skips them silently, like the Drizzle adapter).\n */\nexport function resolveField(model: AnyModel, key: string): string | undefined {\n const name = key === \"id\" ? \"_id\" : key;\n if (name === \"_id\") return \"_id\";\n return model.schema.path(name) ? name : undefined;\n}\n\n/** Whether the schema has a given path (e.g. `deletedAt`, `updatedAt`). */\nexport function hasPath(model: AnyModel, path: string): boolean {\n return Boolean(model.schema.path(path));\n}\n\n/**\n * Cast a raw (decoded cursor) value to the field's schema type so keyset\n * comparisons (`$gt`/`$lt`) work — e.g. a hex string → `ObjectId`, an ISO\n * string → `Date`. Falls back to the raw value if casting fails.\n */\nexport function castValue(model: AnyModel, field: string, value: unknown): unknown {\n const path = model.schema.path(field);\n if (!path) return value;\n try {\n return path.cast(value);\n } catch {\n return value;\n }\n}\n","import { normalizeSort, reportSkip, type Diagnostics } from \"@querykitjs/core/internal\";\n\nimport type { Sort } from \"../types\";\nimport { resolveField, hasPath, type AnyModel } from \"./fields\";\n\n/** A Mongo sort spec, e.g. `{ name: 1, createdAt: -1 }`. */\nexport type SortSpec = Record<string, 1 | -1>;\n\n/**\n * Build a Mongo sort spec from the sort input. Unknown fields are skipped; when\n * nothing valid remains, defaults to newest-first (`createdAt` desc, else `_id`).\n */\nexport function buildSort(\n model: AnyModel,\n sort?: Sort,\n diag?: Diagnostics,\n createdAt: string | undefined = hasPath(model, \"createdAt\") ? \"createdAt\" : undefined,\n): SortSpec {\n const spec: SortSpec = {};\n for (const item of normalizeSort(sort, diag)) {\n const field = resolveField(model, item.key);\n if (field) spec[field] = item.direction === \"desc\" ? -1 : 1;\n // An unknown sort key falls back to the default order, so the list looks\n // \"unsorted\" to the caller with nothing in the log to explain it.\n else reportSkip(diag, { site: \"sort\", key: item.key, reason: \"unknown-key\" });\n }\n if (Object.keys(spec).length === 0) {\n if (createdAt) spec[createdAt] = -1;\n else spec._id = -1;\n }\n return spec;\n}\n","import { TEXT_FILTER_OPERATORS } from \"@querykitjs/core\";\n\nimport type { FilterOperator, FilterValue } from \"../types\";\nimport type { AnyModel } from \"./fields\";\n\n/**\n * Operators whose value is a text pattern — never cast. A `$regex` fragment must\n * keep the caller's raw string even on a `Date` path. The list lives in\n * `@querykitjs/core` so both adapters share it.\n */\nconst TEXT_OPERATORS: ReadonlySet<FilterOperator> = new Set(TEXT_FILTER_OPERATORS);\n\n/**\n * Returned when a value cannot be represented in the path's type (e.g. the\n * string `\"not-a-date\"` on a `Date` path). Callers drop the condition — the same\n * contract `operators.ts` already uses for a non-array `in` value, and the same\n * symbol-based contract the drizzle adapter uses.\n */\nexport const INVALID_VALUE = Symbol(\"querykit.invalid-value\");\n\n/** Whether this operator compares against a text pattern (`like`, `contains`, …). */\nexport const isTextOperator = (operator: FilterOperator): boolean => TEXT_OPERATORS.has(operator);\n\n/** Whether a schema path stores a `Date` (the only type both adapters cast locally). */\nexport function isDatePath(model: AnyModel, field: string): boolean {\n return model.schema.path(field)?.instance === \"Date\";\n}\n\n/**\n * Cast a single wire value to the path's type, or report it as uncastable.\n *\n * Scoped to `Date` paths **on purpose**, so both adapters behave identically:\n * drizzle can only judge columns it maps through JS (`dataType: \"date\"`) and\n * leaves everything else to Postgres, so mongoose likewise leaves other paths to\n * its own query cast. Mongoose casts these values itself when the query runs;\n * doing it here keeps the behaviour pinned by tests instead of relying on\n * mongoose internals, and turns a cryptic `CastError` 500 into a skipped\n * condition (observable via `onSkippedCondition`).\n */\nexport function castForPath(model: AnyModel, field: string, value: unknown): unknown | typeof INVALID_VALUE {\n const path = model.schema.path(field);\n if (!path || value === null || value === undefined || !CAST_INSTANCES.has(path.instance)) return value;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? INVALID_VALUE : value;\n try {\n const cast = path.cast(value) as unknown;\n if (cast instanceof Date) return Number.isNaN(cast.getTime()) ? INVALID_VALUE : cast;\n if (cast === null || cast === undefined) return INVALID_VALUE;\n // `cast` does not check an enum; a value outside it can never match (task 021 B8).\n const enumValues = (path as unknown as { enumValues?: readonly unknown[] }).enumValues;\n if (path.instance === \"String\" && enumValues && enumValues.length > 0 && !enumValues.includes(cast)) return INVALID_VALUE;\n return cast;\n } catch {\n return INVALID_VALUE;\n }\n}\n\n/**\n * Paths cast here (task 021 B8): a value their type rejects — `age = \"abc\"`, a\n * malformed ObjectId, `\"maybe\"` for a Boolean, a String outside its enum — is\n * invalid-value before the query runs, instead of a CastError 500 at exec.\n */\nconst CAST_INSTANCES: ReadonlySet<string> = new Set([\"Date\", \"Number\", \"Boolean\", \"ObjectId\", \"String\", \"Decimal128\"]);\n\n/**\n * Bring one condition's value in line with the path's type before it reaches an\n * operator builder — the mongoose counterpart of the drizzle adapter's\n * `coerceCondition`, with the same signature shape, the same text-operator\n * carve-out and the same all-or-nothing rule for arrays/tuples.\n */\nexport function coerceCondition(\n model: AnyModel,\n field: string,\n operator: FilterOperator,\n value: FilterValue | undefined,\n): FilterValue | undefined | typeof INVALID_VALUE {\n if (value === undefined || TEXT_OPERATORS.has(operator)) return value;\n\n if (Array.isArray(value)) {\n const items: unknown[] = [];\n for (const item of value) {\n const cast = castForPath(model, field, item);\n if (cast === INVALID_VALUE) return INVALID_VALUE;\n items.push(cast);\n }\n return items as FilterValue;\n }\n\n const cast = castForPath(model, field, value);\n return cast === INVALID_VALUE ? INVALID_VALUE : (cast as FilterValue);\n}\n","import type { FilterOperator, FilterValue } from \"../types\";\n\n/** A field-level Mongo fragment, e.g. `{ $gte: 1, $lte: 9 }`. `undefined` = drop. */\ntype Fragment = Record<string, unknown> | undefined;\ntype Builder = (value: FilterValue | undefined) => Fragment;\n\n/** Escape a literal string for use inside a regex (contains/startsWith/endsWith). */\nconst esc = (s: unknown): string => String(s ?? \"\").replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Translate a SQL LIKE pattern (`%` → any, `_` → one char) to an anchored regex. A run of `%` is one `.*`. */\nconst sqlLikeToRegex = (pattern: unknown): string => {\n let out = \"\";\n for (const ch of String(pattern ?? \"\")) {\n if (ch === \"%\") {\n if (!out.endsWith(\".*\")) out += \".*\";\n } else if (ch === \"_\") out += \".\";\n else out += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return `^${out}$`;\n};\n\nconst asTuple = (v: FilterValue | undefined): [unknown, unknown] | undefined => (Array.isArray(v) && v.length === 2 ? [v[0], v[1]] : undefined);\n\n/**\n * Operator → Mongo fragment map. Mirrors the Drizzle adapter's semantics: both\n * token (`\"%_%\"`) and name-alias (`\"contains\"`) forms are handled;\n * `contains/startsWith/endsWith` are case-insensitive; invalid values (non-array\n * `in`, non-2-tuple `between`) drop the condition (`undefined`).\n */\nexport const operators: Record<FilterOperator, Builder> = {\n \"=\": v => ({ $eq: v }),\n eq: v => ({ $eq: v }),\n // SQL three-valued logic: inequality/negation excludes NULL (and missing) rows,\n // matching drizzle-pg. `$nin: [v, null]` = \"not v AND not null\".\n \"!=\": v => ({ $nin: [v, null] }),\n ne: v => ({ $nin: [v, null] }),\n \">\": v => ({ $gt: v }),\n gt: v => ({ $gt: v }),\n \">=\": v => ({ $gte: v }),\n gte: v => ({ $gte: v }),\n \"<\": v => ({ $lt: v }),\n lt: v => ({ $lt: v }),\n \"<=\": v => ({ $lte: v }),\n lte: v => ({ $lte: v }),\n\n contains: v => ({ $regex: esc(v), $options: \"i\" }),\n \"%_%\": v => ({ $regex: esc(v), $options: \"i\" }),\n startsWith: v => ({ $regex: `^${esc(v)}`, $options: \"i\" }),\n \"%_\": v => ({ $regex: `^${esc(v)}`, $options: \"i\" }),\n endsWith: v => ({ $regex: `${esc(v)}$`, $options: \"i\" }),\n \"_%\": v => ({ $regex: `${esc(v)}$`, $options: \"i\" }),\n\n like: v => ({ $regex: sqlLikeToRegex(v) }),\n ilike: v => ({ $regex: sqlLikeToRegex(v), $options: \"i\" }),\n // negation also excludes NULL/missing (SQL `NOT LIKE` semantics).\n notLike: v => ({ $not: { $regex: sqlLikeToRegex(v) }, $ne: null }),\n\n in: v => (Array.isArray(v) ? { $in: v } : undefined),\n notIn: v => (Array.isArray(v) ? { $nin: [...v, null] } : undefined),\n\n between: v => {\n const t = asTuple(v);\n return t ? { $gte: t[0], $lte: t[1] } : undefined;\n },\n notBetween: v => {\n const t = asTuple(v);\n return t ? { $not: { $gte: t[0], $lte: t[1] }, $ne: null } : undefined;\n },\n\n isNull: () => ({ $eq: null }),\n isNotNull: () => ({ $ne: null }),\n};\n","import type { Filter, FieldCondition, FilterNode } from \"../types\";\nimport { coerceCondition, INVALID_VALUE, isDatePath, isTextOperator } from \"./coerce\";\nimport { QueryKitError } from \"@querykitjs/core\";\nimport { isRaw, reportSkip, type Diagnostics } from \"@querykitjs/core/internal\";\nimport { operators } from \"./operators\";\nimport { resolveField, type AnyModel } from \"./fields\";\n\n/** A Mongo filter query object. */\nexport type Query = Record<string, unknown>;\n\nconst isObject = (n: unknown): n is Record<string, unknown> => typeof n === \"object\" && n !== null;\n\nconst isFieldCondition = (n: unknown): n is FieldCondition => isObject(n) && \"key\" in n && !(\"and\" in n) && !(\"or\" in n) && !(\"not\" in n);\n\n/** Combine parts (dropping `undefined`): 0 → undefined, 1 → the part, else `$and`/`$or`. */\nfunction combine(kind: \"$and\" | \"$or\", parts: (Query | undefined)[]): Query | undefined {\n const valid = parts.filter((p): p is Query => p !== undefined);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n return { [kind]: valid };\n}\n\nfunction buildCondition(model: AnyModel, cond: FieldCondition, diag?: Diagnostics): Query | undefined {\n const operator = cond.operation ?? \"=\";\n const build = operators[operator];\n if (!build) throw new Error(`Unsupported filter operator: \"${operator}\"`);\n\n const field = resolveField(model, cond.key);\n if (!field) {\n // Unknown field → skip. Usually a typo, and a dropped filter widens the\n // result set rather than narrowing it, so it is worth reporting.\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"unknown-key\" });\n return undefined;\n }\n\n // A text pattern cannot be matched against a Date path: Mongo rejects\n // `$regex`/`$options` on a Date (\"Can't use $options with Date\"), which used to\n // surface as a 500. The SQL adapters skip a text pattern on a non-text field too\n // (R11, task 024), reported via `onSkippedCondition` instead of a stack trace.\n if (isTextOperator(operator) && isDatePath(model, field)) {\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n\n // Cast wire (JSON) values to the path's type first, matching the drizzle\n // adapter — text-pattern operators keep their raw string.\n const value = coerceCondition(model, field, operator, cond.value);\n if (value === INVALID_VALUE) {\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n\n const fragment = build(value);\n if (fragment === undefined) {\n // The operator rejected the value shape (a non-array `in`, a non-2-tuple\n // `between`) — same class of problem as an uncastable value.\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n return { [field]: fragment };\n}\n\nfunction buildNode(model: AnyModel, node: FilterNode, diag?: Diagnostics): Query | undefined {\n if (isFieldCondition(node)) return buildCondition(model, node, diag);\n if (isObject(node)) {\n if (\"and\" in node)\n return combine(\n \"$and\",\n (node.and as FilterNode[]).map(n => buildNode(model, n, diag)),\n );\n if (\"or\" in node)\n return combine(\n \"$or\",\n (node.or as FilterNode[]).map(n => buildNode(model, n, diag)),\n );\n if (\"not\" in node) return buildFalse(model, node.not as FilterNode, diag);\n // Raw escape hatch — a Mongo filter object, used as-is only when server code\n // branded it with core `raw()` (R19). A plain object can come from a JSON body\n // (`{ $where: … }`), so it is refused whatever `strict` says — mutations included.\n if (isRaw(node)) return node as Query;\n throw new QueryKitError({ source: model.modelName, site: \"filter\", key: Object.keys(node as object)[0] ?? \"\", reason: \"forbidden-key\" });\n }\n return undefined;\n}\n\n/**\n * The rows where `node` is FALSE — SQL three-valued logic, so drizzle-pg and\n * prisma-pg agree (task 021 B10). MongoDB's `$nor` is two-valued: it also keeps\n * rows where the predicate is UNKNOWN (a null / missing field). So:\n * `isFalse(and(…))` = `or(isFalse(…))`, `isFalse(or(…))` = `and(isFalse(…))`,\n * `isFalse(not(q))` = `isTrue(q)`, and a comparison is FALSE only on a non-null\n * field. `isNull` / `isNotNull` are two-valued (never UNKNOWN) and need no guard.\n */\nfunction buildFalse(model: AnyModel, node: FilterNode, diag?: Diagnostics): Query | undefined {\n if (isFieldCondition(node)) {\n const inner = buildCondition(model, node, diag);\n if (!inner) return undefined;\n const op = node.operation ?? \"=\";\n const field = op === \"isNull\" || op === \"isNotNull\" ? undefined : resolveField(model, node.key);\n return field ? { $and: [{ [field]: { $ne: null } }, { $nor: [inner] }] } : { $nor: [inner] };\n }\n if (isObject(node)) {\n if (\"and\" in node)\n return combine(\n \"$or\",\n (node.and as FilterNode[]).map(n => buildFalse(model, n, diag)),\n );\n if (\"or\" in node)\n return combine(\n \"$and\",\n (node.or as FilterNode[]).map(n => buildFalse(model, n, diag)),\n );\n if (\"not\" in node) return buildNode(model, node.not as FilterNode, diag);\n }\n // A branded raw node (or a refusal for an unbranded one) — its own truth value.\n const inner = buildNode(model, node, diag);\n return inner ? { $nor: [inner] } : undefined;\n}\n\n/**\n * Translate a filter (tree / node / flat array / raw) into a single Mongo query.\n *\n * `diag` is optional: without it, unresolvable conditions are dropped silently\n * exactly as before; with it they are reported (or, in strict mode, throw).\n */\nexport function buildWhere(model: AnyModel, filter?: Filter, diag?: Diagnostics): Query | undefined {\n if (filter === undefined) return undefined;\n // Array elements go through buildNode (not buildCondition) so a flat array may\n // also hold logical groups / raw nodes (implicit AND), matching drizzle-pg.\n if (Array.isArray(filter))\n return combine(\n \"$and\",\n filter.map(c => buildNode(model, c, diag)),\n );\n return buildNode(model, filter, diag);\n}\n","/**\n * Projection guards. `columns` may arrive straight from the wire, so the safe\n * selection belongs here rather than in every route — the same reasoning as\n * `scope`. Both options are validated once, at build time, so a\n * misconfiguration surfaces in development instead of quietly returning full\n * documents in production. Identical semantics to the drizzle-pg adapter.\n */\nimport type { ColumnSelection, QueryParams, RepositoryOptions } from \"../types\";\nimport { resolveField, type AnyModel } from \"../internal/fields\";\n\nexport type MongoProjection = Record<string, 0 | 1>;\n\nexport interface Projection<TDoc> {\n /** `forcedColumns` or `allowedColumns` is configured. */\n guarded: boolean;\n /** Whether a field may appear in a result at all. */\n permits: (key: string) => boolean;\n /**\n * Column selection → Mongo projection, or undefined when empty. Adds `_id: 0`\n * unless the caller selected `id`/`_id`, so the runtime shape matches the\n * inferred `Pick<...>` type (Mongo otherwise always returns `_id`). Returns\n * undefined (full doc) when no requested column resolves.\n *\n * With `forcedColumns` the caller's selection is ignored outright; with\n * `allowedColumns` it is intersected, and an empty intersection falls back to\n * the allowlist — **never** to the full document.\n */\n projection: (columns?: QueryParams<TDoc>[\"columns\"]) => MongoProjection | undefined;\n}\n\nconst truthyKeys = (selection: object): string[] =>\n Object.entries(selection)\n .filter(([, on]) => on)\n .map(([key]) => key);\n\nexport function buildProjection<TDoc>(m: AnyModel, config: RepositoryOptions<TDoc>): Projection<TDoc> {\n const forcedKeys = config.forcedColumns ? truthyKeys(config.forcedColumns) : undefined;\n if (config.forcedColumns && forcedKeys!.length === 0) {\n throw new Error(\"buildRepository: forcedColumns must select at least one field (an empty selection would return the full document).\");\n }\n\n const allowed = config.allowedColumns ? new Set<string>(config.allowedColumns as readonly string[]) : undefined;\n if (config.allowedColumns && allowed!.size === 0) {\n throw new Error(\"buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full document).\");\n }\n\n const permits = (key: string): boolean => (forcedKeys ? forcedKeys.includes(key) : allowed ? allowed.has(key) : true);\n\n /** Client selection ∩ allowlist; empty intersection → the allowlist itself. */\n const intersectAllowed = (requested: string[]): string[] => {\n const hit = requested.filter(key => allowed!.has(key));\n return hit.length > 0 ? hit : [...allowed!];\n };\n\n const projection = (columns?: QueryParams<TDoc>[\"columns\"]): MongoProjection | undefined => {\n const requested = columns ? truthyKeys(columns as ColumnSelection<TDoc>) : [];\n const keys = forcedKeys ?? (allowed ? intersectAllowed(requested) : requested);\n if (keys.length === 0) return undefined;\n const proj: MongoProjection = {};\n let includesId = false;\n for (const k of keys) {\n const field = resolveField(m, k);\n if (!field) continue;\n proj[field] = 1;\n if (field === \"_id\") includesId = true;\n }\n if (Object.keys(proj).length === 0) return undefined; // all unknown → full doc\n if (!includesId) proj._id = 0; // exclude _id unless explicitly selected (exact columns, like drizzle)\n return proj;\n };\n\n return { guarded: Boolean(forcedKeys ?? allowed), permits, projection };\n}\n","import type { Relations } from \"@querykitjs/core\";\nimport type { ClientSession, Model } from \"mongoose\";\nimport { QueryKitError, QueryKitTimeoutError, type QueryLimits, type SkippedCondition } from \"@querykitjs/core\";\nimport {\n checkWith,\n type Diagnostics,\n isAllRows,\n isEmptyFilter,\n type Policy,\n refuseEmptyFilter,\n resolvePolicy,\n scopeConditions,\n type WithDialect,\n} from \"@querykitjs/core/internal\";\n\nimport type { FieldCondition, FieldKey, Filter, Id, QueryParams, RepositoryOptions, Sort } from \"../types\";\nimport { hasPath, resolveField, type AnyModel } from \"../internal/fields\";\nimport { buildSort } from \"../internal/order-by\";\nimport { buildWhere, type Query } from \"../internal/where\";\nimport { buildProjection, type Projection } from \"./projection\";\n\n/** Registry-level runtime injected into every repository. */\nexport interface RepoRuntime {\n /** Active transaction session, if any. */\n getSession: () => ClientSession | undefined;\n defaultPerPage: number;\n defaultLimit: number;\n /** Upper bound for `perPage`, applied even when validation was bypassed. */\n maxPerPage: number;\n /** Upper bound for `limit` (`findInfinite`/`findCursor`). */\n maxLimit: number;\n /** Throw `QueryKitError` instead of dropping an unresolvable condition. */\n strict: boolean;\n /** Called for every dropped condition (also when `strict` is off). */\n onSkippedCondition?: (info: SkippedCondition) => void;\n /** Registry-level request limits; a repository's own `limits` win. */\n limits?: Partial<QueryLimits>;\n /** Read time limit in ms; a repository's own `maxTimeMS` wins. */\n maxTimeMS: number;\n /** Signs cursor tokens (task 012). */\n cursorSecret?: string;\n /** createdAt / deletedAt field names (task 014); default `createdAt`, `deletedAt`. */\n timestamps?: { createdAt?: string; deletedAt?: string };\n}\n\n// Mongoose's Query generics are extremely deep; we drive queries untyped\n// internally (the public Repository surface stays fully typed) and cast results.\n\nexport type AnyQuery = any;\n\nexport interface FindOpts<TDoc> {\n sort?: Record<string, 1 | -1>;\n columns?: QueryParams<TDoc>[\"columns\"];\n with?: QueryParams<TDoc>[\"with\"];\n limit?: number;\n skip?: number;\n}\n\n/**\n * Everything one model's repository methods share: the model, the compiled\n * scope and soft-delete guard, the projection guard and the query helpers.\n * Built once per `buildRepository` call; the method groups (`read`, `cursor`,\n * `aggregate`, `mutate`) only read from it.\n */\nexport interface RepoContext<TDoc> extends Projection<TDoc> {\n runtime: RepoRuntime;\n m: AnyModel;\n diag: Diagnostics;\n hasDeletedAt: boolean;\n /** The soft-delete path (`timestamps.deletedAt`, default `deletedAt`). */\n deletedAtPath: string;\n /** Stamp `updatedAt` when the schema has a manual one (no `timestamps`). */\n forUpdate: <T extends object>(patch: T) => T;\n sortSpec: (sort?: Sort<TDoc>) => Record<string, 1 | -1>;\n /**\n * The client's `with`, checked against `relations` (task 014, R21): an unlisted relation,\n * column, filter field or nested relation is `forbidden-key`, `site: \"with\"`. A column list\n * is selected even when the client asks with `true`.\n */\n withOf: (value: unknown) => never;\n /** User filter + scope + soft-delete guard as one Mongo query. */\n /** `filterable` / `sortable` / `limits` — every client-facing read checks through it. */\n policy: Policy;\n /** This repository's read time limit, in ms. */\n maxTimeMS: number;\n composeWhere: (userFilter?: Filter<TDoc>, withDeleted?: boolean) => Query;\n /**\n * The WHERE of `updateWhere` / `deleteWhere` (task 013): `{ all: true }` → scope and\n * soft-delete guard only; an empty filter — also one whose every condition was skipped —\n * is `empty-filter`; the filter passes the request policy like a read's.\n */\n mutationWhere: (filter: unknown, method: \"updateWhere\" | \"deleteWhere\") => Query;\n /** `filter AND idKey = id`. */\n withId: (filter: Filter<TDoc> | undefined, idKey: string, id: Id) => Filter<TDoc>;\n /** `.populate()` every truthy `with` entry. */\n applyPopulate: (q: AnyQuery, withRel?: QueryParams<TDoc>[\"with\"]) => AnyQuery;\n /** Join the active transaction session, if any. */\n attachSession: (q: AnyQuery) => AnyQuery;\n runFind: (where: Query, opts: FindOpts<TDoc>) => Promise<unknown[]>;\n countWhere: (where: Query) => Promise<number>;\n}\n\nexport function buildRepoContext<TDoc>(runtime: RepoRuntime, model: Model<TDoc>, config: RepositoryOptions<TDoc>): RepoContext<TDoc> {\n const m = model as AnyModel;\n // Task 014: the registry's `timestamps` names these paths.\n const deletedAtPath = resolveField(m, runtime.timestamps?.deletedAt ?? \"deletedAt\") ?? \"deletedAt\";\n const hasDeletedAt = hasPath(m, deletedAtPath);\n const createdAtConfigured = runtime.timestamps?.createdAt !== undefined;\n const createdAtPath = resolveField(m, runtime.timestamps?.createdAt ?? \"createdAt\");\n // Mongoose auto-bumps `updatedAt` only when the schema opts into timestamps;\n // for a manual `updatedAt` path we stamp it ourselves so every update path\n // bumps it — matching drizzle-pg's forUpdate.\n const timestampsOn = Boolean((m.schema as { options?: { timestamps?: unknown } }).options?.timestamps);\n const stampUpdatedAt = hasPath(m, \"updatedAt\") && !timestampsOn;\n const forUpdate = <T extends object>(patch: T): T => (stampUpdatedAt ? { ...patch, updatedAt: new Date() } : patch);\n\n const scopeWhere = buildScopeWhere(m, config);\n\n /* Diagnostics channel — built once, threaded into the filter/sort compilers. */\n const diag: Diagnostics = {\n source: m.modelName,\n strict: runtime.strict,\n onSkipped: runtime.onSkippedCondition,\n };\n\n const sortSpec = (sort?: Sort<TDoc>): Record<string, 1 | -1> => buildSort(m, sort as Sort | undefined, diag, createdAtPath);\n // A bare model (`{ author: User }`) is for typing only and opens nothing (R21).\n const withOf = (value: unknown) => checkWith(value, config.relations as Relations | undefined, WITH_DIALECT, diag.source) as never;\n\n /** An already built user filter + scope + soft-delete guard. */\n const combineWhere = (userWhere: Query | undefined, withDeleted?: boolean): Query => {\n const parts = [userWhere, scopeWhere, hasDeletedAt && !withDeleted ? { [deletedAtPath]: { $eq: null } } : undefined].filter(\n (p): p is Query => p !== undefined,\n );\n if (parts.length === 0) return {};\n if (parts.length === 1) return parts[0]!;\n return { $and: parts };\n };\n const composeWhere = (userFilter?: Filter<TDoc>, withDeleted?: boolean): Query =>\n combineWhere(buildWhere(m, userFilter as Filter | undefined, diag), withDeleted);\n\n const withId = (filter: Filter<TDoc> | undefined, idKey: string, id: Id): Filter<TDoc> => {\n const idCondition: FieldCondition<TDoc> = { key: idKey as FieldKey<TDoc>, operation: \"=\", value: id as never };\n if (!filter) return [idCondition];\n if (Array.isArray(filter)) return [...filter, idCondition];\n return { and: [filter, idCondition] };\n };\n\n const guards = buildProjection(m, config);\n\n const maxTimeMS = config.maxTimeMS ?? runtime.maxTimeMS;\n const attachSession = (q: AnyQuery): AnyQuery => {\n const s = runtime.getSession();\n if (s) q.session(s);\n if (READ_OPS.has((q as unknown as { op?: string }).op ?? \"\")) timeLimit(q, m.modelName, maxTimeMS);\n return q;\n };\n\n const runFind = (where: Query, opts: FindOpts<TDoc>): Promise<unknown[]> => {\n let q: AnyQuery = m.find(where, guards.projection(opts.columns));\n if (opts.sort) q = q.sort(opts.sort);\n if (typeof opts.skip === \"number\") q = q.skip(opts.skip);\n if (typeof opts.limit === \"number\") q = q.limit(opts.limit);\n q = applyPopulate(q, opts.with);\n return attachSession(q).lean().exec() as Promise<unknown[]>;\n };\n\n const countWhere = (where: Query): Promise<number> => attachSession(m.countDocuments(where)).exec() as Promise<number>;\n\n const policy = resolvePolicy({\n source: m.modelName,\n // `id` is `_id` on the wire, like everywhere else in this adapter.\n fieldOf: key => resolveField(m, key),\n primaryKey: \"_id\",\n createdAt: createdAtConfigured ? createdAtPath : (createdAtPath ?? resolveField(m, \"created_at\")),\n filterable: config.filterable as never,\n sortable: config.sortable as readonly string[] | undefined,\n allowedColumns: config.allowedColumns as readonly string[] | undefined,\n forcedColumns: config.forcedColumns as Record<string, unknown> | undefined,\n limits: { ...runtime.limits, ...config.limits },\n });\n\n const mutationWhere = (filter: unknown, method: \"updateWhere\" | \"deleteWhere\"): Query => {\n if (isAllRows(filter)) return combineWhere(undefined);\n if (isEmptyFilter(filter)) refuseEmptyFilter(diag.source, method);\n policy.checkFilter(filter as Filter<TDoc>);\n const userWhere = buildWhere(m, filter as Filter, diag);\n return userWhere === undefined ? refuseEmptyFilter(diag.source, method) : combineWhere(userWhere);\n };\n\n return {\n ...guards,\n policy,\n maxTimeMS,\n runtime,\n m,\n diag,\n hasDeletedAt,\n deletedAtPath,\n forUpdate,\n sortSpec,\n withOf,\n composeWhere,\n mutationWhere,\n withId,\n applyPopulate,\n attachSession,\n runFind,\n countWhere,\n };\n}\n\n/** `.populate()` every truthy `with` entry. */\n/** Populate options: `select`, nested `populate`, `match` (field-checked), `options.limit` / `options.skip`. */\nconst WITH_DIALECT: WithDialect = {\n columns: \"select\",\n nested: \"populate\",\n filters: [\"match\"],\n logical: [\"$and\", \"$or\", \"$nor\"],\n paging: [\"limit\", \"skip\"],\n options: \"options\",\n};\n\nfunction applyPopulate(q: AnyQuery, withRel?: Record<string, unknown>): AnyQuery {\n if (withRel) {\n for (const key of Object.keys(withRel)) {\n const value = withRel[key];\n if (!value) continue;\n // `true` → populate the field; an object → pass through as populate options\n // (`{ author: { select: \"name\" } }` → `.populate({ path, select })`).\n q.populate(typeof value === \"object\" ? { path: key, ...(value as object) } : key);\n }\n }\n return q;\n}\n\n/** `value`, `[value]` or `[]` — for spec fields that take one key or a list. */\nexport const toArr = <T>(v?: T | T[]): T[] => (v === undefined ? [] : Array.isArray(v) ? v : [v]);\n\n/** The scope as a precompiled Mongo query (equality on each field), or `undefined`. */\nfunction buildScopeWhere<TDoc>(m: AnyModel, config: RepositoryOptions<TDoc>): Query | undefined {\n // Task 014: an equality value or `{ in: [...] }`.\n const conditions = scopeConditions(config.scope as Record<string, unknown> | undefined) as unknown as FieldCondition[];\n // A scope is the server's own RBAC / tenancy filter, so a key that does not\n // resolve must never be dropped: that would silently widen every query on this\n // repository. Fail when it is configured, not per request, and regardless of\n // `strict` — this is a programming error, not bad input.\n for (const condition of conditions) {\n if (!resolveField(m, condition.key)) {\n throw new QueryKitError({ source: m.modelName, site: \"filter\", key: condition.key, reason: \"unknown-key\" });\n }\n }\n // An empty `in` list matches no row (`$in: []`).\n return conditions.length ? buildWhere(m, conditions) : undefined;\n}\n\n/** Reads that get a time limit; writes are never cut off half-way. */\nconst READ_OPS: ReadonlySet<string> = new Set([\"find\", \"findOne\", \"countDocuments\", \"distinct\"]);\n\n/** MongoDB's error for a read past `maxTimeMS` (code 50). */\nexport const isTimeLimitError = (error: unknown): boolean =>\n typeof error === \"object\" &&\n error !== null &&\n ((error as { codeName?: unknown }).codeName === \"MaxTimeMSExpired\" || (error as { code?: unknown }).code === 50);\n\n/** Set `maxTimeMS` on a read and turn a time-limit failure into `QueryKitTimeoutError`. */\nfunction timeLimit(q: AnyQuery, source: string, maxTimeMS: number): void {\n q.maxTimeMS(maxTimeMS);\n const exec = q.exec.bind(q);\n q.exec = (async (...args: unknown[]) => {\n try {\n return await (exec as (...a: unknown[]) => Promise<unknown>)(...args);\n } catch (error) {\n throw isTimeLimitError(error) ? new QueryKitTimeoutError(source, maxTimeMS, { cause: error }) : error;\n }\n }) as typeof q.exec;\n}\n","import { QueryKitTimeoutError } from \"@querykitjs/core\";\nimport { reportSkip } from \"@querykitjs/core/internal\";\n\nimport type { AggregateRow, AggregateSpec } from \"../types\";\nimport { resolveField } from \"../internal/fields\";\nimport { toArr, type RepoContext, isTimeLimitError } from \"./context\";\n\n/** `aggregate` — `$match` + `$group` with `count`/`$sum`/`$avg`/`$min`/`$max`. */\nexport function aggregateMethods<TDoc>(ctx: RepoContext<TDoc>) {\n const { runtime, m, diag, permits, policy, maxTimeMS, composeWhere } = ctx;\n\n // An aggregate spec can also come from a request, and `min(password)` or a\n // `groupBy` on a hidden field leaks just as much as a projection — so the\n // same guard applies here (matching the drizzle-pg adapter).\n const aggregable = (key: string) => {\n const field = permits(key) ? resolveField(m, key) : undefined;\n if (!field) reportSkip(diag, { site: \"aggregate\", key, reason: \"unknown-key\" });\n return field;\n };\n\n /**\n * Aggregate `$match` doesn't auto-cast values the way `find()` does; cast the\n * filter against the schema so wire strings (dates / ObjectIds) become proper\n * BSON types — keeping aggregate filters consistent with reads.\n */\n const castMatch = (rawMatch: Record<string, unknown>): Record<string, unknown> => {\n try {\n const q = m.find(rawMatch);\n q.cast(m);\n return q.getFilter();\n } catch {\n return rawMatch; // fall back to the uncast filter\n }\n };\n\n return {\n async aggregate(spec: AggregateSpec<TDoc>) {\n // `$group` or `$max` on a hidden path reads it as surely as a filter does.\n policy.checkFilter(spec.filter);\n for (const key of [spec.groupBy, spec.sum, spec.avg, spec.min, spec.max].flatMap(value =>\n value === undefined ? [] : Array.isArray(value) ? value : [value],\n ))\n policy.checkAggregateKey(key as string);\n const groupKeys = (toArr(spec.groupBy) as string[]).filter(key => Boolean(aggregable(key)));\n const match = castMatch(composeWhere(spec.filter, spec.withDeleted));\n const groupId = groupKeys.length ? Object.fromEntries(groupKeys.map(k => [k, `$${aggregable(k) ?? k}`])) : null;\n const group: Record<string, unknown> = { _id: groupId };\n if (spec.count) group.count = { $sum: 1 };\n const addAgg = (op: \"$sum\" | \"$avg\" | \"$min\" | \"$max\", keys: string[], prefix: string) => {\n for (const k of keys) {\n const field = aggregable(k);\n if (field) group[`${prefix}_${k}`] = { [op]: `$${field}` };\n }\n };\n addAgg(\"$sum\", toArr(spec.sum) as string[], \"sum\");\n addAgg(\"$avg\", toArr(spec.avg) as string[], \"avg\");\n addAgg(\"$min\", toArr(spec.min) as string[], \"min\");\n addAgg(\"$max\", toArr(spec.max) as string[], \"max\");\n\n let agg = m.aggregate([{ $match: match }, { $group: group }] as never);\n const session = runtime.getSession();\n if (session) agg = agg.session(session);\n agg = agg.option({ maxTimeMS });\n let rows: Record<string, unknown>[];\n try {\n rows = (await agg.exec()) as Record<string, unknown>[];\n } catch (error) {\n throw isTimeLimitError(error) ? new QueryKitTimeoutError(m.modelName, maxTimeMS, { cause: error }) : error;\n }\n // Flatten the group `_id` fields back into each row (matches drizzle's shape).\n return rows.map(({ _id, ...rest }) => ({ ...(typeof _id === \"object\" && _id ? _id : {}), ...rest })) as AggregateRow[];\n },\n };\n}\n","import { QueryKitError } from \"@querykitjs/core\";\nimport { clampPageSize, cursorPage, decodeCursorToken } from \"@querykitjs/core/internal\";\n\nimport type { CursorParams, CursorResult, SortDirection } from \"../types\";\nimport { resolveField } from \"../internal/fields\";\nimport { castForPath, INVALID_VALUE } from \"../internal/coerce\";\nimport type { Query } from \"../internal/where\";\nimport type { AnyQuery, RepoContext } from \"./context\";\n\n/** `findCursor` — keyset pagination on one field. */\nexport function cursorMethods<TDoc>(ctx: RepoContext<TDoc>) {\n const { runtime, m, diag, guarded, permits, projection, policy, withOf, composeWhere, applyPopulate, attachSession } = ctx;\n\n return {\n async findCursor(params: CursorParams<TDoc> = {}) {\n const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);\n const cursorKey = (params.cursorKey ?? \"id\") as string;\n policy.checkFilter(params.filter);\n // The default `id` is the server's choice; a client-sent key must be sortable.\n if (params.cursorKey !== undefined) policy.checkCursorKey(cursorKey);\n const order: SortDirection = params.order ?? \"asc\";\n const direction = params.direction ?? \"forward\";\n\n const field = resolveField(m, cursorKey);\n // Always fatal: without a usable cursor field there is no pagination to\n // fall back to. Reported as a `QueryKitError` so the backend maps it to a\n // 400 the same way as any other bad condition (both adapters agree).\n if (!field) throw new QueryKitError({ source: diag.source, site: \"cursorKey\", key: cursorKey, reason: \"unknown-key\" });\n\n // Task 012: the token carries the cursor value and _id (tie-break), both cast\n // to their path's type; a token that does not fit is invalid-value.\n const token = await decodeCursorToken(params.cursor, { source: diag.source, secret: runtime.cursorSecret, key: cursorKey });\n const cursorValue = token === undefined ? undefined : castForPath(m, field, token.k);\n const idValue = token === undefined ? undefined : castForPath(m, \"_id\", token.id);\n if (cursorValue === INVALID_VALUE || idValue === INVALID_VALUE) {\n throw new QueryKitError({ source: diag.source, site: \"cursorKey\", key: cursorKey, reason: \"invalid-value\" });\n }\n const baseWhere = composeWhere(params.filter, params.withDeleted);\n\n const ascInQuery = direction === \"forward\" ? order === \"asc\" : order === \"desc\";\n const past = ascInQuery ? \"$gt\" : \"$lt\";\n // (k > v) OR (k = v AND _id > i); an _id cursor needs no tie-break.\n const tieBreak = field !== \"_id\";\n const seek: Query | undefined =\n token === undefined\n ? undefined\n : tieBreak\n ? { $or: [{ [field]: { [past]: cursorValue } }, { [field]: cursorValue, _id: { [past]: idValue } }] }\n : { [field]: { [past]: cursorValue } };\n const where: Query = seek ? (Object.keys(baseWhere).length ? { $and: [baseWhere, seek] } : seek) : baseWhere;\n\n // Force-include the cursor field in the projection so next/prev tokens work.\n // `cursorKey` is client-supplied, so under a projection guard this would be\n // a way to read a forbidden field: keep it in the query (pagination needs\n // it) but strip it from the documents we hand back.\n const selected = projection(params.columns);\n // `_id` too: an exact selection carries `_id: 0`, and the token needs it for the tie-break.\n const proj = selected ? { ...selected, [field]: 1, _id: 1 } : undefined;\n // Stripped from the rows afterwards: under a projection guard the cursor / tie-break\n // keys the caller may not see; always the tie-break key added only for the token.\n const picked = (key: string) => selected !== undefined && Boolean((selected as Record<string, unknown>)[key]);\n const hidden =\n selected === undefined\n ? []\n : [field, \"_id\"].filter(key => (guarded && (!permits(key) || !picked(key))) || (key === \"_id\" && key !== field && !picked(key)));\n\n let q: AnyQuery = m\n .find(where, proj)\n .sort(tieBreak ? { [field]: ascInQuery ? 1 : -1, _id: ascInQuery ? 1 : -1 } : { [field]: ascInQuery ? 1 : -1 })\n .limit(limit + 1);\n q = applyPopulate(q, withOf(params.with));\n const rows = (await attachSession(q).lean().exec()) as Record<string, unknown>[];\n\n const page = await cursorPage(rows, {\n limit,\n direction,\n hasCursor: token !== undefined,\n cursorField: field,\n idField: \"_id\",\n secret: runtime.cursorSecret,\n });\n\n // Token values are read above, so the hidden fields can go now.\n if (hidden.length > 0) {\n page.data = page.data.map(row => Object.fromEntries(Object.entries(row).filter(([key]) => !hidden.includes(key))));\n }\n\n return page as CursorResult<never>;\n },\n };\n}\n","import type { AllRows, MutationOptions } from \"@querykitjs/core\";\nimport { clampPageSize, scopeDefaults } from \"@querykitjs/core/internal\";\n\nimport type { FieldKey, Filter, Id, Insert, RepositoryOptions, Row, UpsertOptions } from \"../types\";\nimport { resolveField } from \"../internal/fields\";\nimport type { Query } from \"../internal/where\";\nimport { toArr, type AnyQuery, type RepoContext } from \"./context\";\n\n/** Upserts per `bulkWrite` call in `upsertMany`. */\nconst CHUNK = 1000;\n\n/**\n * Joins the target-field values of one row into a lookup key. NUL never occurs\n * in the string form of a field value, so the parts cannot run together.\n */\nconst KEY_SEPARATOR = String.fromCharCode(0);\n\n/** `create*`, `upsert*`, `update*`, `delete*`, `softDelete`, `restore`. */\nexport function mutateMethods<TDoc>(ctx: RepoContext<TDoc>, config: RepositoryOptions<TDoc>) {\n const { runtime, m, hasDeletedAt, deletedAtPath, forUpdate, composeWhere, mutationWhere, withId, attachSession } = ctx;\n\n /** At most this many rows back from `returning: { limit }` (the cursor/infinite caps). */\n const returningLimit = (returning: { limit: number }): number => clampPageSize(returning.limit, runtime.defaultLimit, runtime.maxLimit);\n\n /** Apply scope defaults to insert values — scope wins (can't be overridden). */\n const forInsert = (values: object): Record<string, unknown> => ({\n ...scopeDefaults(config.scope as Record<string, unknown> | undefined),\n ...values,\n ...scopeDefaults(config.scope as Record<string, unknown> | undefined),\n });\n\n /** Build the `{filter, update}` for an upsert (target → filter, rest → $set/$setOnInsert). */\n const buildUpsert = (values: Insert<TDoc>, options: UpsertOptions<TDoc>) => {\n const targetKeys = toArr(options.target) as string[];\n const inserted = forInsert(values);\n const filter: Record<string, unknown> = {};\n for (const key of targetKeys) {\n const field = resolveField(m, key);\n if (!field) throw new Error(`upsert: unknown target field \"${key}\".`);\n filter[field] = inserted[key];\n }\n // $set (applied on insert + conflict) defaults to values minus target keys.\n const set: Record<string, unknown> = options.set\n ? { ...(options.set as Record<string, unknown>) }\n : Object.fromEntries(Object.entries(inserted).filter(([k]) => !targetKeys.includes(k)));\n // $setOnInsert (insert only) = remaining non-target values not already in $set.\n const setOnInsert = Object.fromEntries(Object.entries(inserted).filter(([k]) => !targetKeys.includes(k) && !(k in set)));\n const update: Record<string, unknown> = {};\n if (Object.keys(set).length) update.$set = set;\n if (Object.keys(setOnInsert).length) update.$setOnInsert = setOnInsert;\n return { filter, update };\n };\n\n /** `findOneAndUpdate(where, patch)` → the updated document or `undefined`. */\n const updateOne = async (where: Query, patch: object) => {\n const q: AnyQuery = m.findOneAndUpdate(where, patch, { returnDocument: \"after\" });\n const row = await attachSession(q).lean().exec();\n return (row ?? undefined) as Row<TDoc> | undefined;\n };\n\n return {\n async create(values: Insert<TDoc>) {\n const [doc] = await m.create([forInsert(values)], { session: runtime.getSession() });\n return doc!.toObject() as Row<TDoc>;\n },\n\n async createMany(values: Insert<TDoc>[]) {\n if (values.length === 0) return [];\n const docs = await m.insertMany(values.map(forInsert), { session: runtime.getSession() });\n return docs.map((d: { toObject: () => unknown }) => d.toObject()) as Row<TDoc>[];\n },\n\n async upsert(values: Insert<TDoc>, options: UpsertOptions<TDoc>) {\n const { filter, update } = buildUpsert(values, options);\n const q: AnyQuery = m.findOneAndUpdate(filter, update, { returnDocument: \"after\", upsert: true });\n return (await attachSession(q).lean().exec()) as Row<TDoc>;\n },\n\n async upsertMany(values: Insert<TDoc>[], options: UpsertOptions<TDoc>) {\n if (values.length === 0) return [];\n const entries = values.map(v => buildUpsert(v, options)); // input order preserved\n for (let i = 0; i < entries.length; i += CHUNK) {\n const ops = entries.slice(i, i + CHUNK).map(e => ({ updateOne: { filter: e.filter, update: e.update, upsert: true } }));\n await m.bulkWrite(ops, { session: runtime.getSession() });\n }\n // Re-fetch affected rows and return them in INPUT order (matches drizzle's\n // `.returning()`), keyed by the resolved target field(s).\n const rows = (await attachSession(m.find({ $or: entries.map(e => e.filter) }))\n .lean()\n .exec()) as Record<string, unknown>[];\n const targetFields = (toArr(options.target) as string[]).map(k => resolveField(m, k)).filter((f): f is string => Boolean(f));\n const keyOf = (o: Record<string, unknown>): string => targetFields.map(f => String(o[f])).join(KEY_SEPARATOR);\n const byKey = new Map(rows.map(r => [keyOf(r), r]));\n return entries.map(e => byKey.get(keyOf(e.filter))).filter((r): r is Record<string, unknown> => Boolean(r)) as Row<TDoc>[];\n },\n\n updateById(id: Id, patch: Partial<Insert<TDoc>>, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n return updateOne(composeWhere(withId(undefined, idKey as string, id)), forUpdate(patch));\n },\n\n async updateWhere(filter: Filter<TDoc> | AllRows, patch: Partial<Insert<TDoc>>, options: MutationOptions = {}) {\n // Task 013: one updateMany with the filter — no read before the write.\n const where = mutationWhere(filter, \"updateWhere\");\n const { matchedCount: count } = (await attachSession(m.updateMany(where, forUpdate(patch))).exec()) as { matchedCount: number };\n if (!options.returning) return { count };\n // Mongo has no multi-document \"update and return\": read right after, same filter (not atomic, README).\n const rows = (await attachSession(m.find(where).limit(returningLimit(options.returning)))\n .lean()\n .exec()) as Row<TDoc>[];\n return { count, rows };\n },\n\n async deleteById(id: Id, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n const where = composeWhere(withId(undefined, idKey as string, id));\n const row = await attachSession(m.findOneAndDelete(where)).lean().exec();\n return (row ?? undefined) as Row<TDoc> | undefined;\n },\n\n async deleteWhere(filter: Filter<TDoc> | AllRows, options: MutationOptions = {}) {\n const where = mutationWhere(filter, \"deleteWhere\");\n // The rows are read just before the delete (not atomic, README).\n const rows = options.returning\n ? ((await attachSession(m.find(where).limit(returningLimit(options.returning)))\n .lean()\n .exec()) as Row<TDoc>[])\n : undefined;\n const { deletedCount: count } = (await attachSession(m.deleteMany(where)).exec()) as { deletedCount: number };\n return rows ? { count, rows } : { count };\n },\n\n async softDelete(id: Id, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n if (!hasDeletedAt) throw new Error(\"softDelete: schema has no deletedAt path.\");\n return updateOne(composeWhere(withId(undefined, idKey as string, id), false), forUpdate({ [deletedAtPath]: new Date() }));\n },\n\n async restore(id: Id, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n if (!hasDeletedAt) throw new Error(\"restore: schema has no deletedAt path.\");\n return updateOne(composeWhere(withId(undefined, idKey as string, id), true), forUpdate({ [deletedAtPath]: null }));\n },\n };\n}\n","import { clampOffset, clampPage, clampPageSize, infinitePage, offsetMeta, offsetPageWithoutTotal } from \"@querykitjs/core/internal\";\n\nimport type { ByIdParams, Filter, Id, InfiniteParams, InfiniteResult, OffsetParams, OffsetResult, QueryParams } from \"../types\";\nimport type { AnyQuery, RepoContext } from \"./context\";\n\n/** `findAll`, `findOne`, `findById`, `findList`, `findInfinite`, `count`, `exists`. */\nexport function readMethods<TDoc>(ctx: RepoContext<TDoc>) {\n const { runtime, m, policy, projection, sortSpec, withOf, composeWhere, withId, applyPopulate, attachSession, runFind, countWhere } = ctx;\n\n /** The client's filter and sort, checked before the query is built. */\n const checked = (params: QueryParams<TDoc>) => {\n policy.checkFilter(params.filter);\n policy.checkSort(params.sort as never);\n };\n\n return {\n async findAll(params: QueryParams<TDoc> = {}) {\n checked(params);\n const rows = await runFind(composeWhere(params.filter, params.withDeleted), {\n sort: sortSpec(params.sort),\n columns: params.columns,\n with: withOf(params.with),\n });\n return rows as never;\n },\n\n async findOne(params: QueryParams<TDoc> = {}) {\n checked(params);\n let q: AnyQuery = m.findOne(composeWhere(params.filter, params.withDeleted), projection(params.columns));\n q = q.sort(sortSpec(params.sort));\n q = applyPopulate(q, withOf(params.with));\n const row = await attachSession(q).lean().exec();\n return (row ?? undefined) as never;\n },\n\n async findById(id: Id, params: ByIdParams<TDoc> = {}) {\n const { idKey = \"id\", filter, columns, with: withRel } = params;\n // Only the client's filter: `idKey` is the server's own choice.\n policy.checkFilter(filter);\n let q: AnyQuery = m.findOne(composeWhere(withId(filter, idKey as string, id), params.withDeleted), projection(columns));\n q = applyPopulate(q, withRel);\n const row = await attachSession(q).lean().exec();\n return (row ?? undefined) as never;\n },\n\n async findList(params: OffsetParams<TDoc> = {}) {\n checked(params);\n const page = clampPage(params.page);\n const perPage = clampPageSize(params.perPage, runtime.defaultPerPage, runtime.maxPerPage);\n policy.checkPage({ page, perPage });\n const where = composeWhere(params.filter, params.withDeleted);\n const rows = (limit: number) =>\n runFind(where, { sort: sortSpec(params.sort), columns: params.columns, with: withOf(params.with), limit, skip: (page - 1) * perPage });\n\n // Task 013: no count — one extra row tells whether a next page exists.\n if (params.withTotal === false) return offsetPageWithoutTotal(await rows(perPage + 1), page, perPage) as OffsetResult<never>;\n const [data, totalItems] = await Promise.all([rows(perPage), countWhere(where)]);\n return { data, meta: offsetMeta(page, perPage, totalItems) } as OffsetResult<never>;\n },\n\n async findInfinite(params: InfiniteParams<TDoc> = {}) {\n const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);\n const offset = clampOffset(params.offset);\n checked(params);\n policy.checkPage({ offset });\n\n const rows = await runFind(composeWhere(params.filter, params.withDeleted), {\n sort: sortSpec(params.sort),\n columns: params.columns,\n with: withOf(params.with),\n limit: limit + 1,\n skip: offset,\n });\n\n return infinitePage(rows, limit, offset) as InfiniteResult<never>;\n },\n\n async count(filter?: Filter<TDoc>) {\n policy.checkFilter(filter);\n return countWhere(composeWhere(filter));\n },\n\n async exists(filter?: Filter<TDoc>) {\n policy.checkFilter(filter);\n return (await countWhere(composeWhere(filter))) > 0;\n },\n };\n}\n","import type { Model } from \"mongoose\";\n\nimport type { Repository, RepositoryOptions, Scope } from \"../types\";\nimport { aggregateMethods } from \"./aggregate\";\nimport { buildRepoContext, type RepoRuntime } from \"./context\";\nimport { cursorMethods } from \"./cursor\";\nimport { mutateMethods } from \"./mutate\";\nimport { readMethods } from \"./read\";\n\nexport type { RepoRuntime } from \"./context\";\n\n/**\n * Build a model-scoped repository. `runtime` (session getter + defaults) comes\n * from the registry, so this module never touches the connection directly.\n */\nexport function buildRepository<TDoc>(runtime: RepoRuntime, model: Model<TDoc>, config: RepositoryOptions<TDoc> = {}): Repository<TDoc> {\n const ctx = buildRepoContext(runtime, model, config);\n\n const repository = {\n model,\n ...readMethods(ctx),\n ...cursorMethods(ctx),\n ...mutateMethods(ctx, config),\n ...aggregateMethods(ctx),\n\n scoped(scope: Scope<TDoc>) {\n return buildRepository(runtime, model, { ...config, scope: { ...config.scope, ...scope } });\n },\n };\n\n return repository as unknown as Repository<TDoc>;\n}\n","import type { ClientSession, Connection, Model } from \"mongoose\";\nimport { DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_MAX_PER_PAGE, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\nimport { createContextStore } from \"@querykitjs/core/internal\";\n\nimport type { RelationDocs, RelationMap, Registry, RegistryOptions, Repository, RepositoryExtender, RepositoryOptions } from \"./types\";\nimport { buildRepository, type RepoRuntime } from \"./repository\";\n\n/** Default read time limit (task 011): long enough for an indexed page, short enough to stop a COLLSCAN. */\nconst DEFAULT_MAX_TIME_MS = 2000;\n\n/**\n * Create the DB **registry** once. It holds the Mongoose connection (for\n * transactions) and yields a {@link Repository} per model. Transactions flow\n * ambiently via AsyncLocalStorage — repositories used inside\n * `registry.transaction(...)` automatically run on that session.\n *\n * @param connection - the Mongoose `Connection` the models belong to.\n * @param options - `defaultPerPage` (findList) / `defaultLimit` (infinite/cursor);\n * defaults to `@querykitjs/core`'s `DEFAULT_PER_PAGE` / `DEFAULT_LIMIT` (20).\n * @example\n * ```ts\n * const registry = createRegistry(mongoose.connection);\n * const usersRepo = registry.repository(User);\n * ```\n */\nexport function createRegistry(connection: Connection, options: RegistryOptions = {}): Registry {\n const ctx = createContextStore<{ session?: ClientSession }>();\n const runtime: RepoRuntime = {\n getSession: () => ctx.get()?.session,\n defaultPerPage: options.defaultPerPage ?? DEFAULT_PER_PAGE,\n defaultLimit: options.defaultLimit ?? DEFAULT_LIMIT,\n maxPerPage: options.maxPerPage ?? DEFAULT_MAX_PER_PAGE,\n maxLimit: options.maxLimit ?? DEFAULT_MAX_LIMIT,\n strict: options.strict ?? false,\n onSkippedCondition: options.onSkippedCondition,\n limits: options.limits,\n cursorSecret: options.cursorSecret,\n timestamps: options.timestamps,\n maxTimeMS: options.maxTimeMS ?? DEFAULT_MAX_TIME_MS,\n };\n\n function repository<TDoc>(model: Model<TDoc>): Repository<TDoc>;\n function repository<TDoc, TExt extends Record<string, unknown>>(\n model: Model<TDoc>,\n extend: RepositoryExtender<TDoc, Record<never, never>, TExt>,\n ): Repository<TDoc> & TExt;\n function repository<TDoc, TRel extends RelationMap>(model: Model<TDoc>, options: RepositoryOptions<TDoc, TRel>): Repository<TDoc, RelationDocs<TRel>>;\n function repository<TDoc, TRel extends RelationMap, TExt extends Record<string, unknown>>(\n model: Model<TDoc>,\n options: RepositoryOptions<TDoc, TRel>,\n extend: RepositoryExtender<TDoc, RelationDocs<TRel>, TExt>,\n ): Repository<TDoc, RelationDocs<TRel>> & TExt;\n function repository<TDoc, TRel extends RelationMap, TExt extends Record<string, unknown>>(\n model: Model<TDoc>,\n arg2?: RepositoryOptions<TDoc, TRel> | RepositoryExtender<TDoc, RelationDocs<TRel>, TExt>,\n arg3?: RepositoryExtender<TDoc, RelationDocs<TRel>, TExt>,\n ) {\n // 2nd arg is either the options object or the extender fn (same dispatch as\n // the drizzle-pg adapter, so both registries read identically).\n // `relations` is type-only (it drives `with` inference); `scope` and the\n // projection guards are runtime and must reach buildRepository — before this\n // they were silently dropped, so `forcedColumns` had no effect.\n const repoOptions = typeof arg2 === \"function\" ? undefined : arg2;\n const extend = typeof arg2 === \"function\" ? arg2 : arg3;\n const base = buildRepository(runtime, model, repoOptions) as unknown as Repository<TDoc, RelationDocs<TRel>>;\n return extend ? { ...base, ...extend(base) } : base;\n }\n\n const transaction = async <T>(fn: () => Promise<T>): Promise<T> => {\n // Already inside a transaction (Mongo has no nested tx/savepoints) → reuse it.\n if (ctx.get()?.session) return fn();\n\n const session = await connection.startSession();\n try {\n let result!: T;\n await session.withTransaction(async () => {\n result = await ctx.run({ session }, fn);\n });\n return result;\n } finally {\n await session.endSession();\n }\n };\n\n return { repository, transaction };\n}\n","import { createFilters as coreCreateFilters, f } from \"@querykitjs/core\";\n\nimport type { FieldKey, RawFilter } from \"./types\";\n\n/**\n * Typed, ergonomic filter builders for a document type (field-name autocomplete).\n * A thin wrapper over `@querykitjs/core`'s builder — the key type is the model's\n * field key, the raw escape-hatch is a native Mongo `QueryFilter`.\n *\n * @example\n * ```ts\n * const uf = createFilters<IUser>();\n * await usersRepo.findAll({ filter: uf.and(uf.eq(\"status\", \"active\"), uf.gte(\"age\", 18)) });\n * ```\n */\n// The explicit return type keeps `dist/index.d.ts` free of an inferred expansion:\n// inferred, the alias printed as `RawFilter<_TDoc>` — a name not in scope there.\nexport function createFilters<TDoc>(): ReturnType<typeof coreCreateFilters<FieldKey<TDoc>, RawFilter<TDoc>>> {\n return coreCreateFilters<FieldKey<TDoc>, RawFilter<TDoc>>();\n}\n\n/** Untyped filter helpers for quick use. */\nexport { f };\n"]}
1
+ {"version":3,"sources":["../src/internal/fields.ts","../src/internal/order-by.ts","../src/internal/coerce.ts","../src/internal/operators.ts","../src/internal/where.ts","../src/repository/projection.ts","../src/repository/context.ts","../src/repository/aggregate.ts","../src/repository/cursor.ts","../src/repository/mutate.ts","../src/repository/read.ts","../src/repository/index.ts","../src/registry.ts","../src/filters.ts"],"names":["resolveField","model","key","name","hasPath","path","buildSort","sort","diag","createdAt","spec","item","normalizeSort","field","reportSkip","buildListSort","TEXT_OPERATORS","TEXT_FILTER_OPERATORS","INVALID_VALUE","isTextOperator","operator","isDatePath","castForPath","value","CAST_INSTANCES","cast","enumValues","coerceCondition","items","esc","s","sqlLikeToRegex","pattern","out","ch","asTuple","v","operators","isObject","n","isFieldCondition","combine","kind","parts","valid","p","buildCondition","cond","build","fragment","buildNode","node","buildFalse","isRaw","QueryKitError","inner","op","buildWhere","filter","c","truthyKeys","selection","on","buildProjection","m","config","forcedKeys","allowed","permits","intersectAllowed","requested","hit","columns","keys","proj","includesId","k","buildRepoContext","runtime","deletedAtPath","hasDeletedAt","createdAtConfigured","createdAtPath","timestampsOn","stampUpdatedAt","forUpdate","patch","scopeWhere","buildScopeWhere","sortSpec","listSortSpec","withOf","checkWith","WITH_DIALECT","combineWhere","userWhere","withDeleted","composeWhere","userFilter","withId","idKey","id","idCondition","guards","maxTimeMS","attachSession","q","READ_OPS","timeLimit","runFind","where","opts","applyPopulate","countWhere","policy","resolvePolicy","method","isAllRows","isEmptyFilter","refuseEmptyFilter","withRel","toArr","conditions","scopeConditions","condition","isTimeLimitError","error","source","exec","args","QueryKitTimeoutError","aggregateMethods","ctx","aggregable","castMatch","rawMatch","groupKeys","match","group","addAgg","prefix","agg","session","rows","_id","rest","cursorMethods","guarded","projection","params","limit","clampPageSize","cursorKey","order","direction","token","decodeCursorToken","cursorValue","idValue","baseWhere","ascInQuery","past","tieBreak","seek","selected","picked","hidden","page","cursorPage","row","CHUNK","KEY_SEPARATOR","mutateMethods","mutationWhere","returningLimit","returning","forInsert","values","scopeDefaults","buildUpsert","options","targetKeys","inserted","set","setOnInsert","update","updateOne","doc","d","entries","i","ops","e","targetFields","f","keyOf","o","byKey","r","count","readMethods","checked","clampPage","perPage","offsetPageWithoutTotal","data","totalItems","offsetMeta","offset","clampOffset","infinitePage","buildRepository","scope","DEFAULT_MAX_TIME_MS","createRegistry","connection","createContextStore","DEFAULT_PER_PAGE","DEFAULT_LIMIT","DEFAULT_MAX_PER_PAGE","DEFAULT_MAX_LIMIT","repository","arg2","arg3","repoOptions","extend","base","fn","result","createFilters","coreCreateFilters"],"mappings":"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","file":"index.js","sourcesContent":["import type { Model } from \"mongoose\";\n\n/** Any Mongoose model, regardless of its document type. */\nexport type AnyModel = Model<any>;\n\n/**\n * Map a public field key to a real Mongoose schema path. `\"id\"` is aliased to\n * `\"_id\"` so the wire contract stays identical across adapters. Unknown fields\n * return `undefined` (the caller skips them silently, like the Drizzle adapter).\n */\nexport function resolveField(model: AnyModel, key: string): string | undefined {\n const name = key === \"id\" ? \"_id\" : key;\n if (name === \"_id\") return \"_id\";\n return model.schema.path(name) ? name : undefined;\n}\n\n/** Whether the schema has a given path (e.g. `deletedAt`, `updatedAt`). */\nexport function hasPath(model: AnyModel, path: string): boolean {\n return Boolean(model.schema.path(path));\n}\n\n/**\n * Cast a raw (decoded cursor) value to the field's schema type so keyset\n * comparisons (`$gt`/`$lt`) work — e.g. a hex string → `ObjectId`, an ISO\n * string → `Date`. Falls back to the raw value if casting fails.\n */\nexport function castValue(model: AnyModel, field: string, value: unknown): unknown {\n const path = model.schema.path(field);\n if (!path) return value;\n try {\n return path.cast(value);\n } catch {\n return value;\n }\n}\n","import { normalizeSort, reportSkip, type Diagnostics } from \"@querykitjs/core/internal\";\n\nimport type { Sort } from \"../types\";\nimport { resolveField, hasPath, type AnyModel } from \"./fields\";\n\n/** A Mongo sort spec, e.g. `{ name: 1, createdAt: -1 }`. */\nexport type SortSpec = Record<string, 1 | -1>;\n\n/**\n * Build a Mongo sort spec from the sort input. Unknown fields are skipped; when\n * nothing valid remains, defaults to newest-first (`createdAt` desc, else `_id`).\n */\nexport function buildSort(\n model: AnyModel,\n sort?: Sort,\n diag?: Diagnostics,\n createdAt: string | undefined = hasPath(model, \"createdAt\") ? \"createdAt\" : undefined,\n): SortSpec {\n const spec: SortSpec = {};\n for (const item of normalizeSort(sort, diag)) {\n const field = resolveField(model, item.key);\n if (field) spec[field] = item.direction === \"desc\" ? -1 : 1;\n // An unknown sort key falls back to the default order, so the list looks\n // \"unsorted\" to the caller with nothing in the log to explain it.\n else reportSkip(diag, { site: \"sort\", key: item.key, reason: \"unknown-key\" });\n }\n if (Object.keys(spec).length === 0) {\n if (createdAt) spec[createdAt] = -1;\n else spec._id = -1;\n }\n return spec;\n}\n\n/**\n * `buildSort` for a paged read: `_id` ends the order, in the first key's direction, so equal\n * values cannot repeat or skip a document between pages.\n */\nexport function buildListSort(model: AnyModel, sort?: Sort, diag?: Diagnostics, createdAt?: string): SortSpec {\n const spec = buildSort(model, sort, diag, createdAt);\n return \"_id\" in spec ? spec : { ...spec, _id: Object.values(spec)[0]! };\n}\n","import { TEXT_FILTER_OPERATORS } from \"@querykitjs/core\";\n\nimport type { FilterOperator, FilterValue } from \"../types\";\nimport type { AnyModel } from \"./fields\";\n\n/**\n * Operators whose value is a text pattern — never cast. A `$regex` fragment must\n * keep the caller's raw string even on a `Date` path. The list lives in\n * `@querykitjs/core` so both adapters share it.\n */\nconst TEXT_OPERATORS: ReadonlySet<FilterOperator> = new Set(TEXT_FILTER_OPERATORS);\n\n/**\n * Returned when a value cannot be represented in the path's type (e.g. the\n * string `\"not-a-date\"` on a `Date` path). Callers drop the condition — the same\n * contract `operators.ts` already uses for a non-array `in` value, and the same\n * symbol-based contract the drizzle adapter uses.\n */\nexport const INVALID_VALUE = Symbol(\"querykit.invalid-value\");\n\n/** Whether this operator compares against a text pattern (`like`, `contains`, …). */\nexport const isTextOperator = (operator: FilterOperator): boolean => TEXT_OPERATORS.has(operator);\n\n/** Whether a schema path stores a `Date` (the only type both adapters cast locally). */\nexport function isDatePath(model: AnyModel, field: string): boolean {\n return model.schema.path(field)?.instance === \"Date\";\n}\n\n/**\n * Cast a single wire value to the path's type, or report it as uncastable.\n *\n * Scoped to `Date` paths **on purpose**, so both adapters behave identically:\n * drizzle can only judge columns it maps through JS (`dataType: \"date\"`) and\n * leaves everything else to Postgres, so mongoose likewise leaves other paths to\n * its own query cast. Mongoose casts these values itself when the query runs;\n * doing it here keeps the behaviour pinned by tests instead of relying on\n * mongoose internals, and turns a cryptic `CastError` 500 into a skipped\n * condition (observable via `onSkippedCondition`).\n */\nexport function castForPath(model: AnyModel, field: string, value: unknown): unknown | typeof INVALID_VALUE {\n const path = model.schema.path(field);\n if (!path || value === null || value === undefined || !CAST_INSTANCES.has(path.instance)) return value;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? INVALID_VALUE : value;\n try {\n const cast = path.cast(value) as unknown;\n if (cast instanceof Date) return Number.isNaN(cast.getTime()) ? INVALID_VALUE : cast;\n if (cast === null || cast === undefined) return INVALID_VALUE;\n // `cast` does not check an enum; a value outside it can never match.\n const enumValues = (path as unknown as { enumValues?: readonly unknown[] }).enumValues;\n if (path.instance === \"String\" && enumValues && enumValues.length > 0 && !enumValues.includes(cast)) return INVALID_VALUE;\n return cast;\n } catch {\n return INVALID_VALUE;\n }\n}\n\n/**\n * Paths cast here: a value their type rejects — `age = \"abc\"`, a\n * malformed ObjectId, `\"maybe\"` for a Boolean, a String outside its enum — is\n * invalid-value before the query runs, instead of a CastError 500 at exec.\n */\nconst CAST_INSTANCES: ReadonlySet<string> = new Set([\"Date\", \"Number\", \"Boolean\", \"ObjectId\", \"String\", \"Decimal128\"]);\n\n/**\n * Bring one condition's value in line with the path's type before it reaches an\n * operator builder — the mongoose counterpart of the drizzle adapter's\n * `coerceCondition`, with the same signature shape, the same text-operator\n * carve-out and the same all-or-nothing rule for arrays/tuples.\n */\nexport function coerceCondition(\n model: AnyModel,\n field: string,\n operator: FilterOperator,\n value: FilterValue | undefined,\n): FilterValue | undefined | typeof INVALID_VALUE {\n if (value === undefined || TEXT_OPERATORS.has(operator)) return value;\n\n if (Array.isArray(value)) {\n const items: unknown[] = [];\n for (const item of value) {\n const cast = castForPath(model, field, item);\n if (cast === INVALID_VALUE) return INVALID_VALUE;\n items.push(cast);\n }\n return items as FilterValue;\n }\n\n const cast = castForPath(model, field, value);\n return cast === INVALID_VALUE ? INVALID_VALUE : (cast as FilterValue);\n}\n","import type { FilterOperator, FilterValue } from \"../types\";\n\n/** A field-level Mongo fragment, e.g. `{ $gte: 1, $lte: 9 }`. `undefined` = drop. */\ntype Fragment = Record<string, unknown> | undefined;\ntype Builder = (value: FilterValue | undefined) => Fragment;\n\n/** Escape a literal string for use inside a regex (contains/startsWith/endsWith). */\nconst esc = (s: unknown): string => String(s ?? \"\").replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Translate a SQL LIKE pattern (`%` → any, `_` → one char) to an anchored regex. A run of `%` is one `.*`. */\nconst sqlLikeToRegex = (pattern: unknown): string => {\n let out = \"\";\n for (const ch of String(pattern ?? \"\")) {\n if (ch === \"%\") {\n if (!out.endsWith(\".*\")) out += \".*\";\n } else if (ch === \"_\") out += \".\";\n else out += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return `^${out}$`;\n};\n\nconst asTuple = (v: FilterValue | undefined): [unknown, unknown] | undefined => (Array.isArray(v) && v.length === 2 ? [v[0], v[1]] : undefined);\n\n/**\n * Operator → Mongo fragment map. Mirrors the Drizzle adapter's semantics: both\n * token (`\"%_%\"`) and name-alias (`\"contains\"`) forms are handled;\n * `contains/startsWith/endsWith` are case-insensitive; invalid values (non-array\n * `in`, non-2-tuple `between`) drop the condition (`undefined`).\n */\nexport const operators: Record<FilterOperator, Builder> = {\n \"=\": v => ({ $eq: v }),\n eq: v => ({ $eq: v }),\n // SQL three-valued logic: inequality/negation excludes NULL (and missing) rows,\n // matching drizzle-pg. `$nin: [v, null]` = \"not v AND not null\".\n \"!=\": v => ({ $nin: [v, null] }),\n ne: v => ({ $nin: [v, null] }),\n \">\": v => ({ $gt: v }),\n gt: v => ({ $gt: v }),\n \">=\": v => ({ $gte: v }),\n gte: v => ({ $gte: v }),\n \"<\": v => ({ $lt: v }),\n lt: v => ({ $lt: v }),\n \"<=\": v => ({ $lte: v }),\n lte: v => ({ $lte: v }),\n\n contains: v => ({ $regex: esc(v), $options: \"i\" }),\n \"%_%\": v => ({ $regex: esc(v), $options: \"i\" }),\n startsWith: v => ({ $regex: `^${esc(v)}`, $options: \"i\" }),\n \"%_\": v => ({ $regex: `^${esc(v)}`, $options: \"i\" }),\n endsWith: v => ({ $regex: `${esc(v)}$`, $options: \"i\" }),\n \"_%\": v => ({ $regex: `${esc(v)}$`, $options: \"i\" }),\n\n like: v => ({ $regex: sqlLikeToRegex(v) }),\n ilike: v => ({ $regex: sqlLikeToRegex(v), $options: \"i\" }),\n // negation also excludes NULL/missing (SQL `NOT LIKE` semantics).\n notLike: v => ({ $not: { $regex: sqlLikeToRegex(v) }, $ne: null }),\n\n in: v => (Array.isArray(v) ? { $in: v } : undefined),\n notIn: v => (Array.isArray(v) ? { $nin: [...v, null] } : undefined),\n\n between: v => {\n const t = asTuple(v);\n return t ? { $gte: t[0], $lte: t[1] } : undefined;\n },\n notBetween: v => {\n const t = asTuple(v);\n return t ? { $not: { $gte: t[0], $lte: t[1] }, $ne: null } : undefined;\n },\n\n isNull: () => ({ $eq: null }),\n isNotNull: () => ({ $ne: null }),\n};\n","import type { Filter, FieldCondition, FilterNode } from \"../types\";\nimport { coerceCondition, INVALID_VALUE, isDatePath, isTextOperator } from \"./coerce\";\nimport { QueryKitError } from \"@querykitjs/core\";\nimport { isRaw, reportSkip, type Diagnostics } from \"@querykitjs/core/internal\";\nimport { operators } from \"./operators\";\nimport { resolveField, type AnyModel } from \"./fields\";\n\n/** A Mongo filter query object. */\nexport type Query = Record<string, unknown>;\n\nconst isObject = (n: unknown): n is Record<string, unknown> => typeof n === \"object\" && n !== null;\n\nconst isFieldCondition = (n: unknown): n is FieldCondition => isObject(n) && \"key\" in n && !(\"and\" in n) && !(\"or\" in n) && !(\"not\" in n);\n\n/** Combine parts (dropping `undefined`): 0 → undefined, 1 → the part, else `$and`/`$or`. */\nfunction combine(kind: \"$and\" | \"$or\", parts: (Query | undefined)[]): Query | undefined {\n const valid = parts.filter((p): p is Query => p !== undefined);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n return { [kind]: valid };\n}\n\nfunction buildCondition(model: AnyModel, cond: FieldCondition, diag?: Diagnostics): Query | undefined {\n const operator = cond.operation ?? \"=\";\n const build = operators[operator];\n if (!build) throw new Error(`Unsupported filter operator: \"${operator}\"`);\n\n const field = resolveField(model, cond.key);\n if (!field) {\n // Unknown field → skip. Usually a typo, and a dropped filter widens the\n // result set rather than narrowing it, so it is worth reporting.\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"unknown-key\" });\n return undefined;\n }\n\n // A text pattern cannot be matched against a Date path: Mongo rejects\n // `$regex`/`$options` on a Date (\"Can't use $options with Date\"), which used to\n // surface as a 500. The SQL adapters skip a text pattern on a non-text field too\n // (R11), reported via `onSkippedCondition` instead of a stack trace.\n if (isTextOperator(operator) && isDatePath(model, field)) {\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n\n // Cast wire (JSON) values to the path's type first, matching the drizzle\n // adapter — text-pattern operators keep their raw string.\n const value = coerceCondition(model, field, operator, cond.value);\n if (value === INVALID_VALUE) {\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n\n const fragment = build(value);\n if (fragment === undefined) {\n // The operator rejected the value shape (a non-array `in`, a non-2-tuple\n // `between`) — same class of problem as an uncastable value.\n reportSkip(diag, { site: \"filter\", key: cond.key, operation: operator, reason: \"invalid-value\" });\n return undefined;\n }\n return { [field]: fragment };\n}\n\nfunction buildNode(model: AnyModel, node: FilterNode, diag?: Diagnostics): Query | undefined {\n if (isFieldCondition(node)) return buildCondition(model, node, diag);\n if (isObject(node)) {\n if (\"and\" in node)\n return combine(\n \"$and\",\n (node.and as FilterNode[]).map(n => buildNode(model, n, diag)),\n );\n if (\"or\" in node)\n return combine(\n \"$or\",\n (node.or as FilterNode[]).map(n => buildNode(model, n, diag)),\n );\n if (\"not\" in node) return buildFalse(model, node.not as FilterNode, diag);\n // Raw escape hatch — a Mongo filter object, used as-is only when server code\n // branded it with core `raw()` (R19). A plain object can come from a JSON body\n // (`{ $where: … }`), so it is refused whatever `strict` says — mutations included.\n if (isRaw(node)) return node as Query;\n throw new QueryKitError({ source: model.modelName, site: \"filter\", key: Object.keys(node as object)[0] ?? \"\", reason: \"forbidden-key\" });\n }\n return undefined;\n}\n\n/**\n * The rows where `node` is FALSE — SQL three-valued logic, so drizzle-pg and\n * prisma-pg agree. MongoDB's `$nor` is two-valued: it also keeps\n * rows where the predicate is UNKNOWN (a null / missing field). So:\n * `isFalse(and(…))` = `or(isFalse(…))`, `isFalse(or(…))` = `and(isFalse(…))`,\n * `isFalse(not(q))` = `isTrue(q)`, and a comparison is FALSE only on a non-null\n * field. `isNull` / `isNotNull` are two-valued (never UNKNOWN) and need no guard.\n */\nfunction buildFalse(model: AnyModel, node: FilterNode, diag?: Diagnostics): Query | undefined {\n if (isFieldCondition(node)) {\n const inner = buildCondition(model, node, diag);\n if (!inner) return undefined;\n const op = node.operation ?? \"=\";\n const field = op === \"isNull\" || op === \"isNotNull\" ? undefined : resolveField(model, node.key);\n return field ? { $and: [{ [field]: { $ne: null } }, { $nor: [inner] }] } : { $nor: [inner] };\n }\n if (isObject(node)) {\n if (\"and\" in node)\n return combine(\n \"$or\",\n (node.and as FilterNode[]).map(n => buildFalse(model, n, diag)),\n );\n if (\"or\" in node)\n return combine(\n \"$and\",\n (node.or as FilterNode[]).map(n => buildFalse(model, n, diag)),\n );\n if (\"not\" in node) return buildNode(model, node.not as FilterNode, diag);\n }\n // A branded raw node (or a refusal for an unbranded one) — its own truth value.\n const inner = buildNode(model, node, diag);\n return inner ? { $nor: [inner] } : undefined;\n}\n\n/**\n * Translate a filter (tree / node / flat array / raw) into a single Mongo query.\n *\n * `diag` is optional: without it, unresolvable conditions are dropped silently\n * exactly as before; with it they are reported (or, in strict mode, throw).\n */\nexport function buildWhere(model: AnyModel, filter?: Filter, diag?: Diagnostics): Query | undefined {\n if (filter === undefined) return undefined;\n // Array elements go through buildNode (not buildCondition) so a flat array may\n // also hold logical groups / raw nodes (implicit AND), matching drizzle-pg.\n if (Array.isArray(filter))\n return combine(\n \"$and\",\n filter.map(c => buildNode(model, c, diag)),\n );\n return buildNode(model, filter, diag);\n}\n","/**\n * Projection guards. `columns` may arrive straight from the wire, so the safe\n * selection belongs here rather than in every route — the same reasoning as\n * `scope`. Both options are validated once, at build time, so a\n * misconfiguration surfaces in development instead of quietly returning full\n * documents in production. Identical semantics to the drizzle-pg adapter.\n */\nimport type { ColumnSelection, QueryParams, RepositoryOptions } from \"../types\";\nimport { resolveField, type AnyModel } from \"../internal/fields\";\n\nexport type MongoProjection = Record<string, 0 | 1>;\n\nexport interface Projection<TDoc> {\n /** `forcedColumns` or `allowedColumns` is configured. */\n guarded: boolean;\n /** Whether a field may appear in a result at all. */\n permits: (key: string) => boolean;\n /**\n * Column selection → Mongo projection, or undefined when empty. Adds `_id: 0`\n * unless the caller selected `id`/`_id`, so the runtime shape matches the\n * inferred `Pick<...>` type (Mongo otherwise always returns `_id`). Returns\n * undefined (full doc) when no requested column resolves.\n *\n * With `forcedColumns` the caller's selection is ignored outright; with\n * `allowedColumns` it is intersected, and an empty intersection falls back to\n * the allowlist — **never** to the full document.\n */\n projection: (columns?: QueryParams<TDoc>[\"columns\"]) => MongoProjection | undefined;\n}\n\nconst truthyKeys = (selection: object): string[] =>\n Object.entries(selection)\n .filter(([, on]) => on)\n .map(([key]) => key);\n\nexport function buildProjection<TDoc>(m: AnyModel, config: RepositoryOptions<TDoc>): Projection<TDoc> {\n const forcedKeys = config.forcedColumns ? truthyKeys(config.forcedColumns) : undefined;\n if (config.forcedColumns && forcedKeys!.length === 0) {\n throw new Error(\"buildRepository: forcedColumns must select at least one field (an empty selection would return the full document).\");\n }\n\n const allowed = config.allowedColumns ? new Set<string>(config.allowedColumns as readonly string[]) : undefined;\n if (config.allowedColumns && allowed!.size === 0) {\n throw new Error(\"buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full document).\");\n }\n\n const permits = (key: string): boolean => (forcedKeys ? forcedKeys.includes(key) : allowed ? allowed.has(key) : true);\n\n /** Client selection ∩ allowlist; empty intersection → the allowlist itself. */\n const intersectAllowed = (requested: string[]): string[] => {\n const hit = requested.filter(key => allowed!.has(key));\n return hit.length > 0 ? hit : [...allowed!];\n };\n\n const projection = (columns?: QueryParams<TDoc>[\"columns\"]): MongoProjection | undefined => {\n const requested = columns ? truthyKeys(columns as ColumnSelection<TDoc>) : [];\n const keys = forcedKeys ?? (allowed ? intersectAllowed(requested) : requested);\n if (keys.length === 0) return undefined;\n const proj: MongoProjection = {};\n let includesId = false;\n for (const k of keys) {\n const field = resolveField(m, k);\n if (!field) continue;\n proj[field] = 1;\n if (field === \"_id\") includesId = true;\n }\n if (Object.keys(proj).length === 0) return undefined; // all unknown → full doc\n if (!includesId) proj._id = 0; // exclude _id unless explicitly selected (exact columns, like drizzle)\n return proj;\n };\n\n return { guarded: Boolean(forcedKeys ?? allowed), permits, projection };\n}\n","import type { Relations } from \"@querykitjs/core\";\nimport type { ClientSession, Model } from \"mongoose\";\nimport { QueryKitError, QueryKitTimeoutError, type QueryLimits, type SkippedCondition } from \"@querykitjs/core\";\nimport {\n checkWith,\n type Diagnostics,\n isAllRows,\n isEmptyFilter,\n type Policy,\n refuseEmptyFilter,\n resolvePolicy,\n scopeConditions,\n type WithDialect,\n} from \"@querykitjs/core/internal\";\n\nimport type { FieldCondition, FieldKey, Filter, Id, QueryParams, RepositoryOptions, Sort } from \"../types\";\nimport { hasPath, resolveField, type AnyModel } from \"../internal/fields\";\nimport { buildListSort, buildSort } from \"../internal/order-by\";\nimport { buildWhere, type Query } from \"../internal/where\";\nimport { buildProjection, type Projection } from \"./projection\";\n\n/** Registry-level runtime injected into every repository. */\nexport interface RepoRuntime {\n /** Active transaction session, if any. */\n getSession: () => ClientSession | undefined;\n defaultPerPage: number;\n defaultLimit: number;\n /** Upper bound for `perPage`, applied even when validation was bypassed. */\n maxPerPage: number;\n /** Upper bound for `limit` (`findInfinite`/`findCursor`). */\n maxLimit: number;\n /** Throw `QueryKitError` instead of dropping an unresolvable condition. */\n strict: boolean;\n /** Called for every dropped condition (also when `strict` is off). */\n onSkippedCondition?: (info: SkippedCondition) => void;\n /** Registry-level request limits; a repository's own `limits` win. */\n limits?: Partial<QueryLimits>;\n /** Read time limit in ms; a repository's own `maxTimeMS` wins. */\n maxTimeMS: number;\n /** Signs cursor tokens. */\n cursorSecret?: string;\n /** createdAt / deletedAt field names; default `createdAt`, `deletedAt`. */\n timestamps?: { createdAt?: string; deletedAt?: string };\n}\n\n// Mongoose's Query generics are extremely deep; we drive queries untyped\n// internally (the public Repository surface stays fully typed) and cast results.\n\nexport type AnyQuery = any;\n\nexport interface FindOpts<TDoc> {\n sort?: Record<string, 1 | -1>;\n columns?: QueryParams<TDoc>[\"columns\"];\n with?: QueryParams<TDoc>[\"with\"];\n limit?: number;\n skip?: number;\n}\n\n/**\n * Everything one model's repository methods share: the model, the compiled\n * scope and soft-delete guard, the projection guard and the query helpers.\n * Built once per `buildRepository` call; the method groups (`read`, `cursor`,\n * `aggregate`, `mutate`) only read from it.\n */\nexport interface RepoContext<TDoc> extends Projection<TDoc> {\n runtime: RepoRuntime;\n m: AnyModel;\n diag: Diagnostics;\n hasDeletedAt: boolean;\n /** The soft-delete path (`timestamps.deletedAt`, default `deletedAt`). */\n deletedAtPath: string;\n /** Stamp `updatedAt` when the schema has a manual one (no `timestamps`). */\n forUpdate: <T extends object>(patch: T) => T;\n sortSpec: (sort?: Sort<TDoc>) => Record<string, 1 | -1>;\n /** `sortSpec` of a paged read: `_id` ends the order, so pages cannot overlap. */\n listSortSpec: (sort?: Sort<TDoc>) => Record<string, 1 | -1>;\n /**\n * The client's `with`, checked against `relations` (R21): an unlisted relation,\n * column, filter field or nested relation is `forbidden-key`, `site: \"with\"`. A column list\n * is selected even when the client asks with `true`.\n */\n withOf: (value: unknown) => never;\n /** User filter + scope + soft-delete guard as one Mongo query. */\n /** `filterable` / `sortable` / `limits` — every client-facing read checks through it. */\n policy: Policy;\n /** This repository's read time limit, in ms. */\n maxTimeMS: number;\n composeWhere: (userFilter?: Filter<TDoc>, withDeleted?: boolean) => Query;\n /**\n * The WHERE of `updateWhere` / `deleteWhere`: `{ all: true }` → scope and\n * soft-delete guard only; an empty filter — also one whose every condition was skipped —\n * is `empty-filter`; the filter passes the request policy like a read's.\n */\n mutationWhere: (filter: unknown, method: \"updateWhere\" | \"deleteWhere\") => Query;\n /** `filter AND idKey = id`. */\n withId: (filter: Filter<TDoc> | undefined, idKey: string, id: Id) => Filter<TDoc>;\n /** `.populate()` every truthy `with` entry. */\n applyPopulate: (q: AnyQuery, withRel?: QueryParams<TDoc>[\"with\"]) => AnyQuery;\n /** Join the active transaction session, if any. */\n attachSession: (q: AnyQuery) => AnyQuery;\n runFind: (where: Query, opts: FindOpts<TDoc>) => Promise<unknown[]>;\n countWhere: (where: Query) => Promise<number>;\n}\n\nexport function buildRepoContext<TDoc>(runtime: RepoRuntime, model: Model<TDoc>, config: RepositoryOptions<TDoc>): RepoContext<TDoc> {\n const m = model as AnyModel;\n // The registry's `timestamps` names these paths.\n const deletedAtPath = resolveField(m, runtime.timestamps?.deletedAt ?? \"deletedAt\") ?? \"deletedAt\";\n const hasDeletedAt = hasPath(m, deletedAtPath);\n const createdAtConfigured = runtime.timestamps?.createdAt !== undefined;\n const createdAtPath = resolveField(m, runtime.timestamps?.createdAt ?? \"createdAt\");\n // Mongoose auto-bumps `updatedAt` only when the schema opts into timestamps;\n // for a manual `updatedAt` path we stamp it ourselves so every update path\n // bumps it — matching drizzle-pg's forUpdate.\n const timestampsOn = Boolean((m.schema as { options?: { timestamps?: unknown } }).options?.timestamps);\n const stampUpdatedAt = hasPath(m, \"updatedAt\") && !timestampsOn;\n const forUpdate = <T extends object>(patch: T): T => (stampUpdatedAt ? { ...patch, updatedAt: new Date() } : patch);\n\n const scopeWhere = buildScopeWhere(m, config);\n\n /* Diagnostics channel — built once, threaded into the filter/sort compilers. */\n const diag: Diagnostics = {\n source: m.modelName,\n strict: runtime.strict,\n onSkipped: runtime.onSkippedCondition,\n };\n\n const sortSpec = (sort?: Sort<TDoc>): Record<string, 1 | -1> => buildSort(m, sort as Sort | undefined, diag, createdAtPath);\n const listSortSpec = (sort?: Sort<TDoc>): Record<string, 1 | -1> => buildListSort(m, sort as Sort | undefined, diag, createdAtPath);\n // A bare model (`{ author: User }`) is for typing only and opens nothing (R21).\n const withOf = (value: unknown) => checkWith(value, config.relations as Relations | undefined, WITH_DIALECT, diag.source) as never;\n\n /** An already built user filter + scope + soft-delete guard. */\n const combineWhere = (userWhere: Query | undefined, withDeleted?: boolean): Query => {\n const parts = [userWhere, scopeWhere, hasDeletedAt && !withDeleted ? { [deletedAtPath]: { $eq: null } } : undefined].filter(\n (p): p is Query => p !== undefined,\n );\n if (parts.length === 0) return {};\n if (parts.length === 1) return parts[0]!;\n return { $and: parts };\n };\n const composeWhere = (userFilter?: Filter<TDoc>, withDeleted?: boolean): Query =>\n combineWhere(buildWhere(m, userFilter as Filter | undefined, diag), withDeleted);\n\n const withId = (filter: Filter<TDoc> | undefined, idKey: string, id: Id): Filter<TDoc> => {\n const idCondition: FieldCondition<TDoc> = { key: idKey as FieldKey<TDoc>, operation: \"=\", value: id as never };\n if (!filter) return [idCondition];\n if (Array.isArray(filter)) return [...filter, idCondition];\n return { and: [filter, idCondition] };\n };\n\n const guards = buildProjection(m, config);\n\n const maxTimeMS = config.maxTimeMS ?? runtime.maxTimeMS;\n const attachSession = (q: AnyQuery): AnyQuery => {\n const s = runtime.getSession();\n if (s) q.session(s);\n if (READ_OPS.has((q as unknown as { op?: string }).op ?? \"\")) timeLimit(q, m.modelName, maxTimeMS);\n return q;\n };\n\n const runFind = (where: Query, opts: FindOpts<TDoc>): Promise<unknown[]> => {\n let q: AnyQuery = m.find(where, guards.projection(opts.columns));\n if (opts.sort) q = q.sort(opts.sort);\n if (typeof opts.skip === \"number\") q = q.skip(opts.skip);\n if (typeof opts.limit === \"number\") q = q.limit(opts.limit);\n q = applyPopulate(q, opts.with);\n return attachSession(q).lean().exec() as Promise<unknown[]>;\n };\n\n const countWhere = (where: Query): Promise<number> => attachSession(m.countDocuments(where)).exec() as Promise<number>;\n\n const policy = resolvePolicy({\n source: m.modelName,\n // `id` is `_id` on the wire, like everywhere else in this adapter.\n fieldOf: key => resolveField(m, key),\n primaryKey: \"_id\",\n createdAt: createdAtConfigured ? createdAtPath : (createdAtPath ?? resolveField(m, \"created_at\")),\n filterable: config.filterable as never,\n sortable: config.sortable as readonly string[] | undefined,\n allowedColumns: config.allowedColumns as readonly string[] | undefined,\n forcedColumns: config.forcedColumns as Record<string, unknown> | undefined,\n limits: { ...runtime.limits, ...config.limits },\n });\n\n const mutationWhere = (filter: unknown, method: \"updateWhere\" | \"deleteWhere\"): Query => {\n if (isAllRows(filter)) return combineWhere(undefined);\n if (isEmptyFilter(filter)) refuseEmptyFilter(diag.source, method);\n policy.checkFilter(filter as Filter<TDoc>);\n const userWhere = buildWhere(m, filter as Filter, diag);\n return userWhere === undefined ? refuseEmptyFilter(diag.source, method) : combineWhere(userWhere);\n };\n\n return {\n ...guards,\n policy,\n maxTimeMS,\n runtime,\n m,\n diag,\n hasDeletedAt,\n deletedAtPath,\n forUpdate,\n sortSpec,\n listSortSpec,\n withOf,\n composeWhere,\n mutationWhere,\n withId,\n applyPopulate,\n attachSession,\n runFind,\n countWhere,\n };\n}\n\n/** `.populate()` every truthy `with` entry. */\n/** Populate options: `select`, nested `populate`, `match` (field-checked), `options.limit` / `options.skip`. */\nconst WITH_DIALECT: WithDialect = {\n columns: \"select\",\n nested: \"populate\",\n filters: [\"match\"],\n logical: [\"$and\", \"$or\", \"$nor\"],\n paging: [\"limit\", \"skip\"],\n options: \"options\",\n};\n\nfunction applyPopulate(q: AnyQuery, withRel?: Record<string, unknown>): AnyQuery {\n if (withRel) {\n for (const key of Object.keys(withRel)) {\n const value = withRel[key];\n if (!value) continue;\n // `true` → populate the field; an object → pass through as populate options\n // (`{ author: { select: \"name\" } }` → `.populate({ path, select })`).\n q.populate(typeof value === \"object\" ? { path: key, ...(value as object) } : key);\n }\n }\n return q;\n}\n\n/** `value`, `[value]` or `[]` — for spec fields that take one key or a list. */\nexport const toArr = <T>(v?: T | T[]): T[] => (v === undefined ? [] : Array.isArray(v) ? v : [v]);\n\n/** The scope as a precompiled Mongo query (equality on each field), or `undefined`. */\nfunction buildScopeWhere<TDoc>(m: AnyModel, config: RepositoryOptions<TDoc>): Query | undefined {\n // An equality value or `{ in: [...] }`.\n const conditions = scopeConditions(config.scope as Record<string, unknown> | undefined) as unknown as FieldCondition[];\n // A scope is the server's own RBAC / tenancy filter, so a key that does not\n // resolve must never be dropped: that would silently widen every query on this\n // repository. Fail when it is configured, not per request, and regardless of\n // `strict` — this is a programming error, not bad input.\n for (const condition of conditions) {\n if (!resolveField(m, condition.key)) {\n throw new QueryKitError({ source: m.modelName, site: \"filter\", key: condition.key, reason: \"unknown-key\" });\n }\n }\n // An empty `in` list matches no row (`$in: []`).\n return conditions.length ? buildWhere(m, conditions) : undefined;\n}\n\n/** Reads that get a time limit; writes are never cut off half-way. */\nconst READ_OPS: ReadonlySet<string> = new Set([\"find\", \"findOne\", \"countDocuments\", \"distinct\"]);\n\n/** MongoDB's error for a read past `maxTimeMS` (code 50). */\nexport const isTimeLimitError = (error: unknown): boolean =>\n typeof error === \"object\" &&\n error !== null &&\n ((error as { codeName?: unknown }).codeName === \"MaxTimeMSExpired\" || (error as { code?: unknown }).code === 50);\n\n/** Set `maxTimeMS` on a read and turn a time-limit failure into `QueryKitTimeoutError`. */\nfunction timeLimit(q: AnyQuery, source: string, maxTimeMS: number): void {\n q.maxTimeMS(maxTimeMS);\n const exec = q.exec.bind(q);\n q.exec = (async (...args: unknown[]) => {\n try {\n return await (exec as (...a: unknown[]) => Promise<unknown>)(...args);\n } catch (error) {\n throw isTimeLimitError(error) ? new QueryKitTimeoutError(source, maxTimeMS, { cause: error }) : error;\n }\n }) as typeof q.exec;\n}\n","import { QueryKitTimeoutError } from \"@querykitjs/core\";\nimport { reportSkip } from \"@querykitjs/core/internal\";\n\nimport type { AggregateRow, AggregateSpec } from \"../types\";\nimport { resolveField } from \"../internal/fields\";\nimport { toArr, type RepoContext, isTimeLimitError } from \"./context\";\n\n/** `aggregate` — `$match` + `$group` with `count`/`$sum`/`$avg`/`$min`/`$max`. */\nexport function aggregateMethods<TDoc>(ctx: RepoContext<TDoc>) {\n const { runtime, m, diag, permits, policy, maxTimeMS, composeWhere } = ctx;\n\n // An aggregate spec can also come from a request, and `min(password)` or a\n // `groupBy` on a hidden field leaks just as much as a projection — so the\n // same guard applies here (matching the drizzle-pg adapter).\n const aggregable = (key: string) => {\n const field = permits(key) ? resolveField(m, key) : undefined;\n if (!field) reportSkip(diag, { site: \"aggregate\", key, reason: \"unknown-key\" });\n return field;\n };\n\n /**\n * Aggregate `$match` doesn't auto-cast values the way `find()` does; cast the\n * filter against the schema so wire strings (dates / ObjectIds) become proper\n * BSON types — keeping aggregate filters consistent with reads.\n */\n const castMatch = (rawMatch: Record<string, unknown>): Record<string, unknown> => {\n try {\n const q = m.find(rawMatch);\n q.cast(m);\n return q.getFilter();\n } catch {\n return rawMatch; // fall back to the uncast filter\n }\n };\n\n return {\n async aggregate(spec: AggregateSpec<TDoc>) {\n // `$group` or `$max` on a hidden path reads it as surely as a filter does.\n policy.checkFilter(spec.filter);\n for (const key of [spec.groupBy, spec.sum, spec.avg, spec.min, spec.max].flatMap(value =>\n value === undefined ? [] : Array.isArray(value) ? value : [value],\n ))\n policy.checkAggregateKey(key as string);\n const groupKeys = (toArr(spec.groupBy) as string[]).filter(key => Boolean(aggregable(key)));\n const match = castMatch(composeWhere(spec.filter, spec.withDeleted));\n const groupId = groupKeys.length ? Object.fromEntries(groupKeys.map(k => [k, `$${aggregable(k) ?? k}`])) : null;\n const group: Record<string, unknown> = { _id: groupId };\n if (spec.count) group.count = { $sum: 1 };\n const addAgg = (op: \"$sum\" | \"$avg\" | \"$min\" | \"$max\", keys: string[], prefix: string) => {\n for (const k of keys) {\n const field = aggregable(k);\n if (field) group[`${prefix}_${k}`] = { [op]: `$${field}` };\n }\n };\n addAgg(\"$sum\", toArr(spec.sum) as string[], \"sum\");\n addAgg(\"$avg\", toArr(spec.avg) as string[], \"avg\");\n addAgg(\"$min\", toArr(spec.min) as string[], \"min\");\n addAgg(\"$max\", toArr(spec.max) as string[], \"max\");\n\n let agg = m.aggregate([{ $match: match }, { $group: group }] as never);\n const session = runtime.getSession();\n if (session) agg = agg.session(session);\n agg = agg.option({ maxTimeMS });\n let rows: Record<string, unknown>[];\n try {\n rows = (await agg.exec()) as Record<string, unknown>[];\n } catch (error) {\n throw isTimeLimitError(error) ? new QueryKitTimeoutError(m.modelName, maxTimeMS, { cause: error }) : error;\n }\n // Flatten the group `_id` fields back into each row (matches drizzle's shape).\n return rows.map(({ _id, ...rest }) => ({ ...(typeof _id === \"object\" && _id ? _id : {}), ...rest })) as AggregateRow[];\n },\n };\n}\n","import { QueryKitError } from \"@querykitjs/core\";\nimport { clampPageSize, cursorPage, decodeCursorToken } from \"@querykitjs/core/internal\";\n\nimport type { CursorParams, CursorResult, SortDirection } from \"../types\";\nimport { resolveField } from \"../internal/fields\";\nimport { castForPath, INVALID_VALUE } from \"../internal/coerce\";\nimport type { Query } from \"../internal/where\";\nimport type { AnyQuery, RepoContext } from \"./context\";\n\n/** `findCursor` — keyset pagination on one field. */\nexport function cursorMethods<TDoc>(ctx: RepoContext<TDoc>) {\n const { runtime, m, diag, guarded, permits, projection, policy, withOf, composeWhere, applyPopulate, attachSession } = ctx;\n\n return {\n async findCursor(params: CursorParams<TDoc> = {}) {\n const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);\n const cursorKey = (params.cursorKey ?? \"id\") as string;\n policy.checkFilter(params.filter);\n // The default `id` is the server's choice; a client-sent key must be sortable.\n if (params.cursorKey !== undefined) policy.checkCursorKey(cursorKey);\n const order: SortDirection = params.order ?? \"asc\";\n const direction = params.direction ?? \"forward\";\n\n const field = resolveField(m, cursorKey);\n // Always fatal: without a usable cursor field there is no pagination to\n // fall back to. Reported as a `QueryKitError` so the backend maps it to a\n // 400 the same way as any other bad condition (both adapters agree).\n if (!field) throw new QueryKitError({ source: diag.source, site: \"cursorKey\", key: cursorKey, reason: \"unknown-key\" });\n\n // The token carries the cursor value and _id (tie-break), both cast\n // to their path's type; a token that does not fit is invalid-value.\n const token = await decodeCursorToken(params.cursor, { source: diag.source, secret: runtime.cursorSecret, key: cursorKey });\n const cursorValue = token === undefined ? undefined : castForPath(m, field, token.k);\n const idValue = token === undefined ? undefined : castForPath(m, \"_id\", token.id);\n if (cursorValue === INVALID_VALUE || idValue === INVALID_VALUE) {\n throw new QueryKitError({ source: diag.source, site: \"cursorKey\", key: cursorKey, reason: \"invalid-value\" });\n }\n const baseWhere = composeWhere(params.filter, params.withDeleted);\n\n const ascInQuery = direction === \"forward\" ? order === \"asc\" : order === \"desc\";\n const past = ascInQuery ? \"$gt\" : \"$lt\";\n // (k > v) OR (k = v AND _id > i); an _id cursor needs no tie-break.\n const tieBreak = field !== \"_id\";\n const seek: Query | undefined =\n token === undefined\n ? undefined\n : tieBreak\n ? { $or: [{ [field]: { [past]: cursorValue } }, { [field]: cursorValue, _id: { [past]: idValue } }] }\n : { [field]: { [past]: cursorValue } };\n const where: Query = seek ? (Object.keys(baseWhere).length ? { $and: [baseWhere, seek] } : seek) : baseWhere;\n\n // Force-include the cursor field in the projection so next/prev tokens work.\n // `cursorKey` is client-supplied, so under a projection guard this would be\n // a way to read a forbidden field: keep it in the query (pagination needs\n // it) but strip it from the documents we hand back.\n const selected = projection(params.columns);\n // `_id` too: an exact selection carries `_id: 0`, and the token needs it for the tie-break.\n const proj = selected ? { ...selected, [field]: 1, _id: 1 } : undefined;\n // Stripped from the rows afterwards: under a projection guard the cursor / tie-break\n // keys the caller may not see; always the tie-break key added only for the token.\n const picked = (key: string) => selected !== undefined && Boolean((selected as Record<string, unknown>)[key]);\n const hidden =\n selected === undefined\n ? []\n : [field, \"_id\"].filter(key => (guarded && (!permits(key) || !picked(key))) || (key === \"_id\" && key !== field && !picked(key)));\n\n let q: AnyQuery = m\n .find(where, proj)\n .sort(tieBreak ? { [field]: ascInQuery ? 1 : -1, _id: ascInQuery ? 1 : -1 } : { [field]: ascInQuery ? 1 : -1 })\n .limit(limit + 1);\n q = applyPopulate(q, withOf(params.with));\n const rows = (await attachSession(q).lean().exec()) as Record<string, unknown>[];\n\n const page = await cursorPage(rows, {\n limit,\n direction,\n hasCursor: token !== undefined,\n cursorField: field,\n idField: \"_id\",\n secret: runtime.cursorSecret,\n });\n\n // Token values are read above, so the hidden fields can go now.\n if (hidden.length > 0) {\n page.data = page.data.map(row => Object.fromEntries(Object.entries(row).filter(([key]) => !hidden.includes(key))));\n }\n\n return page as CursorResult<never>;\n },\n };\n}\n","import type { AllRows, MutationOptions } from \"@querykitjs/core\";\nimport { clampPageSize, scopeDefaults } from \"@querykitjs/core/internal\";\n\nimport type { FieldKey, Filter, Id, Insert, RepositoryOptions, Row, UpsertOptions } from \"../types\";\nimport { resolveField } from \"../internal/fields\";\nimport type { Query } from \"../internal/where\";\nimport { toArr, type AnyQuery, type RepoContext } from \"./context\";\n\n/** Upserts per `bulkWrite` call in `upsertMany`. */\nconst CHUNK = 1000;\n\n/**\n * Joins the target-field values of one row into a lookup key. NUL never occurs\n * in the string form of a field value, so the parts cannot run together.\n */\nconst KEY_SEPARATOR = String.fromCharCode(0);\n\n/** `create*`, `upsert*`, `update*`, `delete*`, `softDelete`, `restore`. */\nexport function mutateMethods<TDoc>(ctx: RepoContext<TDoc>, config: RepositoryOptions<TDoc>) {\n const { runtime, m, hasDeletedAt, deletedAtPath, forUpdate, composeWhere, mutationWhere, withId, attachSession } = ctx;\n\n /** At most this many rows back from `returning: { limit }` (the cursor/infinite caps). */\n const returningLimit = (returning: { limit: number }): number => clampPageSize(returning.limit, runtime.defaultLimit, runtime.maxLimit);\n\n /** Apply scope defaults to insert values — scope wins (can't be overridden). */\n const forInsert = (values: object): Record<string, unknown> => ({\n ...scopeDefaults(config.scope as Record<string, unknown> | undefined),\n ...values,\n ...scopeDefaults(config.scope as Record<string, unknown> | undefined),\n });\n\n /** Build the `{filter, update}` for an upsert (target → filter, rest → $set/$setOnInsert). */\n const buildUpsert = (values: Insert<TDoc>, options: UpsertOptions<TDoc>) => {\n const targetKeys = toArr(options.target) as string[];\n const inserted = forInsert(values);\n const filter: Record<string, unknown> = {};\n for (const key of targetKeys) {\n const field = resolveField(m, key);\n if (!field) throw new Error(`upsert: unknown target field \"${key}\".`);\n filter[field] = inserted[key];\n }\n // $set (applied on insert + conflict) defaults to values minus target keys.\n const set: Record<string, unknown> = options.set\n ? { ...(options.set as Record<string, unknown>) }\n : Object.fromEntries(Object.entries(inserted).filter(([k]) => !targetKeys.includes(k)));\n // $setOnInsert (insert only) = remaining non-target values not already in $set.\n const setOnInsert = Object.fromEntries(Object.entries(inserted).filter(([k]) => !targetKeys.includes(k) && !(k in set)));\n const update: Record<string, unknown> = {};\n if (Object.keys(set).length) update.$set = set;\n if (Object.keys(setOnInsert).length) update.$setOnInsert = setOnInsert;\n return { filter, update };\n };\n\n /** `findOneAndUpdate(where, patch)` → the updated document or `undefined`. */\n const updateOne = async (where: Query, patch: object) => {\n const q: AnyQuery = m.findOneAndUpdate(where, patch, { returnDocument: \"after\" });\n const row = await attachSession(q).lean().exec();\n return (row ?? undefined) as Row<TDoc> | undefined;\n };\n\n return {\n async create(values: Insert<TDoc>) {\n const [doc] = await m.create([forInsert(values)], { session: runtime.getSession() });\n return doc!.toObject() as Row<TDoc>;\n },\n\n async createMany(values: Insert<TDoc>[]) {\n if (values.length === 0) return [];\n const docs = await m.insertMany(values.map(forInsert), { session: runtime.getSession() });\n return docs.map((d: { toObject: () => unknown }) => d.toObject()) as Row<TDoc>[];\n },\n\n async upsert(values: Insert<TDoc>, options: UpsertOptions<TDoc>) {\n const { filter, update } = buildUpsert(values, options);\n const q: AnyQuery = m.findOneAndUpdate(filter, update, { returnDocument: \"after\", upsert: true });\n return (await attachSession(q).lean().exec()) as Row<TDoc>;\n },\n\n async upsertMany(values: Insert<TDoc>[], options: UpsertOptions<TDoc>) {\n if (values.length === 0) return [];\n const entries = values.map(v => buildUpsert(v, options)); // input order preserved\n for (let i = 0; i < entries.length; i += CHUNK) {\n const ops = entries.slice(i, i + CHUNK).map(e => ({ updateOne: { filter: e.filter, update: e.update, upsert: true } }));\n await m.bulkWrite(ops, { session: runtime.getSession() });\n }\n // Re-fetch affected rows and return them in INPUT order (matches drizzle's\n // `.returning()`), keyed by the resolved target field(s).\n const rows = (await attachSession(m.find({ $or: entries.map(e => e.filter) }))\n .lean()\n .exec()) as Record<string, unknown>[];\n const targetFields = (toArr(options.target) as string[]).map(k => resolveField(m, k)).filter((f): f is string => Boolean(f));\n const keyOf = (o: Record<string, unknown>): string => targetFields.map(f => String(o[f])).join(KEY_SEPARATOR);\n const byKey = new Map(rows.map(r => [keyOf(r), r]));\n return entries.map(e => byKey.get(keyOf(e.filter))).filter((r): r is Record<string, unknown> => Boolean(r)) as Row<TDoc>[];\n },\n\n updateById(id: Id, patch: Partial<Insert<TDoc>>, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n return updateOne(composeWhere(withId(undefined, idKey as string, id)), forUpdate(patch));\n },\n\n async updateWhere(filter: Filter<TDoc> | AllRows, patch: Partial<Insert<TDoc>>, options: MutationOptions = {}) {\n // One updateMany with the filter — no read before the write.\n const where = mutationWhere(filter, \"updateWhere\");\n const { matchedCount: count } = (await attachSession(m.updateMany(where, forUpdate(patch))).exec()) as { matchedCount: number };\n if (!options.returning) return { count };\n // Mongo has no multi-document \"update and return\": read right after, same filter (not atomic, README).\n const rows = (await attachSession(m.find(where).limit(returningLimit(options.returning)))\n .lean()\n .exec()) as Row<TDoc>[];\n return { count, rows };\n },\n\n async deleteById(id: Id, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n const where = composeWhere(withId(undefined, idKey as string, id));\n const row = await attachSession(m.findOneAndDelete(where)).lean().exec();\n return (row ?? undefined) as Row<TDoc> | undefined;\n },\n\n async deleteWhere(filter: Filter<TDoc> | AllRows, options: MutationOptions = {}) {\n const where = mutationWhere(filter, \"deleteWhere\");\n // The rows are read just before the delete (not atomic, README).\n const rows = options.returning\n ? ((await attachSession(m.find(where).limit(returningLimit(options.returning)))\n .lean()\n .exec()) as Row<TDoc>[])\n : undefined;\n const { deletedCount: count } = (await attachSession(m.deleteMany(where)).exec()) as { deletedCount: number };\n return rows ? { count, rows } : { count };\n },\n\n async softDelete(id: Id, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n if (!hasDeletedAt) throw new Error(\"softDelete: schema has no deletedAt path.\");\n return updateOne(composeWhere(withId(undefined, idKey as string, id), false), forUpdate({ [deletedAtPath]: new Date() }));\n },\n\n async restore(id: Id, idKey: FieldKey<TDoc> = \"id\" as FieldKey<TDoc>) {\n if (!hasDeletedAt) throw new Error(\"restore: schema has no deletedAt path.\");\n return updateOne(composeWhere(withId(undefined, idKey as string, id), true), forUpdate({ [deletedAtPath]: null }));\n },\n };\n}\n","import { clampOffset, clampPage, clampPageSize, infinitePage, offsetMeta, offsetPageWithoutTotal } from \"@querykitjs/core/internal\";\n\nimport type { ByIdParams, Filter, Id, InfiniteParams, InfiniteResult, OffsetParams, OffsetResult, QueryParams } from \"../types\";\nimport type { AnyQuery, RepoContext } from \"./context\";\n\n/** `findAll`, `findOne`, `findById`, `findList`, `findInfinite`, `count`, `exists`. */\nexport function readMethods<TDoc>(ctx: RepoContext<TDoc>) {\n const { runtime, m, policy, projection, sortSpec, listSortSpec, withOf, composeWhere, withId, applyPopulate, attachSession, runFind, countWhere } = ctx;\n\n /** The client's filter and sort, checked before the query is built. */\n const checked = (params: QueryParams<TDoc>) => {\n policy.checkFilter(params.filter);\n policy.checkSort(params.sort as never);\n };\n\n return {\n async findAll(params: QueryParams<TDoc> = {}) {\n checked(params);\n const rows = await runFind(composeWhere(params.filter, params.withDeleted), {\n sort: sortSpec(params.sort),\n columns: params.columns,\n with: withOf(params.with),\n });\n return rows as never;\n },\n\n async findOne(params: QueryParams<TDoc> = {}) {\n checked(params);\n let q: AnyQuery = m.findOne(composeWhere(params.filter, params.withDeleted), projection(params.columns));\n q = q.sort(sortSpec(params.sort));\n q = applyPopulate(q, withOf(params.with));\n const row = await attachSession(q).lean().exec();\n return (row ?? undefined) as never;\n },\n\n async findById(id: Id, params: ByIdParams<TDoc> = {}) {\n const { idKey = \"id\", filter, columns, with: withRel } = params;\n // Only the client's filter: `idKey` is the server's own choice.\n policy.checkFilter(filter);\n let q: AnyQuery = m.findOne(composeWhere(withId(filter, idKey as string, id), params.withDeleted), projection(columns));\n q = applyPopulate(q, withRel);\n const row = await attachSession(q).lean().exec();\n return (row ?? undefined) as never;\n },\n\n async findList(params: OffsetParams<TDoc> = {}) {\n checked(params);\n const page = clampPage(params.page);\n const perPage = clampPageSize(params.perPage, runtime.defaultPerPage, runtime.maxPerPage);\n policy.checkPage({ page, perPage });\n const where = composeWhere(params.filter, params.withDeleted);\n const rows = (limit: number) =>\n runFind(where, { sort: listSortSpec(params.sort), columns: params.columns, with: withOf(params.with), limit, skip: (page - 1) * perPage });\n\n // No count — one extra row tells whether a next page exists.\n if (params.withTotal === false) return offsetPageWithoutTotal(await rows(perPage + 1), page, perPage) as OffsetResult<never>;\n const [data, totalItems] = await Promise.all([rows(perPage), countWhere(where)]);\n return { data, meta: offsetMeta(page, perPage, totalItems) } as OffsetResult<never>;\n },\n\n async findInfinite(params: InfiniteParams<TDoc> = {}) {\n const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);\n const offset = clampOffset(params.offset);\n checked(params);\n policy.checkPage({ offset });\n\n const rows = await runFind(composeWhere(params.filter, params.withDeleted), {\n sort: listSortSpec(params.sort),\n columns: params.columns,\n with: withOf(params.with),\n limit: limit + 1,\n skip: offset,\n });\n\n return infinitePage(rows, limit, offset) as InfiniteResult<never>;\n },\n\n async count(filter?: Filter<TDoc>) {\n policy.checkFilter(filter);\n return countWhere(composeWhere(filter));\n },\n\n async exists(filter?: Filter<TDoc>) {\n policy.checkFilter(filter);\n return (await countWhere(composeWhere(filter))) > 0;\n },\n };\n}\n","import type { Model } from \"mongoose\";\n\nimport type { Repository, RepositoryOptions, Scope } from \"../types\";\nimport { aggregateMethods } from \"./aggregate\";\nimport { buildRepoContext, type RepoRuntime } from \"./context\";\nimport { cursorMethods } from \"./cursor\";\nimport { mutateMethods } from \"./mutate\";\nimport { readMethods } from \"./read\";\n\nexport type { RepoRuntime } from \"./context\";\n\n/**\n * Build a model-scoped repository. `runtime` (session getter + defaults) comes\n * from the registry, so this module never touches the connection directly.\n */\nexport function buildRepository<TDoc>(runtime: RepoRuntime, model: Model<TDoc>, config: RepositoryOptions<TDoc> = {}): Repository<TDoc> {\n const ctx = buildRepoContext(runtime, model, config);\n\n const repository = {\n model,\n ...readMethods(ctx),\n ...cursorMethods(ctx),\n ...mutateMethods(ctx, config),\n ...aggregateMethods(ctx),\n\n scoped(scope: Scope<TDoc>) {\n return buildRepository(runtime, model, { ...config, scope: { ...config.scope, ...scope } });\n },\n };\n\n return repository as unknown as Repository<TDoc>;\n}\n","import type { ClientSession, Connection, Model } from \"mongoose\";\nimport { DEFAULT_LIMIT, DEFAULT_MAX_LIMIT, DEFAULT_MAX_PER_PAGE, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\nimport { createContextStore } from \"@querykitjs/core/internal\";\n\nimport type { RelationDocs, RelationMap, Registry, RegistryOptions, Repository, RepositoryExtender, RepositoryOptions } from \"./types\";\nimport { buildRepository, type RepoRuntime } from \"./repository\";\n\n/** Default read time limit: long enough for an indexed page, short enough to stop a COLLSCAN. */\nconst DEFAULT_MAX_TIME_MS = 2000;\n\n/**\n * Create the DB **registry** once. It holds the Mongoose connection (for\n * transactions) and yields a {@link Repository} per model. Transactions flow\n * ambiently via AsyncLocalStorage — repositories used inside\n * `registry.transaction(...)` automatically run on that session.\n *\n * @param connection - the Mongoose `Connection` the models belong to.\n * @param options - `defaultPerPage` (findList) / `defaultLimit` (infinite/cursor);\n * defaults to `@querykitjs/core`'s `DEFAULT_PER_PAGE` / `DEFAULT_LIMIT` (20).\n * @example\n * ```ts\n * const registry = createRegistry(mongoose.connection);\n * const usersRepo = registry.repository(User);\n * ```\n */\nexport function createRegistry(connection: Connection, options: RegistryOptions = {}): Registry {\n const ctx = createContextStore<{ session?: ClientSession }>();\n const runtime: RepoRuntime = {\n getSession: () => ctx.get()?.session,\n defaultPerPage: options.defaultPerPage ?? DEFAULT_PER_PAGE,\n defaultLimit: options.defaultLimit ?? DEFAULT_LIMIT,\n maxPerPage: options.maxPerPage ?? DEFAULT_MAX_PER_PAGE,\n maxLimit: options.maxLimit ?? DEFAULT_MAX_LIMIT,\n strict: options.strict ?? false,\n onSkippedCondition: options.onSkippedCondition,\n limits: options.limits,\n cursorSecret: options.cursorSecret,\n timestamps: options.timestamps,\n maxTimeMS: options.maxTimeMS ?? DEFAULT_MAX_TIME_MS,\n };\n\n function repository<TDoc>(model: Model<TDoc>): Repository<TDoc>;\n function repository<TDoc, TExt extends Record<string, unknown>>(\n model: Model<TDoc>,\n extend: RepositoryExtender<TDoc, Record<never, never>, TExt>,\n ): Repository<TDoc> & TExt;\n function repository<TDoc, TRel extends RelationMap>(model: Model<TDoc>, options: RepositoryOptions<TDoc, TRel>): Repository<TDoc, RelationDocs<TRel>>;\n function repository<TDoc, TRel extends RelationMap, TExt extends Record<string, unknown>>(\n model: Model<TDoc>,\n options: RepositoryOptions<TDoc, TRel>,\n extend: RepositoryExtender<TDoc, RelationDocs<TRel>, TExt>,\n ): Repository<TDoc, RelationDocs<TRel>> & TExt;\n function repository<TDoc, TRel extends RelationMap, TExt extends Record<string, unknown>>(\n model: Model<TDoc>,\n arg2?: RepositoryOptions<TDoc, TRel> | RepositoryExtender<TDoc, RelationDocs<TRel>, TExt>,\n arg3?: RepositoryExtender<TDoc, RelationDocs<TRel>, TExt>,\n ) {\n // 2nd arg is either the options object or the extender fn (same dispatch as\n // the drizzle-pg adapter, so both registries read identically).\n // `relations` is type-only (it drives `with` inference); `scope` and the\n // projection guards are runtime and must reach buildRepository — before this\n // they were silently dropped, so `forcedColumns` had no effect.\n const repoOptions = typeof arg2 === \"function\" ? undefined : arg2;\n const extend = typeof arg2 === \"function\" ? arg2 : arg3;\n const base = buildRepository(runtime, model, repoOptions) as unknown as Repository<TDoc, RelationDocs<TRel>>;\n return extend ? { ...base, ...extend(base) } : base;\n }\n\n const transaction = async <T>(fn: () => Promise<T>): Promise<T> => {\n // Already inside a transaction (Mongo has no nested tx/savepoints) → reuse it.\n if (ctx.get()?.session) return fn();\n\n const session = await connection.startSession();\n try {\n let result!: T;\n await session.withTransaction(async () => {\n result = await ctx.run({ session }, fn);\n });\n return result;\n } finally {\n await session.endSession();\n }\n };\n\n return { repository, transaction };\n}\n","import { createFilters as coreCreateFilters, f } from \"@querykitjs/core\";\n\nimport type { FieldKey, RawFilter } from \"./types\";\n\n/**\n * Typed, ergonomic filter builders for a document type (field-name autocomplete).\n * A thin wrapper over `@querykitjs/core`'s builder — the key type is the model's\n * field key, the raw escape-hatch is a native Mongo `QueryFilter`.\n *\n * @example\n * ```ts\n * const uf = createFilters<IUser>();\n * await usersRepo.findAll({ filter: uf.and(uf.eq(\"status\", \"active\"), uf.gte(\"age\", 18)) });\n * ```\n */\n// The explicit return type keeps `dist/index.d.ts` free of an inferred expansion:\n// inferred, the alias printed as `RawFilter<_TDoc>` — a name not in scope there.\nexport function createFilters<TDoc>(): ReturnType<typeof coreCreateFilters<FieldKey<TDoc>, RawFilter<TDoc>>> {\n return coreCreateFilters<FieldKey<TDoc>, RawFilter<TDoc>>();\n}\n\n/** Untyped filter helpers for quick use. */\nexport { f };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@querykitjs/mongoose",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "Advanced filtering + flexible pagination repository layer for Mongoose (MongoDB).",
5
5
  "type": "module",
6
6
  "author": {
@@ -54,7 +54,7 @@
54
54
  "test:smoke": "bun --preload ./test/bun-v8-shim.ts test/smoke.ts"
55
55
  },
56
56
  "dependencies": {
57
- "@querykitjs/core": "^2.0.0"
57
+ "@querykitjs/core": "^2.1.0"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "mongoose": "^8.24 || ^9.11"
@@ -182,6 +182,7 @@ The same JSON shape as every querykit package (`@querykitjs/core`): conditions `
182
182
 
183
183
  ## Mistakes to avoid
184
184
 
185
+ - Relying on an index on `(col)` alone for `findList` or `findInfinite`: they end the order on `_id`, so with no compound `(col, _id)` index MongoDB sorts in memory. `_id` does not count against `maxSortFields`; `findAll` and `findOne` do not add it.
185
186
  - Opening `contains`, `endsWith`, `!=` or `notIn` on a large collection: they cannot use an index (COLLSCAN). `startsWith` is a case-insensitive regex and uses an index poorly; keep a lowercase shadow field (`nameLower`) and give that `=` / `startsWith`.
186
187
  - Using a text operator on a Date path: it is skipped as `invalid-value`.
187
188
  - Running `registry.transaction` on a standalone `mongod`: transactions need a replica set.