@sprucelabs/data-stores 28.1.12 → 28.1.14

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.
@@ -26,7 +26,6 @@ const SpruceError_1 = __importDefault(require("../errors/SpruceError"));
26
26
  const AbstractMutexer_1 = __importDefault(require("../mutexers/AbstractMutexer"));
27
27
  const generateId_1 = __importDefault(require("../utilities/generateId"));
28
28
  const mongo_utility_1 = __importDefault(require("../utilities/mongo.utility"));
29
- const mapIndexFilterToNeDbQuery_1 = __importDefault(require("./mapIndexFilterToNeDbQuery"));
30
29
  const normalizeIndex_1 = __importDefault(require("./normalizeIndex"));
31
30
  dotenv_1.default.config();
32
31
  class NeDbDatabase extends AbstractMutexer_1.default {
@@ -292,22 +291,30 @@ class NeDbDatabase extends AbstractMutexer_1.default {
292
291
  if (col._uniqueIndexes) {
293
292
  for (const index of col._uniqueIndexes) {
294
293
  const { fields, filter } = (0, normalizeIndex_1.default)(index);
294
+ if (filter) {
295
+ let shouldSkip = false;
296
+ for (const key in filter) {
297
+ if (values[key] === NULL_PLACEHOLDER ||
298
+ typeof values[key] === 'undefined') {
299
+ shouldSkip = true;
300
+ break;
301
+ }
302
+ }
303
+ if (shouldSkip) {
304
+ continue;
305
+ }
306
+ }
295
307
  const existing = query
296
308
  ? await this.findOne(collection, query)
297
309
  : null;
298
- let q = filter
299
- ? (0, mapIndexFilterToNeDbQuery_1.default)(filter)
300
- : {};
310
+ let q = {};
301
311
  const duplicateFields = [];
302
312
  const duplicateValues = [];
303
313
  fields.forEach((f) => {
304
314
  let value = (0, get_1.default)(values, f);
305
- if (value === NULL_PLACEHOLDER && q[f]) {
306
- value = q[f];
307
- }
308
- q[f] = value;
309
315
  duplicateFields.push(f);
310
- duplicateValues.push(q[f]);
316
+ duplicateValues.push(value);
317
+ q[f] = value;
311
318
  });
312
319
  const destination = await this.findOne(collection, q);
313
320
  if (destination && (existing === null || existing === void 0 ? void 0 : existing.id) !== destination.id) {
@@ -30,7 +30,6 @@ import SpruceError from '../errors/SpruceError.js';
30
30
  import AbstractMutexer from '../mutexers/AbstractMutexer.js';
31
31
  import generateId from '../utilities/generateId.js';
32
32
  import mongoUtil from '../utilities/mongo.utility.js';
33
- import mapIndexFilterToNeDbQuery from './mapIndexFilterToNeDbQuery.js';
34
33
  import normalizeIndex from './normalizeIndex.js';
35
34
  dotenv.config();
36
35
  export default class NeDbDatabase extends AbstractMutexer {
@@ -327,22 +326,30 @@ export default class NeDbDatabase extends AbstractMutexer {
327
326
  if (col._uniqueIndexes) {
328
327
  for (const index of col._uniqueIndexes) {
329
328
  const { fields, filter } = normalizeIndex(index);
329
+ if (filter) {
330
+ let shouldSkip = false;
331
+ for (const key in filter) {
332
+ if (values[key] === NULL_PLACEHOLDER ||
333
+ typeof values[key] === 'undefined') {
334
+ shouldSkip = true;
335
+ break;
336
+ }
337
+ }
338
+ if (shouldSkip) {
339
+ continue;
340
+ }
341
+ }
330
342
  const existing = query
331
343
  ? yield this.findOne(collection, query)
332
344
  : null;
333
- let q = filter
334
- ? mapIndexFilterToNeDbQuery(filter)
335
- : {};
345
+ let q = {};
336
346
  const duplicateFields = [];
337
347
  const duplicateValues = [];
338
348
  fields.forEach((f) => {
339
349
  let value = get(values, f);
340
- if (value === NULL_PLACEHOLDER && q[f]) {
341
- value = q[f];
342
- }
343
- q[f] = value;
344
350
  duplicateFields.push(f);
345
- duplicateValues.push(q[f]);
351
+ duplicateValues.push(value);
352
+ q[f] = value;
346
353
  });
347
354
  const destination = yield this.findOne(collection, q);
348
355
  if (destination && (existing === null || existing === void 0 ? void 0 : existing.id) !== destination.id) {
@@ -1469,14 +1469,14 @@ const databaseAssertUtil = {
1469
1469
  },
1470
1470
  assertCanSyncUniqueIndexesWithFilterExpression(connect) {
1471
1471
  return __awaiter(this, void 0, void 0, function* () {
1472
- var _a, _b, _c, _d;
1472
+ var _a, _b, _c, _d, _e;
1473
1473
  const db = yield connectToDabatase(connect);
1474
1474
  try {
1475
1475
  yield db.syncUniqueIndexes(this.collectionName, [
1476
1476
  {
1477
1477
  fields: ['uniqueField', 'someField3'],
1478
1478
  filter: {
1479
- uniqueField: { $exists: true },
1479
+ uniqueField: { $type: 'string' },
1480
1480
  },
1481
1481
  },
1482
1482
  ]);
@@ -1518,13 +1518,13 @@ const databaseAssertUtil = {
1518
1518
  {
1519
1519
  fields: ['uniqueField', 'someField3'],
1520
1520
  filter: {
1521
- uniqueField: { $exists: true },
1521
+ uniqueField: { $type: 'string' },
1522
1522
  },
1523
1523
  },
1524
1524
  {
1525
1525
  fields: ['slug', 'someField3'],
1526
1526
  filter: {
1527
- slug: { $exists: true, $type: 'string' },
1527
+ slug: { $type: 'string' },
1528
1528
  },
1529
1529
  },
1530
1530
  ]);
@@ -1548,9 +1548,51 @@ const databaseAssertUtil = {
1548
1548
  });
1549
1549
  }
1550
1550
  catch (err) {
1551
- assert.fail((_d = `createOne() should not throw if index has filter { \$exists: true, \$type: 'string' }.\n\n` +
1551
+ assert.fail((_d = `createOne() should not throw since index has filter { slug: { \$type: 'string' } }.\n\n` +
1552
1552
  err.stack) !== null && _d !== void 0 ? _d : err.message);
1553
1553
  }
1554
+ try {
1555
+ yield db.createOne(this.collectionName, {
1556
+ name: generateId(),
1557
+ uniqueField: null,
1558
+ slug: '555-000-0002',
1559
+ someField3: 'next',
1560
+ });
1561
+ }
1562
+ catch (err) {
1563
+ assert.fail((_e = `createOne() should not throw since index has filter {uniqueField: { \$type: 'string' } }.\n\n` +
1564
+ err.stack) !== null && _e !== void 0 ? _e : err.message);
1565
+ }
1566
+ yield assert.doesThrowAsync(() => db.createOne(this.collectionName, {
1567
+ name: generateId(),
1568
+ uniqueField: null,
1569
+ slug: '555-000-0002',
1570
+ someField3: 'next',
1571
+ }), undefined, `createOne() should throw since index has filter { slug: { \$type: 'string' } }.`);
1572
+ yield db.createOne(this.collectionName, {
1573
+ name: generateId(),
1574
+ uniqueField: undefined,
1575
+ slug: '555-000-0004',
1576
+ someField3: undefined,
1577
+ });
1578
+ yield db.createOne(this.collectionName, {
1579
+ name: generateId(),
1580
+ uniqueField: undefined,
1581
+ slug: '555-000-0003',
1582
+ someField3: undefined,
1583
+ });
1584
+ const name = generateId();
1585
+ yield db.createOne(this.collectionName, {
1586
+ name,
1587
+ uniqueField: generateId(),
1588
+ slug: undefined,
1589
+ someField3: undefined,
1590
+ });
1591
+ yield db.updateOne(this.collectionName, {
1592
+ name,
1593
+ }, {
1594
+ someField2: 'hey',
1595
+ });
1554
1596
  yield this.shutdown(db);
1555
1597
  });
1556
1598
  },
@@ -1344,14 +1344,14 @@ const databaseAssertUtil = {
1344
1344
  await this.shutdown(db);
1345
1345
  },
1346
1346
  async assertCanSyncUniqueIndexesWithFilterExpression(connect) {
1347
- var _a, _b, _c, _d;
1347
+ var _a, _b, _c, _d, _e;
1348
1348
  const db = await connectToDabatase(connect);
1349
1349
  try {
1350
1350
  await db.syncUniqueIndexes(this.collectionName, [
1351
1351
  {
1352
1352
  fields: ['uniqueField', 'someField3'],
1353
1353
  filter: {
1354
- uniqueField: { $exists: true },
1354
+ uniqueField: { $type: 'string' },
1355
1355
  },
1356
1356
  },
1357
1357
  ]);
@@ -1393,13 +1393,13 @@ const databaseAssertUtil = {
1393
1393
  {
1394
1394
  fields: ['uniqueField', 'someField3'],
1395
1395
  filter: {
1396
- uniqueField: { $exists: true },
1396
+ uniqueField: { $type: 'string' },
1397
1397
  },
1398
1398
  },
1399
1399
  {
1400
1400
  fields: ['slug', 'someField3'],
1401
1401
  filter: {
1402
- slug: { $exists: true, $type: 'string' },
1402
+ slug: { $type: 'string' },
1403
1403
  },
1404
1404
  },
1405
1405
  ]);
@@ -1423,9 +1423,51 @@ const databaseAssertUtil = {
1423
1423
  });
1424
1424
  }
1425
1425
  catch (err) {
1426
- test_utils_1.assert.fail((_d = `createOne() should not throw if index has filter { \$exists: true, \$type: 'string' }.\n\n` +
1426
+ test_utils_1.assert.fail((_d = `createOne() should not throw since index has filter { slug: { \$type: 'string' } }.\n\n` +
1427
1427
  err.stack) !== null && _d !== void 0 ? _d : err.message);
1428
1428
  }
1429
+ try {
1430
+ await db.createOne(this.collectionName, {
1431
+ name: (0, generateId_1.default)(),
1432
+ uniqueField: null,
1433
+ slug: '555-000-0002',
1434
+ someField3: 'next',
1435
+ });
1436
+ }
1437
+ catch (err) {
1438
+ test_utils_1.assert.fail((_e = `createOne() should not throw since index has filter {uniqueField: { \$type: 'string' } }.\n\n` +
1439
+ err.stack) !== null && _e !== void 0 ? _e : err.message);
1440
+ }
1441
+ await test_utils_1.assert.doesThrowAsync(() => db.createOne(this.collectionName, {
1442
+ name: (0, generateId_1.default)(),
1443
+ uniqueField: null,
1444
+ slug: '555-000-0002',
1445
+ someField3: 'next',
1446
+ }), undefined, `createOne() should throw since index has filter { slug: { \$type: 'string' } }.`);
1447
+ await db.createOne(this.collectionName, {
1448
+ name: (0, generateId_1.default)(),
1449
+ uniqueField: undefined,
1450
+ slug: '555-000-0004',
1451
+ someField3: undefined,
1452
+ });
1453
+ await db.createOne(this.collectionName, {
1454
+ name: (0, generateId_1.default)(),
1455
+ uniqueField: undefined,
1456
+ slug: '555-000-0003',
1457
+ someField3: undefined,
1458
+ });
1459
+ const name = (0, generateId_1.default)();
1460
+ await db.createOne(this.collectionName, {
1461
+ name,
1462
+ uniqueField: (0, generateId_1.default)(),
1463
+ slug: undefined,
1464
+ someField3: undefined,
1465
+ });
1466
+ await db.updateOne(this.collectionName, {
1467
+ name,
1468
+ }, {
1469
+ someField2: 'hey',
1470
+ });
1429
1471
  await this.shutdown(db);
1430
1472
  },
1431
1473
  async assertSyncIndexesRemovesExtraIndexes(connect) {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "28.1.12",
6
+ "version": "28.1.14",
7
7
  "files": [
8
8
  "build/**/*",
9
9
  "!build/__tests__",