@orion-js/mongodb 3.12.0 → 3.13.1

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 (172) hide show
  1. package/LICENSE +21 -0
  2. package/lib/connect/connections.d.ts +13 -0
  3. package/lib/connect/connections.js +4 -0
  4. package/lib/connect/getDBName.d.ts +1 -0
  5. package/lib/connect/getDBName.js +23 -0
  6. package/lib/connect/getMongoConnection.d.ts +8 -0
  7. package/lib/connect/getMongoConnection.js +47 -0
  8. package/lib/connect/getMongoConnection.test.d.ts +1 -0
  9. package/lib/connect/getMongoConnection.test.js +43 -0
  10. package/lib/connect/getMongoURLFromEnv.d.ts +1 -0
  11. package/lib/connect/getMongoURLFromEnv.js +21 -0
  12. package/lib/connect/index.d.ts +4 -0
  13. package/lib/connect/index.js +8 -0
  14. package/lib/createCollection/createIndexPromisesTest.d.ts +1 -0
  15. package/lib/createCollection/createIndexPromisesTest.js +12 -0
  16. package/lib/createCollection/createIndexes.d.ts +3 -0
  17. package/lib/createCollection/createIndexes.js +67 -0
  18. package/lib/createCollection/createIndexes.test.d.ts +1 -0
  19. package/lib/createCollection/createIndexes.test.js +91 -0
  20. package/lib/createCollection/createIndexesPromise.test.d.ts +1 -0
  21. package/lib/createCollection/createIndexesPromise.test.js +32 -0
  22. package/lib/createCollection/generateId.d.ts +3 -0
  23. package/lib/createCollection/generateId.js +25 -0
  24. package/lib/createCollection/generateId.test.d.ts +1 -0
  25. package/lib/createCollection/generateId.test.js +108 -0
  26. package/lib/createCollection/getMethods/aggregate.test.d.ts +1 -0
  27. package/lib/createCollection/getMethods/aggregate.test.js +20 -0
  28. package/lib/createCollection/getMethods/cleanModifier.d.ts +4 -0
  29. package/lib/createCollection/getMethods/cleanModifier.js +75 -0
  30. package/lib/createCollection/getMethods/cleanModifier.test.d.ts +1 -0
  31. package/lib/createCollection/getMethods/cleanModifier.test.js +186 -0
  32. package/lib/createCollection/getMethods/countDocuments.d.ts +2 -0
  33. package/lib/createCollection/getMethods/countDocuments.js +16 -0
  34. package/lib/createCollection/getMethods/countDocuments.test.d.ts +1 -0
  35. package/lib/createCollection/getMethods/countDocuments.test.js +21 -0
  36. package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.d.ts +9 -0
  37. package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.js +25 -0
  38. package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.test.d.ts +1 -0
  39. package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.test.js +37 -0
  40. package/lib/createCollection/getMethods/dataLoader/dataLoad/index.d.ts +9 -0
  41. package/lib/createCollection/getMethods/dataLoader/dataLoad/index.js +21 -0
  42. package/lib/createCollection/getMethods/dataLoader/index.d.ts +5 -0
  43. package/lib/createCollection/getMethods/dataLoader/index.js +14 -0
  44. package/lib/createCollection/getMethods/dataLoader/loadById.d.ts +2 -0
  45. package/lib/createCollection/getMethods/dataLoader/loadById.js +13 -0
  46. package/lib/createCollection/getMethods/dataLoader/loadById.test.d.ts +1 -0
  47. package/lib/createCollection/getMethods/dataLoader/loadById.test.js +23 -0
  48. package/lib/createCollection/getMethods/dataLoader/loadData.d.ts +2 -0
  49. package/lib/createCollection/getMethods/dataLoader/loadData.js +49 -0
  50. package/lib/createCollection/getMethods/dataLoader/loadMany.d.ts +2 -0
  51. package/lib/createCollection/getMethods/dataLoader/loadMany.js +10 -0
  52. package/lib/createCollection/getMethods/dataLoader/loadMany.test.d.ts +1 -0
  53. package/lib/createCollection/getMethods/dataLoader/loadMany.test.js +85 -0
  54. package/lib/createCollection/getMethods/dataLoader/loadOne.d.ts +2 -0
  55. package/lib/createCollection/getMethods/dataLoader/loadOne.js +10 -0
  56. package/lib/createCollection/getMethods/dataLoader/loadOne.test.d.ts +1 -0
  57. package/lib/createCollection/getMethods/dataLoader/loadOne.test.js +76 -0
  58. package/lib/createCollection/getMethods/deleteMany.d.ts +2 -0
  59. package/lib/createCollection/getMethods/deleteMany.js +16 -0
  60. package/lib/createCollection/getMethods/deleteOne.d.ts +2 -0
  61. package/lib/createCollection/getMethods/deleteOne.js +16 -0
  62. package/lib/createCollection/getMethods/estimatedDocumentCount.d.ts +3 -0
  63. package/lib/createCollection/getMethods/estimatedDocumentCount.js +10 -0
  64. package/lib/createCollection/getMethods/estimatedDocumentCount.test.d.ts +1 -0
  65. package/lib/createCollection/getMethods/estimatedDocumentCount.test.js +15 -0
  66. package/lib/createCollection/getMethods/find.d.ts +2 -0
  67. package/lib/createCollection/getMethods/find.js +21 -0
  68. package/lib/createCollection/getMethods/findOne.d.ts +2 -0
  69. package/lib/createCollection/getMethods/findOne.js +18 -0
  70. package/lib/createCollection/getMethods/findOneAndUpdate.d.ts +3 -0
  71. package/lib/createCollection/getMethods/findOneAndUpdate.js +29 -0
  72. package/lib/createCollection/getMethods/findOneAndUpdate.test.d.ts +1 -0
  73. package/lib/createCollection/getMethods/findOneAndUpdate.test.js +15 -0
  74. package/lib/createCollection/getMethods/getSelector.d.ts +3 -0
  75. package/lib/createCollection/getMethods/getSelector.js +21 -0
  76. package/lib/createCollection/getMethods/getSelector.test.d.ts +1 -0
  77. package/lib/createCollection/getMethods/getSelector.test.js +46 -0
  78. package/lib/createCollection/getMethods/index.d.ts +16 -0
  79. package/lib/createCollection/getMethods/index.js +36 -0
  80. package/lib/createCollection/getMethods/insertAndFind.d.ts +3 -0
  81. package/lib/createCollection/getMethods/insertAndFind.js +31 -0
  82. package/lib/createCollection/getMethods/insertAndFind.test.d.ts +1 -0
  83. package/lib/createCollection/getMethods/insertAndFind.test.js +50 -0
  84. package/lib/createCollection/getMethods/insertMany.d.ts +3 -0
  85. package/lib/createCollection/getMethods/insertMany.js +36 -0
  86. package/lib/createCollection/getMethods/insertMany.test.d.ts +1 -0
  87. package/lib/createCollection/getMethods/insertMany.test.js +66 -0
  88. package/lib/createCollection/getMethods/insertOne.d.ts +3 -0
  89. package/lib/createCollection/getMethods/insertOne.js +31 -0
  90. package/lib/createCollection/getMethods/insertOne.test.d.ts +1 -0
  91. package/lib/createCollection/getMethods/insertOne.test.js +104 -0
  92. package/lib/createCollection/getMethods/update.test.d.ts +1 -0
  93. package/lib/createCollection/getMethods/update.test.js +287 -0
  94. package/lib/createCollection/getMethods/updateAndFind.d.ts +3 -0
  95. package/lib/createCollection/getMethods/updateAndFind.js +18 -0
  96. package/lib/createCollection/getMethods/updateAndFind.test.d.ts +1 -0
  97. package/lib/createCollection/getMethods/updateAndFind.test.js +38 -0
  98. package/lib/createCollection/getMethods/updateItem.d.ts +2 -0
  99. package/lib/createCollection/getMethods/updateItem.js +19 -0
  100. package/lib/createCollection/getMethods/updateItem.test.d.ts +1 -0
  101. package/lib/createCollection/getMethods/updateItem.test.js +38 -0
  102. package/lib/createCollection/getMethods/updateMany.d.ts +3 -0
  103. package/lib/createCollection/getMethods/updateMany.js +30 -0
  104. package/lib/createCollection/getMethods/updateOne.d.ts +3 -0
  105. package/lib/createCollection/getMethods/updateOne.js +30 -0
  106. package/lib/createCollection/getMethods/upsert.d.ts +3 -0
  107. package/lib/createCollection/getMethods/upsert.js +31 -0
  108. package/lib/createCollection/getMethods/upsert.test.d.ts +1 -0
  109. package/lib/createCollection/getMethods/upsert.test.js +92 -0
  110. package/lib/createCollection/getMethods/validateModifier/index.d.ts +1 -0
  111. package/lib/createCollection/getMethods/validateModifier/index.js +18 -0
  112. package/lib/createCollection/getMethods/validateModifier/index.test.d.ts +1 -0
  113. package/lib/createCollection/getMethods/validateModifier/index.test.js +74 -0
  114. package/lib/createCollection/getMethods/validateModifier/validateInc.d.ts +7 -0
  115. package/lib/createCollection/getMethods/validateModifier/validateInc.js +20 -0
  116. package/lib/createCollection/getMethods/validateModifier/validateInc.test.d.ts +1 -0
  117. package/lib/createCollection/getMethods/validateModifier/validateInc.test.js +12 -0
  118. package/lib/createCollection/getMethods/validateModifier/validateOperator.d.ts +5 -0
  119. package/lib/createCollection/getMethods/validateModifier/validateOperator.js +34 -0
  120. package/lib/createCollection/getMethods/validateModifier/validatePush.d.ts +8 -0
  121. package/lib/createCollection/getMethods/validateModifier/validatePush.js +27 -0
  122. package/lib/createCollection/getMethods/validateModifier/validatePush.test.d.ts +1 -0
  123. package/lib/createCollection/getMethods/validateModifier/validatePush.test.js +90 -0
  124. package/lib/createCollection/getMethods/validateModifier/validateSet.d.ts +7 -0
  125. package/lib/createCollection/getMethods/validateModifier/validateSet.js +19 -0
  126. package/lib/createCollection/getMethods/validateModifier/validateSet.test.d.ts +1 -0
  127. package/lib/createCollection/getMethods/validateModifier/validateSet.test.js +16 -0
  128. package/lib/createCollection/getMethods/validateModifier/validateUnset.d.ts +7 -0
  129. package/lib/createCollection/getMethods/validateModifier/validateUnset.js +19 -0
  130. package/lib/createCollection/getMethods/validateModifier/validateUnset.test.d.ts +1 -0
  131. package/lib/createCollection/getMethods/validateModifier/validateUnset.test.js +71 -0
  132. package/lib/createCollection/getMethods/validateModifier/validateUpsert.d.ts +1 -0
  133. package/lib/createCollection/getMethods/validateModifier/validateUpsert.js +43 -0
  134. package/lib/createCollection/getMethods/validateModifier/validateUpsert.test.d.ts +1 -0
  135. package/lib/createCollection/getMethods/validateModifier/validateUpsert.test.js +50 -0
  136. package/lib/createCollection/getMethods/wrapErrors.d.ts +1 -0
  137. package/lib/createCollection/getMethods/wrapErrors.js +29 -0
  138. package/lib/createCollection/getSchemaAndModel.d.ts +10 -0
  139. package/lib/createCollection/getSchemaAndModel.js +41 -0
  140. package/lib/createCollection/handleError.d.ts +1 -0
  141. package/lib/createCollection/handleError.js +25 -0
  142. package/lib/createCollection/index.d.ts +4 -0
  143. package/lib/createCollection/index.js +77 -0
  144. package/lib/createCollection/initItem.d.ts +2 -0
  145. package/lib/createCollection/initItem.js +13 -0
  146. package/lib/createCollection/typedModel.test.d.ts +1 -0
  147. package/lib/createCollection/typedModel.test.js +159 -0
  148. package/lib/helpers/fromDot.d.ts +1 -0
  149. package/lib/helpers/fromDot.js +12 -0
  150. package/lib/helpers/fromDot.test.d.ts +1 -0
  151. package/lib/helpers/fromDot.test.js +47 -0
  152. package/lib/helpers/toDot.d.ts +1 -0
  153. package/lib/helpers/toDot.js +11 -0
  154. package/lib/helpers/toDot.test.d.ts +1 -0
  155. package/lib/helpers/toDot.test.js +23 -0
  156. package/lib/index.d.ts +5 -0
  157. package/lib/index.js +35 -0
  158. package/lib/service/index.d.ts +3 -0
  159. package/lib/service/index.js +32 -0
  160. package/lib/service/index.test.d.ts +1 -0
  161. package/lib/service/index.test.js +73 -0
  162. package/lib/tests/setup.d.ts +1 -0
  163. package/lib/tests/setup.js +20 -0
  164. package/lib/types/index.d.ts +178 -0
  165. package/lib/types/index.js +2 -0
  166. package/lib/types/types.test.d.ts +1 -0
  167. package/lib/types/types.test.js +59 -0
  168. package/package.json +27 -29
  169. package/README.md +0 -15
  170. package/dist/index.cjs +0 -81990
  171. package/dist/index.d.ts +0 -204
  172. package/dist/index.js +0 -81964
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Orionjs Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,13 @@
1
+ import { MongoClient, Db } from 'mongodb';
2
+ export interface OrionMongoClient {
3
+ client: MongoClient;
4
+ db: Db;
5
+ uri: string;
6
+ dbName: string;
7
+ connectionPromise: Promise<MongoClient>;
8
+ connectionName: string;
9
+ }
10
+ export interface OrionMongoConnectionsMap {
11
+ [key: string]: OrionMongoClient;
12
+ }
13
+ export declare const connections: OrionMongoConnectionsMap;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.connections = void 0;
4
+ exports.connections = {};
@@ -0,0 +1 @@
1
+ export default function getDBName(url: string): string;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function getDBName(url) {
4
+ let dbName = 'admin';
5
+ let connectionPart = '';
6
+ const startConnectionPart = url.indexOf('//') + 2;
7
+ if (url.indexOf('?') !== -1) {
8
+ connectionPart = url.substring(startConnectionPart, url.indexOf('?'));
9
+ }
10
+ else {
11
+ connectionPart = url.substring(startConnectionPart);
12
+ }
13
+ if (connectionPart.indexOf('.sock') !== -1) {
14
+ if (connectionPart.indexOf('.sock/') !== -1) {
15
+ dbName = connectionPart.split('.sock/')[1];
16
+ }
17
+ }
18
+ else if (connectionPart.indexOf('/') !== -1) {
19
+ dbName = connectionPart.split('/')[1];
20
+ }
21
+ return dbName;
22
+ }
23
+ exports.default = getDBName;
@@ -0,0 +1,8 @@
1
+ import { OrionMongoClient } from './connections';
2
+ export declare const allConnectionPromises: any[];
3
+ interface MongoConnectOptions {
4
+ name: string;
5
+ uri?: string;
6
+ }
7
+ export declare const getMongoConnection: ({ name, uri }: MongoConnectOptions) => OrionMongoClient;
8
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getMongoConnection = exports.allConnectionPromises = void 0;
7
+ const mongodb_1 = require("mongodb");
8
+ const connections_1 = require("./connections");
9
+ const getDBName_1 = __importDefault(require("./getDBName"));
10
+ const getMongoURLFromEnv_1 = require("./getMongoURLFromEnv");
11
+ const logger_1 = require("@orion-js/logger");
12
+ const helpers_1 = require("@orion-js/helpers");
13
+ exports.allConnectionPromises = [];
14
+ async function connect(client) {
15
+ try {
16
+ const result = await client.connect();
17
+ return result;
18
+ }
19
+ catch (error) {
20
+ logger_1.logger.error(`Error connecting to mongo: ${error.message}. Will retry in 5s`, error);
21
+ await (0, helpers_1.sleep)(5000);
22
+ return connect(client);
23
+ }
24
+ }
25
+ const getMongoConnection = ({ name, uri }) => {
26
+ uri = uri || (0, getMongoURLFromEnv_1.getMongoURLFromEnv)(name);
27
+ if (connections_1.connections[name])
28
+ return connections_1.connections[name];
29
+ const client = new mongodb_1.MongoClient(uri, {
30
+ retryReads: true
31
+ });
32
+ const connectionPromise = connect(client);
33
+ exports.allConnectionPromises.push(connectionPromise);
34
+ const dbName = (0, getDBName_1.default)(uri);
35
+ const db = client.db(dbName);
36
+ const mongoClient = {
37
+ uri,
38
+ client,
39
+ connectionPromise,
40
+ dbName,
41
+ db,
42
+ connectionName: name
43
+ };
44
+ connections_1.connections[name] = mongoClient;
45
+ return mongoClient;
46
+ };
47
+ exports.getMongoConnection = getMongoConnection;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const helpers_1 = require("@orion-js/helpers");
4
+ const _1 = require(".");
5
+ const __1 = require("..");
6
+ describe('Get Mongo Connection', () => {
7
+ test('Should get mongo connection for main connection', async () => {
8
+ const mongoConnection = (0, _1.getMongoConnection)({ name: 'main' });
9
+ await mongoConnection.connectionPromise;
10
+ expect(mongoConnection).toBeDefined();
11
+ expect(mongoConnection.uri).toBe(process.env.MONGO_URL);
12
+ });
13
+ test('Should get mongo connection for other connections defined by process env', async () => {
14
+ process.env.MONGO_URL_NICO = process.env.MONGO_URL + 'other';
15
+ const mongoConnection = (0, _1.getMongoConnection)({ name: 'nico' });
16
+ await mongoConnection.connectionPromise;
17
+ expect(mongoConnection).toBeDefined();
18
+ expect(mongoConnection.uri).toBe(process.env.MONGO_URL_NICO);
19
+ });
20
+ test('Should create a collection using custom connection with env', async () => {
21
+ process.env.MONGO_URL_NICO2 = process.env.MONGO_URL + 'other2';
22
+ const collection = (0, __1.createCollection)({
23
+ name: (0, helpers_1.generateId)(),
24
+ connectionName: 'nico2'
25
+ });
26
+ await collection.connectionPromise;
27
+ expect(collection.connectionName).toBe('nico2');
28
+ expect(collection.client.uri).toBe(process.env.MONGO_URL_NICO2);
29
+ });
30
+ test('Should throw the correct error when no mongo url env is defined', async () => {
31
+ expect.assertions(1);
32
+ try {
33
+ const collection = (0, __1.createCollection)({
34
+ name: (0, helpers_1.generateId)(),
35
+ connectionName: 'nico3'
36
+ });
37
+ await collection.connectionPromise;
38
+ }
39
+ catch (error) {
40
+ expect(error.message).toBe(`To use the connection "nico3" you must initialize it first calling getMongoConnection({name: "nico3", uri: "MONGOURI"}) or setting the environment variable MONGO_URL_NICO3.`);
41
+ }
42
+ });
43
+ });
@@ -0,0 +1 @@
1
+ export declare const getMongoURLFromEnv: (connectionName: string) => string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoURLFromEnv = void 0;
4
+ const connections_1 = require("./connections");
5
+ const env_1 = require("@orion-js/env");
6
+ const getMongoURLFromEnv = (connectionName) => {
7
+ if (connectionName === 'main') {
8
+ if (!(0, env_1.internalGetEnv)('mongo_url', 'MONGO_URL')) {
9
+ throw new Error('MONGO_URL is required');
10
+ }
11
+ return (0, env_1.internalGetEnv)('mongo_url', 'MONGO_URL');
12
+ }
13
+ const envName = `mongo_url_${connectionName.toLowerCase()}`;
14
+ const processEnvName = `MONGO_URL_${connectionName.toUpperCase()}`;
15
+ const uri = connections_1.connections[connectionName]?.uri ?? (0, env_1.internalGetEnv)(envName, processEnvName);
16
+ if (!uri) {
17
+ throw new Error(`To use the connection "${connectionName}" you must initialize it first calling getMongoConnection({name: "${connectionName}", uri: "MONGOURI"}) or setting the environment variable ${processEnvName}.`);
18
+ }
19
+ return uri;
20
+ };
21
+ exports.getMongoURLFromEnv = getMongoURLFromEnv;
@@ -0,0 +1,4 @@
1
+ import { connections } from './connections';
2
+ import { OrionMongoClient } from './connections';
3
+ import { allConnectionPromises, getMongoConnection } from './getMongoConnection';
4
+ export { OrionMongoClient, getMongoConnection, connections, allConnectionPromises };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.allConnectionPromises = exports.connections = exports.getMongoConnection = void 0;
4
+ const connections_1 = require("./connections");
5
+ Object.defineProperty(exports, "connections", { enumerable: true, get: function () { return connections_1.connections; } });
6
+ const getMongoConnection_1 = require("./getMongoConnection");
7
+ Object.defineProperty(exports, "allConnectionPromises", { enumerable: true, get: function () { return getMongoConnection_1.allConnectionPromises; } });
8
+ Object.defineProperty(exports, "getMongoConnection", { enumerable: true, get: function () { return getMongoConnection_1.getMongoConnection; } });
@@ -0,0 +1 @@
1
+ export declare const MockTests: import("..").Collection<any>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MockTests = void 0;
7
+ const helpers_1 = require("@orion-js/helpers");
8
+ const _1 = __importDefault(require("."));
9
+ exports.MockTests = (0, _1.default)({
10
+ name: (0, helpers_1.generateId)(),
11
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
12
+ });
@@ -0,0 +1,3 @@
1
+ import { Collection, ModelClassBase } from '..';
2
+ export declare function checkIndexes<DocumentType extends ModelClassBase>(collection: Partial<Collection<DocumentType>>): Promise<void>;
3
+ export declare function loadIndexes<DocumentType extends ModelClassBase>(collection: Partial<Collection<DocumentType>>): Promise<string[]>;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadIndexes = exports.checkIndexes = void 0;
4
+ const mongodb_1 = require("mongodb");
5
+ function matchingDefinition(defIndex, curIndex) {
6
+ if (defIndex.options && defIndex.options.name === curIndex.name)
7
+ return true;
8
+ const defIndexName = Object.keys(defIndex.keys)
9
+ .map(key => `${key}_${defIndex.keys[key]}`)
10
+ .join('_');
11
+ return defIndexName === curIndex.name;
12
+ }
13
+ async function checkIndexes(collection) {
14
+ let currentIndexes = [];
15
+ try {
16
+ currentIndexes = await collection.rawCollection.indexes();
17
+ }
18
+ catch (error) {
19
+ if (error.codeName !== 'NamespaceNotFound')
20
+ throw error;
21
+ }
22
+ const indexesToDelete = collection.indexes
23
+ ? currentIndexes.filter(index => index.name !== '_id_' &&
24
+ !collection.indexes.find(definitionIndex => matchingDefinition(definitionIndex, index)))
25
+ : currentIndexes;
26
+ if (indexesToDelete.length > 0) {
27
+ console.warn(`${indexesToDelete.length} unexpected indexes found in collection "${collection.name}": ${indexesToDelete
28
+ .map(i => i.name)
29
+ .join(', ')} | Delete the index or fix the collection definition`);
30
+ }
31
+ }
32
+ exports.checkIndexes = checkIndexes;
33
+ async function loadIndexes(collection) {
34
+ if (!collection.indexes)
35
+ return;
36
+ if (!collection.indexes.length)
37
+ return;
38
+ await collection.client.connectionPromise;
39
+ const results = Promise.all(collection.indexes.map(async ({ keys, options }) => {
40
+ try {
41
+ return await collection.rawCollection.createIndex(keys, options);
42
+ }
43
+ catch (error) {
44
+ if (error.code === 85) {
45
+ console.info('Will delete index to create the new version');
46
+ const indexName = error.message.split('name: ')[1].split(' ')[0];
47
+ await collection.rawCollection.dropIndex(indexName);
48
+ console.info('Index was deleted, creating new index');
49
+ const result = await collection.rawCollection.createIndex(keys, options);
50
+ console.info('Index updated correctly');
51
+ return result;
52
+ }
53
+ else if (error instanceof mongodb_1.MongoExpiredSessionError) {
54
+ // this errors is thrown when we are on tests environment
55
+ // but it's not a problem never, index will be created on the next connection
56
+ }
57
+ else {
58
+ console.error(`Error creating index for collection ${collection.name}: ${error.message}`);
59
+ console.error(error);
60
+ return error.message;
61
+ }
62
+ }
63
+ }));
64
+ await checkIndexes(collection);
65
+ return results;
66
+ }
67
+ exports.loadIndexes = loadIndexes;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,91 @@
1
+ "use strict";
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
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var 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);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const helpers_1 = require("@orion-js/helpers");
27
+ const _1 = __importStar(require("."));
28
+ describe('Test indexes', () => {
29
+ it('Should store all create indexes promises in the array', async () => {
30
+ const collection = (0, _1.default)({
31
+ name: (0, helpers_1.generateId)(),
32
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
33
+ });
34
+ expect(_1.createIndexesPromises[0]).toBe(collection.createIndexesPromise);
35
+ expect(_1.createIndexesPromises.length).toBe(1);
36
+ });
37
+ it('Should create collection indexes correctly', async () => {
38
+ const collection = (0, _1.default)({
39
+ name: (0, helpers_1.generateId)(),
40
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
41
+ });
42
+ const results = await collection.createIndexesPromise;
43
+ expect(results).toEqual(['a_1']);
44
+ });
45
+ it('Should handle error when cant create indexes', async () => {
46
+ const collectionName = (0, helpers_1.generateId)();
47
+ const collection1 = (0, _1.default)({
48
+ name: collectionName
49
+ });
50
+ await collection1.insertOne({ a: 1 });
51
+ await collection1.insertOne({ a: 1 });
52
+ console.error = jest.fn();
53
+ const collection2 = (0, _1.default)({
54
+ name: collectionName,
55
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
56
+ });
57
+ const result = await collection2.createIndexesPromise;
58
+ expect(result[0]).toContain('E11000');
59
+ expect(console.error).toHaveBeenCalled();
60
+ });
61
+ it('Should log indexes that have to be deleted', async () => {
62
+ const collectionName = (0, helpers_1.generateId)();
63
+ const collection1 = (0, _1.default)({
64
+ name: collectionName,
65
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
66
+ });
67
+ await collection1.createIndexesPromise;
68
+ console.warn = jest.fn();
69
+ const collection2 = (0, _1.default)({
70
+ name: collectionName,
71
+ indexes: [{ keys: { ba: 1 }, options: { unique: true } }]
72
+ });
73
+ await collection2.createIndexesPromise;
74
+ expect(console.warn).toHaveBeenCalled();
75
+ });
76
+ it('Should upgrade a index correctly', async () => {
77
+ const collectionName = (0, helpers_1.generateId)();
78
+ const collection1 = (0, _1.default)({
79
+ name: collectionName,
80
+ indexes: [{ keys: { name: 1 } }]
81
+ });
82
+ await collection1.createIndexesPromise;
83
+ console.info = jest.fn();
84
+ const collection2 = (0, _1.default)({
85
+ name: collectionName,
86
+ indexes: [{ keys: { name: 1 }, options: { unique: true } }]
87
+ });
88
+ await collection2.createIndexesPromise;
89
+ expect(console.warn).toHaveBeenCalled();
90
+ });
91
+ });
@@ -0,0 +1 @@
1
+ export declare const Tests: import("..").Collection<any>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Tests = void 0;
7
+ const helpers_1 = require("@orion-js/helpers");
8
+ const _1 = __importDefault(require("."));
9
+ const __1 = require("..");
10
+ jest.mock('./createIndexPromisesTest');
11
+ exports.Tests = (0, _1.default)({
12
+ name: (0, helpers_1.generateId)(),
13
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
14
+ });
15
+ beforeEach(async () => {
16
+ await Promise.all(__1.allConnectionPromises);
17
+ });
18
+ describe('createIndexesPromise', () => {
19
+ it('should correctly handle the promise for tests', async () => {
20
+ const userId = await exports.Tests.insertOne({
21
+ name: 'Nico'
22
+ });
23
+ const user = await exports.Tests.findOne(userId);
24
+ expect(user.name).toBe('Nico');
25
+ });
26
+ it('should be able to close the index handlers on the global config', async () => {
27
+ (0, _1.default)({
28
+ name: (0, helpers_1.generateId)(),
29
+ indexes: [{ keys: { a: 1 }, options: { unique: true } }]
30
+ });
31
+ });
32
+ });
@@ -0,0 +1,3 @@
1
+ import { CreateCollectionOptions } from '..';
2
+ declare const getIdGenerator: (options: CreateCollectionOptions) => (() => string);
3
+ export default getIdGenerator;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const helpers_1 = require("@orion-js/helpers");
4
+ const bson_1 = require("bson");
5
+ const getIdGenerator = (options) => {
6
+ if (options.idPrefix || options.idGeneration === 'uuid') {
7
+ return () => {
8
+ const prefix = options.idPrefix || '';
9
+ const random = (0, helpers_1.generateUUID)();
10
+ return `${prefix}${random}`;
11
+ };
12
+ }
13
+ if (options.idGeneration === 'random') {
14
+ return () => {
15
+ const prefix = options.idPrefix || '';
16
+ const random = (0, helpers_1.generateId)();
17
+ return `${prefix}${random}`;
18
+ };
19
+ }
20
+ return () => {
21
+ const id = new bson_1.ObjectId();
22
+ return id.toString();
23
+ };
24
+ };
25
+ exports.default = getIdGenerator;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const helpers_1 = require("@orion-js/helpers");
16
+ const index_1 = __importDefault(require("./index"));
17
+ const bson_1 = require("bson");
18
+ const typed_model_1 = require("@orion-js/typed-model");
19
+ it('generates a usable mongo objectId as string', async () => {
20
+ const Tests = (0, index_1.default)({ name: (0, helpers_1.generateId)() });
21
+ const now = new Date();
22
+ const userId = await Tests.insertOne({
23
+ name: 'Nico'
24
+ });
25
+ const objectId = bson_1.ObjectId.createFromHexString(userId);
26
+ expect(objectId.toString()).toBe(userId);
27
+ const diff = now.valueOf() - objectId.getTimestamp().valueOf();
28
+ expect(diff).toBeGreaterThan(0);
29
+ });
30
+ it('generates a ids with uuidv4', async () => {
31
+ let Schema = class Schema {
32
+ };
33
+ __decorate([
34
+ (0, typed_model_1.Prop)(),
35
+ __metadata("design:type", String)
36
+ ], Schema.prototype, "_id", void 0);
37
+ __decorate([
38
+ (0, typed_model_1.Prop)(),
39
+ __metadata("design:type", String)
40
+ ], Schema.prototype, "name", void 0);
41
+ Schema = __decorate([
42
+ (0, typed_model_1.TypedSchema)()
43
+ ], Schema);
44
+ const Tests = (0, index_1.default)({
45
+ name: (0, helpers_1.generateId)(),
46
+ schema: Schema,
47
+ idPrefix: 'prefix-'
48
+ });
49
+ const userId = await Tests.insertOne({
50
+ name: 'Nico'
51
+ });
52
+ expect(userId).toMatch(/^prefix\-/);
53
+ });
54
+ it('generates a ids with a prefix', async () => {
55
+ let Schema = class Schema {
56
+ };
57
+ __decorate([
58
+ (0, typed_model_1.Prop)(),
59
+ __metadata("design:type", String)
60
+ ], Schema.prototype, "_id", void 0);
61
+ __decorate([
62
+ (0, typed_model_1.Prop)(),
63
+ __metadata("design:type", String)
64
+ ], Schema.prototype, "name", void 0);
65
+ Schema = __decorate([
66
+ (0, typed_model_1.TypedSchema)()
67
+ ], Schema);
68
+ const Tests = (0, index_1.default)({
69
+ name: (0, helpers_1.generateId)(),
70
+ schema: Schema,
71
+ idGeneration: 'random',
72
+ idPrefix: 'pref_'
73
+ });
74
+ const userId = await Tests.insertOne({
75
+ name: 'Nico'
76
+ });
77
+ const item = await Tests.findOne(userId);
78
+ // no te deja usar otra cosa que no sea con el prefix
79
+ await Tests.updateOne({ _id: 'pref_123' }, { $set: { name: 'Nicolás' } });
80
+ expect(userId).toMatch(/^pref_/);
81
+ });
82
+ it('generates a ids with a distinct type', async () => {
83
+ let Schema = class Schema {
84
+ };
85
+ __decorate([
86
+ (0, typed_model_1.Prop)(),
87
+ __metadata("design:type", String)
88
+ ], Schema.prototype, "_id", void 0);
89
+ __decorate([
90
+ (0, typed_model_1.Prop)(),
91
+ __metadata("design:type", String)
92
+ ], Schema.prototype, "name", void 0);
93
+ Schema = __decorate([
94
+ (0, typed_model_1.TypedSchema)()
95
+ ], Schema);
96
+ const Tests = (0, index_1.default)({
97
+ name: (0, helpers_1.generateId)(),
98
+ schema: Schema
99
+ });
100
+ const userId = await Tests.insertOne({
101
+ name: 'Nico'
102
+ });
103
+ await Tests.findOne(userId);
104
+ // This should throw an error
105
+ // await Tests.findOne(anId)
106
+ const anId = '123';
107
+ await Tests.findOne(anId);
108
+ });
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const helpers_1 = require("@orion-js/helpers");
7
+ const __1 = __importDefault(require(".."));
8
+ it('ensuring the options are passed properly to the aggregate command', async () => {
9
+ const Tests = (0, __1.default)({ name: (0, helpers_1.generateId)() });
10
+ const cursorDefault = Tests.aggregate([{ $match: {} }]);
11
+ expect(cursorDefault.readPreference.mode).toBe('primary');
12
+ const cursorSecondary = Tests.aggregate([
13
+ {
14
+ $match: {}
15
+ }
16
+ ], {
17
+ readPreference: 'secondary'
18
+ });
19
+ expect(cursorSecondary.readPreference.mode).toBe('secondary');
20
+ });
@@ -0,0 +1,4 @@
1
+ import * as MongoDB from 'mongodb';
2
+ export default function cleanModifier(schema: any, modifier: any, { isUpsert }?: {
3
+ isUpsert: boolean;
4
+ }): Promise<MongoDB.UpdateFilter<MongoDB.BSON.Document>>;