@warlock.js/cascade 5.5.0 → 5.7.0

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/cjs/index.cjs +74 -36
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/database-dirty-tracker.d.mts.map +1 -1
  5. package/esm/database-dirty-tracker.mjs +4 -1
  6. package/esm/database-dirty-tracker.mjs.map +1 -1
  7. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
  8. package/esm/drivers/mongodb/mongodb-migration-driver.mjs +1 -0
  9. package/esm/drivers/mongodb/mongodb-migration-driver.mjs.map +1 -1
  10. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  11. package/esm/drivers/mongodb/mongodb-query-builder.mjs +2 -4
  12. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  13. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
  14. package/esm/drivers/mongodb/mongodb-query-parser.mjs +21 -7
  15. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
  16. package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -1
  17. package/esm/drivers/postgres/postgres-blueprint.mjs +1 -2
  18. package/esm/drivers/postgres/postgres-blueprint.mjs.map +1 -1
  19. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  20. package/esm/drivers/postgres/postgres-driver.mjs +1 -1
  21. package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
  22. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
  23. package/esm/drivers/postgres/postgres-migration-driver.mjs +1 -2
  24. package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -1
  25. package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
  26. package/esm/drivers/postgres/postgres-query-builder.mjs +5 -6
  27. package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
  28. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  29. package/esm/drivers/postgres/postgres-query-parser.mjs +2 -0
  30. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  31. package/esm/drivers/postgres/postgres-sql-serializer.mjs +1 -1
  32. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
  33. package/esm/drivers/postgres/postgres-sync-adapter.d.mts.map +1 -1
  34. package/esm/drivers/postgres/postgres-sync-adapter.mjs +2 -2
  35. package/esm/drivers/postgres/postgres-sync-adapter.mjs.map +1 -1
  36. package/esm/migration/parse-created-at.mjs +1 -0
  37. package/esm/migration/parse-created-at.mjs.map +1 -1
  38. package/esm/query-builder/query-builder.d.mts.map +1 -1
  39. package/esm/query-builder/query-builder.mjs +27 -9
  40. package/esm/query-builder/query-builder.mjs.map +1 -1
  41. package/esm/relations/relation-loader.d.mts.map +1 -1
  42. package/esm/relations/relation-loader.mjs +1 -0
  43. package/esm/relations/relation-loader.mjs.map +1 -1
  44. package/esm/utils/is-valid-date-value.mjs +4 -1
  45. package/esm/utils/is-valid-date-value.mjs.map +1 -1
  46. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"database-dirty-tracker.d.mts","names":[],"sources":["../../../../../../cascade/src/database-dirty-tracker.ts"],"mappings":";;;;KA+CK,UAAA,GAAa,MAAM;;AAAA;AAAA;KAKnB,iBAAA;EAAsB,QAAA;EAAmB,QAAQ;AAAA;AAkBtD;;;;;;;;;;;;;;;;AAAA,cAAa,oBAAA;EA8SoB;;;;EAAA,UAzSrB,UAAA,EAAY,MAAA;EA6XY;;;EAAA,UAxXxB,UAAA,EAAY,MAAA;EAAA;;;;EAAA,UAMZ,gBAAA,EAAkB,UAAA;EAUT;;;EAAA,UALT,gBAAA,EAAkB,UAAA;;;;qBAKT,YAAA,EAAY,GAAA;EAmDxB;;;EAAA,mBA9CY,cAAA,EAAc,GAAA;cAEd,IAAA,EAAM,MAAA;EA0FW;;;;;;;;;;;;;EAnE7B,eAAA;EA4LqB;;;;;;;;;;;;;;;;;EAvKrB,UAAA;EAqT0B;;AAAC;EA9S3B,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;EAmBR,iBAAA;;;;;;;;;;;;;;;;;EAoBA,yBAAA,IAA6B,MAAA,SAAe,iBAAA;;;;;;;;;;;;;;;;EA+B5C,kBAAA,CAAmB,IAAA,EAAM,MAAA;;;;;;;;;;;;;;;;;EAsBzB,YAAA,CAAa,OAAA,EAAS,MAAA;;;;;;;;;;;;;;;;EAqBtB,KAAA,CAAM,OAAA;;;;;;;;;;;;;;;;;;;;;EA+BN,KAAA,CAAM,IAAA,GAAO,MAAA;;;;;YAgBV,WAAA,CAAY,IAAA,EAAM,MAAA,oBAA0B,UAAA;;;;;;;;;;YAa5C,gBAAA;;;;;;;;;;;;;;;;;;;;YA6CA,YAAA,CAAa,MAAA,EAAQ,MAAA,mBAAyB,MAAA,EAAQ,MAAA;;;;;;;;;;YAoBtD,aAAA,CAAc,IAAA;;;;;;;;;;;YAwCd,cAAA,CAAe,SAAA,WAAoB,OAAA;;;;;;;;YAwBnC,SAAA,IAAa,IAAA,EAAM,CAAA,GAAI,CAAA;AAAA"}
1
+ {"version":3,"file":"database-dirty-tracker.d.mts","names":[],"sources":["../../../../../../cascade/src/database-dirty-tracker.ts"],"mappings":";;;;KA+CK,UAAA,GAAa,MAAM;;AAAA;AAAA;KAKnB,iBAAA;EAAsB,QAAA;EAAmB,QAAQ;AAAA;AAkBtD;;;;;;;;;;;;;;;;AAAA,cAAa,oBAAA;EA8SoB;;;;EAAA,UAzSrB,UAAA,EAAY,MAAA;EAqYY;;;EAAA,UAhYxB,UAAA,EAAY,MAAA;EAAA;;;;EAAA,UAMZ,gBAAA,EAAkB,UAAA;EAUT;;;EAAA,UALT,gBAAA,EAAkB,UAAA;;;;qBAKT,YAAA,EAAY,GAAA;EAmDxB;;;EAAA,mBA9CY,cAAA,EAAc,GAAA;cAEd,IAAA,EAAM,MAAA;EA0FW;;;;;;;;;;;;;EAnE7B,eAAA;EA4LqB;;;;;;;;;;;;;;;;;EAvKrB,UAAA;EA6T0B;;AAAC;EAtT3B,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;EAmBR,iBAAA;;;;;;;;;;;;;;;;;EAoBA,yBAAA,IAA6B,MAAA,SAAe,iBAAA;;;;;;;;;;;;;;;;EA+B5C,kBAAA,CAAmB,IAAA,EAAM,MAAA;;;;;;;;;;;;;;;;;EAsBzB,YAAA,CAAa,OAAA,EAAS,MAAA;;;;;;;;;;;;;;;;EAqBtB,KAAA,CAAM,OAAA;;;;;;;;;;;;;;;;;;;;;EA+BN,KAAA,CAAM,IAAA,GAAO,MAAA;;;;;YAgBV,WAAA,CAAY,IAAA,EAAM,MAAA,oBAA0B,UAAA;;;;;;;;;;YAa5C,gBAAA;;;;;;;;;;;;;;;;;;;;YA6CA,YAAA,CAAa,MAAA,EAAQ,MAAA,mBAAyB,MAAA,EAAQ,MAAA;;;;;;;;;;YAoBtD,aAAA,CAAc,IAAA;;;;;;;;;;;YAgDd,cAAA,CAAe,SAAA,WAAoB,OAAA;;;;;;;;YAwBnC,SAAA,IAAa,IAAA,EAAM,CAAA,GAAI,CAAA;AAAA"}
@@ -319,10 +319,13 @@ var DatabaseDirtyTracker = class {
319
319
  let container = this.currentRaw;
320
320
  for (let index = 0; index < segments.length - 1; index += 1) {
321
321
  if (container === void 0 || container === null) return;
322
- container = this.resolveSegment(container, segments[index]);
322
+ const segment = segments[index];
323
+ if (segment === void 0) return;
324
+ container = this.resolveSegment(container, segment);
323
325
  }
324
326
  if (container === void 0 || container === null) return;
325
327
  const lastSegment = segments[segments.length - 1];
328
+ if (lastSegment === void 0) return;
326
329
  if (Array.isArray(container)) {
327
330
  const numericIndex = Number(lastSegment);
328
331
  if (!Number.isNaN(numericIndex)) container.splice(numericIndex, 1);
@@ -1 +1 @@
1
- {"version":3,"file":"database-dirty-tracker.mjs","names":[],"sources":["../../../../../../cascade/src/database-dirty-tracker.ts"],"sourcesContent":["import { areEqual, clone } from \"@mongez/reinforcements\";\r\nimport { isPlainObject } from \"@mongez/supportive-is\";\r\n\r\nfunction canBeFlatten(object: unknown): boolean {\r\n return isPlainObject(object);\r\n}\r\n\r\n/**\r\n * A fix for flatten as non-plain object is being flatten as well which it should not be\r\n */\r\nfunction flatten(\r\n object: Record<string, unknown>,\r\n separator = \".\",\r\n keepNestedOriginalObject = false,\r\n parent?: string,\r\n root: Record<string, unknown> = {},\r\n) {\r\n if (canBeFlatten(object) === false) {\r\n return object;\r\n }\r\n // object = toPlainObject(object);\r\n for (const key of Object.keys(object)) {\r\n const value = object[key];\r\n const keyChain = parent ? parent + separator + key : key;\r\n if ((Array.isArray(value) && value.length === 0) || typeof value === \"function\") {\r\n root[keyChain] = value;\r\n } else if (canBeFlatten(value)) {\r\n if (keepNestedOriginalObject) {\r\n root[keyChain] = value;\r\n }\r\n flatten(\r\n value as Record<string, unknown>,\r\n separator,\r\n keepNestedOriginalObject,\r\n keyChain,\r\n root,\r\n );\r\n } else {\r\n root[keyChain] = value;\r\n }\r\n }\r\n return root;\r\n}\r\n\r\n/**\r\n * Flattened record type representing dot-notation paths mapped to their values.\r\n */\r\ntype FlatRecord = Record<string, unknown>;\r\n\r\n/**\r\n * Represents the old and new values of a dirty column.\r\n */\r\ntype DirtyColumnValues = { oldValue: unknown; newValue: unknown };\r\n\r\n/**\r\n * Tracks changes to model data by maintaining snapshots of initial and current state.\r\n *\r\n * The tracker stores both raw (nested) and flattened (dot-notation) versions of the data\r\n * to accurately detect modifications, additions, and removals at any nesting level.\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", age: 30 });\r\n * tracker.mergeChanges({ age: 31 });\r\n * console.log(tracker.hasChanges()); // true\r\n * console.log(tracker.getDirtyColumns()); // [\"age\"]\r\n * console.log(tracker.getDirtyColumnsWithValues());\r\n * // { age: { oldValue: 30, newValue: 31 } }\r\n * ```\r\n */\r\nexport class DatabaseDirtyTracker {\r\n /**\r\n * The initial raw data snapshot taken at construction or last reset.\r\n * Used as the baseline for comparison.\r\n */\r\n protected initialRaw: Record<string, unknown>;\r\n\r\n /**\r\n * The current raw data snapshot reflecting all changes made via merge/unset.\r\n */\r\n protected currentRaw: Record<string, unknown>;\r\n\r\n /**\r\n * Flattened version of the initial data using dot-notation keys.\r\n * Example: { \"address.city\": \"NYC\" }\r\n */\r\n protected initialFlattened: FlatRecord;\r\n\r\n /**\r\n * Flattened version of the current data using dot-notation keys.\r\n */\r\n protected currentFlattened: FlatRecord;\r\n\r\n /**\r\n * Set of column names (dot-notation paths) that have been modified.\r\n */\r\n protected readonly dirtyColumns = new Set<string>();\r\n\r\n /**\r\n * Set of column names (dot-notation paths) that existed initially but have been removed.\r\n */\r\n protected readonly removedColumns = new Set<string>();\r\n\r\n public constructor(data: Record<string, unknown>) {\r\n this.initialRaw = this.cloneData(data);\r\n this.currentRaw = this.cloneData(data);\r\n\r\n this.initialFlattened = this.flattenData(this.initialRaw);\r\n this.currentFlattened = { ...this.initialFlattened };\r\n\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Returns the list of dirty columns using dot-notation.\r\n *\r\n * A column is considered dirty if its value has changed compared to the initial snapshot.\r\n *\r\n * @returns An array of column names (dot-notation paths) that have been modified\r\n *\r\n * @example\r\n * ```typescript\r\n * tracker.mergeChanges({ name: \"Bob\", \"address.city\": \"LA\" });\r\n * tracker.getDirtyColumns(); // [\"name\", \"address.city\"]\r\n * ```\r\n */\r\n public getDirtyColumns(): string[] {\r\n return Array.from(this.dirtyColumns);\r\n }\r\n\r\n /**\r\n * Determines whether there are any tracked changes.\r\n *\r\n * Returns `true` if any columns have been modified or removed since the initial snapshot.\r\n *\r\n * @returns `true` if there are changes, `false` otherwise\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\" });\r\n * tracker.hasChanges(); // false\r\n * tracker.mergeChanges({ name: \"Bob\" });\r\n * tracker.hasChanges(); // true\r\n * tracker.unset(\"name\");\r\n * tracker.hasChanges(); // true (removed column counts as a change)\r\n * ```\r\n */\r\n public hasChanges(): boolean {\r\n return this.dirtyColumns.size > 0 || this.removedColumns.size > 0;\r\n }\r\n\r\n /**\r\n * Check if the given column is dirty (changed)\r\n */\r\n public isDirty(column: string): boolean {\r\n return this.dirtyColumns.has(column);\r\n }\r\n\r\n /**\r\n * Returns the set of columns that have been removed compared to the baseline.\r\n *\r\n * A column is considered removed if it existed in the initial snapshot but has been\r\n * explicitly unset or deleted from the current data.\r\n *\r\n * @returns An array of column names (dot-notation paths) that have been removed\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", temp: \"value\" });\r\n * tracker.unset(\"temp\");\r\n * tracker.getRemovedColumns(); // [\"temp\"]\r\n * ```\r\n */\r\n public getRemovedColumns(): string[] {\r\n return Array.from(this.removedColumns);\r\n }\r\n\r\n /**\r\n * Provides a mapping of dirty columns to their previous and current values.\r\n *\r\n * This is useful for generating audit logs, building partial update payloads,\r\n * or displaying change summaries to users.\r\n *\r\n * @returns A record mapping each dirty column to an object containing oldValue and newValue\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", age: 30 });\r\n * tracker.mergeChanges({ age: 31 });\r\n * tracker.getDirtyColumnsWithValues();\r\n * // { age: { oldValue: 30, newValue: 31 } }\r\n * ```\r\n */\r\n public getDirtyColumnsWithValues(): Record<string, DirtyColumnValues> {\r\n const result: Record<string, DirtyColumnValues> = {};\r\n\r\n for (const column of this.dirtyColumns) {\r\n const hasCurrent =\r\n this.currentFlattened[column] !== undefined || column in this.currentFlattened;\r\n\r\n result[column] = {\r\n oldValue: this.initialFlattened[column],\r\n newValue: hasCurrent ? this.currentFlattened[column] : undefined,\r\n };\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Replaces the current data snapshot entirely and recomputes the diff.\r\n *\r\n * This is useful when you want to replace all current data with a new set,\r\n * while keeping the initial baseline for comparison.\r\n *\r\n * @param data - The new data to set as the current snapshot\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\" });\r\n * tracker.replaceCurrentData({ name: \"Bob\", email: \"bob@example.com\" });\r\n * tracker.getDirtyColumns(); // [\"name\", \"email\"]\r\n * ```\r\n */\r\n public replaceCurrentData(data: Record<string, unknown>): void {\r\n this.currentRaw = this.cloneData(data);\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Merges a partial payload into the current snapshot and recomputes the diff.\r\n *\r\n * This performs a deep merge, preserving existing nested structures while\r\n * updating only the specified fields.\r\n *\r\n * @param partial - Partial data to merge into the current snapshot\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", address: { city: \"NYC\" } });\r\n * tracker.mergeChanges({ address: { zip: \"10001\" } });\r\n * // Current data: { name: \"Alice\", address: { city: \"NYC\", zip: \"10001\" } }\r\n * tracker.getDirtyColumns(); // [\"address.zip\"]\r\n * ```\r\n */\r\n public mergeChanges(partial: Record<string, unknown>): void {\r\n this.mergeIntoRaw(this.currentRaw, partial);\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Explicitly removes one or more columns from the current data.\r\n *\r\n * Supports both single column names and arrays of column names.\r\n * Columns can be specified using dot-notation for nested paths.\r\n *\r\n * @param columns - A single column name or an array of column names to remove\r\n *\r\n * @example\r\n * ```typescript\r\n * tracker.unset(\"tempField\");\r\n * tracker.unset([\"field1\", \"field2\", \"nested.field\"]);\r\n * tracker.getRemovedColumns(); // [\"tempField\", \"field1\", \"field2\", \"nested.field\"]\r\n * ```\r\n */\r\n public unset(columns: string | string[]): void {\r\n const targets = Array.isArray(columns) ? columns : [columns];\r\n\r\n for (const path of targets) {\r\n this.deleteFromRaw(path);\r\n }\r\n\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Resets both the initial and current snapshots to the provided data.\r\n *\r\n * If no data is provided, the current snapshot becomes the new baseline.\r\n * This clears all tracked changes and removed columns.\r\n *\r\n * @param data - Optional new data to use as the baseline. If omitted, uses current data.\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\" });\r\n * tracker.mergeChanges({ name: \"Bob\" });\r\n * tracker.hasChanges(); // true\r\n * tracker.reset(); // Make current state the new baseline\r\n * tracker.hasChanges(); // false\r\n *\r\n * // Or reset to entirely new data:\r\n * tracker.reset({ name: \"Charlie\", age: 25 });\r\n * ```\r\n */\r\n public reset(data?: Record<string, unknown>): void {\r\n const source = data ?? this.currentRaw;\r\n this.initialRaw = this.cloneData(source);\r\n this.currentRaw = this.cloneData(source);\r\n\r\n this.initialFlattened = this.flattenData(this.initialRaw);\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n\r\n this.dirtyColumns.clear();\r\n this.removedColumns.clear();\r\n }\r\n\r\n /**\r\n * Flattens the given data object.\r\n * Can be overridden by subclasses to change flattening behavior.\r\n */\r\n protected flattenData(data: Record<string, unknown>): FlatRecord {\r\n return flatten(data);\r\n }\r\n\r\n /**\r\n * Recomputes the dirty and removed column sets by comparing initial and current snapshots.\r\n *\r\n * This method is called internally after any operation that modifies the current data.\r\n * It iterates through all keys in both flattened snapshots and determines which columns\r\n * have been modified or removed.\r\n *\r\n * @protected\r\n */\r\n protected updateDirtyState(): void {\r\n this.dirtyColumns.clear();\r\n this.removedColumns.clear();\r\n\r\n const keys = new Set([\r\n ...Object.keys(this.initialFlattened),\r\n ...Object.keys(this.currentFlattened),\r\n ]);\r\n\r\n for (const key of keys) {\r\n const hasCurrent = this.currentFlattened[key] !== undefined || key in this.currentFlattened;\r\n const hasInitial = this.initialFlattened[key] !== undefined || key in this.initialFlattened;\r\n\r\n if (!hasCurrent && hasInitial) {\r\n this.removedColumns.add(key);\r\n }\r\n\r\n const initialValue = this.initialFlattened[key];\r\n const currentValue = hasCurrent ? this.currentFlattened[key] : undefined;\r\n\r\n if (!areEqual(initialValue, currentValue)) {\r\n this.dirtyColumns.add(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively merges source object into target object, performing a deep merge.\r\n *\r\n * Only **plain** objects are merged recursively. Everything else — arrays,\r\n * primitives, and class instances such as `Date` / `Map` / `Set` / `RegExp` —\r\n * replaces the target value. All values are cloned to prevent reference sharing.\r\n *\r\n * The plain-object guard is load-bearing, not tidiness. A bare\r\n * `typeof value === \"object\"` also matches a `Date`, and `Object.entries(date)`\r\n * is `[]` — so merging a `Date` over a column that already held a `Date`\r\n * recursed into it, copied nothing, and left the old value in the snapshot.\r\n * The column then never went dirty and `save()` returned\r\n * `{ success: true, modifiedCount: 0 }` without issuing an `UPDATE`. This is\r\n * the same lesson `canBeFlatten` above already encodes.\r\n *\r\n * @param target - The object to merge into\r\n * @param source - The object to merge from\r\n * @private\r\n */\r\n protected mergeIntoRaw(target: Record<string, unknown>, source: Record<string, unknown>): void {\r\n for (const [key, value] of Object.entries(source)) {\r\n if (isPlainObject(value) && isPlainObject(target[key])) {\r\n this.mergeIntoRaw(target[key] as Record<string, unknown>, value as Record<string, unknown>);\r\n continue;\r\n }\r\n\r\n target[key] = this.cloneData(value);\r\n }\r\n }\r\n\r\n /**\r\n * Deletes a field from the current raw data using a dot-notation path.\r\n *\r\n * Supports nested paths (e.g., \"address.city\") and array indices (e.g., \"items.0\").\r\n * If any segment in the path doesn't exist, the operation is a no-op.\r\n *\r\n * @param path - The dot-notation path to the field to delete\r\n * @private\r\n */\r\n protected deleteFromRaw(path: string): void {\r\n const segments = path.split(\".\");\r\n let container: unknown = this.currentRaw;\r\n\r\n for (let index = 0; index < segments.length - 1; index += 1) {\r\n if (container === undefined || container === null) {\r\n return;\r\n }\r\n\r\n container = this.resolveSegment(container, segments[index]);\r\n }\r\n\r\n if (container === undefined || container === null) {\r\n return;\r\n }\r\n\r\n const lastSegment = segments[segments.length - 1];\r\n if (Array.isArray(container)) {\r\n const numericIndex = Number(lastSegment);\r\n if (!Number.isNaN(numericIndex)) {\r\n container.splice(numericIndex, 1);\r\n }\r\n return;\r\n }\r\n\r\n if (typeof container === \"object\") {\r\n delete (container as Record<string, unknown>)[lastSegment];\r\n }\r\n }\r\n\r\n /**\r\n * Resolves a single segment of a dot-notation path within a container.\r\n *\r\n * Handles both object property access and array index access.\r\n *\r\n * @param container - The object or array to access\r\n * @param segment - The property name or array index as a string\r\n * @returns The value at the specified segment, or undefined if not found\r\n * @private\r\n */\r\n protected resolveSegment(container: unknown, segment: string): unknown {\r\n if (Array.isArray(container)) {\r\n const numericIndex = Number(segment);\r\n if (Number.isNaN(numericIndex)) {\r\n return undefined;\r\n }\r\n\r\n return container[numericIndex];\r\n }\r\n\r\n if (container && typeof container === \"object\") {\r\n return (container as Record<string, unknown>)[segment];\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Creates a deep clone of the provided data.\r\n *\r\n * @param data - The data to clone\r\n * @returns A deep clone of the data\r\n * @private\r\n */\r\n protected cloneData<T>(data: T): T {\r\n return clone(data);\r\n }\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"database-dirty-tracker.mjs","names":[],"sources":["../../../../../../cascade/src/database-dirty-tracker.ts"],"sourcesContent":["import { areEqual, clone } from \"@mongez/reinforcements\";\r\nimport { isPlainObject } from \"@mongez/supportive-is\";\r\n\r\nfunction canBeFlatten(object: unknown): boolean {\r\n return isPlainObject(object);\r\n}\r\n\r\n/**\r\n * A fix for flatten as non-plain object is being flatten as well which it should not be\r\n */\r\nfunction flatten(\r\n object: Record<string, unknown>,\r\n separator = \".\",\r\n keepNestedOriginalObject = false,\r\n parent?: string,\r\n root: Record<string, unknown> = {},\r\n) {\r\n if (canBeFlatten(object) === false) {\r\n return object;\r\n }\r\n // object = toPlainObject(object);\r\n for (const key of Object.keys(object)) {\r\n const value = object[key];\r\n const keyChain = parent ? parent + separator + key : key;\r\n if ((Array.isArray(value) && value.length === 0) || typeof value === \"function\") {\r\n root[keyChain] = value;\r\n } else if (canBeFlatten(value)) {\r\n if (keepNestedOriginalObject) {\r\n root[keyChain] = value;\r\n }\r\n flatten(\r\n value as Record<string, unknown>,\r\n separator,\r\n keepNestedOriginalObject,\r\n keyChain,\r\n root,\r\n );\r\n } else {\r\n root[keyChain] = value;\r\n }\r\n }\r\n return root;\r\n}\r\n\r\n/**\r\n * Flattened record type representing dot-notation paths mapped to their values.\r\n */\r\ntype FlatRecord = Record<string, unknown>;\r\n\r\n/**\r\n * Represents the old and new values of a dirty column.\r\n */\r\ntype DirtyColumnValues = { oldValue: unknown; newValue: unknown };\r\n\r\n/**\r\n * Tracks changes to model data by maintaining snapshots of initial and current state.\r\n *\r\n * The tracker stores both raw (nested) and flattened (dot-notation) versions of the data\r\n * to accurately detect modifications, additions, and removals at any nesting level.\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", age: 30 });\r\n * tracker.mergeChanges({ age: 31 });\r\n * console.log(tracker.hasChanges()); // true\r\n * console.log(tracker.getDirtyColumns()); // [\"age\"]\r\n * console.log(tracker.getDirtyColumnsWithValues());\r\n * // { age: { oldValue: 30, newValue: 31 } }\r\n * ```\r\n */\r\nexport class DatabaseDirtyTracker {\r\n /**\r\n * The initial raw data snapshot taken at construction or last reset.\r\n * Used as the baseline for comparison.\r\n */\r\n protected initialRaw: Record<string, unknown>;\r\n\r\n /**\r\n * The current raw data snapshot reflecting all changes made via merge/unset.\r\n */\r\n protected currentRaw: Record<string, unknown>;\r\n\r\n /**\r\n * Flattened version of the initial data using dot-notation keys.\r\n * Example: { \"address.city\": \"NYC\" }\r\n */\r\n protected initialFlattened: FlatRecord;\r\n\r\n /**\r\n * Flattened version of the current data using dot-notation keys.\r\n */\r\n protected currentFlattened: FlatRecord;\r\n\r\n /**\r\n * Set of column names (dot-notation paths) that have been modified.\r\n */\r\n protected readonly dirtyColumns = new Set<string>();\r\n\r\n /**\r\n * Set of column names (dot-notation paths) that existed initially but have been removed.\r\n */\r\n protected readonly removedColumns = new Set<string>();\r\n\r\n public constructor(data: Record<string, unknown>) {\r\n this.initialRaw = this.cloneData(data);\r\n this.currentRaw = this.cloneData(data);\r\n\r\n this.initialFlattened = this.flattenData(this.initialRaw);\r\n this.currentFlattened = { ...this.initialFlattened };\r\n\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Returns the list of dirty columns using dot-notation.\r\n *\r\n * A column is considered dirty if its value has changed compared to the initial snapshot.\r\n *\r\n * @returns An array of column names (dot-notation paths) that have been modified\r\n *\r\n * @example\r\n * ```typescript\r\n * tracker.mergeChanges({ name: \"Bob\", \"address.city\": \"LA\" });\r\n * tracker.getDirtyColumns(); // [\"name\", \"address.city\"]\r\n * ```\r\n */\r\n public getDirtyColumns(): string[] {\r\n return Array.from(this.dirtyColumns);\r\n }\r\n\r\n /**\r\n * Determines whether there are any tracked changes.\r\n *\r\n * Returns `true` if any columns have been modified or removed since the initial snapshot.\r\n *\r\n * @returns `true` if there are changes, `false` otherwise\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\" });\r\n * tracker.hasChanges(); // false\r\n * tracker.mergeChanges({ name: \"Bob\" });\r\n * tracker.hasChanges(); // true\r\n * tracker.unset(\"name\");\r\n * tracker.hasChanges(); // true (removed column counts as a change)\r\n * ```\r\n */\r\n public hasChanges(): boolean {\r\n return this.dirtyColumns.size > 0 || this.removedColumns.size > 0;\r\n }\r\n\r\n /**\r\n * Check if the given column is dirty (changed)\r\n */\r\n public isDirty(column: string): boolean {\r\n return this.dirtyColumns.has(column);\r\n }\r\n\r\n /**\r\n * Returns the set of columns that have been removed compared to the baseline.\r\n *\r\n * A column is considered removed if it existed in the initial snapshot but has been\r\n * explicitly unset or deleted from the current data.\r\n *\r\n * @returns An array of column names (dot-notation paths) that have been removed\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", temp: \"value\" });\r\n * tracker.unset(\"temp\");\r\n * tracker.getRemovedColumns(); // [\"temp\"]\r\n * ```\r\n */\r\n public getRemovedColumns(): string[] {\r\n return Array.from(this.removedColumns);\r\n }\r\n\r\n /**\r\n * Provides a mapping of dirty columns to their previous and current values.\r\n *\r\n * This is useful for generating audit logs, building partial update payloads,\r\n * or displaying change summaries to users.\r\n *\r\n * @returns A record mapping each dirty column to an object containing oldValue and newValue\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", age: 30 });\r\n * tracker.mergeChanges({ age: 31 });\r\n * tracker.getDirtyColumnsWithValues();\r\n * // { age: { oldValue: 30, newValue: 31 } }\r\n * ```\r\n */\r\n public getDirtyColumnsWithValues(): Record<string, DirtyColumnValues> {\r\n const result: Record<string, DirtyColumnValues> = {};\r\n\r\n for (const column of this.dirtyColumns) {\r\n const hasCurrent =\r\n this.currentFlattened[column] !== undefined || column in this.currentFlattened;\r\n\r\n result[column] = {\r\n oldValue: this.initialFlattened[column],\r\n newValue: hasCurrent ? this.currentFlattened[column] : undefined,\r\n };\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Replaces the current data snapshot entirely and recomputes the diff.\r\n *\r\n * This is useful when you want to replace all current data with a new set,\r\n * while keeping the initial baseline for comparison.\r\n *\r\n * @param data - The new data to set as the current snapshot\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\" });\r\n * tracker.replaceCurrentData({ name: \"Bob\", email: \"bob@example.com\" });\r\n * tracker.getDirtyColumns(); // [\"name\", \"email\"]\r\n * ```\r\n */\r\n public replaceCurrentData(data: Record<string, unknown>): void {\r\n this.currentRaw = this.cloneData(data);\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Merges a partial payload into the current snapshot and recomputes the diff.\r\n *\r\n * This performs a deep merge, preserving existing nested structures while\r\n * updating only the specified fields.\r\n *\r\n * @param partial - Partial data to merge into the current snapshot\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\", address: { city: \"NYC\" } });\r\n * tracker.mergeChanges({ address: { zip: \"10001\" } });\r\n * // Current data: { name: \"Alice\", address: { city: \"NYC\", zip: \"10001\" } }\r\n * tracker.getDirtyColumns(); // [\"address.zip\"]\r\n * ```\r\n */\r\n public mergeChanges(partial: Record<string, unknown>): void {\r\n this.mergeIntoRaw(this.currentRaw, partial);\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Explicitly removes one or more columns from the current data.\r\n *\r\n * Supports both single column names and arrays of column names.\r\n * Columns can be specified using dot-notation for nested paths.\r\n *\r\n * @param columns - A single column name or an array of column names to remove\r\n *\r\n * @example\r\n * ```typescript\r\n * tracker.unset(\"tempField\");\r\n * tracker.unset([\"field1\", \"field2\", \"nested.field\"]);\r\n * tracker.getRemovedColumns(); // [\"tempField\", \"field1\", \"field2\", \"nested.field\"]\r\n * ```\r\n */\r\n public unset(columns: string | string[]): void {\r\n const targets = Array.isArray(columns) ? columns : [columns];\r\n\r\n for (const path of targets) {\r\n this.deleteFromRaw(path);\r\n }\r\n\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n this.updateDirtyState();\r\n }\r\n\r\n /**\r\n * Resets both the initial and current snapshots to the provided data.\r\n *\r\n * If no data is provided, the current snapshot becomes the new baseline.\r\n * This clears all tracked changes and removed columns.\r\n *\r\n * @param data - Optional new data to use as the baseline. If omitted, uses current data.\r\n *\r\n * @example\r\n * ```typescript\r\n * const tracker = new DatabaseDirtyTracker({ name: \"Alice\" });\r\n * tracker.mergeChanges({ name: \"Bob\" });\r\n * tracker.hasChanges(); // true\r\n * tracker.reset(); // Make current state the new baseline\r\n * tracker.hasChanges(); // false\r\n *\r\n * // Or reset to entirely new data:\r\n * tracker.reset({ name: \"Charlie\", age: 25 });\r\n * ```\r\n */\r\n public reset(data?: Record<string, unknown>): void {\r\n const source = data ?? this.currentRaw;\r\n this.initialRaw = this.cloneData(source);\r\n this.currentRaw = this.cloneData(source);\r\n\r\n this.initialFlattened = this.flattenData(this.initialRaw);\r\n this.currentFlattened = this.flattenData(this.currentRaw);\r\n\r\n this.dirtyColumns.clear();\r\n this.removedColumns.clear();\r\n }\r\n\r\n /**\r\n * Flattens the given data object.\r\n * Can be overridden by subclasses to change flattening behavior.\r\n */\r\n protected flattenData(data: Record<string, unknown>): FlatRecord {\r\n return flatten(data);\r\n }\r\n\r\n /**\r\n * Recomputes the dirty and removed column sets by comparing initial and current snapshots.\r\n *\r\n * This method is called internally after any operation that modifies the current data.\r\n * It iterates through all keys in both flattened snapshots and determines which columns\r\n * have been modified or removed.\r\n *\r\n * @protected\r\n */\r\n protected updateDirtyState(): void {\r\n this.dirtyColumns.clear();\r\n this.removedColumns.clear();\r\n\r\n const keys = new Set([\r\n ...Object.keys(this.initialFlattened),\r\n ...Object.keys(this.currentFlattened),\r\n ]);\r\n\r\n for (const key of keys) {\r\n const hasCurrent = this.currentFlattened[key] !== undefined || key in this.currentFlattened;\r\n const hasInitial = this.initialFlattened[key] !== undefined || key in this.initialFlattened;\r\n\r\n if (!hasCurrent && hasInitial) {\r\n this.removedColumns.add(key);\r\n }\r\n\r\n const initialValue = this.initialFlattened[key];\r\n const currentValue = hasCurrent ? this.currentFlattened[key] : undefined;\r\n\r\n if (!areEqual(initialValue, currentValue)) {\r\n this.dirtyColumns.add(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively merges source object into target object, performing a deep merge.\r\n *\r\n * Only **plain** objects are merged recursively. Everything else — arrays,\r\n * primitives, and class instances such as `Date` / `Map` / `Set` / `RegExp` —\r\n * replaces the target value. All values are cloned to prevent reference sharing.\r\n *\r\n * The plain-object guard is load-bearing, not tidiness. A bare\r\n * `typeof value === \"object\"` also matches a `Date`, and `Object.entries(date)`\r\n * is `[]` — so merging a `Date` over a column that already held a `Date`\r\n * recursed into it, copied nothing, and left the old value in the snapshot.\r\n * The column then never went dirty and `save()` returned\r\n * `{ success: true, modifiedCount: 0 }` without issuing an `UPDATE`. This is\r\n * the same lesson `canBeFlatten` above already encodes.\r\n *\r\n * @param target - The object to merge into\r\n * @param source - The object to merge from\r\n * @private\r\n */\r\n protected mergeIntoRaw(target: Record<string, unknown>, source: Record<string, unknown>): void {\r\n for (const [key, value] of Object.entries(source)) {\r\n if (isPlainObject(value) && isPlainObject(target[key])) {\r\n this.mergeIntoRaw(target[key] as Record<string, unknown>, value as Record<string, unknown>);\r\n continue;\r\n }\r\n\r\n target[key] = this.cloneData(value);\r\n }\r\n }\r\n\r\n /**\r\n * Deletes a field from the current raw data using a dot-notation path.\r\n *\r\n * Supports nested paths (e.g., \"address.city\") and array indices (e.g., \"items.0\").\r\n * If any segment in the path doesn't exist, the operation is a no-op.\r\n *\r\n * @param path - The dot-notation path to the field to delete\r\n * @private\r\n */\r\n protected deleteFromRaw(path: string): void {\r\n const segments = path.split(\".\");\r\n let container: unknown = this.currentRaw;\r\n\r\n for (let index = 0; index < segments.length - 1; index += 1) {\r\n if (container === undefined || container === null) {\r\n return;\r\n }\r\n\r\n const segment = segments[index];\n if (segment === undefined) {\n return;\n }\n\n container = this.resolveSegment(container, segment);\n }\r\n\r\n if (container === undefined || container === null) {\r\n return;\r\n }\r\n\r\n const lastSegment = segments[segments.length - 1];\n if (lastSegment === undefined) {\n return;\n }\n if (Array.isArray(container)) {\r\n const numericIndex = Number(lastSegment);\r\n if (!Number.isNaN(numericIndex)) {\r\n container.splice(numericIndex, 1);\r\n }\r\n return;\r\n }\r\n\r\n if (typeof container === \"object\") {\r\n delete (container as Record<string, unknown>)[lastSegment];\r\n }\r\n }\r\n\r\n /**\r\n * Resolves a single segment of a dot-notation path within a container.\r\n *\r\n * Handles both object property access and array index access.\r\n *\r\n * @param container - The object or array to access\r\n * @param segment - The property name or array index as a string\r\n * @returns The value at the specified segment, or undefined if not found\r\n * @private\r\n */\r\n protected resolveSegment(container: unknown, segment: string): unknown {\r\n if (Array.isArray(container)) {\r\n const numericIndex = Number(segment);\r\n if (Number.isNaN(numericIndex)) {\r\n return undefined;\r\n }\r\n\r\n return container[numericIndex];\r\n }\r\n\r\n if (container && typeof container === \"object\") {\r\n return (container as Record<string, unknown>)[segment];\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Creates a deep clone of the provided data.\r\n *\r\n * @param data - The data to clone\r\n * @returns A deep clone of the data\r\n * @private\r\n */\r\n protected cloneData<T>(data: T): T {\r\n return clone(data);\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-migration-driver.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-migration-driver.ts"],"mappings":"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"}
1
+ {"version":3,"file":"mongodb-migration-driver.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-migration-driver.ts"],"mappings":"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"}
@@ -191,6 +191,7 @@ var MongoMigrationDriver = class {
191
191
  const indexSpec = {};
192
192
  for (let i = 0; i < index.columns.length; i++) {
193
193
  const column = index.columns[i];
194
+ if (column === void 0) continue;
194
195
  indexSpec[column] = index.directions?.[i] === "desc" ? -1 : 1;
195
196
  }
196
197
  const options = {};
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-migration-driver.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-migration-driver.ts"],"sourcesContent":["import type { ClientSession, CreateIndexesOptions, Db, IndexDescription } from \"mongodb\";\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\nimport type {\n ColumnDefinition,\n ForeignKeyDefinition,\n FullTextIndexOptions,\n GeoIndexOptions,\n IndexDefinition,\n MigrationDriverContract,\n TableIndexInformation,\n VectorIndexOptions,\n} from \"../../contracts/migration-driver.contract\";\nimport type { MigrationDefaults } from \"../../types\";\nimport type { MongoDbDriver } from \"./mongodb-driver\";\n\n/**\n * MongoDB-specific migration driver implementation.\n *\n * Key behaviors:\n * - Column operations are **no-ops** (MongoDB is schema-less)\n * - Index operations use native `createIndex()`\n * - Foreign keys are **no-ops** (MongoDB has no FK constraints)\n * - TTL indexes supported natively\n * - Vector indexes use Atlas Search (when available)\n * - Schema validation uses `collMod` command\n *\n * @example\n * ```typescript\n * const migrationDriver = new MongoMigrationDriver(mongoDriver);\n * await migrationDriver.createIndex(\"users\", {\n * columns: [\"email\"],\n * unique: true,\n * });\n * ```\n */\nexport class MongoMigrationDriver implements MigrationDriverContract {\n /** Active transaction session (if any) */\n private session?: ClientSession;\n\n /**\n * Create a new MongoDB migration driver.\n *\n * @param driver - The MongoDB driver instance\n */\n public constructor(public readonly driver: MongoDbDriver) {}\n\n /**\n * Get the MongoDB database instance.\n */\n private get db(): Db {\n return this.driver.getDatabase();\n }\n\n /**\n * Get session options for operations.\n */\n private get sessionOptions(): { session?: ClientSession } | undefined {\n const session = databaseTransactionContext.getSession<ClientSession>();\n return session ? { session } : undefined;\n }\n\n // ============================================================================\n // TABLE/COLLECTION OPERATIONS\n // ============================================================================\n\n /**\n * Create a new collection.\n *\n * MongoDB creates collections lazily on first insert, but this method\n * creates them explicitly for migrations that need to add indexes or\n * schema validation.\n */\n public async createTable(table: string): Promise<void> {\n try {\n await this.db.createCollection(table);\n } catch (error: any) {\n // Collection already exists - ignore\n if (error.codeName === \"NamespaceExists\") {\n return;\n }\n throw error;\n }\n }\n\n /**\n * Create table if not exists\n */\n public async createTableIfNotExists(table: string): Promise<void> {\n try {\n await this.db.createCollection(table);\n } catch (error: any) {\n // Collection already exists - ignore\n if (error.codeName === \"NamespaceExists\") {\n return;\n }\n throw error;\n }\n }\n\n /**\n * Drop an existing collection.\n *\n * @throws Error if collection doesn't exist\n */\n public async dropTable(table: string): Promise<void> {\n await this.db.dropCollection(table);\n }\n\n /**\n * Drop collection if it exists (no error if missing).\n */\n public async dropTableIfExists(table: string): Promise<void> {\n try {\n await this.db.dropCollection(table);\n } catch {\n // Collection doesn't exist - ignore\n }\n }\n\n /**\n * Rename a collection.\n */\n public async renameTable(from: string, to: string): Promise<void> {\n await this.db.renameCollection(from, to);\n }\n\n /**\n * Truncate a collection — remove all documents.\n *\n * @param table - Collection name\n */\n public async truncateTable(table: string): Promise<void> {\n await this.db.collection(table).deleteMany({});\n }\n\n /**\n * Check if a collection exists.\n */\n public async tableExists(table: string): Promise<boolean> {\n const collections = await this.db.listCollections({ name: table }).toArray();\n return collections.length > 0;\n }\n\n /**\n * List all columns in a collection.\n *\n * MongoDB is schema-less, so this returns an empty array.\n * For actual schema inspection, would need to sample documents.\n */\n public async listColumns(_table: string): Promise<ColumnDefinition[]> {\n // No-op: MongoDB is schema-less\n return [];\n }\n\n /**\n * List all collections in the current database.\n */\n public async listTables(): Promise<string[]> {\n const collections = await this.db.listCollections().toArray();\n return collections.map((col) => col.name);\n }\n\n /**\n * Ensure the migrations tracking collection exists.\n *\n * MongoDB creates collections lazily, but we can create explicitly\n * and add a unique index on the name field.\n *\n * @param tableName - Name of the migrations collection\n */\n public async ensureMigrationsTable(tableName: string): Promise<void> {\n // Create collection if not exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n await this.db.createCollection(tableName);\n }\n\n // Ensure unique index on name\n await this.db.collection(tableName).createIndex({ name: 1 }, { unique: true });\n }\n\n // ============================================================================\n // COLUMN OPERATIONS (No-ops for MongoDB)\n // ============================================================================\n\n /**\n * Add a column (no-op for MongoDB).\n *\n * MongoDB is schema-less, so columns don't need to be declared.\n */\n public async addColumn(_table: string, _column: ColumnDefinition): Promise<void> {\n // No-op: MongoDB is schema-less\n }\n\n /**\n * Drop a column by running $unset on all documents.\n *\n * This actually removes the field from all documents in the collection.\n */\n public async dropColumn(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n await collection.updateMany({}, { $unset: { [column]: \"\" } }, this.sessionOptions);\n }\n\n /**\n * Drop multiple columns by running $unset on all documents.\n */\n public async dropColumns(table: string, columns: string[]): Promise<void> {\n const collection = this.db.collection(table);\n const unsetFields: Record<string, string> = {};\n for (const column of columns) {\n unsetFields[column] = \"\";\n }\n await collection.updateMany({}, { $unset: unsetFields }, this.sessionOptions);\n }\n\n /**\n * Rename a column by running $rename on all documents.\n */\n public async renameColumn(table: string, from: string, to: string): Promise<void> {\n const collection = this.db.collection(table);\n await collection.updateMany({}, { $rename: { [from]: to } }, this.sessionOptions);\n }\n\n /**\n * Modify a column definition (no-op for MongoDB).\n *\n * MongoDB is schema-less, so column types don't need to be modified.\n */\n public async modifyColumn(_table: string, _column: ColumnDefinition): Promise<void> {\n // No-op: MongoDB is schema-less\n }\n\n /**\n * Create standard timestamp columns (created_at, updated_at).\n *\n * MongoDB implementation is a no-op since timestamps are handled\n * at the application level via Model hooks.\n *\n * @param _table - Collection name (unused)\n */\n public async createTimestampColumns(_table: string): Promise<void> {\n // No-op: MongoDB handles timestamps at application level\n }\n\n // ============================================================================\n // INDEX OPERATIONS\n // ============================================================================\n\n /**\n * Create an index on one or more columns.\n *\n * **Note**: Expression-based indexes, INCLUDE clause, and concurrent creation\n * are PostgreSQL-specific features and are silently ignored by MongoDB.\n */\n public async createIndex(table: string, index: IndexDefinition): Promise<void> {\n // Skip expression-based indexes (PostgreSQL-specific)\n if (index.expressions && index.expressions.length > 0) {\n // No-op: MongoDB doesn't support expression-based indexes\n return;\n }\n\n // Ignore include and concurrently options (PostgreSQL-specific)\n // MongoDB doesn't support covering indexes or concurrent creation\n\n const collection = this.db.collection(table);\n\n // Build index specification\n const indexSpec: IndexDescription[\"key\"] = {};\n for (let i = 0; i < index.columns.length; i++) {\n const column = index.columns[i];\n const direction = index.directions?.[i] === \"desc\" ? -1 : 1;\n indexSpec[column] = direction;\n }\n\n // Build index options\n const options: CreateIndexesOptions = {};\n if (index.name) {\n options.name = index.name;\n }\n if (index.unique) {\n options.unique = true;\n }\n if (index.sparse) {\n options.sparse = true;\n }\n if (index.where) {\n options.partialFilterExpression = index.where;\n }\n\n await collection.createIndex(indexSpec, options);\n }\n\n /**\n * Drop an index by name or columns.\n *\n * A string is the literal index name and is passed through untouched; a\n * columns array resolves to the MongoDB convention name\n * (`\"column1_1_column2_1\"`) those columns auto-name to.\n *\n * @param indexNameOrColumns - Index name (string) or columns array\n */\n public async dropIndex(table: string, indexNameOrColumns: string | string[]): Promise<void> {\n const collection = this.db.collection(table);\n\n const indexName = Array.isArray(indexNameOrColumns)\n ? indexNameOrColumns.map((col) => `${col}_1`).join(\"_\")\n : indexNameOrColumns;\n\n await collection.dropIndex(indexName);\n }\n\n /**\n * Create a unique index/constraint.\n */\n public async createUniqueIndex(table: string, columns: string[], name?: string): Promise<void> {\n await this.createIndex(table, {\n columns,\n unique: true,\n name,\n });\n }\n\n /**\n * Drop a unique index by finding its name from columns.\n */\n public async dropUniqueIndex(table: string, columns: string[]): Promise<void> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n // Find the index that matches the columns\n for (const idx of indexes) {\n const indexKeys = Object.keys(idx.key || {});\n if (indexKeys.length === columns.length && indexKeys.every((key, i) => key === columns[i])) {\n if (idx.name && idx.name !== \"_id_\") {\n await collection.dropIndex(idx.name);\n return;\n }\n }\n }\n }\n\n // ============================================================================\n // SPECIALIZED INDEXES\n // ============================================================================\n\n /**\n * Create a full-text search index.\n *\n * MongoDB uses \"text\" index type for full-text search.\n */\n public async createFullTextIndex(\n table: string,\n columns: string[],\n options?: FullTextIndexOptions,\n ): Promise<void> {\n const collection = this.db.collection(table);\n\n // Build text index specification\n const indexSpec: Record<string, \"text\"> = {};\n for (const column of columns) {\n indexSpec[column] = \"text\";\n }\n\n // Build options\n const indexOptions: CreateIndexesOptions = {};\n if (options?.name) {\n indexOptions.name = options.name;\n }\n if (options?.language) {\n indexOptions.default_language = options.language;\n }\n if (options?.weights) {\n indexOptions.weights = options.weights;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n\n /**\n * Drop a full-text search index.\n */\n public async dropFullTextIndex(table: string, name: string): Promise<void> {\n await this.dropIndex(table, name);\n }\n\n /**\n * Create a geo-spatial index.\n */\n public async createGeoIndex(\n table: string,\n column: string,\n options?: GeoIndexOptions,\n ): Promise<void> {\n const collection = this.db.collection(table);\n\n // Build geo index specification - MongoDB accepts string values for geo indexes\n const indexType = options?.type ?? \"2dsphere\";\n\n // Build options\n const indexOptions: CreateIndexesOptions = {};\n if (options?.name) {\n indexOptions.name = options.name;\n }\n if (options?.min !== undefined) {\n indexOptions.min = options.min;\n }\n if (options?.max !== undefined) {\n indexOptions.max = options.max;\n }\n\n await collection.createIndex({ [column]: indexType } as any, indexOptions);\n }\n\n /**\n * Drop a geo-spatial index.\n */\n public async dropGeoIndex(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n // Find the geo index for this column\n for (const idx of indexes) {\n const key = idx.key || {};\n if (column in key && (key[column] === \"2dsphere\" || key[column] === \"2d\")) {\n if (idx.name && idx.name !== \"_id_\") {\n await collection.dropIndex(idx.name);\n return;\n }\n }\n }\n }\n\n /**\n * Create a vector search index for AI embeddings.\n *\n * Note: This requires MongoDB Atlas with Vector Search enabled.\n * For self-hosted MongoDB, this will create a regular index on the field.\n */\n public async createVectorIndex(\n table: string,\n column: string,\n options: VectorIndexOptions,\n ): Promise<void> {\n const collection = this.db.collection(table);\n\n // Try to create Atlas vector search index first\n try {\n // Check if we're on Atlas by looking for vectorSearch indexes\n const searchIndexes = await (collection as any).listSearchIndexes?.()?.toArray?.();\n if (Array.isArray(searchIndexes)) {\n // We're on Atlas - create a vector search index\n await (collection as any).createSearchIndex({\n name: options.name ?? `${column}_vector_idx`,\n definition: {\n mappings: {\n dynamic: false,\n fields: {\n [column]: {\n type: \"knnVector\",\n dimensions: options.dimensions,\n similarity: options.similarity ?? \"cosine\",\n },\n },\n },\n },\n });\n return;\n }\n } catch {\n // Not on Atlas or doesn't support search indexes\n }\n\n // Fallback: Create a regular index on the vector field\n // This won't provide vector search capabilities but ensures the field is indexed\n await collection.createIndex({ [column]: 1 }, { name: options.name ?? `${column}_vector_idx` });\n }\n\n /**\n * Drop a vector search index.\n */\n public async dropVectorIndex(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n\n // Try to drop Atlas search index first\n try {\n const searchIndexes = await (collection as any).listSearchIndexes?.()?.toArray?.();\n if (Array.isArray(searchIndexes)) {\n for (const idx of searchIndexes) {\n if (idx.name?.includes(column)) {\n await (collection as any).dropSearchIndex(idx.name);\n return;\n }\n }\n }\n } catch {\n // Not on Atlas\n }\n\n // Fallback: Try to drop regular index\n const indexName = `${column}_vector_idx`;\n try {\n await collection.dropIndex(indexName);\n } catch {\n // Index doesn't exist\n }\n }\n\n /**\n * Create a TTL (time-to-live) index for automatic document expiration.\n */\n public async createTTLIndex(\n table: string,\n column: string,\n expireAfterSeconds: number,\n ): Promise<void> {\n const collection = this.db.collection(table);\n await collection.createIndex({ [column]: 1 }, { expireAfterSeconds });\n }\n\n /**\n * Drop a TTL index.\n */\n public async dropTTLIndex(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n // Find the TTL index for this column\n for (const idx of indexes) {\n const key = idx.key || {};\n if (column in key && idx.expireAfterSeconds !== undefined) {\n if (idx.name && idx.name !== \"_id_\") {\n await collection.dropIndex(idx.name);\n return;\n }\n }\n }\n }\n\n /**\n * List all indexes on a collection.\n *\n * @param table - Collection name\n * @returns Array of index metadata\n */\n public async listIndexes(table: string): Promise<TableIndexInformation[]> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n return indexes.map((idx) => ({\n name: idx.name ?? \"\",\n columns: Object.keys(idx.key ?? {}),\n type: \"btree\",\n unique: idx.unique ?? false,\n partial: !!idx.partialFilterExpression,\n options: { sparse: idx.sparse, expireAfterSeconds: idx.expireAfterSeconds },\n }));\n }\n\n // ============================================================================\n // CONSTRAINTS (No-ops for MongoDB)\n // ============================================================================\n\n /**\n * Add a foreign key constraint (no-op for MongoDB).\n *\n * MongoDB doesn't support foreign key constraints.\n * Use application-level validation or DBRefs instead.\n */\n public async addForeignKey(_table: string, _foreignKey: ForeignKeyDefinition): Promise<void> {\n // No-op: MongoDB doesn't support foreign keys\n }\n\n /**\n * Drop a foreign key constraint (no-op for MongoDB).\n */\n public async dropForeignKey(_table: string, _name: string): Promise<void> {\n // No-op: MongoDB doesn't support foreign keys\n }\n\n /**\n * Add a primary key constraint (no-op for MongoDB).\n *\n * MongoDB always has _id as the primary key.\n */\n public async addPrimaryKey(_table: string, _columns: string[]): Promise<void> {\n // No-op: MongoDB always has _id as primary key\n }\n\n /**\n * Drop the primary key constraint (no-op for MongoDB).\n */\n public async dropPrimaryKey(_table: string): Promise<void> {\n // No-op: Cannot drop _id index in MongoDB\n }\n\n /**\n * Add a CHECK constraint (no-op for MongoDB).\n *\n * MongoDB doesn't support CHECK constraints.\n * Use schema validation instead.\n */\n public async addCheck(_table: string, _name: string, _expression: string): Promise<void> {\n // No-op: MongoDB doesn't support CHECK constraints\n }\n\n /**\n * Drop a CHECK constraint (no-op for MongoDB).\n */\n public async dropCheck(_table: string, _name: string): Promise<void> {\n // No-op: MongoDB doesn't support CHECK constraints\n }\n\n // ============================================================================\n // SCHEMA VALIDATION (NoSQL)\n // ============================================================================\n\n /**\n * Set JSON schema validation rules on a collection.\n *\n * Uses MongoDB's validator feature to enforce document structure.\n *\n * @example\n * ```typescript\n * await driver.setSchemaValidation(\"users\", {\n * bsonType: \"object\",\n * required: [\"name\", \"email\"],\n * properties: {\n * name: { bsonType: \"string\" },\n * email: { bsonType: \"string\" },\n * },\n * });\n * ```\n */\n public async setSchemaValidation(table: string, schema: object): Promise<void> {\n await this.db.command({\n collMod: table,\n validator: { $jsonSchema: schema },\n validationLevel: \"strict\",\n validationAction: \"error\",\n });\n }\n\n /**\n * Remove schema validation rules from a collection.\n */\n public async removeSchemaValidation(table: string): Promise<void> {\n await this.db.command({\n collMod: table,\n validator: {},\n validationLevel: \"off\",\n });\n }\n\n // ============================================================================\n // TRANSACTIONS\n // ============================================================================\n\n /**\n * Begin a database transaction.\n *\n * Uses the driver's transaction mechanism.\n */\n public async beginTransaction(): Promise<void> {\n const transaction = await this.driver.beginTransaction();\n this.session = transaction.context;\n }\n\n /**\n * Commit the current transaction.\n */\n public async commit(): Promise<void> {\n if (this.session) {\n await this.session.commitTransaction();\n await this.session.endSession();\n this.session = undefined;\n }\n }\n\n /**\n * Rollback the current transaction.\n */\n public async rollback(): Promise<void> {\n if (this.session) {\n await this.session.abortTransaction();\n await this.session.endSession();\n this.session = undefined;\n }\n }\n\n /**\n * MongoDB supports transactions (requires replica set).\n */\n public supportsTransactions(): boolean {\n return true;\n }\n\n /**\n * Get the default transactional behavior for MongoDB.\n *\n * MongoDB DDL operations (createCollection, createIndex, etc.) cannot\n * be wrapped in transactions, even with replica sets. Transactions only\n * work for document CRUD operations.\n *\n * @returns false (MongoDB DDL is not transactional)\n */\n public getDefaultTransactional(): boolean {\n return false;\n }\n\n // ============================================================================\n // DEFAULTS\n // ============================================================================\n\n /**\n * Get the default UUID generation expression for MongoDB.\n *\n * MongoDB does not use SQL-level UUID defaults — UUID generation\n * is handled at the application level. Always returns `undefined`.\n *\n * @param _migrationDefaults - Ignored (MongoDB handles UUIDs at app level)\n * @returns undefined\n */\n public getUuidDefault(_migrationDefaults?: MigrationDefaults): undefined {\n return undefined;\n }\n\n // ============================================================================\n // EXTENSIONS\n // ============================================================================\n\n /**\n * Check if a database extension is available (no-op for MongoDB).\n *\n * @param _extension - Extension name\n */\n public async isExtensionAvailable(_extension: string): Promise<boolean> {\n return true; // MongoDB doesn't use SQL extensions\n }\n\n /**\n * Get the official documentation or installation URL for a database extension.\n *\n * @param _extension - Extension name\n */\n public getExtensionDocsUrl(_extension: string): string | undefined {\n return undefined; // MongoDB doesn't use SQL extensions\n }\n\n // ============================================================================\n // RAW ACCESS\n // ============================================================================\n\n /**\n * Execute raw operations with direct database access.\n *\n * @param callback - Callback receiving the MongoDB Db instance\n * @returns Result from callback\n *\n * @example\n * ```typescript\n * await driver.raw(async (db) => {\n * await db.collection(\"users\").updateMany({}, { $set: { active: true } });\n * });\n * ```\n */\n public async raw<T>(callback: (connection: unknown) => Promise<T>): Promise<T> {\n return callback(this.db);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAa,uBAAb,MAAqE;CAShC;;CAPnC,AAAQ;;;;;;CAOR,AAAO,YAAY,AAAgB,QAAuB;EAAvB;CAAwB;;;;CAK3D,IAAY,KAAS;EACnB,OAAO,KAAK,OAAO,YAAY;CACjC;;;;CAKA,IAAY,iBAA0D;EACpE,MAAM,UAAU,2BAA2B,WAA0B;EACrE,OAAO,UAAU,EAAE,QAAQ,IAAI;CACjC;;;;;;;;CAaA,MAAa,YAAY,OAA8B;EACrD,IAAI;GACF,MAAM,KAAK,GAAG,iBAAiB,KAAK;EACtC,SAAS,OAAY;GAEnB,IAAI,MAAM,aAAa,mBACrB;GAEF,MAAM;EACR;CACF;;;;CAKA,MAAa,uBAAuB,OAA8B;EAChE,IAAI;GACF,MAAM,KAAK,GAAG,iBAAiB,KAAK;EACtC,SAAS,OAAY;GAEnB,IAAI,MAAM,aAAa,mBACrB;GAEF,MAAM;EACR;CACF;;;;;;CAOA,MAAa,UAAU,OAA8B;EACnD,MAAM,KAAK,GAAG,eAAe,KAAK;CACpC;;;;CAKA,MAAa,kBAAkB,OAA8B;EAC3D,IAAI;GACF,MAAM,KAAK,GAAG,eAAe,KAAK;EACpC,QAAQ,CAER;CACF;;;;CAKA,MAAa,YAAY,MAAc,IAA2B;EAChE,MAAM,KAAK,GAAG,iBAAiB,MAAM,EAAE;CACzC;;;;;;CAOA,MAAa,cAAc,OAA8B;EACvD,MAAM,KAAK,GAAG,WAAW,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;CAC/C;;;;CAKA,MAAa,YAAY,OAAiC;EAExD,QAAO,MADmB,KAAK,GAAG,gBAAgB,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC,QAAQ,EACzD,CAAC,SAAS;CAC9B;;;;;;;CAQA,MAAa,YAAY,QAA6C;EAEpE,OAAO,CAAC;CACV;;;;CAKA,MAAa,aAAgC;EAE3C,QAAO,MADmB,KAAK,GAAG,gBAAgB,CAAC,CAAC,QAAQ,EAC1C,CAAC,KAAK,QAAQ,IAAI,IAAI;CAC1C;;;;;;;;;CAUA,MAAa,sBAAsB,WAAkC;EAGnE,IAAI,CAAC,MADgB,KAAK,YAAY,SAAS,GAE7C,MAAM,KAAK,GAAG,iBAAiB,SAAS;EAI1C,MAAM,KAAK,GAAG,WAAW,SAAS,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;CAC/E;;;;;;CAWA,MAAa,UAAU,QAAgB,SAA0C,CAEjF;;;;;;CAOA,MAAa,WAAW,OAAe,QAA+B;EAEpE,MADmB,KAAK,GAAG,WAAW,KACvB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,GAAG,EAAE,GAAG,KAAK,cAAc;CACnF;;;;CAKA,MAAa,YAAY,OAAe,SAAkC;EACxE,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAC3C,MAAM,cAAsC,CAAC;EAC7C,KAAK,MAAM,UAAU,SACnB,YAAY,UAAU;EAExB,MAAM,WAAW,WAAW,CAAC,GAAG,EAAE,QAAQ,YAAY,GAAG,KAAK,cAAc;CAC9E;;;;CAKA,MAAa,aAAa,OAAe,MAAc,IAA2B;EAEhF,MADmB,KAAK,GAAG,WAAW,KACvB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,GAAG,EAAE,GAAG,KAAK,cAAc;CAClF;;;;;;CAOA,MAAa,aAAa,QAAgB,SAA0C,CAEpF;;;;;;;;;CAUA,MAAa,uBAAuB,QAA+B,CAEnE;;;;;;;CAYA,MAAa,YAAY,OAAe,OAAuC;EAE7E,IAAI,MAAM,eAAe,MAAM,YAAY,SAAS,GAElD;EAMF,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAG3C,MAAM,YAAqC,CAAC;EAC5C,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,QAAQ,KAAK;GAC7C,MAAM,SAAS,MAAM,QAAQ;GAE7B,UAAU,UADQ,MAAM,aAAa,OAAO,SAAS,KAAK;EAE5D;EAGA,MAAM,UAAgC,CAAC;EACvC,IAAI,MAAM,MACR,QAAQ,OAAO,MAAM;EAEvB,IAAI,MAAM,QACR,QAAQ,SAAS;EAEnB,IAAI,MAAM,QACR,QAAQ,SAAS;EAEnB,IAAI,MAAM,OACR,QAAQ,0BAA0B,MAAM;EAG1C,MAAM,WAAW,YAAY,WAAW,OAAO;CACjD;;;;;;;;;;CAWA,MAAa,UAAU,OAAe,oBAAsD;EAC1F,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAE3C,MAAM,YAAY,MAAM,QAAQ,kBAAkB,IAC9C,mBAAmB,KAAK,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,IACpD;EAEJ,MAAM,WAAW,UAAU,SAAS;CACtC;;;;CAKA,MAAa,kBAAkB,OAAe,SAAmB,MAA8B;EAC7F,MAAM,KAAK,YAAY,OAAO;GAC5B;GACA,QAAQ;GACR;EACF,CAAC;CACH;;;;CAKA,MAAa,gBAAgB,OAAe,SAAkC;EAC5E,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAC3C,MAAM,UAAU,MAAM,WAAW,QAAQ;EAGzC,KAAK,MAAM,OAAO,SAAS;GACzB,MAAM,YAAY,OAAO,KAAK,IAAI,OAAO,CAAC,CAAC;GAC3C,IAAI,UAAU,WAAW,QAAQ,UAAU,UAAU,OAAO,KAAK,MAAM,QAAQ,QAAQ,EAAE,GACvF;QAAI,IAAI,QAAQ,IAAI,SAAS,QAAQ;KACnC,MAAM,WAAW,UAAU,IAAI,IAAI;KACnC;IACF;;EAEJ;CACF;;;;;;CAWA,MAAa,oBACX,OACA,SACA,SACe;EACf,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAG3C,MAAM,YAAoC,CAAC;EAC3C,KAAK,MAAM,UAAU,SACnB,UAAU,UAAU;EAItB,MAAM,eAAqC,CAAC;EAC5C,IAAI,SAAS,MACX,aAAa,OAAO,QAAQ;EAE9B,IAAI,SAAS,UACX,aAAa,mBAAmB,QAAQ;EAE1C,IAAI,SAAS,SACX,aAAa,UAAU,QAAQ;EAGjC,MAAM,WAAW,YAAY,WAAW,YAAY;CACtD;;;;CAKA,MAAa,kBAAkB,OAAe,MAA6B;EACzE,MAAM,KAAK,UAAU,OAAO,IAAI;CAClC;;;;CAKA,MAAa,eACX,OACA,QACA,SACe;EACf,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAG3C,MAAM,YAAY,SAAS,QAAQ;EAGnC,MAAM,eAAqC,CAAC;EAC5C,IAAI,SAAS,MACX,aAAa,OAAO,QAAQ;EAE9B,IAAI,SAAS,QAAQ,QACnB,aAAa,MAAM,QAAQ;EAE7B,IAAI,SAAS,QAAQ,QACnB,aAAa,MAAM,QAAQ;EAG7B,MAAM,WAAW,YAAY,GAAG,SAAS,UAAU,GAAU,YAAY;CAC3E;;;;CAKA,MAAa,aAAa,OAAe,QAA+B;EACtE,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAC3C,MAAM,UAAU,MAAM,WAAW,QAAQ;EAGzC,KAAK,MAAM,OAAO,SAAS;GACzB,MAAM,MAAM,IAAI,OAAO,CAAC;GACxB,IAAI,UAAU,QAAQ,IAAI,YAAY,cAAc,IAAI,YAAY,OAClE;QAAI,IAAI,QAAQ,IAAI,SAAS,QAAQ;KACnC,MAAM,WAAW,UAAU,IAAI,IAAI;KACnC;IACF;;EAEJ;CACF;;;;;;;CAQA,MAAa,kBACX,OACA,QACA,SACe;EACf,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAG3C,IAAI;GAEF,MAAM,gBAAgB,MAAO,WAAmB,oBAAoB,CAAC,EAAE,UAAU;GACjF,IAAI,MAAM,QAAQ,aAAa,GAAG;IAEhC,MAAO,WAAmB,kBAAkB;KAC1C,MAAM,QAAQ,QAAQ,GAAG,OAAO;KAChC,YAAY,EACV,UAAU;MACR,SAAS;MACT,QAAQ,GACL,SAAS;OACR,MAAM;OACN,YAAY,QAAQ;OACpB,YAAY,QAAQ,cAAc;MACpC,EACF;KACF,EACF;IACF,CAAC;IACD;GACF;EACF,QAAQ,CAER;EAIA,MAAM,WAAW,YAAY,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,QAAQ,QAAQ,GAAG,OAAO,aAAa,CAAC;CAChG;;;;CAKA,MAAa,gBAAgB,OAAe,QAA+B;EACzE,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAG3C,IAAI;GACF,MAAM,gBAAgB,MAAO,WAAmB,oBAAoB,CAAC,EAAE,UAAU;GACjF,IAAI,MAAM,QAAQ,aAAa,GAC7B;SAAK,MAAM,OAAO,eAChB,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG;KAC9B,MAAO,WAAmB,gBAAgB,IAAI,IAAI;KAClD;IACF;GACF;EAEJ,QAAQ,CAER;EAGA,MAAM,YAAY,GAAG,OAAO;EAC5B,IAAI;GACF,MAAM,WAAW,UAAU,SAAS;EACtC,QAAQ,CAER;CACF;;;;CAKA,MAAa,eACX,OACA,QACA,oBACe;EAEf,MADmB,KAAK,GAAG,WAAW,KACvB,CAAC,CAAC,YAAY,GAAG,SAAS,EAAE,GAAG,EAAE,mBAAmB,CAAC;CACtE;;;;CAKA,MAAa,aAAa,OAAe,QAA+B;EACtE,MAAM,aAAa,KAAK,GAAG,WAAW,KAAK;EAC3C,MAAM,UAAU,MAAM,WAAW,QAAQ;EAGzC,KAAK,MAAM,OAAO,SAEhB,IAAI,WADQ,IAAI,OAAO,CAAC,MACH,IAAI,uBAAuB,QAC9C;OAAI,IAAI,QAAQ,IAAI,SAAS,QAAQ;IACnC,MAAM,WAAW,UAAU,IAAI,IAAI;IACnC;GACF;;CAGN;;;;;;;CAQA,MAAa,YAAY,OAAiD;EAIxE,QAAO,MAHY,KAAK,GAAG,WAAW,KACP,CAAC,CAAC,QAAQ,EAE3B,CAAC,KAAK,SAAS;GAC3B,MAAM,IAAI,QAAQ;GAClB,SAAS,OAAO,KAAK,IAAI,OAAO,CAAC,CAAC;GAClC,MAAM;GACN,QAAQ,IAAI,UAAU;GACtB,SAAS,CAAC,CAAC,IAAI;GACf,SAAS;IAAE,QAAQ,IAAI;IAAQ,oBAAoB,IAAI;GAAmB;EAC5E,EAAE;CACJ;;;;;;;CAYA,MAAa,cAAc,QAAgB,aAAkD,CAE7F;;;;CAKA,MAAa,eAAe,QAAgB,OAA8B,CAE1E;;;;;;CAOA,MAAa,cAAc,QAAgB,UAAmC,CAE9E;;;;CAKA,MAAa,eAAe,QAA+B,CAE3D;;;;;;;CAQA,MAAa,SAAS,QAAgB,OAAe,aAAoC,CAEzF;;;;CAKA,MAAa,UAAU,QAAgB,OAA8B,CAErE;;;;;;;;;;;;;;;;;;CAuBA,MAAa,oBAAoB,OAAe,QAA+B;EAC7E,MAAM,KAAK,GAAG,QAAQ;GACpB,SAAS;GACT,WAAW,EAAE,aAAa,OAAO;GACjC,iBAAiB;GACjB,kBAAkB;EACpB,CAAC;CACH;;;;CAKA,MAAa,uBAAuB,OAA8B;EAChE,MAAM,KAAK,GAAG,QAAQ;GACpB,SAAS;GACT,WAAW,CAAC;GACZ,iBAAiB;EACnB,CAAC;CACH;;;;;;CAWA,MAAa,mBAAkC;EAC7C,MAAM,cAAc,MAAM,KAAK,OAAO,iBAAiB;EACvD,KAAK,UAAU,YAAY;CAC7B;;;;CAKA,MAAa,SAAwB;EACnC,IAAI,KAAK,SAAS;GAChB,MAAM,KAAK,QAAQ,kBAAkB;GACrC,MAAM,KAAK,QAAQ,WAAW;GAC9B,KAAK,UAAU;EACjB;CACF;;;;CAKA,MAAa,WAA0B;EACrC,IAAI,KAAK,SAAS;GAChB,MAAM,KAAK,QAAQ,iBAAiB;GACpC,MAAM,KAAK,QAAQ,WAAW;GAC9B,KAAK,UAAU;EACjB;CACF;;;;CAKA,AAAO,uBAAgC;EACrC,OAAO;CACT;;;;;;;;;;CAWA,AAAO,0BAAmC;EACxC,OAAO;CACT;;;;;;;;;;CAeA,AAAO,eAAe,oBAAmD,CAEzE;;;;;;CAWA,MAAa,qBAAqB,YAAsC;EACtE,OAAO;CACT;;;;;;CAOA,AAAO,oBAAoB,YAAwC,CAEnE;;;;;;;;;;;;;;CAmBA,MAAa,IAAO,UAA2D;EAC7E,OAAO,SAAS,KAAK,EAAE;CACzB;AACF"}
1
+ {"version":3,"file":"mongodb-migration-driver.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-migration-driver.ts"],"sourcesContent":["import type { ClientSession, CreateIndexesOptions, Db, IndexDescription } from \"mongodb\";\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\nimport type {\n ColumnDefinition,\n ForeignKeyDefinition,\n FullTextIndexOptions,\n GeoIndexOptions,\n IndexDefinition,\n MigrationDriverContract,\n TableIndexInformation,\n VectorIndexOptions,\n} from \"../../contracts/migration-driver.contract\";\nimport type { MigrationDefaults } from \"../../types\";\nimport type { MongoDbDriver } from \"./mongodb-driver\";\n\n/**\n * MongoDB-specific migration driver implementation.\n *\n * Key behaviors:\n * - Column operations are **no-ops** (MongoDB is schema-less)\n * - Index operations use native `createIndex()`\n * - Foreign keys are **no-ops** (MongoDB has no FK constraints)\n * - TTL indexes supported natively\n * - Vector indexes use Atlas Search (when available)\n * - Schema validation uses `collMod` command\n *\n * @example\n * ```typescript\n * const migrationDriver = new MongoMigrationDriver(mongoDriver);\n * await migrationDriver.createIndex(\"users\", {\n * columns: [\"email\"],\n * unique: true,\n * });\n * ```\n */\nexport class MongoMigrationDriver implements MigrationDriverContract {\n /** Active transaction session (if any) */\n private session?: ClientSession;\n\n /**\n * Create a new MongoDB migration driver.\n *\n * @param driver - The MongoDB driver instance\n */\n public constructor(public readonly driver: MongoDbDriver) {}\n\n /**\n * Get the MongoDB database instance.\n */\n private get db(): Db {\n return this.driver.getDatabase();\n }\n\n /**\n * Get session options for operations.\n */\n private get sessionOptions(): { session?: ClientSession } | undefined {\n const session = databaseTransactionContext.getSession<ClientSession>();\n return session ? { session } : undefined;\n }\n\n // ============================================================================\n // TABLE/COLLECTION OPERATIONS\n // ============================================================================\n\n /**\n * Create a new collection.\n *\n * MongoDB creates collections lazily on first insert, but this method\n * creates them explicitly for migrations that need to add indexes or\n * schema validation.\n */\n public async createTable(table: string): Promise<void> {\n try {\n await this.db.createCollection(table);\n } catch (error: any) {\n // Collection already exists - ignore\n if (error.codeName === \"NamespaceExists\") {\n return;\n }\n throw error;\n }\n }\n\n /**\n * Create table if not exists\n */\n public async createTableIfNotExists(table: string): Promise<void> {\n try {\n await this.db.createCollection(table);\n } catch (error: any) {\n // Collection already exists - ignore\n if (error.codeName === \"NamespaceExists\") {\n return;\n }\n throw error;\n }\n }\n\n /**\n * Drop an existing collection.\n *\n * @throws Error if collection doesn't exist\n */\n public async dropTable(table: string): Promise<void> {\n await this.db.dropCollection(table);\n }\n\n /**\n * Drop collection if it exists (no error if missing).\n */\n public async dropTableIfExists(table: string): Promise<void> {\n try {\n await this.db.dropCollection(table);\n } catch {\n // Collection doesn't exist - ignore\n }\n }\n\n /**\n * Rename a collection.\n */\n public async renameTable(from: string, to: string): Promise<void> {\n await this.db.renameCollection(from, to);\n }\n\n /**\n * Truncate a collection — remove all documents.\n *\n * @param table - Collection name\n */\n public async truncateTable(table: string): Promise<void> {\n await this.db.collection(table).deleteMany({});\n }\n\n /**\n * Check if a collection exists.\n */\n public async tableExists(table: string): Promise<boolean> {\n const collections = await this.db.listCollections({ name: table }).toArray();\n return collections.length > 0;\n }\n\n /**\n * List all columns in a collection.\n *\n * MongoDB is schema-less, so this returns an empty array.\n * For actual schema inspection, would need to sample documents.\n */\n public async listColumns(_table: string): Promise<ColumnDefinition[]> {\n // No-op: MongoDB is schema-less\n return [];\n }\n\n /**\n * List all collections in the current database.\n */\n public async listTables(): Promise<string[]> {\n const collections = await this.db.listCollections().toArray();\n return collections.map((col) => col.name);\n }\n\n /**\n * Ensure the migrations tracking collection exists.\n *\n * MongoDB creates collections lazily, but we can create explicitly\n * and add a unique index on the name field.\n *\n * @param tableName - Name of the migrations collection\n */\n public async ensureMigrationsTable(tableName: string): Promise<void> {\n // Create collection if not exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n await this.db.createCollection(tableName);\n }\n\n // Ensure unique index on name\n await this.db.collection(tableName).createIndex({ name: 1 }, { unique: true });\n }\n\n // ============================================================================\n // COLUMN OPERATIONS (No-ops for MongoDB)\n // ============================================================================\n\n /**\n * Add a column (no-op for MongoDB).\n *\n * MongoDB is schema-less, so columns don't need to be declared.\n */\n public async addColumn(_table: string, _column: ColumnDefinition): Promise<void> {\n // No-op: MongoDB is schema-less\n }\n\n /**\n * Drop a column by running $unset on all documents.\n *\n * This actually removes the field from all documents in the collection.\n */\n public async dropColumn(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n await collection.updateMany({}, { $unset: { [column]: \"\" } }, this.sessionOptions);\n }\n\n /**\n * Drop multiple columns by running $unset on all documents.\n */\n public async dropColumns(table: string, columns: string[]): Promise<void> {\n const collection = this.db.collection(table);\n const unsetFields: Record<string, string> = {};\n for (const column of columns) {\n unsetFields[column] = \"\";\n }\n await collection.updateMany({}, { $unset: unsetFields }, this.sessionOptions);\n }\n\n /**\n * Rename a column by running $rename on all documents.\n */\n public async renameColumn(table: string, from: string, to: string): Promise<void> {\n const collection = this.db.collection(table);\n await collection.updateMany({}, { $rename: { [from]: to } }, this.sessionOptions);\n }\n\n /**\n * Modify a column definition (no-op for MongoDB).\n *\n * MongoDB is schema-less, so column types don't need to be modified.\n */\n public async modifyColumn(_table: string, _column: ColumnDefinition): Promise<void> {\n // No-op: MongoDB is schema-less\n }\n\n /**\n * Create standard timestamp columns (created_at, updated_at).\n *\n * MongoDB implementation is a no-op since timestamps are handled\n * at the application level via Model hooks.\n *\n * @param _table - Collection name (unused)\n */\n public async createTimestampColumns(_table: string): Promise<void> {\n // No-op: MongoDB handles timestamps at application level\n }\n\n // ============================================================================\n // INDEX OPERATIONS\n // ============================================================================\n\n /**\n * Create an index on one or more columns.\n *\n * **Note**: Expression-based indexes, INCLUDE clause, and concurrent creation\n * are PostgreSQL-specific features and are silently ignored by MongoDB.\n */\n public async createIndex(table: string, index: IndexDefinition): Promise<void> {\n // Skip expression-based indexes (PostgreSQL-specific)\n if (index.expressions && index.expressions.length > 0) {\n // No-op: MongoDB doesn't support expression-based indexes\n return;\n }\n\n // Ignore include and concurrently options (PostgreSQL-specific)\n // MongoDB doesn't support covering indexes or concurrent creation\n\n const collection = this.db.collection(table);\n\n // Build index specification\n const indexSpec: IndexDescription[\"key\"] = {};\n for (let i = 0; i < index.columns.length; i++) {\n const column = index.columns[i];\n if (column === undefined) {\n continue;\n }\n const direction = index.directions?.[i] === \"desc\" ? -1 : 1;\n indexSpec[column] = direction;\n }\n\n // Build index options\n const options: CreateIndexesOptions = {};\n if (index.name) {\n options.name = index.name;\n }\n if (index.unique) {\n options.unique = true;\n }\n if (index.sparse) {\n options.sparse = true;\n }\n if (index.where) {\n options.partialFilterExpression = index.where;\n }\n\n await collection.createIndex(indexSpec, options);\n }\n\n /**\n * Drop an index by name or columns.\n *\n * A string is the literal index name and is passed through untouched; a\n * columns array resolves to the MongoDB convention name\n * (`\"column1_1_column2_1\"`) those columns auto-name to.\n *\n * @param indexNameOrColumns - Index name (string) or columns array\n */\n public async dropIndex(table: string, indexNameOrColumns: string | string[]): Promise<void> {\n const collection = this.db.collection(table);\n\n const indexName = Array.isArray(indexNameOrColumns)\n ? indexNameOrColumns.map((col) => `${col}_1`).join(\"_\")\n : indexNameOrColumns;\n\n await collection.dropIndex(indexName);\n }\n\n /**\n * Create a unique index/constraint.\n */\n public async createUniqueIndex(table: string, columns: string[], name?: string): Promise<void> {\n await this.createIndex(table, {\n columns,\n unique: true,\n name,\n });\n }\n\n /**\n * Drop a unique index by finding its name from columns.\n */\n public async dropUniqueIndex(table: string, columns: string[]): Promise<void> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n // Find the index that matches the columns\n for (const idx of indexes) {\n const indexKeys = Object.keys(idx.key || {});\n if (indexKeys.length === columns.length && indexKeys.every((key, i) => key === columns[i])) {\n if (idx.name && idx.name !== \"_id_\") {\n await collection.dropIndex(idx.name);\n return;\n }\n }\n }\n }\n\n // ============================================================================\n // SPECIALIZED INDEXES\n // ============================================================================\n\n /**\n * Create a full-text search index.\n *\n * MongoDB uses \"text\" index type for full-text search.\n */\n public async createFullTextIndex(\n table: string,\n columns: string[],\n options?: FullTextIndexOptions,\n ): Promise<void> {\n const collection = this.db.collection(table);\n\n // Build text index specification\n const indexSpec: Record<string, \"text\"> = {};\n for (const column of columns) {\n indexSpec[column] = \"text\";\n }\n\n // Build options\n const indexOptions: CreateIndexesOptions = {};\n if (options?.name) {\n indexOptions.name = options.name;\n }\n if (options?.language) {\n indexOptions.default_language = options.language;\n }\n if (options?.weights) {\n indexOptions.weights = options.weights;\n }\n\n await collection.createIndex(indexSpec, indexOptions);\n }\n\n /**\n * Drop a full-text search index.\n */\n public async dropFullTextIndex(table: string, name: string): Promise<void> {\n await this.dropIndex(table, name);\n }\n\n /**\n * Create a geo-spatial index.\n */\n public async createGeoIndex(\n table: string,\n column: string,\n options?: GeoIndexOptions,\n ): Promise<void> {\n const collection = this.db.collection(table);\n\n // Build geo index specification - MongoDB accepts string values for geo indexes\n const indexType = options?.type ?? \"2dsphere\";\n\n // Build options\n const indexOptions: CreateIndexesOptions = {};\n if (options?.name) {\n indexOptions.name = options.name;\n }\n if (options?.min !== undefined) {\n indexOptions.min = options.min;\n }\n if (options?.max !== undefined) {\n indexOptions.max = options.max;\n }\n\n await collection.createIndex({ [column]: indexType } as any, indexOptions);\n }\n\n /**\n * Drop a geo-spatial index.\n */\n public async dropGeoIndex(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n // Find the geo index for this column\n for (const idx of indexes) {\n const key = idx.key || {};\n if (column in key && (key[column] === \"2dsphere\" || key[column] === \"2d\")) {\n if (idx.name && idx.name !== \"_id_\") {\n await collection.dropIndex(idx.name);\n return;\n }\n }\n }\n }\n\n /**\n * Create a vector search index for AI embeddings.\n *\n * Note: This requires MongoDB Atlas with Vector Search enabled.\n * For self-hosted MongoDB, this will create a regular index on the field.\n */\n public async createVectorIndex(\n table: string,\n column: string,\n options: VectorIndexOptions,\n ): Promise<void> {\n const collection = this.db.collection(table);\n\n // Try to create Atlas vector search index first\n try {\n // Check if we're on Atlas by looking for vectorSearch indexes\n const searchIndexes = await (collection as any).listSearchIndexes?.()?.toArray?.();\n if (Array.isArray(searchIndexes)) {\n // We're on Atlas - create a vector search index\n await (collection as any).createSearchIndex({\n name: options.name ?? `${column}_vector_idx`,\n definition: {\n mappings: {\n dynamic: false,\n fields: {\n [column]: {\n type: \"knnVector\",\n dimensions: options.dimensions,\n similarity: options.similarity ?? \"cosine\",\n },\n },\n },\n },\n });\n return;\n }\n } catch {\n // Not on Atlas or doesn't support search indexes\n }\n\n // Fallback: Create a regular index on the vector field\n // This won't provide vector search capabilities but ensures the field is indexed\n await collection.createIndex({ [column]: 1 }, { name: options.name ?? `${column}_vector_idx` });\n }\n\n /**\n * Drop a vector search index.\n */\n public async dropVectorIndex(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n\n // Try to drop Atlas search index first\n try {\n const searchIndexes = await (collection as any).listSearchIndexes?.()?.toArray?.();\n if (Array.isArray(searchIndexes)) {\n for (const idx of searchIndexes) {\n if (idx.name?.includes(column)) {\n await (collection as any).dropSearchIndex(idx.name);\n return;\n }\n }\n }\n } catch {\n // Not on Atlas\n }\n\n // Fallback: Try to drop regular index\n const indexName = `${column}_vector_idx`;\n try {\n await collection.dropIndex(indexName);\n } catch {\n // Index doesn't exist\n }\n }\n\n /**\n * Create a TTL (time-to-live) index for automatic document expiration.\n */\n public async createTTLIndex(\n table: string,\n column: string,\n expireAfterSeconds: number,\n ): Promise<void> {\n const collection = this.db.collection(table);\n await collection.createIndex({ [column]: 1 }, { expireAfterSeconds });\n }\n\n /**\n * Drop a TTL index.\n */\n public async dropTTLIndex(table: string, column: string): Promise<void> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n // Find the TTL index for this column\n for (const idx of indexes) {\n const key = idx.key || {};\n if (column in key && idx.expireAfterSeconds !== undefined) {\n if (idx.name && idx.name !== \"_id_\") {\n await collection.dropIndex(idx.name);\n return;\n }\n }\n }\n }\n\n /**\n * List all indexes on a collection.\n *\n * @param table - Collection name\n * @returns Array of index metadata\n */\n public async listIndexes(table: string): Promise<TableIndexInformation[]> {\n const collection = this.db.collection(table);\n const indexes = await collection.indexes();\n\n return indexes.map((idx) => ({\n name: idx.name ?? \"\",\n columns: Object.keys(idx.key ?? {}),\n type: \"btree\",\n unique: idx.unique ?? false,\n partial: !!idx.partialFilterExpression,\n options: { sparse: idx.sparse, expireAfterSeconds: idx.expireAfterSeconds },\n }));\n }\n\n // ============================================================================\n // CONSTRAINTS (No-ops for MongoDB)\n // ============================================================================\n\n /**\n * Add a foreign key constraint (no-op for MongoDB).\n *\n * MongoDB doesn't support foreign key constraints.\n * Use application-level validation or DBRefs instead.\n */\n public async addForeignKey(_table: string, _foreignKey: ForeignKeyDefinition): Promise<void> {\n // No-op: MongoDB doesn't support foreign keys\n }\n\n /**\n * Drop a foreign key constraint (no-op for MongoDB).\n */\n public async dropForeignKey(_table: string, _name: string): Promise<void> {\n // No-op: MongoDB doesn't support foreign keys\n }\n\n /**\n * Add a primary key constraint (no-op for MongoDB).\n *\n * MongoDB always has _id as the primary key.\n */\n public async addPrimaryKey(_table: string, _columns: string[]): Promise<void> {\n // No-op: MongoDB always has _id as primary key\n }\n\n /**\n * Drop the primary key constraint (no-op for MongoDB).\n */\n public async dropPrimaryKey(_table: string): Promise<void> {\n // No-op: Cannot drop _id index in MongoDB\n }\n\n /**\n * Add a CHECK constraint (no-op for MongoDB).\n *\n * MongoDB doesn't support CHECK constraints.\n * Use schema validation instead.\n */\n public async addCheck(_table: string, _name: string, _expression: string): Promise<void> {\n // No-op: MongoDB doesn't support CHECK constraints\n }\n\n /**\n * Drop a CHECK constraint (no-op for MongoDB).\n */\n public async dropCheck(_table: string, _name: string): Promise<void> {\n // No-op: MongoDB doesn't support CHECK constraints\n }\n\n // ============================================================================\n // SCHEMA VALIDATION (NoSQL)\n // ============================================================================\n\n /**\n * Set JSON schema validation rules on a collection.\n *\n * Uses MongoDB's validator feature to enforce document structure.\n *\n * @example\n * ```typescript\n * await driver.setSchemaValidation(\"users\", {\n * bsonType: \"object\",\n * required: [\"name\", \"email\"],\n * properties: {\n * name: { bsonType: \"string\" },\n * email: { bsonType: \"string\" },\n * },\n * });\n * ```\n */\n public async setSchemaValidation(table: string, schema: object): Promise<void> {\n await this.db.command({\n collMod: table,\n validator: { $jsonSchema: schema },\n validationLevel: \"strict\",\n validationAction: \"error\",\n });\n }\n\n /**\n * Remove schema validation rules from a collection.\n */\n public async removeSchemaValidation(table: string): Promise<void> {\n await this.db.command({\n collMod: table,\n validator: {},\n validationLevel: \"off\",\n });\n }\n\n // ============================================================================\n // TRANSACTIONS\n // ============================================================================\n\n /**\n * Begin a database transaction.\n *\n * Uses the driver's transaction mechanism.\n */\n public async beginTransaction(): Promise<void> {\n const transaction = await this.driver.beginTransaction();\n this.session = transaction.context;\n }\n\n /**\n * Commit the current transaction.\n */\n public async commit(): Promise<void> {\n if (this.session) {\n await this.session.commitTransaction();\n await this.session.endSession();\n this.session = undefined;\n }\n }\n\n /**\n * Rollback the current transaction.\n */\n public async rollback(): Promise<void> {\n if (this.session) {\n await this.session.abortTransaction();\n await this.session.endSession();\n this.session = undefined;\n }\n }\n\n /**\n * MongoDB supports transactions (requires replica set).\n */\n public supportsTransactions(): boolean {\n return true;\n }\n\n /**\n * Get the default transactional behavior for MongoDB.\n *\n * MongoDB DDL operations (createCollection, createIndex, etc.) cannot\n * be wrapped in transactions, even with replica sets. Transactions only\n * work for document CRUD operations.\n *\n * @returns false (MongoDB DDL is not transactional)\n */\n public getDefaultTransactional(): boolean {\n return false;\n }\n\n // ============================================================================\n // DEFAULTS\n // ============================================================================\n\n /**\n * Get the default UUID generation expression for MongoDB.\n *\n * MongoDB does not use SQL-level UUID defaults — UUID generation\n * is handled at the application level. Always returns `undefined`.\n *\n * @param _migrationDefaults - Ignored (MongoDB handles UUIDs at app level)\n * @returns undefined\n */\n public getUuidDefault(_migrationDefaults?: MigrationDefaults): undefined {\n return undefined;\n }\n\n // ============================================================================\n // EXTENSIONS\n // ============================================================================\n\n /**\n * Check if a database extension is available (no-op for MongoDB).\n *\n * @param _extension - Extension name\n */\n public async isExtensionAvailable(_extension: string): Promise<boolean> {\n return true; // MongoDB doesn't use SQL extensions\n }\n\n /**\n * Get the official documentation or installation URL for a database extension.\n *\n * @param _extension - Extension name\n */\n public getExtensionDocsUrl(_extension: string): string | undefined {\n return undefined; // MongoDB doesn't use SQL extensions\n }\n\n // ============================================================================\n // RAW ACCESS\n // ============================================================================\n\n /**\n * Execute raw operations with direct database access.\n *\n * @param callback - Callback receiving the MongoDB Db instance\n * @returns Result from callback\n *\n * @example\n * ```typescript\n * await driver.raw(async (db) => {\n * await db.collection(\"users\").updateMany({}, { $set: { active: true } });\n * });\n * ```\n */\n public async raw<T>(callback: (connection: unknown) => Promise<T>): Promise<T> {\n return callback(this.db);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-query-builder.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-query-builder.ts"],"mappings":"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"}
1
+ {"version":3,"file":"mongodb-query-builder.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-query-builder.ts"],"mappings":"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"}
@@ -1378,8 +1378,7 @@ var MongoQueryBuilder = class MongoQueryBuilder extends QueryBuilder {
1378
1378
  * @returns the first document or null
1379
1379
  */
1380
1380
  async first() {
1381
- const results = await this.limit(1).get();
1382
- return results.length > 0 ? results[0] : null;
1381
+ return (await this.limit(1).get())[0] ?? null;
1383
1382
  }
1384
1383
  /**
1385
1384
  * Executes the query and returns the first matching document, throwing if none found.
@@ -1410,8 +1409,7 @@ var MongoQueryBuilder = class MongoQueryBuilder extends QueryBuilder {
1410
1409
  async count() {
1411
1410
  const pipeline = this.buildPipeline();
1412
1411
  pipeline.push({ $count: "total" });
1413
- const results = await this.execute(pipeline);
1414
- return results.length > 0 ? results[0].total : 0;
1412
+ return (await this.execute(pipeline))[0]?.total ?? 0;
1415
1413
  }
1416
1414
  /**
1417
1415
  * Calculates the sum of a numeric field across matching documents.