@e22m4u/js-repository 0.0.32 → 0.0.34

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.
Files changed (33) hide show
  1. package/package.json +1 -1
  2. package/src/adapter/adapter-loader.js +1 -1
  3. package/src/adapter/adapter-loader.spec.js +1 -1
  4. package/src/adapter/adapter.d.ts +11 -7
  5. package/src/adapter/builtin/memory-adapter.d.ts +11 -7
  6. package/src/adapter/decorator/data-sanitizing-decorator.js +1 -1
  7. package/src/adapter/decorator/data-validation-decorator.js +1 -1
  8. package/src/adapter/decorator/default-values-decorator.js +1 -1
  9. package/src/adapter/decorator/fields-filtering-decorator.js +1 -1
  10. package/src/adapter/decorator/inclusion-decorator.js +1 -1
  11. package/src/definition/model/model-data-sanitizer.js +2 -2
  12. package/src/definition/model/model-data-validator.js +1 -1
  13. package/src/definition/model/model-data-validator.spec.js +1 -1
  14. package/src/definition/model/model-definition-utils.js +1 -1
  15. package/src/definition/model/model-definition-utils.spec.js +1 -1
  16. package/src/filter/fields-clause-tool.d.ts +4 -4
  17. package/src/filter/fields-clause-tool.js +32 -21
  18. package/src/filter/fields-clause-tool.spec.js +479 -100
  19. package/src/filter/{filter.d.ts → filter-clause.d.ts} +10 -10
  20. package/src/filter/include-clause-tool.d.ts +7 -5
  21. package/src/filter/index.d.ts +1 -1
  22. package/src/filter/operator-clause-tool.js +1 -1
  23. package/src/filter/operator-clause-tool.spec.js +1 -1
  24. package/src/filter/order-clause-tool.d.ts +1 -1
  25. package/src/filter/order-clause-tool.js +20 -17
  26. package/src/filter/order-clause-tool.spec.js +621 -362
  27. package/src/filter/slice-clause-tool.js +1 -1
  28. package/src/filter/where-clause-tool.d.ts +1 -1
  29. package/src/relations/belongs-to-resolver.d.ts +3 -3
  30. package/src/relations/has-many-resolver.d.ts +4 -4
  31. package/src/relations/has-one-resolver.d.ts +4 -4
  32. package/src/relations/references-many-resolver.d.ts +2 -2
  33. package/src/repository/repository.d.ts +9 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e22m4u/js-repository",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "description": "Абстракция для работы с базами данных для Node.js",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -16,7 +16,7 @@ export class AdapterLoader extends Service {
16
16
  async loadByName(adapterName, settings = undefined) {
17
17
  if (!adapterName || typeof adapterName !== 'string')
18
18
  throw new InvalidArgumentError(
19
- 'The adapter name must be a non-empty String, but %v given.',
19
+ 'The adapter name should be a non-empty String, but %v given.',
20
20
  adapterName,
21
21
  );
22
22
  let adapterCtor;
@@ -9,7 +9,7 @@ describe('AdapterLoader', function () {
9
9
  it('requires an adapter name as a non-empty string', async function () {
10
10
  const promise = S.loadByName('');
11
11
  await expect(promise).to.be.rejectedWith(
12
- 'The adapter name must be a non-empty String, but "" given.',
12
+ 'The adapter name should be a non-empty String, but "" given.',
13
13
  );
14
14
  });
15
15
 
@@ -1,10 +1,10 @@
1
1
  import {ModelId} from '../types.js';
2
2
  import {AnyObject} from '../types.js';
3
3
  import {ModelData} from '../types.js';
4
- import {Filter} from '../filter/index.js';
5
4
  import {Service} from '@e22m4u/js-service';
6
- import {ItemFilter} from '../filter/index.js';
7
5
  import {WhereClause} from '../filter/index.js';
6
+ import {FilterClause} from '../filter/index.js';
7
+ import {ItemFilterClause} from '../filter/index.js';
8
8
  import {ServiceContainer} from '@e22m4u/js-service';
9
9
 
10
10
  /**
@@ -34,7 +34,7 @@ export declare class Adapter extends Service {
34
34
  create(
35
35
  modelName: string,
36
36
  modelData: ModelData,
37
- filter?: ItemFilter,
37
+ filter?: ItemFilterClause,
38
38
  ): Promise<ModelData>;
39
39
 
40
40
  /**
@@ -49,7 +49,7 @@ export declare class Adapter extends Service {
49
49
  modelName: string,
50
50
  id: ModelId,
51
51
  modelData: ModelData,
52
- filter?: ItemFilter,
52
+ filter?: ItemFilterClause,
53
53
  ): Promise<ModelData>;
54
54
 
55
55
  /**
@@ -64,7 +64,7 @@ export declare class Adapter extends Service {
64
64
  modelName: string,
65
65
  id: ModelId,
66
66
  modelData: ModelData,
67
- filter?: ItemFilter,
67
+ filter?: ItemFilterClause,
68
68
  ): Promise<ModelData>;
69
69
 
70
70
  /**
@@ -73,7 +73,7 @@ export declare class Adapter extends Service {
73
73
  * @param modelName
74
74
  * @param filter
75
75
  */
76
- find(modelName: string, filter?: Filter): Promise<ModelData[]>;
76
+ find(modelName: string, filter?: FilterClause): Promise<ModelData[]>;
77
77
 
78
78
  /**
79
79
  * Find by id.
@@ -82,7 +82,11 @@ export declare class Adapter extends Service {
82
82
  * @param id
83
83
  * @param filter
84
84
  */
85
- findById(modelName: string, id: ModelId, filter?: Filter): Promise<ModelData>;
85
+ findById(
86
+ modelName: string,
87
+ id: ModelId,
88
+ filter?: ItemFilterClause,
89
+ ): Promise<ModelData>;
86
90
 
87
91
  /**
88
92
  * Delete.
@@ -2,10 +2,10 @@ import {Adapter} from '../adapter.js';
2
2
  import {ModelId} from '../../types.js';
3
3
  import {AnyObject} from '../../types.js';
4
4
  import {ModelData} from '../../types.js';
5
- import {Filter} from '../../filter/index.js';
6
- import {ItemFilter} from '../../filter/index.js';
7
5
  import {WhereClause} from '../../filter/index.js';
6
+ import {FilterClause} from '../../filter/index.js';
8
7
  import {ServiceContainer} from '@e22m4u/js-service';
8
+ import {ItemFilterClause} from '../../filter/index.js';
9
9
 
10
10
  /**
11
11
  * Memory adapter.
@@ -34,7 +34,7 @@ export declare class MemoryAdapter extends Adapter {
34
34
  create(
35
35
  modelName: string,
36
36
  modelData: ModelData,
37
- filter?: ItemFilter,
37
+ filter?: ItemFilterClause,
38
38
  ): Promise<ModelData>;
39
39
 
40
40
  /**
@@ -49,7 +49,7 @@ export declare class MemoryAdapter extends Adapter {
49
49
  modelName: string,
50
50
  id: ModelId,
51
51
  modelData: ModelData,
52
- filter?: ItemFilter,
52
+ filter?: ItemFilterClause,
53
53
  ): Promise<ModelData>;
54
54
 
55
55
  /**
@@ -64,7 +64,7 @@ export declare class MemoryAdapter extends Adapter {
64
64
  modelName: string,
65
65
  id: ModelId,
66
66
  modelData: ModelData,
67
- filter?: ItemFilter,
67
+ filter?: ItemFilterClause,
68
68
  ): Promise<ModelData>;
69
69
 
70
70
  /**
@@ -73,7 +73,7 @@ export declare class MemoryAdapter extends Adapter {
73
73
  * @param modelName
74
74
  * @param filter
75
75
  */
76
- find(modelName: string, filter?: Filter): Promise<ModelData[]>;
76
+ find(modelName: string, filter?: FilterClause): Promise<ModelData[]>;
77
77
 
78
78
  /**
79
79
  * Find by id.
@@ -82,7 +82,11 @@ export declare class MemoryAdapter extends Adapter {
82
82
  * @param id
83
83
  * @param filter
84
84
  */
85
- findById(modelName: string, id: ModelId, filter?: Filter): Promise<ModelData>;
85
+ findById(
86
+ modelName: string,
87
+ id: ModelId,
88
+ filter?: ItemFilterClause,
89
+ ): Promise<ModelData>;
86
90
 
87
91
  /**
88
92
  * Delete.
@@ -15,7 +15,7 @@ export class DataSanitizingDecorator extends Service {
15
15
  decorate(adapter) {
16
16
  if (!adapter || !(adapter instanceof Adapter))
17
17
  throw new InvalidArgumentError(
18
- 'A first argument of DataSanitizingDecorator.decorate must be ' +
18
+ 'A first argument of DataSanitizingDecorator.decorate should be ' +
19
19
  'an Adapter instance, but %v given.',
20
20
  adapter,
21
21
  );
@@ -15,7 +15,7 @@ export class DataValidationDecorator extends Service {
15
15
  decorate(adapter) {
16
16
  if (!adapter || !(adapter instanceof Adapter))
17
17
  throw new InvalidArgumentError(
18
- 'A first argument of DataValidationDecorator.decorate must be ' +
18
+ 'A first argument of DataValidationDecorator.decorate should be ' +
19
19
  'an Adapter instance, but %v given.',
20
20
  adapter,
21
21
  );
@@ -15,7 +15,7 @@ export class DefaultValuesDecorator extends Service {
15
15
  decorate(adapter) {
16
16
  if (!adapter || !(adapter instanceof Adapter))
17
17
  throw new InvalidArgumentError(
18
- 'A first argument of DefaultValuesDecorator.decorate must be ' +
18
+ 'A first argument of DefaultValuesDecorator.decorate should be ' +
19
19
  'an Adapter instance, but %v given.',
20
20
  adapter,
21
21
  );
@@ -15,7 +15,7 @@ export class FieldsFilteringDecorator extends Service {
15
15
  decorate(adapter) {
16
16
  if (!adapter || !(adapter instanceof Adapter))
17
17
  throw new InvalidArgumentError(
18
- 'A first argument of FieldsFilteringDecorator.decorate must be ' +
18
+ 'A first argument of FieldsFilteringDecorator.decorate should be ' +
19
19
  'an Adapter instance, but %v given.',
20
20
  adapter,
21
21
  );
@@ -15,7 +15,7 @@ export class InclusionDecorator extends Service {
15
15
  decorate(adapter) {
16
16
  if (!adapter || !(adapter instanceof Adapter))
17
17
  throw new InvalidArgumentError(
18
- 'A first argument of InclusionDecorator.decorate must be ' +
18
+ 'A first argument of InclusionDecorator.decorate should be ' +
19
19
  'an Adapter instance, but %v given.',
20
20
  adapter,
21
21
  );
@@ -17,13 +17,13 @@ export class ModelDataSanitizer extends Service {
17
17
  if (!modelName || typeof modelName !== 'string')
18
18
  throw new InvalidArgumentError(
19
19
  'The first argument of ModelDataSanitizer.sanitize ' +
20
- 'must be a string, but %v given.',
20
+ 'should be a string, but %v given.',
21
21
  modelName,
22
22
  );
23
23
  if (!modelData || typeof modelData !== 'object')
24
24
  throw new InvalidArgumentError(
25
25
  'The second argument of ModelDataSanitizer.sanitize ' +
26
- 'must be an Object, but %v given.',
26
+ 'should be an Object, but %v given.',
27
27
  modelData,
28
28
  );
29
29
  return this.getService(
@@ -19,7 +19,7 @@ export class ModelDataValidator extends Service {
19
19
  validate(modelName, modelData, isPartial = false) {
20
20
  if (!isPureObject(modelData))
21
21
  throw new InvalidArgumentError(
22
- 'The data of the model %v must be an Object, but %v given.',
22
+ 'The data of the model %v should be an Object, but %v given.',
23
23
  modelName,
24
24
  modelData,
25
25
  );
@@ -24,7 +24,7 @@ describe('ModelDataValidator', function () {
24
24
  };
25
25
  const error = given =>
26
26
  format(
27
- 'The data of the model "model" must be an Object, but %s given.',
27
+ 'The data of the model "model" should be an Object, but %s given.',
28
28
  given,
29
29
  );
30
30
  expect(throwable('str')).to.throw(error('"str"'));
@@ -361,7 +361,7 @@ export class ModelDefinitionUtils extends Service {
361
361
  if (!modelData || typeof modelData !== 'object' || Array.isArray(modelData))
362
362
  throw new InvalidArgumentError(
363
363
  'The second argument of ModelDefinitionUtils.excludeObjectKeysByRelationNames ' +
364
- 'must be an Object, but %v given.',
364
+ 'should be an Object, but %v given.',
365
365
  modelData,
366
366
  );
367
367
  const relDefs = this.getRelationsDefinitionInBaseModelHierarchy(modelName);
@@ -1456,7 +1456,7 @@ describe('ModelDefinitionUtils', function () {
1456
1456
  const error = v =>
1457
1457
  format(
1458
1458
  'The second argument of ModelDefinitionUtils.excludeObjectKeysByRelationNames ' +
1459
- 'must be an Object, but %s given.',
1459
+ 'should be an Object, but %s given.',
1460
1460
  v,
1461
1461
  );
1462
1462
  expect(throwable('')).to.throw(error('""'));
@@ -1,7 +1,7 @@
1
1
  import {ModelData} from '../types.js';
2
- import {FieldsClause} from './filter.js';
3
2
  import {Service} from '@e22m4u/js-service';
4
- import {NormalizedFieldsClause} from './filter.js';
3
+ import {FieldsClause} from './filter-clause.js';
4
+ import {NormalizedFieldsClause} from './filter-clause.js';
5
5
 
6
6
  /**
7
7
  * Field clause tool.
@@ -10,12 +10,12 @@ export declare class FieldsClauseTool extends Service {
10
10
  /**
11
11
  * Filter.
12
12
  *
13
- * @param entities
13
+ * @param input
14
14
  * @param modelName
15
15
  * @param clause
16
16
  */
17
17
  filter<T extends ModelData | ModelData[]>(
18
- entities: T,
18
+ input: T,
19
19
  modelName: string,
20
20
  clause: FieldsClause | undefined,
21
21
  ): T;
@@ -10,30 +10,39 @@ export class FieldsClauseTool extends Service {
10
10
  /**
11
11
  * Filter.
12
12
  *
13
- * @param {object|object[]} entities
13
+ * @param {object|object[]} input
14
14
  * @param {string} modelName
15
15
  * @param {string|string[]|undefined} clause
16
16
  * @returns {object|object[]}
17
17
  */
18
- filter(entities, modelName, clause) {
19
- const isArray = Array.isArray(entities);
20
- entities = isArray ? entities : [entities];
18
+ filter(input, modelName, clause) {
19
+ const isArray = Array.isArray(input);
20
+ let entities = isArray ? input : [input];
21
21
  entities.forEach(entity => {
22
22
  if (!entity || typeof entity !== 'object' || Array.isArray(entity))
23
23
  throw new InvalidArgumentError(
24
- 'A first argument of FieldClauseTool.filter should be an Object or ' +
24
+ 'The first argument of FieldsClauseTool.filter should be an Object or ' +
25
25
  'an Array of Object, but %v given.',
26
26
  entity,
27
27
  );
28
28
  });
29
29
 
30
- if (!clause) return entities;
30
+ if (!modelName || typeof modelName !== 'string')
31
+ throw new InvalidArgumentError(
32
+ 'The second argument of FieldsClauseTool.filter should be ' +
33
+ 'a non-empty String, but %v given.',
34
+ modelName,
35
+ );
36
+
37
+ if (clause == null) return input;
31
38
  const fields = Array.isArray(clause) ? clause.slice() : [clause];
39
+ if (!fields.length) return input;
40
+
32
41
  fields.forEach(field => {
33
42
  if (!field || typeof field !== 'string')
34
43
  throw new InvalidArgumentError(
35
- 'The provided option "fields" should be a String ' +
36
- 'or an Array of String, but %v given.',
44
+ 'The provided option "fields" should be a non-empty String ' +
45
+ 'or an Array of non-empty String, but %v given.',
37
46
  field,
38
47
  );
39
48
  });
@@ -54,14 +63,15 @@ export class FieldsClauseTool extends Service {
54
63
  * @param {string|string[]|undefined} clause
55
64
  */
56
65
  static validateFieldsClause(clause) {
57
- if (!clause) return;
58
- const tempClause = Array.isArray(clause) ? clause : [clause];
59
- tempClause.forEach(key => {
60
- if (!key || typeof key !== 'string')
66
+ if (clause == null) return;
67
+ const fields = Array.isArray(clause) ? clause : [clause];
68
+ if (!fields.length) return;
69
+ fields.forEach(field => {
70
+ if (!field || typeof field !== 'string')
61
71
  throw new InvalidArgumentError(
62
72
  'The provided option "fields" should be a non-empty String ' +
63
- 'or an Array of String, but %v given.',
64
- key,
73
+ 'or an Array of non-empty String, but %v given.',
74
+ field,
65
75
  );
66
76
  });
67
77
  }
@@ -73,16 +83,17 @@ export class FieldsClauseTool extends Service {
73
83
  * @returns {string[]|undefined}
74
84
  */
75
85
  static normalizeFieldsClause(clause) {
76
- if (!clause) return;
77
- clause = Array.isArray(clause) ? clause : [clause];
78
- clause.forEach(key => {
79
- if (!key || typeof key !== 'string')
86
+ if (clause == null) return;
87
+ const fields = Array.isArray(clause) ? clause : [clause];
88
+ if (!fields.length) return;
89
+ fields.forEach(field => {
90
+ if (!field || typeof field !== 'string')
80
91
  throw new InvalidArgumentError(
81
92
  'The provided option "fields" should be a non-empty String ' +
82
- 'or an Array of String, but %v given.',
83
- key,
93
+ 'or an Array of non-empty String, but %v given.',
94
+ field,
84
95
  );
85
96
  });
86
- return clause;
97
+ return fields;
87
98
  }
88
99
  }