@sprucelabs/data-stores 28.1.349 → 28.2.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.
- package/build/databases/MongoDatabase.d.ts +2 -4
- package/build/databases/MongoDatabase.js +10 -10
- package/build/databases/database.utilities.js +9 -1
- package/build/esm/databases/MongoDatabase.d.ts +2 -4
- package/build/esm/databases/MongoDatabase.js +10 -10
- package/build/esm/databases/database.utilities.js +9 -1
- package/build/esm/tests/databaseAssertUtil.d.ts +2 -2
- package/build/esm/tests/databaseAssertUtil.js +6 -5
- package/build/esm/types/database.types.d.ts +1 -0
- package/build/tests/databaseAssertUtil.d.ts +2 -2
- package/build/tests/databaseAssertUtil.js +6 -5
- package/build/types/database.types.d.ts +1 -0
- package/package.json +1 -1
@@ -28,10 +28,8 @@ export default class MongoDatabase implements Database {
|
|
28
28
|
private listIndexes;
|
29
29
|
dropIndex(collection: string, index: Index): Promise<void>;
|
30
30
|
getUniqueIndexes(collection: string): Promise<IndexWithFilter[]>;
|
31
|
-
getIndexes(collection: string, shouldIncludeUnique?: boolean): Promise<IndexWithFilter[]
|
32
|
-
|
33
|
-
filter: any;
|
34
|
-
}[]>;
|
31
|
+
getIndexes(collection: string, shouldIncludeUnique?: boolean): Promise<IndexWithFilter[]>;
|
32
|
+
private mongoIndexToIndexWithFilter;
|
35
33
|
createIndex(collection: string, index: Index): Promise<void>;
|
36
34
|
private assertIndexDoesNotExist;
|
37
35
|
private doesInclude;
|
@@ -276,18 +276,12 @@ class MongoDatabase {
|
|
276
276
|
try {
|
277
277
|
const indexes = await this.listIndexes(collection);
|
278
278
|
if (shouldIncludeUnique) {
|
279
|
-
return indexes.map((index) => (
|
280
|
-
fields: Object.keys(index.key),
|
281
|
-
filter: index.partialFilterExpression,
|
282
|
-
}));
|
279
|
+
return indexes.map((index) => this.mongoIndexToIndexWithFilter(index));
|
283
280
|
}
|
284
281
|
const nonUniqueIndexes = [];
|
285
282
|
for (const index of indexes) {
|
286
283
|
if (!index.unique) {
|
287
|
-
nonUniqueIndexes.push(
|
288
|
-
fields: Object.keys(index.key),
|
289
|
-
filter: undefined,
|
290
|
-
});
|
284
|
+
nonUniqueIndexes.push(this.mongoIndexToIndexWithFilter(index));
|
291
285
|
}
|
292
286
|
}
|
293
287
|
return nonUniqueIndexes;
|
@@ -296,6 +290,13 @@ class MongoDatabase {
|
|
296
290
|
return [];
|
297
291
|
}
|
298
292
|
}
|
293
|
+
mongoIndexToIndexWithFilter(index) {
|
294
|
+
return {
|
295
|
+
fields: Object.keys(index.key),
|
296
|
+
filter: index.partialFilterExpression,
|
297
|
+
name: index.name,
|
298
|
+
};
|
299
|
+
}
|
299
300
|
async createIndex(collection, index) {
|
300
301
|
const currentIndexes = await this.getIndexes(collection);
|
301
302
|
this.assertIndexDoesNotExist(currentIndexes, index, collection);
|
@@ -394,8 +395,7 @@ class MongoDatabase {
|
|
394
395
|
return (0, database_utilities_1.generateIndexName)(this.normalizeIndex(indexWithFilter));
|
395
396
|
}
|
396
397
|
normalizeIndex(index) {
|
397
|
-
|
398
|
-
return { fields, filter };
|
398
|
+
return (0, database_utilities_1.normalizeIndex)(index);
|
399
399
|
}
|
400
400
|
async syncUniqueIndexes(collectionName, indexes) {
|
401
401
|
await this._syncIndexes(collectionName, indexes, 'createUniqueIndex', true);
|
@@ -23,6 +23,9 @@ function areIndexesEqual(left, right) {
|
|
23
23
|
return name1 === name2;
|
24
24
|
}
|
25
25
|
function generateIndexName(indexWithFilter) {
|
26
|
+
if (indexWithFilter.name) {
|
27
|
+
return indexWithFilter.name;
|
28
|
+
}
|
26
29
|
let name = indexWithFilter.fields.join('_');
|
27
30
|
if (indexWithFilter.filter) {
|
28
31
|
name += '_filtered';
|
@@ -30,10 +33,15 @@ function generateIndexName(indexWithFilter) {
|
|
30
33
|
return name;
|
31
34
|
}
|
32
35
|
function normalizeIndex(index) {
|
36
|
+
var _a;
|
33
37
|
const fields = Array.isArray(index) ? index : index.fields;
|
34
38
|
const filter = Array.isArray(index) ? undefined : index.filter;
|
35
39
|
fields.sort();
|
36
|
-
return {
|
40
|
+
return {
|
41
|
+
fields,
|
42
|
+
filter,
|
43
|
+
name: (_a = index.name) !== null && _a !== void 0 ? _a : undefined,
|
44
|
+
};
|
37
45
|
}
|
38
46
|
function pluckMissingIndexes(left, right) {
|
39
47
|
return (0, differenceWith_1.default)(left, right, areIndexesEqual);
|
@@ -28,10 +28,8 @@ export default class MongoDatabase implements Database {
|
|
28
28
|
private listIndexes;
|
29
29
|
dropIndex(collection: string, index: Index): Promise<void>;
|
30
30
|
getUniqueIndexes(collection: string): Promise<IndexWithFilter[]>;
|
31
|
-
getIndexes(collection: string, shouldIncludeUnique?: boolean): Promise<IndexWithFilter[]
|
32
|
-
|
33
|
-
filter: any;
|
34
|
-
}[]>;
|
31
|
+
getIndexes(collection: string, shouldIncludeUnique?: boolean): Promise<IndexWithFilter[]>;
|
32
|
+
private mongoIndexToIndexWithFilter;
|
35
33
|
createIndex(collection: string, index: Index): Promise<void>;
|
36
34
|
private assertIndexDoesNotExist;
|
37
35
|
private doesInclude;
|
@@ -306,18 +306,12 @@ export default class MongoDatabase {
|
|
306
306
|
try {
|
307
307
|
const indexes = yield this.listIndexes(collection);
|
308
308
|
if (shouldIncludeUnique) {
|
309
|
-
return indexes.map((index) => (
|
310
|
-
fields: Object.keys(index.key),
|
311
|
-
filter: index.partialFilterExpression,
|
312
|
-
}));
|
309
|
+
return indexes.map((index) => this.mongoIndexToIndexWithFilter(index));
|
313
310
|
}
|
314
311
|
const nonUniqueIndexes = [];
|
315
312
|
for (const index of indexes) {
|
316
313
|
if (!index.unique) {
|
317
|
-
nonUniqueIndexes.push(
|
318
|
-
fields: Object.keys(index.key),
|
319
|
-
filter: undefined,
|
320
|
-
});
|
314
|
+
nonUniqueIndexes.push(this.mongoIndexToIndexWithFilter(index));
|
321
315
|
}
|
322
316
|
}
|
323
317
|
return nonUniqueIndexes;
|
@@ -327,6 +321,13 @@ export default class MongoDatabase {
|
|
327
321
|
}
|
328
322
|
});
|
329
323
|
}
|
324
|
+
mongoIndexToIndexWithFilter(index) {
|
325
|
+
return {
|
326
|
+
fields: Object.keys(index.key),
|
327
|
+
filter: index.partialFilterExpression,
|
328
|
+
name: index.name,
|
329
|
+
};
|
330
|
+
}
|
330
331
|
createIndex(collection, index) {
|
331
332
|
return __awaiter(this, void 0, void 0, function* () {
|
332
333
|
const currentIndexes = yield this.getIndexes(collection);
|
@@ -433,8 +434,7 @@ export default class MongoDatabase {
|
|
433
434
|
return generateIndexName(this.normalizeIndex(indexWithFilter));
|
434
435
|
}
|
435
436
|
normalizeIndex(index) {
|
436
|
-
|
437
|
-
return { fields, filter };
|
437
|
+
return normalizeIndex(index);
|
438
438
|
}
|
439
439
|
syncUniqueIndexes(collectionName, indexes) {
|
440
440
|
return __awaiter(this, void 0, void 0, function* () {
|
@@ -13,6 +13,9 @@ export function areIndexesEqual(left, right) {
|
|
13
13
|
return name1 === name2;
|
14
14
|
}
|
15
15
|
export function generateIndexName(indexWithFilter) {
|
16
|
+
if (indexWithFilter.name) {
|
17
|
+
return indexWithFilter.name;
|
18
|
+
}
|
16
19
|
let name = indexWithFilter.fields.join('_');
|
17
20
|
if (indexWithFilter.filter) {
|
18
21
|
name += '_filtered';
|
@@ -20,10 +23,15 @@ export function generateIndexName(indexWithFilter) {
|
|
20
23
|
return name;
|
21
24
|
}
|
22
25
|
export function normalizeIndex(index) {
|
26
|
+
var _a;
|
23
27
|
const fields = Array.isArray(index) ? index : index.fields;
|
24
28
|
const filter = Array.isArray(index) ? undefined : index.filter;
|
25
29
|
fields.sort();
|
26
|
-
return {
|
30
|
+
return {
|
31
|
+
fields,
|
32
|
+
filter,
|
33
|
+
name: (_a = index.name) !== null && _a !== void 0 ? _a : undefined,
|
34
|
+
};
|
27
35
|
}
|
28
36
|
export function pluckMissingIndexes(left, right) {
|
29
37
|
return differenceWith(left, right, areIndexesEqual);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Database, IndexWithFilter, TestConnect } from '../types/database.types';
|
2
2
|
import { DataStore } from '../types/stores.types';
|
3
|
-
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "
|
3
|
+
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "assertKnowsIfConnectionClosed", "assertCanSortDesc", "assertCanSortAsc", "assertCanSortById", "assertCanQueryWithOr", "assertGeneratesIdDifferentEachTime", "assertInsertingGeneratesId", "assertCanCreateMany", "assertCanCreateWithObjectField", "assertCanCountOnId", "assertCanCount", "assertThrowsWhenUpdatingRecordNotFound", "assertCanUpdate", "assertCanUpdateMany", "assertCanPushOntoArrayValue", "assertCanUpdateWithObjectField", "assertCanUpdateFieldInObjectFieldWithTargettedWhere", "assertCanSaveAndGetNullAndUndefined", "assertCanUpsertOne", "assertCanUpsertNull", "assertCanPushToArrayOnUpsert", "assertCanSyncUniqueIndexesWithFilterExpression", "assertEmptyDatabaseReturnsEmptyArray", "assertFindOneOnEmptyDatabaseReturnsNull", "assertCanLimitResults", "assertCanLimitResultsToZero", "assertCanFindWithBooleanField", "assertCanQueryByGtLtGteLteNe", "assertCanQueryPathWithDotSyntax", "assertCanReturnOnlySelectFields", "assertCanSearchByRegex", "assertCanFindWithNe", "assertCanFindWithIn", "assertCanDeleteRecord", "assertCanDeleteOne", "assertHasNoUniqueIndexToStart", "assertCanCreateUniqueIndex", "assertCanCreateMultiFieldUniqueIndex", "assertCantCreateUniqueIndexTwice", "assertCanDropUniqueIndex", "assertCanDropCompoundUniqueIndex", "assertCantDropUniqueIndexThatDoesntExist", "assertCantDropIndexWhenNoIndexExists", "assertCantDropCompoundUniqueIndexThatDoesntExist", "assertSyncingUniqueIndexsAddsMissingIndexes", "assertSyncingUniqueIndexsSkipsExistingIndexs", "assertSyncingUniqueIndexesRemovesExtraIndexes", "assertSyncingUniqueIndexesIsRaceProof", "assertSyncingIndexesDoesNotAddAndRemove", "assertUniqueIndexBlocksDuplicates", "assertDuplicateKeyThrowsOnInsert", "assertSettingUniqueIndexViolationThrowsSpruceError", "assertCanCreateUniqueIndexOnNestedField", "assertUpsertWithUniqueIndex", "assertNestedFieldIndexUpdates", "assertHasNoIndexToStart", "assertCanCreateIndex", "assertCantCreateSameIndexTwice", "assertCanCreateMultiFieldIndex", "assertCanDropIndex", "assertCanDropCompoundIndex", "assertCantDropCompoundIndexThatDoesNotExist", "assertSyncIndexesSkipsExisting", "assertSyncIndexesRemovesExtraIndexes", "assertSyncIndexesHandlesRaceConditions", "assertSyncIndexesDoesNotRemoveExisting", "assertDuplicateFieldsWithMultipleUniqueIndexesWorkAsExpected", "assertCanSyncIndexesWithoutPartialThenAgainWithProperlyUpdates"];
|
4
4
|
export type DatabaseAssertionName = (typeof methods)[number];
|
5
5
|
declare const databaseAssertUtil: {
|
6
6
|
collectionName: string;
|
@@ -8,7 +8,7 @@ declare const databaseAssertUtil: {
|
|
8
8
|
_getIndexesWith_IdFilteredOut(db: Database): Promise<IndexWithFilter[]>;
|
9
9
|
_filterOut_Id(allIndexes: IndexWithFilter[]): IndexWithFilter[];
|
10
10
|
_assertUpdateUpdatedRightNumberOfRecords(db: Database, search: Record<string, any>, updates: Record<string, any>, expectedUpdateCount: number): Promise<void>;
|
11
|
-
|
11
|
+
assertGeneratesIdDifferentEachTime(connect: TestConnect): Promise<void>;
|
12
12
|
assertCanSortDesc(connect: TestConnect): Promise<void>;
|
13
13
|
assertCanSortAsc(connect: TestConnect): Promise<void>;
|
14
14
|
assertInsertingGeneratesId(connect: TestConnect): Promise<void>;
|
@@ -17,17 +17,14 @@ const methods = [
|
|
17
17
|
'assertThrowsWhenCantConnect',
|
18
18
|
'assertThrowsWithBadDatabaseName',
|
19
19
|
//inserting
|
20
|
-
'assertEmptyDatabaseReturnsEmptyArray',
|
21
20
|
'assertKnowsIfConnectionClosed',
|
22
|
-
'assertFindOneOnEmptyDatabaseReturnsNull',
|
23
21
|
'assertCanSortDesc',
|
24
22
|
'assertCanSortAsc',
|
25
23
|
'assertCanSortById',
|
26
24
|
'assertCanQueryWithOr',
|
27
|
-
'
|
25
|
+
'assertGeneratesIdDifferentEachTime',
|
28
26
|
'assertInsertingGeneratesId',
|
29
27
|
'assertCanCreateMany',
|
30
|
-
'assertCanLimitResults',
|
31
28
|
'assertCanCreateWithObjectField',
|
32
29
|
//counting
|
33
30
|
'assertCanCountOnId',
|
@@ -103,6 +100,10 @@ const databaseAssertUtil = {
|
|
103
100
|
const db = yield connectToDabatase(connect);
|
104
101
|
yield db.dropDatabase();
|
105
102
|
yield this.shutdown(db);
|
103
|
+
if (tests === null || tests === void 0 ? void 0 : tests[0].startsWith('!')) {
|
104
|
+
//@ts-ignore
|
105
|
+
tests = methods;
|
106
|
+
}
|
106
107
|
const toRun = tests !== null && tests !== void 0 ? tests : methods;
|
107
108
|
for (const method of toRun) {
|
108
109
|
try {
|
@@ -134,7 +135,7 @@ const databaseAssertUtil = {
|
|
134
135
|
assert.isEqual(count, expectedUpdateCount);
|
135
136
|
});
|
136
137
|
},
|
137
|
-
|
138
|
+
assertGeneratesIdDifferentEachTime(connect) {
|
138
139
|
return __awaiter(this, void 0, void 0, function* () {
|
139
140
|
const db = yield connectToDabatase(connect);
|
140
141
|
const id1 = db.generateId();
|
@@ -41,6 +41,7 @@ export type TestConnect = (connectionString?: string, dbName?: string) => Promis
|
|
41
41
|
export interface IndexWithFilter {
|
42
42
|
fields: string[];
|
43
43
|
filter?: Record<string, any>;
|
44
|
+
name?: string;
|
44
45
|
}
|
45
46
|
export type Index = string[] | IndexWithFilter;
|
46
47
|
export interface CreateOptions extends DatabaseInternalOptions {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Database, IndexWithFilter, TestConnect } from '../types/database.types';
|
2
2
|
import { DataStore } from '../types/stores.types';
|
3
|
-
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "
|
3
|
+
declare const methods: readonly ["assertThrowsWithInvalidConnectionString", "assertThrowsWhenCantConnect", "assertThrowsWithBadDatabaseName", "assertKnowsIfConnectionClosed", "assertCanSortDesc", "assertCanSortAsc", "assertCanSortById", "assertCanQueryWithOr", "assertGeneratesIdDifferentEachTime", "assertInsertingGeneratesId", "assertCanCreateMany", "assertCanCreateWithObjectField", "assertCanCountOnId", "assertCanCount", "assertThrowsWhenUpdatingRecordNotFound", "assertCanUpdate", "assertCanUpdateMany", "assertCanPushOntoArrayValue", "assertCanUpdateWithObjectField", "assertCanUpdateFieldInObjectFieldWithTargettedWhere", "assertCanSaveAndGetNullAndUndefined", "assertCanUpsertOne", "assertCanUpsertNull", "assertCanPushToArrayOnUpsert", "assertCanSyncUniqueIndexesWithFilterExpression", "assertEmptyDatabaseReturnsEmptyArray", "assertFindOneOnEmptyDatabaseReturnsNull", "assertCanLimitResults", "assertCanLimitResultsToZero", "assertCanFindWithBooleanField", "assertCanQueryByGtLtGteLteNe", "assertCanQueryPathWithDotSyntax", "assertCanReturnOnlySelectFields", "assertCanSearchByRegex", "assertCanFindWithNe", "assertCanFindWithIn", "assertCanDeleteRecord", "assertCanDeleteOne", "assertHasNoUniqueIndexToStart", "assertCanCreateUniqueIndex", "assertCanCreateMultiFieldUniqueIndex", "assertCantCreateUniqueIndexTwice", "assertCanDropUniqueIndex", "assertCanDropCompoundUniqueIndex", "assertCantDropUniqueIndexThatDoesntExist", "assertCantDropIndexWhenNoIndexExists", "assertCantDropCompoundUniqueIndexThatDoesntExist", "assertSyncingUniqueIndexsAddsMissingIndexes", "assertSyncingUniqueIndexsSkipsExistingIndexs", "assertSyncingUniqueIndexesRemovesExtraIndexes", "assertSyncingUniqueIndexesIsRaceProof", "assertSyncingIndexesDoesNotAddAndRemove", "assertUniqueIndexBlocksDuplicates", "assertDuplicateKeyThrowsOnInsert", "assertSettingUniqueIndexViolationThrowsSpruceError", "assertCanCreateUniqueIndexOnNestedField", "assertUpsertWithUniqueIndex", "assertNestedFieldIndexUpdates", "assertHasNoIndexToStart", "assertCanCreateIndex", "assertCantCreateSameIndexTwice", "assertCanCreateMultiFieldIndex", "assertCanDropIndex", "assertCanDropCompoundIndex", "assertCantDropCompoundIndexThatDoesNotExist", "assertSyncIndexesSkipsExisting", "assertSyncIndexesRemovesExtraIndexes", "assertSyncIndexesHandlesRaceConditions", "assertSyncIndexesDoesNotRemoveExisting", "assertDuplicateFieldsWithMultipleUniqueIndexesWorkAsExpected", "assertCanSyncIndexesWithoutPartialThenAgainWithProperlyUpdates"];
|
4
4
|
export type DatabaseAssertionName = (typeof methods)[number];
|
5
5
|
declare const databaseAssertUtil: {
|
6
6
|
collectionName: string;
|
@@ -8,7 +8,7 @@ declare const databaseAssertUtil: {
|
|
8
8
|
_getIndexesWith_IdFilteredOut(db: Database): Promise<IndexWithFilter[]>;
|
9
9
|
_filterOut_Id(allIndexes: IndexWithFilter[]): IndexWithFilter[];
|
10
10
|
_assertUpdateUpdatedRightNumberOfRecords(db: Database, search: Record<string, any>, updates: Record<string, any>, expectedUpdateCount: number): Promise<void>;
|
11
|
-
|
11
|
+
assertGeneratesIdDifferentEachTime(connect: TestConnect): Promise<void>;
|
12
12
|
assertCanSortDesc(connect: TestConnect): Promise<void>;
|
13
13
|
assertCanSortAsc(connect: TestConnect): Promise<void>;
|
14
14
|
assertInsertingGeneratesId(connect: TestConnect): Promise<void>;
|
@@ -13,17 +13,14 @@ const methods = [
|
|
13
13
|
'assertThrowsWhenCantConnect',
|
14
14
|
'assertThrowsWithBadDatabaseName',
|
15
15
|
//inserting
|
16
|
-
'assertEmptyDatabaseReturnsEmptyArray',
|
17
16
|
'assertKnowsIfConnectionClosed',
|
18
|
-
'assertFindOneOnEmptyDatabaseReturnsNull',
|
19
17
|
'assertCanSortDesc',
|
20
18
|
'assertCanSortAsc',
|
21
19
|
'assertCanSortById',
|
22
20
|
'assertCanQueryWithOr',
|
23
|
-
'
|
21
|
+
'assertGeneratesIdDifferentEachTime',
|
24
22
|
'assertInsertingGeneratesId',
|
25
23
|
'assertCanCreateMany',
|
26
|
-
'assertCanLimitResults',
|
27
24
|
'assertCanCreateWithObjectField',
|
28
25
|
//counting
|
29
26
|
'assertCanCountOnId',
|
@@ -98,6 +95,10 @@ const databaseAssertUtil = {
|
|
98
95
|
const db = await connectToDabatase(connect);
|
99
96
|
await db.dropDatabase();
|
100
97
|
await this.shutdown(db);
|
98
|
+
if (tests === null || tests === void 0 ? void 0 : tests[0].startsWith('!')) {
|
99
|
+
//@ts-ignore
|
100
|
+
tests = methods;
|
101
|
+
}
|
101
102
|
const toRun = tests !== null && tests !== void 0 ? tests : methods;
|
102
103
|
for (const method of toRun) {
|
103
104
|
try {
|
@@ -124,7 +125,7 @@ const databaseAssertUtil = {
|
|
124
125
|
const count = await db.count(this.collectionName, updates);
|
125
126
|
test_utils_1.assert.isEqual(count, expectedUpdateCount);
|
126
127
|
},
|
127
|
-
async
|
128
|
+
async assertGeneratesIdDifferentEachTime(connect) {
|
128
129
|
const db = await connectToDabatase(connect);
|
129
130
|
const id1 = db.generateId();
|
130
131
|
const id2 = db.generateId();
|
@@ -41,6 +41,7 @@ export type TestConnect = (connectionString?: string, dbName?: string) => Promis
|
|
41
41
|
export interface IndexWithFilter {
|
42
42
|
fields: string[];
|
43
43
|
filter?: Record<string, any>;
|
44
|
+
name?: string;
|
44
45
|
}
|
45
46
|
export type Index = string[] | IndexWithFilter;
|
46
47
|
export interface CreateOptions extends DatabaseInternalOptions {
|