@e22m4u/js-repository 0.8.9 → 0.8.10

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/README.md CHANGED
@@ -3,18 +3,21 @@
3
3
  ![npm version](https://badge.fury.io/js/@e22m4u%2Fjs-repository.svg)
4
4
  ![license](https://img.shields.io/badge/license-mit-blue.svg)
5
5
 
6
- Реализация паттерна «Репозиторий» для работы с базами данных.
6
+ ORM/ODM библиотека для Node.js, реализующая слой управления данными на основе
7
+ паттерна «Репозиторий». Унифицирует интерфейс различных баз данных, фильтрацию
8
+ и работу со связанными документами независимо от источника.
7
9
 
8
10
  ## Содержание
9
11
 
10
12
  - [Установка](#установка)
11
13
  - [Импорт](#импорт)
12
14
  - [Описание](#описание)
13
- - [Пример](#пример)
15
+ - [Терминология](#терминология)
16
+ - [Базовый пример](#пример)
14
17
  - [Схема баз данных](#схема-баз-данных)
15
18
  - [Источник данных](#источник-данных)
16
19
  - [Модель](#модель)
17
- - [Свойства](#свойства)
20
+ - [Свойства](#свойства)
18
21
  - [Репозиторий](#репозиторий)
19
22
  - [create](#repositorycreate)
20
23
  - [replaceById](#repositoryreplacebyid)
@@ -50,10 +53,15 @@ npm install @e22m4u/js-repository
50
53
 
51
54
  Опционально устанавливается нужный адаптер.
52
55
 
53
- | адаптер | описание | установка |
54
- |-----------|-------------------------------------------------|----------------------------------------------------------------------------|
55
- | `memory` | Виртуальная база в памяти процесса | *встроенный* |
56
- | `mongodb` | MongoDB - документо-ориентированная база данных | [npm](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter) |
56
+ | адаптер | описание | |
57
+ |-----------|---------------------------------------------------|------------------------------------------------------------------------------------|
58
+ | `memory` | Виртуальная база данных в памяти процесса Node.js | *встроенный* |
59
+ | `mongodb` | MongoDB - документо-ориентированная база данных | [*установка*](https://www.npmjs.com/package/@e22m4u/js-repository-mongodb-adapter) |
60
+
61
+ **Утилиты**
62
+
63
+ - [@e22m4u/js-repository-json-schema](https://www.npmjs.com/package/@e22m4u/js-repository-json-schema)
64
+ *Генератор JSON Schema для моделей репозитория*
57
65
 
58
66
  ## Импорт
59
67
 
@@ -122,11 +130,49 @@ flowchart TD
122
130
  G-->K
123
131
  ```
124
132
 
133
+ ### Терминология
134
+
135
+ Описание ключевых понятий.
136
+
137
+ - **Схема баз данных** (*DatabaseSchema*) - хранит определения источников
138
+ данных и моделей. Связывает модели с источниками данных и предоставляет
139
+ доступ к экземплярам репозитория.
140
+
141
+ - **Источник данных** (*Datasource*) - именованная конфигурация подключения
142
+ к базе данных. Содержит название используемого адаптера и параметры соединения.
143
+
144
+ - **Адаптер** (*Adapter*) - низкоуровневая реализация для взаимодействия с
145
+ конкретной СУБД. Обеспечивает совместимость хранилища с унифицированным
146
+ интерфейсом репозитория.
147
+
148
+ - **Коллекция** (*Collection*) - физическая область хранения записей или
149
+ документов в базе данных, ассоциированная с конкретной моделью. В контексте
150
+ реляционных баз данных является эквивалентом таблицы.
151
+
152
+ - **Модель** (*Model*) - структурное описание коллекции базы данных. Содержит
153
+ определения свойств документа и отношений с другими моделями.
154
+
155
+ - **Свойство** (*Property*) - описание отдельного поля модели. Определяет тип
156
+ данных, значение по умолчанию, обязательность наличия и правила проверки
157
+ на уникальность.
158
+
159
+ - **Связь** (*Relation*) - абстракция отношений между моделями. Поддерживает
160
+ классические отношения и полиморфный режим динамического определения
161
+ целевой модели через поле дискриминатора.
162
+
163
+ - **Дискриминатор** (*Discriminator*) - свойство документа в рамках полиморфной
164
+ связи. Хранит строковое название целевой модели, что позволяет динамически
165
+ определять связанную коллекцию при выполнении запросов.
166
+
167
+ - **Репозиторий** (*Repository*) - абстрактный фасад для работы с данными
168
+ конкретной модели. Изолирует логику приложения от деталей реализации
169
+ базы данных. Выполняет операции записи, поиска, обновления и удаления.
170
+
125
171
  ## Пример
126
172
 
127
- Пример демонстрирует создание экземпляра схемы, объявление источника данных
128
- и модели `country`. После чего, с помощью репозитория данной модели, в коллекцию
129
- добавляется новый документ (страна), который выводится в консоль.
173
+ Пример демонстрирует создание экземпляра `DatabaseSchema`, объявление источника
174
+ данных `myDb` и модели `country`. Далее в коллекцию добавляется новый документ,
175
+ содержимого которого выводится в консоль.
130
176
 
131
177
  ```
132
178
  Страна (country)
@@ -351,8 +397,8 @@ dbs.defineDatasource({
351
397
  - `base: string` название наследуемой модели;
352
398
  - `tableName: string` название коллекции в базе;
353
399
  - `datasource: string` выбранный источник данных;
354
- - `properties: object` определения свойств (см. [Свойства](#Свойства));
355
- - `relations: object` определения связей (см. [Связи](#Связи));
400
+ - `properties: object` определения свойств (см. [Свойства](#свойства));
401
+ - `relations: object` определения связей (см. [Связи](#связи));
356
402
 
357
403
  **Примеры**
358
404
 
@@ -368,13 +414,32 @@ dbs.defineModel({
368
414
  });
369
415
  ```
370
416
 
371
- ## Свойства
417
+ ### Свойства
372
418
 
373
419
  Параметр `properties` находится в определении модели и принимает объект, ключи
374
420
  которого являются свойствами этой модели, а значением тип свойства или объект
375
- с дополнительными параметрами.
421
+ с дополнительными параметрами. Параметры свойства используется репозиторием
422
+ для проверки документов перед сохранением.
376
423
 
377
- **Тип данных**
424
+ ```js
425
+ dbs.defineModel({
426
+ name: 'user',
427
+ properties: {
428
+ // краткая форма (только тип)
429
+ name: DataType.STRING,
430
+ // расширенное определение (см. далее)
431
+ email: {
432
+ type: DataType.STRING,
433
+ unique: PropertyUniqueness.SPARSE,
434
+ default: '',
435
+ },
436
+ },
437
+ });
438
+ ```
439
+
440
+ *i. В контексте реляционных баз данных свойства отражают колонки таблицы.*
441
+
442
+ **Типы данных**
378
443
 
379
444
  - `DataType.ANY` разрешено любое значение;
380
445
  - `DataType.STRING` только значение типа `string`;
@@ -383,7 +448,12 @@ dbs.defineModel({
383
448
  - `DataType.ARRAY` только значение типа `array`;
384
449
  - `DataType.OBJECT` только значение типа `object`;
385
450
 
386
- **Параметры**
451
+ **Параметры свойства**
452
+
453
+ Объект с параметрами (расширенное определение) позволяет задавать значения
454
+ по умолчанию, правила проверки на уникальность и обязательность наличия данных.
455
+ Для массивов и вложенных объектов предусмотрено указание типа элемента
456
+ и название модели.
387
457
 
388
458
  - `type: string` тип допустимого значения (обязательно);
389
459
  - `itemType?: string` тип элемента массива (для `type: 'array'`);
@@ -9,8 +9,13 @@ var __glob = (map) => (path) => {
9
9
  if (fn) return fn();
10
10
  throw new Error("Module not found in bundle: " + path);
11
11
  };
12
- var __esm = (fn, res) => function __init() {
13
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
12
+ var __esm = (fn, res, err) => function __init() {
13
+ if (err) throw err[0];
14
+ try {
15
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
16
+ } catch (e) {
17
+ throw err = [e], e;
18
+ }
14
19
  };
15
20
  var __export = (target, all) => {
16
21
  for (var name in all)
package/eslint.config.js CHANGED
@@ -2,7 +2,6 @@ import globals from 'globals';
2
2
  import eslintJs from '@eslint/js';
3
3
  import eslintJsdocPlugin from 'eslint-plugin-jsdoc';
4
4
  import eslintMochaPlugin from 'eslint-plugin-mocha';
5
- import eslintImportPlugin from 'eslint-plugin-import';
6
5
  import eslintPrettierConfig from 'eslint-config-prettier';
7
6
  import eslintChaiExpectPlugin from 'eslint-plugin-chai-expect';
8
7
 
@@ -18,19 +17,16 @@ export default [{
18
17
  plugins: {
19
18
  'jsdoc': eslintJsdocPlugin,
20
19
  'mocha': eslintMochaPlugin,
21
- 'import': eslintImportPlugin,
22
20
  'chai-expect': eslintChaiExpectPlugin,
23
21
  },
24
22
  rules: {
25
23
  ...eslintJs.configs.recommended.rules,
26
24
  ...eslintPrettierConfig.rules,
27
- ...eslintImportPlugin.flatConfigs.recommended.rules,
28
25
  ...eslintMochaPlugin.configs.recommended.rules,
29
26
  ...eslintChaiExpectPlugin.configs['recommended-flat'].rules,
30
27
  ...eslintJsdocPlugin.configs['flat/recommended-error'].rules,
31
28
  'curly': 'error',
32
29
  'no-duplicate-imports': 'error',
33
- 'import/export': 0,
34
30
  'jsdoc/reject-any-type': 0,
35
31
  'jsdoc/reject-function-type': 0,
36
32
  'jsdoc/require-param-description': 0,
package/package.json CHANGED
@@ -1,21 +1,22 @@
1
1
  {
2
2
  "name": "@e22m4u/js-repository",
3
- "version": "0.8.9",
4
- "description": "Реализация репозитория для работы с базами данных",
3
+ "version": "0.8.10",
4
+ "description": "ORM/ODM библиотека для работы с базами данных",
5
5
  "author": "Mikhail Evstropov <e22m4u@yandex.ru>",
6
6
  "license": "MIT",
7
7
  "keywords": [
8
- "ORM",
9
- "ODM",
8
+ "js-repository",
9
+ "orm",
10
+ "odm",
10
11
  "database",
11
12
  "datasource",
12
13
  "repository",
13
14
  "relations"
14
15
  ],
15
- "homepage": "https://gitverse.ru/e22m4u/js-repository",
16
+ "homepage": "https://github.com/e22m4u/js-repository",
16
17
  "repository": {
17
18
  "type": "git",
18
- "url": "git+https://gitverse.ru/e22m4u/js-repository.git"
19
+ "url": "git+https://github.com/e22m4u/js-repository.git"
19
20
  },
20
21
  "type": "module",
21
22
  "types": "./src/index.d.ts",
@@ -43,27 +44,26 @@
43
44
  "@e22m4u/js-service": "~0.6.2"
44
45
  },
45
46
  "devDependencies": {
46
- "@commitlint/cli": "~20.5.0",
47
- "@commitlint/config-conventional": "~20.5.0",
47
+ "@commitlint/cli": "~21.2.1",
48
+ "@commitlint/config-conventional": "~21.2.0",
48
49
  "@e22m4u/js-spy": "~0.3.6",
49
- "@eslint/js": "~9.39.2",
50
+ "@eslint/js": "~10.0.1",
50
51
  "@types/chai": "~5.2.3",
51
52
  "@types/chai-as-promised": "~8.0.2",
52
53
  "@types/mocha": "~10.0.10",
53
- "c8": "~11.0.0",
54
+ "c8": "~12.0.0",
54
55
  "chai": "~6.2.2",
55
56
  "chai-as-promised": "~8.0.2",
56
- "esbuild": "~0.27.4",
57
- "eslint": "~9.39.2",
57
+ "esbuild": "~0.28.1",
58
+ "eslint": "~10.7.0",
58
59
  "eslint-config-prettier": "~10.1.8",
59
- "eslint-plugin-chai-expect": "~4.0.0",
60
- "eslint-plugin-import": "~2.32.0",
61
- "eslint-plugin-jsdoc": "~62.8.0",
62
- "eslint-plugin-mocha": "~11.2.0",
60
+ "eslint-plugin-chai-expect": "~4.1.0",
61
+ "eslint-plugin-jsdoc": "~63.2.0",
62
+ "eslint-plugin-mocha": "~11.3.0",
63
63
  "husky": "~9.1.7",
64
- "mocha": "~11.7.5",
65
- "prettier": "~3.8.1",
64
+ "mocha": "~11.7.6",
65
+ "prettier": "~3.9.6",
66
66
  "rimraf": "~6.1.3",
67
- "typescript": "~5.9.3"
67
+ "typescript": "~7.0.2"
68
68
  }
69
69
  }