@e22m4u/js-repository 0.6.5 → 0.7.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 (82) hide show
  1. package/README.md +6 -532
  2. package/dist/cjs/index.cjs +125 -1140
  3. package/package.json +4 -4
  4. package/src/adapter/adapter.d.ts +2 -4
  5. package/src/adapter/adapter.js +2 -6
  6. package/src/adapter/adapter.spec.js +3 -15
  7. package/src/adapter/builtin/memory-adapter.js +41 -12
  8. package/src/adapter/builtin/memory-adapter.spec.js +47 -0
  9. package/src/adapter/decorator/index.d.ts +0 -2
  10. package/src/adapter/decorator/index.js +0 -2
  11. package/src/definition/model/index.d.ts +0 -2
  12. package/src/definition/model/index.js +0 -2
  13. package/src/definition/model/properties/index.d.ts +0 -2
  14. package/src/definition/model/properties/index.js +0 -2
  15. package/src/definition/model/properties/properties-definition-validator.js +0 -169
  16. package/src/definition/model/properties/properties-definition-validator.spec.js +0 -162
  17. package/src/definition/model/properties/property-definition.d.ts +1 -5
  18. package/src/utils/index.d.ts +0 -4
  19. package/src/utils/index.js +0 -4
  20. package/src/utils/model-name-to-model-key.js +0 -4
  21. package/src/utils/model-name-to-model-key.spec.js +0 -23
  22. package/tsconfig.json +2 -2
  23. package/src/adapter/decorator/data-transformation-decorator.d.ts +0 -14
  24. package/src/adapter/decorator/data-transformation-decorator.js +0 -54
  25. package/src/adapter/decorator/data-transformation-decorator.spec.js +0 -193
  26. package/src/adapter/decorator/data-validation-decorator.d.ts +0 -14
  27. package/src/adapter/decorator/data-validation-decorator.js +0 -54
  28. package/src/adapter/decorator/data-validation-decorator.spec.js +0 -105
  29. package/src/definition/model/model-data-transformer.d.ts +0 -16
  30. package/src/definition/model/model-data-transformer.js +0 -170
  31. package/src/definition/model/model-data-transformer.spec.js +0 -2312
  32. package/src/definition/model/model-data-validator.d.ts +0 -16
  33. package/src/definition/model/model-data-validator.js +0 -318
  34. package/src/definition/model/model-data-validator.spec.js +0 -4528
  35. package/src/definition/model/properties/property-transformer/builtin/index.d.ts +0 -3
  36. package/src/definition/model/properties/property-transformer/builtin/index.js +0 -3
  37. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.d.ts +0 -6
  38. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.js +0 -19
  39. package/src/definition/model/properties/property-transformer/builtin/to-lower-case-transformer.spec.js +0 -39
  40. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.d.ts +0 -6
  41. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.js +0 -19
  42. package/src/definition/model/properties/property-transformer/builtin/to-upper-case-transformer.spec.js +0 -39
  43. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.d.ts +0 -6
  44. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.js +0 -19
  45. package/src/definition/model/properties/property-transformer/builtin/trim-transformer.spec.js +0 -39
  46. package/src/definition/model/properties/property-transformer/index.d.ts +0 -2
  47. package/src/definition/model/properties/property-transformer/index.js +0 -2
  48. package/src/definition/model/properties/property-transformer/property-transformer-registry.d.ts +0 -29
  49. package/src/definition/model/properties/property-transformer/property-transformer-registry.js +0 -76
  50. package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +0 -133
  51. package/src/definition/model/properties/property-transformer/property-transformer.d.ts +0 -27
  52. package/src/definition/model/properties/property-transformer/property-transformer.js +0 -1
  53. package/src/definition/model/properties/property-validator/builtin/index.d.ts +0 -3
  54. package/src/definition/model/properties/property-validator/builtin/index.js +0 -3
  55. package/src/definition/model/properties/property-validator/builtin/max-length-validator.d.ts +0 -6
  56. package/src/definition/model/properties/property-validator/builtin/max-length-validator.js +0 -28
  57. package/src/definition/model/properties/property-validator/builtin/max-length-validator.spec.js +0 -100
  58. package/src/definition/model/properties/property-validator/builtin/min-length-validator.d.ts +0 -6
  59. package/src/definition/model/properties/property-validator/builtin/min-length-validator.js +0 -28
  60. package/src/definition/model/properties/property-validator/builtin/min-length-validator.spec.js +0 -100
  61. package/src/definition/model/properties/property-validator/builtin/regexp-validator.d.ts +0 -6
  62. package/src/definition/model/properties/property-validator/builtin/regexp-validator.js +0 -30
  63. package/src/definition/model/properties/property-validator/builtin/regexp-validator.spec.js +0 -102
  64. package/src/definition/model/properties/property-validator/index.d.ts +0 -2
  65. package/src/definition/model/properties/property-validator/index.js +0 -2
  66. package/src/definition/model/properties/property-validator/property-validator-registry.d.ts +0 -29
  67. package/src/definition/model/properties/property-validator/property-validator-registry.js +0 -76
  68. package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +0 -132
  69. package/src/definition/model/properties/property-validator/property-validator.d.ts +0 -25
  70. package/src/definition/model/properties/property-validator/property-validator.js +0 -1
  71. package/src/utils/get-ctor-name.d.ts +0 -6
  72. package/src/utils/get-ctor-name.js +0 -11
  73. package/src/utils/get-ctor-name.spec.js +0 -17
  74. package/src/utils/get-decorator-target-type.d.ts +0 -27
  75. package/src/utils/get-decorator-target-type.js +0 -63
  76. package/src/utils/get-decorator-target-type.spec.js +0 -80
  77. package/src/utils/is-ctor.d.ts +0 -8
  78. package/src/utils/is-ctor.js +0 -11
  79. package/src/utils/is-ctor.spec.js +0 -26
  80. package/src/utils/transform-promise.d.ts +0 -13
  81. package/src/utils/transform-promise.js +0 -15
  82. package/src/utils/transform-promise.spec.js +0 -19
@@ -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,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
- }