@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.
- package/LICENSE +21 -0
- package/lib/connect/connections.d.ts +13 -0
- package/lib/connect/connections.js +4 -0
- package/lib/connect/getDBName.d.ts +1 -0
- package/lib/connect/getDBName.js +23 -0
- package/lib/connect/getMongoConnection.d.ts +8 -0
- package/lib/connect/getMongoConnection.js +47 -0
- package/lib/connect/getMongoConnection.test.d.ts +1 -0
- package/lib/connect/getMongoConnection.test.js +43 -0
- package/lib/connect/getMongoURLFromEnv.d.ts +1 -0
- package/lib/connect/getMongoURLFromEnv.js +21 -0
- package/lib/connect/index.d.ts +4 -0
- package/lib/connect/index.js +8 -0
- package/lib/createCollection/createIndexPromisesTest.d.ts +1 -0
- package/lib/createCollection/createIndexPromisesTest.js +12 -0
- package/lib/createCollection/createIndexes.d.ts +3 -0
- package/lib/createCollection/createIndexes.js +67 -0
- package/lib/createCollection/createIndexes.test.d.ts +1 -0
- package/lib/createCollection/createIndexes.test.js +91 -0
- package/lib/createCollection/createIndexesPromise.test.d.ts +1 -0
- package/lib/createCollection/createIndexesPromise.test.js +32 -0
- package/lib/createCollection/generateId.d.ts +3 -0
- package/lib/createCollection/generateId.js +25 -0
- package/lib/createCollection/generateId.test.d.ts +1 -0
- package/lib/createCollection/generateId.test.js +108 -0
- package/lib/createCollection/getMethods/aggregate.test.d.ts +1 -0
- package/lib/createCollection/getMethods/aggregate.test.js +20 -0
- package/lib/createCollection/getMethods/cleanModifier.d.ts +4 -0
- package/lib/createCollection/getMethods/cleanModifier.js +75 -0
- package/lib/createCollection/getMethods/cleanModifier.test.d.ts +1 -0
- package/lib/createCollection/getMethods/cleanModifier.test.js +186 -0
- package/lib/createCollection/getMethods/countDocuments.d.ts +2 -0
- package/lib/createCollection/getMethods/countDocuments.js +16 -0
- package/lib/createCollection/getMethods/countDocuments.test.d.ts +1 -0
- package/lib/createCollection/getMethods/countDocuments.test.js +21 -0
- package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.d.ts +9 -0
- package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.js +25 -0
- package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.test.d.ts +1 -0
- package/lib/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.test.js +37 -0
- package/lib/createCollection/getMethods/dataLoader/dataLoad/index.d.ts +9 -0
- package/lib/createCollection/getMethods/dataLoader/dataLoad/index.js +21 -0
- package/lib/createCollection/getMethods/dataLoader/index.d.ts +5 -0
- package/lib/createCollection/getMethods/dataLoader/index.js +14 -0
- package/lib/createCollection/getMethods/dataLoader/loadById.d.ts +2 -0
- package/lib/createCollection/getMethods/dataLoader/loadById.js +13 -0
- package/lib/createCollection/getMethods/dataLoader/loadById.test.d.ts +1 -0
- package/lib/createCollection/getMethods/dataLoader/loadById.test.js +23 -0
- package/lib/createCollection/getMethods/dataLoader/loadData.d.ts +2 -0
- package/lib/createCollection/getMethods/dataLoader/loadData.js +49 -0
- package/lib/createCollection/getMethods/dataLoader/loadMany.d.ts +2 -0
- package/lib/createCollection/getMethods/dataLoader/loadMany.js +10 -0
- package/lib/createCollection/getMethods/dataLoader/loadMany.test.d.ts +1 -0
- package/lib/createCollection/getMethods/dataLoader/loadMany.test.js +85 -0
- package/lib/createCollection/getMethods/dataLoader/loadOne.d.ts +2 -0
- package/lib/createCollection/getMethods/dataLoader/loadOne.js +10 -0
- package/lib/createCollection/getMethods/dataLoader/loadOne.test.d.ts +1 -0
- package/lib/createCollection/getMethods/dataLoader/loadOne.test.js +76 -0
- package/lib/createCollection/getMethods/deleteMany.d.ts +2 -0
- package/lib/createCollection/getMethods/deleteMany.js +16 -0
- package/lib/createCollection/getMethods/deleteOne.d.ts +2 -0
- package/lib/createCollection/getMethods/deleteOne.js +16 -0
- package/lib/createCollection/getMethods/estimatedDocumentCount.d.ts +3 -0
- package/lib/createCollection/getMethods/estimatedDocumentCount.js +10 -0
- package/lib/createCollection/getMethods/estimatedDocumentCount.test.d.ts +1 -0
- package/lib/createCollection/getMethods/estimatedDocumentCount.test.js +15 -0
- package/lib/createCollection/getMethods/find.d.ts +2 -0
- package/lib/createCollection/getMethods/find.js +21 -0
- package/lib/createCollection/getMethods/findOne.d.ts +2 -0
- package/lib/createCollection/getMethods/findOne.js +18 -0
- package/lib/createCollection/getMethods/findOneAndUpdate.d.ts +3 -0
- package/lib/createCollection/getMethods/findOneAndUpdate.js +29 -0
- package/lib/createCollection/getMethods/findOneAndUpdate.test.d.ts +1 -0
- package/lib/createCollection/getMethods/findOneAndUpdate.test.js +15 -0
- package/lib/createCollection/getMethods/getSelector.d.ts +3 -0
- package/lib/createCollection/getMethods/getSelector.js +21 -0
- package/lib/createCollection/getMethods/getSelector.test.d.ts +1 -0
- package/lib/createCollection/getMethods/getSelector.test.js +46 -0
- package/lib/createCollection/getMethods/index.d.ts +16 -0
- package/lib/createCollection/getMethods/index.js +36 -0
- package/lib/createCollection/getMethods/insertAndFind.d.ts +3 -0
- package/lib/createCollection/getMethods/insertAndFind.js +31 -0
- package/lib/createCollection/getMethods/insertAndFind.test.d.ts +1 -0
- package/lib/createCollection/getMethods/insertAndFind.test.js +50 -0
- package/lib/createCollection/getMethods/insertMany.d.ts +3 -0
- package/lib/createCollection/getMethods/insertMany.js +36 -0
- package/lib/createCollection/getMethods/insertMany.test.d.ts +1 -0
- package/lib/createCollection/getMethods/insertMany.test.js +66 -0
- package/lib/createCollection/getMethods/insertOne.d.ts +3 -0
- package/lib/createCollection/getMethods/insertOne.js +31 -0
- package/lib/createCollection/getMethods/insertOne.test.d.ts +1 -0
- package/lib/createCollection/getMethods/insertOne.test.js +104 -0
- package/lib/createCollection/getMethods/update.test.d.ts +1 -0
- package/lib/createCollection/getMethods/update.test.js +287 -0
- package/lib/createCollection/getMethods/updateAndFind.d.ts +3 -0
- package/lib/createCollection/getMethods/updateAndFind.js +18 -0
- package/lib/createCollection/getMethods/updateAndFind.test.d.ts +1 -0
- package/lib/createCollection/getMethods/updateAndFind.test.js +38 -0
- package/lib/createCollection/getMethods/updateItem.d.ts +2 -0
- package/lib/createCollection/getMethods/updateItem.js +19 -0
- package/lib/createCollection/getMethods/updateItem.test.d.ts +1 -0
- package/lib/createCollection/getMethods/updateItem.test.js +38 -0
- package/lib/createCollection/getMethods/updateMany.d.ts +3 -0
- package/lib/createCollection/getMethods/updateMany.js +30 -0
- package/lib/createCollection/getMethods/updateOne.d.ts +3 -0
- package/lib/createCollection/getMethods/updateOne.js +30 -0
- package/lib/createCollection/getMethods/upsert.d.ts +3 -0
- package/lib/createCollection/getMethods/upsert.js +31 -0
- package/lib/createCollection/getMethods/upsert.test.d.ts +1 -0
- package/lib/createCollection/getMethods/upsert.test.js +92 -0
- package/lib/createCollection/getMethods/validateModifier/index.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/index.js +18 -0
- package/lib/createCollection/getMethods/validateModifier/index.test.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/index.test.js +74 -0
- package/lib/createCollection/getMethods/validateModifier/validateInc.d.ts +7 -0
- package/lib/createCollection/getMethods/validateModifier/validateInc.js +20 -0
- package/lib/createCollection/getMethods/validateModifier/validateInc.test.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/validateInc.test.js +12 -0
- package/lib/createCollection/getMethods/validateModifier/validateOperator.d.ts +5 -0
- package/lib/createCollection/getMethods/validateModifier/validateOperator.js +34 -0
- package/lib/createCollection/getMethods/validateModifier/validatePush.d.ts +8 -0
- package/lib/createCollection/getMethods/validateModifier/validatePush.js +27 -0
- package/lib/createCollection/getMethods/validateModifier/validatePush.test.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/validatePush.test.js +90 -0
- package/lib/createCollection/getMethods/validateModifier/validateSet.d.ts +7 -0
- package/lib/createCollection/getMethods/validateModifier/validateSet.js +19 -0
- package/lib/createCollection/getMethods/validateModifier/validateSet.test.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/validateSet.test.js +16 -0
- package/lib/createCollection/getMethods/validateModifier/validateUnset.d.ts +7 -0
- package/lib/createCollection/getMethods/validateModifier/validateUnset.js +19 -0
- package/lib/createCollection/getMethods/validateModifier/validateUnset.test.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/validateUnset.test.js +71 -0
- package/lib/createCollection/getMethods/validateModifier/validateUpsert.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/validateUpsert.js +43 -0
- package/lib/createCollection/getMethods/validateModifier/validateUpsert.test.d.ts +1 -0
- package/lib/createCollection/getMethods/validateModifier/validateUpsert.test.js +50 -0
- package/lib/createCollection/getMethods/wrapErrors.d.ts +1 -0
- package/lib/createCollection/getMethods/wrapErrors.js +29 -0
- package/lib/createCollection/getSchemaAndModel.d.ts +10 -0
- package/lib/createCollection/getSchemaAndModel.js +41 -0
- package/lib/createCollection/handleError.d.ts +1 -0
- package/lib/createCollection/handleError.js +25 -0
- package/lib/createCollection/index.d.ts +4 -0
- package/lib/createCollection/index.js +77 -0
- package/lib/createCollection/initItem.d.ts +2 -0
- package/lib/createCollection/initItem.js +13 -0
- package/lib/createCollection/typedModel.test.d.ts +1 -0
- package/lib/createCollection/typedModel.test.js +159 -0
- package/lib/helpers/fromDot.d.ts +1 -0
- package/lib/helpers/fromDot.js +12 -0
- package/lib/helpers/fromDot.test.d.ts +1 -0
- package/lib/helpers/fromDot.test.js +47 -0
- package/lib/helpers/toDot.d.ts +1 -0
- package/lib/helpers/toDot.js +11 -0
- package/lib/helpers/toDot.test.d.ts +1 -0
- package/lib/helpers/toDot.test.js +23 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +35 -0
- package/lib/service/index.d.ts +3 -0
- package/lib/service/index.js +32 -0
- package/lib/service/index.test.d.ts +1 -0
- package/lib/service/index.test.js +73 -0
- package/lib/tests/setup.d.ts +1 -0
- package/lib/tests/setup.js +20 -0
- package/lib/types/index.d.ts +178 -0
- package/lib/types/index.js +2 -0
- package/lib/types/types.test.d.ts +1 -0
- package/lib/types/types.test.js +59 -0
- package/package.json +27 -29
- package/README.md +0 -15
- package/dist/index.cjs +0 -81990
- package/dist/index.d.ts +0 -204
- package/dist/index.js +0 -81964
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapErrors = void 0;
|
|
4
|
+
const schema_1 = require("@orion-js/schema");
|
|
5
|
+
const wrapErrors = async (operation) => {
|
|
6
|
+
try {
|
|
7
|
+
return await operation();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (error.code === 11000) {
|
|
11
|
+
const regex = /index: (?:.*\.)?\$?(?:([_a-z0-9]*)(?:_\d*)|([_a-z0-9]*))\s*dup key/i;
|
|
12
|
+
const match = error.message.match(regex);
|
|
13
|
+
if (!match) {
|
|
14
|
+
throw new schema_1.ValidationError({
|
|
15
|
+
unknownKey: 'notUnique'
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const indexNameText = match[1] || match[2];
|
|
19
|
+
const names = indexNameText.split(/_[_a-z0-9]_/);
|
|
20
|
+
const errors = {};
|
|
21
|
+
for (const name of names) {
|
|
22
|
+
errors[name] = 'notUnique';
|
|
23
|
+
}
|
|
24
|
+
throw new schema_1.ValidationError(errors);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.wrapErrors = wrapErrors;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Model } from '@orion-js/models';
|
|
2
|
+
import { Schema } from '@orion-js/schema';
|
|
3
|
+
import { CreateCollectionOptions } from '../types';
|
|
4
|
+
export declare function getModel(options: CreateCollectionOptions): Model;
|
|
5
|
+
export declare function prepareShema(schema: Schema): Schema;
|
|
6
|
+
export declare function getSchema(options: CreateCollectionOptions, optionsModel?: Model): Schema;
|
|
7
|
+
export declare function getSchemaAndModel(options: CreateCollectionOptions): {
|
|
8
|
+
schema: Schema;
|
|
9
|
+
model: Model;
|
|
10
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSchemaAndModel = exports.getSchema = exports.prepareShema = exports.getModel = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
function getModel(options) {
|
|
6
|
+
if (!options.model)
|
|
7
|
+
return;
|
|
8
|
+
return options.model && options.model.getModel ? options.model.getModel() : options.model;
|
|
9
|
+
}
|
|
10
|
+
exports.getModel = getModel;
|
|
11
|
+
function prepareShema(schema) {
|
|
12
|
+
if (!schema._id) {
|
|
13
|
+
schema._id = {
|
|
14
|
+
type: String
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return schema;
|
|
18
|
+
}
|
|
19
|
+
exports.prepareShema = prepareShema;
|
|
20
|
+
function getSchema(options, optionsModel) {
|
|
21
|
+
if (optionsModel) {
|
|
22
|
+
const schema = optionsModel ? (0, lodash_1.cloneDeep)(optionsModel.getCleanSchema()) : {};
|
|
23
|
+
return prepareShema(schema);
|
|
24
|
+
}
|
|
25
|
+
// schema is a typed model
|
|
26
|
+
if (options.schema && options.schema.getModel) {
|
|
27
|
+
const model = options.schema.getModel();
|
|
28
|
+
const schema = model ? (0, lodash_1.cloneDeep)(model.getCleanSchema()) : {};
|
|
29
|
+
return prepareShema(schema);
|
|
30
|
+
}
|
|
31
|
+
if (options.schema && (0, lodash_1.isPlainObject)(options.schema)) {
|
|
32
|
+
return prepareShema(options.schema);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.getSchema = getSchema;
|
|
36
|
+
function getSchemaAndModel(options) {
|
|
37
|
+
const model = getModel(options);
|
|
38
|
+
const schema = getSchema(options, model);
|
|
39
|
+
return { schema, model };
|
|
40
|
+
}
|
|
41
|
+
exports.getSchemaAndModel = getSchemaAndModel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (func: any): (...args: any[]) => Promise<any>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const schema_1 = require("@orion-js/schema");
|
|
4
|
+
function default_1(func) {
|
|
5
|
+
return async (...args) => {
|
|
6
|
+
try {
|
|
7
|
+
return await func(...args);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (error.code === 11000) {
|
|
11
|
+
const regex = /index: (?:.*\.)?\$?(?:([_a-z0-9]*)(?:_\d*)|([_a-z0-9]*))\s*dup key/i;
|
|
12
|
+
const match = error.message.match(regex);
|
|
13
|
+
const indexNameText = match[1] || match[2];
|
|
14
|
+
const names = indexNameText.split(/_[_a-z0-9]_/);
|
|
15
|
+
const errors = {};
|
|
16
|
+
for (const name of names) {
|
|
17
|
+
errors[name] = 'notUnique';
|
|
18
|
+
}
|
|
19
|
+
throw new schema_1.ValidationError(errors);
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
exports.default = default_1;
|
|
@@ -0,0 +1,77 @@
|
|
|
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.createIndexesPromises = void 0;
|
|
7
|
+
const initItem_1 = __importDefault(require("./initItem"));
|
|
8
|
+
const getMethods_1 = require("./getMethods");
|
|
9
|
+
const dataLoader_1 = require("./getMethods/dataLoader");
|
|
10
|
+
const generateId_1 = __importDefault(require("./generateId"));
|
|
11
|
+
const createIndexes_1 = require("./createIndexes");
|
|
12
|
+
const __1 = require("..");
|
|
13
|
+
const getSchemaAndModel_1 = require("./getSchemaAndModel");
|
|
14
|
+
exports.createIndexesPromises = [];
|
|
15
|
+
const createCollection = (options) => {
|
|
16
|
+
const connectionName = options.connectionName || 'main';
|
|
17
|
+
const orionConnection = (0, __1.getMongoConnection)({ name: connectionName });
|
|
18
|
+
if (!orionConnection) {
|
|
19
|
+
throw new Error(`The connection to MongoDB "${connectionName}" was not found`);
|
|
20
|
+
}
|
|
21
|
+
const db = orionConnection.db;
|
|
22
|
+
const rawCollection = db.collection(options.name);
|
|
23
|
+
const { schema, model } = (0, getSchemaAndModel_1.getSchemaAndModel)(options);
|
|
24
|
+
const collection = {
|
|
25
|
+
name: options.name,
|
|
26
|
+
connectionName,
|
|
27
|
+
schema,
|
|
28
|
+
model,
|
|
29
|
+
indexes: options.indexes || [],
|
|
30
|
+
db,
|
|
31
|
+
client: orionConnection,
|
|
32
|
+
connectionPromise: orionConnection.connectionPromise,
|
|
33
|
+
rawCollection,
|
|
34
|
+
generateId: (0, generateId_1.default)(options),
|
|
35
|
+
getSchema: () => schema
|
|
36
|
+
};
|
|
37
|
+
// helpers
|
|
38
|
+
collection.initItem = (0, initItem_1.default)(collection);
|
|
39
|
+
// modified orion methods
|
|
40
|
+
collection.findOne = (0, getMethods_1.findOne)(collection);
|
|
41
|
+
collection.find = (0, getMethods_1.find)(collection);
|
|
42
|
+
collection.findOneAndUpdate = (0, getMethods_1.findOneAndUpdate)(collection);
|
|
43
|
+
collection.insertOne = (0, getMethods_1.insertOne)(collection);
|
|
44
|
+
collection.insertMany = (0, getMethods_1.insertMany)(collection);
|
|
45
|
+
collection.insertAndFind = (0, getMethods_1.insertAndFind)(collection);
|
|
46
|
+
collection.updateOne = (0, getMethods_1.updateOne)(collection);
|
|
47
|
+
collection.updateMany = (0, getMethods_1.updateMany)(collection);
|
|
48
|
+
collection.deleteMany = (0, getMethods_1.deleteMany)(collection);
|
|
49
|
+
collection.deleteOne = (0, getMethods_1.deleteOne)(collection);
|
|
50
|
+
collection.upsert = (0, getMethods_1.upsert)(collection);
|
|
51
|
+
// counts
|
|
52
|
+
collection.estimatedDocumentCount = (0, getMethods_1.estimatedDocumentCount)(collection);
|
|
53
|
+
collection.countDocuments = (0, getMethods_1.countDocuments)(collection);
|
|
54
|
+
// update and find
|
|
55
|
+
collection.updateAndFind = (0, getMethods_1.updateAndFind)(collection);
|
|
56
|
+
collection.updateItem = (0, getMethods_1.updateItem)(collection);
|
|
57
|
+
// plain passed methods
|
|
58
|
+
collection.aggregate = (pipeline, options) => collection.rawCollection.aggregate(pipeline, options);
|
|
59
|
+
collection.watch = (pipeline, options) => collection.rawCollection.watch(pipeline, options);
|
|
60
|
+
// data loader
|
|
61
|
+
collection.loadData = (0, dataLoader_1.loadData)(collection);
|
|
62
|
+
collection.loadById = (0, dataLoader_1.loadById)(collection);
|
|
63
|
+
collection.loadOne = (0, dataLoader_1.loadOne)(collection);
|
|
64
|
+
collection.loadMany = (0, dataLoader_1.loadMany)(collection);
|
|
65
|
+
const createIndexes = async () => {
|
|
66
|
+
const createIndexPromise = (0, createIndexes_1.loadIndexes)(collection);
|
|
67
|
+
exports.createIndexesPromises.push(createIndexPromise);
|
|
68
|
+
collection.createIndexesPromise = createIndexPromise;
|
|
69
|
+
return createIndexPromise;
|
|
70
|
+
};
|
|
71
|
+
collection.createIndexes = createIndexes;
|
|
72
|
+
if (!process.env.DONT_CREATE_INDEXES_AUTOMATICALLY) {
|
|
73
|
+
createIndexes();
|
|
74
|
+
}
|
|
75
|
+
return collection;
|
|
76
|
+
};
|
|
77
|
+
exports.default = createCollection;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function initItem(collection) {
|
|
4
|
+
const initItem = doc => {
|
|
5
|
+
if (!doc)
|
|
6
|
+
return doc;
|
|
7
|
+
if (!collection.model)
|
|
8
|
+
return doc;
|
|
9
|
+
return collection.model.initItem(doc);
|
|
10
|
+
};
|
|
11
|
+
return initItem;
|
|
12
|
+
}
|
|
13
|
+
exports.default = initItem;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
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 _1 = __importDefault(require("."));
|
|
16
|
+
const typed_model_1 = require("@orion-js/typed-model");
|
|
17
|
+
const helpers_1 = require("@orion-js/helpers");
|
|
18
|
+
const resolvers_1 = require("@orion-js/resolvers");
|
|
19
|
+
describe('Collections with typed model', () => {
|
|
20
|
+
const resolve = async (person, { title }, viewer) => {
|
|
21
|
+
return `${title} ${person.firstName} ${person.lastName}`;
|
|
22
|
+
};
|
|
23
|
+
const titleResolver = (0, resolvers_1.modelResolver)({
|
|
24
|
+
returns: String,
|
|
25
|
+
resolve
|
|
26
|
+
});
|
|
27
|
+
let Person = class Person {
|
|
28
|
+
};
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, typed_model_1.Prop)(),
|
|
31
|
+
__metadata("design:type", String)
|
|
32
|
+
], Person.prototype, "_id", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
(0, typed_model_1.Prop)(),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], Person.prototype, "firstName", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
(0, typed_model_1.Prop)({ max: 10 }),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], Person.prototype, "lastName", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, typed_model_1.ResolverProp)(titleResolver),
|
|
43
|
+
__metadata("design:type", Object)
|
|
44
|
+
], Person.prototype, "title", void 0);
|
|
45
|
+
Person = __decorate([
|
|
46
|
+
(0, typed_model_1.TypedModel)()
|
|
47
|
+
], Person);
|
|
48
|
+
it('Should throw a validation error', async () => {
|
|
49
|
+
const Persons = (0, _1.default)({
|
|
50
|
+
name: (0, helpers_1.generateId)(),
|
|
51
|
+
model: (0, typed_model_1.getModelForClass)(Person)
|
|
52
|
+
});
|
|
53
|
+
expect.assertions(1);
|
|
54
|
+
try {
|
|
55
|
+
await Persons.insertOne({ firstName: 'John', lastName: 'Really long last name' });
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
const validationError = e;
|
|
59
|
+
expect(validationError.validationErrors).toEqual({
|
|
60
|
+
lastName: 'stringTooLong'
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
it('Should pass the resolvers to the items', async () => {
|
|
65
|
+
const Persons = (0, _1.default)({
|
|
66
|
+
name: (0, helpers_1.generateId)(),
|
|
67
|
+
model: (0, typed_model_1.getModelForClass)(Person)
|
|
68
|
+
});
|
|
69
|
+
await Persons.insertOne({
|
|
70
|
+
firstName: 'John',
|
|
71
|
+
lastName: 'Doe'
|
|
72
|
+
});
|
|
73
|
+
const person = await Persons.findOne({});
|
|
74
|
+
const title = await person.title({ title: 'Mr.' });
|
|
75
|
+
expect(title).toBe('Mr. John Doe');
|
|
76
|
+
});
|
|
77
|
+
it('Should allow passing _id on insert', async () => {
|
|
78
|
+
let PersonOptionalId = class PersonOptionalId {
|
|
79
|
+
};
|
|
80
|
+
__decorate([
|
|
81
|
+
(0, typed_model_1.Prop)(),
|
|
82
|
+
__metadata("design:type", String)
|
|
83
|
+
], PersonOptionalId.prototype, "_id", void 0);
|
|
84
|
+
__decorate([
|
|
85
|
+
(0, typed_model_1.Prop)(),
|
|
86
|
+
__metadata("design:type", String)
|
|
87
|
+
], PersonOptionalId.prototype, "firstName", void 0);
|
|
88
|
+
__decorate([
|
|
89
|
+
(0, typed_model_1.Prop)({ optional: true }),
|
|
90
|
+
__metadata("design:type", String)
|
|
91
|
+
], PersonOptionalId.prototype, "lastName", void 0);
|
|
92
|
+
PersonOptionalId = __decorate([
|
|
93
|
+
(0, typed_model_1.TypedSchema)()
|
|
94
|
+
], PersonOptionalId);
|
|
95
|
+
const Persons = (0, _1.default)({
|
|
96
|
+
name: (0, helpers_1.generateId)(),
|
|
97
|
+
model: PersonOptionalId
|
|
98
|
+
});
|
|
99
|
+
await Persons.insertOne({
|
|
100
|
+
_id: '1',
|
|
101
|
+
firstName: 'John'
|
|
102
|
+
});
|
|
103
|
+
const person = await Persons.findOne('1');
|
|
104
|
+
expect(person.firstName).toBe('John');
|
|
105
|
+
});
|
|
106
|
+
it('Should validate but not initialize documents when passed typed schema', async () => {
|
|
107
|
+
const resolve = async (person, { title }, viewer) => {
|
|
108
|
+
return `${title} ${person.firstName} ${person.lastName}`;
|
|
109
|
+
};
|
|
110
|
+
const titleResolver = (0, resolvers_1.modelResolver)({
|
|
111
|
+
returns: String,
|
|
112
|
+
resolve
|
|
113
|
+
});
|
|
114
|
+
let Person = class Person {
|
|
115
|
+
};
|
|
116
|
+
__decorate([
|
|
117
|
+
(0, typed_model_1.Prop)(),
|
|
118
|
+
__metadata("design:type", String)
|
|
119
|
+
], Person.prototype, "_id", void 0);
|
|
120
|
+
__decorate([
|
|
121
|
+
(0, typed_model_1.Prop)(),
|
|
122
|
+
__metadata("design:type", String)
|
|
123
|
+
], Person.prototype, "firstName", void 0);
|
|
124
|
+
__decorate([
|
|
125
|
+
(0, typed_model_1.Prop)({ max: 3 }),
|
|
126
|
+
__metadata("design:type", String)
|
|
127
|
+
], Person.prototype, "lastName", void 0);
|
|
128
|
+
__decorate([
|
|
129
|
+
(0, typed_model_1.ResolverProp)(titleResolver),
|
|
130
|
+
__metadata("design:type", Object)
|
|
131
|
+
], Person.prototype, "title", void 0);
|
|
132
|
+
Person = __decorate([
|
|
133
|
+
(0, typed_model_1.TypedSchema)()
|
|
134
|
+
], Person);
|
|
135
|
+
const Persons = (0, _1.default)({
|
|
136
|
+
name: (0, helpers_1.generateId)(),
|
|
137
|
+
schema: Person
|
|
138
|
+
});
|
|
139
|
+
expect.assertions(3);
|
|
140
|
+
try {
|
|
141
|
+
await Persons.insertOne({
|
|
142
|
+
_id: '1',
|
|
143
|
+
firstName: 'John',
|
|
144
|
+
lastName: 'ppoo'
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
expect(error.message).toBe('Validation Error: {lastName: stringTooLong}');
|
|
149
|
+
}
|
|
150
|
+
await Persons.insertOne({
|
|
151
|
+
_id: '1',
|
|
152
|
+
firstName: 'John',
|
|
153
|
+
lastName: 'Doe'
|
|
154
|
+
});
|
|
155
|
+
const person = await Persons.findOne('1');
|
|
156
|
+
expect(person.firstName).toBe('John');
|
|
157
|
+
expect(person.title).toBeUndefined();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function fromDot(doc: any): 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
|
+
const dot_object_1 = __importDefault(require("dot-object"));
|
|
7
|
+
const toDot_1 = __importDefault(require("./toDot"));
|
|
8
|
+
function fromDot(doc) {
|
|
9
|
+
doc = (0, toDot_1.default)(doc);
|
|
10
|
+
return dot_object_1.default.object(doc);
|
|
11
|
+
}
|
|
12
|
+
exports.default = fromDot;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
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
|
+
const fromDot_1 = __importDefault(require("./fromDot"));
|
|
7
|
+
it('should convert objects from dot notation', async () => {
|
|
8
|
+
const result = (0, fromDot_1.default)({
|
|
9
|
+
'person.name': 'Nicolás',
|
|
10
|
+
'person.framework': 'Orion'
|
|
11
|
+
});
|
|
12
|
+
expect(result).toEqual({
|
|
13
|
+
person: { name: 'Nicolás', framework: 'Orion' }
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
it('should handle object with values that are not in dot notation', async () => {
|
|
17
|
+
const doc = {
|
|
18
|
+
'person.name': 'Nicolás',
|
|
19
|
+
person: { friends: [{ person: { name: 'Joaquín' } }, { person: { name: 'Roberto' } }] }
|
|
20
|
+
};
|
|
21
|
+
const result = (0, fromDot_1.default)(doc);
|
|
22
|
+
expect(result).toEqual({
|
|
23
|
+
person: {
|
|
24
|
+
name: 'Nicolás',
|
|
25
|
+
friends: [{ person: { name: 'Joaquín' } }, { person: { name: 'Roberto' } }]
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
it('should convert objects with array from dot notation', async () => {
|
|
30
|
+
const result = (0, fromDot_1.default)({
|
|
31
|
+
'person.friends': [{ 'person.name': 'Joaquín' }, { 'person.name': 'Roberto' }]
|
|
32
|
+
});
|
|
33
|
+
expect(result).toEqual({
|
|
34
|
+
person: { friends: [{ person: { name: 'Joaquín' } }, { person: { name: 'Roberto' } }] }
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it('should convert objects with index array from dot notation', async () => {
|
|
38
|
+
const result = (0, fromDot_1.default)({
|
|
39
|
+
'person.friends.0.person.name': 'Joaquín',
|
|
40
|
+
'person.friends.1.person.name': 'Roberto'
|
|
41
|
+
});
|
|
42
|
+
expect(result).toEqual({
|
|
43
|
+
person: {
|
|
44
|
+
friends: [{ person: { name: 'Joaquín' } }, { person: { name: 'Roberto' } }]
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (doc: any): any;
|
|
@@ -0,0 +1,11 @@
|
|
|
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 dot_object_1 = __importDefault(require("dot-object"));
|
|
7
|
+
var dot = new dot_object_1.default('.', false, true, false);
|
|
8
|
+
function default_1(doc) {
|
|
9
|
+
return dot.dot(doc);
|
|
10
|
+
}
|
|
11
|
+
exports.default = default_1;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
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 toDot_1 = __importDefault(require("./toDot"));
|
|
7
|
+
it('should convert objects to dot notation', async () => {
|
|
8
|
+
const result = (0, toDot_1.default)({
|
|
9
|
+
person: { name: 'Nicolás' }
|
|
10
|
+
});
|
|
11
|
+
expect(result).toEqual({
|
|
12
|
+
'person.name': 'Nicolás'
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
it('should convert objects with array to dot notation', async () => {
|
|
16
|
+
const result = (0, toDot_1.default)({
|
|
17
|
+
person: { friends: [{ person: { name: 'Joaquín' } }, { person: { name: 'Roberto' } }] }
|
|
18
|
+
});
|
|
19
|
+
expect(result).toEqual({
|
|
20
|
+
'person.friends.0.person.name': 'Joaquín',
|
|
21
|
+
'person.friends.1.person.name': 'Roberto'
|
|
22
|
+
});
|
|
23
|
+
});
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.createIndexesPromises = exports.createCollection = void 0;
|
|
30
|
+
const createCollection_1 = __importStar(require("./createCollection"));
|
|
31
|
+
exports.createCollection = createCollection_1.default;
|
|
32
|
+
Object.defineProperty(exports, "createIndexesPromises", { enumerable: true, get: function () { return createCollection_1.createIndexesPromises; } });
|
|
33
|
+
__exportStar(require("./connect"), exports);
|
|
34
|
+
__exportStar(require("./types"), exports);
|
|
35
|
+
__exportStar(require("./service"), exports);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CreateCollectionOptions, ModelClassBase } from '../types';
|
|
2
|
+
export declare function MongoCollection<ModelClass extends ModelClassBase = ModelClassBase>(options: CreateCollectionOptions<ModelClass>): (object: any, propertyName: string, index?: number) => void;
|
|
3
|
+
export declare function Repository(): ClassDecorator;
|
|
@@ -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.Repository = exports.MongoCollection = void 0;
|
|
7
|
+
const services_1 = require("@orion-js/services");
|
|
8
|
+
const createCollection_1 = __importDefault(require("../createCollection"));
|
|
9
|
+
function MongoCollection(options) {
|
|
10
|
+
return function (object, propertyName, index) {
|
|
11
|
+
services_1.Container.registerHandler({
|
|
12
|
+
object,
|
|
13
|
+
propertyName,
|
|
14
|
+
index,
|
|
15
|
+
value: containerInstance => {
|
|
16
|
+
if (!object.serviceType || object.serviceType !== 'repo') {
|
|
17
|
+
throw new Error('You must pass a class decorated with @Repository if you want to use @MongoCollection');
|
|
18
|
+
}
|
|
19
|
+
return (0, createCollection_1.default)(options);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
exports.MongoCollection = MongoCollection;
|
|
25
|
+
function Repository() {
|
|
26
|
+
return function (target) {
|
|
27
|
+
(0, services_1.Service)()(target);
|
|
28
|
+
target.prototype.service = target;
|
|
29
|
+
target.prototype.serviceType = 'repo';
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
exports.Repository = Repository;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const services_1 = require("@orion-js/services");
|
|
13
|
+
const typed_model_1 = require("@orion-js/typed-model");
|
|
14
|
+
const _1 = require(".");
|
|
15
|
+
describe('Collection as IOC', () => {
|
|
16
|
+
it('should create the collection and set the methods', async () => {
|
|
17
|
+
let User = class User {
|
|
18
|
+
};
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, typed_model_1.Prop)(),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], User.prototype, "_id", void 0);
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, typed_model_1.Prop)(),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], User.prototype, "name", void 0);
|
|
27
|
+
User = __decorate([
|
|
28
|
+
(0, typed_model_1.TypedSchema)()
|
|
29
|
+
], User);
|
|
30
|
+
let UserRepo = class UserRepo {
|
|
31
|
+
async createUser(user) {
|
|
32
|
+
return await this.users.insertOne(user);
|
|
33
|
+
}
|
|
34
|
+
async getUserByName(name) {
|
|
35
|
+
return await this.users.findOne({ name });
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
__decorate([
|
|
39
|
+
(0, _1.MongoCollection)({
|
|
40
|
+
name: 'users',
|
|
41
|
+
schema: User,
|
|
42
|
+
idGeneration: 'random',
|
|
43
|
+
idPrefix: 'user_'
|
|
44
|
+
}),
|
|
45
|
+
__metadata("design:type", Object)
|
|
46
|
+
], UserRepo.prototype, "users", void 0);
|
|
47
|
+
UserRepo = __decorate([
|
|
48
|
+
(0, _1.Repository)()
|
|
49
|
+
], UserRepo);
|
|
50
|
+
const instance = (0, services_1.getInstance)(UserRepo);
|
|
51
|
+
const userId = await instance.createUser({ name: 'Nico' });
|
|
52
|
+
const user = await instance.getUserByName('Nico');
|
|
53
|
+
expect(user._id).toBe(userId);
|
|
54
|
+
});
|
|
55
|
+
it('should throw an error when trying to set a collection param in a service that is not a repo', () => {
|
|
56
|
+
expect.assertions(1);
|
|
57
|
+
try {
|
|
58
|
+
let UserErrorRepo = class UserErrorRepo {
|
|
59
|
+
};
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, _1.MongoCollection)({ name: 'users2' }),
|
|
62
|
+
__metadata("design:type", Object)
|
|
63
|
+
], UserErrorRepo.prototype, "users", void 0);
|
|
64
|
+
UserErrorRepo = __decorate([
|
|
65
|
+
(0, services_1.Service)()
|
|
66
|
+
], UserErrorRepo);
|
|
67
|
+
const instance = (0, services_1.getInstance)(UserErrorRepo);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
expect(error.message).toBe('You must pass a class decorated with @Repository if you want to use @MongoCollection');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|