nongo-driver 2.12.6 → 3.1.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/dist/atlas-api.js +6 -6
- package/dist/atlas-api.js.map +1 -1
- package/dist/cursor-iterator.d.ts +1 -2
- package/dist/cursor-iterator.js +3 -1
- package/dist/cursor-iterator.js.map +1 -1
- package/dist/generate-interfaces.js +24 -7
- package/dist/generate-interfaces.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +33 -17
- package/dist/index.js.map +1 -1
- package/dist/interface/atlas/field.d.ts +1 -1
- package/dist/interface/atlas/field.js +1 -0
- package/dist/interface/atlas/field.js.map +1 -1
- package/dist/interface/atlas/index.js +15 -4
- package/dist/interface/atlas/index.js.map +1 -1
- package/dist/interface/index.d.ts +1 -10
- package/dist/interface/index.js +15 -4
- package/dist/interface/index.js.map +1 -1
- package/dist/model.d.ts +25 -13
- package/dist/model.js +76 -34
- package/dist/model.js.map +1 -1
- package/dist/mongo-index.d.ts +2 -3
- package/dist/mongo-index.js.map +1 -1
- package/dist/nongo.d.ts +5 -2
- package/dist/nongo.js +45 -21
- package/dist/nongo.js.map +1 -1
- package/dist/revision-model.d.ts +5 -0
- package/dist/revision-model.js +24 -0
- package/dist/revision-model.js.map +1 -0
- package/dist/schema-parser.js +10 -10
- package/dist/schema-parser.js.map +1 -1
- package/dist/ts-interface-generator.js +18 -2
- package/dist/ts-interface-generator.js.map +1 -1
- package/dist/validator.js +1 -1
- package/dist/validator.js.map +1 -1
- package/jest.config.js +0 -5
- package/package.json +19 -25
- package/src/atlas-api.ts +11 -40
- package/src/cursor-iterator.ts +1 -3
- package/src/index.ts +1 -1
- package/src/interface/index.ts +0 -11
- package/src/model.ts +92 -44
- package/src/mongo-index.ts +1 -3
- package/src/nongo.ts +34 -6
- package/src/revision-model.ts +22 -0
- package/test/database-helper.ts +26 -13
- package/test/model-versioning.test.ts +83 -0
- package/test/models/dummy-model-changed-obj.ts +12 -0
- package/test/models/dummy-model-obj.ts +40 -0
- package/test/models/dummy-model-with-max-index-obj.ts +195 -0
- package/test/models/dummy-model-with-revision-obj.ts +13 -0
- package/test/models/dummy-model-with-revision.nongo.ts +22 -0
- package/test/models/text-index-model-modified-obj.ts +12 -0
- package/test/models/text-index-model-obj.ts +11 -0
- package/test/models/text-index-model-too-long-obj.ts +11 -0
- package/test/nongo-multi.test.ts +2 -5
- package/test/nongo.test.ts +125 -172
package/dist/atlas-api.js
CHANGED
|
@@ -23,16 +23,16 @@ class AtlasApi {
|
|
|
23
23
|
}
|
|
24
24
|
async putCustomAnalyzers(analyzers) {
|
|
25
25
|
const url = `${this.ftsUrl}/analyzers`;
|
|
26
|
-
return request_promise_1.default(Object.assign(Object.assign({}, this.defaultOptions), { url, body: analyzers }));
|
|
26
|
+
return (0, request_promise_1.default)(Object.assign(Object.assign({}, this.defaultOptions), { url, body: analyzers }));
|
|
27
27
|
}
|
|
28
28
|
async getSearchIndexes(db, collection) {
|
|
29
29
|
const url = `${this.ftsUrl}/indexes/${db}/${collection}`;
|
|
30
|
-
return request_promise_1.default(Object.assign(Object.assign({}, this.defaultOptions), { url }));
|
|
30
|
+
return (0, request_promise_1.default)(Object.assign(Object.assign({}, this.defaultOptions), { url }));
|
|
31
31
|
}
|
|
32
32
|
async createSearchIndex(db, collection, index) {
|
|
33
33
|
this.logIndexChange(db, collection, 'Creating', index.name);
|
|
34
34
|
const url = `${this.ftsUrl}/indexes`;
|
|
35
|
-
return request_promise_1.default(Object.assign(Object.assign({}, this.defaultOptions), { method: 'POST', url, body: Object.assign({ collectionName: collection, database: db }, index) }));
|
|
35
|
+
return (0, request_promise_1.default)(Object.assign(Object.assign({}, this.defaultOptions), { method: 'POST', url, body: Object.assign({ collectionName: collection, database: db }, index) }));
|
|
36
36
|
}
|
|
37
37
|
async ensureSearchIndexes(db, collection, createParams) {
|
|
38
38
|
const existingIndexes = await this.getSearchIndexes(db, collection);
|
|
@@ -55,17 +55,17 @@ class AtlasApi {
|
|
|
55
55
|
return await this.getSearchIndexes(db, collection);
|
|
56
56
|
}
|
|
57
57
|
async updateSearchIndex(db, collection, existingIndex, createParams) {
|
|
58
|
-
if (deep_equal_1.default(existingIndex.mappings, createParams.mappings)) {
|
|
58
|
+
if ((0, deep_equal_1.default)(existingIndex.mappings, createParams.mappings)) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
this.logIndexChange(db, collection, 'Updating', createParams.name);
|
|
62
62
|
const url = `${this.ftsUrl}/indexes/${existingIndex.indexID}`;
|
|
63
|
-
return request_promise_1.default(Object.assign(Object.assign({}, this.defaultOptions), { method: 'PATCH', url, body: Object.assign({ collectionName: collection, database: db }, createParams) }));
|
|
63
|
+
return (0, request_promise_1.default)(Object.assign(Object.assign({}, this.defaultOptions), { method: 'PATCH', url, body: Object.assign({ collectionName: collection, database: db }, createParams) }));
|
|
64
64
|
}
|
|
65
65
|
async deleteSearchIndex(db, collection, existingIndex) {
|
|
66
66
|
this.logIndexChange(db, collection, 'Deleting', existingIndex.name);
|
|
67
67
|
const url = `${this.ftsUrl}/indexes/${existingIndex.indexID}`;
|
|
68
|
-
return request_promise_1.default(Object.assign(Object.assign({}, this.defaultOptions), { method: 'DELETE', url }));
|
|
68
|
+
return (0, request_promise_1.default)(Object.assign(Object.assign({}, this.defaultOptions), { method: 'DELETE', url }));
|
|
69
69
|
}
|
|
70
70
|
logIndexChange(db, collection, action, indexName) {
|
|
71
71
|
logger.info(`${action} search index "${indexName}" for collection ${db}.${collection}`);
|
package/dist/atlas-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atlas-api.js","sourceRoot":"","sources":["../src/atlas-api.ts"],"names":[],"mappings":";;;;;AAAA,4DAAmC;AACnC,sEAAiC;AACjC,4DAAgC;
|
|
1
|
+
{"version":3,"file":"atlas-api.js","sourceRoot":"","sources":["../src/atlas-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { Cursor } from 'mongodb';
|
|
2
1
|
export default class CursorIterator<T = any> implements AsyncIterator<T> {
|
|
3
2
|
private cursor;
|
|
4
3
|
private map;
|
|
5
|
-
constructor(cursor:
|
|
4
|
+
constructor(cursor: any, map?: (next: any) => any);
|
|
6
5
|
[Symbol.asyncIterator]: () => this;
|
|
7
6
|
next(): Promise<IteratorResult<T>>;
|
|
8
7
|
}
|
package/dist/cursor-iterator.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var _a;
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
class CursorIterator {
|
|
4
5
|
constructor(cursor, map = (next) => next) {
|
|
5
6
|
this.cursor = cursor;
|
|
6
7
|
this.map = map;
|
|
7
|
-
this[
|
|
8
|
+
this[_a] = () => this;
|
|
8
9
|
}
|
|
9
10
|
async next() {
|
|
10
11
|
const next = await this.cursor.next();
|
|
@@ -15,4 +16,5 @@ class CursorIterator {
|
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
exports.default = CursorIterator;
|
|
19
|
+
_a = Symbol.asyncIterator;
|
|
18
20
|
//# sourceMappingURL=cursor-iterator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-iterator.js","sourceRoot":"","sources":["../src/cursor-iterator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursor-iterator.js","sourceRoot":"","sources":["../src/cursor-iterator.ts"],"names":[],"mappings":";;;AAAA,MAAqB,cAAc;IAEjC,YAAoB,MAAM,EAAU,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QAApC,WAAM,GAAN,MAAM,CAAA;QAAU,QAAG,GAAH,GAAG,CAAiB;QAGjD,QAAsB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IAF3C,CAAC;IAIM,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,IAAI,EAAE,IAAI,IAAI,IAAI;SACnB,CAAC;IACJ,CAAC;CAEF;AAfD,iCAeC;KAVS,MAAM,CAAC,aAAa"}
|
|
@@ -1,14 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
5
18
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
6
19
|
if (mod && mod.__esModule) return mod;
|
|
7
20
|
var result = {};
|
|
8
|
-
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result
|
|
9
|
-
result
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
10
23
|
return result;
|
|
11
24
|
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
12
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
29
|
const fs_1 = __importDefault(require("fs"));
|
|
14
30
|
const glob_1 = __importDefault(require("glob"));
|
|
@@ -20,6 +36,7 @@ const ts_interface_generator_1 = __importDefault(require("./ts-interface-generat
|
|
|
20
36
|
const logger = new wbb_logger_1.default('generate-interfaces.ts');
|
|
21
37
|
const getInterfacePath = (modelPath) => modelPath.replace(/.nongo\.ts$/, '-obj.ts');
|
|
22
38
|
const createInterfaces = async (modelDir, placeholder) => {
|
|
39
|
+
var _a;
|
|
23
40
|
const modelPaths = glob_1.default
|
|
24
41
|
.sync(path_1.default.join(modelDir, '/**/*.nongo.ts'))
|
|
25
42
|
.map((p) => path_1.default.resolve(p));
|
|
@@ -67,7 +84,7 @@ const createInterfaces = async (modelDir, placeholder) => {
|
|
|
67
84
|
fs_1.default.writeFileSync(interfaceFile, tempObj);
|
|
68
85
|
}
|
|
69
86
|
// Generate the actual interface for the model
|
|
70
|
-
const model = (await Promise.resolve().then(() => __importStar(require(
|
|
87
|
+
const model = (await (_a = modelPath, Promise.resolve().then(() => __importStar(require(_a))))).default;
|
|
71
88
|
new ts_interface_generator_1.default().generateInterface(model, interfaceFile);
|
|
72
89
|
}
|
|
73
90
|
};
|
|
@@ -80,7 +97,7 @@ const generateInterfaces = async (modelDir) => {
|
|
|
80
97
|
exports.default = generateInterfaces;
|
|
81
98
|
if (require.main === module) {
|
|
82
99
|
// Read the args
|
|
83
|
-
const args = minimist_1.default(process.argv.slice(2));
|
|
100
|
+
const args = (0, minimist_1.default)(process.argv.slice(2));
|
|
84
101
|
const { modelDir } = args;
|
|
85
102
|
if (!modelDir) {
|
|
86
103
|
throw Error('--modelDir <file path> is required');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-interfaces.js","sourceRoot":"","sources":["../src/generate-interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-interfaces.js","sourceRoot":"","sources":["../src/generate-interfaces.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,4 +11,4 @@ export { default as generateInterfaces } from './generate-interfaces';
|
|
|
11
11
|
export { default as NongoMap } from './nongo-map';
|
|
12
12
|
export * from './interface';
|
|
13
13
|
export { default as AtlasApi } from './atlas-api';
|
|
14
|
-
export { ObjectId, MongoClient } from 'mongodb';
|
|
14
|
+
export { ObjectId, MongoClient, SortDirection, CollectionInfo, Db, DeleteResult, FindOptions, Filter, Document, UpdateFilter, UpdateOptions } from 'mongodb';
|
package/dist/index.js
CHANGED
|
@@ -1,32 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
5
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.Db = exports.MongoClient = exports.ObjectId = exports.AtlasApi = exports.NongoMap = exports.generateInterfaces = exports.MongoIndex = exports.TsInterfaceGenerator = exports.SchemaParser = exports.Validator = exports.DynamicModel = exports.Model = exports.NongoMulti = exports.Nongo = void 0;
|
|
6
21
|
var nongo_1 = require("./nongo");
|
|
7
|
-
exports
|
|
22
|
+
Object.defineProperty(exports, "Nongo", { enumerable: true, get: function () { return __importDefault(nongo_1).default; } });
|
|
8
23
|
var nongo_multi_1 = require("./nongo-multi");
|
|
9
|
-
exports
|
|
24
|
+
Object.defineProperty(exports, "NongoMulti", { enumerable: true, get: function () { return __importDefault(nongo_multi_1).default; } });
|
|
10
25
|
var model_1 = require("./model");
|
|
11
|
-
exports
|
|
26
|
+
Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return __importDefault(model_1).default; } });
|
|
12
27
|
var dynamic_model_1 = require("./dynamic-model");
|
|
13
|
-
exports
|
|
28
|
+
Object.defineProperty(exports, "DynamicModel", { enumerable: true, get: function () { return __importDefault(dynamic_model_1).default; } });
|
|
14
29
|
var validator_1 = require("./validator");
|
|
15
|
-
exports
|
|
30
|
+
Object.defineProperty(exports, "Validator", { enumerable: true, get: function () { return __importDefault(validator_1).default; } });
|
|
16
31
|
var schema_parser_1 = require("./schema-parser");
|
|
17
|
-
exports
|
|
32
|
+
Object.defineProperty(exports, "SchemaParser", { enumerable: true, get: function () { return __importDefault(schema_parser_1).default; } });
|
|
18
33
|
var ts_interface_generator_1 = require("./ts-interface-generator");
|
|
19
|
-
exports
|
|
34
|
+
Object.defineProperty(exports, "TsInterfaceGenerator", { enumerable: true, get: function () { return __importDefault(ts_interface_generator_1).default; } });
|
|
20
35
|
var mongo_index_1 = require("./mongo-index");
|
|
21
|
-
exports
|
|
36
|
+
Object.defineProperty(exports, "MongoIndex", { enumerable: true, get: function () { return __importDefault(mongo_index_1).default; } });
|
|
22
37
|
var generate_interfaces_1 = require("./generate-interfaces");
|
|
23
|
-
exports
|
|
38
|
+
Object.defineProperty(exports, "generateInterfaces", { enumerable: true, get: function () { return __importDefault(generate_interfaces_1).default; } });
|
|
24
39
|
var nongo_map_1 = require("./nongo-map");
|
|
25
|
-
exports
|
|
26
|
-
|
|
40
|
+
Object.defineProperty(exports, "NongoMap", { enumerable: true, get: function () { return __importDefault(nongo_map_1).default; } });
|
|
41
|
+
__exportStar(require("./interface"), exports);
|
|
27
42
|
var atlas_api_1 = require("./atlas-api");
|
|
28
|
-
exports
|
|
43
|
+
Object.defineProperty(exports, "AtlasApi", { enumerable: true, get: function () { return __importDefault(atlas_api_1).default; } });
|
|
29
44
|
var mongodb_1 = require("mongodb");
|
|
30
|
-
exports
|
|
31
|
-
exports
|
|
45
|
+
Object.defineProperty(exports, "ObjectId", { enumerable: true, get: function () { return mongodb_1.ObjectId; } });
|
|
46
|
+
Object.defineProperty(exports, "MongoClient", { enumerable: true, get: function () { return mongodb_1.MongoClient; } });
|
|
47
|
+
Object.defineProperty(exports, "Db", { enumerable: true, get: function () { return mongodb_1.Db; } });
|
|
32
48
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,iCAAyC;AAAjC,+GAAA,OAAO,OAAS;AACxB,6CAAoD;AAA5C,0HAAA,OAAO,OAAc;AAC7B,iCAAyC;AAAjC,+GAAA,OAAO,OAAS;AACxB,iDAAwD;AAAhD,8HAAA,OAAO,OAAgB;AAC/B,yCAAiD;AAAzC,uHAAA,OAAO,OAAa;AAC5B,iDAAwD;AAAhD,8HAAA,OAAO,OAAgB;AAE/B,mEAAyE;AAAjE,+IAAA,OAAO,OAAwB;AACvC,6CAAoD;AAA5C,0HAAA,OAAO,OAAc;AAC7B,6DAAoE;AAA5D,0IAAA,OAAO,OAAsB;AACrC,yCAAgD;AAAxC,sHAAA,OAAO,OAAY;AAC3B,8CAA4B;AAC5B,yCAAgD;AAAxC,sHAAA,OAAO,OAAY;AAC3B,mCAA2J;AAAnJ,mGAAA,QAAQ,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAiC,6FAAA,EAAE,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field.js","sourceRoot":"","sources":["../../../src/interface/atlas/field.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"field.js","sourceRoot":"","sources":["../../../src/interface/atlas/field.ts"],"names":[],"mappings":";;;AAAA,IAAY,UASX;AATD,WAAY,UAAU;IACpB,+BAAiB,CAAA;IACjB,+BAAiB,CAAA;IACjB,2BAAa,CAAA;IACb,mCAAqB,CAAA;IACrB,oCAAsB,CAAA;IACtB,iCAAmB,CAAA;IACnB,2CAA6B,CAAA;IAC7B,yBAAW,CAAA;AACb,CAAC,EATW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QASrB"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
5
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
17
|
+
__exportStar(require("./field"), exports);
|
|
7
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/atlas/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/atlas/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,0CAAwB"}
|
|
@@ -2,13 +2,4 @@ export * from './atlas';
|
|
|
2
2
|
/**
|
|
3
3
|
* Defines an object that can be created via the 'new' keyword
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
6
|
-
export interface NongoWriteResult {
|
|
7
|
-
nModified: number;
|
|
8
|
-
ok: number;
|
|
9
|
-
n: number;
|
|
10
|
-
}
|
|
11
|
-
export interface NongoDeleteResult {
|
|
12
|
-
ok?: number;
|
|
13
|
-
n?: number;
|
|
14
|
-
}
|
|
5
|
+
export type Newable<T = any> = new (...args: any[]) => T;
|
package/dist/interface/index.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
5
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
17
|
+
__exportStar(require("./atlas"), exports);
|
|
7
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB"}
|
package/dist/model.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AggregateOptions, AnyBulkWriteOperation, BulkWriteOptions, BulkWriteResult, CountDocumentsOptions, Db, DeleteOptions, DeleteResult, Document, Filter, FindOptions, ObjectId, UpdateFilter, UpdateOptions, UpdateResult } from 'mongodb';
|
|
2
2
|
import CursorIterator from './cursor-iterator';
|
|
3
|
-
import { CreateSearchIndex
|
|
3
|
+
import { CreateSearchIndex } from './interface';
|
|
4
4
|
import MongoIndex from './mongo-index';
|
|
5
5
|
import Nongo from './nongo';
|
|
6
|
+
export interface RevisionHistory {
|
|
7
|
+
id: string;
|
|
8
|
+
revision: string;
|
|
9
|
+
created: Date;
|
|
10
|
+
}
|
|
6
11
|
export default abstract class Model<T extends {
|
|
7
12
|
_id?: ObjectId;
|
|
13
|
+
revision?: string;
|
|
14
|
+
history?: RevisionHistory[];
|
|
15
|
+
diffs?: any;
|
|
8
16
|
} = any> {
|
|
9
17
|
nongo: Nongo;
|
|
10
18
|
obj: T;
|
|
@@ -13,26 +21,30 @@ export default abstract class Model<T extends {
|
|
|
13
21
|
db: Db;
|
|
14
22
|
name: string;
|
|
15
23
|
dynamic: boolean;
|
|
24
|
+
private collectionRevision;
|
|
16
25
|
constructor(nongo: Nongo, obj: T);
|
|
26
|
+
getCollectionRevision(): string;
|
|
27
|
+
protected schemaVersioningEnabled(): boolean;
|
|
17
28
|
getMongoIndexes(): MongoIndex[];
|
|
18
29
|
getAtlasSearchIndexes(): CreateSearchIndex[];
|
|
19
30
|
validate(): Promise<string[]>;
|
|
20
|
-
dumpCollection(dir: string, gzip?: boolean): Promise<void>;
|
|
21
31
|
idString(): string;
|
|
22
32
|
save(): Promise<this>;
|
|
23
33
|
strip(parentPath: any, toStrip: any): void;
|
|
24
34
|
deleteKey(path: any, obj: any): void;
|
|
25
35
|
byId(id: any): Promise<this>;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
getRevisions(): Promise<this[]>;
|
|
37
|
+
getRevision(query: Filter<Document>): Promise<any>;
|
|
38
|
+
find(query?: Filter<Document>, options?: FindOptions<Document>): Promise<this[]>;
|
|
39
|
+
bulkWrite(operations: AnyBulkWriteOperation<Document>[], options?: BulkWriteOptions): Promise<BulkWriteResult>;
|
|
40
|
+
findIterator(query?: Filter<Document>, options?: FindOptions<Document>, collection?: string): Promise<CursorIterator<this>>;
|
|
41
|
+
findOne(query?: Filter<Document>): Promise<this>;
|
|
42
|
+
remove(query: Filter<Document>, options?: DeleteOptions): Promise<DeleteResult>;
|
|
43
|
+
aggregate(pipeline: Document[], options?: AggregateOptions): Promise<any[]>;
|
|
44
|
+
aggregateIterator(pipeline: Document[], options?: AggregateOptions): Promise<CursorIterator<any>>;
|
|
45
|
+
distinct(field: string, filter?: Filter<Document>): Promise<any[]>;
|
|
46
|
+
update(query: Filter<Document>, updates: UpdateFilter<Document>, options?: UpdateOptions): Promise<UpdateResult<Document>>;
|
|
47
|
+
count(query?: Document, options?: CountDocumentsOptions): Promise<number>;
|
|
36
48
|
abstract defineSchema(): any;
|
|
37
49
|
defineSchemaNoIndex(): any;
|
|
38
50
|
prepareQuery(query: any): any;
|
package/dist/model.js
CHANGED
|
@@ -11,13 +11,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
const clone_deep_1 = __importDefault(require("clone-deep"));
|
|
14
|
-
const cmd_promise_1 = __importDefault(require("cmd-promise"));
|
|
15
14
|
const mongodb_1 = require("mongodb");
|
|
16
|
-
const
|
|
15
|
+
const just_diff_1 = require("just-diff");
|
|
17
16
|
const cursor_iterator_1 = __importDefault(require("./cursor-iterator"));
|
|
18
17
|
const nongo_1 = __importDefault(require("./nongo"));
|
|
19
18
|
const validator_1 = __importDefault(require("./validator"));
|
|
20
|
-
const
|
|
19
|
+
const DEFAULT_PATHS = ['_id', 'revision', 'history', 'diffs'];
|
|
20
|
+
function excludePathsFromDiff(diff, excludedPaths = DEFAULT_PATHS) {
|
|
21
|
+
return diff.filter((d) => {
|
|
22
|
+
if (!excludedPaths.includes(d.path[0])) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
21
27
|
class Model {
|
|
22
28
|
constructor(nongo, obj) {
|
|
23
29
|
this.nongo = nongo;
|
|
@@ -34,10 +40,18 @@ class Model {
|
|
|
34
40
|
this.obj._id = new mongodb_1.ObjectId(this.obj._id);
|
|
35
41
|
}
|
|
36
42
|
this.collection = this.defineCollection();
|
|
43
|
+
this.collectionRevision =
|
|
44
|
+
this.schemaVersioningEnabled() ? `${this.defineCollection()}${nongo_1.default.REVISION}` : null;
|
|
37
45
|
this.name = this.constructor.name;
|
|
38
46
|
this.dynamic = false;
|
|
39
47
|
this.initStructure();
|
|
40
48
|
}
|
|
49
|
+
getCollectionRevision() {
|
|
50
|
+
return this.collectionRevision;
|
|
51
|
+
}
|
|
52
|
+
schemaVersioningEnabled() {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
41
55
|
getMongoIndexes() {
|
|
42
56
|
return [];
|
|
43
57
|
}
|
|
@@ -46,14 +60,7 @@ class Model {
|
|
|
46
60
|
}
|
|
47
61
|
async validate() {
|
|
48
62
|
const schema = this.nongo.schema[this.name];
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
async dumpCollection(dir, gzip = false) {
|
|
52
|
-
logger.info(`Taking dump of ${this.name}...`);
|
|
53
|
-
const script = `mkdir -p ${dir};` +
|
|
54
|
-
`mongodump --uri "${this.nongo.uri()}" -c ${this.name} ${gzip ? '--gzip' : ''} --out ${dir};`;
|
|
55
|
-
await cmd_promise_1.default(script);
|
|
56
|
-
logger.info(`Dump written to ${dir}...`);
|
|
63
|
+
return new validator_1.default(schema, this).validate();
|
|
57
64
|
}
|
|
58
65
|
idString() {
|
|
59
66
|
return this.obj._id.toHexString();
|
|
@@ -65,7 +72,7 @@ class Model {
|
|
|
65
72
|
// Set the object id if there isn't one already
|
|
66
73
|
this.obj._id = nongo_1.default.toObjectId(this.obj._id);
|
|
67
74
|
// Make a deep clone so that the original object does not have it's fields striped
|
|
68
|
-
this.obj = clone_deep_1.default(this.obj);
|
|
75
|
+
this.obj = (0, clone_deep_1.default)(this.obj);
|
|
69
76
|
// Strip all the keys from the object that are not present in the schema
|
|
70
77
|
// if not a dynamic model
|
|
71
78
|
if (!this.dynamic) {
|
|
@@ -76,10 +83,27 @@ class Model {
|
|
|
76
83
|
this.throwValidationError(err);
|
|
77
84
|
}
|
|
78
85
|
}
|
|
86
|
+
let revisionObj;
|
|
87
|
+
const revisionObjId = new mongodb_1.ObjectId();
|
|
88
|
+
if (this.collectionRevision) {
|
|
89
|
+
revisionObj = await this.db.collection(this.collection).findOne({ _id: this.obj._id });
|
|
90
|
+
this.obj.revision = nongo_1.default.revisionNumber(revisionObj === null || revisionObj === void 0 ? void 0 : revisionObj.revision);
|
|
91
|
+
this.obj.history = nongo_1.default.revisionHistory(revisionObj, revisionObjId);
|
|
92
|
+
// get diffs
|
|
93
|
+
if (revisionObj) {
|
|
94
|
+
delete this.obj.diffs;
|
|
95
|
+
const diffs = (0, just_diff_1.diff)(revisionObj, this.obj);
|
|
96
|
+
this.obj.diffs = excludePathsFromDiff(diffs);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
79
99
|
// Upsert
|
|
80
|
-
await this.db
|
|
100
|
+
const UpsertResult = await this.db
|
|
81
101
|
.collection(this.collection)
|
|
82
102
|
.replaceOne({ _id: this.obj._id }, this.obj, { upsert: true });
|
|
103
|
+
if (UpsertResult.modifiedCount === 1 && this.collectionRevision) {
|
|
104
|
+
revisionObj._id = revisionObjId;
|
|
105
|
+
await this.db.collection(this.collectionRevision).insertOne(revisionObj);
|
|
106
|
+
}
|
|
83
107
|
// Return the saved model
|
|
84
108
|
return this;
|
|
85
109
|
}
|
|
@@ -145,7 +169,20 @@ class Model {
|
|
|
145
169
|
}
|
|
146
170
|
}
|
|
147
171
|
async byId(id) {
|
|
148
|
-
return
|
|
172
|
+
return this.findOne({ _id: id });
|
|
173
|
+
}
|
|
174
|
+
async getRevisions() {
|
|
175
|
+
return this.toArray(await this.findIterator({}, { sort: { revision: 'descending' } }, this.collectionRevision));
|
|
176
|
+
}
|
|
177
|
+
async getRevision(query) {
|
|
178
|
+
const doc = await this.db.collection(this.collectionRevision).findOne(query);
|
|
179
|
+
// Return null if no doc was found
|
|
180
|
+
if (doc == null) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
// Otherwise return the doc as a model
|
|
184
|
+
// @ts-ignore
|
|
185
|
+
return new this.constructor(this.nongo, doc);
|
|
149
186
|
}
|
|
150
187
|
/*
|
|
151
188
|
* @param query: A mongo db query.
|
|
@@ -167,9 +204,9 @@ class Model {
|
|
|
167
204
|
* @param options: the query options e.g. sorting, limiting results etc.
|
|
168
205
|
* @return the results of the query as an {@link AsyncIterator}.
|
|
169
206
|
*/
|
|
170
|
-
async findIterator(query = {}, options) {
|
|
207
|
+
async findIterator(query = {}, options, collection = this.collection) {
|
|
171
208
|
query = this.prepareQuery(query);
|
|
172
|
-
const cursor = this.db.collection(
|
|
209
|
+
const cursor = this.db.collection(collection).find(query, options);
|
|
173
210
|
return new cursor_iterator_1.default(cursor,
|
|
174
211
|
// @ts-ignore
|
|
175
212
|
(obj) => new this.constructor(this.nongo, obj));
|
|
@@ -189,13 +226,12 @@ class Model {
|
|
|
189
226
|
// @ts-ignore
|
|
190
227
|
return new this.constructor(this.nongo, doc);
|
|
191
228
|
}
|
|
192
|
-
async remove(query) {
|
|
229
|
+
async remove(query, options) {
|
|
193
230
|
query = this.prepareQuery(query);
|
|
194
|
-
|
|
195
|
-
return res.result;
|
|
231
|
+
return this.db.collection(this.collection).deleteMany(query, options);
|
|
196
232
|
}
|
|
197
233
|
async aggregate(pipeline, options) {
|
|
198
|
-
return
|
|
234
|
+
return this.toArray(await this.aggregateIterator(pipeline, options));
|
|
199
235
|
}
|
|
200
236
|
async aggregateIterator(pipeline, options) {
|
|
201
237
|
options = options || {};
|
|
@@ -208,18 +244,17 @@ class Model {
|
|
|
208
244
|
// @ts-ignore
|
|
209
245
|
return new cursor_iterator_1.default(cursor);
|
|
210
246
|
}
|
|
211
|
-
async distinct(field) {
|
|
212
|
-
return
|
|
247
|
+
async distinct(field, filter = {}) {
|
|
248
|
+
return this.db.collection(this.collection).distinct(field, filter);
|
|
213
249
|
}
|
|
214
|
-
async update(query, updates) {
|
|
250
|
+
async update(query, updates, options) {
|
|
215
251
|
query = this.prepareQuery(query);
|
|
216
|
-
|
|
252
|
+
return this.db
|
|
217
253
|
.collection(this.collection)
|
|
218
|
-
.updateMany(query, updates);
|
|
219
|
-
return res.result;
|
|
254
|
+
.updateMany(query, updates, options);
|
|
220
255
|
}
|
|
221
|
-
async count(query = {}) {
|
|
222
|
-
return
|
|
256
|
+
async count(query = {}, options) {
|
|
257
|
+
return this.db.collection(this.collection).countDocuments(query, options);
|
|
223
258
|
}
|
|
224
259
|
defineSchemaNoIndex() {
|
|
225
260
|
const schema = this.defineSchema();
|
|
@@ -230,7 +265,7 @@ class Model {
|
|
|
230
265
|
* Must be run on all queries before they are used.
|
|
231
266
|
*/
|
|
232
267
|
prepareQuery(query) {
|
|
233
|
-
query = clone_deep_1.default(query);
|
|
268
|
+
query = (0, clone_deep_1.default)(query);
|
|
234
269
|
const { _id } = query;
|
|
235
270
|
if (!_id) {
|
|
236
271
|
return query;
|
|
@@ -287,19 +322,26 @@ class Model {
|
|
|
287
322
|
}
|
|
288
323
|
}
|
|
289
324
|
async toArray(cursorIterator) {
|
|
290
|
-
var e_1,
|
|
325
|
+
var _a, e_1, _b, _c;
|
|
291
326
|
const arr = [];
|
|
292
327
|
try {
|
|
293
328
|
// @ts-ignore
|
|
294
|
-
for (var cursorIterator_1 = __asyncValues(cursorIterator), cursorIterator_1_1; cursorIterator_1_1 = await cursorIterator_1.next(),
|
|
295
|
-
|
|
296
|
-
|
|
329
|
+
for (var _d = true, cursorIterator_1 = __asyncValues(cursorIterator), cursorIterator_1_1; cursorIterator_1_1 = await cursorIterator_1.next(), _a = cursorIterator_1_1.done, !_a;) {
|
|
330
|
+
_c = cursorIterator_1_1.value;
|
|
331
|
+
_d = false;
|
|
332
|
+
try {
|
|
333
|
+
const m = _c;
|
|
334
|
+
arr.push(m);
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
_d = true;
|
|
338
|
+
}
|
|
297
339
|
}
|
|
298
340
|
}
|
|
299
341
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
300
342
|
finally {
|
|
301
343
|
try {
|
|
302
|
-
if (
|
|
344
|
+
if (!_d && !_a && (_b = cursorIterator_1.return)) await _b.call(cursorIterator_1);
|
|
303
345
|
}
|
|
304
346
|
finally { if (e_1) throw e_1.error; }
|
|
305
347
|
}
|