@rebasepro/server-mongodb 0.0.1-canary.4d4fb3e

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 (125) hide show
  1. package/LICENSE +6 -0
  2. package/dist/index.es.js +875 -0
  3. package/dist/index.es.js.map +1 -0
  4. package/dist/index.umd.js +878 -0
  5. package/dist/index.umd.js.map +1 -0
  6. package/dist/server-mongodb/src/connection.d.ts +35 -0
  7. package/dist/server-mongodb/src/connection.d.ts.map +1 -0
  8. package/dist/server-mongodb/src/db/MongoConditionBuilder.d.ts +64 -0
  9. package/dist/server-mongodb/src/db/MongoConditionBuilder.d.ts.map +1 -0
  10. package/dist/server-mongodb/src/db/MongoEntityService.d.ts +98 -0
  11. package/dist/server-mongodb/src/db/MongoEntityService.d.ts.map +1 -0
  12. package/dist/server-mongodb/src/factory.d.ts +139 -0
  13. package/dist/server-mongodb/src/factory.d.ts.map +1 -0
  14. package/dist/server-mongodb/src/index.d.ts +17 -0
  15. package/dist/server-mongodb/src/index.d.ts.map +1 -0
  16. package/dist/server-mongodb/src/services/MongoDriver.d.ts +81 -0
  17. package/dist/server-mongodb/src/services/MongoDriver.d.ts.map +1 -0
  18. package/dist/server-mongodb/src/services/MongoRealtimeService.d.ts +65 -0
  19. package/dist/server-mongodb/src/services/MongoRealtimeService.d.ts.map +1 -0
  20. package/dist/server-mongodb/src/useMongoDriver.d.ts +18 -0
  21. package/dist/server-mongodb/src/useMongoDriver.d.ts.map +1 -0
  22. package/dist/server-mongodb/src/utils.d.ts +10 -0
  23. package/dist/server-mongodb/src/utils.d.ts.map +1 -0
  24. package/dist/types/src/controllers/analytics_controller.d.ts +8 -0
  25. package/dist/types/src/controllers/analytics_controller.d.ts.map +1 -0
  26. package/dist/types/src/controllers/auth.d.ts +118 -0
  27. package/dist/types/src/controllers/auth.d.ts.map +1 -0
  28. package/dist/types/src/controllers/client.d.ts +59 -0
  29. package/dist/types/src/controllers/client.d.ts.map +1 -0
  30. package/dist/types/src/controllers/collection_registry.d.ts +45 -0
  31. package/dist/types/src/controllers/collection_registry.d.ts.map +1 -0
  32. package/dist/types/src/controllers/customization_controller.d.ts +55 -0
  33. package/dist/types/src/controllers/customization_controller.d.ts.map +1 -0
  34. package/dist/types/src/controllers/data.d.ts +142 -0
  35. package/dist/types/src/controllers/data.d.ts.map +1 -0
  36. package/dist/types/src/controllers/data_driver.d.ts +169 -0
  37. package/dist/types/src/controllers/data_driver.d.ts.map +1 -0
  38. package/dist/types/src/controllers/database_admin.d.ts +12 -0
  39. package/dist/types/src/controllers/database_admin.d.ts.map +1 -0
  40. package/dist/types/src/controllers/dialogs_controller.d.ts +37 -0
  41. package/dist/types/src/controllers/dialogs_controller.d.ts.map +1 -0
  42. package/dist/types/src/controllers/effective_role.d.ts +5 -0
  43. package/dist/types/src/controllers/effective_role.d.ts.map +1 -0
  44. package/dist/types/src/controllers/index.d.ts +18 -0
  45. package/dist/types/src/controllers/index.d.ts.map +1 -0
  46. package/dist/types/src/controllers/local_config_persistence.d.ts +21 -0
  47. package/dist/types/src/controllers/local_config_persistence.d.ts.map +1 -0
  48. package/dist/types/src/controllers/navigation.d.ts +214 -0
  49. package/dist/types/src/controllers/navigation.d.ts.map +1 -0
  50. package/dist/types/src/controllers/registry.d.ts +52 -0
  51. package/dist/types/src/controllers/registry.d.ts.map +1 -0
  52. package/dist/types/src/controllers/side_dialogs_controller.d.ts +68 -0
  53. package/dist/types/src/controllers/side_dialogs_controller.d.ts.map +1 -0
  54. package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
  55. package/dist/types/src/controllers/side_entity_controller.d.ts.map +1 -0
  56. package/dist/types/src/controllers/snackbar.d.ts +25 -0
  57. package/dist/types/src/controllers/snackbar.d.ts.map +1 -0
  58. package/dist/types/src/controllers/storage.d.ts +174 -0
  59. package/dist/types/src/controllers/storage.d.ts.map +1 -0
  60. package/dist/types/src/index.d.ts +5 -0
  61. package/dist/types/src/index.d.ts.map +1 -0
  62. package/dist/types/src/rebase_context.d.ts +102 -0
  63. package/dist/types/src/rebase_context.d.ts.map +1 -0
  64. package/dist/types/src/types/backend.d.ts +534 -0
  65. package/dist/types/src/types/backend.d.ts.map +1 -0
  66. package/dist/types/src/types/builders.d.ts +15 -0
  67. package/dist/types/src/types/builders.d.ts.map +1 -0
  68. package/dist/types/src/types/chips.d.ts +6 -0
  69. package/dist/types/src/types/chips.d.ts.map +1 -0
  70. package/dist/types/src/types/collections.d.ts +813 -0
  71. package/dist/types/src/types/collections.d.ts.map +1 -0
  72. package/dist/types/src/types/data_source.d.ts +65 -0
  73. package/dist/types/src/types/data_source.d.ts.map +1 -0
  74. package/dist/types/src/types/entities.d.ts +146 -0
  75. package/dist/types/src/types/entities.d.ts.map +1 -0
  76. package/dist/types/src/types/entity_actions.d.ts +99 -0
  77. package/dist/types/src/types/entity_actions.d.ts.map +1 -0
  78. package/dist/types/src/types/entity_callbacks.d.ts +174 -0
  79. package/dist/types/src/types/entity_callbacks.d.ts.map +1 -0
  80. package/dist/types/src/types/entity_link_builder.d.ts +8 -0
  81. package/dist/types/src/types/entity_link_builder.d.ts.map +1 -0
  82. package/dist/types/src/types/entity_overrides.d.ts +10 -0
  83. package/dist/types/src/types/entity_overrides.d.ts.map +1 -0
  84. package/dist/types/src/types/entity_views.d.ts +62 -0
  85. package/dist/types/src/types/entity_views.d.ts.map +1 -0
  86. package/dist/types/src/types/export_import.d.ts +22 -0
  87. package/dist/types/src/types/export_import.d.ts.map +1 -0
  88. package/dist/types/src/types/index.d.ts +23 -0
  89. package/dist/types/src/types/index.d.ts.map +1 -0
  90. package/dist/types/src/types/locales.d.ts +5 -0
  91. package/dist/types/src/types/locales.d.ts.map +1 -0
  92. package/dist/types/src/types/modify_collections.d.ts +6 -0
  93. package/dist/types/src/types/modify_collections.d.ts.map +1 -0
  94. package/dist/types/src/types/plugins.d.ts +226 -0
  95. package/dist/types/src/types/plugins.d.ts.map +1 -0
  96. package/dist/types/src/types/properties.d.ts +1092 -0
  97. package/dist/types/src/types/properties.d.ts.map +1 -0
  98. package/dist/types/src/types/property_config.d.ts +71 -0
  99. package/dist/types/src/types/property_config.d.ts.map +1 -0
  100. package/dist/types/src/types/relations.d.ts +337 -0
  101. package/dist/types/src/types/relations.d.ts.map +1 -0
  102. package/dist/types/src/types/slots.d.ts +229 -0
  103. package/dist/types/src/types/slots.d.ts.map +1 -0
  104. package/dist/types/src/types/translations.d.ts +827 -0
  105. package/dist/types/src/types/translations.d.ts.map +1 -0
  106. package/dist/types/src/types/user_management_delegate.d.ts +121 -0
  107. package/dist/types/src/types/user_management_delegate.d.ts.map +1 -0
  108. package/dist/types/src/types/websockets.d.ts +79 -0
  109. package/dist/types/src/types/websockets.d.ts.map +1 -0
  110. package/dist/types/src/users/index.d.ts +3 -0
  111. package/dist/types/src/users/index.d.ts.map +1 -0
  112. package/dist/types/src/users/roles.d.ts +23 -0
  113. package/dist/types/src/users/roles.d.ts.map +1 -0
  114. package/dist/types/src/users/user.d.ts +47 -0
  115. package/dist/types/src/users/user.d.ts.map +1 -0
  116. package/package.json +81 -0
  117. package/src/connection.ts +60 -0
  118. package/src/db/MongoConditionBuilder.ts +181 -0
  119. package/src/db/MongoEntityService.ts +350 -0
  120. package/src/factory.ts +274 -0
  121. package/src/index.ts +24 -0
  122. package/src/services/MongoDriver.ts +267 -0
  123. package/src/services/MongoRealtimeService.ts +295 -0
  124. package/src/useMongoDriver.ts +516 -0
  125. package/src/utils.ts +28 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/connection.ts","../src/db/MongoConditionBuilder.ts","../src/db/MongoEntityService.ts","../src/services/MongoRealtimeService.ts","../src/services/MongoDriver.ts","../src/factory.ts"],"sourcesContent":["/**\n * MongoDB Connection\n *\n * Wraps MongoDB connection to implement the DatabaseConnection interface.\n */\n\nimport { Db, MongoClient } from \"mongodb\";\nimport { DatabaseConnection } from \"@rebasepro/types\";\n\n/**\n * MongoDB database connection wrapper that implements DatabaseConnection interface.\n */\nexport class MongoDBConnection implements DatabaseConnection {\n readonly type = \"mongodb\";\n\n constructor(\n public readonly db: Db,\n public readonly client: MongoClient\n ) { }\n\n get isConnected(): boolean {\n // MongoClient doesn't have a direct isConnected property in v6+\n // We check if the client topology is connected\n try {\n const clientInternal = this.client as unknown as Record<string, { isConnected?: () => boolean } | undefined>;\n return clientInternal.topology?.isConnected?.() ?? false;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n await this.client.close();\n }\n}\n\n/**\n * Create a MongoDB database connection from a connection string.\n *\n * @param connectionString - MongoDB connection string (e.g., mongodb://localhost:27017)\n * @param databaseName - Name of the database to use\n * @returns Promise resolving to MongoDBConnection\n *\n * @example\n * ```typescript\n * const connection = await createMongoDBConnection(\n * \"mongodb://localhost:27017\",\n * \"my_database\"\n * );\n * ```\n */\nexport async function createMongoDBConnection(\n connectionString: string,\n databaseName: string\n): Promise<MongoDBConnection> {\n const client = new MongoClient(connectionString);\n await client.connect();\n const db = client.db(databaseName);\n return new MongoDBConnection(db, client);\n}\n","/**\n * MongoDB Condition Builder\n *\n * Translates Rebase filter conditions to MongoDB query operators.\n */\n\nimport { FilterValues, WhereFilterOp } from \"@rebasepro/types\";\nimport { Filter, Document } from \"mongodb\";\n\n/**\n * Mapping from Rebase filter operators to MongoDB query operators\n */\nconst REBASE_TO_MONGO_OP: Record<WhereFilterOp, string> = {\n \"<\": \"$lt\",\n \"<=\": \"$lte\",\n \"==\": \"$eq\",\n \"!=\": \"$ne\",\n \">=\": \"$gte\",\n \">\": \"$gt\",\n \"array-contains\": \"$elemMatch\",\n \"array-contains-any\": \"$in\",\n \"in\": \"$in\",\n \"not-in\": \"$nin\"\n};\n\n/**\n * MongoDB Condition Builder\n *\n * Provides static methods to translate Rebase filter conditions\n * to MongoDB query filters.\n */\nexport class MongoConditionBuilder {\n /**\n * Build MongoDB filter conditions from Rebase FilterValues\n *\n * @param filter - Rebase filter values\n * @returns Array of MongoDB filter objects\n */\n static buildFilterConditions<M extends Record<string, any>>(\n filter: FilterValues<Extract<keyof M, string>>\n ): Filter<Document>[] {\n if (!filter) return [];\n\n const conditions: Filter<Document>[] = [];\n\n for (const [field, filterParam] of Object.entries(filter)) {\n if (!filterParam) continue;\n\n const [op, value] = filterParam as [WhereFilterOp, any];\n const mongoOp = REBASE_TO_MONGO_OP[op];\n\n if (!mongoOp) {\n console.warn(`Unsupported filter operator: ${op}`);\n continue;\n }\n\n // Handle array-contains specially\n if (op === \"array-contains\") {\n conditions.push({\n [field]: { $elemMatch: { $eq: value } }\n });\n } else {\n conditions.push({\n [field]: { [mongoOp]: value }\n });\n }\n }\n\n return conditions;\n }\n\n /**\n * Build search conditions for text search\n *\n * @param searchString - Text to search for\n * @param properties - Properties to search in\n * @returns Array of MongoDB filter objects for text search\n */\n static buildSearchConditions(\n searchString: string,\n properties: Record<string, any>\n ): Filter<Document>[] {\n if (!searchString) return [];\n\n // Build regex conditions for each searchable string property\n const orConditions: Filter<Document>[] = [];\n const searchRegex = new RegExp(searchString, \"i\");\n\n for (const [key, prop] of Object.entries(properties)) {\n // Only search in string-type properties\n if (prop?.dataType === \"string\" || typeof prop === \"string\") {\n orConditions.push({\n [key]: { $regex: searchRegex }\n });\n }\n }\n\n // If no properties to search, use MongoDB text search\n if (orConditions.length === 0) {\n return [{ $text: { $search: searchString } }];\n }\n\n return orConditions;\n }\n\n /**\n * Combine multiple conditions with AND operator\n *\n * @param conditions - Array of filter conditions\n * @returns Combined filter or undefined if empty\n */\n static combineConditionsWithAnd(conditions: Filter<Document>[]): Filter<Document> | undefined {\n if (conditions.length === 0) return undefined;\n if (conditions.length === 1) return conditions[0];\n return { $and: conditions };\n }\n\n /**\n * Combine multiple conditions with OR operator\n *\n * @param conditions - Array of filter conditions\n * @returns Combined filter or undefined if empty\n */\n static combineConditionsWithOr(conditions: Filter<Document>[]): Filter<Document> | undefined {\n if (conditions.length === 0) return undefined;\n if (conditions.length === 1) return conditions[0];\n return { $or: conditions };\n }\n\n /**\n * Build a complete MongoDB query from Rebase options\n *\n * @param options - Rebase fetch options\n * @returns MongoDB filter object\n */\n static buildQuery<M extends Record<string, any>>(options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n searchString?: string;\n properties?: Record<string, any>;\n }): Filter<Document> {\n const conditions: Filter<Document>[] = [];\n\n // Add filter conditions\n if (options.filter) {\n const filterConditions = this.buildFilterConditions<M>(options.filter);\n conditions.push(...filterConditions);\n }\n\n // Add search conditions\n if (options.searchString && options.properties) {\n const searchConditions = this.buildSearchConditions(\n options.searchString,\n options.properties\n );\n if (searchConditions.length > 0) {\n // Search conditions are OR'd together\n const searchFilter = this.combineConditionsWithOr(searchConditions);\n if (searchFilter) {\n conditions.push(searchFilter);\n }\n }\n }\n\n return this.combineConditionsWithAnd(conditions) ?? {};\n }\n\n /**\n * Build MongoDB sort options from Rebase options\n *\n * @param orderBy - Field to order by\n * @param order - Sort direction\n * @returns MongoDB sort object\n */\n static buildSort(\n orderBy?: string,\n order?: \"asc\" | \"desc\"\n ): Record<string, 1 | -1> | undefined {\n if (!orderBy) return undefined;\n return { [orderBy]: order === \"desc\" ? -1 : 1 };\n }\n}\n","/**\n * MongoDB Entity Service\n *\n * Implements EntityRepository interface for MongoDB.\n * Provides all CRUD operations for entities.\n */\n\nimport { Db, ObjectId, Collection, Document, FindOptions, Filter } from \"mongodb\";\nimport { Entity, FilterValues, EntityRepository, EntityCollection } from \"@rebasepro/types\";\nimport { MongoConditionBuilder } from \"./MongoConditionBuilder\";\n\n/**\n * MongoDB Entity Service\n *\n * Implements the EntityRepository interface for MongoDB.\n * Provides all CRUD operations for entities stored in MongoDB collections.\n */\nexport class MongoEntityService implements EntityRepository {\n constructor(private db: Db) { }\n\n /**\n * Get a MongoDB collection by its path\n */\n private getCollection(collectionPath: string): Collection<Document> {\n // Handle nested paths (e.g., \"posts/123/comments\" -> \"posts_123_comments\")\n const collectionName = collectionPath.replace(/\\//g, \"_\");\n return this.db.collection(collectionName);\n }\n\n /**\n * Convert a string ID to ObjectId if it's a valid ObjectId string\n */\n private toObjectId(id: string | number): ObjectId | string | number {\n if (typeof id === \"string\" && ObjectId.isValid(id) && id.length === 24) {\n return new ObjectId(id);\n }\n return id;\n }\n\n /**\n * Convert a MongoDB document to a Rebase Entity\n */\n private documentToEntity<M extends Record<string, any>>(\n doc: Document,\n path: string\n ): Entity<M> {\n const { _id, ...values } = doc;\n return {\n id: _id.toString(),\n path,\n values: this.convertFromMongoValues(values) as M\n };\n }\n\n /**\n * Convert values from MongoDB format to Rebase format\n */\n private convertFromMongoValues(values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(values)) {\n result[key] = this.convertFromMongoValue(value);\n }\n\n return result;\n }\n\n /**\n * Convert a single value from MongoDB format\n */\n private convertFromMongoValue(value: any): any {\n if (value === null || value === undefined) return value;\n\n // Handle ObjectId\n if (value instanceof ObjectId) {\n return value.toString();\n }\n\n // Handle Date\n if (value instanceof Date) {\n return value;\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(v => this.convertFromMongoValue(v));\n }\n\n // Handle EntityReference-like objects\n if (typeof value === \"object\" && \"path\" in value && \"id\" in value) {\n return {\n path: value.path,\n id: value.id instanceof ObjectId ? value.id.toString() : value.id\n };\n }\n\n // Handle nested objects\n if (typeof value === \"object\") {\n return this.convertFromMongoValues(value);\n }\n\n return value;\n }\n\n /**\n * Convert values to MongoDB format for storage\n */\n private convertToMongoValues(values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(values)) {\n result[key] = this.convertToMongoValue(value);\n }\n\n return result;\n }\n\n /**\n * Convert a single value to MongoDB format\n */\n private convertToMongoValue(value: any): any {\n if (value === null || value === undefined) return value;\n\n // Handle EntityReference\n if (typeof value === \"object\" && value.isEntityReference?.()) {\n return {\n id: ObjectId.isValid(value.id) ? new ObjectId(value.id) : value.id,\n path: value.path\n };\n }\n\n // Handle Date\n if (value instanceof Date) {\n return value;\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(v => this.convertToMongoValue(v));\n }\n\n // Handle nested objects\n if (typeof value === \"object\") {\n return this.convertToMongoValues(value);\n }\n\n return value;\n }\n\n // =============================================================\n // EntityRepository Implementation\n // =============================================================\n\n /**\n * Fetch a single entity by ID\n */\n async fetchEntity<M extends Record<string, any>>(\n collectionPath: string,\n entityId: string | number,\n _databaseId?: string\n ): Promise<Entity<M> | undefined> {\n const collection = this.getCollection(collectionPath);\n const id = this.toObjectId(entityId);\n\n const doc = await collection.findOne({ _id: id } as Filter<Document>);\n\n if (!doc) return undefined;\n\n return this.documentToEntity<M>(doc, collectionPath);\n }\n\n /**\n * Fetch a collection of entities with optional filtering, ordering, and pagination\n */\n async fetchCollection<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: any;\n searchString?: string;\n databaseId?: string;\n collection?: EntityCollection;\n } = {}\n ): Promise<Entity<M>[]> {\n const collection = this.getCollection(collectionPath);\n\n // Build query\n const query = MongoConditionBuilder.buildQuery<M>({\n filter: options.filter,\n searchString: options.searchString,\n properties: options.collection?.properties ?? {}\n });\n\n // Build find options\n const findOptions: FindOptions<Document> = {};\n\n // Apply sorting\n const sort = MongoConditionBuilder.buildSort(options.orderBy, options.order);\n if (sort) {\n findOptions.sort = sort;\n }\n\n // Apply limit\n if (options.limit) {\n findOptions.limit = options.limit;\n }\n\n // Apply pagination (skip-based for now, cursor-based would be better)\n if (options.startAfter !== undefined) {\n findOptions.skip = Number(options.startAfter);\n }\n\n const docs = await collection.find(query, findOptions).toArray();\n\n return docs.map((doc: Document) => this.documentToEntity<M>(doc, collectionPath));\n }\n\n /**\n * Search entities by text\n */\n async searchEntities<M extends Record<string, any>>(\n collectionPath: string,\n searchString: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n databaseId?: string;\n collection?: EntityCollection;\n } = {}\n ): Promise<Entity<M>[]> {\n return this.fetchCollection<M>(collectionPath, {\n ...options,\n searchString\n });\n }\n\n /**\n * Count entities in a collection\n */\n async countEntities<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n databaseId?: string;\n } = {}\n ): Promise<number> {\n const collection = this.getCollection(collectionPath);\n\n const query = options.filter\n ? MongoConditionBuilder.buildQuery<M>({ filter: options.filter })\n : {};\n\n return collection.countDocuments(query);\n }\n\n /**\n * Save an entity (create or update)\n */\n async saveEntity<M extends Record<string, any>>(\n collectionPath: string,\n values: Partial<M>,\n entityId?: string | number,\n _databaseId?: string\n ): Promise<Entity<M>> {\n const collection = this.getCollection(collectionPath);\n const mongoValues = this.convertToMongoValues(values as Record<string, any>);\n\n if (entityId) {\n // Update existing entity\n const id = this.toObjectId(entityId);\n await collection.updateOne(\n { _id: id } as Filter<Document>,\n { $set: mongoValues },\n { upsert: true }\n );\n\n return {\n id: entityId.toString(),\n path: collectionPath,\n values: values as M\n };\n } else {\n // Create new entity\n const newId = new ObjectId();\n await collection.insertOne({\n _id: newId,\n ...mongoValues\n });\n\n return {\n id: newId.toString(),\n path: collectionPath,\n values: values as M\n };\n }\n }\n\n /**\n * Delete an entity by ID\n */\n async deleteEntity(\n collectionPath: string,\n entityId: string | number,\n _databaseId?: string\n ): Promise<void> {\n const collection = this.getCollection(collectionPath);\n const id = this.toObjectId(entityId);\n\n const result = await collection.deleteOne({ _id: id } as Filter<Document>);\n\n if (result.deletedCount === 0) {\n console.warn(`Entity ${entityId} not found in collection ${collectionPath}`);\n }\n }\n\n /**\n * Check if a field value is unique in a collection\n */\n async checkUniqueField(\n collectionPath: string,\n fieldName: string,\n value: any,\n excludeEntityId?: string,\n _databaseId?: string\n ): Promise<boolean> {\n const collection = this.getCollection(collectionPath);\n\n const query: Filter<Document> = { [fieldName]: value };\n\n if (excludeEntityId) {\n const id = this.toObjectId(excludeEntityId);\n (query as Record<string, unknown>)._id = { $ne: id };\n }\n\n const count = await collection.countDocuments(query);\n return count === 0;\n }\n\n /**\n * Generate a new entity ID\n */\n generateEntityId(): string {\n return new ObjectId().toString();\n }\n}\n","/**\n * MongoDB Realtime Service\n *\n * Implements RealtimeProvider interface using MongoDB Change Streams.\n * Provides real-time subscriptions to collection and entity changes.\n */\n\nimport { Db, ChangeStream, ChangeStreamDocument, Document, ObjectId } from \"mongodb\";\nimport {\n Entity,\n FilterValues,\n RealtimeProvider,\n CollectionSubscriptionConfig,\n EntitySubscriptionConfig,\n} from \"@rebasepro/types\";\nimport { MongoEntityService } from \"../db/MongoEntityService\";\n\ninterface Subscription {\n type: \"collection\" | \"entity\";\n config: CollectionSubscriptionConfig | EntitySubscriptionConfig;\n changeStream?: ChangeStream;\n callback?: (data: any) => void;\n}\n\n/**\n * MongoDB Realtime Service\n *\n * Implements real-time subscriptions using MongoDB Change Streams.\n * Requires MongoDB replica set for change streams to work.\n */\nexport class MongoRealtimeService implements RealtimeProvider {\n private subscriptions = new Map<string, Subscription>();\n private entityService: MongoEntityService;\n\n constructor(private db: Db) {\n this.entityService = new MongoEntityService(db);\n }\n\n /**\n * Get the collection name from a path\n */\n private getCollectionName(path: string): string {\n return path.replace(/\\//g, \"_\");\n }\n\n /**\n * Subscribe to collection changes\n */\n subscribeToCollection(\n subscriptionId: string,\n config: CollectionSubscriptionConfig,\n callback?: (entities: Entity[]) => void\n ): void {\n // Clean up existing subscription if any\n this.unsubscribe(subscriptionId);\n\n const collectionName = this.getCollectionName(config.path);\n const collection = this.db.collection(collectionName);\n\n // Build pipeline for change stream filtering\n const pipeline: Document[] = [];\n\n // Filter by operation types we care about\n pipeline.push({\n $match: {\n operationType: { $in: [\"insert\", \"update\", \"replace\", \"delete\"] }\n }\n });\n\n try {\n // Create change stream\n const changeStream = collection.watch(pipeline, {\n fullDocument: \"updateLookup\"\n });\n\n const subscription: Subscription = {\n type: \"collection\",\n config,\n changeStream,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyCollection(subscriptionId, config, callback);\n\n // Listen for changes\n changeStream.on(\"change\", async (change: ChangeStreamDocument) => {\n // Re-fetch the entire collection when any change happens\n // This is simpler and ensures consistent sorting/filtering\n await this.fetchAndNotifyCollection(subscriptionId, config, callback);\n });\n\n changeStream.on(\"error\", (error: Error) => {\n console.error(`Change stream error for subscription ${subscriptionId}:`, error);\n });\n\n } catch (error) {\n // Change streams might not be available (e.g., standalone MongoDB)\n console.warn(\"Change streams not available, falling back to polling:\", error);\n\n // Store subscription without change stream for manual notifications\n const subscription: Subscription = {\n type: \"collection\",\n config,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyCollection(subscriptionId, config, callback);\n }\n }\n\n /**\n * Fetch collection and notify callback\n */\n private async fetchAndNotifyCollection(\n subscriptionId: string,\n config: CollectionSubscriptionConfig,\n callback?: (entities: Entity[]) => void\n ): Promise<void> {\n try {\n const entities = await this.entityService.fetchCollection(config.path, {\n filter: config.filter as FilterValues<string> | undefined,\n orderBy: config.orderBy,\n order: config.order,\n limit: config.limit,\n startAfter: config.startAfter,\n searchString: config.searchString\n });\n\n if (callback) {\n callback(entities);\n }\n } catch (error) {\n console.error(`Error fetching collection for subscription ${subscriptionId}:`, error);\n }\n }\n\n /**\n * Subscribe to single entity changes\n */\n subscribeToEntity(\n subscriptionId: string,\n config: EntitySubscriptionConfig,\n callback?: (entity: Entity | null) => void\n ): void {\n // Clean up existing subscription if any\n this.unsubscribe(subscriptionId);\n\n const collectionName = this.getCollectionName(config.path);\n const collection = this.db.collection(collectionName);\n\n // Build pipeline to watch specific document\n const entityId = typeof config.entityId === \"string\" && ObjectId.isValid(config.entityId)\n ? new ObjectId(config.entityId)\n : config.entityId;\n\n const pipeline: Document[] = [\n {\n $match: {\n \"documentKey._id\": entityId,\n operationType: { $in: [\"insert\", \"update\", \"replace\", \"delete\"] }\n }\n }\n ];\n\n try {\n const changeStream = collection.watch(pipeline, {\n fullDocument: \"updateLookup\"\n });\n\n const subscription: Subscription = {\n type: \"entity\",\n config,\n changeStream,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyEntity(subscriptionId, config, callback);\n\n // Listen for changes\n changeStream.on(\"change\", async (change: ChangeStreamDocument) => {\n if (change.operationType === \"delete\") {\n if (callback) {\n callback(null);\n }\n } else {\n await this.fetchAndNotifyEntity(subscriptionId, config, callback);\n }\n });\n\n changeStream.on(\"error\", (error: Error) => {\n console.error(`Change stream error for subscription ${subscriptionId}:`, error);\n });\n\n } catch (error) {\n console.warn(\"Change streams not available, falling back to polling:\", error);\n\n const subscription: Subscription = {\n type: \"entity\",\n config,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyEntity(subscriptionId, config, callback);\n }\n }\n\n /**\n * Fetch entity and notify callback\n */\n private async fetchAndNotifyEntity(\n subscriptionId: string,\n config: EntitySubscriptionConfig,\n callback?: (entity: Entity | null) => void\n ): Promise<void> {\n try {\n const entity = await this.entityService.fetchEntity(config.path, config.entityId);\n\n if (callback) {\n callback(entity || null);\n }\n } catch (error) {\n console.error(`Error fetching entity for subscription ${subscriptionId}:`, error);\n }\n }\n\n /**\n * Unsubscribe from a subscription\n */\n unsubscribe(subscriptionId: string): void {\n const subscription = this.subscriptions.get(subscriptionId);\n if (subscription) {\n if (subscription.changeStream) {\n subscription.changeStream.close().catch(console.error);\n }\n this.subscriptions.delete(subscriptionId);\n }\n }\n\n /**\n * Notify all relevant subscribers of an entity update\n * This is called after save/delete operations to push updates\n */\n async notifyEntityUpdate(\n path: string,\n entityId: string,\n entity: Entity | null,\n _databaseId?: string\n ): Promise<void> {\n // Find all subscriptions that might be affected by this update\n for (const [subscriptionId, subscription] of this.subscriptions) {\n if (subscription.type === \"entity\") {\n const config = subscription.config as EntitySubscriptionConfig;\n if (config.path === path && config.entityId.toString() === entityId) {\n if (subscription.callback) {\n subscription.callback(entity);\n }\n }\n } else if (subscription.type === \"collection\") {\n const config = subscription.config as CollectionSubscriptionConfig;\n if (config.path === path) {\n // Re-fetch the collection to get updated data\n await this.fetchAndNotifyCollection(subscriptionId, config, subscription.callback);\n }\n }\n }\n }\n\n /**\n * Get all active subscriptions (for debugging)\n */\n getSubscriptions(): Map<string, Subscription> {\n return this.subscriptions;\n }\n\n /**\n * Close all subscriptions\n */\n async closeAll(): Promise<void> {\n for (const [subscriptionId] of this.subscriptions) {\n this.unsubscribe(subscriptionId);\n }\n }\n}\n","/**\n * MongoDB DataDriver Delegate\n *\n * Implements the DataDriver interface for Rebase frontend integration.\n * This is the main entry point for Rebase to interact with MongoDB.\n */\n\nimport { Db, ObjectId } from \"mongodb\";\nimport {\n DataDriver,\n DeleteEntityProps,\n Entity,\n EntityCollection,\n FetchCollectionProps,\n FetchEntityProps,\n ListenCollectionProps,\n ListenEntityProps,\n SaveEntityProps\n} from \"@rebasepro/types\";\nimport { MongoEntityService } from \"../db/MongoEntityService\";\nimport { MongoRealtimeService } from \"./MongoRealtimeService\";\n\n/**\n * MongoDB DataDriver Delegate\n *\n * Implements the DataDriver interface for Rebase.\n * Provides all data operations needed by the Rebase frontend.\n */\nexport class MongoDriver implements DataDriver {\n key = \"mongodb\";\n initialised = true;\n\n private entityService: MongoEntityService;\n private realtimeService: MongoRealtimeService;\n\n\n constructor(\n private db: Db,\n realtimeService?: MongoRealtimeService\n ) {\n this.entityService = new MongoEntityService(db);\n this.realtimeService = realtimeService ?? new MongoRealtimeService(db);\n }\n\n\n\n /**\n * Get the current timestamp\n */\n currentTime(): Date {\n return new Date();\n }\n\n /**\n * Fetch a collection of entities\n */\n async fetchCollection<M extends Record<string, any>>({\n path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order\n }: FetchCollectionProps<M>): Promise<Entity<M>[]> {\n return this.entityService.fetchCollection<M>(path, {\n filter,\n limit,\n startAfter,\n orderBy,\n order,\n searchString,\n collection: collection as unknown as EntityCollection\n });\n }\n\n /**\n * Listen to collection changes\n */\n listenCollection<M extends Record<string, any>>({\n path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order,\n onUpdate,\n onError\n }: ListenCollectionProps<M>): () => void {\n const subscriptionId = this.generateSubscriptionId();\n\n const callback = (entities: Entity<any>[]) => {\n try {\n onUpdate(entities as Entity<M>[]);\n } catch (error) {\n console.error(\"Error in collection update callback:\", error);\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n };\n\n this.realtimeService.subscribeToCollection(\n subscriptionId,\n {\n clientId: \"driver\",\n path,\n filter,\n orderBy,\n order,\n limit,\n startAfter,\n searchString\n },\n callback\n );\n\n // Return unsubscribe function\n return () => {\n this.realtimeService.unsubscribe(subscriptionId);\n };\n }\n\n /**\n * Fetch a single entity\n */\n async fetchEntity<M extends Record<string, any>>({\n path,\n entityId,\n databaseId,\n collection\n }: FetchEntityProps<M>): Promise<Entity<M> | undefined> {\n return this.entityService.fetchEntity<M>(path, entityId, databaseId);\n }\n\n /**\n * Listen to entity changes\n */\n listenEntity<M extends Record<string, any>>({\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void {\n const subscriptionId = this.generateSubscriptionId();\n\n const callback = (entity: Entity<any> | null) => {\n try {\n onUpdate(entity as Entity<M>);\n } catch (error) {\n console.error(\"Error in entity update callback:\", error);\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n };\n\n this.realtimeService.subscribeToEntity(\n subscriptionId,\n {\n clientId: \"driver\",\n path,\n entityId\n },\n callback\n );\n\n // Return unsubscribe function\n return () => {\n this.realtimeService.unsubscribe(subscriptionId);\n };\n }\n\n /**\n * Save an entity (create or update)\n */\n async saveEntity<M extends Record<string, any>>({\n path,\n entityId,\n values,\n collection,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> {\n const entity = await this.entityService.saveEntity<M>(path, values, entityId);\n\n // Notify subscribers of the update\n await this.realtimeService.notifyEntityUpdate(path, String(entity.id), entity);\n\n return entity;\n }\n\n /**\n * Delete an entity\n */\n async deleteEntity<M extends Record<string, any>>({\n entity,\n collection\n }: DeleteEntityProps<M>): Promise<void> {\n await this.entityService.deleteEntity(entity.path, entity.id);\n\n // Notify subscribers of the deletion\n await this.realtimeService.notifyEntityUpdate(entity.path, String(entity.id), null);\n }\n\n /**\n * Check if a field value is unique\n */\n async checkUniqueField(\n path: string,\n name: string,\n value: any,\n entityId?: string,\n collection?: EntityCollection\n ): Promise<boolean> {\n return this.entityService.checkUniqueField(path, name, value, entityId);\n }\n\n /**\n * Generate a new entity ID\n */\n generateEntityId(path: string, collection?: EntityCollection): string {\n return this.entityService.generateEntityId();\n }\n\n /**\n * Count entities in a collection\n */\n async countEntities<M extends Record<string, any>>({\n path,\n collection,\n filter\n }: FetchCollectionProps<M>): Promise<number> {\n return this.entityService.countEntities<M>(path, { filter });\n }\n\n /**\n * Generate a unique subscription ID\n */\n private generateSubscriptionId(): string {\n return `mongo_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Check if the delegate is ready\n */\n isReady(): boolean {\n return this.initialised;\n }\n\n /**\n * Get the underlying entity service for direct access\n */\n getEntityService(): MongoEntityService {\n return this.entityService;\n }\n\n /**\n * Get the underlying realtime service for direct access\n */\n getRealtimeService(): MongoRealtimeService {\n return this.realtimeService;\n }\n}\n","/**\n * MongoDB Backend Factory\n *\n * This module provides factory functions for creating MongoDB backend instances.\n * It abstracts the creation of drivers, realtime services, and entity services.\n */\n\nimport { Db, MongoClient } from \"mongodb\";\nimport { DataDriver, EntityCollection } from \"@rebasepro/types\";\n\nimport { MongoEntityService } from \"./db/MongoEntityService\";\nimport { MongoRealtimeService } from \"./services/MongoRealtimeService\";\nimport { MongoDriver } from \"./services/MongoDriver\";\nimport { MongoDBConnection } from \"./connection\";\nimport { BackendConfig, BackendInstance, CollectionRegistryInterface, EntityRepository, RealtimeProvider, DatabaseConnection, DatabaseAdmin, DocumentAdmin, SchemaAdmin, HealthCheckResult } from \"@rebasepro/types\";\n\n/**\n * Configuration for creating a MongoDB backend.\n */\nexport interface MongoBackendConfig extends BackendConfig {\n type: \"mongodb\";\n /** MongoDB database instance */\n connection: Db;\n /** MongoDB client (for connection management) */\n client: MongoClient;\n /** Collections to register (optional, can be registered later) */\n collections?: EntityCollection[];\n}\n\n/**\n * MongoDB-specific backend instance with additional MongoDB types.\n */\nexport interface MongoBackendInstance extends BackendInstance {\n /** The MongoDB database instance */\n db: Db;\n /** The MongoDB client */\n client: MongoClient;\n /** MongoDB DataDriver for use with Rebase */\n driver: DataDriver;\n /** Entity service for direct database operations */\n entityService: MongoEntityService;\n /** Realtime service for subscriptions */\n realtimeService: MongoRealtimeService;\n /** Admin capabilities (DocumentAdmin + SchemaAdmin) */\n admin: DatabaseAdmin;\n}\n\n// =============================================================================\n// Simple Collection Registry\n// =============================================================================\n\n/**\n * Simple in-memory collection registry for MongoDB.\n */\nexport class MongoCollectionRegistry implements CollectionRegistryInterface {\n private collections = new Map<string, EntityCollection>();\n\n /**\n * Register a collection\n */\n register(collection: EntityCollection): void {\n this.collections.set(collection.name, collection);\n }\n\n /**\n * Get a collection by its path\n */\n getCollectionByPath(path: string): EntityCollection | undefined {\n return this.collections.get(path);\n }\n\n /**\n * Get all registered collections\n */\n getCollections(): EntityCollection[] {\n return Array.from(this.collections.values());\n }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a complete MongoDB backend instance.\n *\n * This factory function creates all the necessary services for a MongoDB backend:\n * - MongoDBConnection (database connection wrapper)\n * - MongoEntityService (implements EntityRepository)\n * - MongoRealtimeService (implements RealtimeProvider)\n * - MongoCollectionRegistry (implements CollectionRegistryInterface)\n * - MongoDriver (for Rebase integration)\n *\n * @example\n * ```typescript\n * import { createMongoBackend } from \"@rebasepro/server-mongodb\";\n *\n * const client = new MongoClient(\"mongodb://localhost:27017\");\n * await client.connect();\n * const db = client.db(\"my_database\");\n *\n * const backend = createMongoBackend({\n * type: \"mongodb\",\n * connection: db,\n * client: client,\n * collections: myCollections\n * });\n *\n * // Use the backend\n * const entities = await backend.entityRepository.fetchCollection(\"users\", {});\n * ```\n */\nexport function createMongoBackend(config: MongoBackendConfig): MongoBackendInstance {\n const { connection: db, client, collections } = config;\n\n // Create collection registry\n const collectionRegistry = new MongoCollectionRegistry();\n\n // Register collections if provided\n if (collections) {\n collections.forEach(collection => collectionRegistry.register(collection));\n }\n\n // Create services\n const entityService = new MongoEntityService(db);\n const realtimeService = new MongoRealtimeService(db);\n const driver = new MongoDriver(db, realtimeService);\n const mongoConnection = new MongoDBConnection(db, client);\n\n // Build admin capabilities for MongoDB\n const admin: DatabaseAdmin = {\n async executeAggregate(pipeline: Record<string, unknown>[]) {\n // Run aggregation on a collection — requires a target collection \n // from the pipeline's $match or $lookup stage:\n const firstStage = pipeline[0];\n const collName = (firstStage as any)?.$from ?? \"__admin__\";\n const cursor = db.collection(collName).aggregate(pipeline);\n return await cursor.toArray() as Record<string, unknown>[];\n },\n async fetchCollectionStats(collectionName: string) {\n const stats = await db.command({ collStats: collectionName }) as { count: number; size: number };\n return { count: stats.count, sizeBytes: stats.size };\n },\n async fetchUnmappedTables(mappedPaths?: string[]) {\n const allCollections = await db.listCollections().toArray();\n const names = allCollections.map(c => c.name).filter(n => !n.startsWith(\"system.\"));\n if (!mappedPaths || mappedPaths.length === 0) return names;\n const mappedSet = new Set(mappedPaths.map(p => p.toLowerCase()));\n return names.filter(n => !mappedSet.has(n.toLowerCase()));\n },\n async fetchTableMetadata(collectionName: string) {\n // Sample a document to infer fields\n const sample = await db.collection(collectionName).findOne();\n if (!sample) return { columns: [], foreignKeys: [], junctions: [], policies: [] };\n const columns = Object.entries(sample).map(([key, value]) => ({\n column_name: key,\n data_type: typeof value,\n udt_name: typeof value,\n is_nullable: \"YES\",\n column_default: null,\n character_maximum_length: null,\n }));\n return { columns, foreignKeys: [], junctions: [], policies: [] };\n },\n } satisfies DocumentAdmin & SchemaAdmin;\n\n return {\n // Abstract interface implementations\n connection: mongoConnection,\n entityRepository: entityService,\n realtimeProvider: realtimeService,\n collectionRegistry: collectionRegistry,\n admin,\n\n // Lifecycle\n async initialize() {\n // Connection is already established via the MongoClient constructor\n },\n async healthCheck(): Promise<HealthCheckResult> {\n const start = Date.now();\n try {\n await db.command({ ping: 1 });\n return { healthy: true, latencyMs: Date.now() - start };\n } catch {\n return { healthy: false, latencyMs: Date.now() - start };\n }\n },\n async destroy() {\n await client.close();\n },\n\n // MongoDB-specific accessors\n db,\n client,\n driver,\n entityService,\n realtimeService\n };\n}\n\n/**\n * Create a MongoDB DataDriver.\n *\n * This is a convenience function when you only need the DataDriver\n * without the full backend instance.\n *\n * @example\n * ```typescript\n * import { createMongoDelegate } from \"@rebasepro/server-mongodb\";\n *\n * const delegate = createMongoDelegate(db);\n * ```\n */\nexport function createMongoDelegate(\n db: Db,\n realtimeService?: MongoRealtimeService\n): MongoDriver {\n const realtime = realtimeService ?? new MongoRealtimeService(db);\n return new MongoDriver(db, realtime);\n}\n\n/**\n * Create a RealtimeService for MongoDB.\n *\n * @example\n * ```typescript\n * import { createMongoRealtimeService } from \"@rebasepro/server-mongodb\";\n *\n * const realtimeService = createMongoRealtimeService(db);\n * ```\n */\nexport function createMongoRealtimeService(db: Db): MongoRealtimeService {\n return new MongoRealtimeService(db);\n}\n\n/**\n * Create a MongoDB entity repository.\n *\n * @example\n * ```typescript\n * import { createMongoEntityRepository } from \"@rebasepro/server-mongodb\";\n *\n * const repository = createMongoEntityRepository(db);\n * const users = await repository.fetchCollection(\"users\", {});\n * ```\n */\nexport function createMongoEntityRepository(db: Db): EntityRepository {\n return new MongoEntityService(db);\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a backend config is for MongoDB.\n */\nexport function isMongoBackendConfig(config: BackendConfig): config is MongoBackendConfig {\n return config.type === \"mongodb\" &&\n typeof (config as MongoBackendConfig).connection !== \"undefined\" &&\n typeof (config as MongoBackendConfig).client !== \"undefined\";\n}\n\n/**\n * Check if a driver config is for MongoDB.\n */\nexport function isMongoDriverConfig(obj: unknown): obj is { type: \"mongodb\"; connection: Db; client: MongoClient } {\n return typeof obj === \"object\" &&\n obj !== null &&\n \"type\" in obj &&\n (obj as Record<string, unknown>).type === \"mongodb\" &&\n \"connection\" in obj &&\n \"client\" in obj;\n}\n"],"names":["MongoClient","ObjectId"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MongoDB Connection
3
+ *
4
+ * Wraps MongoDB connection to implement the DatabaseConnection interface.
5
+ */
6
+ import { Db, MongoClient } from "mongodb";
7
+ import { DatabaseConnection } from "@rebasepro/types";
8
+ /**
9
+ * MongoDB database connection wrapper that implements DatabaseConnection interface.
10
+ */
11
+ export declare class MongoDBConnection implements DatabaseConnection {
12
+ readonly db: Db;
13
+ readonly client: MongoClient;
14
+ readonly type = "mongodb";
15
+ constructor(db: Db, client: MongoClient);
16
+ get isConnected(): boolean;
17
+ close(): Promise<void>;
18
+ }
19
+ /**
20
+ * Create a MongoDB database connection from a connection string.
21
+ *
22
+ * @param connectionString - MongoDB connection string (e.g., mongodb://localhost:27017)
23
+ * @param databaseName - Name of the database to use
24
+ * @returns Promise resolving to MongoDBConnection
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const connection = await createMongoDBConnection(
29
+ * "mongodb://localhost:27017",
30
+ * "my_database"
31
+ * );
32
+ * ```
33
+ */
34
+ export declare function createMongoDBConnection(connectionString: string, databaseName: string): Promise<MongoDBConnection>;
35
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;aAIpC,EAAE,EAAE,EAAE;aACN,MAAM,EAAE,WAAW;IAJvC,QAAQ,CAAC,IAAI,aAAa;gBAGN,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,WAAW;IAGvC,IAAI,WAAW,IAAI,OAAO,CASzB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CACzC,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAK5B"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * MongoDB Condition Builder
3
+ *
4
+ * Translates Rebase filter conditions to MongoDB query operators.
5
+ */
6
+ import { FilterValues } from "@rebasepro/types";
7
+ import { Filter, Document } from "mongodb";
8
+ /**
9
+ * MongoDB Condition Builder
10
+ *
11
+ * Provides static methods to translate Rebase filter conditions
12
+ * to MongoDB query filters.
13
+ */
14
+ export declare class MongoConditionBuilder {
15
+ /**
16
+ * Build MongoDB filter conditions from Rebase FilterValues
17
+ *
18
+ * @param filter - Rebase filter values
19
+ * @returns Array of MongoDB filter objects
20
+ */
21
+ static buildFilterConditions<M extends Record<string, any>>(filter: FilterValues<Extract<keyof M, string>>): Filter<Document>[];
22
+ /**
23
+ * Build search conditions for text search
24
+ *
25
+ * @param searchString - Text to search for
26
+ * @param properties - Properties to search in
27
+ * @returns Array of MongoDB filter objects for text search
28
+ */
29
+ static buildSearchConditions(searchString: string, properties: Record<string, any>): Filter<Document>[];
30
+ /**
31
+ * Combine multiple conditions with AND operator
32
+ *
33
+ * @param conditions - Array of filter conditions
34
+ * @returns Combined filter or undefined if empty
35
+ */
36
+ static combineConditionsWithAnd(conditions: Filter<Document>[]): Filter<Document> | undefined;
37
+ /**
38
+ * Combine multiple conditions with OR operator
39
+ *
40
+ * @param conditions - Array of filter conditions
41
+ * @returns Combined filter or undefined if empty
42
+ */
43
+ static combineConditionsWithOr(conditions: Filter<Document>[]): Filter<Document> | undefined;
44
+ /**
45
+ * Build a complete MongoDB query from Rebase options
46
+ *
47
+ * @param options - Rebase fetch options
48
+ * @returns MongoDB filter object
49
+ */
50
+ static buildQuery<M extends Record<string, any>>(options: {
51
+ filter?: FilterValues<Extract<keyof M, string>>;
52
+ searchString?: string;
53
+ properties?: Record<string, any>;
54
+ }): Filter<Document>;
55
+ /**
56
+ * Build MongoDB sort options from Rebase options
57
+ *
58
+ * @param orderBy - Field to order by
59
+ * @param order - Sort direction
60
+ * @returns MongoDB sort object
61
+ */
62
+ static buildSort(orderBy?: string, order?: "asc" | "desc"): Record<string, 1 | -1> | undefined;
63
+ }
64
+ //# sourceMappingURL=MongoConditionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoConditionBuilder.d.ts","sourceRoot":"","sources":["../../../../src/db/MongoConditionBuilder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkB3C;;;;;GAKG;AACH,qBAAa,qBAAqB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC/C,MAAM,CAAC,QAAQ,CAAC,EAAE;IA+BrB;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,MAAM,CAAC,QAAQ,CAAC,EAAE;IAwBrB;;;;;OAKG;IACH,MAAM,CAAC,wBAAwB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAM7F;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAM5F;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE;QACtD,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC,GAAG,MAAM,CAAC,QAAQ,CAAC;IA2BpB;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CACZ,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GACvB,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS;CAIxC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * MongoDB Entity Service
3
+ *
4
+ * Implements EntityRepository interface for MongoDB.
5
+ * Provides all CRUD operations for entities.
6
+ */
7
+ import { Db } from "mongodb";
8
+ import { Entity, FilterValues, EntityRepository, EntityCollection } from "@rebasepro/types";
9
+ /**
10
+ * MongoDB Entity Service
11
+ *
12
+ * Implements the EntityRepository interface for MongoDB.
13
+ * Provides all CRUD operations for entities stored in MongoDB collections.
14
+ */
15
+ export declare class MongoEntityService implements EntityRepository {
16
+ private db;
17
+ constructor(db: Db);
18
+ /**
19
+ * Get a MongoDB collection by its path
20
+ */
21
+ private getCollection;
22
+ /**
23
+ * Convert a string ID to ObjectId if it's a valid ObjectId string
24
+ */
25
+ private toObjectId;
26
+ /**
27
+ * Convert a MongoDB document to a Rebase Entity
28
+ */
29
+ private documentToEntity;
30
+ /**
31
+ * Convert values from MongoDB format to Rebase format
32
+ */
33
+ private convertFromMongoValues;
34
+ /**
35
+ * Convert a single value from MongoDB format
36
+ */
37
+ private convertFromMongoValue;
38
+ /**
39
+ * Convert values to MongoDB format for storage
40
+ */
41
+ private convertToMongoValues;
42
+ /**
43
+ * Convert a single value to MongoDB format
44
+ */
45
+ private convertToMongoValue;
46
+ /**
47
+ * Fetch a single entity by ID
48
+ */
49
+ fetchEntity<M extends Record<string, any>>(collectionPath: string, entityId: string | number, _databaseId?: string): Promise<Entity<M> | undefined>;
50
+ /**
51
+ * Fetch a collection of entities with optional filtering, ordering, and pagination
52
+ */
53
+ fetchCollection<M extends Record<string, any>>(collectionPath: string, options?: {
54
+ filter?: FilterValues<Extract<keyof M, string>>;
55
+ orderBy?: string;
56
+ order?: "desc" | "asc";
57
+ limit?: number;
58
+ startAfter?: any;
59
+ searchString?: string;
60
+ databaseId?: string;
61
+ collection?: EntityCollection;
62
+ }): Promise<Entity<M>[]>;
63
+ /**
64
+ * Search entities by text
65
+ */
66
+ searchEntities<M extends Record<string, any>>(collectionPath: string, searchString: string, options?: {
67
+ filter?: FilterValues<Extract<keyof M, string>>;
68
+ orderBy?: string;
69
+ order?: "desc" | "asc";
70
+ limit?: number;
71
+ databaseId?: string;
72
+ collection?: EntityCollection;
73
+ }): Promise<Entity<M>[]>;
74
+ /**
75
+ * Count entities in a collection
76
+ */
77
+ countEntities<M extends Record<string, any>>(collectionPath: string, options?: {
78
+ filter?: FilterValues<Extract<keyof M, string>>;
79
+ databaseId?: string;
80
+ }): Promise<number>;
81
+ /**
82
+ * Save an entity (create or update)
83
+ */
84
+ saveEntity<M extends Record<string, any>>(collectionPath: string, values: Partial<M>, entityId?: string | number, _databaseId?: string): Promise<Entity<M>>;
85
+ /**
86
+ * Delete an entity by ID
87
+ */
88
+ deleteEntity(collectionPath: string, entityId: string | number, _databaseId?: string): Promise<void>;
89
+ /**
90
+ * Check if a field value is unique in a collection
91
+ */
92
+ checkUniqueField(collectionPath: string, fieldName: string, value: any, excludeEntityId?: string, _databaseId?: string): Promise<boolean>;
93
+ /**
94
+ * Generate a new entity ID
95
+ */
96
+ generateEntityId(): string;
97
+ }
98
+ //# sourceMappingURL=MongoEntityService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoEntityService.d.ts","sourceRoot":"","sources":["../../../../src/db/MongoEntityService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * MongoDB Backend Factory
3
+ *
4
+ * This module provides factory functions for creating MongoDB backend instances.
5
+ * It abstracts the creation of drivers, realtime services, and entity services.
6
+ */
7
+ import { Db, MongoClient } from "mongodb";
8
+ import { DataDriver, EntityCollection } from "@rebasepro/types";
9
+ import { MongoEntityService } from "./db/MongoEntityService";
10
+ import { MongoRealtimeService } from "./services/MongoRealtimeService";
11
+ import { MongoDriver } from "./services/MongoDriver";
12
+ import { BackendConfig, BackendInstance, CollectionRegistryInterface, EntityRepository, DatabaseAdmin } from "@rebasepro/types";
13
+ /**
14
+ * Configuration for creating a MongoDB backend.
15
+ */
16
+ export interface MongoBackendConfig extends BackendConfig {
17
+ type: "mongodb";
18
+ /** MongoDB database instance */
19
+ connection: Db;
20
+ /** MongoDB client (for connection management) */
21
+ client: MongoClient;
22
+ /** Collections to register (optional, can be registered later) */
23
+ collections?: EntityCollection[];
24
+ }
25
+ /**
26
+ * MongoDB-specific backend instance with additional MongoDB types.
27
+ */
28
+ export interface MongoBackendInstance extends BackendInstance {
29
+ /** The MongoDB database instance */
30
+ db: Db;
31
+ /** The MongoDB client */
32
+ client: MongoClient;
33
+ /** MongoDB DataDriver for use with Rebase */
34
+ driver: DataDriver;
35
+ /** Entity service for direct database operations */
36
+ entityService: MongoEntityService;
37
+ /** Realtime service for subscriptions */
38
+ realtimeService: MongoRealtimeService;
39
+ /** Admin capabilities (DocumentAdmin + SchemaAdmin) */
40
+ admin: DatabaseAdmin;
41
+ }
42
+ /**
43
+ * Simple in-memory collection registry for MongoDB.
44
+ */
45
+ export declare class MongoCollectionRegistry implements CollectionRegistryInterface {
46
+ private collections;
47
+ /**
48
+ * Register a collection
49
+ */
50
+ register(collection: EntityCollection): void;
51
+ /**
52
+ * Get a collection by its path
53
+ */
54
+ getCollectionByPath(path: string): EntityCollection | undefined;
55
+ /**
56
+ * Get all registered collections
57
+ */
58
+ getCollections(): EntityCollection[];
59
+ }
60
+ /**
61
+ * Create a complete MongoDB backend instance.
62
+ *
63
+ * This factory function creates all the necessary services for a MongoDB backend:
64
+ * - MongoDBConnection (database connection wrapper)
65
+ * - MongoEntityService (implements EntityRepository)
66
+ * - MongoRealtimeService (implements RealtimeProvider)
67
+ * - MongoCollectionRegistry (implements CollectionRegistryInterface)
68
+ * - MongoDriver (for Rebase integration)
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * import { createMongoBackend } from "@rebasepro/server-mongodb";
73
+ *
74
+ * const client = new MongoClient("mongodb://localhost:27017");
75
+ * await client.connect();
76
+ * const db = client.db("my_database");
77
+ *
78
+ * const backend = createMongoBackend({
79
+ * type: "mongodb",
80
+ * connection: db,
81
+ * client: client,
82
+ * collections: myCollections
83
+ * });
84
+ *
85
+ * // Use the backend
86
+ * const entities = await backend.entityRepository.fetchCollection("users", {});
87
+ * ```
88
+ */
89
+ export declare function createMongoBackend(config: MongoBackendConfig): MongoBackendInstance;
90
+ /**
91
+ * Create a MongoDB DataDriver.
92
+ *
93
+ * This is a convenience function when you only need the DataDriver
94
+ * without the full backend instance.
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * import { createMongoDelegate } from "@rebasepro/server-mongodb";
99
+ *
100
+ * const delegate = createMongoDelegate(db);
101
+ * ```
102
+ */
103
+ export declare function createMongoDelegate(db: Db, realtimeService?: MongoRealtimeService): MongoDriver;
104
+ /**
105
+ * Create a RealtimeService for MongoDB.
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * import { createMongoRealtimeService } from "@rebasepro/server-mongodb";
110
+ *
111
+ * const realtimeService = createMongoRealtimeService(db);
112
+ * ```
113
+ */
114
+ export declare function createMongoRealtimeService(db: Db): MongoRealtimeService;
115
+ /**
116
+ * Create a MongoDB entity repository.
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * import { createMongoEntityRepository } from "@rebasepro/server-mongodb";
121
+ *
122
+ * const repository = createMongoEntityRepository(db);
123
+ * const users = await repository.fetchCollection("users", {});
124
+ * ```
125
+ */
126
+ export declare function createMongoEntityRepository(db: Db): EntityRepository;
127
+ /**
128
+ * Check if a backend config is for MongoDB.
129
+ */
130
+ export declare function isMongoBackendConfig(config: BackendConfig): config is MongoBackendConfig;
131
+ /**
132
+ * Check if a driver config is for MongoDB.
133
+ */
134
+ export declare function isMongoDriverConfig(obj: unknown): obj is {
135
+ type: "mongodb";
136
+ connection: Db;
137
+ client: MongoClient;
138
+ };
139
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,2BAA2B,EAAE,gBAAgB,EAAwC,aAAa,EAAiD,MAAM,kBAAkB,CAAC;AAErN;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACrD,IAAI,EAAE,SAAS,CAAC;IAChB,gCAAgC;IAChC,UAAU,EAAE,EAAE,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,WAAW,CAAC;IACpB,kEAAkE;IAClE,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IACzD,oCAAoC;IACpC,EAAE,EAAE,EAAE,CAAC;IACP,yBAAyB;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,MAAM,EAAE,UAAU,CAAC;IACnB,oDAAoD;IACpD,aAAa,EAAE,kBAAkB,CAAC;IAClC,yCAAyC;IACzC,eAAe,EAAE,oBAAoB,CAAC;IACtC,uDAAuD;IACvD,KAAK,EAAE,aAAa,CAAC;CACxB;AAMD;;GAEG;AACH,qBAAa,uBAAwB,YAAW,2BAA2B;IACvE,OAAO,CAAC,WAAW,CAAuC;IAE1D;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAI5C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI/D;;OAEG;IACH,cAAc,IAAI,gBAAgB,EAAE;CAGvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB,CAsFnF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAC/B,EAAE,EAAE,EAAE,EACN,eAAe,CAAC,EAAE,oBAAoB,GACvC,WAAW,CAGb;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAEvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAEpE;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,kBAAkB,CAIxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAOjH"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @rebasepro/server-mongodb
3
+ *
4
+ * MongoDB backend implementation for Rebase
5
+ * This package provides a complete backend solution for Rebase applications
6
+ * using MongoDB as the database.
7
+ *
8
+ * The package implements the abstract interfaces from @rebasepro/server-core
9
+ * (EntityRepository, RealtimeProvider, CollectionRegistryInterface, etc.)
10
+ */
11
+ export * from "./connection";
12
+ export * from "./factory";
13
+ export * from "./db/MongoEntityService";
14
+ export * from "./db/MongoConditionBuilder";
15
+ export * from "./services/MongoRealtimeService";
16
+ export * from "./services/MongoDriver";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC;AAG1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAG3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * MongoDB DataDriver Delegate
3
+ *
4
+ * Implements the DataDriver interface for Rebase frontend integration.
5
+ * This is the main entry point for Rebase to interact with MongoDB.
6
+ */
7
+ import { Db } from "mongodb";
8
+ import { DataDriver, DeleteEntityProps, Entity, EntityCollection, FetchCollectionProps, FetchEntityProps, ListenCollectionProps, ListenEntityProps, SaveEntityProps } from "@rebasepro/types";
9
+ import { MongoEntityService } from "../db/MongoEntityService";
10
+ import { MongoRealtimeService } from "./MongoRealtimeService";
11
+ /**
12
+ * MongoDB DataDriver Delegate
13
+ *
14
+ * Implements the DataDriver interface for Rebase.
15
+ * Provides all data operations needed by the Rebase frontend.
16
+ */
17
+ export declare class MongoDriver implements DataDriver {
18
+ private db;
19
+ key: string;
20
+ initialised: boolean;
21
+ private entityService;
22
+ private realtimeService;
23
+ constructor(db: Db, realtimeService?: MongoRealtimeService);
24
+ /**
25
+ * Get the current timestamp
26
+ */
27
+ currentTime(): Date;
28
+ /**
29
+ * Fetch a collection of entities
30
+ */
31
+ fetchCollection<M extends Record<string, any>>({ path, collection, filter, limit, startAfter, orderBy, searchString, order }: FetchCollectionProps<M>): Promise<Entity<M>[]>;
32
+ /**
33
+ * Listen to collection changes
34
+ */
35
+ listenCollection<M extends Record<string, any>>({ path, collection, filter, limit, startAfter, orderBy, searchString, order, onUpdate, onError }: ListenCollectionProps<M>): () => void;
36
+ /**
37
+ * Fetch a single entity
38
+ */
39
+ fetchEntity<M extends Record<string, any>>({ path, entityId, databaseId, collection }: FetchEntityProps<M>): Promise<Entity<M> | undefined>;
40
+ /**
41
+ * Listen to entity changes
42
+ */
43
+ listenEntity<M extends Record<string, any>>({ path, entityId, collection, onUpdate, onError }: ListenEntityProps<M>): () => void;
44
+ /**
45
+ * Save an entity (create or update)
46
+ */
47
+ saveEntity<M extends Record<string, any>>({ path, entityId, values, collection, status }: SaveEntityProps<M>): Promise<Entity<M>>;
48
+ /**
49
+ * Delete an entity
50
+ */
51
+ deleteEntity<M extends Record<string, any>>({ entity, collection }: DeleteEntityProps<M>): Promise<void>;
52
+ /**
53
+ * Check if a field value is unique
54
+ */
55
+ checkUniqueField(path: string, name: string, value: any, entityId?: string, collection?: EntityCollection): Promise<boolean>;
56
+ /**
57
+ * Generate a new entity ID
58
+ */
59
+ generateEntityId(path: string, collection?: EntityCollection): string;
60
+ /**
61
+ * Count entities in a collection
62
+ */
63
+ countEntities<M extends Record<string, any>>({ path, collection, filter }: FetchCollectionProps<M>): Promise<number>;
64
+ /**
65
+ * Generate a unique subscription ID
66
+ */
67
+ private generateSubscriptionId;
68
+ /**
69
+ * Check if the delegate is ready
70
+ */
71
+ isReady(): boolean;
72
+ /**
73
+ * Get the underlying entity service for direct access
74
+ */
75
+ getEntityService(): MongoEntityService;
76
+ /**
77
+ * Get the underlying realtime service for direct access
78
+ */
79
+ getRealtimeService(): MongoRealtimeService;
80
+ }
81
+ //# sourceMappingURL=MongoDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoDriver.d.ts","sourceRoot":"","sources":["../../../../src/services/MongoDriver.ts"],"names":[],"mappings":"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"}