@e22m4u/js-repository 0.4.0 → 0.5.1
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 +569 -80
- package/dist/cjs/index.cjs +319 -270
- 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/decorator/data-sanitizing-decorator.js +1 -1
- package/src/adapter/decorator/data-transformation-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/adapter/decorator/property-uniqueness-decorator.js +1 -1
- package/src/definition/datasource/datasource-definition-validator.js +3 -3
- package/src/definition/datasource/datasource-definition-validator.spec.js +3 -3
- package/src/definition/model/model-data-sanitizer.js +2 -2
- package/src/definition/model/model-data-transformer.js +71 -13
- package/src/definition/model/model-data-transformer.spec.js +2073 -407
- package/src/definition/model/model-data-validator.js +125 -37
- package/src/definition/model/model-data-validator.spec.js +2138 -440
- package/src/definition/model/model-definition-utils.js +5 -5
- package/src/definition/model/model-definition-utils.spec.js +7 -7
- package/src/definition/model/model-definition-validator.js +7 -7
- package/src/definition/model/model-definition-validator.spec.js +10 -7
- package/src/definition/model/properties/properties-definition-validator.js +129 -54
- package/src/definition/model/properties/properties-definition-validator.spec.js +85 -25
- package/src/definition/model/properties/property-definition.d.ts +3 -3
- package/src/definition/model/properties/property-transformer/builtin/index.d.ts +0 -1
- package/src/definition/model/properties/property-transformer/builtin/index.js +0 -1
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.d.ts +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.spec.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.d.ts +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.spec.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.js +1 -1
- package/src/definition/model/properties/property-transformer/builtin/trim-transformer.spec.js +1 -1
- package/src/definition/model/properties/property-transformer/property-transformer-registry.js +2 -4
- package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +2 -4
- package/src/definition/model/properties/property-transformer/property-transformer.d.ts +2 -2
- package/src/definition/model/properties/property-uniqueness-validator.js +4 -4
- package/src/definition/model/properties/property-uniqueness-validator.spec.js +4 -4
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.d.ts +1 -1
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.d.ts +1 -1
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +1 -1
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +2 -2
- package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +2 -2
- package/src/definition/model/properties/property-validator/property-validator-registry.js +2 -2
- package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +2 -2
- package/src/definition/model/properties/property-validator/property-validator.d.ts +2 -2
- package/src/definition/model/relations/relation-definition.d.ts +21 -21
- package/src/definition/model/relations/relations-definition-validator.js +23 -23
- package/src/definition/model/relations/relations-definition-validator.spec.js +24 -24
- package/src/errors/invalid-operator-value-error.js +1 -1
- package/src/errors/invalid-operator-value-error.spec.js +1 -1
- package/src/filter/fields-clause-tool.js +5 -5
- package/src/filter/fields-clause-tool.spec.js +16 -16
- package/src/filter/include-clause-tool.js +6 -6
- package/src/filter/include-clause-tool.spec.js +2 -2
- package/src/filter/operator-clause-tool.js +13 -13
- package/src/filter/operator-clause-tool.spec.js +13 -13
- package/src/filter/order-clause-tool.js +3 -3
- package/src/filter/order-clause-tool.spec.js +4 -4
- package/src/filter/slice-clause-tool.js +5 -5
- package/src/filter/slice-clause-tool.spec.js +5 -5
- package/src/filter/where-clause-tool.js +4 -4
- package/src/filter/where-clause-tool.spec.js +3 -3
- package/src/relations/belongs-to-resolver.js +14 -14
- package/src/relations/belongs-to-resolver.spec.js +14 -14
- package/src/relations/has-many-resolver.js +22 -22
- package/src/relations/has-many-resolver.spec.js +23 -23
- package/src/relations/has-one-resolver.js +22 -22
- package/src/relations/has-one-resolver.spec.js +23 -23
- package/src/relations/references-many-resolver.js +7 -7
- package/src/relations/references-many-resolver.spec.js +7 -7
- package/src/repository/repository-registry.js +1 -1
- package/src/utils/exclude-object-keys.js +1 -1
- package/src/utils/exclude-object-keys.spec.js +1 -1
- package/src/utils/model-name-to-model-key.js +1 -1
- package/src/utils/model-name-to-model-key.spec.js +7 -7
- package/src/utils/select-object-keys.js +3 -3
- package/src/utils/select-object-keys.spec.js +3 -3
- package/src/definition/model/properties/property-transformer/builtin/to-title-case-transformer.d.ts +0 -6
- package/src/definition/model/properties/property-transformer/builtin/to-title-case-transformer.js +0 -22
- package/src/definition/model/properties/property-transformer/builtin/to-title-case-transformer.spec.js +0 -41
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@ export class AdapterLoader extends Service {
|
|
|
17
17
|
async loadByName(adapterName, settings = undefined) {
|
|
18
18
|
if (!adapterName || typeof adapterName !== 'string')
|
|
19
19
|
throw new InvalidArgumentError(
|
|
20
|
-
'The adapter name should be a non-empty String, but %v given.',
|
|
20
|
+
'The adapter name should be a non-empty String, but %v was given.',
|
|
21
21
|
adapterName,
|
|
22
22
|
);
|
|
23
23
|
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 should be a non-empty String, but "" given.',
|
|
12
|
+
'The adapter name should be a non-empty String, but "" was given.',
|
|
13
13
|
);
|
|
14
14
|
});
|
|
15
15
|
|
|
@@ -16,7 +16,7 @@ export class DataSanitizingDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of DataSanitizingDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
|
|
@@ -16,7 +16,7 @@ export class DataTransformationDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of DataTransformerDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
const transformer = this.getService(ModelDataTransformer);
|
|
@@ -16,7 +16,7 @@ export class DataValidationDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of DataValidationDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
const validator = this.getService(ModelDataValidator);
|
|
@@ -16,7 +16,7 @@ export class DefaultValuesDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of DefaultValuesDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
|
|
@@ -16,7 +16,7 @@ export class FieldsFilteringDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of FieldsFilteringDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
|
|
@@ -16,7 +16,7 @@ export class InclusionDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of InclusionDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
|
|
@@ -16,7 +16,7 @@ export class PropertyUniquenessDecorator extends Service {
|
|
|
16
16
|
if (!adapter || !(adapter instanceof Adapter))
|
|
17
17
|
throw new InvalidArgumentError(
|
|
18
18
|
'The first argument of PropertyUniquenessDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v given.',
|
|
19
|
+
'an Adapter instance, but %v was given.',
|
|
20
20
|
adapter,
|
|
21
21
|
);
|
|
22
22
|
const validator = this.getService(PropertyUniquenessValidator);
|
|
@@ -13,19 +13,19 @@ export class DatasourceDefinitionValidator extends Service {
|
|
|
13
13
|
validate(datasourceDef) {
|
|
14
14
|
if (!datasourceDef || typeof datasourceDef !== 'object')
|
|
15
15
|
throw new InvalidArgumentError(
|
|
16
|
-
'The datasource definition should be an Object, but %v given.',
|
|
16
|
+
'The datasource definition should be an Object, but %v was given.',
|
|
17
17
|
datasourceDef,
|
|
18
18
|
);
|
|
19
19
|
if (!datasourceDef.name || typeof datasourceDef.name !== 'string')
|
|
20
20
|
throw new InvalidArgumentError(
|
|
21
21
|
'The datasource definition requires the option "name" ' +
|
|
22
|
-
'as a non-empty String, but %v given.',
|
|
22
|
+
'as a non-empty String, but %v was given.',
|
|
23
23
|
datasourceDef.name,
|
|
24
24
|
);
|
|
25
25
|
if (!datasourceDef.adapter || typeof datasourceDef.adapter !== 'string')
|
|
26
26
|
throw new InvalidArgumentError(
|
|
27
27
|
'The datasource %v requires the option "adapter" ' +
|
|
28
|
-
'as a non-empty String, but %v given.',
|
|
28
|
+
'as a non-empty String, but %v was given.',
|
|
29
29
|
datasourceDef.name,
|
|
30
30
|
datasourceDef.adapter,
|
|
31
31
|
);
|
|
@@ -10,7 +10,7 @@ describe('DatasourceDefinitionValidator', function () {
|
|
|
10
10
|
const validate = v => () => S.validate(v);
|
|
11
11
|
const error = v =>
|
|
12
12
|
format(
|
|
13
|
-
'The datasource definition should be an Object, but %s given.',
|
|
13
|
+
'The datasource definition should be an Object, but %s was given.',
|
|
14
14
|
v,
|
|
15
15
|
);
|
|
16
16
|
expect(validate('str')).to.throw(error('"str"'));
|
|
@@ -27,7 +27,7 @@ describe('DatasourceDefinitionValidator', function () {
|
|
|
27
27
|
const error = v =>
|
|
28
28
|
format(
|
|
29
29
|
'The datasource definition requires the option "name" ' +
|
|
30
|
-
'as a non-empty String, but %s given.',
|
|
30
|
+
'as a non-empty String, but %s was given.',
|
|
31
31
|
v,
|
|
32
32
|
);
|
|
33
33
|
expect(validate('')).to.throw(error('""'));
|
|
@@ -46,7 +46,7 @@ describe('DatasourceDefinitionValidator', function () {
|
|
|
46
46
|
const error = v =>
|
|
47
47
|
format(
|
|
48
48
|
'The datasource "datasource" requires the option "adapter" ' +
|
|
49
|
-
'as a non-empty String, but %s given.',
|
|
49
|
+
'as a non-empty String, but %s was given.',
|
|
50
50
|
v,
|
|
51
51
|
);
|
|
52
52
|
expect(validate('')).to.throw(error('""'));
|
|
@@ -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
|
-
'should be a string, but %v given.',
|
|
20
|
+
'should be a string, but %v was 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
|
-
'should be an Object, but %v given.',
|
|
26
|
+
'should be an Object, but %v was given.',
|
|
27
27
|
modelData,
|
|
28
28
|
);
|
|
29
29
|
return this.getService(
|
|
@@ -22,7 +22,7 @@ export class ModelDataTransformer extends Service {
|
|
|
22
22
|
transform(modelName, modelData, isPartial = false) {
|
|
23
23
|
if (!isPureObject(modelData))
|
|
24
24
|
throw new InvalidArgumentError(
|
|
25
|
-
'The data of the model %v should be an Object, but %v given.',
|
|
25
|
+
'The data of the model %v should be an Object, but %v was given.',
|
|
26
26
|
modelName,
|
|
27
27
|
modelData,
|
|
28
28
|
);
|
|
@@ -64,7 +64,7 @@ export class ModelDataTransformer extends Service {
|
|
|
64
64
|
* @param {string} propName
|
|
65
65
|
* @param {string|object} propDef
|
|
66
66
|
* @param {*} propValue
|
|
67
|
-
* @returns {
|
|
67
|
+
* @returns {*|Promise<*>}
|
|
68
68
|
*/
|
|
69
69
|
_transformPropertyValue(modelName, propName, propDef, propValue) {
|
|
70
70
|
if (typeof propDef === 'string' || propDef.transform == null)
|
|
@@ -73,22 +73,76 @@ export class ModelDataTransformer extends Service {
|
|
|
73
73
|
const transformerRegistry = this.getService(PropertyTransformerRegistry);
|
|
74
74
|
const transformFn = (
|
|
75
75
|
value,
|
|
76
|
-
|
|
76
|
+
transformerOrName,
|
|
77
77
|
transformerOptions = undefined,
|
|
78
78
|
) => {
|
|
79
|
-
|
|
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
|
+
}
|
|
80
105
|
const context = {transformerName, modelName, propName};
|
|
81
|
-
return
|
|
106
|
+
return transformerFn(value, transformerOptions, context);
|
|
82
107
|
};
|
|
108
|
+
// если значением опции "transform" является строка,
|
|
109
|
+
// то строка воспринимается как название трансформера
|
|
83
110
|
if (transformDef && typeof transformDef === 'string') {
|
|
84
111
|
return transformFn(propValue, transformDef);
|
|
85
|
-
}
|
|
86
|
-
|
|
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
|
+
}
|
|
87
137
|
return transformPromise(valueOrPromise, value => {
|
|
88
|
-
return transformFn(value,
|
|
138
|
+
return transformFn(value, transformerOrName);
|
|
89
139
|
});
|
|
90
140
|
}, propValue);
|
|
91
|
-
}
|
|
141
|
+
}
|
|
142
|
+
// если значение опции "transform" является объектом,
|
|
143
|
+
// то ключи объекта воспринимаются как названия трансформеров,
|
|
144
|
+
// а их значения аргументами
|
|
145
|
+
else if (transformDef !== null && typeof transformDef === 'object') {
|
|
92
146
|
return Object.keys(transformDef).reduce(
|
|
93
147
|
(valueOrPromise, transformerName) => {
|
|
94
148
|
const transformerOptions = transformDef[transformerName];
|
|
@@ -98,11 +152,15 @@ export class ModelDataTransformer extends Service {
|
|
|
98
152
|
},
|
|
99
153
|
propValue,
|
|
100
154
|
);
|
|
101
|
-
}
|
|
155
|
+
}
|
|
156
|
+
// если значение опции "transform" не является строкой,
|
|
157
|
+
// функцией и массивом, то выбрасывается ошибка
|
|
158
|
+
else {
|
|
102
159
|
throw new InvalidArgumentError(
|
|
103
|
-
'The provided option "transform"
|
|
104
|
-
'should be a
|
|
105
|
-
'
|
|
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.',
|
|
106
164
|
propName,
|
|
107
165
|
modelName,
|
|
108
166
|
transformDef,
|