@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.
- package/package.json +1 -1
- package/src/adapter/adapter-loader.js +1 -1
- package/src/adapter/adapter-loader.spec.js +1 -1
- package/src/adapter/adapter.d.ts +11 -7
- package/src/adapter/builtin/memory-adapter.d.ts +11 -7
- package/src/adapter/decorator/data-sanitizing-decorator.js +1 -1
- package/src/adapter/decorator/data-validation-decorator.js +1 -1
- package/src/adapter/decorator/default-values-decorator.js +1 -1
- package/src/adapter/decorator/fields-filtering-decorator.js +1 -1
- package/src/adapter/decorator/inclusion-decorator.js +1 -1
- package/src/definition/model/model-data-sanitizer.js +2 -2
- package/src/definition/model/model-data-validator.js +1 -1
- package/src/definition/model/model-data-validator.spec.js +1 -1
- package/src/definition/model/model-definition-utils.js +1 -1
- package/src/definition/model/model-definition-utils.spec.js +1 -1
- package/src/filter/fields-clause-tool.d.ts +4 -4
- package/src/filter/fields-clause-tool.js +32 -21
- package/src/filter/fields-clause-tool.spec.js +479 -100
- package/src/filter/{filter.d.ts → filter-clause.d.ts} +10 -10
- package/src/filter/include-clause-tool.d.ts +7 -5
- package/src/filter/index.d.ts +1 -1
- package/src/filter/operator-clause-tool.js +1 -1
- package/src/filter/operator-clause-tool.spec.js +1 -1
- package/src/filter/order-clause-tool.d.ts +1 -1
- package/src/filter/order-clause-tool.js +20 -17
- package/src/filter/order-clause-tool.spec.js +621 -362
- package/src/filter/slice-clause-tool.js +1 -1
- package/src/filter/where-clause-tool.d.ts +1 -1
- package/src/relations/belongs-to-resolver.d.ts +3 -3
- package/src/relations/has-many-resolver.d.ts +4 -4
- package/src/relations/has-one-resolver.d.ts +4 -4
- package/src/relations/references-many-resolver.d.ts +2 -2
- package/src/repository/repository.d.ts +9 -9
package/package.json
CHANGED
|
@@ -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
|
|
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
|
|
12
|
+
'The adapter name should be a non-empty String, but "" given.',
|
|
13
13
|
);
|
|
14
14
|
});
|
|
15
15
|
|
package/src/adapter/adapter.d.ts
CHANGED
|
@@ -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?:
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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(
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
|
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"
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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 {
|
|
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
|
|
13
|
+
* @param input
|
|
14
14
|
* @param modelName
|
|
15
15
|
* @param clause
|
|
16
16
|
*/
|
|
17
17
|
filter<T extends ModelData | ModelData[]>(
|
|
18
|
-
|
|
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[]}
|
|
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(
|
|
19
|
-
const isArray = Array.isArray(
|
|
20
|
-
entities = isArray ?
|
|
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
|
-
'
|
|
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 (!
|
|
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 (
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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 (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
93
|
+
'or an Array of non-empty String, but %v given.',
|
|
94
|
+
field,
|
|
84
95
|
);
|
|
85
96
|
});
|
|
86
|
-
return
|
|
97
|
+
return fields;
|
|
87
98
|
}
|
|
88
99
|
}
|