Browse Source

refactor: should not remove the model suffix

e22m4u 1 week ago
parent
commit
e9506e3680

+ 1 - 12
dist/cjs/index.cjs

@@ -991,17 +991,6 @@ function transformValuesDeep(value, transformer) {
 }
 }
 __name(transformValuesDeep, "transformValuesDeep");
 __name(transformValuesDeep, "transformValuesDeep");
 
 
-// src/utils/model-name-to-collection-name.js
-function modelNameToCollectionName(modelName) {
-  const ccName = toCamelCase2(modelName);
-  const woModel = ccName.replace(/Model$/i, "");
-  if (woModel.length <= 2) {
-    return pluralize(ccName);
-  }
-  return pluralize(woModel);
-}
-__name(modelNameToCollectionName, "modelNameToCollectionName");
-
 // src/mongodb-adapter.js
 // src/mongodb-adapter.js
 var MONGODB_OPTION_NAMES = [
 var MONGODB_OPTION_NAMES = [
   "ALPNProtocols",
   "ALPNProtocols",
@@ -1259,7 +1248,7 @@ var _MongodbAdapter = class _MongodbAdapter extends import_js_repository3.Adapte
   _getCollectionNameByModelName(modelName) {
   _getCollectionNameByModelName(modelName) {
     const modelDef = this.getService(import_js_repository3.DefinitionRegistry).getModel(modelName);
     const modelDef = this.getService(import_js_repository3.DefinitionRegistry).getModel(modelName);
     if (modelDef.tableName != null) return modelDef.tableName;
     if (modelDef.tableName != null) return modelDef.tableName;
-    return modelNameToCollectionName(modelDef.name);
+    return pluralize(toCamelCase2(modelDef.name));
   }
   }
   /**
   /**
    * Get collection.
    * Get collection.

+ 7 - 0
jsconfig.json

@@ -0,0 +1,7 @@
+{
+  "compilerOptions": {
+    "target": "es2022",
+    "module": "NodeNext",
+    "moduleResolution": "NodeNext"
+  }
+}

+ 1 - 1
package.json

@@ -42,7 +42,7 @@
     "mongodb": "6.20.0"
     "mongodb": "6.20.0"
   },
   },
   "peerDependencies": {
   "peerDependencies": {
-    "@e22m4u/js-repository": "~0.6.3"
+    "@e22m4u/js-repository": "~0.7.0"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@commitlint/cli": "~20.1.0",
     "@commitlint/cli": "~20.1.0",

+ 7 - 2
src/mongodb-adapter.js

@@ -17,11 +17,12 @@ import {
 } from '@e22m4u/js-repository';
 } from '@e22m4u/js-repository';
 
 
 import {
 import {
+  pluralize,
   isIsoDate,
   isIsoDate,
   isObjectId,
   isObjectId,
+  toCamelCase,
   createMongodbUrl,
   createMongodbUrl,
   transformValuesDeep,
   transformValuesDeep,
-  modelNameToCollectionName,
 } from './utils/index.js';
 } from './utils/index.js';
 
 
 /**
 /**
@@ -314,7 +315,11 @@ export class MongodbAdapter extends Adapter {
   _getCollectionNameByModelName(modelName) {
   _getCollectionNameByModelName(modelName) {
     const modelDef = this.getService(DefinitionRegistry).getModel(modelName);
     const modelDef = this.getService(DefinitionRegistry).getModel(modelName);
     if (modelDef.tableName != null) return modelDef.tableName;
     if (modelDef.tableName != null) return modelDef.tableName;
-    return modelNameToCollectionName(modelDef.name);
+    // если имя коллекции не определено явно (опция "tableName"),
+    // то выполняется приведение имени модели к стандартному camelCase
+    // во множественном числе
+    // "Article" -> "articles", "AccessToken" -> "accessTokens"
+    return pluralize(toCamelCase(modelDef.name));
   }
   }
 
 
   /**
   /**

+ 12 - 88
src/mongodb-adapter.spec.js

@@ -62,26 +62,6 @@ describe('MongodbAdapter', function () {
       );
       );
     });
     });
 
 
-    // prettier-ignore
-    it('cuts off the "Model" suffix from the model name', async function () {
-      const schema = createSchema();
-      const modelNamesToCollectionNames = [
-        ['camelCaseEntityModel', 'camelCaseEntities'],
-        ['PascalCaseEntityModel', 'pascalCaseEntities'],
-        ['snake_case_entity_model', 'snakeCaseEntities'],
-        ['kebab-case-entity-model', 'kebabCaseEntities'],
-        ['UPPER_SNAKE_CASE_ENTITY_MODEL', 'upperSnakeCaseEntities'],
-        ['UPPER-KEBAB-CASE-ENTITY-MODEL', 'upperKebabCaseEntities'],
-      ];
-      modelNamesToCollectionNames.forEach(tuple =>
-        schema.defineModel({name: tuple[0], datasource: 'mongodb'}),
-      );
-      const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      modelNamesToCollectionNames.forEach(tuple =>
-        expect(A._getCollectionNameByModelName(tuple[0])).to.be.eq(tuple[1]),
-      );
-    });
-
     it('converts already pluralized model name to camel case', async function () {
     it('converts already pluralized model name to camel case', async function () {
       const schema = createSchema();
       const schema = createSchema();
       const modelNamesToCollectionNames = [
       const modelNamesToCollectionNames = [
@@ -101,26 +81,6 @@ describe('MongodbAdapter', function () {
       );
       );
     });
     });
 
 
-    // prettier-ignore
-    it('converts already pluralized model name to camel case and cut off the "Model" suffix', async function () {
-      const schema = createSchema();
-      const modelNamesToCollectionNames = [
-        ['camelCaseEntitiesModel', 'camelCaseEntities'],
-        ['PascalCaseEntitiesModel', 'pascalCaseEntities'],
-        ['snake_case_entities_model', 'snakeCaseEntities'],
-        ['kebab-case-entities-model', 'kebabCaseEntities'],
-        ['UPPER_SNAKE_CASE_ENTITIES_MODEL', 'upperSnakeCaseEntities'],
-        ['UPPER-KEBAB-CASE-ENTITIES-MODEL', 'upperKebabCaseEntities'],
-      ];
-      modelNamesToCollectionNames.forEach(tuple =>
-        schema.defineModel({name: tuple[0], datasource: 'mongodb'}),
-      );
-      const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      modelNamesToCollectionNames.forEach(tuple =>
-        expect(A._getCollectionNameByModelName(tuple[0])).to.be.eq(tuple[1]),
-      );
-    });
-
     it('returns the value from the "tableName" option if defined', async function () {
     it('returns the value from the "tableName" option if defined', async function () {
       const schema = createSchema();
       const schema = createSchema();
       schema.defineModel({
       schema.defineModel({
@@ -136,31 +96,31 @@ describe('MongodbAdapter', function () {
   describe('_getCollection', function () {
   describe('_getCollection', function () {
     it('should create and return a new collection object on the first call', async function () {
     it('should create and return a new collection object on the first call', async function () {
       const schema = createSchema();
       const schema = createSchema();
-      schema.defineModel({name: 'myTestModel', datasource: 'mongodb'});
+      schema.defineModel({name: 'model', datasource: 'mongodb'});
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      expect(A._collections.has('myTestModel')).to.be.false;
-      const collection = A._getCollection('myTestModel');
+      expect(A._collections.has('model')).to.be.false;
+      const collection = A._getCollection('model');
       expect(collection).to.exist;
       expect(collection).to.exist;
-      expect(collection.collectionName).to.equal('myTests');
+      expect(collection.collectionName).to.equal('models');
       expect(collection.dbName).to.equal(CONFIG.database);
       expect(collection.dbName).to.equal(CONFIG.database);
     });
     });
 
 
     it('should cache the collection object after the first call', async function () {
     it('should cache the collection object after the first call', async function () {
       const schema = createSchema();
       const schema = createSchema();
-      schema.defineModel({name: 'myTestModel', datasource: 'mongodb'});
+      schema.defineModel({name: 'model', datasource: 'mongodb'});
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      expect(A._collections.has('myTestModel')).to.be.false;
-      A._getCollection('myTestModel');
-      expect(A._collections.has('myTestModel')).to.be.true;
-      expect(A._collections.get('myTestModel')).to.exist;
+      expect(A._collections.has('model')).to.be.false;
+      A._getCollection('model');
+      expect(A._collections.has('model')).to.be.true;
+      expect(A._collections.get('model')).to.exist;
     });
     });
 
 
     it('should return the cached collection instance on subsequent calls', async function () {
     it('should return the cached collection instance on subsequent calls', async function () {
       const schema = createSchema();
       const schema = createSchema();
-      schema.defineModel({name: 'myTestModel', datasource: 'mongodb'});
+      schema.defineModel({name: 'model', datasource: 'mongodb'});
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      const collection1 = A._getCollection('myTestModel');
-      const collection2 = A._getCollection('myTestModel');
+      const collection1 = A._getCollection('model');
+      const collection2 = A._getCollection('model');
       expect(collection2).to.equal(collection1);
       expect(collection2).to.equal(collection1);
     });
     });
 
 
@@ -182,24 +142,6 @@ describe('MongodbAdapter', function () {
       });
       });
     });
     });
 
 
-    it('cuts off the "Model" suffix from the model name', async function () {
-      const schema = createSchema();
-      const modelNamesToCollectionNames = [
-        ['camelCaseEntityModel', 'camelCaseEntities'],
-        ['PascalCaseEntityModel', 'pascalCaseEntities'],
-        ['snake_case_entity_model', 'snakeCaseEntities'],
-        ['kebab-case-entity-model', 'kebabCaseEntities'],
-        ['UPPER_SNAKE_CASE_ENTITY_MODEL', 'upperSnakeCaseEntities'],
-        ['UPPER-KEBAB-CASE-ENTITY-MODEL', 'upperKebabCaseEntities'],
-      ];
-      const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      modelNamesToCollectionNames.forEach(tuple => {
-        schema.defineModel({name: tuple[0], datasource: 'mongodb'});
-        const collection = A._getCollection(tuple[0]);
-        expect(collection.collectionName).to.equal(tuple[1]);
-      });
-    });
-
     it('converts already pluralized model name to camel case', async function () {
     it('converts already pluralized model name to camel case', async function () {
       const schema = createSchema();
       const schema = createSchema();
       const modelNamesToCollectionNames = [
       const modelNamesToCollectionNames = [
@@ -218,24 +160,6 @@ describe('MongodbAdapter', function () {
       });
       });
     });
     });
 
 
-    it('converts already pluralized model name to camel case and cut off the "Model" suffix', async function () {
-      const schema = createSchema();
-      const modelNamesToCollectionNames = [
-        ['camelCaseEntitiesModel', 'camelCaseEntities'],
-        ['PascalCaseEntitiesModel', 'pascalCaseEntities'],
-        ['snake_case_entities_model', 'snakeCaseEntities'],
-        ['kebab-case-entities-model', 'kebabCaseEntities'],
-        ['UPPER_SNAKE_CASE_ENTITIES_MODEL', 'upperSnakeCaseEntities'],
-        ['UPPER-KEBAB-CASE-ENTITIES-MODEL', 'upperKebabCaseEntities'],
-      ];
-      const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
-      modelNamesToCollectionNames.forEach(tuple => {
-        schema.defineModel({name: tuple[0], datasource: 'mongodb'});
-        const collection = A._getCollection(tuple[0]);
-        expect(collection.collectionName).to.equal(tuple[1]);
-      });
-    });
-
     it('uses the value from the "tableName" option if defined', async function () {
     it('uses the value from the "tableName" option if defined', async function () {
       const schema = createSchema();
       const schema = createSchema();
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');
       const A = await schema.getService(AdapterRegistry).getAdapter('mongodb');

+ 0 - 1
src/utils/index.js

@@ -4,4 +4,3 @@ export * from './is-object-id.js';
 export * from './to-camel-case.js';
 export * from './to-camel-case.js';
 export * from './create-mongodb-url.js';
 export * from './create-mongodb-url.js';
 export * from './transform-values-deep.js';
 export * from './transform-values-deep.js';
-export * from './model-name-to-collection-name.js';

+ 0 - 26
src/utils/model-name-to-collection-name.js

@@ -1,26 +0,0 @@
-import {pluralize} from './pluralize.js';
-import {toCamelCase} from './to-camel-case.js';
-
-/**
- * Создает имя таблицы/коллекции по названию модели.
- *
- * @param {string} modelName
- * @returns {string}
- */
-export function modelNameToCollectionName(modelName) {
-  // приведение имени класса к стандартному camelCase
-  // "UserModel" -> "userModel", "Article" -> "article"
-  const ccName = toCamelCase(modelName);
-  // удаление постфикса "Model" с конца строки
-  // "userModel" -> "user", "myModel" -> "my"
-  const woModel = ccName.replace(/Model$/i, '');
-  // если базовое имя слишком короткое (как "my" для "myModel"),
-  // то используется имя, включающее постфикс "Model"
-  if (woModel.length <= 2) {
-    // pluralize('myModel') -> "myModels"
-    return pluralize(ccName);
-  }
-  // для обычных имен обрабатывается без суффикса
-  // pluralize('user') -> "users"
-  return pluralize(woModel);
-}

+ 0 - 89
src/utils/model-name-to-collection-name.spec.js

@@ -1,89 +0,0 @@
-import {expect} from 'chai';
-import {modelNameToCollectionName} from './model-name-to-collection-name.js';
-
-describe('modelNameToCollectionName', function () {
-  it('should correctly pluralize and remove the "Model" suffix for standard names', function () {
-    expect(modelNameToCollectionName('userModel')).to.equal('users');
-    expect(modelNameToCollectionName('UserModel')).to.equal('users');
-    expect(modelNameToCollectionName('user_model')).to.equal('users');
-    expect(modelNameToCollectionName('USER_MODEL')).to.equal('users');
-    expect(modelNameToCollectionName('articleModel')).to.equal('articles');
-    expect(modelNameToCollectionName('ArticleModel')).to.equal('articles');
-    expect(modelNameToCollectionName('article_model')).to.equal('articles');
-    expect(modelNameToCollectionName('ARTICLE_MODEL')).to.equal('articles');
-  });
-
-  it('should just pluralize names that do not have the "Model" suffix', function () {
-    expect(modelNameToCollectionName('user')).to.equal('users');
-    expect(modelNameToCollectionName('User')).to.equal('users');
-    expect(modelNameToCollectionName('USER')).to.equal('users');
-    expect(modelNameToCollectionName('article')).to.equal('articles');
-    expect(modelNameToCollectionName('Article')).to.equal('articles');
-    expect(modelNameToCollectionName('ARTICLE')).to.equal('articles');
-  });
-
-  it('should correctly handle already pluralized names with the "Model" suffix', function () {
-    expect(modelNameToCollectionName('usersModel')).to.equal('users');
-    expect(modelNameToCollectionName('UsersModel')).to.equal('users');
-    expect(modelNameToCollectionName('users_model')).to.equal('users');
-    expect(modelNameToCollectionName('USERS_MODEL')).to.equal('users');
-    expect(modelNameToCollectionName('articlesModel')).to.equal('articles');
-    expect(modelNameToCollectionName('ArticlesModel')).to.equal('articles');
-    expect(modelNameToCollectionName('articles_model')).to.equal('articles');
-    expect(modelNameToCollectionName('ARTICLES_MODEL')).to.equal('articles');
-  });
-
-  it('should correctly handle already pluralized names', function () {
-    expect(modelNameToCollectionName('users')).to.equal('users');
-    expect(modelNameToCollectionName('Users')).to.equal('users');
-    expect(modelNameToCollectionName('USERS')).to.equal('users');
-    expect(modelNameToCollectionName('articles')).to.equal('articles');
-    expect(modelNameToCollectionName('Articles')).to.equal('articles');
-    expect(modelNameToCollectionName('ARTICLES')).to.equal('articles');
-  });
-
-  it('should correctly handle different pluralization rules (like y -> ies)', function () {
-    expect(modelNameToCollectionName('companyModel')).to.equal('companies');
-    expect(modelNameToCollectionName('CompanyModel')).to.equal('companies');
-    expect(modelNameToCollectionName('company_model')).to.equal('companies');
-    expect(modelNameToCollectionName('COMPANY_MODEL')).to.equal('companies');
-  });
-
-  it('should correctly handle exceptions from pluralize (like status -> statuses)', function () {
-    expect(modelNameToCollectionName('statusModel')).to.equal('statuses');
-    expect(modelNameToCollectionName('StatusModel')).to.equal('statuses');
-    expect(modelNameToCollectionName('status_model')).to.equal('statuses');
-    expect(modelNameToCollectionName('STATUS_MODEL')).to.equal('statuses');
-  });
-
-  it('should handle edge cases where removing "Model" leaves a short word', function () {
-    expect(modelNameToCollectionName('myModel')).to.equal('myModels');
-    expect(modelNameToCollectionName('MyModel')).to.equal('myModels');
-    expect(modelNameToCollectionName('my_model')).to.equal('myModels');
-    expect(modelNameToCollectionName('MY_MODEL')).to.equal('myModels');
-    expect(modelNameToCollectionName('doModel')).to.equal('doModels');
-    expect(modelNameToCollectionName('DoModel')).to.equal('doModels');
-    expect(modelNameToCollectionName('do_model')).to.equal('doModels');
-    expect(modelNameToCollectionName('DO_MODEL')).to.equal('doModels');
-  });
-
-  it('should remove the "Model" suffix case-insensitively', function () {
-    expect(modelNameToCollectionName('Usermodel')).to.equal('users');
-    expect(modelNameToCollectionName('USERMODEL')).to.equal('users');
-  });
-
-  it('should handle names that contain "Model" but not at the end', function () {
-    expect(modelNameToCollectionName('remodelAction')).to.equal(
-      'remodelActions',
-    );
-    expect(modelNameToCollectionName('RemodelAction')).to.equal(
-      'remodelActions',
-    );
-    expect(modelNameToCollectionName('remodel_action')).to.equal(
-      'remodelActions',
-    );
-    expect(modelNameToCollectionName('REMODEL_ACTION')).to.equal(
-      'remodelActions',
-    );
-  });
-});