mondel 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -316,7 +316,7 @@ var CollectionProxy = class {
316
316
  const result = zodSchema2.safeParse(data);
317
317
  if (!result.success) {
318
318
  if (this.validationMode === "strict") {
319
- throw new Error(`Validation failed: ${result.error.message}`);
319
+ throw result.error;
320
320
  }
321
321
  console.warn(`Validation warning: ${result.error.message}`);
322
322
  }
@@ -327,7 +327,7 @@ var CollectionProxy = class {
327
327
  const result = zodSchema2.safeParse(data);
328
328
  if (!result.success) {
329
329
  if (this.validationMode === "strict") {
330
- throw new Error(`Validation failed: ${result.error.message}`);
330
+ throw result.error;
331
331
  }
332
332
  console.warn(`Validation warning: ${result.error.message}`);
333
333
  }
@@ -359,6 +359,9 @@ var CollectionProxy = class {
359
359
  */
360
360
  async findOne(where, options) {
361
361
  const mongoOptions = {};
362
+ if (options?.session) {
363
+ mongoOptions.session = options.session;
364
+ }
362
365
  if (options?.select) {
363
366
  mongoOptions.projection = options.select;
364
367
  }
@@ -398,7 +401,11 @@ var CollectionProxy = class {
398
401
  * ```
399
402
  */
400
403
  async findMany(where = {}, options) {
401
- let cursor = this.collection.find(where);
404
+ const mongoOptions = {};
405
+ if (options?.session) {
406
+ mongoOptions.session = options.session;
407
+ }
408
+ let cursor = this.collection.find(where, mongoOptions);
402
409
  if (options?.select) {
403
410
  cursor = cursor.project(options.select);
404
411
  }
@@ -471,7 +478,8 @@ var CollectionProxy = class {
471
478
  async create(data, options) {
472
479
  this.validateCreate(data);
473
480
  const doc = this.applyTimestamps(data, "create", options?.timestamps);
474
- return this.collection.insertOne(doc);
481
+ const { timestamps: _timestamps, ...mongoOptions } = options || {};
482
+ return this.collection.insertOne(doc, mongoOptions);
475
483
  }
476
484
  /**
477
485
  * Create multiple documents in a single operation.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema/field-builder.ts","../src/schema/schema-builder.ts","../src/schema/define-schema.ts","../src/validation/zod-schema.ts","../src/manager/collection-proxy.ts","../src/client/client.ts"],"names":["schema","z","zodSchema","ObjectId","MongoClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { FieldDefinition, IndexOptions } from \"../types\";\n\n// Branded type for TypeScript inference\ndeclare const __type: unique symbol;\ndeclare const __required: unique symbol;\n\nexport class FieldBuilder<T = unknown, TRequired extends boolean = false> {\n private definition: FieldDefinition<T>;\n\n // Branded types for inference (not used at runtime)\n declare readonly [__type]: T;\n declare readonly [__required]: TRequired;\n\n constructor(type: FieldDefinition[\"type\"]) {\n this.definition = {\n type,\n required: false,\n unique: false,\n };\n }\n\n required(): FieldBuilder<T, true> {\n this.definition.required = true;\n return this as unknown as FieldBuilder<T, true>;\n }\n\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n default(value: T | \"auto\"): this {\n this.definition.default = value;\n return this;\n }\n\n index(options?: IndexOptions): this {\n this.definition.index = options ?? { type: 1 };\n return this;\n }\n\n build(): FieldDefinition<T> {\n return { ...this.definition };\n }\n}\n\n// Helper types for extracting field info\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type InferBuilderType<T> = T extends FieldBuilder<infer V, infer _R> ? V : unknown;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type IsBuilderRequired<T> = T extends FieldBuilder<infer _V, infer R> ? R : false;\n\nexport class StringFieldBuilder extends FieldBuilder<string> {\n constructor() {\n super(\"string\");\n }\n\n min(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.minLength = length;\n return this;\n }\n\n max(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.maxLength = length;\n return this;\n }\n\n pattern(regex: RegExp): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.pattern = regex;\n return this;\n }\n\n email(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.email = true;\n return this;\n }\n\n url(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.url = true;\n return this;\n }\n\n text(): this {\n return this.index({ type: \"text\" });\n }\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n const builder = new EnumFieldBuilder<E[number]>(values);\n const def = this.build();\n if (def.required) builder.required();\n if (def.unique) builder.unique();\n if (def.index) builder.index(def.index);\n return builder;\n }\n}\n\nexport class EnumFieldBuilder<T extends string> extends FieldBuilder<T> {\n constructor(values: readonly T[]) {\n super(\"string\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.enum = values;\n }\n}\n\nexport class NumberFieldBuilder extends FieldBuilder<number> {\n constructor() {\n super(\"number\");\n }\n\n min(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.min = value;\n return this;\n }\n\n max(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.max = value;\n return this;\n }\n}\n\nexport class BooleanFieldBuilder extends FieldBuilder<boolean> {\n constructor() {\n super(\"boolean\");\n }\n}\n\nexport class DateFieldBuilder extends FieldBuilder<Date> {\n constructor() {\n super(\"date\");\n }\n}\n\nexport class ObjectIdFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"objectId\");\n }\n}\n\nexport class ArrayFieldBuilder<T> extends FieldBuilder<T[]> {\n constructor(items: FieldDefinition) {\n super(\"array\");\n (this as unknown as { definition: FieldDefinition<T[]> }).definition.items = items;\n }\n}\n\nexport class ObjectFieldBuilder<T extends Record<string, unknown>> extends FieldBuilder<T> {\n constructor(properties: Record<string, FieldDefinition>) {\n super(\"object\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.properties = properties;\n }\n}\n\nexport class JsonFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"json\");\n }\n}\n\nexport class LiteralFieldBuilder<T extends string | number | boolean> extends FieldBuilder<T> {\n constructor(value: T) {\n super(\"literal\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.literal = value;\n }\n}\n","import type { FieldDefinition, IndexOptions } from \"../types\";\nimport {\n StringFieldBuilder,\n NumberFieldBuilder,\n BooleanFieldBuilder,\n DateFieldBuilder,\n ObjectIdFieldBuilder,\n ArrayFieldBuilder,\n ObjectFieldBuilder,\n JsonFieldBuilder,\n LiteralFieldBuilder,\n EnumFieldBuilder,\n type FieldBuilder,\n} from \"./field-builder\";\n\ntype FieldBuilderResult = {\n build(): FieldDefinition;\n required(): FieldBuilderResult;\n unique(): FieldBuilderResult;\n default(value: unknown): FieldBuilderResult;\n index(options?: IndexOptions): FieldBuilderResult;\n};\n\ntype SchemaFieldsInput = Record<string, FieldBuilderResult>;\n\n// Type to infer the value type from a field builder\nexport type InferFieldBuilderType<T> = T extends FieldBuilder<infer V> ? V : unknown;\n\nfunction resolveFields(fields: SchemaFieldsInput): Record<string, FieldDefinition> {\n const resolved: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(fields)) {\n resolved[key] = builder.build();\n }\n return resolved;\n}\n\nexport const s = {\n string(): StringFieldBuilder {\n return new StringFieldBuilder();\n },\n\n number(): NumberFieldBuilder {\n return new NumberFieldBuilder();\n },\n\n boolean(): BooleanFieldBuilder {\n return new BooleanFieldBuilder();\n },\n\n date(): DateFieldBuilder {\n return new DateFieldBuilder();\n },\n\n objectId(): ObjectIdFieldBuilder {\n return new ObjectIdFieldBuilder();\n },\n\n array<T>(items: { build(): FieldDefinition }): ArrayFieldBuilder<T> {\n return new ArrayFieldBuilder<T>(items.build());\n },\n\n object<T extends Record<string, unknown>>(\n properties: Record<string, { build(): FieldDefinition }>\n ): ObjectFieldBuilder<T> {\n const resolvedProps: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(properties)) {\n resolvedProps[key] = builder.build();\n }\n return new ObjectFieldBuilder<T>(resolvedProps);\n },\n\n json(): JsonFieldBuilder {\n return new JsonFieldBuilder();\n },\n\n literal<T extends string | number | boolean>(value: T): LiteralFieldBuilder<T> {\n return new LiteralFieldBuilder<T>(value);\n },\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n return new EnumFieldBuilder<E[number]>(values);\n },\n};\n\nexport { resolveFields, type SchemaFieldsInput };\n","import type { Schema, FieldDefinition, TimestampConfig, CompoundIndexDefinition } from \"../types\";\nimport { resolveFields, type SchemaFieldsInput } from \"./schema-builder\";\n\ninterface SchemaInput<\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = boolean | TimestampConfig,\n> {\n collection?: string;\n timestamps?: TTimestamps;\n validation?: {\n enabled?: boolean;\n mode?: \"strict\" | \"loose\" | \"off\";\n };\n connection?: string;\n fields: TFields;\n indexes?: CompoundIndexDefinition[];\n}\n\ntype InferSchemaFields<TFields extends SchemaFieldsInput> = {\n [K in keyof TFields]: TFields[K] extends { build(): infer FD }\n ? FD extends FieldDefinition<infer T>\n ? FieldDefinition<T> & {\n required: TFields[K] extends { _required: true } ? true : false;\n unique: TFields[K] extends { _unique: true } ? true : false;\n }\n : FieldDefinition\n : FieldDefinition;\n};\n\n// Resolved timestamp config type\ntype ResolvedTimestamps<T> = T extends true\n ? { createdAt: \"createdAt\"; updatedAt: \"updatedAt\" }\n : T extends TimestampConfig\n ? T\n : false;\n\nexport type InferredSchema<\n TName extends string,\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = true,\n> = Omit<Schema<TName, InferSchemaFields<TFields>>, \"timestamps\"> & {\n readonly timestamps: ResolvedTimestamps<TTimestamps>;\n readonly __fields: TFields;\n};\n\nexport function schema<\n const TName extends string,\n const TFields extends SchemaFieldsInput,\n const TTimestamps extends boolean | TimestampConfig = false,\n>(\n name: TName,\n definition: SchemaInput<TFields, TTimestamps>\n): InferredSchema<TName, TFields, TTimestamps> {\n const resolvedFields = resolveFields(definition.fields);\n\n const timestamps: TimestampConfig | false =\n definition.timestamps === true\n ? { createdAt: \"createdAt\", updatedAt: \"updatedAt\" }\n : definition.timestamps === false || definition.timestamps === undefined\n ? false\n : definition.timestamps;\n\n return {\n name,\n collection: definition.collection ?? name,\n timestamps,\n validation: definition.validation ?? { enabled: false, mode: \"off\" },\n connection: definition.connection,\n fields: resolvedFields,\n indexes: definition.indexes ?? [],\n } as unknown as InferredSchema<TName, TFields, TTimestamps>;\n}\n\n// Alias for backwards compatibility\nexport const defineSchema = schema;\n\nexport function getFieldIndexes(schema: Schema): Array<{\n field: string;\n options: NonNullable<FieldDefinition[\"index\"]>;\n}> {\n const indexes: Array<{ field: string; options: NonNullable<FieldDefinition[\"index\"]> }> = [];\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n if (fieldDef.index) {\n indexes.push({ field: fieldName, options: fieldDef.index });\n }\n if (fieldDef.unique && !fieldDef.index) {\n indexes.push({ field: fieldName, options: { unique: true } });\n }\n }\n\n return indexes;\n}\n","import { z, type ZodTypeAny } from \"zod\";\nimport type { Schema, FieldDefinition } from \"../types\";\n\n/**\n * Validates if a value is a valid MongoDB ObjectId.\n * Accepts both ObjectId instances and 24-character hex strings.\n */\nfunction isObjectId(value: unknown): boolean {\n if (typeof value === \"object\" && value !== null) {\n return (\n \"toHexString\" in value &&\n typeof (value as { toHexString: unknown }).toHexString === \"function\"\n );\n }\n if (typeof value === \"string\") {\n return /^[a-fA-F0-9]{24}$/.test(value);\n }\n return false;\n}\n\n/**\n * Builds a Zod string schema with optional constraints.\n */\nfunction buildStringSchema(field: FieldDefinition): ZodTypeAny {\n // Handle enum as a special case\n if (field.enum) {\n return z.enum(field.enum as [string, ...string[]]);\n }\n\n let schema = z.string();\n if (field.minLength !== undefined) schema = schema.min(field.minLength);\n if (field.maxLength !== undefined) schema = schema.max(field.maxLength);\n if (field.pattern) schema = schema.regex(field.pattern);\n if (field.email) schema = schema.email();\n if (field.url) schema = schema.url();\n return schema;\n}\n\n/**\n * Builds a Zod number schema with optional min/max constraints.\n */\nfunction buildNumberSchema(field: FieldDefinition): ZodTypeAny {\n let schema = z.number();\n if (field.min !== undefined) schema = schema.min(field.min);\n if (field.max !== undefined) schema = schema.max(field.max);\n return schema;\n}\n\n/**\n * Builds a Zod array schema with typed items.\n */\nfunction buildArraySchema(field: FieldDefinition): ZodTypeAny {\n return field.items ? z.array(fieldToZod(field.items)) : z.array(z.unknown());\n}\n\n/**\n * Builds a Zod object schema with typed properties.\n */\nfunction buildObjectSchema(field: FieldDefinition): ZodTypeAny {\n if (!field.properties) {\n return z.record(z.unknown());\n }\n\n const shape: Record<string, ZodTypeAny> = {};\n for (const [key, prop] of Object.entries(field.properties)) {\n shape[key] = fieldToZod(prop);\n }\n return z.object(shape);\n}\n\n/** Maps field types to their Zod schema builders */\nconst typeBuilders: Record<string, (field: FieldDefinition) => ZodTypeAny> = {\n string: buildStringSchema,\n number: buildNumberSchema,\n boolean: () => z.boolean(),\n date: () => z.date(),\n objectId: () => z.union([z.string(), z.custom((val: unknown) => isObjectId(val))]),\n array: buildArraySchema,\n object: buildObjectSchema,\n json: () => z.unknown(),\n literal: (field) => z.literal(field.literal as string | number | boolean),\n};\n\n/**\n * Converts a FieldDefinition to a Zod schema.\n * Handles all field types, required/optional, and default values.\n *\n * @param field - The field definition from schema\n * @returns Zod schema for validation\n */\nfunction fieldToZod(field: FieldDefinition): ZodTypeAny {\n const builder = typeBuilders[field.type];\n let schema = builder ? builder(field) : z.unknown();\n\n // Apply optional/nullable for non-required fields\n if (!field.required) {\n schema = schema.optional().nullable();\n }\n\n // Apply default value (skip \"auto\" which is handled at runtime)\n if (field.default !== undefined && field.default !== \"auto\") {\n schema = schema.default(field.default);\n }\n\n return schema;\n}\n\n/**\n * Creates a complete Zod schema from a Mondel schema definition.\n * Includes all fields and timestamp fields if configured.\n *\n * @param schema - Mondel schema definition\n * @returns Zod object schema for full document validation\n *\n * @example\n * ```typescript\n * const zod = zodSchema(userSchema);\n * const result = zod.safeParse(document);\n * ```\n */\nexport function zodSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n shape[fieldName] = fieldToZod(fieldDef);\n }\n\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) {\n shape[ts.createdAt] = z.date().optional();\n }\n if (ts.updatedAt) {\n shape[ts.updatedAt] = z.date().optional();\n }\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for insert operations.\n * Excludes _id and timestamp fields (auto-generated).\n * Used internally by `create()` and `createMany()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema for create validation\n */\nexport function zodCreateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const fullSchema = zodSchema(schema);\n const shape = { ...fullSchema.shape };\n\n // Remove auto-generated fields\n delete shape[\"_id\"];\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) delete shape[ts.createdAt];\n if (ts.updatedAt) delete shape[ts.updatedAt];\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for update operations.\n * All fields become optional (partial update support).\n * Used internally by `updateOne()`, `updateMany()`, `updateById()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema with all fields optional\n */\nexport function zodUpdateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const createSchema = zodCreateSchema(schema);\n return createSchema.partial();\n}\n\n/**\n * Validates data against a Zod schema.\n *\n * @param schema - Zod schema to validate against\n * @param data - Data to validate\n * @returns Result object with success status and data or errors\n *\n * @example\n * ```typescript\n * const result = validate(zodCreateSchema(userSchema), userData);\n * if (result.success) {\n * console.log(result.data);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validate<T>(\n schema: z.ZodType<T>,\n data: unknown\n): { success: true; data: T } | { success: false; errors: z.ZodError } {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n","import {\n ObjectId,\n type Collection,\n type Db,\n type Document,\n type Filter,\n type FindOptions as MongoFindOptions,\n type UpdateFilter,\n type OptionalUnlessRequiredId,\n type WithId,\n type InsertOneResult,\n type InsertManyResult,\n type UpdateResult,\n type DeleteResult,\n type CountDocumentsOptions,\n type AggregateOptions,\n} from \"mongodb\";\nimport type {\n Schema,\n FindOptions,\n CreateOptions,\n CreateManyOptions,\n UpdateOptions,\n DeleteOptions,\n ValidationMode,\n} from \"../types\";\nimport { zodCreateSchema, zodUpdateSchema } from \"../validation/zod-schema\";\n\n/**\n * Type-safe collection proxy for MongoDB operations.\n * Provides CRUD methods with full TypeScript support and Zod validation.\n *\n * @template TSchema - The schema type for this collection\n *\n * @example\n * ```typescript\n * // Access via client\n * const db = await getMondelClient(env);\n * const users = await db.users.findMany({ isActive: true });\n * ```\n */\nexport class CollectionProxy<TSchema extends Schema> {\n private collection: Collection<Document>;\n private schema: TSchema;\n private validationMode: ValidationMode;\n\n constructor(db: Db, schema: TSchema, validationMode: ValidationMode = \"strict\") {\n this.collection = db.collection(schema.collection);\n this.schema = schema;\n this.validationMode = validationMode;\n }\n\n private validateCreate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodCreateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw new Error(`Validation failed: ${result.error.message}`);\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n private validateUpdate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodUpdateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw new Error(`Validation failed: ${result.error.message}`);\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n /**\n * Find a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by email\n * const user = await db.users.findOne({ email: \"john@example.com\" });\n *\n * // With field selection\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { select: { _id: true, email: true, name: true } }\n * );\n *\n * // With session (for transactions)\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { session }\n * );\n * ```\n */\n async findOne(\n where: Filter<Document>,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const mongoOptions: MongoFindOptions = {};\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n }\n if (options?.sort) {\n mongoOptions.sort = options.sort;\n }\n\n return this.collection.findOne(where, mongoOptions);\n }\n\n /**\n * Find multiple documents matching the filter.\n *\n * @param where - MongoDB filter query (optional, defaults to {})\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns Array of matching documents\n *\n * @example\n * ```typescript\n * // Find all active users\n * const users = await db.users.findMany({ isActive: true });\n *\n * // With pagination and sorting\n * const users = await db.users.findMany(\n * { role: \"ADMIN\" },\n * {\n * select: { _id: true, email: true, name: true },\n * sort: { createdAt: -1 },\n * skip: 0,\n * limit: 10\n * }\n * );\n *\n * // Using MongoDB operators\n * const users = await db.users.findMany({\n * age: { $gte: 18, $lte: 65 },\n * role: { $in: [\"ADMIN\", \"MODERATOR\"] }\n * });\n * ```\n */\n async findMany(\n where: Filter<Document> = {},\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document>[]> {\n let cursor = this.collection.find(where);\n\n if (options?.select) {\n cursor = cursor.project(options.select as Document);\n }\n if (options?.sort) {\n cursor = cursor.sort(options.sort);\n }\n if (options?.skip !== undefined) {\n cursor = cursor.skip(options.skip);\n }\n if (options?.limit !== undefined) {\n cursor = cursor.limit(options.limit);\n }\n\n return cursor.toArray();\n }\n\n /**\n * Find a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Find options (select, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by string ID\n * const user = await db.users.findById(\"507f1f77bcf86cd799439011\");\n *\n * // Find by ObjectId\n * const user = await db.users.findById(new ObjectId(\"507f1f77bcf86cd799439011\"));\n *\n * // With field selection\n * const user = await db.users.findById(userId, {\n * select: { email: true, name: true }\n * });\n * ```\n */\n async findById(\n id: ObjectId | string,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const objectId = this.parseObjectId(id);\n const mongoOptions: MongoFindOptions = { ...options };\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n delete (mongoOptions as Record<string, unknown>).select;\n }\n\n return this.collection.findOne({ _id: objectId }, mongoOptions);\n }\n\n /**\n * Create a new document.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Document data (validated against schema)\n * @param options - Create options (timestamps, session)\n * @returns Insert result with insertedId\n *\n * @example\n * ```typescript\n * // Create a user\n * const result = await db.users.create({\n * email: \"john@example.com\",\n * name: \"John Doe\",\n * role: \"USER\"\n * });\n * console.log(result.insertedId); // ObjectId\n *\n * // Disable automatic timestamps\n * await db.users.create(userData, { timestamps: false });\n *\n * // With session (for transactions)\n * await db.users.create(userData, { session });\n * ```\n */\n async create(\n data: OptionalUnlessRequiredId<Document>,\n options?: CreateOptions\n ): Promise<InsertOneResult> {\n this.validateCreate(data);\n const doc = this.applyTimestamps(data, \"create\", options?.timestamps);\n return this.collection.insertOne(doc);\n }\n\n /**\n * Create multiple documents in a single operation.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Array of document data\n * @param options - Create options (timestamps, ordered, session)\n * @returns Insert result with insertedIds\n *\n * @example\n * ```typescript\n * // Create multiple users\n * const result = await db.users.createMany([\n * { email: \"user1@example.com\", name: \"User 1\" },\n * { email: \"user2@example.com\", name: \"User 2\" },\n * { email: \"user3@example.com\", name: \"User 3\" }\n * ]);\n * console.log(result.insertedIds); // { 0: ObjectId, 1: ObjectId, 2: ObjectId }\n *\n * // With session (for transactions)\n * await db.users.createMany(usersData, { session });\n * ```\n */\n async createMany(\n data: OptionalUnlessRequiredId<Document>[],\n options?: CreateManyOptions\n ): Promise<InsertManyResult> {\n for (const item of data) {\n this.validateCreate(item);\n }\n const docs = data.map((d) => this.applyTimestamps(d, \"create\", options?.timestamps));\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.insertMany(docs, mongoOptions);\n }\n\n /**\n * Update a single document matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators ($set, $inc, etc.)\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount, upsertedId\n *\n * @example\n * ```typescript\n * // Simple update (automatically wrapped in $set)\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { name: \"John Smith\" }\n * );\n *\n * // Using MongoDB operators\n * await db.users.updateOne(\n * { _id: userId },\n * { $set: { name: \"John\" }, $inc: { loginCount: 1 } }\n * );\n *\n * // Upsert - create if not exists\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { $set: { name: \"John\", isActive: true } },\n * { upsert: true }\n * );\n *\n * // With session (for transactions)\n * await db.users.updateOne(filter, update, { session });\n * ```\n */\n async updateOne(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n // Only validate if data is a plain update object (not using operators like $set)\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateOne(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update multiple documents matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Deactivate all users with expired subscriptions\n * await db.users.updateMany(\n * { subscriptionExpiry: { $lt: new Date() } },\n * { $set: { isActive: false } }\n * );\n *\n * // Increment login count for all admins\n * await db.users.updateMany(\n * { role: \"ADMIN\" },\n * { $inc: { loginCount: 1 } }\n * );\n * ```\n */\n async updateMany(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateMany(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update a document by its _id.\n * Convenience method that wraps updateOne with _id filter.\n *\n * @param id - ObjectId or string representation\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Update by ID\n * await db.users.updateById(userId, { name: \"New Name\" });\n *\n * // Using operators\n * await db.users.updateById(userId, {\n * $set: { name: \"New Name\" },\n * $push: { tags: \"premium\" }\n * });\n * ```\n */\n async updateById(\n id: ObjectId | string,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const objectId = this.parseObjectId(id);\n return this.updateOne({ _id: objectId }, data, options);\n }\n\n /**\n * Delete a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete by email\n * await db.users.deleteOne({ email: \"john@example.com\" });\n *\n * // With session (for transactions)\n * await db.users.deleteOne({ _id: userId }, { session });\n * ```\n */\n async deleteOne(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteOne(where, mongoOptions);\n }\n\n /**\n * Delete multiple documents matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * const result = await db.users.deleteMany({ isActive: false });\n * console.log(`Deleted ${result.deletedCount} users`);\n *\n * // Delete users created before a date\n * await db.users.deleteMany({\n * createdAt: { $lt: new Date(\"2023-01-01\") }\n * });\n * ```\n */\n async deleteMany(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteMany(where, mongoOptions);\n }\n\n /**\n * Delete a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * await db.users.deleteById(\"507f1f77bcf86cd799439011\");\n * await db.users.deleteById(userId, { session });\n * ```\n */\n async deleteById(id: ObjectId | string, options?: DeleteOptions): Promise<DeleteResult> {\n const objectId = this.parseObjectId(id);\n return this.deleteOne({ _id: objectId }, options);\n }\n\n /**\n * Count documents matching the filter.\n *\n * @param where - MongoDB filter query (optional)\n * @param options - Count options (limit, skip, session)\n * @returns Number of matching documents\n *\n * @example\n * ```typescript\n * // Count all users\n * const total = await db.users.count();\n *\n * // Count active users\n * const activeCount = await db.users.count({ isActive: true });\n *\n * // Count with limit (for existence check optimization)\n * const hasAdmins = await db.users.count({ role: \"ADMIN\" }, { limit: 1 }) > 0;\n * ```\n */\n async count(where: Filter<Document> = {}, options?: CountDocumentsOptions): Promise<number> {\n return this.collection.countDocuments(where, options);\n }\n\n /**\n * Check if any document matches the filter.\n * Optimized to stop after finding first match.\n *\n * @param where - MongoDB filter query\n * @param options - Count options (session)\n * @returns true if at least one document matches\n *\n * @example\n * ```typescript\n * // Check if email is taken\n * const emailTaken = await db.users.exists({ email: \"john@example.com\" });\n *\n * // Check if user has admin role\n * const isAdmin = await db.users.exists({ _id: userId, role: \"ADMIN\" });\n * ```\n */\n async exists(where: Filter<Document>, options?: CountDocumentsOptions): Promise<boolean> {\n const count = await this.collection.countDocuments(where, { ...options, limit: 1 });\n return count > 0;\n }\n\n /**\n * Run an aggregation pipeline.\n * Provides full access to MongoDB aggregation framework.\n *\n * @param pipeline - Array of aggregation stages\n * @param options - Aggregation options (allowDiskUse, session)\n * @returns Array of aggregation results\n *\n * @example\n * ```typescript\n * // Group users by role and count\n * const stats = await db.users.aggregate([\n * { $match: { isActive: true } },\n * { $group: { _id: \"$role\", count: { $sum: 1 } } },\n * { $sort: { count: -1 } }\n * ]);\n *\n * // Lookup related documents\n * const usersWithPosts = await db.users.aggregate([\n * { $lookup: {\n * from: \"posts\",\n * localField: \"_id\",\n * foreignField: \"authorId\",\n * as: \"posts\"\n * }}\n * ]);\n *\n * // With options\n * const bigResult = await db.users.aggregate(pipeline, {\n * allowDiskUse: true\n * });\n * ```\n */\n async aggregate(pipeline: Document[], options?: AggregateOptions): Promise<Document[]> {\n return this.collection.aggregate(pipeline, options).toArray();\n }\n\n /**\n * Get the underlying MongoDB Collection instance.\n * Use for advanced operations not covered by the proxy.\n *\n * @returns MongoDB Collection instance\n *\n * @example\n * ```typescript\n * const collection = db.users.getCollection();\n *\n * // Use for watch, bulkWrite, or other advanced operations\n * const changeStream = collection.watch();\n * ```\n */\n getCollection(): Collection<Document> {\n return this.collection;\n }\n\n private applyTimestamps(\n data: Document,\n operation: \"create\" | \"update\",\n enabled?: boolean\n ): Document {\n if (enabled === false || !this.schema.timestamps) {\n return data;\n }\n\n const timestamps = this.schema.timestamps;\n const now = new Date();\n const result = { ...data };\n\n if (operation === \"create\" && timestamps.createdAt) {\n result[timestamps.createdAt] = now;\n }\n if (timestamps.updatedAt) {\n result[timestamps.updatedAt] = now;\n }\n\n return result;\n }\n\n private parseObjectId(id: ObjectId | string): ObjectId {\n return typeof id === \"string\" ? new ObjectId(id) : id;\n }\n\n private applyUpdateTimestamps(\n data: Document,\n hasOperators: boolean,\n options?: UpdateOptions\n ): UpdateFilter<Document> {\n const schemaTimestamps = this.schema.timestamps;\n\n // If no processing needed, return data as-is (or wrapped in $set if no operators)\n if (!schemaTimestamps) {\n return hasOperators ? (data as UpdateFilter<Document>) : { $set: data };\n }\n\n const timestamps = schemaTimestamps;\n const now = new Date();\n\n // Initialize update object\n const update: UpdateFilter<Document> = hasOperators ? { ...data } : { $set: { ...data } };\n\n // 1. Handle updatedAt in $set\n if (timestamps.updatedAt) {\n update.$set = update.$set || {};\n // Only set if not already present in the update data\n if (!(timestamps.updatedAt in update.$set)) {\n update.$set[timestamps.updatedAt] = now;\n }\n }\n\n // 2. Handle createdAt in $setOnInsert (only if upsert is true)\n if (options?.upsert && timestamps.createdAt) {\n update.$setOnInsert = update.$setOnInsert || {};\n // Only set if not already present\n if (!(timestamps.createdAt in update.$setOnInsert)) {\n update.$setOnInsert[timestamps.createdAt] = now;\n }\n }\n\n return update;\n }\n}\n","import {\n MongoClient,\n type Db,\n type MongoClientOptions,\n type IndexSpecification,\n type CreateIndexesOptions,\n type ClientSession,\n type ClientSessionOptions,\n} from \"mongodb\";\nimport { CollectionProxy } from \"../manager/collection-proxy\";\nimport type { Schema, ValidationMode, SchemaToCollectionProxy, FieldDefinition } from \"../types\";\nimport { getFieldIndexes } from \"../schema/define-schema\";\n\ntype AnySchema = Schema<string, Record<string, FieldDefinition>>;\n\n/**\n * Configuration for serverless environments (Cloudflare Workers, Vercel Edge, etc.)\n * Returns a factory function that creates connections on-demand.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const connectDb = createClient({\n * serverless: true,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: false, // Recommended for serverless\n * validation: \"strict\"\n * });\n *\n * // Later, in request handler:\n * const db = await connectDb(env.MONGODB_URI);\n * ```\n */\nexport interface ServerlessClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Must be true for serverless mode */\n serverless: true;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: false for serverless) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n}\n\n/**\n * Configuration for traditional Node.js environments.\n * Connects immediately and returns a ready-to-use client.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const db = await createClient({\n * uri: process.env.MONGODB_URI,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n * ```\n */\nexport interface NodeClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Set to false or omit for Node.js mode */\n serverless?: false;\n /** MongoDB connection URI (e.g., mongodb://localhost:27017/mydb) */\n uri: string;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: true) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n /** MongoDB driver options (maxPoolSize, etc.) */\n options?: MongoClientOptions;\n}\n\n/**\n * Union type of all client configurations.\n */\nexport type ClientConfig<TSchemas extends readonly AnySchema[]> =\n | ServerlessClientConfig<TSchemas>\n | NodeClientConfig<TSchemas>;\n\n// Client methods type\ntype ClientMethods = {\n readonly close: () => Promise<void>;\n readonly getDb: () => Db;\n readonly startSession: (options?: ClientSessionOptions) => ClientSession;\n};\n\n// Extract schema names as a union type\ntype SchemaNames<TSchemas extends readonly AnySchema[]> = TSchemas[number][\"name\"];\n\n// All valid keys for the client\ntype ValidClientKeys<TSchemas extends readonly AnySchema[]> =\n | SchemaNames<TSchemas>\n | keyof ClientMethods;\n\n// Create a type that only allows access to valid keys\nexport type SchemasToClient<TSchemas extends readonly AnySchema[]> = {\n readonly [K in ValidClientKeys<TSchemas>]: K extends SchemaNames<TSchemas>\n ? SchemaToCollectionProxy<Extract<TSchemas[number], { name: K }>>\n : K extends keyof ClientMethods\n ? ClientMethods[K]\n : never;\n};\n\nasync function syncIndexes(db: Db, schemas: readonly Schema[]): Promise<void> {\n for (const schema of schemas) {\n const collection = db.collection(schema.collection);\n\n const fieldIndexes = getFieldIndexes(schema);\n for (const { field, options } of fieldIndexes) {\n const indexSpec: IndexSpecification = {\n [field]: options.type ?? 1,\n };\n const indexOptions: CreateIndexesOptions = {};\n\n if (options.name) indexOptions.name = options.name;\n if (options.unique) indexOptions.unique = options.unique;\n if (options.sparse) indexOptions.sparse = options.sparse;\n if (options.expireAfterSeconds !== undefined) {\n indexOptions.expireAfterSeconds = options.expireAfterSeconds;\n }\n if (options.partialFilterExpression) {\n indexOptions.partialFilterExpression = options.partialFilterExpression;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n\n for (const index of schema.indexes) {\n const indexSpec: IndexSpecification = index.fields as IndexSpecification;\n const indexOptions: CreateIndexesOptions = {};\n\n if (index.options?.name) indexOptions.name = index.options.name;\n if (index.options?.unique) indexOptions.unique = index.options.unique;\n if (index.options?.sparse) indexOptions.sparse = index.options.sparse;\n if (index.options?.partialFilterExpression) {\n indexOptions.partialFilterExpression = index.options.partialFilterExpression;\n }\n if (index.options?.weights) {\n indexOptions.weights = index.options.weights;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n }\n}\n\nfunction createClientProxy<TSchemas extends readonly AnySchema[]>(\n client: MongoClient,\n db: Db,\n schemas: TSchemas,\n validationMode: ValidationMode\n): SchemasToClient<TSchemas> {\n const schemaMap = new Map<string, Schema>();\n const proxyCache = new Map<string, CollectionProxy<Schema>>();\n\n for (const schema of schemas) {\n schemaMap.set(schema.name, schema);\n }\n\n const baseClient = {\n async close() {\n await client.close();\n },\n getDb() {\n return db;\n },\n startSession(options?: ClientSessionOptions) {\n return client.startSession(options);\n },\n };\n\n // Properties that should return undefined (not collections)\n const IGNORED_PROPERTIES = new Set([\n \"then\",\n \"catch\",\n \"finally\",\n \"inspect\",\n \"nodeType\",\n \"toJSON\",\n \"constructor\",\n \"prototype\",\n \"__proto__\",\n ]);\n\n return new Proxy(baseClient as SchemasToClient<TSchemas>, {\n get(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return Reflect.get(target, prop);\n }\n\n if (IGNORED_PROPERTIES.has(prop)) {\n return undefined;\n }\n\n if (prop in target) {\n const value = target[prop as keyof typeof target];\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n return value;\n }\n\n const schema = schemaMap.get(prop);\n if (schema) {\n let proxy = proxyCache.get(prop);\n if (!proxy) {\n proxy = new CollectionProxy(db, schema, validationMode);\n proxyCache.set(prop, proxy);\n }\n return proxy;\n }\n\n return undefined;\n },\n\n has(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (IGNORED_PROPERTIES.has(prop)) return false;\n return prop in target || schemaMap.has(prop);\n },\n\n ownKeys(target) {\n const baseKeys = Reflect.ownKeys(target);\n const schemaNames = Array.from(schemaMap.keys());\n return [...new Set([...baseKeys, ...schemaNames])];\n },\n });\n}\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Serverless Mode** (recommended for Cloudflare Workers, Vercel Edge):\n * Returns a factory function that creates connections on-demand.\n *\n * @param config - Client configuration with `serverless: true`\n * @returns Factory function: `(uri: string, options?) => Promise<Client>`\n *\n * @example\n * ```typescript\n * import { createClient, type SchemasToClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * const schemas = [userSchema, postSchema] as const;\n * export type DbClient = SchemasToClient<typeof schemas>;\n *\n * // Create factory (no connection yet)\n * const connectDb = createClient({\n * serverless: true,\n * schemas,\n * syncIndexes: false,\n * validation: \"strict\"\n * });\n *\n * // In request handler\n * export async function handleRequest(env: Env) {\n * const db = await connectDb(env.MONGODB_URI);\n * const users = await db.users.findMany({ isActive: true });\n * await db.close();\n * return users;\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ServerlessClientConfig<TSchemas>\n): (uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>;\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Node.js Mode** (for traditional servers, scripts, tests):\n * Connects immediately and returns a ready-to-use client.\n *\n * @param config - Client configuration with `serverless: false` or omitted\n * @returns Promise resolving to connected client\n *\n * @example\n * ```typescript\n * import { createClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * async function main() {\n * const db = await createClient({\n * uri: process.env.MONGODB_URI!,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n *\n * // Type-safe access to collections\n * const users = await db.users.findMany({ role: \"ADMIN\" });\n *\n * // Close when done\n * await db.close();\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: NodeClientConfig<TSchemas>\n): Promise<SchemasToClient<TSchemas>>;\n\n// Implementation\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ClientConfig<TSchemas>\n):\n | ((uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>)\n | Promise<SchemasToClient<TSchemas>> {\n const { schemas, syncIndexes: shouldSyncIndexes = false, validation = \"strict\" } = config;\n\n if (config.serverless === true) {\n // Serverless mode: return factory function\n return async (uri: string, options?: MongoClientOptions) => {\n const client = new MongoClient(uri, options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n };\n } else {\n // Node.js mode: connect immediately\n return (async () => {\n const client = new MongoClient(config.uri, config.options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n })();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/schema/field-builder.ts","../src/schema/schema-builder.ts","../src/schema/define-schema.ts","../src/validation/zod-schema.ts","../src/manager/collection-proxy.ts","../src/client/client.ts"],"names":["schema","z","zodSchema","ObjectId","MongoClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { FieldDefinition, IndexOptions } from \"../types\";\n\n// Branded type for TypeScript inference\ndeclare const __type: unique symbol;\ndeclare const __required: unique symbol;\n\nexport class FieldBuilder<T = unknown, TRequired extends boolean = false> {\n private definition: FieldDefinition<T>;\n\n // Branded types for inference (not used at runtime)\n declare readonly [__type]: T;\n declare readonly [__required]: TRequired;\n\n constructor(type: FieldDefinition[\"type\"]) {\n this.definition = {\n type,\n required: false,\n unique: false,\n };\n }\n\n required(): FieldBuilder<T, true> {\n this.definition.required = true;\n return this as unknown as FieldBuilder<T, true>;\n }\n\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n default(value: T | \"auto\"): this {\n this.definition.default = value;\n return this;\n }\n\n index(options?: IndexOptions): this {\n this.definition.index = options ?? { type: 1 };\n return this;\n }\n\n build(): FieldDefinition<T> {\n return { ...this.definition };\n }\n}\n\n// Helper types for extracting field info\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type InferBuilderType<T> = T extends FieldBuilder<infer V, infer _R> ? V : unknown;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type IsBuilderRequired<T> = T extends FieldBuilder<infer _V, infer R> ? R : false;\n\nexport class StringFieldBuilder extends FieldBuilder<string> {\n constructor() {\n super(\"string\");\n }\n\n min(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.minLength = length;\n return this;\n }\n\n max(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.maxLength = length;\n return this;\n }\n\n pattern(regex: RegExp): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.pattern = regex;\n return this;\n }\n\n email(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.email = true;\n return this;\n }\n\n url(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.url = true;\n return this;\n }\n\n text(): this {\n return this.index({ type: \"text\" });\n }\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n const builder = new EnumFieldBuilder<E[number]>(values);\n const def = this.build();\n if (def.required) builder.required();\n if (def.unique) builder.unique();\n if (def.index) builder.index(def.index);\n return builder;\n }\n}\n\nexport class EnumFieldBuilder<T extends string> extends FieldBuilder<T> {\n constructor(values: readonly T[]) {\n super(\"string\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.enum = values;\n }\n}\n\nexport class NumberFieldBuilder extends FieldBuilder<number> {\n constructor() {\n super(\"number\");\n }\n\n min(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.min = value;\n return this;\n }\n\n max(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.max = value;\n return this;\n }\n}\n\nexport class BooleanFieldBuilder extends FieldBuilder<boolean> {\n constructor() {\n super(\"boolean\");\n }\n}\n\nexport class DateFieldBuilder extends FieldBuilder<Date> {\n constructor() {\n super(\"date\");\n }\n}\n\nexport class ObjectIdFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"objectId\");\n }\n}\n\nexport class ArrayFieldBuilder<T> extends FieldBuilder<T[]> {\n constructor(items: FieldDefinition) {\n super(\"array\");\n (this as unknown as { definition: FieldDefinition<T[]> }).definition.items = items;\n }\n}\n\nexport class ObjectFieldBuilder<T extends Record<string, unknown>> extends FieldBuilder<T> {\n constructor(properties: Record<string, FieldDefinition>) {\n super(\"object\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.properties = properties;\n }\n}\n\nexport class JsonFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"json\");\n }\n}\n\nexport class LiteralFieldBuilder<T extends string | number | boolean> extends FieldBuilder<T> {\n constructor(value: T) {\n super(\"literal\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.literal = value;\n }\n}\n","import type { FieldDefinition, IndexOptions } from \"../types\";\nimport {\n StringFieldBuilder,\n NumberFieldBuilder,\n BooleanFieldBuilder,\n DateFieldBuilder,\n ObjectIdFieldBuilder,\n ArrayFieldBuilder,\n ObjectFieldBuilder,\n JsonFieldBuilder,\n LiteralFieldBuilder,\n EnumFieldBuilder,\n type FieldBuilder,\n} from \"./field-builder\";\n\ntype FieldBuilderResult = {\n build(): FieldDefinition;\n required(): FieldBuilderResult;\n unique(): FieldBuilderResult;\n default(value: unknown): FieldBuilderResult;\n index(options?: IndexOptions): FieldBuilderResult;\n};\n\ntype SchemaFieldsInput = Record<string, FieldBuilderResult>;\n\n// Type to infer the value type from a field builder\nexport type InferFieldBuilderType<T> = T extends FieldBuilder<infer V> ? V : unknown;\n\nfunction resolveFields(fields: SchemaFieldsInput): Record<string, FieldDefinition> {\n const resolved: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(fields)) {\n resolved[key] = builder.build();\n }\n return resolved;\n}\n\nexport const s = {\n string(): StringFieldBuilder {\n return new StringFieldBuilder();\n },\n\n number(): NumberFieldBuilder {\n return new NumberFieldBuilder();\n },\n\n boolean(): BooleanFieldBuilder {\n return new BooleanFieldBuilder();\n },\n\n date(): DateFieldBuilder {\n return new DateFieldBuilder();\n },\n\n objectId(): ObjectIdFieldBuilder {\n return new ObjectIdFieldBuilder();\n },\n\n array<T>(items: { build(): FieldDefinition }): ArrayFieldBuilder<T> {\n return new ArrayFieldBuilder<T>(items.build());\n },\n\n object<T extends Record<string, unknown>>(\n properties: Record<string, { build(): FieldDefinition }>\n ): ObjectFieldBuilder<T> {\n const resolvedProps: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(properties)) {\n resolvedProps[key] = builder.build();\n }\n return new ObjectFieldBuilder<T>(resolvedProps);\n },\n\n json(): JsonFieldBuilder {\n return new JsonFieldBuilder();\n },\n\n literal<T extends string | number | boolean>(value: T): LiteralFieldBuilder<T> {\n return new LiteralFieldBuilder<T>(value);\n },\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n return new EnumFieldBuilder<E[number]>(values);\n },\n};\n\nexport { resolveFields, type SchemaFieldsInput };\n","import type { Schema, FieldDefinition, TimestampConfig, CompoundIndexDefinition } from \"../types\";\nimport { resolveFields, type SchemaFieldsInput } from \"./schema-builder\";\n\ninterface SchemaInput<\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = boolean | TimestampConfig,\n> {\n collection?: string;\n timestamps?: TTimestamps;\n validation?: {\n enabled?: boolean;\n mode?: \"strict\" | \"loose\" | \"off\";\n };\n connection?: string;\n fields: TFields;\n indexes?: CompoundIndexDefinition[];\n}\n\ntype InferSchemaFields<TFields extends SchemaFieldsInput> = {\n [K in keyof TFields]: TFields[K] extends { build(): infer FD }\n ? FD extends FieldDefinition<infer T>\n ? FieldDefinition<T> & {\n required: TFields[K] extends { _required: true } ? true : false;\n unique: TFields[K] extends { _unique: true } ? true : false;\n }\n : FieldDefinition\n : FieldDefinition;\n};\n\n// Resolved timestamp config type\ntype ResolvedTimestamps<T> = T extends true\n ? { createdAt: \"createdAt\"; updatedAt: \"updatedAt\" }\n : T extends TimestampConfig\n ? T\n : false;\n\nexport type InferredSchema<\n TName extends string,\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = true,\n> = Omit<Schema<TName, InferSchemaFields<TFields>>, \"timestamps\"> & {\n readonly timestamps: ResolvedTimestamps<TTimestamps>;\n readonly __fields: TFields;\n};\n\nexport function schema<\n const TName extends string,\n const TFields extends SchemaFieldsInput,\n const TTimestamps extends boolean | TimestampConfig = false,\n>(\n name: TName,\n definition: SchemaInput<TFields, TTimestamps>\n): InferredSchema<TName, TFields, TTimestamps> {\n const resolvedFields = resolveFields(definition.fields);\n\n const timestamps: TimestampConfig | false =\n definition.timestamps === true\n ? { createdAt: \"createdAt\", updatedAt: \"updatedAt\" }\n : definition.timestamps === false || definition.timestamps === undefined\n ? false\n : definition.timestamps;\n\n return {\n name,\n collection: definition.collection ?? name,\n timestamps,\n validation: definition.validation ?? { enabled: false, mode: \"off\" },\n connection: definition.connection,\n fields: resolvedFields,\n indexes: definition.indexes ?? [],\n } as unknown as InferredSchema<TName, TFields, TTimestamps>;\n}\n\n// Alias for backwards compatibility\nexport const defineSchema = schema;\n\nexport function getFieldIndexes(schema: Schema): Array<{\n field: string;\n options: NonNullable<FieldDefinition[\"index\"]>;\n}> {\n const indexes: Array<{ field: string; options: NonNullable<FieldDefinition[\"index\"]> }> = [];\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n if (fieldDef.index) {\n indexes.push({ field: fieldName, options: fieldDef.index });\n }\n if (fieldDef.unique && !fieldDef.index) {\n indexes.push({ field: fieldName, options: { unique: true } });\n }\n }\n\n return indexes;\n}\n","import { z, type ZodTypeAny } from \"zod\";\nimport type { Schema, FieldDefinition } from \"../types\";\n\n/**\n * Validates if a value is a valid MongoDB ObjectId.\n * Accepts both ObjectId instances and 24-character hex strings.\n */\nfunction isObjectId(value: unknown): boolean {\n if (typeof value === \"object\" && value !== null) {\n return (\n \"toHexString\" in value &&\n typeof (value as { toHexString: unknown }).toHexString === \"function\"\n );\n }\n if (typeof value === \"string\") {\n return /^[a-fA-F0-9]{24}$/.test(value);\n }\n return false;\n}\n\n/**\n * Builds a Zod string schema with optional constraints.\n */\nfunction buildStringSchema(field: FieldDefinition): ZodTypeAny {\n // Handle enum as a special case\n if (field.enum) {\n return z.enum(field.enum as [string, ...string[]]);\n }\n\n let schema = z.string();\n if (field.minLength !== undefined) schema = schema.min(field.minLength);\n if (field.maxLength !== undefined) schema = schema.max(field.maxLength);\n if (field.pattern) schema = schema.regex(field.pattern);\n if (field.email) schema = schema.email();\n if (field.url) schema = schema.url();\n return schema;\n}\n\n/**\n * Builds a Zod number schema with optional min/max constraints.\n */\nfunction buildNumberSchema(field: FieldDefinition): ZodTypeAny {\n let schema = z.number();\n if (field.min !== undefined) schema = schema.min(field.min);\n if (field.max !== undefined) schema = schema.max(field.max);\n return schema;\n}\n\n/**\n * Builds a Zod array schema with typed items.\n */\nfunction buildArraySchema(field: FieldDefinition): ZodTypeAny {\n return field.items ? z.array(fieldToZod(field.items)) : z.array(z.unknown());\n}\n\n/**\n * Builds a Zod object schema with typed properties.\n */\nfunction buildObjectSchema(field: FieldDefinition): ZodTypeAny {\n if (!field.properties) {\n return z.record(z.unknown());\n }\n\n const shape: Record<string, ZodTypeAny> = {};\n for (const [key, prop] of Object.entries(field.properties)) {\n shape[key] = fieldToZod(prop);\n }\n return z.object(shape);\n}\n\n/** Maps field types to their Zod schema builders */\nconst typeBuilders: Record<string, (field: FieldDefinition) => ZodTypeAny> = {\n string: buildStringSchema,\n number: buildNumberSchema,\n boolean: () => z.boolean(),\n date: () => z.date(),\n objectId: () => z.union([z.string(), z.custom((val: unknown) => isObjectId(val))]),\n array: buildArraySchema,\n object: buildObjectSchema,\n json: () => z.unknown(),\n literal: (field) => z.literal(field.literal as string | number | boolean),\n};\n\n/**\n * Converts a FieldDefinition to a Zod schema.\n * Handles all field types, required/optional, and default values.\n *\n * @param field - The field definition from schema\n * @returns Zod schema for validation\n */\nfunction fieldToZod(field: FieldDefinition): ZodTypeAny {\n const builder = typeBuilders[field.type];\n let schema = builder ? builder(field) : z.unknown();\n\n // Apply optional/nullable for non-required fields\n if (!field.required) {\n schema = schema.optional().nullable();\n }\n\n // Apply default value (skip \"auto\" which is handled at runtime)\n if (field.default !== undefined && field.default !== \"auto\") {\n schema = schema.default(field.default);\n }\n\n return schema;\n}\n\n/**\n * Creates a complete Zod schema from a Mondel schema definition.\n * Includes all fields and timestamp fields if configured.\n *\n * @param schema - Mondel schema definition\n * @returns Zod object schema for full document validation\n *\n * @example\n * ```typescript\n * const zod = zodSchema(userSchema);\n * const result = zod.safeParse(document);\n * ```\n */\nexport function zodSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n shape[fieldName] = fieldToZod(fieldDef);\n }\n\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) {\n shape[ts.createdAt] = z.date().optional();\n }\n if (ts.updatedAt) {\n shape[ts.updatedAt] = z.date().optional();\n }\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for insert operations.\n * Excludes _id and timestamp fields (auto-generated).\n * Used internally by `create()` and `createMany()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema for create validation\n */\nexport function zodCreateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const fullSchema = zodSchema(schema);\n const shape = { ...fullSchema.shape };\n\n // Remove auto-generated fields\n delete shape[\"_id\"];\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) delete shape[ts.createdAt];\n if (ts.updatedAt) delete shape[ts.updatedAt];\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for update operations.\n * All fields become optional (partial update support).\n * Used internally by `updateOne()`, `updateMany()`, `updateById()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema with all fields optional\n */\nexport function zodUpdateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const createSchema = zodCreateSchema(schema);\n return createSchema.partial();\n}\n\n/**\n * Validates data against a Zod schema.\n *\n * @param schema - Zod schema to validate against\n * @param data - Data to validate\n * @returns Result object with success status and data or errors\n *\n * @example\n * ```typescript\n * const result = validate(zodCreateSchema(userSchema), userData);\n * if (result.success) {\n * console.log(result.data);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validate<T>(\n schema: z.ZodType<T>,\n data: unknown\n): { success: true; data: T } | { success: false; errors: z.ZodError } {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n","import {\n ObjectId,\n type Collection,\n type Db,\n type Document,\n type Filter,\n type FindOptions as MongoFindOptions,\n type UpdateFilter,\n type OptionalUnlessRequiredId,\n type WithId,\n type InsertOneResult,\n type InsertManyResult,\n type UpdateResult,\n type DeleteResult,\n type CountDocumentsOptions,\n type AggregateOptions,\n} from \"mongodb\";\nimport type {\n Schema,\n FindOptions,\n CreateOptions,\n CreateManyOptions,\n UpdateOptions,\n DeleteOptions,\n ValidationMode,\n} from \"../types\";\nimport { zodCreateSchema, zodUpdateSchema } from \"../validation/zod-schema\";\n\n/**\n * Type-safe collection proxy for MongoDB operations.\n * Provides CRUD methods with full TypeScript support and Zod validation.\n *\n * @template TSchema - The schema type for this collection\n *\n * @example\n * ```typescript\n * // Access via client\n * const db = await getMondelClient(env);\n * const users = await db.users.findMany({ isActive: true });\n * ```\n */\nexport class CollectionProxy<TSchema extends Schema> {\n private collection: Collection<Document>;\n private schema: TSchema;\n private validationMode: ValidationMode;\n\n constructor(db: Db, schema: TSchema, validationMode: ValidationMode = \"strict\") {\n this.collection = db.collection(schema.collection);\n this.schema = schema;\n this.validationMode = validationMode;\n }\n\n private validateCreate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodCreateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw result.error;\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n private validateUpdate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodUpdateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw result.error;\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n /**\n * Find a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by email\n * const user = await db.users.findOne({ email: \"john@example.com\" });\n *\n * // With field selection\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { select: { _id: true, email: true, name: true } }\n * );\n *\n * // With session (for transactions)\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { session }\n * );\n * ```\n */\n async findOne(\n where: Filter<Document>,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const mongoOptions: MongoFindOptions = {};\n if (options?.session) {\n mongoOptions.session = options.session;\n }\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n }\n if (options?.sort) {\n mongoOptions.sort = options.sort;\n }\n\n return this.collection.findOne(where, mongoOptions);\n }\n\n /**\n * Find multiple documents matching the filter.\n *\n * @param where - MongoDB filter query (optional, defaults to {})\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns Array of matching documents\n *\n * @example\n * ```typescript\n * // Find all active users\n * const users = await db.users.findMany({ isActive: true });\n *\n * // With pagination and sorting\n * const users = await db.users.findMany(\n * { role: \"ADMIN\" },\n * {\n * select: { _id: true, email: true, name: true },\n * sort: { createdAt: -1 },\n * skip: 0,\n * limit: 10\n * }\n * );\n *\n * // Using MongoDB operators\n * const users = await db.users.findMany({\n * age: { $gte: 18, $lte: 65 },\n * role: { $in: [\"ADMIN\", \"MODERATOR\"] }\n * });\n * ```\n */\n async findMany(\n where: Filter<Document> = {},\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document>[]> {\n const mongoOptions: MongoFindOptions = {};\n if (options?.session) {\n mongoOptions.session = options.session;\n }\n\n let cursor = this.collection.find(where, mongoOptions);\n\n if (options?.select) {\n cursor = cursor.project(options.select as Document);\n }\n if (options?.sort) {\n cursor = cursor.sort(options.sort);\n }\n if (options?.skip !== undefined) {\n cursor = cursor.skip(options.skip);\n }\n if (options?.limit !== undefined) {\n cursor = cursor.limit(options.limit);\n }\n\n return cursor.toArray();\n }\n\n /**\n * Find a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Find options (select, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by string ID\n * const user = await db.users.findById(\"507f1f77bcf86cd799439011\");\n *\n * // Find by ObjectId\n * const user = await db.users.findById(new ObjectId(\"507f1f77bcf86cd799439011\"));\n *\n * // With field selection\n * const user = await db.users.findById(userId, {\n * select: { email: true, name: true }\n * });\n * ```\n */\n async findById(\n id: ObjectId | string,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const objectId = this.parseObjectId(id);\n const mongoOptions: MongoFindOptions = { ...options };\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n delete (mongoOptions as Record<string, unknown>).select;\n }\n\n return this.collection.findOne({ _id: objectId }, mongoOptions);\n }\n\n /**\n * Create a new document.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Document data (validated against schema)\n * @param options - Create options (timestamps, session)\n * @returns Insert result with insertedId\n *\n * @example\n * ```typescript\n * // Create a user\n * const result = await db.users.create({\n * email: \"john@example.com\",\n * name: \"John Doe\",\n * role: \"USER\"\n * });\n * console.log(result.insertedId); // ObjectId\n *\n * // Disable automatic timestamps\n * await db.users.create(userData, { timestamps: false });\n *\n * // With session (for transactions)\n * await db.users.create(userData, { session });\n * ```\n */\n async create(\n data: OptionalUnlessRequiredId<Document>,\n options?: CreateOptions\n ): Promise<InsertOneResult> {\n this.validateCreate(data);\n const doc = this.applyTimestamps(data, \"create\", options?.timestamps);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.insertOne(doc, mongoOptions);\n }\n\n /**\n * Create multiple documents in a single operation.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Array of document data\n * @param options - Create options (timestamps, ordered, session)\n * @returns Insert result with insertedIds\n *\n * @example\n * ```typescript\n * // Create multiple users\n * const result = await db.users.createMany([\n * { email: \"user1@example.com\", name: \"User 1\" },\n * { email: \"user2@example.com\", name: \"User 2\" },\n * { email: \"user3@example.com\", name: \"User 3\" }\n * ]);\n * console.log(result.insertedIds); // { 0: ObjectId, 1: ObjectId, 2: ObjectId }\n *\n * // With session (for transactions)\n * await db.users.createMany(usersData, { session });\n * ```\n */\n async createMany(\n data: OptionalUnlessRequiredId<Document>[],\n options?: CreateManyOptions\n ): Promise<InsertManyResult> {\n for (const item of data) {\n this.validateCreate(item);\n }\n const docs = data.map((d) => this.applyTimestamps(d, \"create\", options?.timestamps));\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.insertMany(docs, mongoOptions);\n }\n\n /**\n * Update a single document matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators ($set, $inc, etc.)\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount, upsertedId\n *\n * @example\n * ```typescript\n * // Simple update (automatically wrapped in $set)\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { name: \"John Smith\" }\n * );\n *\n * // Using MongoDB operators\n * await db.users.updateOne(\n * { _id: userId },\n * { $set: { name: \"John\" }, $inc: { loginCount: 1 } }\n * );\n *\n * // Upsert - create if not exists\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { $set: { name: \"John\", isActive: true } },\n * { upsert: true }\n * );\n *\n * // With session (for transactions)\n * await db.users.updateOne(filter, update, { session });\n * ```\n */\n async updateOne(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n // Only validate if data is a plain update object (not using operators like $set)\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateOne(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update multiple documents matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Deactivate all users with expired subscriptions\n * await db.users.updateMany(\n * { subscriptionExpiry: { $lt: new Date() } },\n * { $set: { isActive: false } }\n * );\n *\n * // Increment login count for all admins\n * await db.users.updateMany(\n * { role: \"ADMIN\" },\n * { $inc: { loginCount: 1 } }\n * );\n * ```\n */\n async updateMany(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateMany(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update a document by its _id.\n * Convenience method that wraps updateOne with _id filter.\n *\n * @param id - ObjectId or string representation\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Update by ID\n * await db.users.updateById(userId, { name: \"New Name\" });\n *\n * // Using operators\n * await db.users.updateById(userId, {\n * $set: { name: \"New Name\" },\n * $push: { tags: \"premium\" }\n * });\n * ```\n */\n async updateById(\n id: ObjectId | string,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const objectId = this.parseObjectId(id);\n return this.updateOne({ _id: objectId }, data, options);\n }\n\n /**\n * Delete a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete by email\n * await db.users.deleteOne({ email: \"john@example.com\" });\n *\n * // With session (for transactions)\n * await db.users.deleteOne({ _id: userId }, { session });\n * ```\n */\n async deleteOne(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteOne(where, mongoOptions);\n }\n\n /**\n * Delete multiple documents matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * const result = await db.users.deleteMany({ isActive: false });\n * console.log(`Deleted ${result.deletedCount} users`);\n *\n * // Delete users created before a date\n * await db.users.deleteMany({\n * createdAt: { $lt: new Date(\"2023-01-01\") }\n * });\n * ```\n */\n async deleteMany(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteMany(where, mongoOptions);\n }\n\n /**\n * Delete a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * await db.users.deleteById(\"507f1f77bcf86cd799439011\");\n * await db.users.deleteById(userId, { session });\n * ```\n */\n async deleteById(id: ObjectId | string, options?: DeleteOptions): Promise<DeleteResult> {\n const objectId = this.parseObjectId(id);\n return this.deleteOne({ _id: objectId }, options);\n }\n\n /**\n * Count documents matching the filter.\n *\n * @param where - MongoDB filter query (optional)\n * @param options - Count options (limit, skip, session)\n * @returns Number of matching documents\n *\n * @example\n * ```typescript\n * // Count all users\n * const total = await db.users.count();\n *\n * // Count active users\n * const activeCount = await db.users.count({ isActive: true });\n *\n * // Count with limit (for existence check optimization)\n * const hasAdmins = await db.users.count({ role: \"ADMIN\" }, { limit: 1 }) > 0;\n * ```\n */\n async count(where: Filter<Document> = {}, options?: CountDocumentsOptions): Promise<number> {\n return this.collection.countDocuments(where, options);\n }\n\n /**\n * Check if any document matches the filter.\n * Optimized to stop after finding first match.\n *\n * @param where - MongoDB filter query\n * @param options - Count options (session)\n * @returns true if at least one document matches\n *\n * @example\n * ```typescript\n * // Check if email is taken\n * const emailTaken = await db.users.exists({ email: \"john@example.com\" });\n *\n * // Check if user has admin role\n * const isAdmin = await db.users.exists({ _id: userId, role: \"ADMIN\" });\n * ```\n */\n async exists(where: Filter<Document>, options?: CountDocumentsOptions): Promise<boolean> {\n const count = await this.collection.countDocuments(where, { ...options, limit: 1 });\n return count > 0;\n }\n\n /**\n * Run an aggregation pipeline.\n * Provides full access to MongoDB aggregation framework.\n *\n * @param pipeline - Array of aggregation stages\n * @param options - Aggregation options (allowDiskUse, session)\n * @returns Array of aggregation results\n *\n * @example\n * ```typescript\n * // Group users by role and count\n * const stats = await db.users.aggregate([\n * { $match: { isActive: true } },\n * { $group: { _id: \"$role\", count: { $sum: 1 } } },\n * { $sort: { count: -1 } }\n * ]);\n *\n * // Lookup related documents\n * const usersWithPosts = await db.users.aggregate([\n * { $lookup: {\n * from: \"posts\",\n * localField: \"_id\",\n * foreignField: \"authorId\",\n * as: \"posts\"\n * }}\n * ]);\n *\n * // With options\n * const bigResult = await db.users.aggregate(pipeline, {\n * allowDiskUse: true\n * });\n * ```\n */\n async aggregate(pipeline: Document[], options?: AggregateOptions): Promise<Document[]> {\n return this.collection.aggregate(pipeline, options).toArray();\n }\n\n /**\n * Get the underlying MongoDB Collection instance.\n * Use for advanced operations not covered by the proxy.\n *\n * @returns MongoDB Collection instance\n *\n * @example\n * ```typescript\n * const collection = db.users.getCollection();\n *\n * // Use for watch, bulkWrite, or other advanced operations\n * const changeStream = collection.watch();\n * ```\n */\n getCollection(): Collection<Document> {\n return this.collection;\n }\n\n private applyTimestamps(\n data: Document,\n operation: \"create\" | \"update\",\n enabled?: boolean\n ): Document {\n if (enabled === false || !this.schema.timestamps) {\n return data;\n }\n\n const timestamps = this.schema.timestamps;\n const now = new Date();\n const result = { ...data };\n\n if (operation === \"create\" && timestamps.createdAt) {\n result[timestamps.createdAt] = now;\n }\n if (timestamps.updatedAt) {\n result[timestamps.updatedAt] = now;\n }\n\n return result;\n }\n\n private parseObjectId(id: ObjectId | string): ObjectId {\n return typeof id === \"string\" ? new ObjectId(id) : id;\n }\n\n private applyUpdateTimestamps(\n data: Document,\n hasOperators: boolean,\n options?: UpdateOptions\n ): UpdateFilter<Document> {\n const schemaTimestamps = this.schema.timestamps;\n\n // If no processing needed, return data as-is (or wrapped in $set if no operators)\n if (!schemaTimestamps) {\n return hasOperators ? (data as UpdateFilter<Document>) : { $set: data };\n }\n\n const timestamps = schemaTimestamps;\n const now = new Date();\n\n // Initialize update object\n const update: UpdateFilter<Document> = hasOperators ? { ...data } : { $set: { ...data } };\n\n // 1. Handle updatedAt in $set\n if (timestamps.updatedAt) {\n update.$set = update.$set || {};\n // Only set if not already present in the update data\n if (!(timestamps.updatedAt in update.$set)) {\n update.$set[timestamps.updatedAt] = now;\n }\n }\n\n // 2. Handle createdAt in $setOnInsert (only if upsert is true)\n if (options?.upsert && timestamps.createdAt) {\n update.$setOnInsert = update.$setOnInsert || {};\n // Only set if not already present\n if (!(timestamps.createdAt in update.$setOnInsert)) {\n update.$setOnInsert[timestamps.createdAt] = now;\n }\n }\n\n return update;\n }\n}\n","import {\n MongoClient,\n type Db,\n type MongoClientOptions,\n type IndexSpecification,\n type CreateIndexesOptions,\n type ClientSession,\n type ClientSessionOptions,\n} from \"mongodb\";\nimport { CollectionProxy } from \"../manager/collection-proxy\";\nimport type { Schema, ValidationMode, SchemaToCollectionProxy, FieldDefinition } from \"../types\";\nimport { getFieldIndexes } from \"../schema/define-schema\";\n\ntype AnySchema = Schema<string, Record<string, FieldDefinition>>;\n\n/**\n * Configuration for serverless environments (Cloudflare Workers, Vercel Edge, etc.)\n * Returns a factory function that creates connections on-demand.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const connectDb = createClient({\n * serverless: true,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: false, // Recommended for serverless\n * validation: \"strict\"\n * });\n *\n * // Later, in request handler:\n * const db = await connectDb(env.MONGODB_URI);\n * ```\n */\nexport interface ServerlessClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Must be true for serverless mode */\n serverless: true;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: false for serverless) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n}\n\n/**\n * Configuration for traditional Node.js environments.\n * Connects immediately and returns a ready-to-use client.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const db = await createClient({\n * uri: process.env.MONGODB_URI,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n * ```\n */\nexport interface NodeClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Set to false or omit for Node.js mode */\n serverless?: false;\n /** MongoDB connection URI (e.g., mongodb://localhost:27017/mydb) */\n uri: string;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: true) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n /** MongoDB driver options (maxPoolSize, etc.) */\n options?: MongoClientOptions;\n}\n\n/**\n * Union type of all client configurations.\n */\nexport type ClientConfig<TSchemas extends readonly AnySchema[]> =\n | ServerlessClientConfig<TSchemas>\n | NodeClientConfig<TSchemas>;\n\n// Client methods type\ntype ClientMethods = {\n readonly close: () => Promise<void>;\n readonly getDb: () => Db;\n readonly startSession: (options?: ClientSessionOptions) => ClientSession;\n};\n\n// Extract schema names as a union type\ntype SchemaNames<TSchemas extends readonly AnySchema[]> = TSchemas[number][\"name\"];\n\n// All valid keys for the client\ntype ValidClientKeys<TSchemas extends readonly AnySchema[]> =\n | SchemaNames<TSchemas>\n | keyof ClientMethods;\n\n// Create a type that only allows access to valid keys\nexport type SchemasToClient<TSchemas extends readonly AnySchema[]> = {\n readonly [K in ValidClientKeys<TSchemas>]: K extends SchemaNames<TSchemas>\n ? SchemaToCollectionProxy<Extract<TSchemas[number], { name: K }>>\n : K extends keyof ClientMethods\n ? ClientMethods[K]\n : never;\n};\n\nasync function syncIndexes(db: Db, schemas: readonly Schema[]): Promise<void> {\n for (const schema of schemas) {\n const collection = db.collection(schema.collection);\n\n const fieldIndexes = getFieldIndexes(schema);\n for (const { field, options } of fieldIndexes) {\n const indexSpec: IndexSpecification = {\n [field]: options.type ?? 1,\n };\n const indexOptions: CreateIndexesOptions = {};\n\n if (options.name) indexOptions.name = options.name;\n if (options.unique) indexOptions.unique = options.unique;\n if (options.sparse) indexOptions.sparse = options.sparse;\n if (options.expireAfterSeconds !== undefined) {\n indexOptions.expireAfterSeconds = options.expireAfterSeconds;\n }\n if (options.partialFilterExpression) {\n indexOptions.partialFilterExpression = options.partialFilterExpression;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n\n for (const index of schema.indexes) {\n const indexSpec: IndexSpecification = index.fields as IndexSpecification;\n const indexOptions: CreateIndexesOptions = {};\n\n if (index.options?.name) indexOptions.name = index.options.name;\n if (index.options?.unique) indexOptions.unique = index.options.unique;\n if (index.options?.sparse) indexOptions.sparse = index.options.sparse;\n if (index.options?.partialFilterExpression) {\n indexOptions.partialFilterExpression = index.options.partialFilterExpression;\n }\n if (index.options?.weights) {\n indexOptions.weights = index.options.weights;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n }\n}\n\nfunction createClientProxy<TSchemas extends readonly AnySchema[]>(\n client: MongoClient,\n db: Db,\n schemas: TSchemas,\n validationMode: ValidationMode\n): SchemasToClient<TSchemas> {\n const schemaMap = new Map<string, Schema>();\n const proxyCache = new Map<string, CollectionProxy<Schema>>();\n\n for (const schema of schemas) {\n schemaMap.set(schema.name, schema);\n }\n\n const baseClient = {\n async close() {\n await client.close();\n },\n getDb() {\n return db;\n },\n startSession(options?: ClientSessionOptions) {\n return client.startSession(options);\n },\n };\n\n // Properties that should return undefined (not collections)\n const IGNORED_PROPERTIES = new Set([\n \"then\",\n \"catch\",\n \"finally\",\n \"inspect\",\n \"nodeType\",\n \"toJSON\",\n \"constructor\",\n \"prototype\",\n \"__proto__\",\n ]);\n\n return new Proxy(baseClient as SchemasToClient<TSchemas>, {\n get(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return Reflect.get(target, prop);\n }\n\n if (IGNORED_PROPERTIES.has(prop)) {\n return undefined;\n }\n\n if (prop in target) {\n const value = target[prop as keyof typeof target];\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n return value;\n }\n\n const schema = schemaMap.get(prop);\n if (schema) {\n let proxy = proxyCache.get(prop);\n if (!proxy) {\n proxy = new CollectionProxy(db, schema, validationMode);\n proxyCache.set(prop, proxy);\n }\n return proxy;\n }\n\n return undefined;\n },\n\n has(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (IGNORED_PROPERTIES.has(prop)) return false;\n return prop in target || schemaMap.has(prop);\n },\n\n ownKeys(target) {\n const baseKeys = Reflect.ownKeys(target);\n const schemaNames = Array.from(schemaMap.keys());\n return [...new Set([...baseKeys, ...schemaNames])];\n },\n });\n}\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Serverless Mode** (recommended for Cloudflare Workers, Vercel Edge):\n * Returns a factory function that creates connections on-demand.\n *\n * @param config - Client configuration with `serverless: true`\n * @returns Factory function: `(uri: string, options?) => Promise<Client>`\n *\n * @example\n * ```typescript\n * import { createClient, type SchemasToClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * const schemas = [userSchema, postSchema] as const;\n * export type DbClient = SchemasToClient<typeof schemas>;\n *\n * // Create factory (no connection yet)\n * const connectDb = createClient({\n * serverless: true,\n * schemas,\n * syncIndexes: false,\n * validation: \"strict\"\n * });\n *\n * // In request handler\n * export async function handleRequest(env: Env) {\n * const db = await connectDb(env.MONGODB_URI);\n * const users = await db.users.findMany({ isActive: true });\n * await db.close();\n * return users;\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ServerlessClientConfig<TSchemas>\n): (uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>;\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Node.js Mode** (for traditional servers, scripts, tests):\n * Connects immediately and returns a ready-to-use client.\n *\n * @param config - Client configuration with `serverless: false` or omitted\n * @returns Promise resolving to connected client\n *\n * @example\n * ```typescript\n * import { createClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * async function main() {\n * const db = await createClient({\n * uri: process.env.MONGODB_URI!,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n *\n * // Type-safe access to collections\n * const users = await db.users.findMany({ role: \"ADMIN\" });\n *\n * // Close when done\n * await db.close();\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: NodeClientConfig<TSchemas>\n): Promise<SchemasToClient<TSchemas>>;\n\n// Implementation\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ClientConfig<TSchemas>\n):\n | ((uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>)\n | Promise<SchemasToClient<TSchemas>> {\n const { schemas, syncIndexes: shouldSyncIndexes = false, validation = \"strict\" } = config;\n\n if (config.serverless === true) {\n // Serverless mode: return factory function\n return async (uri: string, options?: MongoClientOptions) => {\n const client = new MongoClient(uri, options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n };\n } else {\n // Node.js mode: connect immediately\n return (async () => {\n const client = new MongoClient(config.uri, config.options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n })();\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -315,7 +315,7 @@ var CollectionProxy = class {
315
315
  const result = zodSchema2.safeParse(data);
316
316
  if (!result.success) {
317
317
  if (this.validationMode === "strict") {
318
- throw new Error(`Validation failed: ${result.error.message}`);
318
+ throw result.error;
319
319
  }
320
320
  console.warn(`Validation warning: ${result.error.message}`);
321
321
  }
@@ -326,7 +326,7 @@ var CollectionProxy = class {
326
326
  const result = zodSchema2.safeParse(data);
327
327
  if (!result.success) {
328
328
  if (this.validationMode === "strict") {
329
- throw new Error(`Validation failed: ${result.error.message}`);
329
+ throw result.error;
330
330
  }
331
331
  console.warn(`Validation warning: ${result.error.message}`);
332
332
  }
@@ -358,6 +358,9 @@ var CollectionProxy = class {
358
358
  */
359
359
  async findOne(where, options) {
360
360
  const mongoOptions = {};
361
+ if (options?.session) {
362
+ mongoOptions.session = options.session;
363
+ }
361
364
  if (options?.select) {
362
365
  mongoOptions.projection = options.select;
363
366
  }
@@ -397,7 +400,11 @@ var CollectionProxy = class {
397
400
  * ```
398
401
  */
399
402
  async findMany(where = {}, options) {
400
- let cursor = this.collection.find(where);
403
+ const mongoOptions = {};
404
+ if (options?.session) {
405
+ mongoOptions.session = options.session;
406
+ }
407
+ let cursor = this.collection.find(where, mongoOptions);
401
408
  if (options?.select) {
402
409
  cursor = cursor.project(options.select);
403
410
  }
@@ -470,7 +477,8 @@ var CollectionProxy = class {
470
477
  async create(data, options) {
471
478
  this.validateCreate(data);
472
479
  const doc = this.applyTimestamps(data, "create", options?.timestamps);
473
- return this.collection.insertOne(doc);
480
+ const { timestamps: _timestamps, ...mongoOptions } = options || {};
481
+ return this.collection.insertOne(doc, mongoOptions);
474
482
  }
475
483
  /**
476
484
  * Create multiple documents in a single operation.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema/field-builder.ts","../src/schema/schema-builder.ts","../src/schema/define-schema.ts","../src/validation/zod-schema.ts","../src/manager/collection-proxy.ts","../src/client/client.ts"],"names":["schema","zodSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FieldDefinition, IndexOptions } from \"../types\";\n\n// Branded type for TypeScript inference\ndeclare const __type: unique symbol;\ndeclare const __required: unique symbol;\n\nexport class FieldBuilder<T = unknown, TRequired extends boolean = false> {\n private definition: FieldDefinition<T>;\n\n // Branded types for inference (not used at runtime)\n declare readonly [__type]: T;\n declare readonly [__required]: TRequired;\n\n constructor(type: FieldDefinition[\"type\"]) {\n this.definition = {\n type,\n required: false,\n unique: false,\n };\n }\n\n required(): FieldBuilder<T, true> {\n this.definition.required = true;\n return this as unknown as FieldBuilder<T, true>;\n }\n\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n default(value: T | \"auto\"): this {\n this.definition.default = value;\n return this;\n }\n\n index(options?: IndexOptions): this {\n this.definition.index = options ?? { type: 1 };\n return this;\n }\n\n build(): FieldDefinition<T> {\n return { ...this.definition };\n }\n}\n\n// Helper types for extracting field info\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type InferBuilderType<T> = T extends FieldBuilder<infer V, infer _R> ? V : unknown;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type IsBuilderRequired<T> = T extends FieldBuilder<infer _V, infer R> ? R : false;\n\nexport class StringFieldBuilder extends FieldBuilder<string> {\n constructor() {\n super(\"string\");\n }\n\n min(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.minLength = length;\n return this;\n }\n\n max(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.maxLength = length;\n return this;\n }\n\n pattern(regex: RegExp): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.pattern = regex;\n return this;\n }\n\n email(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.email = true;\n return this;\n }\n\n url(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.url = true;\n return this;\n }\n\n text(): this {\n return this.index({ type: \"text\" });\n }\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n const builder = new EnumFieldBuilder<E[number]>(values);\n const def = this.build();\n if (def.required) builder.required();\n if (def.unique) builder.unique();\n if (def.index) builder.index(def.index);\n return builder;\n }\n}\n\nexport class EnumFieldBuilder<T extends string> extends FieldBuilder<T> {\n constructor(values: readonly T[]) {\n super(\"string\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.enum = values;\n }\n}\n\nexport class NumberFieldBuilder extends FieldBuilder<number> {\n constructor() {\n super(\"number\");\n }\n\n min(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.min = value;\n return this;\n }\n\n max(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.max = value;\n return this;\n }\n}\n\nexport class BooleanFieldBuilder extends FieldBuilder<boolean> {\n constructor() {\n super(\"boolean\");\n }\n}\n\nexport class DateFieldBuilder extends FieldBuilder<Date> {\n constructor() {\n super(\"date\");\n }\n}\n\nexport class ObjectIdFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"objectId\");\n }\n}\n\nexport class ArrayFieldBuilder<T> extends FieldBuilder<T[]> {\n constructor(items: FieldDefinition) {\n super(\"array\");\n (this as unknown as { definition: FieldDefinition<T[]> }).definition.items = items;\n }\n}\n\nexport class ObjectFieldBuilder<T extends Record<string, unknown>> extends FieldBuilder<T> {\n constructor(properties: Record<string, FieldDefinition>) {\n super(\"object\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.properties = properties;\n }\n}\n\nexport class JsonFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"json\");\n }\n}\n\nexport class LiteralFieldBuilder<T extends string | number | boolean> extends FieldBuilder<T> {\n constructor(value: T) {\n super(\"literal\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.literal = value;\n }\n}\n","import type { FieldDefinition, IndexOptions } from \"../types\";\nimport {\n StringFieldBuilder,\n NumberFieldBuilder,\n BooleanFieldBuilder,\n DateFieldBuilder,\n ObjectIdFieldBuilder,\n ArrayFieldBuilder,\n ObjectFieldBuilder,\n JsonFieldBuilder,\n LiteralFieldBuilder,\n EnumFieldBuilder,\n type FieldBuilder,\n} from \"./field-builder\";\n\ntype FieldBuilderResult = {\n build(): FieldDefinition;\n required(): FieldBuilderResult;\n unique(): FieldBuilderResult;\n default(value: unknown): FieldBuilderResult;\n index(options?: IndexOptions): FieldBuilderResult;\n};\n\ntype SchemaFieldsInput = Record<string, FieldBuilderResult>;\n\n// Type to infer the value type from a field builder\nexport type InferFieldBuilderType<T> = T extends FieldBuilder<infer V> ? V : unknown;\n\nfunction resolveFields(fields: SchemaFieldsInput): Record<string, FieldDefinition> {\n const resolved: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(fields)) {\n resolved[key] = builder.build();\n }\n return resolved;\n}\n\nexport const s = {\n string(): StringFieldBuilder {\n return new StringFieldBuilder();\n },\n\n number(): NumberFieldBuilder {\n return new NumberFieldBuilder();\n },\n\n boolean(): BooleanFieldBuilder {\n return new BooleanFieldBuilder();\n },\n\n date(): DateFieldBuilder {\n return new DateFieldBuilder();\n },\n\n objectId(): ObjectIdFieldBuilder {\n return new ObjectIdFieldBuilder();\n },\n\n array<T>(items: { build(): FieldDefinition }): ArrayFieldBuilder<T> {\n return new ArrayFieldBuilder<T>(items.build());\n },\n\n object<T extends Record<string, unknown>>(\n properties: Record<string, { build(): FieldDefinition }>\n ): ObjectFieldBuilder<T> {\n const resolvedProps: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(properties)) {\n resolvedProps[key] = builder.build();\n }\n return new ObjectFieldBuilder<T>(resolvedProps);\n },\n\n json(): JsonFieldBuilder {\n return new JsonFieldBuilder();\n },\n\n literal<T extends string | number | boolean>(value: T): LiteralFieldBuilder<T> {\n return new LiteralFieldBuilder<T>(value);\n },\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n return new EnumFieldBuilder<E[number]>(values);\n },\n};\n\nexport { resolveFields, type SchemaFieldsInput };\n","import type { Schema, FieldDefinition, TimestampConfig, CompoundIndexDefinition } from \"../types\";\nimport { resolveFields, type SchemaFieldsInput } from \"./schema-builder\";\n\ninterface SchemaInput<\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = boolean | TimestampConfig,\n> {\n collection?: string;\n timestamps?: TTimestamps;\n validation?: {\n enabled?: boolean;\n mode?: \"strict\" | \"loose\" | \"off\";\n };\n connection?: string;\n fields: TFields;\n indexes?: CompoundIndexDefinition[];\n}\n\ntype InferSchemaFields<TFields extends SchemaFieldsInput> = {\n [K in keyof TFields]: TFields[K] extends { build(): infer FD }\n ? FD extends FieldDefinition<infer T>\n ? FieldDefinition<T> & {\n required: TFields[K] extends { _required: true } ? true : false;\n unique: TFields[K] extends { _unique: true } ? true : false;\n }\n : FieldDefinition\n : FieldDefinition;\n};\n\n// Resolved timestamp config type\ntype ResolvedTimestamps<T> = T extends true\n ? { createdAt: \"createdAt\"; updatedAt: \"updatedAt\" }\n : T extends TimestampConfig\n ? T\n : false;\n\nexport type InferredSchema<\n TName extends string,\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = true,\n> = Omit<Schema<TName, InferSchemaFields<TFields>>, \"timestamps\"> & {\n readonly timestamps: ResolvedTimestamps<TTimestamps>;\n readonly __fields: TFields;\n};\n\nexport function schema<\n const TName extends string,\n const TFields extends SchemaFieldsInput,\n const TTimestamps extends boolean | TimestampConfig = false,\n>(\n name: TName,\n definition: SchemaInput<TFields, TTimestamps>\n): InferredSchema<TName, TFields, TTimestamps> {\n const resolvedFields = resolveFields(definition.fields);\n\n const timestamps: TimestampConfig | false =\n definition.timestamps === true\n ? { createdAt: \"createdAt\", updatedAt: \"updatedAt\" }\n : definition.timestamps === false || definition.timestamps === undefined\n ? false\n : definition.timestamps;\n\n return {\n name,\n collection: definition.collection ?? name,\n timestamps,\n validation: definition.validation ?? { enabled: false, mode: \"off\" },\n connection: definition.connection,\n fields: resolvedFields,\n indexes: definition.indexes ?? [],\n } as unknown as InferredSchema<TName, TFields, TTimestamps>;\n}\n\n// Alias for backwards compatibility\nexport const defineSchema = schema;\n\nexport function getFieldIndexes(schema: Schema): Array<{\n field: string;\n options: NonNullable<FieldDefinition[\"index\"]>;\n}> {\n const indexes: Array<{ field: string; options: NonNullable<FieldDefinition[\"index\"]> }> = [];\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n if (fieldDef.index) {\n indexes.push({ field: fieldName, options: fieldDef.index });\n }\n if (fieldDef.unique && !fieldDef.index) {\n indexes.push({ field: fieldName, options: { unique: true } });\n }\n }\n\n return indexes;\n}\n","import { z, type ZodTypeAny } from \"zod\";\nimport type { Schema, FieldDefinition } from \"../types\";\n\n/**\n * Validates if a value is a valid MongoDB ObjectId.\n * Accepts both ObjectId instances and 24-character hex strings.\n */\nfunction isObjectId(value: unknown): boolean {\n if (typeof value === \"object\" && value !== null) {\n return (\n \"toHexString\" in value &&\n typeof (value as { toHexString: unknown }).toHexString === \"function\"\n );\n }\n if (typeof value === \"string\") {\n return /^[a-fA-F0-9]{24}$/.test(value);\n }\n return false;\n}\n\n/**\n * Builds a Zod string schema with optional constraints.\n */\nfunction buildStringSchema(field: FieldDefinition): ZodTypeAny {\n // Handle enum as a special case\n if (field.enum) {\n return z.enum(field.enum as [string, ...string[]]);\n }\n\n let schema = z.string();\n if (field.minLength !== undefined) schema = schema.min(field.minLength);\n if (field.maxLength !== undefined) schema = schema.max(field.maxLength);\n if (field.pattern) schema = schema.regex(field.pattern);\n if (field.email) schema = schema.email();\n if (field.url) schema = schema.url();\n return schema;\n}\n\n/**\n * Builds a Zod number schema with optional min/max constraints.\n */\nfunction buildNumberSchema(field: FieldDefinition): ZodTypeAny {\n let schema = z.number();\n if (field.min !== undefined) schema = schema.min(field.min);\n if (field.max !== undefined) schema = schema.max(field.max);\n return schema;\n}\n\n/**\n * Builds a Zod array schema with typed items.\n */\nfunction buildArraySchema(field: FieldDefinition): ZodTypeAny {\n return field.items ? z.array(fieldToZod(field.items)) : z.array(z.unknown());\n}\n\n/**\n * Builds a Zod object schema with typed properties.\n */\nfunction buildObjectSchema(field: FieldDefinition): ZodTypeAny {\n if (!field.properties) {\n return z.record(z.unknown());\n }\n\n const shape: Record<string, ZodTypeAny> = {};\n for (const [key, prop] of Object.entries(field.properties)) {\n shape[key] = fieldToZod(prop);\n }\n return z.object(shape);\n}\n\n/** Maps field types to their Zod schema builders */\nconst typeBuilders: Record<string, (field: FieldDefinition) => ZodTypeAny> = {\n string: buildStringSchema,\n number: buildNumberSchema,\n boolean: () => z.boolean(),\n date: () => z.date(),\n objectId: () => z.union([z.string(), z.custom((val: unknown) => isObjectId(val))]),\n array: buildArraySchema,\n object: buildObjectSchema,\n json: () => z.unknown(),\n literal: (field) => z.literal(field.literal as string | number | boolean),\n};\n\n/**\n * Converts a FieldDefinition to a Zod schema.\n * Handles all field types, required/optional, and default values.\n *\n * @param field - The field definition from schema\n * @returns Zod schema for validation\n */\nfunction fieldToZod(field: FieldDefinition): ZodTypeAny {\n const builder = typeBuilders[field.type];\n let schema = builder ? builder(field) : z.unknown();\n\n // Apply optional/nullable for non-required fields\n if (!field.required) {\n schema = schema.optional().nullable();\n }\n\n // Apply default value (skip \"auto\" which is handled at runtime)\n if (field.default !== undefined && field.default !== \"auto\") {\n schema = schema.default(field.default);\n }\n\n return schema;\n}\n\n/**\n * Creates a complete Zod schema from a Mondel schema definition.\n * Includes all fields and timestamp fields if configured.\n *\n * @param schema - Mondel schema definition\n * @returns Zod object schema for full document validation\n *\n * @example\n * ```typescript\n * const zod = zodSchema(userSchema);\n * const result = zod.safeParse(document);\n * ```\n */\nexport function zodSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n shape[fieldName] = fieldToZod(fieldDef);\n }\n\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) {\n shape[ts.createdAt] = z.date().optional();\n }\n if (ts.updatedAt) {\n shape[ts.updatedAt] = z.date().optional();\n }\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for insert operations.\n * Excludes _id and timestamp fields (auto-generated).\n * Used internally by `create()` and `createMany()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema for create validation\n */\nexport function zodCreateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const fullSchema = zodSchema(schema);\n const shape = { ...fullSchema.shape };\n\n // Remove auto-generated fields\n delete shape[\"_id\"];\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) delete shape[ts.createdAt];\n if (ts.updatedAt) delete shape[ts.updatedAt];\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for update operations.\n * All fields become optional (partial update support).\n * Used internally by `updateOne()`, `updateMany()`, `updateById()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema with all fields optional\n */\nexport function zodUpdateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const createSchema = zodCreateSchema(schema);\n return createSchema.partial();\n}\n\n/**\n * Validates data against a Zod schema.\n *\n * @param schema - Zod schema to validate against\n * @param data - Data to validate\n * @returns Result object with success status and data or errors\n *\n * @example\n * ```typescript\n * const result = validate(zodCreateSchema(userSchema), userData);\n * if (result.success) {\n * console.log(result.data);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validate<T>(\n schema: z.ZodType<T>,\n data: unknown\n): { success: true; data: T } | { success: false; errors: z.ZodError } {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n","import {\n ObjectId,\n type Collection,\n type Db,\n type Document,\n type Filter,\n type FindOptions as MongoFindOptions,\n type UpdateFilter,\n type OptionalUnlessRequiredId,\n type WithId,\n type InsertOneResult,\n type InsertManyResult,\n type UpdateResult,\n type DeleteResult,\n type CountDocumentsOptions,\n type AggregateOptions,\n} from \"mongodb\";\nimport type {\n Schema,\n FindOptions,\n CreateOptions,\n CreateManyOptions,\n UpdateOptions,\n DeleteOptions,\n ValidationMode,\n} from \"../types\";\nimport { zodCreateSchema, zodUpdateSchema } from \"../validation/zod-schema\";\n\n/**\n * Type-safe collection proxy for MongoDB operations.\n * Provides CRUD methods with full TypeScript support and Zod validation.\n *\n * @template TSchema - The schema type for this collection\n *\n * @example\n * ```typescript\n * // Access via client\n * const db = await getMondelClient(env);\n * const users = await db.users.findMany({ isActive: true });\n * ```\n */\nexport class CollectionProxy<TSchema extends Schema> {\n private collection: Collection<Document>;\n private schema: TSchema;\n private validationMode: ValidationMode;\n\n constructor(db: Db, schema: TSchema, validationMode: ValidationMode = \"strict\") {\n this.collection = db.collection(schema.collection);\n this.schema = schema;\n this.validationMode = validationMode;\n }\n\n private validateCreate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodCreateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw new Error(`Validation failed: ${result.error.message}`);\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n private validateUpdate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodUpdateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw new Error(`Validation failed: ${result.error.message}`);\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n /**\n * Find a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by email\n * const user = await db.users.findOne({ email: \"john@example.com\" });\n *\n * // With field selection\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { select: { _id: true, email: true, name: true } }\n * );\n *\n * // With session (for transactions)\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { session }\n * );\n * ```\n */\n async findOne(\n where: Filter<Document>,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const mongoOptions: MongoFindOptions = {};\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n }\n if (options?.sort) {\n mongoOptions.sort = options.sort;\n }\n\n return this.collection.findOne(where, mongoOptions);\n }\n\n /**\n * Find multiple documents matching the filter.\n *\n * @param where - MongoDB filter query (optional, defaults to {})\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns Array of matching documents\n *\n * @example\n * ```typescript\n * // Find all active users\n * const users = await db.users.findMany({ isActive: true });\n *\n * // With pagination and sorting\n * const users = await db.users.findMany(\n * { role: \"ADMIN\" },\n * {\n * select: { _id: true, email: true, name: true },\n * sort: { createdAt: -1 },\n * skip: 0,\n * limit: 10\n * }\n * );\n *\n * // Using MongoDB operators\n * const users = await db.users.findMany({\n * age: { $gte: 18, $lte: 65 },\n * role: { $in: [\"ADMIN\", \"MODERATOR\"] }\n * });\n * ```\n */\n async findMany(\n where: Filter<Document> = {},\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document>[]> {\n let cursor = this.collection.find(where);\n\n if (options?.select) {\n cursor = cursor.project(options.select as Document);\n }\n if (options?.sort) {\n cursor = cursor.sort(options.sort);\n }\n if (options?.skip !== undefined) {\n cursor = cursor.skip(options.skip);\n }\n if (options?.limit !== undefined) {\n cursor = cursor.limit(options.limit);\n }\n\n return cursor.toArray();\n }\n\n /**\n * Find a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Find options (select, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by string ID\n * const user = await db.users.findById(\"507f1f77bcf86cd799439011\");\n *\n * // Find by ObjectId\n * const user = await db.users.findById(new ObjectId(\"507f1f77bcf86cd799439011\"));\n *\n * // With field selection\n * const user = await db.users.findById(userId, {\n * select: { email: true, name: true }\n * });\n * ```\n */\n async findById(\n id: ObjectId | string,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const objectId = this.parseObjectId(id);\n const mongoOptions: MongoFindOptions = { ...options };\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n delete (mongoOptions as Record<string, unknown>).select;\n }\n\n return this.collection.findOne({ _id: objectId }, mongoOptions);\n }\n\n /**\n * Create a new document.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Document data (validated against schema)\n * @param options - Create options (timestamps, session)\n * @returns Insert result with insertedId\n *\n * @example\n * ```typescript\n * // Create a user\n * const result = await db.users.create({\n * email: \"john@example.com\",\n * name: \"John Doe\",\n * role: \"USER\"\n * });\n * console.log(result.insertedId); // ObjectId\n *\n * // Disable automatic timestamps\n * await db.users.create(userData, { timestamps: false });\n *\n * // With session (for transactions)\n * await db.users.create(userData, { session });\n * ```\n */\n async create(\n data: OptionalUnlessRequiredId<Document>,\n options?: CreateOptions\n ): Promise<InsertOneResult> {\n this.validateCreate(data);\n const doc = this.applyTimestamps(data, \"create\", options?.timestamps);\n return this.collection.insertOne(doc);\n }\n\n /**\n * Create multiple documents in a single operation.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Array of document data\n * @param options - Create options (timestamps, ordered, session)\n * @returns Insert result with insertedIds\n *\n * @example\n * ```typescript\n * // Create multiple users\n * const result = await db.users.createMany([\n * { email: \"user1@example.com\", name: \"User 1\" },\n * { email: \"user2@example.com\", name: \"User 2\" },\n * { email: \"user3@example.com\", name: \"User 3\" }\n * ]);\n * console.log(result.insertedIds); // { 0: ObjectId, 1: ObjectId, 2: ObjectId }\n *\n * // With session (for transactions)\n * await db.users.createMany(usersData, { session });\n * ```\n */\n async createMany(\n data: OptionalUnlessRequiredId<Document>[],\n options?: CreateManyOptions\n ): Promise<InsertManyResult> {\n for (const item of data) {\n this.validateCreate(item);\n }\n const docs = data.map((d) => this.applyTimestamps(d, \"create\", options?.timestamps));\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.insertMany(docs, mongoOptions);\n }\n\n /**\n * Update a single document matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators ($set, $inc, etc.)\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount, upsertedId\n *\n * @example\n * ```typescript\n * // Simple update (automatically wrapped in $set)\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { name: \"John Smith\" }\n * );\n *\n * // Using MongoDB operators\n * await db.users.updateOne(\n * { _id: userId },\n * { $set: { name: \"John\" }, $inc: { loginCount: 1 } }\n * );\n *\n * // Upsert - create if not exists\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { $set: { name: \"John\", isActive: true } },\n * { upsert: true }\n * );\n *\n * // With session (for transactions)\n * await db.users.updateOne(filter, update, { session });\n * ```\n */\n async updateOne(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n // Only validate if data is a plain update object (not using operators like $set)\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateOne(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update multiple documents matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Deactivate all users with expired subscriptions\n * await db.users.updateMany(\n * { subscriptionExpiry: { $lt: new Date() } },\n * { $set: { isActive: false } }\n * );\n *\n * // Increment login count for all admins\n * await db.users.updateMany(\n * { role: \"ADMIN\" },\n * { $inc: { loginCount: 1 } }\n * );\n * ```\n */\n async updateMany(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateMany(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update a document by its _id.\n * Convenience method that wraps updateOne with _id filter.\n *\n * @param id - ObjectId or string representation\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Update by ID\n * await db.users.updateById(userId, { name: \"New Name\" });\n *\n * // Using operators\n * await db.users.updateById(userId, {\n * $set: { name: \"New Name\" },\n * $push: { tags: \"premium\" }\n * });\n * ```\n */\n async updateById(\n id: ObjectId | string,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const objectId = this.parseObjectId(id);\n return this.updateOne({ _id: objectId }, data, options);\n }\n\n /**\n * Delete a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete by email\n * await db.users.deleteOne({ email: \"john@example.com\" });\n *\n * // With session (for transactions)\n * await db.users.deleteOne({ _id: userId }, { session });\n * ```\n */\n async deleteOne(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteOne(where, mongoOptions);\n }\n\n /**\n * Delete multiple documents matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * const result = await db.users.deleteMany({ isActive: false });\n * console.log(`Deleted ${result.deletedCount} users`);\n *\n * // Delete users created before a date\n * await db.users.deleteMany({\n * createdAt: { $lt: new Date(\"2023-01-01\") }\n * });\n * ```\n */\n async deleteMany(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteMany(where, mongoOptions);\n }\n\n /**\n * Delete a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * await db.users.deleteById(\"507f1f77bcf86cd799439011\");\n * await db.users.deleteById(userId, { session });\n * ```\n */\n async deleteById(id: ObjectId | string, options?: DeleteOptions): Promise<DeleteResult> {\n const objectId = this.parseObjectId(id);\n return this.deleteOne({ _id: objectId }, options);\n }\n\n /**\n * Count documents matching the filter.\n *\n * @param where - MongoDB filter query (optional)\n * @param options - Count options (limit, skip, session)\n * @returns Number of matching documents\n *\n * @example\n * ```typescript\n * // Count all users\n * const total = await db.users.count();\n *\n * // Count active users\n * const activeCount = await db.users.count({ isActive: true });\n *\n * // Count with limit (for existence check optimization)\n * const hasAdmins = await db.users.count({ role: \"ADMIN\" }, { limit: 1 }) > 0;\n * ```\n */\n async count(where: Filter<Document> = {}, options?: CountDocumentsOptions): Promise<number> {\n return this.collection.countDocuments(where, options);\n }\n\n /**\n * Check if any document matches the filter.\n * Optimized to stop after finding first match.\n *\n * @param where - MongoDB filter query\n * @param options - Count options (session)\n * @returns true if at least one document matches\n *\n * @example\n * ```typescript\n * // Check if email is taken\n * const emailTaken = await db.users.exists({ email: \"john@example.com\" });\n *\n * // Check if user has admin role\n * const isAdmin = await db.users.exists({ _id: userId, role: \"ADMIN\" });\n * ```\n */\n async exists(where: Filter<Document>, options?: CountDocumentsOptions): Promise<boolean> {\n const count = await this.collection.countDocuments(where, { ...options, limit: 1 });\n return count > 0;\n }\n\n /**\n * Run an aggregation pipeline.\n * Provides full access to MongoDB aggregation framework.\n *\n * @param pipeline - Array of aggregation stages\n * @param options - Aggregation options (allowDiskUse, session)\n * @returns Array of aggregation results\n *\n * @example\n * ```typescript\n * // Group users by role and count\n * const stats = await db.users.aggregate([\n * { $match: { isActive: true } },\n * { $group: { _id: \"$role\", count: { $sum: 1 } } },\n * { $sort: { count: -1 } }\n * ]);\n *\n * // Lookup related documents\n * const usersWithPosts = await db.users.aggregate([\n * { $lookup: {\n * from: \"posts\",\n * localField: \"_id\",\n * foreignField: \"authorId\",\n * as: \"posts\"\n * }}\n * ]);\n *\n * // With options\n * const bigResult = await db.users.aggregate(pipeline, {\n * allowDiskUse: true\n * });\n * ```\n */\n async aggregate(pipeline: Document[], options?: AggregateOptions): Promise<Document[]> {\n return this.collection.aggregate(pipeline, options).toArray();\n }\n\n /**\n * Get the underlying MongoDB Collection instance.\n * Use for advanced operations not covered by the proxy.\n *\n * @returns MongoDB Collection instance\n *\n * @example\n * ```typescript\n * const collection = db.users.getCollection();\n *\n * // Use for watch, bulkWrite, or other advanced operations\n * const changeStream = collection.watch();\n * ```\n */\n getCollection(): Collection<Document> {\n return this.collection;\n }\n\n private applyTimestamps(\n data: Document,\n operation: \"create\" | \"update\",\n enabled?: boolean\n ): Document {\n if (enabled === false || !this.schema.timestamps) {\n return data;\n }\n\n const timestamps = this.schema.timestamps;\n const now = new Date();\n const result = { ...data };\n\n if (operation === \"create\" && timestamps.createdAt) {\n result[timestamps.createdAt] = now;\n }\n if (timestamps.updatedAt) {\n result[timestamps.updatedAt] = now;\n }\n\n return result;\n }\n\n private parseObjectId(id: ObjectId | string): ObjectId {\n return typeof id === \"string\" ? new ObjectId(id) : id;\n }\n\n private applyUpdateTimestamps(\n data: Document,\n hasOperators: boolean,\n options?: UpdateOptions\n ): UpdateFilter<Document> {\n const schemaTimestamps = this.schema.timestamps;\n\n // If no processing needed, return data as-is (or wrapped in $set if no operators)\n if (!schemaTimestamps) {\n return hasOperators ? (data as UpdateFilter<Document>) : { $set: data };\n }\n\n const timestamps = schemaTimestamps;\n const now = new Date();\n\n // Initialize update object\n const update: UpdateFilter<Document> = hasOperators ? { ...data } : { $set: { ...data } };\n\n // 1. Handle updatedAt in $set\n if (timestamps.updatedAt) {\n update.$set = update.$set || {};\n // Only set if not already present in the update data\n if (!(timestamps.updatedAt in update.$set)) {\n update.$set[timestamps.updatedAt] = now;\n }\n }\n\n // 2. Handle createdAt in $setOnInsert (only if upsert is true)\n if (options?.upsert && timestamps.createdAt) {\n update.$setOnInsert = update.$setOnInsert || {};\n // Only set if not already present\n if (!(timestamps.createdAt in update.$setOnInsert)) {\n update.$setOnInsert[timestamps.createdAt] = now;\n }\n }\n\n return update;\n }\n}\n","import {\n MongoClient,\n type Db,\n type MongoClientOptions,\n type IndexSpecification,\n type CreateIndexesOptions,\n type ClientSession,\n type ClientSessionOptions,\n} from \"mongodb\";\nimport { CollectionProxy } from \"../manager/collection-proxy\";\nimport type { Schema, ValidationMode, SchemaToCollectionProxy, FieldDefinition } from \"../types\";\nimport { getFieldIndexes } from \"../schema/define-schema\";\n\ntype AnySchema = Schema<string, Record<string, FieldDefinition>>;\n\n/**\n * Configuration for serverless environments (Cloudflare Workers, Vercel Edge, etc.)\n * Returns a factory function that creates connections on-demand.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const connectDb = createClient({\n * serverless: true,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: false, // Recommended for serverless\n * validation: \"strict\"\n * });\n *\n * // Later, in request handler:\n * const db = await connectDb(env.MONGODB_URI);\n * ```\n */\nexport interface ServerlessClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Must be true for serverless mode */\n serverless: true;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: false for serverless) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n}\n\n/**\n * Configuration for traditional Node.js environments.\n * Connects immediately and returns a ready-to-use client.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const db = await createClient({\n * uri: process.env.MONGODB_URI,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n * ```\n */\nexport interface NodeClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Set to false or omit for Node.js mode */\n serverless?: false;\n /** MongoDB connection URI (e.g., mongodb://localhost:27017/mydb) */\n uri: string;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: true) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n /** MongoDB driver options (maxPoolSize, etc.) */\n options?: MongoClientOptions;\n}\n\n/**\n * Union type of all client configurations.\n */\nexport type ClientConfig<TSchemas extends readonly AnySchema[]> =\n | ServerlessClientConfig<TSchemas>\n | NodeClientConfig<TSchemas>;\n\n// Client methods type\ntype ClientMethods = {\n readonly close: () => Promise<void>;\n readonly getDb: () => Db;\n readonly startSession: (options?: ClientSessionOptions) => ClientSession;\n};\n\n// Extract schema names as a union type\ntype SchemaNames<TSchemas extends readonly AnySchema[]> = TSchemas[number][\"name\"];\n\n// All valid keys for the client\ntype ValidClientKeys<TSchemas extends readonly AnySchema[]> =\n | SchemaNames<TSchemas>\n | keyof ClientMethods;\n\n// Create a type that only allows access to valid keys\nexport type SchemasToClient<TSchemas extends readonly AnySchema[]> = {\n readonly [K in ValidClientKeys<TSchemas>]: K extends SchemaNames<TSchemas>\n ? SchemaToCollectionProxy<Extract<TSchemas[number], { name: K }>>\n : K extends keyof ClientMethods\n ? ClientMethods[K]\n : never;\n};\n\nasync function syncIndexes(db: Db, schemas: readonly Schema[]): Promise<void> {\n for (const schema of schemas) {\n const collection = db.collection(schema.collection);\n\n const fieldIndexes = getFieldIndexes(schema);\n for (const { field, options } of fieldIndexes) {\n const indexSpec: IndexSpecification = {\n [field]: options.type ?? 1,\n };\n const indexOptions: CreateIndexesOptions = {};\n\n if (options.name) indexOptions.name = options.name;\n if (options.unique) indexOptions.unique = options.unique;\n if (options.sparse) indexOptions.sparse = options.sparse;\n if (options.expireAfterSeconds !== undefined) {\n indexOptions.expireAfterSeconds = options.expireAfterSeconds;\n }\n if (options.partialFilterExpression) {\n indexOptions.partialFilterExpression = options.partialFilterExpression;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n\n for (const index of schema.indexes) {\n const indexSpec: IndexSpecification = index.fields as IndexSpecification;\n const indexOptions: CreateIndexesOptions = {};\n\n if (index.options?.name) indexOptions.name = index.options.name;\n if (index.options?.unique) indexOptions.unique = index.options.unique;\n if (index.options?.sparse) indexOptions.sparse = index.options.sparse;\n if (index.options?.partialFilterExpression) {\n indexOptions.partialFilterExpression = index.options.partialFilterExpression;\n }\n if (index.options?.weights) {\n indexOptions.weights = index.options.weights;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n }\n}\n\nfunction createClientProxy<TSchemas extends readonly AnySchema[]>(\n client: MongoClient,\n db: Db,\n schemas: TSchemas,\n validationMode: ValidationMode\n): SchemasToClient<TSchemas> {\n const schemaMap = new Map<string, Schema>();\n const proxyCache = new Map<string, CollectionProxy<Schema>>();\n\n for (const schema of schemas) {\n schemaMap.set(schema.name, schema);\n }\n\n const baseClient = {\n async close() {\n await client.close();\n },\n getDb() {\n return db;\n },\n startSession(options?: ClientSessionOptions) {\n return client.startSession(options);\n },\n };\n\n // Properties that should return undefined (not collections)\n const IGNORED_PROPERTIES = new Set([\n \"then\",\n \"catch\",\n \"finally\",\n \"inspect\",\n \"nodeType\",\n \"toJSON\",\n \"constructor\",\n \"prototype\",\n \"__proto__\",\n ]);\n\n return new Proxy(baseClient as SchemasToClient<TSchemas>, {\n get(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return Reflect.get(target, prop);\n }\n\n if (IGNORED_PROPERTIES.has(prop)) {\n return undefined;\n }\n\n if (prop in target) {\n const value = target[prop as keyof typeof target];\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n return value;\n }\n\n const schema = schemaMap.get(prop);\n if (schema) {\n let proxy = proxyCache.get(prop);\n if (!proxy) {\n proxy = new CollectionProxy(db, schema, validationMode);\n proxyCache.set(prop, proxy);\n }\n return proxy;\n }\n\n return undefined;\n },\n\n has(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (IGNORED_PROPERTIES.has(prop)) return false;\n return prop in target || schemaMap.has(prop);\n },\n\n ownKeys(target) {\n const baseKeys = Reflect.ownKeys(target);\n const schemaNames = Array.from(schemaMap.keys());\n return [...new Set([...baseKeys, ...schemaNames])];\n },\n });\n}\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Serverless Mode** (recommended for Cloudflare Workers, Vercel Edge):\n * Returns a factory function that creates connections on-demand.\n *\n * @param config - Client configuration with `serverless: true`\n * @returns Factory function: `(uri: string, options?) => Promise<Client>`\n *\n * @example\n * ```typescript\n * import { createClient, type SchemasToClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * const schemas = [userSchema, postSchema] as const;\n * export type DbClient = SchemasToClient<typeof schemas>;\n *\n * // Create factory (no connection yet)\n * const connectDb = createClient({\n * serverless: true,\n * schemas,\n * syncIndexes: false,\n * validation: \"strict\"\n * });\n *\n * // In request handler\n * export async function handleRequest(env: Env) {\n * const db = await connectDb(env.MONGODB_URI);\n * const users = await db.users.findMany({ isActive: true });\n * await db.close();\n * return users;\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ServerlessClientConfig<TSchemas>\n): (uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>;\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Node.js Mode** (for traditional servers, scripts, tests):\n * Connects immediately and returns a ready-to-use client.\n *\n * @param config - Client configuration with `serverless: false` or omitted\n * @returns Promise resolving to connected client\n *\n * @example\n * ```typescript\n * import { createClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * async function main() {\n * const db = await createClient({\n * uri: process.env.MONGODB_URI!,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n *\n * // Type-safe access to collections\n * const users = await db.users.findMany({ role: \"ADMIN\" });\n *\n * // Close when done\n * await db.close();\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: NodeClientConfig<TSchemas>\n): Promise<SchemasToClient<TSchemas>>;\n\n// Implementation\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ClientConfig<TSchemas>\n):\n | ((uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>)\n | Promise<SchemasToClient<TSchemas>> {\n const { schemas, syncIndexes: shouldSyncIndexes = false, validation = \"strict\" } = config;\n\n if (config.serverless === true) {\n // Serverless mode: return factory function\n return async (uri: string, options?: MongoClientOptions) => {\n const client = new MongoClient(uri, options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n };\n } else {\n // Node.js mode: connect immediately\n return (async () => {\n const client = new MongoClient(config.uri, config.options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n })();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/schema/field-builder.ts","../src/schema/schema-builder.ts","../src/schema/define-schema.ts","../src/validation/zod-schema.ts","../src/manager/collection-proxy.ts","../src/client/client.ts"],"names":["schema","zodSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FieldDefinition, IndexOptions } from \"../types\";\n\n// Branded type for TypeScript inference\ndeclare const __type: unique symbol;\ndeclare const __required: unique symbol;\n\nexport class FieldBuilder<T = unknown, TRequired extends boolean = false> {\n private definition: FieldDefinition<T>;\n\n // Branded types for inference (not used at runtime)\n declare readonly [__type]: T;\n declare readonly [__required]: TRequired;\n\n constructor(type: FieldDefinition[\"type\"]) {\n this.definition = {\n type,\n required: false,\n unique: false,\n };\n }\n\n required(): FieldBuilder<T, true> {\n this.definition.required = true;\n return this as unknown as FieldBuilder<T, true>;\n }\n\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n default(value: T | \"auto\"): this {\n this.definition.default = value;\n return this;\n }\n\n index(options?: IndexOptions): this {\n this.definition.index = options ?? { type: 1 };\n return this;\n }\n\n build(): FieldDefinition<T> {\n return { ...this.definition };\n }\n}\n\n// Helper types for extracting field info\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type InferBuilderType<T> = T extends FieldBuilder<infer V, infer _R> ? V : unknown;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type IsBuilderRequired<T> = T extends FieldBuilder<infer _V, infer R> ? R : false;\n\nexport class StringFieldBuilder extends FieldBuilder<string> {\n constructor() {\n super(\"string\");\n }\n\n min(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.minLength = length;\n return this;\n }\n\n max(length: number): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.maxLength = length;\n return this;\n }\n\n pattern(regex: RegExp): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.pattern = regex;\n return this;\n }\n\n email(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.email = true;\n return this;\n }\n\n url(): this {\n (this as unknown as { definition: FieldDefinition<string> }).definition.url = true;\n return this;\n }\n\n text(): this {\n return this.index({ type: \"text\" });\n }\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n const builder = new EnumFieldBuilder<E[number]>(values);\n const def = this.build();\n if (def.required) builder.required();\n if (def.unique) builder.unique();\n if (def.index) builder.index(def.index);\n return builder;\n }\n}\n\nexport class EnumFieldBuilder<T extends string> extends FieldBuilder<T> {\n constructor(values: readonly T[]) {\n super(\"string\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.enum = values;\n }\n}\n\nexport class NumberFieldBuilder extends FieldBuilder<number> {\n constructor() {\n super(\"number\");\n }\n\n min(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.min = value;\n return this;\n }\n\n max(value: number): this {\n (this as unknown as { definition: FieldDefinition<number> }).definition.max = value;\n return this;\n }\n}\n\nexport class BooleanFieldBuilder extends FieldBuilder<boolean> {\n constructor() {\n super(\"boolean\");\n }\n}\n\nexport class DateFieldBuilder extends FieldBuilder<Date> {\n constructor() {\n super(\"date\");\n }\n}\n\nexport class ObjectIdFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"objectId\");\n }\n}\n\nexport class ArrayFieldBuilder<T> extends FieldBuilder<T[]> {\n constructor(items: FieldDefinition) {\n super(\"array\");\n (this as unknown as { definition: FieldDefinition<T[]> }).definition.items = items;\n }\n}\n\nexport class ObjectFieldBuilder<T extends Record<string, unknown>> extends FieldBuilder<T> {\n constructor(properties: Record<string, FieldDefinition>) {\n super(\"object\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.properties = properties;\n }\n}\n\nexport class JsonFieldBuilder extends FieldBuilder<unknown> {\n constructor() {\n super(\"json\");\n }\n}\n\nexport class LiteralFieldBuilder<T extends string | number | boolean> extends FieldBuilder<T> {\n constructor(value: T) {\n super(\"literal\");\n (this as unknown as { definition: FieldDefinition<T> }).definition.literal = value;\n }\n}\n","import type { FieldDefinition, IndexOptions } from \"../types\";\nimport {\n StringFieldBuilder,\n NumberFieldBuilder,\n BooleanFieldBuilder,\n DateFieldBuilder,\n ObjectIdFieldBuilder,\n ArrayFieldBuilder,\n ObjectFieldBuilder,\n JsonFieldBuilder,\n LiteralFieldBuilder,\n EnumFieldBuilder,\n type FieldBuilder,\n} from \"./field-builder\";\n\ntype FieldBuilderResult = {\n build(): FieldDefinition;\n required(): FieldBuilderResult;\n unique(): FieldBuilderResult;\n default(value: unknown): FieldBuilderResult;\n index(options?: IndexOptions): FieldBuilderResult;\n};\n\ntype SchemaFieldsInput = Record<string, FieldBuilderResult>;\n\n// Type to infer the value type from a field builder\nexport type InferFieldBuilderType<T> = T extends FieldBuilder<infer V> ? V : unknown;\n\nfunction resolveFields(fields: SchemaFieldsInput): Record<string, FieldDefinition> {\n const resolved: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(fields)) {\n resolved[key] = builder.build();\n }\n return resolved;\n}\n\nexport const s = {\n string(): StringFieldBuilder {\n return new StringFieldBuilder();\n },\n\n number(): NumberFieldBuilder {\n return new NumberFieldBuilder();\n },\n\n boolean(): BooleanFieldBuilder {\n return new BooleanFieldBuilder();\n },\n\n date(): DateFieldBuilder {\n return new DateFieldBuilder();\n },\n\n objectId(): ObjectIdFieldBuilder {\n return new ObjectIdFieldBuilder();\n },\n\n array<T>(items: { build(): FieldDefinition }): ArrayFieldBuilder<T> {\n return new ArrayFieldBuilder<T>(items.build());\n },\n\n object<T extends Record<string, unknown>>(\n properties: Record<string, { build(): FieldDefinition }>\n ): ObjectFieldBuilder<T> {\n const resolvedProps: Record<string, FieldDefinition> = {};\n for (const [key, builder] of Object.entries(properties)) {\n resolvedProps[key] = builder.build();\n }\n return new ObjectFieldBuilder<T>(resolvedProps);\n },\n\n json(): JsonFieldBuilder {\n return new JsonFieldBuilder();\n },\n\n literal<T extends string | number | boolean>(value: T): LiteralFieldBuilder<T> {\n return new LiteralFieldBuilder<T>(value);\n },\n\n enum<const E extends readonly string[]>(values: E): EnumFieldBuilder<E[number]> {\n return new EnumFieldBuilder<E[number]>(values);\n },\n};\n\nexport { resolveFields, type SchemaFieldsInput };\n","import type { Schema, FieldDefinition, TimestampConfig, CompoundIndexDefinition } from \"../types\";\nimport { resolveFields, type SchemaFieldsInput } from \"./schema-builder\";\n\ninterface SchemaInput<\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = boolean | TimestampConfig,\n> {\n collection?: string;\n timestamps?: TTimestamps;\n validation?: {\n enabled?: boolean;\n mode?: \"strict\" | \"loose\" | \"off\";\n };\n connection?: string;\n fields: TFields;\n indexes?: CompoundIndexDefinition[];\n}\n\ntype InferSchemaFields<TFields extends SchemaFieldsInput> = {\n [K in keyof TFields]: TFields[K] extends { build(): infer FD }\n ? FD extends FieldDefinition<infer T>\n ? FieldDefinition<T> & {\n required: TFields[K] extends { _required: true } ? true : false;\n unique: TFields[K] extends { _unique: true } ? true : false;\n }\n : FieldDefinition\n : FieldDefinition;\n};\n\n// Resolved timestamp config type\ntype ResolvedTimestamps<T> = T extends true\n ? { createdAt: \"createdAt\"; updatedAt: \"updatedAt\" }\n : T extends TimestampConfig\n ? T\n : false;\n\nexport type InferredSchema<\n TName extends string,\n TFields extends SchemaFieldsInput,\n TTimestamps extends boolean | TimestampConfig = true,\n> = Omit<Schema<TName, InferSchemaFields<TFields>>, \"timestamps\"> & {\n readonly timestamps: ResolvedTimestamps<TTimestamps>;\n readonly __fields: TFields;\n};\n\nexport function schema<\n const TName extends string,\n const TFields extends SchemaFieldsInput,\n const TTimestamps extends boolean | TimestampConfig = false,\n>(\n name: TName,\n definition: SchemaInput<TFields, TTimestamps>\n): InferredSchema<TName, TFields, TTimestamps> {\n const resolvedFields = resolveFields(definition.fields);\n\n const timestamps: TimestampConfig | false =\n definition.timestamps === true\n ? { createdAt: \"createdAt\", updatedAt: \"updatedAt\" }\n : definition.timestamps === false || definition.timestamps === undefined\n ? false\n : definition.timestamps;\n\n return {\n name,\n collection: definition.collection ?? name,\n timestamps,\n validation: definition.validation ?? { enabled: false, mode: \"off\" },\n connection: definition.connection,\n fields: resolvedFields,\n indexes: definition.indexes ?? [],\n } as unknown as InferredSchema<TName, TFields, TTimestamps>;\n}\n\n// Alias for backwards compatibility\nexport const defineSchema = schema;\n\nexport function getFieldIndexes(schema: Schema): Array<{\n field: string;\n options: NonNullable<FieldDefinition[\"index\"]>;\n}> {\n const indexes: Array<{ field: string; options: NonNullable<FieldDefinition[\"index\"]> }> = [];\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n if (fieldDef.index) {\n indexes.push({ field: fieldName, options: fieldDef.index });\n }\n if (fieldDef.unique && !fieldDef.index) {\n indexes.push({ field: fieldName, options: { unique: true } });\n }\n }\n\n return indexes;\n}\n","import { z, type ZodTypeAny } from \"zod\";\nimport type { Schema, FieldDefinition } from \"../types\";\n\n/**\n * Validates if a value is a valid MongoDB ObjectId.\n * Accepts both ObjectId instances and 24-character hex strings.\n */\nfunction isObjectId(value: unknown): boolean {\n if (typeof value === \"object\" && value !== null) {\n return (\n \"toHexString\" in value &&\n typeof (value as { toHexString: unknown }).toHexString === \"function\"\n );\n }\n if (typeof value === \"string\") {\n return /^[a-fA-F0-9]{24}$/.test(value);\n }\n return false;\n}\n\n/**\n * Builds a Zod string schema with optional constraints.\n */\nfunction buildStringSchema(field: FieldDefinition): ZodTypeAny {\n // Handle enum as a special case\n if (field.enum) {\n return z.enum(field.enum as [string, ...string[]]);\n }\n\n let schema = z.string();\n if (field.minLength !== undefined) schema = schema.min(field.minLength);\n if (field.maxLength !== undefined) schema = schema.max(field.maxLength);\n if (field.pattern) schema = schema.regex(field.pattern);\n if (field.email) schema = schema.email();\n if (field.url) schema = schema.url();\n return schema;\n}\n\n/**\n * Builds a Zod number schema with optional min/max constraints.\n */\nfunction buildNumberSchema(field: FieldDefinition): ZodTypeAny {\n let schema = z.number();\n if (field.min !== undefined) schema = schema.min(field.min);\n if (field.max !== undefined) schema = schema.max(field.max);\n return schema;\n}\n\n/**\n * Builds a Zod array schema with typed items.\n */\nfunction buildArraySchema(field: FieldDefinition): ZodTypeAny {\n return field.items ? z.array(fieldToZod(field.items)) : z.array(z.unknown());\n}\n\n/**\n * Builds a Zod object schema with typed properties.\n */\nfunction buildObjectSchema(field: FieldDefinition): ZodTypeAny {\n if (!field.properties) {\n return z.record(z.unknown());\n }\n\n const shape: Record<string, ZodTypeAny> = {};\n for (const [key, prop] of Object.entries(field.properties)) {\n shape[key] = fieldToZod(prop);\n }\n return z.object(shape);\n}\n\n/** Maps field types to their Zod schema builders */\nconst typeBuilders: Record<string, (field: FieldDefinition) => ZodTypeAny> = {\n string: buildStringSchema,\n number: buildNumberSchema,\n boolean: () => z.boolean(),\n date: () => z.date(),\n objectId: () => z.union([z.string(), z.custom((val: unknown) => isObjectId(val))]),\n array: buildArraySchema,\n object: buildObjectSchema,\n json: () => z.unknown(),\n literal: (field) => z.literal(field.literal as string | number | boolean),\n};\n\n/**\n * Converts a FieldDefinition to a Zod schema.\n * Handles all field types, required/optional, and default values.\n *\n * @param field - The field definition from schema\n * @returns Zod schema for validation\n */\nfunction fieldToZod(field: FieldDefinition): ZodTypeAny {\n const builder = typeBuilders[field.type];\n let schema = builder ? builder(field) : z.unknown();\n\n // Apply optional/nullable for non-required fields\n if (!field.required) {\n schema = schema.optional().nullable();\n }\n\n // Apply default value (skip \"auto\" which is handled at runtime)\n if (field.default !== undefined && field.default !== \"auto\") {\n schema = schema.default(field.default);\n }\n\n return schema;\n}\n\n/**\n * Creates a complete Zod schema from a Mondel schema definition.\n * Includes all fields and timestamp fields if configured.\n *\n * @param schema - Mondel schema definition\n * @returns Zod object schema for full document validation\n *\n * @example\n * ```typescript\n * const zod = zodSchema(userSchema);\n * const result = zod.safeParse(document);\n * ```\n */\nexport function zodSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const shape: Record<string, ZodTypeAny> = {};\n\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n shape[fieldName] = fieldToZod(fieldDef);\n }\n\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) {\n shape[ts.createdAt] = z.date().optional();\n }\n if (ts.updatedAt) {\n shape[ts.updatedAt] = z.date().optional();\n }\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for insert operations.\n * Excludes _id and timestamp fields (auto-generated).\n * Used internally by `create()` and `createMany()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema for create validation\n */\nexport function zodCreateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const fullSchema = zodSchema(schema);\n const shape = { ...fullSchema.shape };\n\n // Remove auto-generated fields\n delete shape[\"_id\"];\n if (schema.timestamps) {\n const ts = schema.timestamps;\n if (ts.createdAt) delete shape[ts.createdAt];\n if (ts.updatedAt) delete shape[ts.updatedAt];\n }\n\n return z.object(shape);\n}\n\n/**\n * Creates a Zod schema for update operations.\n * All fields become optional (partial update support).\n * Used internally by `updateOne()`, `updateMany()`, `updateById()` methods.\n *\n * @param schema - Mondel schema definition\n * @returns Zod schema with all fields optional\n */\nexport function zodUpdateSchema<TSchema extends Schema>(\n schema: TSchema\n): z.ZodObject<Record<string, ZodTypeAny>> {\n const createSchema = zodCreateSchema(schema);\n return createSchema.partial();\n}\n\n/**\n * Validates data against a Zod schema.\n *\n * @param schema - Zod schema to validate against\n * @param data - Data to validate\n * @returns Result object with success status and data or errors\n *\n * @example\n * ```typescript\n * const result = validate(zodCreateSchema(userSchema), userData);\n * if (result.success) {\n * console.log(result.data);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function validate<T>(\n schema: z.ZodType<T>,\n data: unknown\n): { success: true; data: T } | { success: false; errors: z.ZodError } {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n","import {\n ObjectId,\n type Collection,\n type Db,\n type Document,\n type Filter,\n type FindOptions as MongoFindOptions,\n type UpdateFilter,\n type OptionalUnlessRequiredId,\n type WithId,\n type InsertOneResult,\n type InsertManyResult,\n type UpdateResult,\n type DeleteResult,\n type CountDocumentsOptions,\n type AggregateOptions,\n} from \"mongodb\";\nimport type {\n Schema,\n FindOptions,\n CreateOptions,\n CreateManyOptions,\n UpdateOptions,\n DeleteOptions,\n ValidationMode,\n} from \"../types\";\nimport { zodCreateSchema, zodUpdateSchema } from \"../validation/zod-schema\";\n\n/**\n * Type-safe collection proxy for MongoDB operations.\n * Provides CRUD methods with full TypeScript support and Zod validation.\n *\n * @template TSchema - The schema type for this collection\n *\n * @example\n * ```typescript\n * // Access via client\n * const db = await getMondelClient(env);\n * const users = await db.users.findMany({ isActive: true });\n * ```\n */\nexport class CollectionProxy<TSchema extends Schema> {\n private collection: Collection<Document>;\n private schema: TSchema;\n private validationMode: ValidationMode;\n\n constructor(db: Db, schema: TSchema, validationMode: ValidationMode = \"strict\") {\n this.collection = db.collection(schema.collection);\n this.schema = schema;\n this.validationMode = validationMode;\n }\n\n private validateCreate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodCreateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw result.error;\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n private validateUpdate(data: Document): void {\n if (this.validationMode === \"off\") return;\n\n const zodSchema = zodUpdateSchema(this.schema);\n const result = zodSchema.safeParse(data);\n\n if (!result.success) {\n if (this.validationMode === \"strict\") {\n throw result.error;\n }\n console.warn(`Validation warning: ${result.error.message}`);\n }\n }\n\n /**\n * Find a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by email\n * const user = await db.users.findOne({ email: \"john@example.com\" });\n *\n * // With field selection\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { select: { _id: true, email: true, name: true } }\n * );\n *\n * // With session (for transactions)\n * const user = await db.users.findOne(\n * { email: \"john@example.com\" },\n * { session }\n * );\n * ```\n */\n async findOne(\n where: Filter<Document>,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const mongoOptions: MongoFindOptions = {};\n if (options?.session) {\n mongoOptions.session = options.session;\n }\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n }\n if (options?.sort) {\n mongoOptions.sort = options.sort;\n }\n\n return this.collection.findOne(where, mongoOptions);\n }\n\n /**\n * Find multiple documents matching the filter.\n *\n * @param where - MongoDB filter query (optional, defaults to {})\n * @param options - Find options (select, sort, skip, limit, session)\n * @returns Array of matching documents\n *\n * @example\n * ```typescript\n * // Find all active users\n * const users = await db.users.findMany({ isActive: true });\n *\n * // With pagination and sorting\n * const users = await db.users.findMany(\n * { role: \"ADMIN\" },\n * {\n * select: { _id: true, email: true, name: true },\n * sort: { createdAt: -1 },\n * skip: 0,\n * limit: 10\n * }\n * );\n *\n * // Using MongoDB operators\n * const users = await db.users.findMany({\n * age: { $gte: 18, $lte: 65 },\n * role: { $in: [\"ADMIN\", \"MODERATOR\"] }\n * });\n * ```\n */\n async findMany(\n where: Filter<Document> = {},\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document>[]> {\n const mongoOptions: MongoFindOptions = {};\n if (options?.session) {\n mongoOptions.session = options.session;\n }\n\n let cursor = this.collection.find(where, mongoOptions);\n\n if (options?.select) {\n cursor = cursor.project(options.select as Document);\n }\n if (options?.sort) {\n cursor = cursor.sort(options.sort);\n }\n if (options?.skip !== undefined) {\n cursor = cursor.skip(options.skip);\n }\n if (options?.limit !== undefined) {\n cursor = cursor.limit(options.limit);\n }\n\n return cursor.toArray();\n }\n\n /**\n * Find a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Find options (select, session)\n * @returns The matching document or null\n *\n * @example\n * ```typescript\n * // Find by string ID\n * const user = await db.users.findById(\"507f1f77bcf86cd799439011\");\n *\n * // Find by ObjectId\n * const user = await db.users.findById(new ObjectId(\"507f1f77bcf86cd799439011\"));\n *\n * // With field selection\n * const user = await db.users.findById(userId, {\n * select: { email: true, name: true }\n * });\n * ```\n */\n async findById(\n id: ObjectId | string,\n options?: FindOptions<TSchema>\n ): Promise<WithId<Document> | null> {\n const objectId = this.parseObjectId(id);\n const mongoOptions: MongoFindOptions = { ...options };\n\n if (options?.select) {\n mongoOptions.projection = options.select as Document;\n delete (mongoOptions as Record<string, unknown>).select;\n }\n\n return this.collection.findOne({ _id: objectId }, mongoOptions);\n }\n\n /**\n * Create a new document.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Document data (validated against schema)\n * @param options - Create options (timestamps, session)\n * @returns Insert result with insertedId\n *\n * @example\n * ```typescript\n * // Create a user\n * const result = await db.users.create({\n * email: \"john@example.com\",\n * name: \"John Doe\",\n * role: \"USER\"\n * });\n * console.log(result.insertedId); // ObjectId\n *\n * // Disable automatic timestamps\n * await db.users.create(userData, { timestamps: false });\n *\n * // With session (for transactions)\n * await db.users.create(userData, { session });\n * ```\n */\n async create(\n data: OptionalUnlessRequiredId<Document>,\n options?: CreateOptions\n ): Promise<InsertOneResult> {\n this.validateCreate(data);\n const doc = this.applyTimestamps(data, \"create\", options?.timestamps);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.insertOne(doc, mongoOptions);\n }\n\n /**\n * Create multiple documents in a single operation.\n * Automatically adds timestamps if enabled in schema.\n *\n * @param data - Array of document data\n * @param options - Create options (timestamps, ordered, session)\n * @returns Insert result with insertedIds\n *\n * @example\n * ```typescript\n * // Create multiple users\n * const result = await db.users.createMany([\n * { email: \"user1@example.com\", name: \"User 1\" },\n * { email: \"user2@example.com\", name: \"User 2\" },\n * { email: \"user3@example.com\", name: \"User 3\" }\n * ]);\n * console.log(result.insertedIds); // { 0: ObjectId, 1: ObjectId, 2: ObjectId }\n *\n * // With session (for transactions)\n * await db.users.createMany(usersData, { session });\n * ```\n */\n async createMany(\n data: OptionalUnlessRequiredId<Document>[],\n options?: CreateManyOptions\n ): Promise<InsertManyResult> {\n for (const item of data) {\n this.validateCreate(item);\n }\n const docs = data.map((d) => this.applyTimestamps(d, \"create\", options?.timestamps));\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.insertMany(docs, mongoOptions);\n }\n\n /**\n * Update a single document matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators ($set, $inc, etc.)\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount, upsertedId\n *\n * @example\n * ```typescript\n * // Simple update (automatically wrapped in $set)\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { name: \"John Smith\" }\n * );\n *\n * // Using MongoDB operators\n * await db.users.updateOne(\n * { _id: userId },\n * { $set: { name: \"John\" }, $inc: { loginCount: 1 } }\n * );\n *\n * // Upsert - create if not exists\n * await db.users.updateOne(\n * { email: \"john@example.com\" },\n * { $set: { name: \"John\", isActive: true } },\n * { upsert: true }\n * );\n *\n * // With session (for transactions)\n * await db.users.updateOne(filter, update, { session });\n * ```\n */\n async updateOne(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n // Only validate if data is a plain update object (not using operators like $set)\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateOne(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update multiple documents matching the filter.\n * Supports both simple updates and MongoDB update operators.\n *\n * @param where - MongoDB filter query\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Deactivate all users with expired subscriptions\n * await db.users.updateMany(\n * { subscriptionExpiry: { $lt: new Date() } },\n * { $set: { isActive: false } }\n * );\n *\n * // Increment login count for all admins\n * await db.users.updateMany(\n * { role: \"ADMIN\" },\n * { $inc: { loginCount: 1 } }\n * );\n * ```\n */\n async updateMany(\n where: Filter<Document>,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const hasOperators = Object.keys(data).some((k) => k.startsWith(\"$\"));\n if (!hasOperators) {\n this.validateUpdate(data);\n }\n const update = this.applyUpdateTimestamps(data, hasOperators, options);\n const { timestamps: _timestamps, ...mongoOptions } = options || {};\n void _timestamps;\n return this.collection.updateMany(where, update as UpdateFilter<Document>, mongoOptions);\n }\n\n /**\n * Update a document by its _id.\n * Convenience method that wraps updateOne with _id filter.\n *\n * @param id - ObjectId or string representation\n * @param data - Update data or MongoDB update operators\n * @param options - Update options (upsert, timestamps, session)\n * @returns Update result with matchedCount, modifiedCount\n *\n * @example\n * ```typescript\n * // Update by ID\n * await db.users.updateById(userId, { name: \"New Name\" });\n *\n * // Using operators\n * await db.users.updateById(userId, {\n * $set: { name: \"New Name\" },\n * $push: { tags: \"premium\" }\n * });\n * ```\n */\n async updateById(\n id: ObjectId | string,\n data: Document,\n options?: UpdateOptions\n ): Promise<UpdateResult> {\n const objectId = this.parseObjectId(id);\n return this.updateOne({ _id: objectId }, data, options);\n }\n\n /**\n * Delete a single document matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete by email\n * await db.users.deleteOne({ email: \"john@example.com\" });\n *\n * // With session (for transactions)\n * await db.users.deleteOne({ _id: userId }, { session });\n * ```\n */\n async deleteOne(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteOne(where, mongoOptions);\n }\n\n /**\n * Delete multiple documents matching the filter.\n *\n * @param where - MongoDB filter query\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * const result = await db.users.deleteMany({ isActive: false });\n * console.log(`Deleted ${result.deletedCount} users`);\n *\n * // Delete users created before a date\n * await db.users.deleteMany({\n * createdAt: { $lt: new Date(\"2023-01-01\") }\n * });\n * ```\n */\n async deleteMany(where: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult> {\n const { soft: _soft, ...mongoOptions } = options || {};\n void _soft;\n return this.collection.deleteMany(where, mongoOptions);\n }\n\n /**\n * Delete a document by its _id.\n *\n * @param id - ObjectId or string representation\n * @param options - Delete options (session)\n * @returns Delete result with deletedCount\n *\n * @example\n * ```typescript\n * await db.users.deleteById(\"507f1f77bcf86cd799439011\");\n * await db.users.deleteById(userId, { session });\n * ```\n */\n async deleteById(id: ObjectId | string, options?: DeleteOptions): Promise<DeleteResult> {\n const objectId = this.parseObjectId(id);\n return this.deleteOne({ _id: objectId }, options);\n }\n\n /**\n * Count documents matching the filter.\n *\n * @param where - MongoDB filter query (optional)\n * @param options - Count options (limit, skip, session)\n * @returns Number of matching documents\n *\n * @example\n * ```typescript\n * // Count all users\n * const total = await db.users.count();\n *\n * // Count active users\n * const activeCount = await db.users.count({ isActive: true });\n *\n * // Count with limit (for existence check optimization)\n * const hasAdmins = await db.users.count({ role: \"ADMIN\" }, { limit: 1 }) > 0;\n * ```\n */\n async count(where: Filter<Document> = {}, options?: CountDocumentsOptions): Promise<number> {\n return this.collection.countDocuments(where, options);\n }\n\n /**\n * Check if any document matches the filter.\n * Optimized to stop after finding first match.\n *\n * @param where - MongoDB filter query\n * @param options - Count options (session)\n * @returns true if at least one document matches\n *\n * @example\n * ```typescript\n * // Check if email is taken\n * const emailTaken = await db.users.exists({ email: \"john@example.com\" });\n *\n * // Check if user has admin role\n * const isAdmin = await db.users.exists({ _id: userId, role: \"ADMIN\" });\n * ```\n */\n async exists(where: Filter<Document>, options?: CountDocumentsOptions): Promise<boolean> {\n const count = await this.collection.countDocuments(where, { ...options, limit: 1 });\n return count > 0;\n }\n\n /**\n * Run an aggregation pipeline.\n * Provides full access to MongoDB aggregation framework.\n *\n * @param pipeline - Array of aggregation stages\n * @param options - Aggregation options (allowDiskUse, session)\n * @returns Array of aggregation results\n *\n * @example\n * ```typescript\n * // Group users by role and count\n * const stats = await db.users.aggregate([\n * { $match: { isActive: true } },\n * { $group: { _id: \"$role\", count: { $sum: 1 } } },\n * { $sort: { count: -1 } }\n * ]);\n *\n * // Lookup related documents\n * const usersWithPosts = await db.users.aggregate([\n * { $lookup: {\n * from: \"posts\",\n * localField: \"_id\",\n * foreignField: \"authorId\",\n * as: \"posts\"\n * }}\n * ]);\n *\n * // With options\n * const bigResult = await db.users.aggregate(pipeline, {\n * allowDiskUse: true\n * });\n * ```\n */\n async aggregate(pipeline: Document[], options?: AggregateOptions): Promise<Document[]> {\n return this.collection.aggregate(pipeline, options).toArray();\n }\n\n /**\n * Get the underlying MongoDB Collection instance.\n * Use for advanced operations not covered by the proxy.\n *\n * @returns MongoDB Collection instance\n *\n * @example\n * ```typescript\n * const collection = db.users.getCollection();\n *\n * // Use for watch, bulkWrite, or other advanced operations\n * const changeStream = collection.watch();\n * ```\n */\n getCollection(): Collection<Document> {\n return this.collection;\n }\n\n private applyTimestamps(\n data: Document,\n operation: \"create\" | \"update\",\n enabled?: boolean\n ): Document {\n if (enabled === false || !this.schema.timestamps) {\n return data;\n }\n\n const timestamps = this.schema.timestamps;\n const now = new Date();\n const result = { ...data };\n\n if (operation === \"create\" && timestamps.createdAt) {\n result[timestamps.createdAt] = now;\n }\n if (timestamps.updatedAt) {\n result[timestamps.updatedAt] = now;\n }\n\n return result;\n }\n\n private parseObjectId(id: ObjectId | string): ObjectId {\n return typeof id === \"string\" ? new ObjectId(id) : id;\n }\n\n private applyUpdateTimestamps(\n data: Document,\n hasOperators: boolean,\n options?: UpdateOptions\n ): UpdateFilter<Document> {\n const schemaTimestamps = this.schema.timestamps;\n\n // If no processing needed, return data as-is (or wrapped in $set if no operators)\n if (!schemaTimestamps) {\n return hasOperators ? (data as UpdateFilter<Document>) : { $set: data };\n }\n\n const timestamps = schemaTimestamps;\n const now = new Date();\n\n // Initialize update object\n const update: UpdateFilter<Document> = hasOperators ? { ...data } : { $set: { ...data } };\n\n // 1. Handle updatedAt in $set\n if (timestamps.updatedAt) {\n update.$set = update.$set || {};\n // Only set if not already present in the update data\n if (!(timestamps.updatedAt in update.$set)) {\n update.$set[timestamps.updatedAt] = now;\n }\n }\n\n // 2. Handle createdAt in $setOnInsert (only if upsert is true)\n if (options?.upsert && timestamps.createdAt) {\n update.$setOnInsert = update.$setOnInsert || {};\n // Only set if not already present\n if (!(timestamps.createdAt in update.$setOnInsert)) {\n update.$setOnInsert[timestamps.createdAt] = now;\n }\n }\n\n return update;\n }\n}\n","import {\n MongoClient,\n type Db,\n type MongoClientOptions,\n type IndexSpecification,\n type CreateIndexesOptions,\n type ClientSession,\n type ClientSessionOptions,\n} from \"mongodb\";\nimport { CollectionProxy } from \"../manager/collection-proxy\";\nimport type { Schema, ValidationMode, SchemaToCollectionProxy, FieldDefinition } from \"../types\";\nimport { getFieldIndexes } from \"../schema/define-schema\";\n\ntype AnySchema = Schema<string, Record<string, FieldDefinition>>;\n\n/**\n * Configuration for serverless environments (Cloudflare Workers, Vercel Edge, etc.)\n * Returns a factory function that creates connections on-demand.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const connectDb = createClient({\n * serverless: true,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: false, // Recommended for serverless\n * validation: \"strict\"\n * });\n *\n * // Later, in request handler:\n * const db = await connectDb(env.MONGODB_URI);\n * ```\n */\nexport interface ServerlessClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Must be true for serverless mode */\n serverless: true;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: false for serverless) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n}\n\n/**\n * Configuration for traditional Node.js environments.\n * Connects immediately and returns a ready-to-use client.\n *\n * @template TSchemas - Tuple of schema types for type inference\n *\n * @example\n * ```typescript\n * const db = await createClient({\n * uri: process.env.MONGODB_URI,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n * ```\n */\nexport interface NodeClientConfig<TSchemas extends readonly AnySchema[]> {\n /** Set to false or omit for Node.js mode */\n serverless?: false;\n /** MongoDB connection URI (e.g., mongodb://localhost:27017/mydb) */\n uri: string;\n /** Array of schemas to register (use `as const` for type inference) */\n schemas: TSchemas;\n /** Whether to sync indexes on connect (default: true) */\n syncIndexes?: boolean;\n /** Validation mode: \"strict\" | \"loose\" | \"off\" (default: \"strict\") */\n validation?: ValidationMode;\n /** MongoDB driver options (maxPoolSize, etc.) */\n options?: MongoClientOptions;\n}\n\n/**\n * Union type of all client configurations.\n */\nexport type ClientConfig<TSchemas extends readonly AnySchema[]> =\n | ServerlessClientConfig<TSchemas>\n | NodeClientConfig<TSchemas>;\n\n// Client methods type\ntype ClientMethods = {\n readonly close: () => Promise<void>;\n readonly getDb: () => Db;\n readonly startSession: (options?: ClientSessionOptions) => ClientSession;\n};\n\n// Extract schema names as a union type\ntype SchemaNames<TSchemas extends readonly AnySchema[]> = TSchemas[number][\"name\"];\n\n// All valid keys for the client\ntype ValidClientKeys<TSchemas extends readonly AnySchema[]> =\n | SchemaNames<TSchemas>\n | keyof ClientMethods;\n\n// Create a type that only allows access to valid keys\nexport type SchemasToClient<TSchemas extends readonly AnySchema[]> = {\n readonly [K in ValidClientKeys<TSchemas>]: K extends SchemaNames<TSchemas>\n ? SchemaToCollectionProxy<Extract<TSchemas[number], { name: K }>>\n : K extends keyof ClientMethods\n ? ClientMethods[K]\n : never;\n};\n\nasync function syncIndexes(db: Db, schemas: readonly Schema[]): Promise<void> {\n for (const schema of schemas) {\n const collection = db.collection(schema.collection);\n\n const fieldIndexes = getFieldIndexes(schema);\n for (const { field, options } of fieldIndexes) {\n const indexSpec: IndexSpecification = {\n [field]: options.type ?? 1,\n };\n const indexOptions: CreateIndexesOptions = {};\n\n if (options.name) indexOptions.name = options.name;\n if (options.unique) indexOptions.unique = options.unique;\n if (options.sparse) indexOptions.sparse = options.sparse;\n if (options.expireAfterSeconds !== undefined) {\n indexOptions.expireAfterSeconds = options.expireAfterSeconds;\n }\n if (options.partialFilterExpression) {\n indexOptions.partialFilterExpression = options.partialFilterExpression;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n\n for (const index of schema.indexes) {\n const indexSpec: IndexSpecification = index.fields as IndexSpecification;\n const indexOptions: CreateIndexesOptions = {};\n\n if (index.options?.name) indexOptions.name = index.options.name;\n if (index.options?.unique) indexOptions.unique = index.options.unique;\n if (index.options?.sparse) indexOptions.sparse = index.options.sparse;\n if (index.options?.partialFilterExpression) {\n indexOptions.partialFilterExpression = index.options.partialFilterExpression;\n }\n if (index.options?.weights) {\n indexOptions.weights = index.options.weights;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n }\n}\n\nfunction createClientProxy<TSchemas extends readonly AnySchema[]>(\n client: MongoClient,\n db: Db,\n schemas: TSchemas,\n validationMode: ValidationMode\n): SchemasToClient<TSchemas> {\n const schemaMap = new Map<string, Schema>();\n const proxyCache = new Map<string, CollectionProxy<Schema>>();\n\n for (const schema of schemas) {\n schemaMap.set(schema.name, schema);\n }\n\n const baseClient = {\n async close() {\n await client.close();\n },\n getDb() {\n return db;\n },\n startSession(options?: ClientSessionOptions) {\n return client.startSession(options);\n },\n };\n\n // Properties that should return undefined (not collections)\n const IGNORED_PROPERTIES = new Set([\n \"then\",\n \"catch\",\n \"finally\",\n \"inspect\",\n \"nodeType\",\n \"toJSON\",\n \"constructor\",\n \"prototype\",\n \"__proto__\",\n ]);\n\n return new Proxy(baseClient as SchemasToClient<TSchemas>, {\n get(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return Reflect.get(target, prop);\n }\n\n if (IGNORED_PROPERTIES.has(prop)) {\n return undefined;\n }\n\n if (prop in target) {\n const value = target[prop as keyof typeof target];\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n return value;\n }\n\n const schema = schemaMap.get(prop);\n if (schema) {\n let proxy = proxyCache.get(prop);\n if (!proxy) {\n proxy = new CollectionProxy(db, schema, validationMode);\n proxyCache.set(prop, proxy);\n }\n return proxy;\n }\n\n return undefined;\n },\n\n has(target, prop: string | symbol) {\n if (typeof prop === \"symbol\") return false;\n if (IGNORED_PROPERTIES.has(prop)) return false;\n return prop in target || schemaMap.has(prop);\n },\n\n ownKeys(target) {\n const baseKeys = Reflect.ownKeys(target);\n const schemaNames = Array.from(schemaMap.keys());\n return [...new Set([...baseKeys, ...schemaNames])];\n },\n });\n}\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Serverless Mode** (recommended for Cloudflare Workers, Vercel Edge):\n * Returns a factory function that creates connections on-demand.\n *\n * @param config - Client configuration with `serverless: true`\n * @returns Factory function: `(uri: string, options?) => Promise<Client>`\n *\n * @example\n * ```typescript\n * import { createClient, type SchemasToClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * const schemas = [userSchema, postSchema] as const;\n * export type DbClient = SchemasToClient<typeof schemas>;\n *\n * // Create factory (no connection yet)\n * const connectDb = createClient({\n * serverless: true,\n * schemas,\n * syncIndexes: false,\n * validation: \"strict\"\n * });\n *\n * // In request handler\n * export async function handleRequest(env: Env) {\n * const db = await connectDb(env.MONGODB_URI);\n * const users = await db.users.findMany({ isActive: true });\n * await db.close();\n * return users;\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ServerlessClientConfig<TSchemas>\n): (uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>;\n\n/**\n * Create a type-safe MongoDB client with schema-based collection access.\n *\n * **Node.js Mode** (for traditional servers, scripts, tests):\n * Connects immediately and returns a ready-to-use client.\n *\n * @param config - Client configuration with `serverless: false` or omitted\n * @returns Promise resolving to connected client\n *\n * @example\n * ```typescript\n * import { createClient } from \"mondel\";\n * import { userSchema, postSchema } from \"./schemas\";\n *\n * async function main() {\n * const db = await createClient({\n * uri: process.env.MONGODB_URI!,\n * schemas: [userSchema, postSchema] as const,\n * syncIndexes: true,\n * validation: \"strict\"\n * });\n *\n * // Type-safe access to collections\n * const users = await db.users.findMany({ role: \"ADMIN\" });\n *\n * // Close when done\n * await db.close();\n * }\n * ```\n */\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: NodeClientConfig<TSchemas>\n): Promise<SchemasToClient<TSchemas>>;\n\n// Implementation\nexport function createClient<const TSchemas extends readonly AnySchema[]>(\n config: ClientConfig<TSchemas>\n):\n | ((uri: string, options?: MongoClientOptions) => Promise<SchemasToClient<TSchemas>>)\n | Promise<SchemasToClient<TSchemas>> {\n const { schemas, syncIndexes: shouldSyncIndexes = false, validation = \"strict\" } = config;\n\n if (config.serverless === true) {\n // Serverless mode: return factory function\n return async (uri: string, options?: MongoClientOptions) => {\n const client = new MongoClient(uri, options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n };\n } else {\n // Node.js mode: connect immediately\n return (async () => {\n const client = new MongoClient(config.uri, config.options);\n await client.connect();\n const db = client.db();\n\n if (shouldSyncIndexes) {\n await syncIndexes(db, schemas);\n }\n\n return createClientProxy(client, db, schemas, validation);\n })();\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mondel",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Lightweight TypeScript ORM for MongoDB - Type-safe, serverless-optimized",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -25,6 +25,7 @@
25
25
  "lint": "eslint src --ext .ts",
26
26
  "format": "prettier --write \"src/**/*.ts\"",
27
27
  "typecheck": "tsc --noEmit",
28
+ "docs:typecheck": "tsc -p tsconfig.docs.json --noEmit",
28
29
  "docs:dev": "vitepress dev docs",
29
30
  "docs:build": "vitepress build docs",
30
31
  "docs:preview": "vitepress preview docs",
@@ -54,7 +55,7 @@
54
55
  "url": "https://github.com/edjo/mondel/issues"
55
56
  },
56
57
  "peerDependencies": {
57
- "mongodb": "^6.0.0",
58
+ "mongodb": "^6.0.0 || ^7.0.0",
58
59
  "zod": "^3.24.0"
59
60
  },
60
61
  "devDependencies": {
@@ -62,7 +63,7 @@
62
63
  "@typescript-eslint/eslint-plugin": "^6.13.0",
63
64
  "@typescript-eslint/parser": "^6.13.0",
64
65
  "eslint": "^8.55.0",
65
- "mongodb": "^6.12.0",
66
+ "mongodb": "^7.0.0",
66
67
  "prettier": "^3.1.0",
67
68
  "tsup": "^8.0.0",
68
69
  "typescript": "^5.3.0",