@e22m4u/js-repository-mongodb-adapter 0.7.2 → 0.8.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/cjs/index.cjs +1 -12
- package/jsconfig.json +7 -0
- package/package.json +5 -5
- package/src/mongodb-adapter.js +7 -2
- package/src/mongodb-adapter.spec.js +12 -88
- package/src/utils/index.js +0 -1
- package/src/utils/model-name-to-collection-name.js +0 -26
- package/src/utils/model-name-to-collection-name.spec.js +0 -89
package/dist/cjs/index.cjs
CHANGED
|
@@ -991,17 +991,6 @@ function transformValuesDeep(value, transformer) {
|
|
|
991
991
|
}
|
|
992
992
|
__name(transformValuesDeep, "transformValuesDeep");
|
|
993
993
|
|
|
994
|
-
// src/utils/model-name-to-collection-name.js
|
|
995
|
-
function modelNameToCollectionName(modelName) {
|
|
996
|
-
const ccName = toCamelCase2(modelName);
|
|
997
|
-
const woModel = ccName.replace(/Model$/i, "");
|
|
998
|
-
if (woModel.length <= 2) {
|
|
999
|
-
return pluralize(ccName);
|
|
1000
|
-
}
|
|
1001
|
-
return pluralize(woModel);
|
|
1002
|
-
}
|
|
1003
|
-
__name(modelNameToCollectionName, "modelNameToCollectionName");
|
|
1004
|
-
|
|
1005
994
|
// src/mongodb-adapter.js
|
|
1006
995
|
var MONGODB_OPTION_NAMES = [
|
|
1007
996
|
"ALPNProtocols",
|
|
@@ -1259,7 +1248,7 @@ var _MongodbAdapter = class _MongodbAdapter extends import_js_repository3.Adapte
|
|
|
1259
1248
|
_getCollectionNameByModelName(modelName) {
|
|
1260
1249
|
const modelDef = this.getService(import_js_repository3.DefinitionRegistry).getModel(modelName);
|
|
1261
1250
|
if (modelDef.tableName != null) return modelDef.tableName;
|
|
1262
|
-
return
|
|
1251
|
+
return pluralize(toCamelCase2(modelDef.name));
|
|
1263
1252
|
}
|
|
1264
1253
|
/**
|
|
1265
1254
|
* Get collection.
|
package/jsconfig.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@e22m4u/js-repository-mongodb-adapter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "MongoDB адаптер для @e22m4u/js-repository",
|
|
5
5
|
"author": "Mikhail Evstropov <e22m4u@yandex.ru>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,17 +42,17 @@
|
|
|
42
42
|
"mongodb": "6.20.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"@e22m4u/js-repository": "~0.
|
|
45
|
+
"@e22m4u/js-repository": "~0.7.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@commitlint/cli": "~20.1.0",
|
|
49
49
|
"@commitlint/config-conventional": "~20.0.0",
|
|
50
50
|
"@eslint/js": "~9.39.1",
|
|
51
51
|
"c8": "~10.1.3",
|
|
52
|
-
"chai": "~6.2.
|
|
52
|
+
"chai": "~6.2.1",
|
|
53
53
|
"chai-as-promised": "~8.0.2",
|
|
54
54
|
"dotenv": "~17.2.3",
|
|
55
|
-
"esbuild": "~0.
|
|
55
|
+
"esbuild": "~0.27.0",
|
|
56
56
|
"eslint": "~9.39.1",
|
|
57
57
|
"eslint-config-prettier": "~10.1.8",
|
|
58
58
|
"eslint-plugin-chai-expect": "~3.1.0",
|
|
@@ -61,6 +61,6 @@
|
|
|
61
61
|
"husky": "~9.1.7",
|
|
62
62
|
"mocha": "~11.7.5",
|
|
63
63
|
"prettier": "~3.6.2",
|
|
64
|
-
"rimraf": "~6.1.
|
|
64
|
+
"rimraf": "~6.1.2"
|
|
65
65
|
}
|
|
66
66
|
}
|
package/src/mongodb-adapter.js
CHANGED
|
@@ -17,11 +17,12 @@ import {
|
|
|
17
17
|
} from '@e22m4u/js-repository';
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
|
+
pluralize,
|
|
20
21
|
isIsoDate,
|
|
21
22
|
isObjectId,
|
|
23
|
+
toCamelCase,
|
|
22
24
|
createMongodbUrl,
|
|
23
25
|
transformValuesDeep,
|
|
24
|
-
modelNameToCollectionName,
|
|
25
26
|
} from './utils/index.js';
|
|
26
27
|
|
|
27
28
|
/**
|
|
@@ -314,7 +315,11 @@ export class MongodbAdapter extends Adapter {
|
|
|
314
315
|
_getCollectionNameByModelName(modelName) {
|
|
315
316
|
const modelDef = this.getService(DefinitionRegistry).getModel(modelName);
|
|
316
317
|
if (modelDef.tableName != null) return modelDef.tableName;
|
|
317
|
-
|
|
318
|
+
// если имя коллекции не определено явно (опция "tableName"),
|
|
319
|
+
// то выполняется приведение имени модели к стандартному camelCase
|
|
320
|
+
// во множественном числе
|
|
321
|
+
// "Article" -> "articles", "AccessToken" -> "accessTokens"
|
|
322
|
+
return pluralize(toCamelCase(modelDef.name));
|
|
318
323
|
}
|
|
319
324
|
|
|
320
325
|
/**
|
|
@@ -62,26 +62,6 @@ describe('MongodbAdapter', function () {
|
|
|
62
62
|
);
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
// prettier-ignore
|
|
66
|
-
it('cuts off the "Model" suffix from the model name', async function () {
|
|
67
|
-
const schema = createSchema();
|
|
68
|
-
const modelNamesToCollectionNames = [
|
|
69
|
-
['camelCaseEntityModel', 'camelCaseEntities'],
|
|
70
|
-
['PascalCaseEntityModel', 'pascalCaseEntities'],
|
|
71
|
-
['snake_case_entity_model', 'snakeCaseEntities'],
|
|
72
|
-
['kebab-case-entity-model', 'kebabCaseEntities'],
|
|
73
|
-
['UPPER_SNAKE_CASE_ENTITY_MODEL', 'upperSnakeCaseEntities'],
|
|
74
|
-
['UPPER-KEBAB-CASE-ENTITY-MODEL', 'upperKebabCaseEntities'],
|
|
75
|
-
];
|
|
76
|
-
modelNamesToCollectionNames.forEach(tuple =>
|
|
77
|
-
schema.defineModel({name: tuple[0], datasource: 'mongodb'}),
|
|
78
|
-
);
|
|
79
|
-
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
80
|
-
modelNamesToCollectionNames.forEach(tuple =>
|
|
81
|
-
expect(A._getCollectionNameByModelName(tuple[0])).to.be.eq(tuple[1]),
|
|
82
|
-
);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
65
|
it('converts already pluralized model name to camel case', async function () {
|
|
86
66
|
const schema = createSchema();
|
|
87
67
|
const modelNamesToCollectionNames = [
|
|
@@ -101,26 +81,6 @@ describe('MongodbAdapter', function () {
|
|
|
101
81
|
);
|
|
102
82
|
});
|
|
103
83
|
|
|
104
|
-
// prettier-ignore
|
|
105
|
-
it('converts already pluralized model name to camel case and cut off the "Model" suffix', async function () {
|
|
106
|
-
const schema = createSchema();
|
|
107
|
-
const modelNamesToCollectionNames = [
|
|
108
|
-
['camelCaseEntitiesModel', 'camelCaseEntities'],
|
|
109
|
-
['PascalCaseEntitiesModel', 'pascalCaseEntities'],
|
|
110
|
-
['snake_case_entities_model', 'snakeCaseEntities'],
|
|
111
|
-
['kebab-case-entities-model', 'kebabCaseEntities'],
|
|
112
|
-
['UPPER_SNAKE_CASE_ENTITIES_MODEL', 'upperSnakeCaseEntities'],
|
|
113
|
-
['UPPER-KEBAB-CASE-ENTITIES-MODEL', 'upperKebabCaseEntities'],
|
|
114
|
-
];
|
|
115
|
-
modelNamesToCollectionNames.forEach(tuple =>
|
|
116
|
-
schema.defineModel({name: tuple[0], datasource: 'mongodb'}),
|
|
117
|
-
);
|
|
118
|
-
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
119
|
-
modelNamesToCollectionNames.forEach(tuple =>
|
|
120
|
-
expect(A._getCollectionNameByModelName(tuple[0])).to.be.eq(tuple[1]),
|
|
121
|
-
);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
84
|
it('returns the value from the "tableName" option if defined', async function () {
|
|
125
85
|
const schema = createSchema();
|
|
126
86
|
schema.defineModel({
|
|
@@ -136,31 +96,31 @@ describe('MongodbAdapter', function () {
|
|
|
136
96
|
describe('_getCollection', function () {
|
|
137
97
|
it('should create and return a new collection object on the first call', async function () {
|
|
138
98
|
const schema = createSchema();
|
|
139
|
-
schema.defineModel({name: '
|
|
99
|
+
schema.defineModel({name: 'model', datasource: 'mongodb'});
|
|
140
100
|
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
141
|
-
expect(A._collections.has('
|
|
142
|
-
const collection = A._getCollection('
|
|
101
|
+
expect(A._collections.has('model')).to.be.false;
|
|
102
|
+
const collection = A._getCollection('model');
|
|
143
103
|
expect(collection).to.exist;
|
|
144
|
-
expect(collection.collectionName).to.equal('
|
|
104
|
+
expect(collection.collectionName).to.equal('models');
|
|
145
105
|
expect(collection.dbName).to.equal(CONFIG.database);
|
|
146
106
|
});
|
|
147
107
|
|
|
148
108
|
it('should cache the collection object after the first call', async function () {
|
|
149
109
|
const schema = createSchema();
|
|
150
|
-
schema.defineModel({name: '
|
|
110
|
+
schema.defineModel({name: 'model', datasource: 'mongodb'});
|
|
151
111
|
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
152
|
-
expect(A._collections.has('
|
|
153
|
-
A._getCollection('
|
|
154
|
-
expect(A._collections.has('
|
|
155
|
-
expect(A._collections.get('
|
|
112
|
+
expect(A._collections.has('model')).to.be.false;
|
|
113
|
+
A._getCollection('model');
|
|
114
|
+
expect(A._collections.has('model')).to.be.true;
|
|
115
|
+
expect(A._collections.get('model')).to.exist;
|
|
156
116
|
});
|
|
157
117
|
|
|
158
118
|
it('should return the cached collection instance on subsequent calls', async function () {
|
|
159
119
|
const schema = createSchema();
|
|
160
|
-
schema.defineModel({name: '
|
|
120
|
+
schema.defineModel({name: 'model', datasource: 'mongodb'});
|
|
161
121
|
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
162
|
-
const collection1 = A._getCollection('
|
|
163
|
-
const collection2 = A._getCollection('
|
|
122
|
+
const collection1 = A._getCollection('model');
|
|
123
|
+
const collection2 = A._getCollection('model');
|
|
164
124
|
expect(collection2).to.equal(collection1);
|
|
165
125
|
});
|
|
166
126
|
|
|
@@ -182,24 +142,6 @@ describe('MongodbAdapter', function () {
|
|
|
182
142
|
});
|
|
183
143
|
});
|
|
184
144
|
|
|
185
|
-
it('cuts off the "Model" suffix from the model name', async function () {
|
|
186
|
-
const schema = createSchema();
|
|
187
|
-
const modelNamesToCollectionNames = [
|
|
188
|
-
['camelCaseEntityModel', 'camelCaseEntities'],
|
|
189
|
-
['PascalCaseEntityModel', 'pascalCaseEntities'],
|
|
190
|
-
['snake_case_entity_model', 'snakeCaseEntities'],
|
|
191
|
-
['kebab-case-entity-model', 'kebabCaseEntities'],
|
|
192
|
-
['UPPER_SNAKE_CASE_ENTITY_MODEL', 'upperSnakeCaseEntities'],
|
|
193
|
-
['UPPER-KEBAB-CASE-ENTITY-MODEL', 'upperKebabCaseEntities'],
|
|
194
|
-
];
|
|
195
|
-
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
196
|
-
modelNamesToCollectionNames.forEach(tuple => {
|
|
197
|
-
schema.defineModel({name: tuple[0], datasource: 'mongodb'});
|
|
198
|
-
const collection = A._getCollection(tuple[0]);
|
|
199
|
-
expect(collection.collectionName).to.equal(tuple[1]);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
|
|
203
145
|
it('converts already pluralized model name to camel case', async function () {
|
|
204
146
|
const schema = createSchema();
|
|
205
147
|
const modelNamesToCollectionNames = [
|
|
@@ -218,24 +160,6 @@ describe('MongodbAdapter', function () {
|
|
|
218
160
|
});
|
|
219
161
|
});
|
|
220
162
|
|
|
221
|
-
it('converts already pluralized model name to camel case and cut off the "Model" suffix', async function () {
|
|
222
|
-
const schema = createSchema();
|
|
223
|
-
const modelNamesToCollectionNames = [
|
|
224
|
-
['camelCaseEntitiesModel', 'camelCaseEntities'],
|
|
225
|
-
['PascalCaseEntitiesModel', 'pascalCaseEntities'],
|
|
226
|
-
['snake_case_entities_model', 'snakeCaseEntities'],
|
|
227
|
-
['kebab-case-entities-model', 'kebabCaseEntities'],
|
|
228
|
-
['UPPER_SNAKE_CASE_ENTITIES_MODEL', 'upperSnakeCaseEntities'],
|
|
229
|
-
['UPPER-KEBAB-CASE-ENTITIES-MODEL', 'upperKebabCaseEntities'],
|
|
230
|
-
];
|
|
231
|
-
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
|
232
|
-
modelNamesToCollectionNames.forEach(tuple => {
|
|
233
|
-
schema.defineModel({name: tuple[0], datasource: 'mongodb'});
|
|
234
|
-
const collection = A._getCollection(tuple[0]);
|
|
235
|
-
expect(collection.collectionName).to.equal(tuple[1]);
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
|
|
239
163
|
it('uses the value from the "tableName" option if defined', async function () {
|
|
240
164
|
const schema = createSchema();
|
|
241
165
|
const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
|
package/src/utils/index.js
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import {pluralize} from './pluralize.js';
|
|
2
|
-
import {toCamelCase} from './to-camel-case.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Создает имя таблицы/коллекции по названию модели.
|
|
6
|
-
*
|
|
7
|
-
* @param {string} modelName
|
|
8
|
-
* @returns {string}
|
|
9
|
-
*/
|
|
10
|
-
export function modelNameToCollectionName(modelName) {
|
|
11
|
-
// приведение имени класса к стандартному camelCase
|
|
12
|
-
// "UserModel" -> "userModel", "Article" -> "article"
|
|
13
|
-
const ccName = toCamelCase(modelName);
|
|
14
|
-
// удаление постфикса "Model" с конца строки
|
|
15
|
-
// "userModel" -> "user", "myModel" -> "my"
|
|
16
|
-
const woModel = ccName.replace(/Model$/i, '');
|
|
17
|
-
// если базовое имя слишком короткое (как "my" для "myModel"),
|
|
18
|
-
// то используется имя, включающее постфикс "Model"
|
|
19
|
-
if (woModel.length <= 2) {
|
|
20
|
-
// pluralize('myModel') -> "myModels"
|
|
21
|
-
return pluralize(ccName);
|
|
22
|
-
}
|
|
23
|
-
// для обычных имен обрабатывается без суффикса
|
|
24
|
-
// pluralize('user') -> "users"
|
|
25
|
-
return pluralize(woModel);
|
|
26
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import {expect} from 'chai';
|
|
2
|
-
import {modelNameToCollectionName} from './model-name-to-collection-name.js';
|
|
3
|
-
|
|
4
|
-
describe('modelNameToCollectionName', function () {
|
|
5
|
-
it('should correctly pluralize and remove the "Model" suffix for standard names', function () {
|
|
6
|
-
expect(modelNameToCollectionName('userModel')).to.equal('users');
|
|
7
|
-
expect(modelNameToCollectionName('UserModel')).to.equal('users');
|
|
8
|
-
expect(modelNameToCollectionName('user_model')).to.equal('users');
|
|
9
|
-
expect(modelNameToCollectionName('USER_MODEL')).to.equal('users');
|
|
10
|
-
expect(modelNameToCollectionName('articleModel')).to.equal('articles');
|
|
11
|
-
expect(modelNameToCollectionName('ArticleModel')).to.equal('articles');
|
|
12
|
-
expect(modelNameToCollectionName('article_model')).to.equal('articles');
|
|
13
|
-
expect(modelNameToCollectionName('ARTICLE_MODEL')).to.equal('articles');
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('should just pluralize names that do not have the "Model" suffix', function () {
|
|
17
|
-
expect(modelNameToCollectionName('user')).to.equal('users');
|
|
18
|
-
expect(modelNameToCollectionName('User')).to.equal('users');
|
|
19
|
-
expect(modelNameToCollectionName('USER')).to.equal('users');
|
|
20
|
-
expect(modelNameToCollectionName('article')).to.equal('articles');
|
|
21
|
-
expect(modelNameToCollectionName('Article')).to.equal('articles');
|
|
22
|
-
expect(modelNameToCollectionName('ARTICLE')).to.equal('articles');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should correctly handle already pluralized names with the "Model" suffix', function () {
|
|
26
|
-
expect(modelNameToCollectionName('usersModel')).to.equal('users');
|
|
27
|
-
expect(modelNameToCollectionName('UsersModel')).to.equal('users');
|
|
28
|
-
expect(modelNameToCollectionName('users_model')).to.equal('users');
|
|
29
|
-
expect(modelNameToCollectionName('USERS_MODEL')).to.equal('users');
|
|
30
|
-
expect(modelNameToCollectionName('articlesModel')).to.equal('articles');
|
|
31
|
-
expect(modelNameToCollectionName('ArticlesModel')).to.equal('articles');
|
|
32
|
-
expect(modelNameToCollectionName('articles_model')).to.equal('articles');
|
|
33
|
-
expect(modelNameToCollectionName('ARTICLES_MODEL')).to.equal('articles');
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('should correctly handle already pluralized names', function () {
|
|
37
|
-
expect(modelNameToCollectionName('users')).to.equal('users');
|
|
38
|
-
expect(modelNameToCollectionName('Users')).to.equal('users');
|
|
39
|
-
expect(modelNameToCollectionName('USERS')).to.equal('users');
|
|
40
|
-
expect(modelNameToCollectionName('articles')).to.equal('articles');
|
|
41
|
-
expect(modelNameToCollectionName('Articles')).to.equal('articles');
|
|
42
|
-
expect(modelNameToCollectionName('ARTICLES')).to.equal('articles');
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should correctly handle different pluralization rules (like y -> ies)', function () {
|
|
46
|
-
expect(modelNameToCollectionName('companyModel')).to.equal('companies');
|
|
47
|
-
expect(modelNameToCollectionName('CompanyModel')).to.equal('companies');
|
|
48
|
-
expect(modelNameToCollectionName('company_model')).to.equal('companies');
|
|
49
|
-
expect(modelNameToCollectionName('COMPANY_MODEL')).to.equal('companies');
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('should correctly handle exceptions from pluralize (like status -> statuses)', function () {
|
|
53
|
-
expect(modelNameToCollectionName('statusModel')).to.equal('statuses');
|
|
54
|
-
expect(modelNameToCollectionName('StatusModel')).to.equal('statuses');
|
|
55
|
-
expect(modelNameToCollectionName('status_model')).to.equal('statuses');
|
|
56
|
-
expect(modelNameToCollectionName('STATUS_MODEL')).to.equal('statuses');
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('should handle edge cases where removing "Model" leaves a short word', function () {
|
|
60
|
-
expect(modelNameToCollectionName('myModel')).to.equal('myModels');
|
|
61
|
-
expect(modelNameToCollectionName('MyModel')).to.equal('myModels');
|
|
62
|
-
expect(modelNameToCollectionName('my_model')).to.equal('myModels');
|
|
63
|
-
expect(modelNameToCollectionName('MY_MODEL')).to.equal('myModels');
|
|
64
|
-
expect(modelNameToCollectionName('doModel')).to.equal('doModels');
|
|
65
|
-
expect(modelNameToCollectionName('DoModel')).to.equal('doModels');
|
|
66
|
-
expect(modelNameToCollectionName('do_model')).to.equal('doModels');
|
|
67
|
-
expect(modelNameToCollectionName('DO_MODEL')).to.equal('doModels');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('should remove the "Model" suffix case-insensitively', function () {
|
|
71
|
-
expect(modelNameToCollectionName('Usermodel')).to.equal('users');
|
|
72
|
-
expect(modelNameToCollectionName('USERMODEL')).to.equal('users');
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('should handle names that contain "Model" but not at the end', function () {
|
|
76
|
-
expect(modelNameToCollectionName('remodelAction')).to.equal(
|
|
77
|
-
'remodelActions',
|
|
78
|
-
);
|
|
79
|
-
expect(modelNameToCollectionName('RemodelAction')).to.equal(
|
|
80
|
-
'remodelActions',
|
|
81
|
-
);
|
|
82
|
-
expect(modelNameToCollectionName('remodel_action')).to.equal(
|
|
83
|
-
'remodelActions',
|
|
84
|
-
);
|
|
85
|
-
expect(modelNameToCollectionName('REMODEL_ACTION')).to.equal(
|
|
86
|
-
'remodelActions',
|
|
87
|
-
);
|
|
88
|
-
});
|
|
89
|
-
});
|