@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.
Files changed (171) hide show
  1. package/.mocharc.json +2 -3
  2. package/README.md +128 -695
  3. package/dist/cjs/index.cjs +141 -1262
  4. package/eslint.config.js +29 -58
  5. package/jsconfig.json +7 -0
  6. package/package.json +12 -20
  7. package/src/adapter/adapter-loader.js +3 -4
  8. package/src/adapter/adapter.js +10 -11
  9. package/src/adapter/adapter.spec.js +13 -24
  10. package/src/adapter/builtin/memory-adapter.js +49 -19
  11. package/src/adapter/builtin/memory-adapter.spec.js +52 -2
  12. package/src/adapter/decorator/default-values-decorator.spec.js +1 -2
  13. package/src/adapter/decorator/index.js +0 -2
  14. package/src/database-schema.js +1 -2
  15. package/src/{database-schema.spec.ts → database-schema.spec.js} +5 -17
  16. package/src/definition/model/index.js +0 -3
  17. package/src/definition/model/model-definition-utils.js +1 -2
  18. package/src/definition/model/model-definition-utils.spec.js +5 -2
  19. package/src/definition/model/properties/index.js +0 -3
  20. package/src/definition/model/properties/properties-definition-validator.js +0 -169
  21. package/src/definition/model/properties/properties-definition-validator.spec.js +0 -162
  22. package/src/definition/model/relations/index.js +0 -1
  23. package/src/definition/model/relations/relations-definition-validator.js +4 -5
  24. package/src/filter/include-clause-tool.js +8 -6
  25. package/src/index.js +0 -1
  26. package/src/relations/belongs-to-resolver.js +1 -2
  27. package/src/relations/belongs-to-resolver.spec.js +6 -3
  28. package/src/relations/has-many-resolver.js +1 -2
  29. package/src/relations/has-many-resolver.spec.js +6 -3
  30. package/src/relations/has-one-resolver.js +1 -2
  31. package/src/relations/has-one-resolver.spec.js +6 -3
  32. package/src/relations/references-many-resolver.js +1 -2
  33. package/src/relations/references-many-resolver.spec.js +6 -3
  34. package/src/repository/repository.js +1 -2
  35. package/src/utils/index.js +0 -4
  36. package/src/utils/is-plain-object.js +4 -4
  37. package/src/utils/model-name-to-model-key.js +0 -4
  38. package/src/utils/model-name-to-model-key.spec.js +0 -23
  39. package/src/adapter/adapter-loader.d.ts +0 -16
  40. package/src/adapter/adapter-registry.d.ts +0 -14
  41. package/src/adapter/adapter.d.ts +0 -155
  42. package/src/adapter/builtin/memory-adapter.d.ts +0 -148
  43. package/src/adapter/decorator/data-sanitizing-decorator.d.ts +0 -14
  44. package/src/adapter/decorator/data-transformation-decorator.d.ts +0 -14
  45. package/src/adapter/decorator/data-transformation-decorator.js +0 -54
  46. package/src/adapter/decorator/data-transformation-decorator.spec.js +0 -193
  47. package/src/adapter/decorator/data-validation-decorator.d.ts +0 -14
  48. package/src/adapter/decorator/data-validation-decorator.js +0 -54
  49. package/src/adapter/decorator/data-validation-decorator.spec.js +0 -105
  50. package/src/adapter/decorator/default-values-decorator.d.ts +0 -14
  51. package/src/adapter/decorator/fields-filtering-decorator.d.ts +0 -14
  52. package/src/adapter/decorator/inclusion-decorator.d.ts +0 -14
  53. package/src/adapter/decorator/index.d.ts +0 -7
  54. package/src/adapter/decorator/property-uniqueness-decorator.d.ts +0 -14
  55. package/src/adapter/index.d.ts +0 -3
  56. package/src/database-schema.d.ts +0 -37
  57. package/src/definition/datasource/datasource-definition-validator.d.ts +0 -14
  58. package/src/definition/datasource/datasource-definition.d.ts +0 -8
  59. package/src/definition/datasource/index.d.ts +0 -2
  60. package/src/definition/definition-registry.d.ts +0 -50
  61. package/src/definition/index.d.ts +0 -3
  62. package/src/definition/model/index.d.ts +0 -8
  63. package/src/definition/model/model-data-sanitizer.d.ts +0 -15
  64. package/src/definition/model/model-data-transformer.d.ts +0 -16
  65. package/src/definition/model/model-data-transformer.js +0 -170
  66. package/src/definition/model/model-data-transformer.spec.js +0 -2312
  67. package/src/definition/model/model-data-validator.d.ts +0 -16
  68. package/src/definition/model/model-data-validator.js +0 -318
  69. package/src/definition/model/model-data-validator.spec.js +0 -4528
  70. package/src/definition/model/model-definition-utils.d.ts +0 -180
  71. package/src/definition/model/model-definition-validator.d.ts +0 -14
  72. package/src/definition/model/model-definition.d.ts +0 -28
  73. package/src/definition/model/model-definition.js +0 -1
  74. package/src/definition/model/properties/data-type.d.ts +0 -16
  75. package/src/definition/model/properties/index.d.ts +0 -8
  76. package/src/definition/model/properties/primary-keys-definition-validator.d.ts +0 -15
  77. package/src/definition/model/properties/properties-definition-validator.d.ts +0 -15
  78. package/src/definition/model/properties/property-definition.d.ts +0 -27
  79. package/src/definition/model/properties/property-definition.js +0 -1
  80. package/src/definition/model/properties/property-transformer/builtin/index.d.ts +0 -3
  81. package/src/definition/model/properties/property-transformer/builtin/index.js +0 -3
  82. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.d.ts +0 -6
  83. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.js +0 -19
  84. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.spec.js +0 -39
  85. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.d.ts +0 -6
  86. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.js +0 -19
  87. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.spec.js +0 -39
  88. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.d.ts +0 -6
  89. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.js +0 -19
  90. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.spec.js +0 -39
  91. package/src/definition/model/properties/property-transformer/index.d.ts +0 -2
  92. package/src/definition/model/properties/property-transformer/index.js +0 -2
  93. package/src/definition/model/properties/property-transformer/property-transformer-registry.d.ts +0 -29
  94. package/src/definition/model/properties/property-transformer/property-transformer-registry.js +0 -76
  95. package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +0 -133
  96. package/src/definition/model/properties/property-transformer/property-transformer.d.ts +0 -27
  97. package/src/definition/model/properties/property-transformer/property-transformer.js +0 -1
  98. package/src/definition/model/properties/property-uniqueness-validator.d.ts +0 -31
  99. package/src/definition/model/properties/property-uniqueness.d.ts +0 -14
  100. package/src/definition/model/properties/property-validator/builtin/index.d.ts +0 -3
  101. package/src/definition/model/properties/property-validator/builtin/index.js +0 -3
  102. package/src/definition/model/properties/property-validator/builtin/max-length-validator.d.ts +0 -6
  103. package/src/definition/model/properties/property-validator/builtin/max-length-validator.js +0 -28
  104. package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +0 -100
  105. package/src/definition/model/properties/property-validator/builtin/min-length-validator.d.ts +0 -6
  106. package/src/definition/model/properties/property-validator/builtin/min-length-validator.js +0 -28
  107. package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +0 -100
  108. package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +0 -6
  109. package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +0 -30
  110. package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +0 -102
  111. package/src/definition/model/properties/property-validator/index.d.ts +0 -2
  112. package/src/definition/model/properties/property-validator/index.js +0 -2
  113. package/src/definition/model/properties/property-validator/property-validator-registry.d.ts +0 -29
  114. package/src/definition/model/properties/property-validator/property-validator-registry.js +0 -76
  115. package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +0 -132
  116. package/src/definition/model/properties/property-validator/property-validator.d.ts +0 -25
  117. package/src/definition/model/properties/property-validator/property-validator.js +0 -1
  118. package/src/definition/model/relations/index.d.ts +0 -3
  119. package/src/definition/model/relations/relation-definition.d.ts +0 -236
  120. package/src/definition/model/relations/relation-definition.js +0 -1
  121. package/src/definition/model/relations/relation-type.d.ts +0 -14
  122. package/src/definition/model/relations/relations-definition-validator.d.ts +0 -15
  123. package/src/errors/index.d.ts +0 -3
  124. package/src/errors/invalid-argument-error.d.ts +0 -6
  125. package/src/errors/invalid-operator-value-error.d.ts +0 -13
  126. package/src/errors/not-implemented-error.d.ts +0 -6
  127. package/src/filter/fields-clause-tool.d.ts +0 -38
  128. package/src/filter/filter-clause.d.ts +0 -348
  129. package/src/filter/include-clause-tool.d.ts +0 -55
  130. package/src/filter/index.d.ts +0 -7
  131. package/src/filter/operator-clause-tool.d.ts +0 -224
  132. package/src/filter/order-clause-tool.d.ts +0 -32
  133. package/src/filter/slice-clause-tool.d.ts +0 -30
  134. package/src/filter/where-clause-tool.d.ts +0 -23
  135. package/src/index.d.ts +0 -9
  136. package/src/relations/belongs-to-resolver.d.ts +0 -46
  137. package/src/relations/has-many-resolver.d.ts +0 -67
  138. package/src/relations/has-one-resolver.d.ts +0 -67
  139. package/src/relations/index.d.ts +0 -4
  140. package/src/relations/references-many-resolver.d.ts +0 -27
  141. package/src/repository/index.d.ts +0 -2
  142. package/src/repository/repository-registry.d.ts +0 -29
  143. package/src/repository/repository.d.ts +0 -183
  144. package/src/types.d.ts +0 -43
  145. package/src/types.js +0 -1
  146. package/src/utils/capitalize.d.ts +0 -6
  147. package/src/utils/clone-deep.d.ts +0 -6
  148. package/src/utils/exclude-object-keys.d.ts +0 -10
  149. package/src/utils/get-ctor-name.d.ts +0 -6
  150. package/src/utils/get-ctor-name.js +0 -11
  151. package/src/utils/get-ctor-name.spec.js +0 -17
  152. package/src/utils/get-decorator-target-type.d.ts +0 -27
  153. package/src/utils/get-decorator-target-type.js +0 -63
  154. package/src/utils/get-decorator-target-type.spec.js +0 -80
  155. package/src/utils/get-value-by-path.d.ts +0 -12
  156. package/src/utils/index.d.ts +0 -16
  157. package/src/utils/is-ctor.d.ts +0 -8
  158. package/src/utils/is-ctor.js +0 -11
  159. package/src/utils/is-ctor.spec.js +0 -26
  160. package/src/utils/is-deep-equal.d.ts +0 -10
  161. package/src/utils/is-plain-object.d.ts +0 -6
  162. package/src/utils/is-promise.d.ts +0 -10
  163. package/src/utils/like-to-regexp.d.ts +0 -14
  164. package/src/utils/model-name-to-model-key.d.ts +0 -6
  165. package/src/utils/select-object-keys.d.ts +0 -10
  166. package/src/utils/singularize.d.ts +0 -6
  167. package/src/utils/string-to-regexp.d.ts +0 -10
  168. package/src/utils/transform-promise.d.ts +0 -13
  169. package/src/utils/transform-promise.js +0 -15
  170. package/src/utils/transform-promise.spec.js +0 -19
  171. 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
- }
@@ -1,3 +0,0 @@
1
- export * from './adapter.js';
2
- export * from './adapter-loader.js';
3
- export * from './adapter-registry.js';
@@ -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,8 +0,0 @@
1
- /**
2
- * Datasource definition.
3
- */
4
- export declare type DatasourceDefinition = {
5
- name: string;
6
- adapter: string;
7
- [option: string]: unknown;
8
- };
@@ -1,2 +0,0 @@
1
- export * from './datasource-definition.js';
2
- export * from './datasource-definition-validator.js';
@@ -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,3 +0,0 @@
1
- export * from './model/index.js';
2
- export * from './datasource/index.js';
3
- export * from './definition-registry.js';
@@ -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
- }