@warlock.js/cascade 5.2.3 → 5.2.4

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 (88) hide show
  1. package/cjs/index.cjs.map +1 -1
  2. package/esm/context/database-data-source-context.d.mts.map +1 -1
  3. package/esm/context/database-transaction-context.d.mts.map +1 -1
  4. package/esm/data-source/data-source-registry.d.mts.map +1 -1
  5. package/esm/data-source/data-source.d.mts.map +1 -1
  6. package/esm/database-dirty-tracker.d.mts.map +1 -1
  7. package/esm/drivers/mongodb/mongodb-blueprint.mjs.map +1 -1
  8. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
  9. package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -1
  10. package/esm/drivers/mongodb/mongodb-id-generator.mjs.map +1 -1
  11. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
  12. package/esm/drivers/mongodb/mongodb-migration-driver.mjs.map +1 -1
  13. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  14. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  15. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
  16. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
  17. package/esm/drivers/mongodb/mongodb-sync-adapter.mjs.map +1 -1
  18. package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -1
  19. package/esm/drivers/postgres/postgres-blueprint.mjs.map +1 -1
  20. package/esm/drivers/postgres/postgres-dialect.mjs.map +1 -1
  21. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  22. package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
  23. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
  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.map +1 -1
  27. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  28. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  29. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
  30. package/esm/drivers/postgres/postgres-sync-adapter.mjs.map +1 -1
  31. package/esm/events/model-events.d.mts.map +1 -1
  32. package/esm/events/model-events.mjs.map +1 -1
  33. package/esm/expressions/column-expressions.d.mts.map +1 -1
  34. package/esm/migration/column-builder.d.mts.map +1 -1
  35. package/esm/migration/column-helpers.d.mts.map +1 -1
  36. package/esm/migration/foreign-key-builder.d.mts.map +1 -1
  37. package/esm/migration/migration-runner.d.mts.map +1 -1
  38. package/esm/migration/migration-runner.mjs.map +1 -1
  39. package/esm/migration/migration.d.mts.map +1 -1
  40. package/esm/migration/migration.mjs.map +1 -1
  41. package/esm/migration/sql-grammar.mjs.map +1 -1
  42. package/esm/model/methods/accessor-methods.mjs.map +1 -1
  43. package/esm/model/methods/delete-methods.mjs.map +1 -1
  44. package/esm/model/methods/hydration-methods.mjs.map +1 -1
  45. package/esm/model/methods/instance-event-methods.mjs.map +1 -1
  46. package/esm/model/methods/meta-methods.mjs.map +1 -1
  47. package/esm/model/methods/pivot-methods.mjs.map +1 -1
  48. package/esm/model/methods/query-methods.mjs.map +1 -1
  49. package/esm/model/methods/restore-methods.mjs.map +1 -1
  50. package/esm/model/methods/scope-methods.mjs.map +1 -1
  51. package/esm/model/methods/serialization-methods.mjs.map +1 -1
  52. package/esm/model/methods/static-event-methods.mjs.map +1 -1
  53. package/esm/model/methods/write-methods.mjs.map +1 -1
  54. package/esm/model/model.d.mts.map +1 -1
  55. package/esm/model/model.mjs.map +1 -1
  56. package/esm/model/register-model.d.mts.map +1 -1
  57. package/esm/model/register-model.mjs.map +1 -1
  58. package/esm/operations/database.mjs.map +1 -1
  59. package/esm/operations/migrations.d.mts.map +1 -1
  60. package/esm/operations/migrations.mjs.map +1 -1
  61. package/esm/query-builder/query-builder.d.mts.map +1 -1
  62. package/esm/query-builder/query-builder.mjs.map +1 -1
  63. package/esm/relations/key-conventions.mjs.map +1 -1
  64. package/esm/relations/pivot-operations.d.mts.map +1 -1
  65. package/esm/relations/pivot-operations.mjs.map +1 -1
  66. package/esm/relations/relation-loader.d.mts.map +1 -1
  67. package/esm/relations/relation-loader.mjs.map +1 -1
  68. package/esm/remover/database-remover.mjs.map +1 -1
  69. package/esm/restorer/database-restorer.mjs.map +1 -1
  70. package/esm/sync/model-sync-operation.d.mts.map +1 -1
  71. package/esm/sync/model-sync-operation.mjs.map +1 -1
  72. package/esm/sync/model-sync.d.mts.map +1 -1
  73. package/esm/sync/sync-manager.mjs.map +1 -1
  74. package/esm/utils/connect-to-database.d.mts.map +1 -1
  75. package/esm/utils/connect-to-database.mjs.map +1 -1
  76. package/esm/utils/define-model.d.mts.map +1 -1
  77. package/esm/utils/escape-regex.mjs.map +1 -1
  78. package/esm/utils/is-valid-date-value.mjs.map +1 -1
  79. package/esm/utils/sanitize-filter.d.mts.map +1 -1
  80. package/esm/validation/database-writer-validation-error.d.mts.map +1 -1
  81. package/esm/validation/database-writer-validation-error.mjs.map +1 -1
  82. package/esm/validation/mutators/embed-mutator.mjs.map +1 -1
  83. package/esm/validation/plugins/embed-validator-plugin.mjs.map +1 -1
  84. package/esm/validation/rules/exists-rule.mjs.map +1 -1
  85. package/esm/validation/rules/unique-rule.mjs.map +1 -1
  86. package/esm/writer/database-writer.d.mts.map +1 -1
  87. package/esm/writer/database-writer.mjs.map +1 -1
  88. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"database-data-source-context.d.mts","names":[],"sources":["../../../../../../../cascade/src/context/database-data-source-context.ts"],"mappings":";;;;KAGK,sBAAA,YAAkC,UAAU;AAAA,KAE5C,sBAAA;EACH,UAAA,GAAa,sBAAsB;AAAA;;;AAHY;AAAA;;;cAY3C,yBAAA,SAAkC,OAAA,CAAQ,sBAAA;EATX;AAAA;;EAa5B,aAAA,CAAA,GAAiB,sBAAA;EAJsB;;;EAWvC,aAAA,CAAc,UAAA,EAAY,sBAAA;EAXK;;;EAkB/B,UAAA,CAAA,GAAc,sBAAA;AAAA;AAAA,cAKV,yBAAA,EAAyB,yBAAkC"}
1
+ {"version":3,"file":"database-data-source-context.d.mts","names":[],"sources":["../../../../../../../cascade/src/context/database-data-source-context.ts"],"mappings":";;;;KAGK,sBAAA,YAAkC,UAAU;AAAA,KAE5C,sBAAA;EACH,UAAA,GAAa,sBAAsB;AAAA;;;AAHY;AAAA;;;cAY3C,yBAAA,SAAkC,OAAA,CAAQ,sBAAA;EATX;AAAA;;EAa5B,aAAA,IAAiB,sBAAA;EAJsB;;;EAWvC,aAAA,CAAc,UAAA,EAAY,sBAAA;EAXK;;;EAkB/B,UAAA,IAAc,sBAAA;AAAA;AAAA,cAKV,yBAAA,EAAyB,yBAAkC"}
@@ -1 +1 @@
1
- {"version":3,"file":"database-transaction-context.d.mts","names":[],"sources":["../../../../../../../cascade/src/context/database-transaction-context.ts"],"mappings":";;;UAEU,uBAAA;EACR,OAAO;AAAA;;;;AAAA;AAAA;;cASH,0BAAA,SAAmC,OAAA,CAAQ,uBAAA;EAAA;;;EAIxC,UAAA,oBAAA,CAAA,GAAkC,QAAA;EAJK;;;EAWvC,oBAAA,CAAA;EAPA;;;EAcA,UAAA,CAAW,OAAA;EAAX;;;EAOA,IAAA,CAAA;EAOc;;AAAuB;EAArC,UAAA,CAAA,GAAc,uBAAA;AAAA;AAAA,cAKV,0BAAA,EAA0B,0BAAmC"}
1
+ {"version":3,"file":"database-transaction-context.d.mts","names":[],"sources":["../../../../../../../cascade/src/context/database-transaction-context.ts"],"mappings":";;;UAEU,uBAAA;EACR,OAAO;AAAA;;;;AAAA;AAAA;;cASH,0BAAA,SAAmC,OAAA,CAAQ,uBAAA;EAAA;;;EAIxC,UAAA,wBAAkC,QAAA;EAJK;;;EAWvC,oBAAA;EAPA;;;EAcA,UAAA,CAAW,OAAA;EAAX;;;EAOA,IAAA;EAOc;;AAAuB;EAArC,UAAA,IAAc,uBAAA;AAAA;AAAA,cAKV,0BAAA,EAA0B,0BAAmC"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-source-registry.d.mts","names":[],"sources":["../../../../../../../cascade/src/data-source/data-source-registry.ts"],"mappings":";;;;;AAaA;;;;AAAmC;AASnC;KATY,uBAAA;;;AASoD;KAApD,0BAAA,IAA8B,UAAsB,EAAV,UAAU;;cAG1D,kBAAA;EAAA,iBACa,OAAA;EAAA,QACT,aAAA;EAAA,iBACS,MAAA;EAkFmC;;;;;;;;;;;;;;;EAjE7C,QAAA,CAAS,OAAA,EAAS,iBAAA,GAAoB,UAAA;EA+BtC;;;EAAA,KAAA,CAAA;EAkC6C;;;;;;;;;;;;;;;;;;AA8Ed;AAKxC;;;;AAA0D;;;;;;EAnFjD,EAAA,CAAG,KAAA,EAAO,uBAAA,EAAyB,QAAA,EAAU,0BAAA;;;;;;;;;EAY7C,IAAA,CAAK,KAAA,EAAO,uBAAA,EAAyB,QAAA,EAAU,0BAAA;;;;;;;EAU/C,GAAA,CAAI,KAAA,EAAO,uBAAA,EAAyB,QAAA,EAAU,0BAAA;;EAK9C,GAAA,CAAI,IAAA,YAAgB,UAAA;;;;;;;;;;;;;;;;;EAmDpB,iBAAA,CAAA,GAAqB,UAAA;AAAA;AAAA,cAKjB,kBAAA,EAAkB,kBAA2B"}
1
+ {"version":3,"file":"data-source-registry.d.mts","names":[],"sources":["../../../../../../../cascade/src/data-source/data-source-registry.ts"],"mappings":";;;;;AAaA;;;;AAAmC;AASnC;KATY,uBAAA;;;AASoD;KAApD,0BAAA,IAA8B,UAAsB,EAAV,UAAU;;cAG1D,kBAAA;EAAA,iBACa,OAAA;EAAA,QACT,aAAA;EAAA,iBACS,MAAA;EAkFmC;;;;;;;;;;;;;;;EAjE7C,QAAA,CAAS,OAAA,EAAS,iBAAA,GAAoB,UAAA;EA+BtC;;;EAAA,KAAA;EAkC6C;;;;;;;;;;;;;;;;;;AA8Ed;AAKxC;;;;AAA0D;;;;;;EAnFjD,EAAA,CAAG,KAAA,EAAO,uBAAA,EAAyB,QAAA,EAAU,0BAAA;;;;;;;;;EAY7C,IAAA,CAAK,KAAA,EAAO,uBAAA,EAAyB,QAAA,EAAU,0BAAA;;;;;;;EAU/C,GAAA,CAAI,KAAA,EAAO,uBAAA,EAAyB,QAAA,EAAU,0BAAA;;EAK9C,GAAA,CAAI,IAAA,YAAgB,UAAA;;;;;;;;;;;;;;;;;EAmDpB,iBAAA,IAAqB,UAAA;AAAA;AAAA,cAKjB,kBAAA,EAAkB,kBAA2B"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.d.mts","names":[],"sources":["../../../../../../../cascade/src/data-source/data-source.ts"],"mappings":";;;;;;;KAMY,iBAAA;EAAA,+CAEV,IAAA;EAEA,MAAA,EAAQ,cAAA,EAagB;EAXxB,SAAA;EAiCgB;;;;;;;;;;EAtBhB,qBAAA,GAAwB,cAAA;EAYxB;;;;;;;;;;EAAA,iBAAA;EAuDO;AAAA;AA8BT;;;;;;EA3EE,aAAA,GAAgB,OAAA,CAAQ,aAAA;EA+FY;;;;;;;;EArFpC,iBAAA,GAAoB,iBAAA;EAgKV;;;;;;;;;EArJV,gBAAA,GAAmB,gBAAA;EAuEqB;;;EAlExC,UAAA;IAwEmC;;;;;;;;;;;IA5DjC,aAAA;IAkIA;;;;;IA3HA,KAAA;EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8BS,UAAA;;WAEK,IAAA;;WAGA,MAAA,EAAQ,cAAA;;WAGR,SAAA;;WAGA,qBAAA,GAAwB,cAAA;;WAGxB,iBAAA;;WAGA,aAAA,GAAgB,OAAA,CAAQ,aAAA;;WAGxB,iBAAA,GAAoB,iBAAA;;WAGpB,gBAAA,GAAmB,gBAAA;;WAGnB,UAAA;IACd,aAAA;IACA,KAAA;EAAA;;;;;;cAQiB,OAAA,EAAS,iBAAA;;;;;;;;;;;;;;;;;MA4BjB,WAAA,CAAA,GAAe,mBAAA;;;;;;;;;;;;;;;;;;;;EA4BnB,GAAA,KAAQ,MAAA,kBAAA,CACb,GAAA,UACA,MAAA,eACC,OAAA,CAAQ,cAAA,CAAe,CAAA;AAAA"}
1
+ {"version":3,"file":"data-source.d.mts","names":[],"sources":["../../../../../../../cascade/src/data-source/data-source.ts"],"mappings":";;;;;;;KAMY,iBAAA;EAAA,+CAEV,IAAA;EAEA,MAAA,EAAQ,cAAA,EAagB;EAXxB,SAAA;EAiCgB;;;;;;;;;;EAtBhB,qBAAA,GAAwB,cAAA;EAYxB;;;;;;;;;;EAAA,iBAAA;EAuDO;AAAA;AA8BT;;;;;;EA3EE,aAAA,GAAgB,OAAA,CAAQ,aAAA;EA+FY;;;;;;;;EArFpC,iBAAA,GAAoB,iBAAA;EAgKV;;;;;;;;;EArJV,gBAAA,GAAmB,gBAAA;EAuEqB;;;EAlExC,UAAA;IAwEmC;;;;;;;;;;;IA5DjC,aAAA;IAkIA;;;;;IA3HA,KAAA;EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8BS,UAAA;;WAEK,IAAA;;WAGA,MAAA,EAAQ,cAAA;;WAGR,SAAA;;WAGA,qBAAA,GAAwB,cAAA;;WAGxB,iBAAA;;WAGA,aAAA,GAAgB,OAAA,CAAQ,aAAA;;WAGxB,iBAAA,GAAoB,iBAAA;;WAGpB,gBAAA,GAAmB,gBAAA;;WAGnB,UAAA;IACd,aAAA;IACA,KAAA;EAAA;;;;;;cAQiB,OAAA,EAAS,iBAAA;;;;;;;;;;;;;;;;;MA4BjB,WAAA,IAAe,mBAAA;;;;;;;;;;;;;;;;;;;;EA4BnB,GAAA,KAAQ,MAAA,mBACb,GAAA,UACA,MAAA,eACC,OAAA,CAAQ,cAAA,CAAe,CAAA;AAAA"}
@@ -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,CAAA;EA4LqB;;;;;;;;;;;;;;;;;EAvKrB,UAAA,CAAA;EAqT0B;;AAAC;EA9S3B,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;EAmBR,iBAAA,CAAA;;;;;;;;;;;;;;;;;EAoBA,yBAAA,CAAA,GAA6B,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,CAAA;;;;;;;;;;;;;;;;;;;;YA6CA,YAAA,CAAa,MAAA,EAAQ,MAAA,mBAAyB,MAAA,EAAQ,MAAA;;;;;;;;;;YAoBtD,aAAA,CAAc,IAAA;;;;;;;;;;;YAwCd,cAAA,CAAe,SAAA,WAAoB,OAAA;;;;;;;;YAwBnC,SAAA,GAAA,CAAa,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;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 +1 @@
1
- {"version":3,"file":"mongodb-blueprint.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-blueprint.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport type { Db, IndexDescriptionInfo } from \"mongodb\";\nimport {\n type DriverBlueprintContract,\n type TableIndexInformation,\n} from \"../../contracts/driver-blueprint.contract\";\n\nexport class MongoDBBlueprint implements DriverBlueprintContract {\n /**\n * Constructor\n */\n public constructor(protected database: Db) {}\n\n /**\n * List all tables in the database\n */\n public async listTables(): Promise<string[]> {\n const collections = await this.database.listCollections().toArray();\n return collections.map((collection) => collection.name);\n }\n\n /**\n * List all indexes for a specific table\n */\n public async listIndexes(table: string): Promise<TableIndexInformation[]> {\n const collection = this.database.collection(table);\n const indexes = await collection.indexes();\n return indexes.map(this.buildIndexInformation);\n }\n\n /**\n * Build index information\n */\n protected buildIndexInformation(index: IndexDescriptionInfo): TableIndexInformation {\n return {\n name: index.name!,\n type: index.type,\n columns: Object.keys(index.key),\n unique: !!index.unique,\n partial: !!index.partialFilterExpression,\n options: index,\n };\n }\n\n /**\n * List all columns for a specific table\n */\n public async listColumns(table: string): Promise<string[]> {\n console.log(\n colors.yellowBright(\n `MongoDBBlueprint: listColumns(${table}) MongoDB does not have static columns`,\n ),\n );\n\n return [];\n }\n\n /**\n * Check if the given table exists\n */\n public async tableExists(table: string): Promise<boolean> {\n const collections = await this.database.listCollections().toArray();\n return collections.some((collection) => collection.name === table);\n }\n}\n"],"mappings":";;;AAOA,IAAa,mBAAb,MAAiE;CAIlC;;;;CAA7B,AAAO,YAAY,AAAU,UAAc;EAAd;CAAe;;;;CAK5C,MAAa,aAAgC;EAE3C,QAAO,MADmB,KAAK,SAAS,gBAAgB,EAAE,QAAQ,GAC/C,KAAK,eAAe,WAAW,IAAI;CACxD;;;;CAKA,MAAa,YAAY,OAAiD;EAGxE,QAAO,MAFY,KAAK,SAAS,WAAW,KACb,EAAE,QAAQ,GAC1B,IAAI,KAAK,qBAAqB;CAC/C;;;;CAKA,AAAU,sBAAsB,OAAoD;EAClF,OAAO;GACL,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,SAAS,OAAO,KAAK,MAAM,GAAG;GAC9B,QAAQ,CAAC,CAAC,MAAM;GAChB,SAAS,CAAC,CAAC,MAAM;GACjB,SAAS;EACX;CACF;;;;CAKA,MAAa,YAAY,OAAkC;EACzD,QAAQ,IACN,OAAO,aACL,iCAAiC,MAAM,uCACzC,CACF;EAEA,OAAO,CAAC;CACV;;;;CAKA,MAAa,YAAY,OAAiC;EAExD,QAAO,MADmB,KAAK,SAAS,gBAAgB,EAAE,QAAQ,GAC/C,MAAM,eAAe,WAAW,SAAS,KAAK;CACnE;AACF"}
1
+ {"version":3,"file":"mongodb-blueprint.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-blueprint.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport type { Db, IndexDescriptionInfo } from \"mongodb\";\nimport {\n type DriverBlueprintContract,\n type TableIndexInformation,\n} from \"../../contracts/driver-blueprint.contract\";\n\nexport class MongoDBBlueprint implements DriverBlueprintContract {\n /**\n * Constructor\n */\n public constructor(protected database: Db) {}\n\n /**\n * List all tables in the database\n */\n public async listTables(): Promise<string[]> {\n const collections = await this.database.listCollections().toArray();\n return collections.map((collection) => collection.name);\n }\n\n /**\n * List all indexes for a specific table\n */\n public async listIndexes(table: string): Promise<TableIndexInformation[]> {\n const collection = this.database.collection(table);\n const indexes = await collection.indexes();\n return indexes.map(this.buildIndexInformation);\n }\n\n /**\n * Build index information\n */\n protected buildIndexInformation(index: IndexDescriptionInfo): TableIndexInformation {\n return {\n name: index.name!,\n type: index.type,\n columns: Object.keys(index.key),\n unique: !!index.unique,\n partial: !!index.partialFilterExpression,\n options: index,\n };\n }\n\n /**\n * List all columns for a specific table\n */\n public async listColumns(table: string): Promise<string[]> {\n console.log(\n colors.yellowBright(\n `MongoDBBlueprint: listColumns(${table}) MongoDB does not have static columns`,\n ),\n );\n\n return [];\n }\n\n /**\n * Check if the given table exists\n */\n public async tableExists(table: string): Promise<boolean> {\n const collections = await this.database.listCollections().toArray();\n return collections.some((collection) => collection.name === table);\n }\n}\n"],"mappings":";;;AAOA,IAAa,mBAAb,MAAiE;CAIlC;;;;CAA7B,AAAO,YAAY,AAAU,UAAc;EAAd;CAAe;;;;CAK5C,MAAa,aAAgC;EAE3C,QAAO,MADmB,KAAK,SAAS,gBAAgB,CAAC,CAAC,QAAQ,EAChD,CAAC,KAAK,eAAe,WAAW,IAAI;CACxD;;;;CAKA,MAAa,YAAY,OAAiD;EAGxE,QAAO,MAFY,KAAK,SAAS,WAAW,KACb,CAAC,CAAC,QAAQ,EAC3B,CAAC,IAAI,KAAK,qBAAqB;CAC/C;;;;CAKA,AAAU,sBAAsB,OAAoD;EAClF,OAAO;GACL,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,SAAS,OAAO,KAAK,MAAM,GAAG;GAC9B,QAAQ,CAAC,CAAC,MAAM;GAChB,SAAS,CAAC,CAAC,MAAM;GACjB,SAAS;EACX;CACF;;;;CAKA,MAAa,YAAY,OAAkC;EACzD,QAAQ,IACN,OAAO,aACL,iCAAiC,MAAM,uCACzC,CACF;EAEA,OAAO,CAAC;CACV;;;;CAKA,MAAa,YAAY,OAAiC;EAExD,QAAO,MADmB,KAAK,SAAS,gBAAgB,CAAC,CAAC,QAAQ,EAChD,CAAC,MAAM,eAAe,WAAW,SAAS,KAAK;CACnE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-driver.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-driver.ts"],"mappings":"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"}
1
+ {"version":3,"file":"mongodb-driver.d.mts","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-driver.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-driver.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-driver.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { log } from \"@warlock.js/logger\";\nimport type {\n BulkWriteOptions,\n ClientSession,\n Db,\n DeleteOptions,\n FindOneAndDeleteOptions,\n FindOneAndUpdateOptions,\n InsertManyResult,\n InsertOneOptions,\n MongoClient,\n MongoClientOptions,\n TransactionOptions,\n UpdateFilter,\n UpdateOptions,\n} from \"mongodb\";\nimport { EventEmitter } from \"node:events\";\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\nimport type {\n DriverBlueprintContract,\n DriverContract,\n DriverEvent,\n DriverEventListener,\n DriverTransactionContract,\n IdGeneratorContract,\n InsertResult,\n MigrationDriverContract,\n QueryBuilderContract,\n RawQueryResult,\n SyncAdapterContract,\n TransactionContext,\n UpdateOperations,\n UpdateResult,\n} from \"../../contracts\";\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\nimport { DatabaseDirtyTracker } from \"../../database-dirty-tracker\";\nimport { TransactionRollbackError } from \"../../errors/transaction-rollback.error\";\nimport { type SQLSerializer } from \"../../migration/sql-serializer\";\nimport type { ModelDefaults } from \"../../types\";\nimport { isValidDateValue } from \"../../utils/is-valid-date-value\";\nimport { MongoDBBlueprint } from \"./mongodb-blueprint\";\nimport { MongoIdGenerator } from \"./mongodb-id-generator\";\nimport { MongoMigrationDriver } from \"./mongodb-migration-driver\";\nimport { MongoQueryBuilder } from \"./mongodb-query-builder\";\nimport { MongoSyncAdapter } from \"./mongodb-sync-adapter\";\nimport type { MongoDriverOptions } from \"./types\";\n\nconst DEFAULT_TRANSACTION_OPTIONS: TransactionOptions = {\n readPreference: \"primary\",\n readConcern: { level: \"local\" },\n writeConcern: { w: \"majority\" },\n};\n\n// ============================================================\n// Lazy-loaded MongoDB SDK Types\n// ============================================================\n\n/**\n * Cached MongoDB module (loaded once, reused)\n */\nlet MongoDBClient: typeof import(\"mongodb\");\n\nlet ObjectId: typeof import(\"mongodb\").ObjectId;\n\nlet isModuleExists: boolean | null = null;\n\nlet loadingPromise: Promise<any>;\n\n/**\n * Installation instructions for MongoDB package\n */\nconst MONGODB_INSTALL_INSTRUCTIONS = `\nMongoDB driver requires the mongodb package.\nInstall it with:\n\n npm install mongodb\n\nOr with your preferred package manager:\n\n pnpm add mongodb\n yarn add mongodb\n`.trim();\n\n/**\n * Load MongoDB module\n */\nasync function loadMongoDB() {\n try {\n loadingPromise = import(\"mongodb\");\n MongoDBClient = await loadingPromise;\n ObjectId = MongoDBClient.ObjectId;\n isModuleExists = true;\n } catch {\n isModuleExists = false;\n }\n}\n\nloadMongoDB();\n\nexport function isMongoDBDriverLoaded() {\n return isModuleExists;\n}\n\nasync function assertModuleIsLoaded() {\n if (isModuleExists === false) {\n throw new Error(MONGODB_INSTALL_INSTRUCTIONS);\n }\n\n if (isModuleExists === null) {\n await loadingPromise;\n\n return await assertModuleIsLoaded();\n }\n}\n\n/**\n * MongoDB driver implementation that fulfils the Cascade driver contract.\n *\n * It encapsulates the native Mongo client, exposes lifecycle events, and\n * provides helpers for CRUD, transactions, atomic updates, and sync adapters.\n */\nexport class MongoDbDriver implements DriverContract {\n private readonly events = new EventEmitter();\n public client?: MongoClient;\n public database?: Db;\n private connected = false;\n private syncAdapterInstance?: MongoSyncAdapter;\n private migrationDriverInstance?: MigrationDriverContract;\n private readonly transactionOptions: TransactionOptions;\n private idGeneratorInstance?: IdGeneratorContract;\n private _blueprint?: DriverBlueprintContract;\n\n public get blueprint(): DriverBlueprintContract {\n if (!this._blueprint) {\n this._blueprint = new MongoDBBlueprint(this.database!);\n }\n\n return this._blueprint!;\n }\n\n /**\n * The name of this driver.\n */\n public readonly name = \"mongodb\";\n\n /**\n * Current database name\n */\n protected _databaseName?: string;\n\n /**\n * MongoDB driver model defaults.\n *\n * MongoDB follows NoSQL conventions:\n * - camelCase naming for fields (createdAt, updatedAt, deletedAt)\n * - Manual ID generation (auto-increment id field separate from _id)\n * - Timestamps enabled by default\n * - Trash delete strategy with per-collection trash tables\n */\n public readonly modelDefaults: Partial<ModelDefaults> = {\n namingConvention: \"camelCase\",\n createdAtColumn: \"createdAt\",\n updatedAtColumn: \"updatedAt\",\n deletedAtColumn: \"deletedAt\",\n timestamps: true,\n autoGenerateId: true, // MongoDB needs manual ID generation\n strictMode: \"strip\",\n deleteStrategy: \"trash\",\n trashTable: (table) => `${table}Trash`, // Per-collection trash (usersTrash, productsTrash)\n };\n\n /**\n * Create a new MongoDB driver using the supplied connection options.\n *\n * @param config - Connection configuration\n * @param driverOptions - Driver-specific options\n */\n public constructor(\n private readonly config: {\n database: string;\n uri?: string;\n host?: string;\n port?: number;\n username?: string;\n password?: string;\n authSource?: string;\n logging?: boolean;\n clientOptions?: MongoClientOptions;\n },\n private readonly driverOptions?: MongoDriverOptions,\n ) {\n this.transactionOptions = {\n ...DEFAULT_TRANSACTION_OPTIONS,\n ...driverOptions?.transactionOptions,\n };\n }\n\n /**\n * Get data base name\n */\n public get databaseName(): string | undefined {\n if (!this._databaseName) {\n this.resolveDatabaseName();\n }\n\n return this._databaseName;\n }\n\n /**\n * Resolve database name either from config or uri\n */\n private resolveDatabaseName() {\n if (this.config.database) {\n this._databaseName = this.config.database;\n } else if (this.config.uri) {\n this._databaseName = this.config.uri.split(\"/\").pop()?.split(\"?\")?.[0];\n }\n }\n\n /**\n * Indicates whether the driver currently maintains an active connection.\n */\n public get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the MongoDB database instance.\n *\n * @returns The MongoDB Db instance\n * @throws {Error} If not connected\n *\n * @example\n * ```typescript\n * const db = driver.getDatabase();\n * const collection = db.collection(\"users\");\n * ```\n */\n public getDatabase(): Db {\n if (!this.database) {\n throw new Error(\n \"Database not available. Ensure the driver is connected before accessing the database.\",\n );\n }\n return this.database;\n }\n\n /**\n * Get the ID generator instance for this driver.\n *\n * Creates a MongoIdGenerator on first access if autoGenerateId is enabled.\n *\n * @returns The ID generator instance, or undefined if disabled\n *\n * @example\n * ```typescript\n * const idGenerator = driver.getIdGenerator();\n * if (idGenerator) {\n * const id = await idGenerator.generateNextId({ table: \"users\" });\n * }\n * ```\n */\n public getIdGenerator(): IdGeneratorContract | undefined {\n // Return undefined if ID generation is disabled\n if (this.driverOptions?.autoGenerateId === false) {\n return undefined;\n }\n\n // Create ID generator lazily on first access\n if (!this.idGeneratorInstance) {\n this.idGeneratorInstance = new MongoIdGenerator(this, this.driverOptions?.counterCollection);\n }\n\n return this.idGeneratorInstance;\n }\n\n /**\n * Establish a MongoDB connection using the configured options.\n * Throws if the connection attempt fails.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n await assertModuleIsLoaded();\n\n const uri = this.resolveUri();\n\n const { MongoClient, ObjectId: ObjectIdMongoDB } = MongoDBClient;\n\n ObjectId = ObjectIdMongoDB;\n\n const client = new MongoClient(uri, this.buildClientOptions());\n\n try {\n log.info(\n \"database.mongodb\",\n \"connection\",\n `Connecting to database ${colors.bold(colors.yellowBright(this.databaseName))}`,\n );\n await client.connect();\n this.client = client;\n this.database = client.db(this.databaseName);\n\n this.connected = true;\n log.success(\"database.mongodb\", \"connection\", \"Connected to database\");\n\n client.on(\"close\", () => {\n if (this.connected) {\n this.connected = false;\n this.emit(\"disconnected\");\n log.warn(\"database.mongodb\", \"connection\", \"Disconnected from database\");\n }\n });\n\n if (this.config.logging) {\n const ignoredCommands = [\"isMaster\", \"hello\", \"ping\", \"saslStart\", \"saslContinue\"];\n\n client.on(\"commandStarted\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n let cmdStr = JSON.stringify(event.command);\n if (cmdStr.length > 300) {\n cmdStr = cmdStr.substring(0, 300) + \"...\";\n }\n\n log.info({\n module: \"database.mongodb\",\n action: \"query.executing\",\n message: `[${event.commandName}] ${cmdStr}`,\n context: { command: event.command },\n });\n });\n\n client.on(\"commandSucceeded\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n log.success({\n module: \"database.mongodb\",\n action: \"query.executed\",\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\n });\n });\n\n client.on(\"commandFailed\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n log.error({\n module: \"database.mongodb\",\n action: \"query.error\",\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\n context: { failure: event.failure },\n });\n });\n }\n\n this.emit(\"connected\");\n } catch (error: any) {\n await client.close().catch(() => undefined);\n this.emit(\"disconnected\");\n // Boot-time database connection failure is unrecoverable in every\n // realistic caller (app boot, CLI migrations, workers) — `fatal` makes\n // \"page on fatal only\" alerting clean. Per-query failures stay at error.\n log.fatal(\n \"database.mongodb\",\n \"connection\",\n `Failed to connect to database: ${error.message}`,\n );\n throw error;\n }\n }\n\n /**\n * Close the underlying MongoDB connection.\n */\n public async disconnect(): Promise<void> {\n if (!this.client) {\n return;\n }\n\n try {\n await this.client.close();\n } finally {\n this.connected = false;\n this.emit(\"disconnected\");\n }\n }\n\n /**\n * Subscribe to driver lifecycle events.\n */\n public on(event: DriverEvent, listener: DriverEventListener): void {\n this.events.on(event, listener);\n }\n\n /**\n * Insert a single document into the given collection.\n */\n public async insert(\n table: string,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<InsertResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<InsertOneOptions>(options);\n const result = await collection.insertOne(document, mongoOptions);\n\n return {\n document: {\n ...document,\n _id: result.insertedId,\n },\n };\n }\n\n /**\n * Insert multiple documents into the given collection.\n */\n public async insertMany(\n table: string,\n documents: Record<string, unknown>[],\n options?: Record<string, unknown>,\n ): Promise<InsertResult[]> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<BulkWriteOptions>(options);\n const result: InsertManyResult<Record<string, unknown>> = await collection.insertMany(\n documents,\n mongoOptions,\n );\n\n return documents.map((document, index) => {\n const insertedId = result.insertedIds[index as unknown as keyof typeof result.insertedIds];\n\n return {\n document: {\n ...document,\n _id: insertedId,\n },\n };\n });\n }\n\n /**\n * Update a single document that matches the provided filter.\n */\n public async update(\n table: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateOne(\n filter,\n update as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Replace a single document that matches the provided filter.\n */\n public async replace<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const result = await collection.findOneAndReplace(filter, document as Record<string, unknown>);\n\n return result?.value as T | null;\n }\n\n /**\n * Find one and update a single document that matches the provided filter and return the updated document\n */\n public async findOneAndUpdate<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n update: UpdateOperations,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\n const result = await collection.findOneAndUpdate(filter, update as Record<string, unknown>, {\n returnDocument: \"after\",\n ...mongoOptions,\n });\n\n return result as T | null;\n }\n\n /**\n * Upsert (insert or update) a single document.\n *\n * Uses MongoDB's findOneAndUpdate with upsert option.\n *\n * @param table - Target collection name\n * @param filter - Filter conditions to find existing document\n * @param document - Document data to insert or update\n * @param options - Optional upsert options\n * @returns The upserted document\n */\n public async upsert<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\n\n // Use $set to update all fields from document\n const update = { $set: document };\n\n const result = await collection.findOneAndUpdate(filter, update, {\n upsert: true,\n returnDocument: \"after\",\n ...mongoOptions,\n });\n\n return result as T;\n }\n\n /**\n * Find one and delete a single document that matches the provided filter and return the deleted document.\n *\n * @param table - Target collection name\n * @param filter - Filter conditions\n * @param options - Optional delete options\n * @returns The deleted document or null if not found\n */\n public async findOneAndDelete<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndDeleteOptions>(options);\n\n const result = await collection.findOneAndDelete(filter, mongoOptions || {});\n\n return result as T | null;\n }\n\n /**\n * Update multiple documents that match the provided filter.\n */\n public async updateMany(\n table: string,\n filter: Record<string, unknown>,\n update: UpdateOperations,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateMany(\n filter,\n update as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Delete a single document that matches the provided filter.\n */\n public async delete(\n table: string,\n filter: Record<string, unknown> = {},\n options?: Record<string, unknown>,\n ): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n const result = await collection.deleteOne(filter, mongoOptions);\n\n return result.deletedCount > 0 ? 1 : 0;\n }\n\n /**\n * Delete documents that match the provided filter.\n */\n public async deleteMany(\n table: string,\n filter: Record<string, unknown> = {},\n options?: Record<string, unknown>,\n ): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n\n const result = await collection.deleteMany(filter, mongoOptions);\n\n return result.deletedCount ?? 0;\n }\n\n /**\n * Remove all records from a collection.\n *\n * This uses deleteMany with an empty filter to remove all documents.\n * For very large collections, consider using the migration driver's\n * dropTable + createTable approach for better performance.\n */\n public async truncateTable(table: string, options?: Record<string, unknown>): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n const result = await collection.deleteMany({}, mongoOptions);\n\n return result.deletedCount ?? 0;\n }\n\n /**\n * Serialize the given data\n */\n public serialize(data: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {\n continue; // Skip undefined values\n }\n\n if (value instanceof ObjectId) {\n serialized[key] = value.toString();\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === \"bigint\") {\n serialized[key] = value.toString();\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n // Nested objects will be stored as JSONB\n serialized[key] = value;\n } else {\n serialized[key] = value;\n }\n }\n\n return serialized;\n }\n\n /**\n * Get the dirty tracker for this driver.\n */\n public getDirtyTracker(data: Record<string, unknown>): DatabaseDirtyTracker {\n return new DatabaseDirtyTracker(data);\n }\n\n /**\n * Deserialize the given data\n */\n public deserialize(data: Record<string, unknown>): Record<string, unknown> {\n if (data._id && typeof data._id === \"string\") {\n data._id = new ObjectId(data._id);\n }\n\n for (const [key, value] of Object.entries(data)) {\n // Only re-inflate strings — Mongo driver already returns Date objects from DB reads\n if (typeof value === \"string\" && isValidDateValue(value)) {\n data[key] = new Date(value);\n }\n }\n\n return data;\n }\n\n /**\n * Provide a Mongo-backed query builder instance for the given collection.\n */\n public queryBuilder<T = unknown>(table: string): QueryBuilderContract<T> {\n return new MongoQueryBuilder(table, dataSourceRegistry.get());\n }\n\n /**\n * Begin a MongoDB transaction, returning commit/rollback helpers.\n */\n public async beginTransaction(): Promise<DriverTransactionContract<ClientSession>> {\n const client = this.getClientInstance();\n const session = client.startSession();\n\n await session.startTransaction(this.transactionOptions);\n databaseTransactionContext.enter({ session });\n let finished = false;\n\n const finalize = async (operation: () => Promise<void>): Promise<void> => {\n if (finished) return;\n\n try {\n await operation();\n } finally {\n finished = true;\n databaseTransactionContext.exit();\n await session.endSession().catch(() => undefined);\n }\n };\n\n return {\n context: session,\n commit: async () => {\n await finalize(async () => {\n try {\n await session.commitTransaction();\n } catch (error) {\n await session.abortTransaction().catch(() => undefined);\n throw error;\n }\n });\n },\n rollback: async () => {\n await finalize(async () => {\n await session.abortTransaction();\n });\n },\n };\n }\n\n /**\n * Execute a function within a transaction scope (recommended pattern).\n *\n * Automatically commits on success, rolls back on any error, and guarantees\n * resource cleanup. This is the recommended way to use transactions.\n *\n * **MongoDB Requirements:**\n * - Requires MongoDB 4.0+ with replica set or sharded cluster\n * - Standalone MongoDB instances do not support transactions\n *\n * @param fn - Async function to execute within transaction\n * @param options - Transaction options (read preference, write concern, etc.)\n * @returns The return value of the callback function\n * @throws {Error} If transaction fails, is explicitly rolled back, or replica set not configured\n */\n public async transaction<T>(\n fn: (ctx: TransactionContext) => Promise<T>,\n options?: Record<string, unknown>,\n ): Promise<T> {\n const ctx: TransactionContext = {\n rollback(reason?: string): never {\n throw new TransactionRollbackError(reason);\n },\n };\n\n // Flat nesting: a transaction() called while one is already active JOINS it\n // instead of throwing (or opening a second, independent one). The outermost\n // transaction owns commit / abort; the inner block runs on the same session\n // so it sees the outer's writes — a service that opens its own transaction\n // then works both standalone and when called inside an outer transaction\n // (e.g. a seeder). Mirrors `PostgresDriver.transaction`.\n if (databaseTransactionContext.hasActiveTransaction()) {\n return fn(ctx);\n }\n\n // Check if MongoDB is running as a replica set (required for transactions)\n await this.ensureReplicaSetAvailable();\n\n const client = this.getClientInstance();\n const session = client.startSession();\n\n try {\n await session.startTransaction({\n ...this.transactionOptions,\n ...(options as TransactionOptions),\n });\n\n // Set transaction context for queries within callback\n databaseTransactionContext.enter({ session });\n\n try {\n // Execute callback\n const result = await fn(ctx);\n\n // Auto-commit on success\n await session.commitTransaction();\n\n return result;\n } catch (error) {\n // Auto-rollback on any error (including explicit rollback)\n await session.abortTransaction().catch(() => undefined);\n throw error;\n } finally {\n // Guaranteed context cleanup\n databaseTransactionContext.exit();\n }\n } finally {\n // Guaranteed session cleanup\n await session.endSession().catch(() => undefined);\n }\n }\n\n /**\n * Execute atomic operations (typically $inc/$set style updates) against documents.\n *\n * Uses `updateMany` so callers can atomically modify any set of documents.\n */\n public async atomic(\n table: string,\n filter: Record<string, unknown>,\n operations: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateMany(\n filter,\n operations as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Lazily create (and cache) the Mongo sync adapter.\n * The adapter uses this driver instance to ensure all operations\n * participate in active transactions via the session context.\n */\n public syncAdapter(): SyncAdapterContract {\n if (!this.syncAdapterInstance) {\n this.syncAdapterInstance = new MongoSyncAdapter(this);\n }\n\n return this.syncAdapterInstance;\n }\n\n /**\n * Lazily create (and cache) the Mongo migration driver.\n * The migration driver handles schema operations like indexes, collections, etc.\n */\n public migrationDriver(): MigrationDriverContract {\n if (!this.migrationDriverInstance) {\n this.migrationDriverInstance = new MongoMigrationDriver(this);\n }\n\n return this.migrationDriverInstance!;\n }\n\n /**\n * Expose the underlying Mongo client for advanced consumers.\n */\n public getClient<Client = MongoClient>(): Client {\n return this.getClientInstance() as Client;\n }\n\n /**\n * Retrieve the active Mongo client, throwing if the driver is disconnected.\n */\n private getClientInstance(): MongoClient {\n if (!this.client) {\n throw new Error(\"Mongo driver is not connected.\");\n }\n\n return this.client;\n }\n\n /**\n * Retrieve the active Mongo database, throwing if the driver is disconnected.\n * @private\n */\n private getDatabaseInstance(): Db {\n if (!this.database) {\n throw new Error(\"Mongo driver is not connected to a database.\");\n }\n\n return this.database;\n }\n\n /**\n * Resolve the Mongo connection string based on provided options.\n */\n private resolveUri(): string {\n if (this.config.uri) {\n return this.config.uri;\n }\n\n const host = this.config.host ?? \"localhost\";\n const port = this.config.port ?? 27017;\n\n return `mongodb://${host}:${port}`;\n }\n\n /**\n * Build the Mongo client options derived from the driver configuration.\n */\n private buildClientOptions(): MongoClientOptions {\n const baseOptions: MongoClientOptions = {\n ...(this.config.clientOptions ?? {}),\n };\n\n if (this.config.logging) {\n baseOptions.monitorCommands = true;\n }\n\n if (this.config.username && !baseOptions.auth) {\n baseOptions.auth = {\n username: this.config.username,\n password: this.config.password,\n };\n }\n\n if (this.config.authSource && !baseOptions.authSource) {\n baseOptions.authSource = this.config.authSource;\n }\n\n return baseOptions;\n }\n\n /**\n * Emit a driver lifecycle event.\n */\n private emit(event: DriverEvent, ...args: unknown[]): void {\n this.events.emit(event, ...args);\n }\n\n /**\n * Ensure MongoDB is running as a replica set (required for transactions).\n *\n * @throws {Error} If MongoDB is running as a standalone instance\n */\n private async ensureReplicaSetAvailable(): Promise<void> {\n try {\n const admin = this.database!.admin();\n const status = await admin.serverStatus();\n\n if (!status.repl) {\n throw new Error(\n \"MongoDB transactions require a replica set or sharded cluster. \" +\n \"Standalone MongoDB instances do not support transactions.\\n\\n\" +\n \"For local development:\\n\" +\n \" - Run MongoDB with --replSet flag: mongod --replSet rs0\\n\" +\n \" - Or use Docker with replica set configuration\\n\" +\n \" - Or use MongoDB Atlas (cloud) which provides replica sets by default\",\n );\n }\n } catch (error: any) {\n if (error.message?.includes(\"replica set\")) {\n throw error;\n }\n throw new Error(`Failed to check MongoDB replica set status: ${error.message}`);\n }\n }\n\n /**\n * Attach the active transaction session (when available) to Mongo options.\n */\n private withSession<TOptions extends { session?: ClientSession }>(\n options?: Record<string, unknown>,\n ): TOptions | undefined {\n const session = databaseTransactionContext.getSession<ClientSession>();\n\n if (!session) {\n return options as TOptions | undefined;\n }\n\n const baseOptions = options ? ({ ...options } as TOptions) : ({} as TOptions);\n\n baseOptions.session = session;\n\n return baseOptions;\n }\n\n // ============================================================\n // SQL Compatibility Operations (Not supported in MongoDB)\n // ============================================================\n\n /**\n * MongoDB has no SQL dialect — the MigrationRunner executes migrations\n * through the migration driver directly instead of Migration.toSQL().\n */\n public readonly supportsSqlSerialization = false;\n\n /**\n * Return a SQL serializer for this driver's dialect.\n * Not supported for MongoDB.\n */\n public getSQLSerializer(): SQLSerializer {\n throw new Error(\"MongoDB driver does not support SQL serialization.\");\n }\n\n /**\n * Execute a raw SQL query.\n * Not supported for MongoDB.\n */\n public async query<T = Record<string, unknown>>(\n _sql: string,\n _params?: unknown[],\n ): Promise<RawQueryResult<T>> {\n throw new Error(\"MongoDB driver does not support raw SQL queries.\");\n }\n\n // ============================================================\n // Database Lifecycle Operations\n // ============================================================\n\n /**\n * Create a new database.\n *\n * In MongoDB, databases are created automatically when data is first written.\n * This method creates an empty collection to ensure the database exists.\n *\n * @param name - Database name to create\n * @returns true if created, false if already exists\n */\n public async createDatabase(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n // Check if database already exists\n if (await this.databaseExists(name)) {\n return false;\n }\n\n try {\n // MongoDB creates databases on first write, so create a system collection\n const db = client.db(name);\n await db.createCollection(\"__init__\");\n // Drop the temp collection\n await db.collection(\"__init__\").drop();\n\n log.success(\"database\", \"lifecycle\", `Created database ${name}`);\n return true;\n } catch (error) {\n log.error(\"database\", \"lifecycle\", `Failed to create database ${name}: ${error}`);\n throw error;\n }\n }\n\n /**\n * Drop a database.\n *\n * @param name - Database name to drop\n * @returns true if dropped, false if didn't exist\n */\n public async dropDatabase(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n // Check if database exists\n if (!(await this.databaseExists(name))) {\n return false;\n }\n\n try {\n await client.db(name).dropDatabase();\n log.success(\"database\", \"lifecycle\", `Dropped database ${name}`);\n return true;\n } catch (error) {\n log.error(\"database\", \"lifecycle\", `Failed to drop database ${name}: ${error}`);\n throw error;\n }\n }\n\n /**\n * Check if a database exists.\n *\n * @param name - Database name to check\n * @returns true if database exists\n */\n public async databaseExists(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n const result = await client.db(\"admin\").admin().listDatabases();\n return result.databases.some((db) => db.name === name);\n }\n\n /**\n * List all databases.\n *\n * @returns Array of database names\n */\n public async listDatabases(): Promise<string[]> {\n const client = this.getClientInstance();\n\n const result = await client.db(\"admin\").admin().listDatabases();\n return result.databases\n .map((db) => db.name)\n .filter((name) => ![\"admin\", \"local\", \"config\"].includes(name));\n }\n\n // ============================================================\n // Table/Collection Management Operations\n // ============================================================\n\n /**\n * Drop a collection.\n *\n * @param name - Collection name to drop\n * @throws Error if collection doesn't exist\n */\n public async dropTable(name: string): Promise<void> {\n const db = this.getDatabaseInstance();\n await db.collection(name).drop();\n log.success(\"database\", \"collection\", `Dropped collection ${name}`);\n }\n\n /**\n * Drop a collection if it exists.\n *\n * @param name - Collection name to drop\n */\n public async dropTableIfExists(name: string): Promise<void> {\n if (await this.blueprint.tableExists(name)) {\n await this.dropTable(name);\n }\n }\n\n /**\n * Drop all collections in the current database.\n *\n * Useful for `migrate:fresh` command.\n */\n public async dropAllTables(): Promise<void> {\n const collections = await this.blueprint.listTables();\n\n if (collections.length === 0) {\n return;\n }\n\n const db = this.getDatabaseInstance();\n\n for (const collection of collections) {\n await db.collection(collection).drop();\n }\n\n log.success(\"database\", \"collection\", `Dropped ${collections.length} collections`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mongodb-driver.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-driver.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { log } from \"@warlock.js/logger\";\nimport type {\n BulkWriteOptions,\n ClientSession,\n Db,\n DeleteOptions,\n FindOneAndDeleteOptions,\n FindOneAndUpdateOptions,\n InsertManyResult,\n InsertOneOptions,\n MongoClient,\n MongoClientOptions,\n TransactionOptions,\n UpdateFilter,\n UpdateOptions,\n} from \"mongodb\";\nimport { EventEmitter } from \"node:events\";\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\nimport type {\n DriverBlueprintContract,\n DriverContract,\n DriverEvent,\n DriverEventListener,\n DriverTransactionContract,\n IdGeneratorContract,\n InsertResult,\n MigrationDriverContract,\n QueryBuilderContract,\n RawQueryResult,\n SyncAdapterContract,\n TransactionContext,\n UpdateOperations,\n UpdateResult,\n} from \"../../contracts\";\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\nimport { DatabaseDirtyTracker } from \"../../database-dirty-tracker\";\nimport { TransactionRollbackError } from \"../../errors/transaction-rollback.error\";\nimport { type SQLSerializer } from \"../../migration/sql-serializer\";\nimport type { ModelDefaults } from \"../../types\";\nimport { isValidDateValue } from \"../../utils/is-valid-date-value\";\nimport { MongoDBBlueprint } from \"./mongodb-blueprint\";\nimport { MongoIdGenerator } from \"./mongodb-id-generator\";\nimport { MongoMigrationDriver } from \"./mongodb-migration-driver\";\nimport { MongoQueryBuilder } from \"./mongodb-query-builder\";\nimport { MongoSyncAdapter } from \"./mongodb-sync-adapter\";\nimport type { MongoDriverOptions } from \"./types\";\n\nconst DEFAULT_TRANSACTION_OPTIONS: TransactionOptions = {\n readPreference: \"primary\",\n readConcern: { level: \"local\" },\n writeConcern: { w: \"majority\" },\n};\n\n// ============================================================\n// Lazy-loaded MongoDB SDK Types\n// ============================================================\n\n/**\n * Cached MongoDB module (loaded once, reused)\n */\nlet MongoDBClient: typeof import(\"mongodb\");\n\nlet ObjectId: typeof import(\"mongodb\").ObjectId;\n\nlet isModuleExists: boolean | null = null;\n\nlet loadingPromise: Promise<any>;\n\n/**\n * Installation instructions for MongoDB package\n */\nconst MONGODB_INSTALL_INSTRUCTIONS = `\nMongoDB driver requires the mongodb package.\nInstall it with:\n\n npm install mongodb\n\nOr with your preferred package manager:\n\n pnpm add mongodb\n yarn add mongodb\n`.trim();\n\n/**\n * Load MongoDB module\n */\nasync function loadMongoDB() {\n try {\n loadingPromise = import(\"mongodb\");\n MongoDBClient = await loadingPromise;\n ObjectId = MongoDBClient.ObjectId;\n isModuleExists = true;\n } catch {\n isModuleExists = false;\n }\n}\n\nloadMongoDB();\n\nexport function isMongoDBDriverLoaded() {\n return isModuleExists;\n}\n\nasync function assertModuleIsLoaded() {\n if (isModuleExists === false) {\n throw new Error(MONGODB_INSTALL_INSTRUCTIONS);\n }\n\n if (isModuleExists === null) {\n await loadingPromise;\n\n return await assertModuleIsLoaded();\n }\n}\n\n/**\n * MongoDB driver implementation that fulfils the Cascade driver contract.\n *\n * It encapsulates the native Mongo client, exposes lifecycle events, and\n * provides helpers for CRUD, transactions, atomic updates, and sync adapters.\n */\nexport class MongoDbDriver implements DriverContract {\n private readonly events = new EventEmitter();\n public client?: MongoClient;\n public database?: Db;\n private connected = false;\n private syncAdapterInstance?: MongoSyncAdapter;\n private migrationDriverInstance?: MigrationDriverContract;\n private readonly transactionOptions: TransactionOptions;\n private idGeneratorInstance?: IdGeneratorContract;\n private _blueprint?: DriverBlueprintContract;\n\n public get blueprint(): DriverBlueprintContract {\n if (!this._blueprint) {\n this._blueprint = new MongoDBBlueprint(this.database!);\n }\n\n return this._blueprint!;\n }\n\n /**\n * The name of this driver.\n */\n public readonly name = \"mongodb\";\n\n /**\n * Current database name\n */\n protected _databaseName?: string;\n\n /**\n * MongoDB driver model defaults.\n *\n * MongoDB follows NoSQL conventions:\n * - camelCase naming for fields (createdAt, updatedAt, deletedAt)\n * - Manual ID generation (auto-increment id field separate from _id)\n * - Timestamps enabled by default\n * - Trash delete strategy with per-collection trash tables\n */\n public readonly modelDefaults: Partial<ModelDefaults> = {\n namingConvention: \"camelCase\",\n createdAtColumn: \"createdAt\",\n updatedAtColumn: \"updatedAt\",\n deletedAtColumn: \"deletedAt\",\n timestamps: true,\n autoGenerateId: true, // MongoDB needs manual ID generation\n strictMode: \"strip\",\n deleteStrategy: \"trash\",\n trashTable: (table) => `${table}Trash`, // Per-collection trash (usersTrash, productsTrash)\n };\n\n /**\n * Create a new MongoDB driver using the supplied connection options.\n *\n * @param config - Connection configuration\n * @param driverOptions - Driver-specific options\n */\n public constructor(\n private readonly config: {\n database: string;\n uri?: string;\n host?: string;\n port?: number;\n username?: string;\n password?: string;\n authSource?: string;\n logging?: boolean;\n clientOptions?: MongoClientOptions;\n },\n private readonly driverOptions?: MongoDriverOptions,\n ) {\n this.transactionOptions = {\n ...DEFAULT_TRANSACTION_OPTIONS,\n ...driverOptions?.transactionOptions,\n };\n }\n\n /**\n * Get data base name\n */\n public get databaseName(): string | undefined {\n if (!this._databaseName) {\n this.resolveDatabaseName();\n }\n\n return this._databaseName;\n }\n\n /**\n * Resolve database name either from config or uri\n */\n private resolveDatabaseName() {\n if (this.config.database) {\n this._databaseName = this.config.database;\n } else if (this.config.uri) {\n this._databaseName = this.config.uri.split(\"/\").pop()?.split(\"?\")?.[0];\n }\n }\n\n /**\n * Indicates whether the driver currently maintains an active connection.\n */\n public get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the MongoDB database instance.\n *\n * @returns The MongoDB Db instance\n * @throws {Error} If not connected\n *\n * @example\n * ```typescript\n * const db = driver.getDatabase();\n * const collection = db.collection(\"users\");\n * ```\n */\n public getDatabase(): Db {\n if (!this.database) {\n throw new Error(\n \"Database not available. Ensure the driver is connected before accessing the database.\",\n );\n }\n return this.database;\n }\n\n /**\n * Get the ID generator instance for this driver.\n *\n * Creates a MongoIdGenerator on first access if autoGenerateId is enabled.\n *\n * @returns The ID generator instance, or undefined if disabled\n *\n * @example\n * ```typescript\n * const idGenerator = driver.getIdGenerator();\n * if (idGenerator) {\n * const id = await idGenerator.generateNextId({ table: \"users\" });\n * }\n * ```\n */\n public getIdGenerator(): IdGeneratorContract | undefined {\n // Return undefined if ID generation is disabled\n if (this.driverOptions?.autoGenerateId === false) {\n return undefined;\n }\n\n // Create ID generator lazily on first access\n if (!this.idGeneratorInstance) {\n this.idGeneratorInstance = new MongoIdGenerator(this, this.driverOptions?.counterCollection);\n }\n\n return this.idGeneratorInstance;\n }\n\n /**\n * Establish a MongoDB connection using the configured options.\n * Throws if the connection attempt fails.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n await assertModuleIsLoaded();\n\n const uri = this.resolveUri();\n\n const { MongoClient, ObjectId: ObjectIdMongoDB } = MongoDBClient;\n\n ObjectId = ObjectIdMongoDB;\n\n const client = new MongoClient(uri, this.buildClientOptions());\n\n try {\n log.info(\n \"database.mongodb\",\n \"connection\",\n `Connecting to database ${colors.bold(colors.yellowBright(this.databaseName))}`,\n );\n await client.connect();\n this.client = client;\n this.database = client.db(this.databaseName);\n\n this.connected = true;\n log.success(\"database.mongodb\", \"connection\", \"Connected to database\");\n\n client.on(\"close\", () => {\n if (this.connected) {\n this.connected = false;\n this.emit(\"disconnected\");\n log.warn(\"database.mongodb\", \"connection\", \"Disconnected from database\");\n }\n });\n\n if (this.config.logging) {\n const ignoredCommands = [\"isMaster\", \"hello\", \"ping\", \"saslStart\", \"saslContinue\"];\n\n client.on(\"commandStarted\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n let cmdStr = JSON.stringify(event.command);\n if (cmdStr.length > 300) {\n cmdStr = cmdStr.substring(0, 300) + \"...\";\n }\n\n log.info({\n module: \"database.mongodb\",\n action: \"query.executing\",\n message: `[${event.commandName}] ${cmdStr}`,\n context: { command: event.command },\n });\n });\n\n client.on(\"commandSucceeded\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n log.success({\n module: \"database.mongodb\",\n action: \"query.executed\",\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\n });\n });\n\n client.on(\"commandFailed\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n log.error({\n module: \"database.mongodb\",\n action: \"query.error\",\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\n context: { failure: event.failure },\n });\n });\n }\n\n this.emit(\"connected\");\n } catch (error: any) {\n await client.close().catch(() => undefined);\n this.emit(\"disconnected\");\n // Boot-time database connection failure is unrecoverable in every\n // realistic caller (app boot, CLI migrations, workers) — `fatal` makes\n // \"page on fatal only\" alerting clean. Per-query failures stay at error.\n log.fatal(\n \"database.mongodb\",\n \"connection\",\n `Failed to connect to database: ${error.message}`,\n );\n throw error;\n }\n }\n\n /**\n * Close the underlying MongoDB connection.\n */\n public async disconnect(): Promise<void> {\n if (!this.client) {\n return;\n }\n\n try {\n await this.client.close();\n } finally {\n this.connected = false;\n this.emit(\"disconnected\");\n }\n }\n\n /**\n * Subscribe to driver lifecycle events.\n */\n public on(event: DriverEvent, listener: DriverEventListener): void {\n this.events.on(event, listener);\n }\n\n /**\n * Insert a single document into the given collection.\n */\n public async insert(\n table: string,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<InsertResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<InsertOneOptions>(options);\n const result = await collection.insertOne(document, mongoOptions);\n\n return {\n document: {\n ...document,\n _id: result.insertedId,\n },\n };\n }\n\n /**\n * Insert multiple documents into the given collection.\n */\n public async insertMany(\n table: string,\n documents: Record<string, unknown>[],\n options?: Record<string, unknown>,\n ): Promise<InsertResult[]> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<BulkWriteOptions>(options);\n const result: InsertManyResult<Record<string, unknown>> = await collection.insertMany(\n documents,\n mongoOptions,\n );\n\n return documents.map((document, index) => {\n const insertedId = result.insertedIds[index as unknown as keyof typeof result.insertedIds];\n\n return {\n document: {\n ...document,\n _id: insertedId,\n },\n };\n });\n }\n\n /**\n * Update a single document that matches the provided filter.\n */\n public async update(\n table: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateOne(\n filter,\n update as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Replace a single document that matches the provided filter.\n */\n public async replace<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const result = await collection.findOneAndReplace(filter, document as Record<string, unknown>);\n\n return result?.value as T | null;\n }\n\n /**\n * Find one and update a single document that matches the provided filter and return the updated document\n */\n public async findOneAndUpdate<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n update: UpdateOperations,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\n const result = await collection.findOneAndUpdate(filter, update as Record<string, unknown>, {\n returnDocument: \"after\",\n ...mongoOptions,\n });\n\n return result as T | null;\n }\n\n /**\n * Upsert (insert or update) a single document.\n *\n * Uses MongoDB's findOneAndUpdate with upsert option.\n *\n * @param table - Target collection name\n * @param filter - Filter conditions to find existing document\n * @param document - Document data to insert or update\n * @param options - Optional upsert options\n * @returns The upserted document\n */\n public async upsert<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\n\n // Use $set to update all fields from document\n const update = { $set: document };\n\n const result = await collection.findOneAndUpdate(filter, update, {\n upsert: true,\n returnDocument: \"after\",\n ...mongoOptions,\n });\n\n return result as T;\n }\n\n /**\n * Find one and delete a single document that matches the provided filter and return the deleted document.\n *\n * @param table - Target collection name\n * @param filter - Filter conditions\n * @param options - Optional delete options\n * @returns The deleted document or null if not found\n */\n public async findOneAndDelete<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndDeleteOptions>(options);\n\n const result = await collection.findOneAndDelete(filter, mongoOptions || {});\n\n return result as T | null;\n }\n\n /**\n * Update multiple documents that match the provided filter.\n */\n public async updateMany(\n table: string,\n filter: Record<string, unknown>,\n update: UpdateOperations,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateMany(\n filter,\n update as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Delete a single document that matches the provided filter.\n */\n public async delete(\n table: string,\n filter: Record<string, unknown> = {},\n options?: Record<string, unknown>,\n ): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n const result = await collection.deleteOne(filter, mongoOptions);\n\n return result.deletedCount > 0 ? 1 : 0;\n }\n\n /**\n * Delete documents that match the provided filter.\n */\n public async deleteMany(\n table: string,\n filter: Record<string, unknown> = {},\n options?: Record<string, unknown>,\n ): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n\n const result = await collection.deleteMany(filter, mongoOptions);\n\n return result.deletedCount ?? 0;\n }\n\n /**\n * Remove all records from a collection.\n *\n * This uses deleteMany with an empty filter to remove all documents.\n * For very large collections, consider using the migration driver's\n * dropTable + createTable approach for better performance.\n */\n public async truncateTable(table: string, options?: Record<string, unknown>): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n const result = await collection.deleteMany({}, mongoOptions);\n\n return result.deletedCount ?? 0;\n }\n\n /**\n * Serialize the given data\n */\n public serialize(data: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {\n continue; // Skip undefined values\n }\n\n if (value instanceof ObjectId) {\n serialized[key] = value.toString();\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === \"bigint\") {\n serialized[key] = value.toString();\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n // Nested objects will be stored as JSONB\n serialized[key] = value;\n } else {\n serialized[key] = value;\n }\n }\n\n return serialized;\n }\n\n /**\n * Get the dirty tracker for this driver.\n */\n public getDirtyTracker(data: Record<string, unknown>): DatabaseDirtyTracker {\n return new DatabaseDirtyTracker(data);\n }\n\n /**\n * Deserialize the given data\n */\n public deserialize(data: Record<string, unknown>): Record<string, unknown> {\n if (data._id && typeof data._id === \"string\") {\n data._id = new ObjectId(data._id);\n }\n\n for (const [key, value] of Object.entries(data)) {\n // Only re-inflate strings — Mongo driver already returns Date objects from DB reads\n if (typeof value === \"string\" && isValidDateValue(value)) {\n data[key] = new Date(value);\n }\n }\n\n return data;\n }\n\n /**\n * Provide a Mongo-backed query builder instance for the given collection.\n */\n public queryBuilder<T = unknown>(table: string): QueryBuilderContract<T> {\n return new MongoQueryBuilder(table, dataSourceRegistry.get());\n }\n\n /**\n * Begin a MongoDB transaction, returning commit/rollback helpers.\n */\n public async beginTransaction(): Promise<DriverTransactionContract<ClientSession>> {\n const client = this.getClientInstance();\n const session = client.startSession();\n\n await session.startTransaction(this.transactionOptions);\n databaseTransactionContext.enter({ session });\n let finished = false;\n\n const finalize = async (operation: () => Promise<void>): Promise<void> => {\n if (finished) return;\n\n try {\n await operation();\n } finally {\n finished = true;\n databaseTransactionContext.exit();\n await session.endSession().catch(() => undefined);\n }\n };\n\n return {\n context: session,\n commit: async () => {\n await finalize(async () => {\n try {\n await session.commitTransaction();\n } catch (error) {\n await session.abortTransaction().catch(() => undefined);\n throw error;\n }\n });\n },\n rollback: async () => {\n await finalize(async () => {\n await session.abortTransaction();\n });\n },\n };\n }\n\n /**\n * Execute a function within a transaction scope (recommended pattern).\n *\n * Automatically commits on success, rolls back on any error, and guarantees\n * resource cleanup. This is the recommended way to use transactions.\n *\n * **MongoDB Requirements:**\n * - Requires MongoDB 4.0+ with replica set or sharded cluster\n * - Standalone MongoDB instances do not support transactions\n *\n * @param fn - Async function to execute within transaction\n * @param options - Transaction options (read preference, write concern, etc.)\n * @returns The return value of the callback function\n * @throws {Error} If transaction fails, is explicitly rolled back, or replica set not configured\n */\n public async transaction<T>(\n fn: (ctx: TransactionContext) => Promise<T>,\n options?: Record<string, unknown>,\n ): Promise<T> {\n const ctx: TransactionContext = {\n rollback(reason?: string): never {\n throw new TransactionRollbackError(reason);\n },\n };\n\n // Flat nesting: a transaction() called while one is already active JOINS it\n // instead of throwing (or opening a second, independent one). The outermost\n // transaction owns commit / abort; the inner block runs on the same session\n // so it sees the outer's writes — a service that opens its own transaction\n // then works both standalone and when called inside an outer transaction\n // (e.g. a seeder). Mirrors `PostgresDriver.transaction`.\n if (databaseTransactionContext.hasActiveTransaction()) {\n return fn(ctx);\n }\n\n // Check if MongoDB is running as a replica set (required for transactions)\n await this.ensureReplicaSetAvailable();\n\n const client = this.getClientInstance();\n const session = client.startSession();\n\n try {\n await session.startTransaction({\n ...this.transactionOptions,\n ...(options as TransactionOptions),\n });\n\n // Set transaction context for queries within callback\n databaseTransactionContext.enter({ session });\n\n try {\n // Execute callback\n const result = await fn(ctx);\n\n // Auto-commit on success\n await session.commitTransaction();\n\n return result;\n } catch (error) {\n // Auto-rollback on any error (including explicit rollback)\n await session.abortTransaction().catch(() => undefined);\n throw error;\n } finally {\n // Guaranteed context cleanup\n databaseTransactionContext.exit();\n }\n } finally {\n // Guaranteed session cleanup\n await session.endSession().catch(() => undefined);\n }\n }\n\n /**\n * Execute atomic operations (typically $inc/$set style updates) against documents.\n *\n * Uses `updateMany` so callers can atomically modify any set of documents.\n */\n public async atomic(\n table: string,\n filter: Record<string, unknown>,\n operations: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateMany(\n filter,\n operations as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Lazily create (and cache) the Mongo sync adapter.\n * The adapter uses this driver instance to ensure all operations\n * participate in active transactions via the session context.\n */\n public syncAdapter(): SyncAdapterContract {\n if (!this.syncAdapterInstance) {\n this.syncAdapterInstance = new MongoSyncAdapter(this);\n }\n\n return this.syncAdapterInstance;\n }\n\n /**\n * Lazily create (and cache) the Mongo migration driver.\n * The migration driver handles schema operations like indexes, collections, etc.\n */\n public migrationDriver(): MigrationDriverContract {\n if (!this.migrationDriverInstance) {\n this.migrationDriverInstance = new MongoMigrationDriver(this);\n }\n\n return this.migrationDriverInstance!;\n }\n\n /**\n * Expose the underlying Mongo client for advanced consumers.\n */\n public getClient<Client = MongoClient>(): Client {\n return this.getClientInstance() as Client;\n }\n\n /**\n * Retrieve the active Mongo client, throwing if the driver is disconnected.\n */\n private getClientInstance(): MongoClient {\n if (!this.client) {\n throw new Error(\"Mongo driver is not connected.\");\n }\n\n return this.client;\n }\n\n /**\n * Retrieve the active Mongo database, throwing if the driver is disconnected.\n * @private\n */\n private getDatabaseInstance(): Db {\n if (!this.database) {\n throw new Error(\"Mongo driver is not connected to a database.\");\n }\n\n return this.database;\n }\n\n /**\n * Resolve the Mongo connection string based on provided options.\n */\n private resolveUri(): string {\n if (this.config.uri) {\n return this.config.uri;\n }\n\n const host = this.config.host ?? \"localhost\";\n const port = this.config.port ?? 27017;\n\n return `mongodb://${host}:${port}`;\n }\n\n /**\n * Build the Mongo client options derived from the driver configuration.\n */\n private buildClientOptions(): MongoClientOptions {\n const baseOptions: MongoClientOptions = {\n ...(this.config.clientOptions ?? {}),\n };\n\n if (this.config.logging) {\n baseOptions.monitorCommands = true;\n }\n\n if (this.config.username && !baseOptions.auth) {\n baseOptions.auth = {\n username: this.config.username,\n password: this.config.password,\n };\n }\n\n if (this.config.authSource && !baseOptions.authSource) {\n baseOptions.authSource = this.config.authSource;\n }\n\n return baseOptions;\n }\n\n /**\n * Emit a driver lifecycle event.\n */\n private emit(event: DriverEvent, ...args: unknown[]): void {\n this.events.emit(event, ...args);\n }\n\n /**\n * Ensure MongoDB is running as a replica set (required for transactions).\n *\n * @throws {Error} If MongoDB is running as a standalone instance\n */\n private async ensureReplicaSetAvailable(): Promise<void> {\n try {\n const admin = this.database!.admin();\n const status = await admin.serverStatus();\n\n if (!status.repl) {\n throw new Error(\n \"MongoDB transactions require a replica set or sharded cluster. \" +\n \"Standalone MongoDB instances do not support transactions.\\n\\n\" +\n \"For local development:\\n\" +\n \" - Run MongoDB with --replSet flag: mongod --replSet rs0\\n\" +\n \" - Or use Docker with replica set configuration\\n\" +\n \" - Or use MongoDB Atlas (cloud) which provides replica sets by default\",\n );\n }\n } catch (error: any) {\n if (error.message?.includes(\"replica set\")) {\n throw error;\n }\n throw new Error(`Failed to check MongoDB replica set status: ${error.message}`);\n }\n }\n\n /**\n * Attach the active transaction session (when available) to Mongo options.\n */\n private withSession<TOptions extends { session?: ClientSession }>(\n options?: Record<string, unknown>,\n ): TOptions | undefined {\n const session = databaseTransactionContext.getSession<ClientSession>();\n\n if (!session) {\n return options as TOptions | undefined;\n }\n\n const baseOptions = options ? ({ ...options } as TOptions) : ({} as TOptions);\n\n baseOptions.session = session;\n\n return baseOptions;\n }\n\n // ============================================================\n // SQL Compatibility Operations (Not supported in MongoDB)\n // ============================================================\n\n /**\n * MongoDB has no SQL dialect — the MigrationRunner executes migrations\n * through the migration driver directly instead of Migration.toSQL().\n */\n public readonly supportsSqlSerialization = false;\n\n /**\n * Return a SQL serializer for this driver's dialect.\n * Not supported for MongoDB.\n */\n public getSQLSerializer(): SQLSerializer {\n throw new Error(\"MongoDB driver does not support SQL serialization.\");\n }\n\n /**\n * Execute a raw SQL query.\n * Not supported for MongoDB.\n */\n public async query<T = Record<string, unknown>>(\n _sql: string,\n _params?: unknown[],\n ): Promise<RawQueryResult<T>> {\n throw new Error(\"MongoDB driver does not support raw SQL queries.\");\n }\n\n // ============================================================\n // Database Lifecycle Operations\n // ============================================================\n\n /**\n * Create a new database.\n *\n * In MongoDB, databases are created automatically when data is first written.\n * This method creates an empty collection to ensure the database exists.\n *\n * @param name - Database name to create\n * @returns true if created, false if already exists\n */\n public async createDatabase(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n // Check if database already exists\n if (await this.databaseExists(name)) {\n return false;\n }\n\n try {\n // MongoDB creates databases on first write, so create a system collection\n const db = client.db(name);\n await db.createCollection(\"__init__\");\n // Drop the temp collection\n await db.collection(\"__init__\").drop();\n\n log.success(\"database\", \"lifecycle\", `Created database ${name}`);\n return true;\n } catch (error) {\n log.error(\"database\", \"lifecycle\", `Failed to create database ${name}: ${error}`);\n throw error;\n }\n }\n\n /**\n * Drop a database.\n *\n * @param name - Database name to drop\n * @returns true if dropped, false if didn't exist\n */\n public async dropDatabase(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n // Check if database exists\n if (!(await this.databaseExists(name))) {\n return false;\n }\n\n try {\n await client.db(name).dropDatabase();\n log.success(\"database\", \"lifecycle\", `Dropped database ${name}`);\n return true;\n } catch (error) {\n log.error(\"database\", \"lifecycle\", `Failed to drop database ${name}: ${error}`);\n throw error;\n }\n }\n\n /**\n * Check if a database exists.\n *\n * @param name - Database name to check\n * @returns true if database exists\n */\n public async databaseExists(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n const result = await client.db(\"admin\").admin().listDatabases();\n return result.databases.some((db) => db.name === name);\n }\n\n /**\n * List all databases.\n *\n * @returns Array of database names\n */\n public async listDatabases(): Promise<string[]> {\n const client = this.getClientInstance();\n\n const result = await client.db(\"admin\").admin().listDatabases();\n return result.databases\n .map((db) => db.name)\n .filter((name) => ![\"admin\", \"local\", \"config\"].includes(name));\n }\n\n // ============================================================\n // Table/Collection Management Operations\n // ============================================================\n\n /**\n * Drop a collection.\n *\n * @param name - Collection name to drop\n * @throws Error if collection doesn't exist\n */\n public async dropTable(name: string): Promise<void> {\n const db = this.getDatabaseInstance();\n await db.collection(name).drop();\n log.success(\"database\", \"collection\", `Dropped collection ${name}`);\n }\n\n /**\n * Drop a collection if it exists.\n *\n * @param name - Collection name to drop\n */\n public async dropTableIfExists(name: string): Promise<void> {\n if (await this.blueprint.tableExists(name)) {\n await this.dropTable(name);\n }\n }\n\n /**\n * Drop all collections in the current database.\n *\n * Useful for `migrate:fresh` command.\n */\n public async dropAllTables(): Promise<void> {\n const collections = await this.blueprint.listTables();\n\n if (collections.length === 0) {\n return;\n }\n\n const db = this.getDatabaseInstance();\n\n for (const collection of collections) {\n await db.collection(collection).drop();\n }\n\n log.success(\"database\", \"collection\", `Dropped ${collections.length} collections`);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-id-generator.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-id-generator.ts"],"sourcesContent":["import type { GenerateIdOptions, IdGeneratorContract } from \"../../contracts\";\nimport type { MongoDbDriver } from \"./mongodb-driver\";\n\n/** Number of times a reservation retries after a duplicate-key (E11000) error. */\nconst MAX_RESERVE_ATTEMPTS = 3;\n\n/** MongoDB duplicate-key error code. */\nconst DUPLICATE_KEY_ERROR_CODE = 11000;\n\n/**\n * Is `error` a MongoDB duplicate-key (E11000) error?\n *\n * Raised when two concurrent first-time upserts race to create the same\n * counter document once the unique index on `{ collection: 1 }` exists.\n */\nfunction isDuplicateKeyError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as { code?: number }).code === DUPLICATE_KEY_ERROR_CODE\n );\n}\n\n/**\n * MongoDB-specific ID generator for auto-incrementing integer IDs.\n *\n * Maintains a separate collection that tracks the last generated ID for each\n * table, mimicking SQL's `AUTO_INCREMENT` / `SERIAL`.\n *\n * **Collection Structure:**\n * ```json\n * { \"collection\": \"users\", \"id\": 12345 }\n * ```\n *\n * **Atomicity & concurrency:**\n * - Each id (or block of ids) is reserved with a SINGLE atomic\n * `findOneAndUpdate` on one document; MongoDB serializes concurrent writes to\n * the same document, so concurrent callers receive distinct, non-overlapping\n * ids/blocks.\n * - A unique index on `{ collection: 1 }` is ensured lazily (once per instance)\n * so two concurrent first-time upserts for a brand-new table can't create\n * duplicate counter documents; the loser of that race gets an E11000 and is\n * retried (by then the document exists, so it takes the increment branch).\n *\n * **Transactions — IMPORTANT:** the counter write is its OWN standalone,\n * immediately-durable operation. It does NOT join an ambient\n * `transaction()` session (it calls `findOneAndUpdate` directly without a\n * session). This is intentional and matches SQL `SERIAL` semantics: if the\n * surrounding transaction rolls back, the inserted records are undone but the\n * consumed id(s) are NOT — they remain a gap in the sequence. Do not rely on\n * id reservation being rolled back with a transaction.\n *\n * @example\n * ```typescript\n * const idGenerator = new MongoIdGenerator(mongoDriver);\n *\n * const id = await idGenerator.generateNextId({ table: \"users\" }); // one id\n * const ids = await idGenerator.generateNextIds({ table: \"users\", count: 100 }); // a block\n * ```\n */\nexport class MongoIdGenerator implements IdGeneratorContract {\n /**\n * The collection name that stores ID counters.\n * Each document tracks the last ID for a specific table.\n *\n * Named \"MasterMind\" for backward compatibility with legacy Cascade.\n */\n public readonly counterCollection: string = \"MasterMind\";\n\n /**\n * Memoized \"ensure unique index\" promise — the index is created at most once\n * per generator instance, before the first reservation completes.\n */\n private indexEnsured?: Promise<void>;\n\n /**\n * Create a new MongoDB ID generator instance.\n *\n * @param driver - The MongoDB driver instance\n * @param counterCollection - Name of the collection storing ID counters (default: \"MasterMind\")\n */\n public constructor(\n private readonly driver: MongoDbDriver,\n counterCollection?: string,\n ) {\n if (counterCollection) {\n this.counterCollection = counterCollection;\n }\n }\n\n /**\n * Generate the next ID for a table.\n *\n * Reserves a single id via one atomic `findOneAndUpdate` (see the class doc\n * for the atomicity / transaction contract). Equivalent to a block of size 1.\n *\n * @param options - Configuration for ID generation\n * @returns The generated ID\n *\n * @example\n * ```typescript\n * const id = await idGenerator.generateNextId({ table: \"users\", initialId: 1000 });\n * ```\n */\n public async generateNextId(options: GenerateIdOptions): Promise<number> {\n const { table, initialId = 1, incrementIdBy = 1 } = options;\n\n await this.ensureIndexes();\n\n return await this.reserveBlock(table, initialId, incrementIdBy, 1);\n }\n\n /**\n * Reserve a contiguous block of `count` ids in a single atomic operation.\n *\n * Advances the counter by `count * incrementIdBy` in one `findOneAndUpdate`\n * (so the stored last id becomes the block's last id) and returns the block\n * in ascending order. See the class doc for the non-transactional contract.\n *\n * @param options - `GenerateIdOptions` plus the block `count`\n * @returns The reserved ids in ascending order (length `count`)\n *\n * @example\n * ```typescript\n * const ids = await idGenerator.generateNextIds({ table: \"users\", count: 100 });\n * // ids[0] is the first id, ids[99] the last; getLastId(\"users\") === ids[99]\n * ```\n */\n public async generateNextIds(\n options: GenerateIdOptions & { count: number },\n ): Promise<number[]> {\n const { table, initialId = 1, incrementIdBy = 1, count } = options;\n\n if (count <= 0) {\n return [];\n }\n\n await this.ensureIndexes();\n\n const lastId = await this.reserveBlock(table, initialId, incrementIdBy, count);\n const firstId = lastId - (count - 1) * incrementIdBy;\n\n return Array.from({ length: count }, (_, index) => firstId + index * incrementIdBy);\n }\n\n /**\n * Atomically advance the counter for `table` by a whole block and return the\n * block's LAST id.\n *\n * One `findOneAndUpdate` with an aggregation pipeline:\n * - **Cold start** (counter field missing or null): seed `initialId + (count - 1) * incrementIdBy`\n * so the FIRST id of the block equals `initialId` (the `count - 1` here vs\n * `count` in the steady-state branch is deliberate — the counter stores the\n * last-issued id and the very first id must be exactly `initialId`).\n * - **Steady state**: add `count * incrementIdBy` to the stored counter.\n *\n * Retries on a duplicate-key error from the cold-start upsert race (see\n * {@link isDuplicateKeyError}).\n *\n * @param table - The table/collection the block is for\n * @param initialId - The first id ever issued for this table\n * @param incrementIdBy - The fixed stride between ids\n * @param count - Block size (`>= 1`)\n * @returns The last id of the reserved block\n */\n private async reserveBlock(\n table: string,\n initialId: number,\n incrementIdBy: number,\n count: number,\n ): Promise<number> {\n const run = async (): Promise<number> => {\n const database = this.driver.getDatabase();\n const collection = database.collection(this.counterCollection);\n\n const result = await collection.findOneAndUpdate(\n { collection: table },\n [\n {\n $set: {\n id: {\n $cond: {\n // Cold start = the counter field is absent or null. Tested by\n // existence ($type), NOT truthiness — a legitimately stored\n // last-id of 0 (initialId: 0) must take the increment branch,\n // not be mistaken for an unset counter and re-issued.\n if: {\n $or: [{ $eq: [{ $type: \"$id\" }, \"missing\"] }, { $eq: [\"$id\", null] }],\n },\n then: initialId + (count - 1) * incrementIdBy,\n else: { $add: [\"$id\", count * incrementIdBy] },\n },\n },\n collection: table,\n },\n },\n ],\n {\n upsert: true,\n returnDocument: \"after\",\n },\n );\n\n const lastId = result?.id;\n\n if (typeof lastId !== \"number\") {\n throw new Error(\n `Failed to reserve an id block for \"${table}\": counter returned no id.`,\n );\n }\n\n return lastId;\n };\n\n return await this.withDuplicateKeyRetry(run);\n }\n\n /**\n * Run `operation`, retrying on a duplicate-key (E11000) error up to\n * {@link MAX_RESERVE_ATTEMPTS} times. Only the cold-start upsert race throws\n * E11000 (once the unique index exists); on retry the counter document\n * already exists, so the increment branch runs and succeeds. Any other error\n * is rethrown immediately.\n *\n * @param operation - The reservation to run\n * @returns The operation's result\n */\n private async withDuplicateKeyRetry<TResult>(\n operation: () => Promise<TResult>,\n ): Promise<TResult> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= MAX_RESERVE_ATTEMPTS; attempt++) {\n try {\n return await operation();\n } catch (error) {\n if (!isDuplicateKeyError(error)) {\n throw error;\n }\n\n lastError = error;\n }\n }\n\n throw lastError;\n }\n\n /**\n * Ensure the unique index on `{ collection: 1 }` exists (once per instance).\n *\n * Best-effort: a pre-existing duplicate counter document (created before this\n * index existed) makes index creation fail with E11000. We swallow that\n * rather than block app boot — without the index the generator degrades to\n * its prior (un-indexed) behavior, and the retry path becomes a no-op since\n * E11000 can no longer be raised by the upsert.\n */\n private async ensureIndexes(): Promise<void> {\n if (!this.indexEnsured) {\n this.indexEnsured = this.createCounterIndex();\n }\n\n return await this.indexEnsured;\n }\n\n /**\n * Create the unique index on the counter collection's `collection` field.\n * Failures are swallowed (see {@link ensureIndexes}).\n */\n private async createCounterIndex(): Promise<void> {\n try {\n const database = this.driver.getDatabase();\n await database.collection(this.counterCollection).createIndex(\n { collection: 1 },\n { unique: true, name: \"collection_unique\" },\n );\n } catch {\n // Best-effort — see ensureIndexes(). Degrade gracefully without the index.\n }\n }\n\n /**\n * Get the last generated ID for a table.\n *\n * @param table - The table/collection name\n * @returns The last generated ID, or 0 if none exists\n */\n public async getLastId(table: string): Promise<number> {\n const query = this.driver.queryBuilder(this.counterCollection);\n const doc = (await query.where(\"collection\", table).first()) as Record<string, unknown> | null;\n return (doc?.id as number) ?? 0;\n }\n\n /**\n * Set the last ID for a table.\n *\n * Creates or updates the counter document for the specified table. Useful for\n * seeding or resetting ID sequences.\n *\n * @param table - The table/collection name\n * @param id - The ID to set as the last generated ID\n *\n * @example\n * ```typescript\n * // Reset user IDs to start from 1000 (next generated id is 1001)\n * await idGenerator.setLastId(\"users\", 1000);\n * ```\n */\n public async setLastId(table: string, id: number): Promise<void> {\n await this.driver.update(\n this.counterCollection,\n { collection: table },\n { $set: { id, collection: table } },\n { upsert: true },\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mongodb-id-generator.mjs","names":[],"sources":["../../../../../../../../cascade/src/drivers/mongodb/mongodb-id-generator.ts"],"sourcesContent":["import type { GenerateIdOptions, IdGeneratorContract } from \"../../contracts\";\nimport type { MongoDbDriver } from \"./mongodb-driver\";\n\n/** Number of times a reservation retries after a duplicate-key (E11000) error. */\nconst MAX_RESERVE_ATTEMPTS = 3;\n\n/** MongoDB duplicate-key error code. */\nconst DUPLICATE_KEY_ERROR_CODE = 11000;\n\n/**\n * Is `error` a MongoDB duplicate-key (E11000) error?\n *\n * Raised when two concurrent first-time upserts race to create the same\n * counter document once the unique index on `{ collection: 1 }` exists.\n */\nfunction isDuplicateKeyError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as { code?: number }).code === DUPLICATE_KEY_ERROR_CODE\n );\n}\n\n/**\n * MongoDB-specific ID generator for auto-incrementing integer IDs.\n *\n * Maintains a separate collection that tracks the last generated ID for each\n * table, mimicking SQL's `AUTO_INCREMENT` / `SERIAL`.\n *\n * **Collection Structure:**\n * ```json\n * { \"collection\": \"users\", \"id\": 12345 }\n * ```\n *\n * **Atomicity & concurrency:**\n * - Each id (or block of ids) is reserved with a SINGLE atomic\n * `findOneAndUpdate` on one document; MongoDB serializes concurrent writes to\n * the same document, so concurrent callers receive distinct, non-overlapping\n * ids/blocks.\n * - A unique index on `{ collection: 1 }` is ensured lazily (once per instance)\n * so two concurrent first-time upserts for a brand-new table can't create\n * duplicate counter documents; the loser of that race gets an E11000 and is\n * retried (by then the document exists, so it takes the increment branch).\n *\n * **Transactions — IMPORTANT:** the counter write is its OWN standalone,\n * immediately-durable operation. It does NOT join an ambient\n * `transaction()` session (it calls `findOneAndUpdate` directly without a\n * session). This is intentional and matches SQL `SERIAL` semantics: if the\n * surrounding transaction rolls back, the inserted records are undone but the\n * consumed id(s) are NOT — they remain a gap in the sequence. Do not rely on\n * id reservation being rolled back with a transaction.\n *\n * @example\n * ```typescript\n * const idGenerator = new MongoIdGenerator(mongoDriver);\n *\n * const id = await idGenerator.generateNextId({ table: \"users\" }); // one id\n * const ids = await idGenerator.generateNextIds({ table: \"users\", count: 100 }); // a block\n * ```\n */\nexport class MongoIdGenerator implements IdGeneratorContract {\n /**\n * The collection name that stores ID counters.\n * Each document tracks the last ID for a specific table.\n *\n * Named \"MasterMind\" for backward compatibility with legacy Cascade.\n */\n public readonly counterCollection: string = \"MasterMind\";\n\n /**\n * Memoized \"ensure unique index\" promise — the index is created at most once\n * per generator instance, before the first reservation completes.\n */\n private indexEnsured?: Promise<void>;\n\n /**\n * Create a new MongoDB ID generator instance.\n *\n * @param driver - The MongoDB driver instance\n * @param counterCollection - Name of the collection storing ID counters (default: \"MasterMind\")\n */\n public constructor(\n private readonly driver: MongoDbDriver,\n counterCollection?: string,\n ) {\n if (counterCollection) {\n this.counterCollection = counterCollection;\n }\n }\n\n /**\n * Generate the next ID for a table.\n *\n * Reserves a single id via one atomic `findOneAndUpdate` (see the class doc\n * for the atomicity / transaction contract). Equivalent to a block of size 1.\n *\n * @param options - Configuration for ID generation\n * @returns The generated ID\n *\n * @example\n * ```typescript\n * const id = await idGenerator.generateNextId({ table: \"users\", initialId: 1000 });\n * ```\n */\n public async generateNextId(options: GenerateIdOptions): Promise<number> {\n const { table, initialId = 1, incrementIdBy = 1 } = options;\n\n await this.ensureIndexes();\n\n return await this.reserveBlock(table, initialId, incrementIdBy, 1);\n }\n\n /**\n * Reserve a contiguous block of `count` ids in a single atomic operation.\n *\n * Advances the counter by `count * incrementIdBy` in one `findOneAndUpdate`\n * (so the stored last id becomes the block's last id) and returns the block\n * in ascending order. See the class doc for the non-transactional contract.\n *\n * @param options - `GenerateIdOptions` plus the block `count`\n * @returns The reserved ids in ascending order (length `count`)\n *\n * @example\n * ```typescript\n * const ids = await idGenerator.generateNextIds({ table: \"users\", count: 100 });\n * // ids[0] is the first id, ids[99] the last; getLastId(\"users\") === ids[99]\n * ```\n */\n public async generateNextIds(\n options: GenerateIdOptions & { count: number },\n ): Promise<number[]> {\n const { table, initialId = 1, incrementIdBy = 1, count } = options;\n\n if (count <= 0) {\n return [];\n }\n\n await this.ensureIndexes();\n\n const lastId = await this.reserveBlock(table, initialId, incrementIdBy, count);\n const firstId = lastId - (count - 1) * incrementIdBy;\n\n return Array.from({ length: count }, (_, index) => firstId + index * incrementIdBy);\n }\n\n /**\n * Atomically advance the counter for `table` by a whole block and return the\n * block's LAST id.\n *\n * One `findOneAndUpdate` with an aggregation pipeline:\n * - **Cold start** (counter field missing or null): seed `initialId + (count - 1) * incrementIdBy`\n * so the FIRST id of the block equals `initialId` (the `count - 1` here vs\n * `count` in the steady-state branch is deliberate — the counter stores the\n * last-issued id and the very first id must be exactly `initialId`).\n * - **Steady state**: add `count * incrementIdBy` to the stored counter.\n *\n * Retries on a duplicate-key error from the cold-start upsert race (see\n * {@link isDuplicateKeyError}).\n *\n * @param table - The table/collection the block is for\n * @param initialId - The first id ever issued for this table\n * @param incrementIdBy - The fixed stride between ids\n * @param count - Block size (`>= 1`)\n * @returns The last id of the reserved block\n */\n private async reserveBlock(\n table: string,\n initialId: number,\n incrementIdBy: number,\n count: number,\n ): Promise<number> {\n const run = async (): Promise<number> => {\n const database = this.driver.getDatabase();\n const collection = database.collection(this.counterCollection);\n\n const result = await collection.findOneAndUpdate(\n { collection: table },\n [\n {\n $set: {\n id: {\n $cond: {\n // Cold start = the counter field is absent or null. Tested by\n // existence ($type), NOT truthiness — a legitimately stored\n // last-id of 0 (initialId: 0) must take the increment branch,\n // not be mistaken for an unset counter and re-issued.\n if: {\n $or: [{ $eq: [{ $type: \"$id\" }, \"missing\"] }, { $eq: [\"$id\", null] }],\n },\n then: initialId + (count - 1) * incrementIdBy,\n else: { $add: [\"$id\", count * incrementIdBy] },\n },\n },\n collection: table,\n },\n },\n ],\n {\n upsert: true,\n returnDocument: \"after\",\n },\n );\n\n const lastId = result?.id;\n\n if (typeof lastId !== \"number\") {\n throw new Error(\n `Failed to reserve an id block for \"${table}\": counter returned no id.`,\n );\n }\n\n return lastId;\n };\n\n return await this.withDuplicateKeyRetry(run);\n }\n\n /**\n * Run `operation`, retrying on a duplicate-key (E11000) error up to\n * {@link MAX_RESERVE_ATTEMPTS} times. Only the cold-start upsert race throws\n * E11000 (once the unique index exists); on retry the counter document\n * already exists, so the increment branch runs and succeeds. Any other error\n * is rethrown immediately.\n *\n * @param operation - The reservation to run\n * @returns The operation's result\n */\n private async withDuplicateKeyRetry<TResult>(\n operation: () => Promise<TResult>,\n ): Promise<TResult> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= MAX_RESERVE_ATTEMPTS; attempt++) {\n try {\n return await operation();\n } catch (error) {\n if (!isDuplicateKeyError(error)) {\n throw error;\n }\n\n lastError = error;\n }\n }\n\n throw lastError;\n }\n\n /**\n * Ensure the unique index on `{ collection: 1 }` exists (once per instance).\n *\n * Best-effort: a pre-existing duplicate counter document (created before this\n * index existed) makes index creation fail with E11000. We swallow that\n * rather than block app boot — without the index the generator degrades to\n * its prior (un-indexed) behavior, and the retry path becomes a no-op since\n * E11000 can no longer be raised by the upsert.\n */\n private async ensureIndexes(): Promise<void> {\n if (!this.indexEnsured) {\n this.indexEnsured = this.createCounterIndex();\n }\n\n return await this.indexEnsured;\n }\n\n /**\n * Create the unique index on the counter collection's `collection` field.\n * Failures are swallowed (see {@link ensureIndexes}).\n */\n private async createCounterIndex(): Promise<void> {\n try {\n const database = this.driver.getDatabase();\n await database.collection(this.counterCollection).createIndex(\n { collection: 1 },\n { unique: true, name: \"collection_unique\" },\n );\n } catch {\n // Best-effort — see ensureIndexes(). Degrade gracefully without the index.\n }\n }\n\n /**\n * Get the last generated ID for a table.\n *\n * @param table - The table/collection name\n * @returns The last generated ID, or 0 if none exists\n */\n public async getLastId(table: string): Promise<number> {\n const query = this.driver.queryBuilder(this.counterCollection);\n const doc = (await query.where(\"collection\", table).first()) as Record<string, unknown> | null;\n return (doc?.id as number) ?? 0;\n }\n\n /**\n * Set the last ID for a table.\n *\n * Creates or updates the counter document for the specified table. Useful for\n * seeding or resetting ID sequences.\n *\n * @param table - The table/collection name\n * @param id - The ID to set as the last generated ID\n *\n * @example\n * ```typescript\n * // Reset user IDs to start from 1000 (next generated id is 1001)\n * await idGenerator.setLastId(\"users\", 1000);\n * ```\n */\n public async setLastId(table: string, id: number): Promise<void> {\n await this.driver.update(\n this.counterCollection,\n { collection: table },\n { $set: { id, collection: table } },\n { upsert: true },\n );\n }\n}\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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"}
@@ -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":"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"}
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 +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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"}