@e22m4u/js-repository 0.6.5 → 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.
- package/.mocharc.json +2 -3
- package/README.md +128 -695
- package/dist/cjs/index.cjs +141 -1262
- package/eslint.config.js +29 -58
- package/jsconfig.json +7 -0
- package/package.json +12 -20
- package/src/adapter/adapter-loader.js +3 -4
- package/src/adapter/adapter.js +10 -11
- package/src/adapter/adapter.spec.js +13 -24
- package/src/adapter/builtin/memory-adapter.js +49 -19
- package/src/adapter/builtin/memory-adapter.spec.js +52 -2
- package/src/adapter/decorator/default-values-decorator.spec.js +1 -2
- package/src/adapter/decorator/index.js +0 -2
- package/src/database-schema.js +1 -2
- package/src/{database-schema.spec.ts → database-schema.spec.js} +5 -17
- package/src/definition/model/index.js +0 -3
- package/src/definition/model/model-definition-utils.js +1 -2
- package/src/definition/model/model-definition-utils.spec.js +5 -2
- package/src/definition/model/properties/index.js +0 -3
- package/src/definition/model/properties/properties-definition-validator.js +0 -169
- package/src/definition/model/properties/properties-definition-validator.spec.js +0 -162
- package/src/definition/model/relations/index.js +0 -1
- package/src/definition/model/relations/relations-definition-validator.js +4 -5
- package/src/filter/include-clause-tool.js +8 -6
- package/src/index.js +0 -1
- package/src/relations/belongs-to-resolver.js +1 -2
- package/src/relations/belongs-to-resolver.spec.js +6 -3
- package/src/relations/has-many-resolver.js +1 -2
- package/src/relations/has-many-resolver.spec.js +6 -3
- package/src/relations/has-one-resolver.js +1 -2
- package/src/relations/has-one-resolver.spec.js +6 -3
- package/src/relations/references-many-resolver.js +1 -2
- package/src/relations/references-many-resolver.spec.js +6 -3
- package/src/repository/repository.js +1 -2
- package/src/utils/index.js +0 -4
- package/src/utils/is-plain-object.js +4 -4
- package/src/utils/model-name-to-model-key.js +0 -4
- package/src/utils/model-name-to-model-key.spec.js +0 -23
- package/src/adapter/adapter-loader.d.ts +0 -16
- package/src/adapter/adapter-registry.d.ts +0 -14
- package/src/adapter/adapter.d.ts +0 -155
- package/src/adapter/builtin/memory-adapter.d.ts +0 -148
- package/src/adapter/decorator/data-sanitizing-decorator.d.ts +0 -14
- package/src/adapter/decorator/data-transformation-decorator.d.ts +0 -14
- package/src/adapter/decorator/data-transformation-decorator.js +0 -54
- package/src/adapter/decorator/data-transformation-decorator.spec.js +0 -193
- package/src/adapter/decorator/data-validation-decorator.d.ts +0 -14
- package/src/adapter/decorator/data-validation-decorator.js +0 -54
- package/src/adapter/decorator/data-validation-decorator.spec.js +0 -105
- package/src/adapter/decorator/default-values-decorator.d.ts +0 -14
- package/src/adapter/decorator/fields-filtering-decorator.d.ts +0 -14
- package/src/adapter/decorator/inclusion-decorator.d.ts +0 -14
- package/src/adapter/decorator/index.d.ts +0 -7
- package/src/adapter/decorator/property-uniqueness-decorator.d.ts +0 -14
- package/src/adapter/index.d.ts +0 -3
- package/src/database-schema.d.ts +0 -37
- package/src/definition/datasource/datasource-definition-validator.d.ts +0 -14
- package/src/definition/datasource/datasource-definition.d.ts +0 -8
- package/src/definition/datasource/index.d.ts +0 -2
- package/src/definition/definition-registry.d.ts +0 -50
- package/src/definition/index.d.ts +0 -3
- package/src/definition/model/index.d.ts +0 -8
- package/src/definition/model/model-data-sanitizer.d.ts +0 -15
- package/src/definition/model/model-data-transformer.d.ts +0 -16
- package/src/definition/model/model-data-transformer.js +0 -170
- package/src/definition/model/model-data-transformer.spec.js +0 -2312
- package/src/definition/model/model-data-validator.d.ts +0 -16
- package/src/definition/model/model-data-validator.js +0 -318
- package/src/definition/model/model-data-validator.spec.js +0 -4528
- package/src/definition/model/model-definition-utils.d.ts +0 -180
- package/src/definition/model/model-definition-validator.d.ts +0 -14
- package/src/definition/model/model-definition.d.ts +0 -28
- package/src/definition/model/model-definition.js +0 -1
- package/src/definition/model/properties/data-type.d.ts +0 -16
- package/src/definition/model/properties/index.d.ts +0 -8
- package/src/definition/model/properties/primary-keys-definition-validator.d.ts +0 -15
- package/src/definition/model/properties/properties-definition-validator.d.ts +0 -15
- package/src/definition/model/properties/property-definition.d.ts +0 -27
- package/src/definition/model/properties/property-definition.js +0 -1
- package/src/definition/model/properties/property-transformer/builtin/index.d.ts +0 -3
- package/src/definition/model/properties/property-transformer/builtin/index.js +0 -3
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.d.ts +0 -6
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.js +0 -19
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.spec.js +0 -39
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.d.ts +0 -6
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.js +0 -19
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.spec.js +0 -39
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.d.ts +0 -6
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.js +0 -19
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.spec.js +0 -39
- package/src/definition/model/properties/property-transformer/index.d.ts +0 -2
- package/src/definition/model/properties/property-transformer/index.js +0 -2
- package/src/definition/model/properties/property-transformer/property-transformer-registry.d.ts +0 -29
- package/src/definition/model/properties/property-transformer/property-transformer-registry.js +0 -76
- package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +0 -133
- package/src/definition/model/properties/property-transformer/property-transformer.d.ts +0 -27
- package/src/definition/model/properties/property-transformer/property-transformer.js +0 -1
- package/src/definition/model/properties/property-uniqueness-validator.d.ts +0 -31
- package/src/definition/model/properties/property-uniqueness.d.ts +0 -14
- package/src/definition/model/properties/property-validator/builtin/index.d.ts +0 -3
- package/src/definition/model/properties/property-validator/builtin/index.js +0 -3
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.d.ts +0 -6
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.js +0 -28
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +0 -100
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.d.ts +0 -6
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.js +0 -28
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +0 -100
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +0 -6
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +0 -30
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +0 -102
- package/src/definition/model/properties/property-validator/index.d.ts +0 -2
- package/src/definition/model/properties/property-validator/index.js +0 -2
- package/src/definition/model/properties/property-validator/property-validator-registry.d.ts +0 -29
- package/src/definition/model/properties/property-validator/property-validator-registry.js +0 -76
- package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +0 -132
- package/src/definition/model/properties/property-validator/property-validator.d.ts +0 -25
- package/src/definition/model/properties/property-validator/property-validator.js +0 -1
- package/src/definition/model/relations/index.d.ts +0 -3
- package/src/definition/model/relations/relation-definition.d.ts +0 -236
- package/src/definition/model/relations/relation-definition.js +0 -1
- package/src/definition/model/relations/relation-type.d.ts +0 -14
- package/src/definition/model/relations/relations-definition-validator.d.ts +0 -15
- package/src/errors/index.d.ts +0 -3
- package/src/errors/invalid-argument-error.d.ts +0 -6
- package/src/errors/invalid-operator-value-error.d.ts +0 -13
- package/src/errors/not-implemented-error.d.ts +0 -6
- package/src/filter/fields-clause-tool.d.ts +0 -38
- package/src/filter/filter-clause.d.ts +0 -348
- package/src/filter/include-clause-tool.d.ts +0 -55
- package/src/filter/index.d.ts +0 -7
- package/src/filter/operator-clause-tool.d.ts +0 -224
- package/src/filter/order-clause-tool.d.ts +0 -32
- package/src/filter/slice-clause-tool.d.ts +0 -30
- package/src/filter/where-clause-tool.d.ts +0 -23
- package/src/index.d.ts +0 -9
- package/src/relations/belongs-to-resolver.d.ts +0 -46
- package/src/relations/has-many-resolver.d.ts +0 -67
- package/src/relations/has-one-resolver.d.ts +0 -67
- package/src/relations/index.d.ts +0 -4
- package/src/relations/references-many-resolver.d.ts +0 -27
- package/src/repository/index.d.ts +0 -2
- package/src/repository/repository-registry.d.ts +0 -29
- package/src/repository/repository.d.ts +0 -183
- package/src/types.d.ts +0 -43
- package/src/types.js +0 -1
- package/src/utils/capitalize.d.ts +0 -6
- package/src/utils/clone-deep.d.ts +0 -6
- package/src/utils/exclude-object-keys.d.ts +0 -10
- package/src/utils/get-ctor-name.d.ts +0 -6
- package/src/utils/get-ctor-name.js +0 -11
- package/src/utils/get-ctor-name.spec.js +0 -17
- package/src/utils/get-decorator-target-type.d.ts +0 -27
- package/src/utils/get-decorator-target-type.js +0 -63
- package/src/utils/get-decorator-target-type.spec.js +0 -80
- package/src/utils/get-value-by-path.d.ts +0 -12
- package/src/utils/index.d.ts +0 -16
- package/src/utils/is-ctor.d.ts +0 -8
- package/src/utils/is-ctor.js +0 -11
- package/src/utils/is-ctor.spec.js +0 -26
- package/src/utils/is-deep-equal.d.ts +0 -10
- package/src/utils/is-plain-object.d.ts +0 -6
- package/src/utils/is-promise.d.ts +0 -10
- package/src/utils/like-to-regexp.d.ts +0 -14
- package/src/utils/model-name-to-model-key.d.ts +0 -6
- package/src/utils/select-object-keys.d.ts +0 -10
- package/src/utils/singularize.d.ts +0 -6
- package/src/utils/string-to-regexp.d.ts +0 -10
- package/src/utils/transform-promise.d.ts +0 -13
- package/src/utils/transform-promise.js +0 -15
- package/src/utils/transform-promise.spec.js +0 -19
- package/tsconfig.json +0 -11
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import {expect} from 'chai';
|
|
2
|
-
import {chai} from '../../chai.js';
|
|
3
|
-
import {Adapter} from '../adapter.js';
|
|
4
|
-
import {DatabaseSchema} from '../../database-schema.js';
|
|
5
|
-
import {ModelDataValidator} from '../../definition/index.js';
|
|
6
|
-
|
|
7
|
-
const dbs = new DatabaseSchema();
|
|
8
|
-
dbs.defineModel({name: 'model'});
|
|
9
|
-
|
|
10
|
-
class TestAdapter extends Adapter {
|
|
11
|
-
// eslint-disable-next-line no-unused-vars
|
|
12
|
-
create(modelName, modelData, filter = undefined) {
|
|
13
|
-
return Promise.resolve(modelData);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// eslint-disable-next-line no-unused-vars
|
|
17
|
-
replaceById(modelName, id, modelData, filter = undefined) {
|
|
18
|
-
return Promise.resolve(modelData);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// eslint-disable-next-line no-unused-vars
|
|
22
|
-
replaceOrCreate(modelName, modelData, filter = undefined) {
|
|
23
|
-
return Promise.resolve(modelData);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// eslint-disable-next-line no-unused-vars
|
|
27
|
-
patch(modelName, modelData, where = undefined) {
|
|
28
|
-
return Promise.resolve(modelData);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// eslint-disable-next-line no-unused-vars
|
|
32
|
-
patchById(modelName, id, modelData, filter = undefined) {
|
|
33
|
-
return Promise.resolve(modelData);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const A = dbs.getService(TestAdapter);
|
|
38
|
-
const V = dbs.getService(ModelDataValidator);
|
|
39
|
-
const sandbox = chai.spy.sandbox();
|
|
40
|
-
|
|
41
|
-
describe('DataValidationDecorator', function () {
|
|
42
|
-
afterEach(function () {
|
|
43
|
-
sandbox.restore();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('overrides the "create" method and validates a given data', async function () {
|
|
47
|
-
const data = {kind: 'data'};
|
|
48
|
-
sandbox.on(V, 'validate', (modelName, modelData, isPartial = false) => {
|
|
49
|
-
expect(modelName).to.be.eq('model');
|
|
50
|
-
expect(modelData).to.be.eql(data);
|
|
51
|
-
expect(isPartial).to.be.false;
|
|
52
|
-
});
|
|
53
|
-
const res = await A.create('model', data);
|
|
54
|
-
expect(res).to.be.eql(data);
|
|
55
|
-
expect(V.validate).to.be.called.once;
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('overrides the "replaceById" method and validates a given data', async function () {
|
|
59
|
-
const data = {kind: 'data'};
|
|
60
|
-
sandbox.on(V, 'validate', (modelName, modelData, isPartial = false) => {
|
|
61
|
-
expect(modelName).to.be.eq('model');
|
|
62
|
-
expect(modelData).to.be.eql(data);
|
|
63
|
-
expect(isPartial).to.be.false;
|
|
64
|
-
});
|
|
65
|
-
const res = await A.replaceById('model', 1, data);
|
|
66
|
-
expect(res).to.be.eql(data);
|
|
67
|
-
expect(V.validate).to.be.called.once;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('overrides the "replaceOrCreate" method and validates a given data', async function () {
|
|
71
|
-
const data = {kind: 'data'};
|
|
72
|
-
sandbox.on(V, 'validate', (modelName, modelData, isPartial = false) => {
|
|
73
|
-
expect(modelName).to.be.eq('model');
|
|
74
|
-
expect(modelData).to.be.eql(data);
|
|
75
|
-
expect(isPartial).to.be.false;
|
|
76
|
-
});
|
|
77
|
-
const res = await A.replaceOrCreate('model', data);
|
|
78
|
-
expect(res).to.be.eql(data);
|
|
79
|
-
expect(V.validate).to.be.called.once;
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('overrides the "patch" method and validates a given data', async function () {
|
|
83
|
-
const data = {kind: 'data'};
|
|
84
|
-
sandbox.on(V, 'validate', (modelName, modelData, isPartial = false) => {
|
|
85
|
-
expect(modelName).to.be.eq('model');
|
|
86
|
-
expect(modelData).to.be.eql(data);
|
|
87
|
-
expect(isPartial).to.be.true;
|
|
88
|
-
});
|
|
89
|
-
const res = await A.patch('model', data);
|
|
90
|
-
expect(res).to.be.eql(data);
|
|
91
|
-
expect(V.validate).to.be.called.once;
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('overrides the "patchById" method and validates a given data', async function () {
|
|
95
|
-
const data = {kind: 'data'};
|
|
96
|
-
sandbox.on(V, 'validate', (modelName, modelData, isPartial = false) => {
|
|
97
|
-
expect(modelName).to.be.eq('model');
|
|
98
|
-
expect(modelData).to.be.eql(data);
|
|
99
|
-
expect(isPartial).to.be.true;
|
|
100
|
-
});
|
|
101
|
-
const res = await A.patchById('model', 1, data);
|
|
102
|
-
expect(res).to.be.eql(data);
|
|
103
|
-
expect(V.validate).to.be.called.once;
|
|
104
|
-
});
|
|
105
|
-
});
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {Adapter} from '../adapter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Default values decorator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class DefaultValuesDecorator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Decorate.
|
|
10
|
-
*
|
|
11
|
-
* @param adapter
|
|
12
|
-
*/
|
|
13
|
-
decorate(adapter: Adapter): void;
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {Adapter} from '../adapter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Fields filtering decorator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class FieldsFilteringDecorator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Decorate.
|
|
10
|
-
*
|
|
11
|
-
* @param adapter
|
|
12
|
-
*/
|
|
13
|
-
decorate(adapter: Adapter): void;
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {Adapter} from '../adapter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Inclusion decorator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class InclusionDecorator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Decorate.
|
|
10
|
-
*
|
|
11
|
-
* @param adapter
|
|
12
|
-
*/
|
|
13
|
-
decorate(adapter: Adapter): void;
|
|
14
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export * from './inclusion-decorator.js';
|
|
2
|
-
export * from './default-values-decorator.js';
|
|
3
|
-
export * from './data-sanitizing-decorator.js';
|
|
4
|
-
export * from './data-validation-decorator.js';
|
|
5
|
-
export * from './fields-filtering-decorator.js';
|
|
6
|
-
export * from './data-transformation-decorator.js';
|
|
7
|
-
export * from './property-uniqueness-decorator.js';
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Adapter} from '../adapter.js';
|
|
2
|
-
import {Service} from '@e22m4u/js-service';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Property uniqueness decorator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class PropertyUniquenessDecorator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Decorate.
|
|
10
|
-
*
|
|
11
|
-
* @param adapter
|
|
12
|
-
*/
|
|
13
|
-
decorate(adapter: Adapter): void;
|
|
14
|
-
}
|
package/src/adapter/index.d.ts
DELETED
package/src/database-schema.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import {ModelId} from './types.js';
|
|
2
|
-
import {ModelData} from './types.js';
|
|
3
|
-
import {Service} from '@e22m4u/js-service';
|
|
4
|
-
import {Repository} from './repository/index.js';
|
|
5
|
-
import {ModelDefinition} from './definition/index.js';
|
|
6
|
-
import {DatasourceDefinition} from './definition/index.js';
|
|
7
|
-
import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME} from './definition/index.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Database schema.
|
|
11
|
-
*/
|
|
12
|
-
export declare class DatabaseSchema extends Service {
|
|
13
|
-
/**
|
|
14
|
-
* Define datasource.
|
|
15
|
-
*
|
|
16
|
-
* @param datasourceDef
|
|
17
|
-
*/
|
|
18
|
-
defineDatasource(datasourceDef: DatasourceDefinition): this;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Define model.
|
|
22
|
-
*
|
|
23
|
-
* @param modelDef
|
|
24
|
-
*/
|
|
25
|
-
defineModel(modelDef: ModelDefinition): this;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Get repository.
|
|
29
|
-
*
|
|
30
|
-
* @param modelName
|
|
31
|
-
*/
|
|
32
|
-
getRepository<
|
|
33
|
-
Data extends object = ModelData,
|
|
34
|
-
IdType extends ModelId = ModelId,
|
|
35
|
-
IdName extends string = typeof DEFAULT_PRIMARY_KEY_PROPERTY_NAME,
|
|
36
|
-
>(modelName: string): Repository<Data, IdType, IdName>;
|
|
37
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {DatasourceDefinition} from './datasource-definition.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Datasource definition validator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class DatasourceDefinitionValidator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Validate.
|
|
10
|
-
*
|
|
11
|
-
* @param datasourceDef
|
|
12
|
-
*/
|
|
13
|
-
validate(datasourceDef: DatasourceDefinition): void;
|
|
14
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {ModelDefinition} from './model/index.js';
|
|
3
|
-
import {DatasourceDefinition} from './datasource/index.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Definition registry.
|
|
7
|
-
*/
|
|
8
|
-
export declare class DefinitionRegistry extends Service {
|
|
9
|
-
/**
|
|
10
|
-
* Add datasource.
|
|
11
|
-
*
|
|
12
|
-
* @param datasourceDef
|
|
13
|
-
*/
|
|
14
|
-
addDatasource(datasourceDef: DatasourceDefinition): void;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Has datasource.
|
|
18
|
-
*
|
|
19
|
-
* @param name
|
|
20
|
-
*/
|
|
21
|
-
hasDatasource(name: string): boolean;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Get datasource.
|
|
25
|
-
*
|
|
26
|
-
* @param name
|
|
27
|
-
*/
|
|
28
|
-
getDatasource(name: string): DatasourceDefinition;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Add model.
|
|
32
|
-
*
|
|
33
|
-
* @param modelDef
|
|
34
|
-
*/
|
|
35
|
-
addModel(modelDef: ModelDefinition): void;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Has model.
|
|
39
|
-
*
|
|
40
|
-
* @param name
|
|
41
|
-
*/
|
|
42
|
-
hasModel(name: string): boolean;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Get model.
|
|
46
|
-
*
|
|
47
|
-
* @param name
|
|
48
|
-
*/
|
|
49
|
-
getModel(name: string): ModelDefinition;
|
|
50
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export * from './relations/index.js';
|
|
2
|
-
export * from './properties/index.js';
|
|
3
|
-
export * from './model-definition.js';
|
|
4
|
-
export * from './model-data-validator.js';
|
|
5
|
-
export * from './model-data-sanitizer.js';
|
|
6
|
-
export * from './model-data-transformer.js';
|
|
7
|
-
export * from './model-definition-utils.js';
|
|
8
|
-
export * from './model-definition-validator.js';
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {ModelData} from '../../types.js';
|
|
2
|
-
import {Service} from '@e22m4u/js-service';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Model data sanitizer.
|
|
6
|
-
*/
|
|
7
|
-
export declare class ModelDataSanitizer extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Sanitize.
|
|
10
|
-
*
|
|
11
|
-
* @param modelName
|
|
12
|
-
* @param modelData
|
|
13
|
-
*/
|
|
14
|
-
sanitize(modelName: string, modelData: ModelData): ModelData;
|
|
15
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import {ModelData} from '../../types.js';
|
|
2
|
-
import {Service} from '@e22m4u/js-service';
|
|
3
|
-
import {ValueOrPromise} from '../../types.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Model data transformer.
|
|
7
|
-
*/
|
|
8
|
-
export declare class ModelDataTransformer extends Service {
|
|
9
|
-
/**
|
|
10
|
-
* Transform.
|
|
11
|
-
*
|
|
12
|
-
* @param modelName
|
|
13
|
-
* @param modelData
|
|
14
|
-
*/
|
|
15
|
-
transform(modelName: string, modelData: ModelData): ValueOrPromise<ModelData>;
|
|
16
|
-
}
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {cloneDeep} from '../../utils/index.js';
|
|
3
|
-
import {isPlainObject} from '../../utils/index.js';
|
|
4
|
-
import {transformPromise} from '../../utils/index.js';
|
|
5
|
-
import {EmptyValuesService} from '@e22m4u/js-empty-values';
|
|
6
|
-
import {InvalidArgumentError} from '../../errors/index.js';
|
|
7
|
-
import {ModelDefinitionUtils} from './model-definition-utils.js';
|
|
8
|
-
import {PropertyTransformerRegistry} from './properties/index.js';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Model data transformer.
|
|
12
|
-
*/
|
|
13
|
-
export class ModelDataTransformer extends Service {
|
|
14
|
-
/**
|
|
15
|
-
* Transform.
|
|
16
|
-
*
|
|
17
|
-
* @param {string} modelName
|
|
18
|
-
* @param {object} modelData
|
|
19
|
-
* @param {boolean} isPartial
|
|
20
|
-
* @returns {object|Promise<object>}
|
|
21
|
-
*/
|
|
22
|
-
transform(modelName, modelData, isPartial = false) {
|
|
23
|
-
if (!isPlainObject(modelData))
|
|
24
|
-
throw new InvalidArgumentError(
|
|
25
|
-
'The data of the model %v should be an Object, but %v was given.',
|
|
26
|
-
modelName,
|
|
27
|
-
modelData,
|
|
28
|
-
);
|
|
29
|
-
const emptyValuesService = this.getService(EmptyValuesService);
|
|
30
|
-
const modelDefinitionUtils = this.getService(ModelDefinitionUtils);
|
|
31
|
-
const propDefs =
|
|
32
|
-
modelDefinitionUtils.getPropertiesDefinitionInBaseModelHierarchy(
|
|
33
|
-
modelName,
|
|
34
|
-
);
|
|
35
|
-
const propNames = Object.keys(isPartial ? modelData : propDefs);
|
|
36
|
-
const transformedData = cloneDeep(modelData);
|
|
37
|
-
return propNames.reduce((transformedDataOrPromise, propName) => {
|
|
38
|
-
const propDef = propDefs[propName];
|
|
39
|
-
if (!propDef) return transformedDataOrPromise;
|
|
40
|
-
const propType =
|
|
41
|
-
modelDefinitionUtils.getDataTypeFromPropertyDefinition(propDef);
|
|
42
|
-
const propValue = modelData[propName];
|
|
43
|
-
const isEmpty = emptyValuesService.isEmptyByType(propType, propValue);
|
|
44
|
-
if (isEmpty) return transformedDataOrPromise;
|
|
45
|
-
const newPropValueOrPromise = this._transformPropertyValue(
|
|
46
|
-
modelName,
|
|
47
|
-
propName,
|
|
48
|
-
propDef,
|
|
49
|
-
propValue,
|
|
50
|
-
);
|
|
51
|
-
return transformPromise(newPropValueOrPromise, newPropValue => {
|
|
52
|
-
return transformPromise(transformedDataOrPromise, resolvedData => {
|
|
53
|
-
if (newPropValue !== propValue) resolvedData[propName] = newPropValue;
|
|
54
|
-
return resolvedData;
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}, transformedData);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Transform property value.
|
|
62
|
-
*
|
|
63
|
-
* @param {string} modelName
|
|
64
|
-
* @param {string} propName
|
|
65
|
-
* @param {string|object} propDef
|
|
66
|
-
* @param {*} propValue
|
|
67
|
-
* @returns {*|Promise<*>}
|
|
68
|
-
*/
|
|
69
|
-
_transformPropertyValue(modelName, propName, propDef, propValue) {
|
|
70
|
-
if (typeof propDef === 'string' || propDef.transform == null)
|
|
71
|
-
return propValue;
|
|
72
|
-
const transformDef = propDef.transform;
|
|
73
|
-
const transformerRegistry = this.getService(PropertyTransformerRegistry);
|
|
74
|
-
const transformFn = (
|
|
75
|
-
value,
|
|
76
|
-
transformerOrName,
|
|
77
|
-
transformerOptions = undefined,
|
|
78
|
-
) => {
|
|
79
|
-
let transformerName, transformerFn;
|
|
80
|
-
// если второй аргумент является строкой, то строка
|
|
81
|
-
// воспринимается как название зарегистрированного
|
|
82
|
-
// трансформера
|
|
83
|
-
if (typeof transformerOrName === 'string') {
|
|
84
|
-
transformerName = transformerOrName;
|
|
85
|
-
transformerFn = transformerRegistry.getTransformer(transformerName);
|
|
86
|
-
}
|
|
87
|
-
// если второй аргумент является функцией,
|
|
88
|
-
// то функция воспринимается как трансформер
|
|
89
|
-
else if (typeof transformerOrName === 'function') {
|
|
90
|
-
transformerName =
|
|
91
|
-
transformerOrName.name && transformerOrName.name !== 'transform'
|
|
92
|
-
? transformerOrName.name
|
|
93
|
-
: undefined;
|
|
94
|
-
transformerFn = transformerOrName;
|
|
95
|
-
}
|
|
96
|
-
// если второй аргумент не является строкой
|
|
97
|
-
// и функцией, то выбрасывается ошибка
|
|
98
|
-
else {
|
|
99
|
-
throw new InvalidArgumentError(
|
|
100
|
-
'Transformer must be a non-empty String or ' +
|
|
101
|
-
'a Function, but %v was given.',
|
|
102
|
-
transformerOrName,
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
const context = {transformerName, modelName, propName};
|
|
106
|
-
return transformerFn(value, transformerOptions, context);
|
|
107
|
-
};
|
|
108
|
-
// если значением опции "transform" является строка,
|
|
109
|
-
// то строка воспринимается как название трансформера
|
|
110
|
-
if (transformDef && typeof transformDef === 'string') {
|
|
111
|
-
return transformFn(propValue, transformDef);
|
|
112
|
-
}
|
|
113
|
-
// если значением опции "transform" является функция,
|
|
114
|
-
// то функция воспринимается как трансформер
|
|
115
|
-
else if (transformDef && typeof transformDef === 'function') {
|
|
116
|
-
return transformFn(propValue, transformDef);
|
|
117
|
-
}
|
|
118
|
-
// если значение опции "transform" является массив, то каждый
|
|
119
|
-
// элемент массива воспринимается как название трансформера
|
|
120
|
-
// или функция-валидатор
|
|
121
|
-
else if (Array.isArray(transformDef)) {
|
|
122
|
-
return transformDef.reduce((valueOrPromise, transformerOrName) => {
|
|
123
|
-
if (
|
|
124
|
-
!transformerOrName ||
|
|
125
|
-
(typeof transformerOrName !== 'string' &&
|
|
126
|
-
typeof transformerOrName !== 'function')
|
|
127
|
-
) {
|
|
128
|
-
throw new InvalidArgumentError(
|
|
129
|
-
'The provided option "transform" for the property %v ' +
|
|
130
|
-
'in the model %v has an Array value that should contain ' +
|
|
131
|
-
'transformer names or transformer functions, but %v was given.',
|
|
132
|
-
propName,
|
|
133
|
-
modelName,
|
|
134
|
-
transformerOrName,
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
return transformPromise(valueOrPromise, value => {
|
|
138
|
-
return transformFn(value, transformerOrName);
|
|
139
|
-
});
|
|
140
|
-
}, propValue);
|
|
141
|
-
}
|
|
142
|
-
// если значение опции "transform" является объектом,
|
|
143
|
-
// то ключи объекта воспринимаются как названия трансформеров,
|
|
144
|
-
// а их значения аргументами
|
|
145
|
-
else if (transformDef !== null && typeof transformDef === 'object') {
|
|
146
|
-
return Object.keys(transformDef).reduce(
|
|
147
|
-
(valueOrPromise, transformerName) => {
|
|
148
|
-
const transformerOptions = transformDef[transformerName];
|
|
149
|
-
return transformPromise(valueOrPromise, value => {
|
|
150
|
-
return transformFn(value, transformerName, transformerOptions);
|
|
151
|
-
});
|
|
152
|
-
},
|
|
153
|
-
propValue,
|
|
154
|
-
);
|
|
155
|
-
}
|
|
156
|
-
// если значение опции "transform" не является строкой,
|
|
157
|
-
// функцией и массивом, то выбрасывается ошибка
|
|
158
|
-
else {
|
|
159
|
-
throw new InvalidArgumentError(
|
|
160
|
-
'The provided option "transform" for the property %v in the model %v ' +
|
|
161
|
-
'should be either a transformer name, a transformer function, an array ' +
|
|
162
|
-
'of transformer names or functions, or an object mapping transformer ' +
|
|
163
|
-
'names to their arguments, but %v was given.',
|
|
164
|
-
propName,
|
|
165
|
-
modelName,
|
|
166
|
-
transformDef,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|