@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.
@@ -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 modelNameToCollectionName(modelDef.name);
1251
+ return pluralize(toCamelCase2(modelDef.name));
1263
1252
  }
1264
1253
  /**
1265
1254
  * Get collection.
package/jsconfig.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext"
6
+ }
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e22m4u/js-repository-mongodb-adapter",
3
- "version": "0.7.2",
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.6.3"
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.0",
52
+ "chai": "~6.2.1",
53
53
  "chai-as-promised": "~8.0.2",
54
54
  "dotenv": "~17.2.3",
55
- "esbuild": "~0.25.12",
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.0"
64
+ "rimraf": "~6.1.2"
65
65
  }
66
66
  }
@@ -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
- return modelNameToCollectionName(modelDef.name);
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: 'myTestModel', datasource: 'mongodb'});
99
+ schema.defineModel({name: 'model', datasource: 'mongodb'});
140
100
  const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
141
- expect(A._collections.has('myTestModel')).to.be.false;
142
- const collection = A._getCollection('myTestModel');
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('myTests');
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: 'myTestModel', datasource: 'mongodb'});
110
+ schema.defineModel({name: 'model', datasource: 'mongodb'});
151
111
  const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
152
- expect(A._collections.has('myTestModel')).to.be.false;
153
- A._getCollection('myTestModel');
154
- expect(A._collections.has('myTestModel')).to.be.true;
155
- expect(A._collections.get('myTestModel')).to.exist;
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: 'myTestModel', datasource: 'mongodb'});
120
+ schema.defineModel({name: 'model', datasource: 'mongodb'});
161
121
  const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
162
- const collection1 = A._getCollection('myTestModel');
163
- const collection2 = A._getCollection('myTestModel');
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');
@@ -4,4 +4,3 @@ export * from './is-object-id.js';
4
4
  export * from './to-camel-case.js';
5
5
  export * from './create-mongodb-url.js';
6
6
  export * from './transform-values-deep.js';
7
- export * from './model-name-to-collection-name.js';
@@ -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
- });