@rebasepro/server-mongo 0.17.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +0 -1
  2. package/README.md +4 -0
  3. package/dist/MongoBootstrapper.d.ts +0 -1
  4. package/dist/auth/ensure-collections.d.ts +0 -1
  5. package/dist/auth/services.d.ts +0 -1
  6. package/dist/connection.d.ts +0 -1
  7. package/dist/db/MongoConditionBuilder.d.ts +0 -1
  8. package/dist/db/MongoDataService.d.ts +0 -1
  9. package/dist/db/securityRuleFilter.d.ts +0 -1
  10. package/dist/factory.d.ts +0 -1
  11. package/dist/history/ensure-history-collection.d.ts +0 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.es.js +83 -79
  14. package/dist/index.es.js.map +1 -1
  15. package/dist/schema/plan-schema-change.d.ts +0 -1
  16. package/dist/services/MongoDriver.d.ts +0 -1
  17. package/dist/services/MongoHistoryService.d.ts +0 -1
  18. package/dist/services/MongoRealtimeService.d.ts +0 -1
  19. package/dist/websocket.d.ts +0 -1
  20. package/package.json +28 -24
  21. package/dist/MongoBootstrapper.d.ts.map +0 -1
  22. package/dist/auth/ensure-collections.d.ts.map +0 -1
  23. package/dist/auth/services.d.ts.map +0 -1
  24. package/dist/connection.d.ts.map +0 -1
  25. package/dist/db/MongoConditionBuilder.d.ts.map +0 -1
  26. package/dist/db/MongoDataService.d.ts.map +0 -1
  27. package/dist/db/securityRuleFilter.d.ts.map +0 -1
  28. package/dist/factory.d.ts.map +0 -1
  29. package/dist/history/ensure-history-collection.d.ts.map +0 -1
  30. package/dist/index.d.ts.map +0 -1
  31. package/dist/schema/plan-schema-change.d.ts.map +0 -1
  32. package/dist/services/MongoDriver.d.ts.map +0 -1
  33. package/dist/services/MongoHistoryService.d.ts.map +0 -1
  34. package/dist/services/MongoRealtimeService.d.ts.map +0 -1
  35. package/dist/websocket.d.ts.map +0 -1
  36. package/src/MongoBootstrapper.ts +0 -204
  37. package/src/auth/ensure-collections.ts +0 -153
  38. package/src/auth/services.ts +0 -866
  39. package/src/connection.ts +0 -60
  40. package/src/db/MongoConditionBuilder.ts +0 -348
  41. package/src/db/MongoDataService.ts +0 -412
  42. package/src/db/securityRuleFilter.ts +0 -398
  43. package/src/factory.ts +0 -331
  44. package/src/history/ensure-history-collection.ts +0 -22
  45. package/src/index.ts +0 -25
  46. package/src/schema/plan-schema-change.ts +0 -159
  47. package/src/services/MongoDriver.ts +0 -950
  48. package/src/services/MongoHistoryService.ts +0 -186
  49. package/src/services/MongoRealtimeService.ts +0 -592
  50. package/src/websocket.ts +0 -387
package/LICENSE CHANGED
@@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
-
package/README.md CHANGED
@@ -8,6 +8,10 @@ MongoDB database driver for Rebase.
8
8
  pnpm add @rebasepro/server-mongo
9
9
  ```
10
10
 
11
+ ESM-only: `"type": "module"` with no CommonJS build, so it is loaded with
12
+ `import`. `require()` of it resolves only on Node 22.12+, which supports
13
+ `require(esm)`.
14
+
11
15
  ## What This Package Does
12
16
 
13
17
  Implements the Rebase `BackendBootstrapper` and backend interfaces for MongoDB. Provides a complete data driver, change-stream-based realtime, snapshot history, auth repositories, and WebSocket support. Plug it into `@rebasepro/server` via `createMongoBootstrapper()`, or use the standalone `createMongoBackend()` factory for direct access.
@@ -15,4 +15,3 @@ export interface MongoDriverInternals {
15
15
  driver: MongoDriver;
16
16
  }
17
17
  export declare function createMongoBootstrapper(mongoConfig: MongoDriverConfig): BackendBootstrapper;
18
- //# sourceMappingURL=MongoBootstrapper.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import { Db } from "mongodb";
2
2
  export declare function ensureAuthCollectionsExist(db: Db): Promise<void>;
3
- //# sourceMappingURL=ensure-collections.d.ts.map
@@ -170,4 +170,3 @@ export declare class MongoAuthRepository implements AuthRepository {
170
170
  deleteAllRecoveryCodes(uid: string): Promise<void>;
171
171
  hasVerifiedMfaFactors(uid: string): Promise<boolean>;
172
172
  }
173
- //# sourceMappingURL=services.d.ts.map
@@ -32,4 +32,3 @@ export declare class MongoDBConnection implements DatabaseConnection {
32
32
  * ```
33
33
  */
34
34
  export declare function createMongoDBConnection(connectionString: string, databaseName: string): Promise<MongoDBConnection>;
35
- //# sourceMappingURL=connection.d.ts.map
@@ -112,4 +112,3 @@ export declare class MongoConditionBuilder {
112
112
  */
113
113
  static buildSort(orderBy?: string | OrderByTuple[], order?: "asc" | "desc"): Record<string, 1 | -1> | undefined;
114
114
  }
115
- //# sourceMappingURL=MongoConditionBuilder.d.ts.map
@@ -123,4 +123,3 @@ export declare class MongoDataService implements DataRepository {
123
123
  */
124
124
  generateId(): string;
125
125
  }
126
- //# sourceMappingURL=MongoDataService.d.ts.map
@@ -62,4 +62,3 @@ export declare function assertSecurityRulesEnforceable(collection: CollectionCon
62
62
  */
63
63
  export declare function buildMongoFilterFromSecurityRules<M extends Record<string, any>>(collection: CollectionConfig<M> | undefined, user: User | undefined, targetOperation: SecurityOperation): Filter<Document> | null;
64
64
  export {};
65
- //# sourceMappingURL=securityRuleFilter.d.ts.map
package/dist/factory.d.ts CHANGED
@@ -158,4 +158,3 @@ export declare function isMongoDriverConfig(obj: unknown): obj is {
158
158
  connection: Db;
159
159
  client: MongoClient;
160
160
  };
161
- //# sourceMappingURL=factory.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import { Db } from "mongodb";
2
2
  export declare function ensureHistoryCollectionExists(db: Db): Promise<void>;
3
- //# sourceMappingURL=ensure-history-collection.d.ts.map
package/dist/index.d.ts CHANGED
@@ -15,4 +15,3 @@ export * from "./db/MongoConditionBuilder.js";
15
15
  export * from "./services/MongoRealtimeService.js";
16
16
  export * from "./services/MongoDriver.js";
17
17
  export * from "./MongoBootstrapper.js";
18
- //# sourceMappingURL=index.d.ts.map
package/dist/index.es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { MongoClient, ObjectId } from "mongodb";
2
2
  import { ANONYMOUS_USER_ID, EntityReference, ListLimitError, getCollectionDataPath, isAnonymousUid, resolveClientListLimit } from "@rebasepro/types";
3
- import { buildPropertyCallbacks, buildSdkData, checkOperation, normalizeDriverOrderBy, normalizeEmail, securityRuleToConditions, toFilterTuples, updateDateAutoValues } from "@rebasepro/common";
3
+ import { buildPropertyCallbacks, buildSdkData, callbackRefusal, checkOperation, normalizeDriverOrderBy, normalizeEmail, securityRuleToConditions, toCallbackError, toFilterTuples, updateDateAutoValues } from "@rebasepro/common";
4
4
  import { ApiError, logger } from "@rebasepro/server";
5
5
  import { mergeDeep } from "@rebasepro/utils";
6
6
  //#region \0rolldown/runtime.js
@@ -1039,7 +1039,8 @@ function referencesField(expr) {
1039
1039
  function userContext(user) {
1040
1040
  return {
1041
1041
  uid: user?.uid || ANONYMOUS_USER_ID,
1042
- roles: user?.roles ?? []
1042
+ roles: user?.roles ?? [],
1043
+ isAnonymous: user?.isAnonymous === true
1043
1044
  };
1044
1045
  }
1045
1046
  var COMPARE_TO_MONGO = {
@@ -1129,6 +1130,7 @@ function policyToMongoFilter(expr, user) {
1129
1130
  case "rolesOverlap": return expr.roles.some((r) => r === "public" || ctx.roles.includes(r)) ? MATCH_ALL : MATCH_NONE;
1130
1131
  case "rolesContain": return expr.roles.every((r) => r === "public" || ctx.roles.includes(r)) ? MATCH_ALL : MATCH_NONE;
1131
1132
  case "authenticated": return !isAnonymousUid(ctx.uid) ? MATCH_ALL : MATCH_NONE;
1133
+ case "registered": return !isAnonymousUid(ctx.uid) && ctx.isAnonymous !== true ? MATCH_ALL : MATCH_NONE;
1132
1134
  case "serverContext": return MATCH_NONE;
1133
1135
  case "existsIn":
1134
1136
  case "raw": return UNTRANSLATABLE;
@@ -1430,43 +1432,47 @@ var MongoDriver = class {
1430
1432
  previousValuesForHistory = existingValues;
1431
1433
  }
1432
1434
  }
1433
- if (globalCallbacks?.beforeSave || callbacks?.beforeSave || propertyCallbacks?.beforeSave) {
1434
- if (globalCallbacks?.beforeSave) {
1435
- const result = await globalCallbacks.beforeSave({
1436
- collection: resolvedCollection,
1437
- path,
1438
- id,
1439
- values: updatedValues,
1440
- previousValues: previousValuesForHistory,
1441
- status,
1442
- context: contextForCallback
1443
- });
1444
- if (result) updatedValues = mergeDeep(updatedValues, result);
1445
- }
1446
- if (callbacks?.beforeSave) {
1447
- const result = await callbacks.beforeSave({
1448
- collection: resolvedCollection,
1449
- path,
1450
- id,
1451
- values: updatedValues,
1452
- previousValues: previousValuesForHistory,
1453
- status,
1454
- context: contextForCallback
1455
- });
1456
- if (result) updatedValues = mergeDeep(updatedValues, result);
1457
- }
1458
- if (propertyCallbacks?.beforeSave) {
1459
- const result = await propertyCallbacks.beforeSave({
1460
- collection: resolvedCollection,
1461
- path,
1462
- id,
1463
- values: updatedValues,
1464
- previousValues: previousValuesForHistory,
1465
- status,
1466
- context: contextForCallback
1467
- });
1468
- if (result) updatedValues = mergeDeep(updatedValues, result);
1435
+ try {
1436
+ if (globalCallbacks?.beforeSave || callbacks?.beforeSave || propertyCallbacks?.beforeSave) {
1437
+ if (globalCallbacks?.beforeSave) {
1438
+ const result = await globalCallbacks.beforeSave({
1439
+ collection: resolvedCollection,
1440
+ path,
1441
+ id,
1442
+ values: updatedValues,
1443
+ previousValues: previousValuesForHistory,
1444
+ status,
1445
+ context: contextForCallback
1446
+ });
1447
+ if (result) updatedValues = mergeDeep(updatedValues, result);
1448
+ }
1449
+ if (callbacks?.beforeSave) {
1450
+ const result = await callbacks.beforeSave({
1451
+ collection: resolvedCollection,
1452
+ path,
1453
+ id,
1454
+ values: updatedValues,
1455
+ previousValues: previousValuesForHistory,
1456
+ status,
1457
+ context: contextForCallback
1458
+ });
1459
+ if (result) updatedValues = mergeDeep(updatedValues, result);
1460
+ }
1461
+ if (propertyCallbacks?.beforeSave) {
1462
+ const result = await propertyCallbacks.beforeSave({
1463
+ collection: resolvedCollection,
1464
+ path,
1465
+ id,
1466
+ values: updatedValues,
1467
+ previousValues: previousValuesForHistory,
1468
+ status,
1469
+ context: contextForCallback
1470
+ });
1471
+ if (result) updatedValues = mergeDeep(updatedValues, result);
1472
+ }
1469
1473
  }
1474
+ } catch (callbackError) {
1475
+ throw toCallbackError(callbackError, "beforeSave", path);
1470
1476
  }
1471
1477
  if (resolvedCollection?.properties) updatedValues = updateDateAutoValues({
1472
1478
  inputValues: updatedValues,
@@ -1541,24 +1547,18 @@ var MongoDriver = class {
1541
1547
  return savedRow;
1542
1548
  } catch (error) {
1543
1549
  if (callbacks?.afterSaveError || propertyCallbacks?.afterSaveError) {
1544
- if (callbacks?.afterSaveError) await callbacks.afterSaveError({
1550
+ const errorProps = {
1545
1551
  collection: resolvedCollection,
1546
1552
  path,
1547
- id: id || "unknown",
1548
- values: updatedValues,
1549
- previousValues: void 0,
1550
- status,
1551
- context: contextForCallback
1552
- });
1553
- if (propertyCallbacks?.afterSaveError) await propertyCallbacks.afterSaveError({
1554
- collection: resolvedCollection,
1555
- path,
1556
- id: id || "unknown",
1553
+ id,
1557
1554
  values: updatedValues,
1558
1555
  previousValues: void 0,
1559
1556
  status,
1557
+ error,
1560
1558
  context: contextForCallback
1561
- });
1559
+ };
1560
+ if (callbacks?.afterSaveError) await callbacks.afterSaveError(errorProps);
1561
+ if (propertyCallbacks?.afterSaveError) await propertyCallbacks.afterSaveError(errorProps);
1562
1562
  }
1563
1563
  throw error;
1564
1564
  }
@@ -1579,36 +1579,40 @@ var MongoDriver = class {
1579
1579
  client: this.client,
1580
1580
  storageSource: this.client?.storage
1581
1581
  };
1582
- if (globalCallbacks?.beforeDelete || callbacks?.beforeDelete || propertyCallbacks?.beforeDelete) {
1583
- let preventDefault = false;
1584
- if (globalCallbacks?.beforeDelete) {
1585
- if (await globalCallbacks.beforeDelete({
1586
- collection: resolvedCollection,
1587
- path: row.path,
1588
- id: row.id,
1589
- row: callbackRow,
1590
- context: contextForCallback
1591
- }) === false) preventDefault = true;
1592
- }
1593
- if (callbacks?.beforeDelete) {
1594
- if (await callbacks.beforeDelete({
1595
- collection: resolvedCollection,
1596
- path: row.path,
1597
- id: row.id,
1598
- row: callbackRow,
1599
- context: contextForCallback
1600
- }) === false) preventDefault = true;
1601
- }
1602
- if (propertyCallbacks?.beforeDelete) {
1603
- if (await propertyCallbacks.beforeDelete({
1604
- collection: resolvedCollection,
1605
- path: row.path,
1606
- id: row.id,
1607
- row: callbackRow,
1608
- context: contextForCallback
1609
- }) === false) preventDefault = true;
1582
+ try {
1583
+ if (globalCallbacks?.beforeDelete || callbacks?.beforeDelete || propertyCallbacks?.beforeDelete) {
1584
+ let preventDefault = false;
1585
+ if (globalCallbacks?.beforeDelete) {
1586
+ if (await globalCallbacks.beforeDelete({
1587
+ collection: resolvedCollection,
1588
+ path: row.path,
1589
+ id: row.id,
1590
+ row: callbackRow,
1591
+ context: contextForCallback
1592
+ }) === false) preventDefault = true;
1593
+ }
1594
+ if (callbacks?.beforeDelete) {
1595
+ if (await callbacks.beforeDelete({
1596
+ collection: resolvedCollection,
1597
+ path: row.path,
1598
+ id: row.id,
1599
+ row: callbackRow,
1600
+ context: contextForCallback
1601
+ }) === false) preventDefault = true;
1602
+ }
1603
+ if (propertyCallbacks?.beforeDelete) {
1604
+ if (await propertyCallbacks.beforeDelete({
1605
+ collection: resolvedCollection,
1606
+ path: row.path,
1607
+ id: row.id,
1608
+ row: callbackRow,
1609
+ context: contextForCallback
1610
+ }) === false) preventDefault = true;
1611
+ }
1612
+ if (preventDefault) throw callbackRefusal("beforeDelete", row.path);
1610
1613
  }
1611
- if (preventDefault) return;
1614
+ } catch (callbackError) {
1615
+ throw toCallbackError(callbackError, "beforeDelete", row.path);
1612
1616
  }
1613
1617
  await this.dataService.delete(row.path, row.id);
1614
1618
  if (globalCallbacks?.afterDelete || callbacks?.afterDelete || propertyCallbacks?.afterDelete) {