@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.
- package/README.md +6 -532
- package/dist/cjs/index.cjs +125 -1140
- package/package.json +4 -4
- package/src/adapter/adapter.d.ts +2 -4
- package/src/adapter/adapter.js +2 -6
- package/src/adapter/adapter.spec.js +3 -15
- package/src/adapter/builtin/memory-adapter.js +41 -12
- package/src/adapter/builtin/memory-adapter.spec.js +47 -0
- package/src/adapter/decorator/index.d.ts +0 -2
- package/src/adapter/decorator/index.js +0 -2
- package/src/definition/model/index.d.ts +0 -2
- package/src/definition/model/index.js +0 -2
- package/src/definition/model/properties/index.d.ts +0 -2
- package/src/definition/model/properties/index.js +0 -2
- 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/properties/property-definition.d.ts +1 -5
- package/src/utils/index.d.ts +0 -4
- package/src/utils/index.js +0 -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/tsconfig.json +2 -2
- 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/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/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-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/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/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/transform-promise.d.ts +0 -13
- package/src/utils/transform-promise.js +0 -15
- package/src/utils/transform-promise.spec.js +0 -19
|
@@ -3,20 +3,12 @@ import {chai} from '../../../chai.js';
|
|
|
3
3
|
import {DataType} from './data-type.js';
|
|
4
4
|
import {format} from '@e22m4u/js-format';
|
|
5
5
|
import {PropertyUniqueness} from './property-uniqueness.js';
|
|
6
|
-
import {PropertyValidatorRegistry} from './property-validator/index.js';
|
|
7
|
-
import {PropertyTransformerRegistry} from './property-transformer/index.js';
|
|
8
6
|
import {PropertiesDefinitionValidator} from './properties-definition-validator.js';
|
|
9
7
|
import {PrimaryKeysDefinitionValidator} from './primary-keys-definition-validator.js';
|
|
10
8
|
|
|
11
9
|
const S = new PropertiesDefinitionValidator();
|
|
12
10
|
const sandbox = chai.spy.sandbox();
|
|
13
11
|
|
|
14
|
-
S.getService(PropertyValidatorRegistry).addValidator('myValidator', () => true);
|
|
15
|
-
S.getService(PropertyTransformerRegistry).addTransformer(
|
|
16
|
-
'myTransformer',
|
|
17
|
-
() => true,
|
|
18
|
-
);
|
|
19
|
-
|
|
20
12
|
describe('PropertiesDefinitionValidator', function () {
|
|
21
13
|
afterEach(function () {
|
|
22
14
|
sandbox.restore();
|
|
@@ -426,160 +418,6 @@ describe('PropertiesDefinitionValidator', function () {
|
|
|
426
418
|
expect(V.validate).to.have.been.called.with.exactly('model', propDefs);
|
|
427
419
|
});
|
|
428
420
|
|
|
429
|
-
it('the option "validate" should have a non-empty String, a Function, an Array or an Object', function () {
|
|
430
|
-
const validate = v => () => {
|
|
431
|
-
const foo = {
|
|
432
|
-
type: DataType.ANY,
|
|
433
|
-
validate: v,
|
|
434
|
-
};
|
|
435
|
-
S.validate('model', {foo});
|
|
436
|
-
};
|
|
437
|
-
const error = v =>
|
|
438
|
-
format(
|
|
439
|
-
'The provided option "validate" for the property "foo" in the model "model" ' +
|
|
440
|
-
'should be either a validator name, a validator function, an array ' +
|
|
441
|
-
'of validator names or functions, or an object mapping validator ' +
|
|
442
|
-
'names to their arguments, but %s was given.',
|
|
443
|
-
v,
|
|
444
|
-
);
|
|
445
|
-
expect(validate('')).to.throw(error('""'));
|
|
446
|
-
expect(validate(10)).to.throw(error('10'));
|
|
447
|
-
expect(validate(0)).to.throw(error('0'));
|
|
448
|
-
expect(validate(true)).to.throw(error('true'));
|
|
449
|
-
expect(validate(false)).to.throw(error('false'));
|
|
450
|
-
validate('myValidator')();
|
|
451
|
-
validate(() => true)();
|
|
452
|
-
validate(['myValidator'])();
|
|
453
|
-
validate([() => true])();
|
|
454
|
-
validate([])();
|
|
455
|
-
validate({myValidator: true})();
|
|
456
|
-
validate({})();
|
|
457
|
-
validate(null)();
|
|
458
|
-
validate(undefined)();
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
it('the option "validate" with an Array value requires elements to be a non-empty String or a Function', function () {
|
|
462
|
-
const validate = v => () => {
|
|
463
|
-
const foo = {
|
|
464
|
-
type: DataType.ANY,
|
|
465
|
-
validate: [v],
|
|
466
|
-
};
|
|
467
|
-
S.validate('model', {foo});
|
|
468
|
-
};
|
|
469
|
-
const error = v =>
|
|
470
|
-
format(
|
|
471
|
-
'The provided option "validate" for the property "foo" in the model "model" ' +
|
|
472
|
-
'has an Array value that should contain validator names or validator functions, ' +
|
|
473
|
-
'but %s was given.',
|
|
474
|
-
v,
|
|
475
|
-
);
|
|
476
|
-
expect(validate('')).to.throw(error('""'));
|
|
477
|
-
expect(validate(10)).to.throw(error('10'));
|
|
478
|
-
expect(validate(0)).to.throw(error('0'));
|
|
479
|
-
expect(validate(true)).to.throw(error('true'));
|
|
480
|
-
expect(validate(false)).to.throw(error('false'));
|
|
481
|
-
expect(validate([1, 2, 3])).to.throw(error('Array'));
|
|
482
|
-
expect(validate({foo: 'bar'})).to.throw(error('Object'));
|
|
483
|
-
expect(validate(null)).to.throw(error('null'));
|
|
484
|
-
expect(validate(undefined)).to.throw(error('undefined'));
|
|
485
|
-
validate('myValidator')();
|
|
486
|
-
validate(() => true)();
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
it('the option "validate" requires only existing validator names', function () {
|
|
490
|
-
const validate = v => () => {
|
|
491
|
-
const foo = {
|
|
492
|
-
type: DataType.ANY,
|
|
493
|
-
validate: v,
|
|
494
|
-
};
|
|
495
|
-
S.validate('model', {foo});
|
|
496
|
-
};
|
|
497
|
-
const error = v => format('The property validator %s is not found.', v);
|
|
498
|
-
expect(validate('unknown')).to.throw(error('"unknown"'));
|
|
499
|
-
expect(validate({unknown: true})).to.throw(error('"unknown"'));
|
|
500
|
-
expect(validate(['unknown'])).to.throw(error('"unknown"'));
|
|
501
|
-
validate('myValidator')();
|
|
502
|
-
validate(['myValidator'])();
|
|
503
|
-
validate({myValidator: true})();
|
|
504
|
-
});
|
|
505
|
-
|
|
506
|
-
it('the option "transform" should have a non-empty String, a Function, an Array or an Object', function () {
|
|
507
|
-
const validate = v => () => {
|
|
508
|
-
const foo = {
|
|
509
|
-
type: DataType.ANY,
|
|
510
|
-
transform: v,
|
|
511
|
-
};
|
|
512
|
-
S.validate('model', {foo});
|
|
513
|
-
};
|
|
514
|
-
const error = v =>
|
|
515
|
-
format(
|
|
516
|
-
'The provided option "transform" for the property "foo" in the model "model" ' +
|
|
517
|
-
'should be either a transformer name, a transformer function, an array ' +
|
|
518
|
-
'of transformer names or functions, or an object mapping transformer ' +
|
|
519
|
-
'names to their arguments, but %s was given.',
|
|
520
|
-
v,
|
|
521
|
-
);
|
|
522
|
-
expect(validate('')).to.throw(error('""'));
|
|
523
|
-
expect(validate(10)).to.throw(error('10'));
|
|
524
|
-
expect(validate(0)).to.throw(error('0'));
|
|
525
|
-
expect(validate(true)).to.throw(error('true'));
|
|
526
|
-
expect(validate(false)).to.throw(error('false'));
|
|
527
|
-
validate('myTransformer')();
|
|
528
|
-
validate(v => v)();
|
|
529
|
-
validate(['myTransformer'])();
|
|
530
|
-
validate([v => v])();
|
|
531
|
-
validate([])();
|
|
532
|
-
validate({myTransformer: true})();
|
|
533
|
-
validate({})();
|
|
534
|
-
validate(null)();
|
|
535
|
-
validate(undefined)();
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
it('the option "transform" with an Array value requires elements to be a non-empty String or a Function', function () {
|
|
539
|
-
const validate = v => () => {
|
|
540
|
-
const foo = {
|
|
541
|
-
type: DataType.ANY,
|
|
542
|
-
transform: [v],
|
|
543
|
-
};
|
|
544
|
-
S.validate('model', {foo});
|
|
545
|
-
};
|
|
546
|
-
const error = v =>
|
|
547
|
-
format(
|
|
548
|
-
'The provided option "transform" for the property "foo" in the model "model" ' +
|
|
549
|
-
'has an Array value that should contain transformer names or transformer functions, ' +
|
|
550
|
-
'but %s was given.',
|
|
551
|
-
v,
|
|
552
|
-
);
|
|
553
|
-
expect(validate('')).to.throw(error('""'));
|
|
554
|
-
expect(validate(10)).to.throw(error('10'));
|
|
555
|
-
expect(validate(0)).to.throw(error('0'));
|
|
556
|
-
expect(validate(true)).to.throw(error('true'));
|
|
557
|
-
expect(validate(false)).to.throw(error('false'));
|
|
558
|
-
expect(validate([1, 2, 3])).to.throw(error('Array'));
|
|
559
|
-
expect(validate({foo: 'bar'})).to.throw(error('Object'));
|
|
560
|
-
expect(validate(null)).to.throw(error('null'));
|
|
561
|
-
expect(validate(undefined)).to.throw(error('undefined'));
|
|
562
|
-
validate('myTransformer')();
|
|
563
|
-
validate(v => v)();
|
|
564
|
-
});
|
|
565
|
-
|
|
566
|
-
it('the option "transform" requires only existing transformer names', function () {
|
|
567
|
-
const validate = v => () => {
|
|
568
|
-
const foo = {
|
|
569
|
-
type: DataType.ANY,
|
|
570
|
-
transform: v,
|
|
571
|
-
};
|
|
572
|
-
S.validate('model', {foo});
|
|
573
|
-
};
|
|
574
|
-
const error = v => format('The property transformer %s is not found.', v);
|
|
575
|
-
expect(validate('unknown')).to.throw(error('"unknown"'));
|
|
576
|
-
expect(validate({unknown: true})).to.throw(error('"unknown"'));
|
|
577
|
-
expect(validate(['unknown'])).to.throw(error('"unknown"'));
|
|
578
|
-
validate('myTransformer')();
|
|
579
|
-
validate(['myTransformer'])();
|
|
580
|
-
validate({myTransformer: true})();
|
|
581
|
-
});
|
|
582
|
-
|
|
583
421
|
it('expects the provided option "unique" to be a Boolean or the PropertyUniqueness', function () {
|
|
584
422
|
const validate = v => {
|
|
585
423
|
const foo = {
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import {DataType} from './data-type.js';
|
|
2
2
|
import {PropertyUniqueness} from './property-uniqueness.js';
|
|
3
|
-
import {PropertyValidateOptions} from './property-validator/index.js';
|
|
4
|
-
import {PropertyTransformOptions} from './property-transformer/index.js';
|
|
5
3
|
|
|
6
4
|
/**
|
|
7
5
|
* Full property definition.
|
|
@@ -16,12 +14,10 @@ export declare type FullPropertyDefinition = {
|
|
|
16
14
|
columnType?: string;
|
|
17
15
|
required?: boolean;
|
|
18
16
|
default?: unknown;
|
|
19
|
-
validate?: PropertyValidateOptions;
|
|
20
|
-
transform?: PropertyTransformOptions;
|
|
21
17
|
unique?: boolean | PropertyUniqueness;
|
|
22
18
|
};
|
|
23
19
|
|
|
24
20
|
/**
|
|
25
21
|
* Property definition.
|
|
26
22
|
*/
|
|
27
|
-
declare type PropertyDefinition = DataType | FullPropertyDefinition;
|
|
23
|
+
export declare type PropertyDefinition = DataType | FullPropertyDefinition;
|
package/src/utils/index.d.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
export * from './is-ctor.js';
|
|
2
1
|
export * from './is-promise.js';
|
|
3
2
|
export * from './capitalize.js';
|
|
4
3
|
export * from './clone-deep.js';
|
|
5
4
|
export * from './singularize.js';
|
|
6
5
|
export * from './is-deep-equal.js';
|
|
7
|
-
export * from './get-ctor-name.js';
|
|
8
6
|
export * from './like-to-regexp.js';
|
|
9
7
|
export * from './is-plain-object.js';
|
|
10
8
|
export * from './string-to-regexp.js';
|
|
11
9
|
export * from './get-value-by-path.js';
|
|
12
|
-
export * from './transform-promise.js';
|
|
13
10
|
export * from './select-object-keys.js';
|
|
14
11
|
export * from './exclude-object-keys.js';
|
|
15
12
|
export * from './model-name-to-model-key.js';
|
|
16
|
-
export * from './get-decorator-target-type.js';
|
package/src/utils/index.js
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
export * from './is-ctor.js';
|
|
2
1
|
export * from './is-promise.js';
|
|
3
2
|
export * from './capitalize.js';
|
|
4
3
|
export * from './clone-deep.js';
|
|
5
4
|
export * from './singularize.js';
|
|
6
5
|
export * from './is-deep-equal.js';
|
|
7
|
-
export * from './get-ctor-name.js';
|
|
8
6
|
export * from './like-to-regexp.js';
|
|
9
7
|
export * from './is-plain-object.js';
|
|
10
8
|
export * from './string-to-regexp.js';
|
|
11
9
|
export * from './get-value-by-path.js';
|
|
12
|
-
export * from './transform-promise.js';
|
|
13
10
|
export * from './select-object-keys.js';
|
|
14
11
|
export * from './exclude-object-keys.js';
|
|
15
12
|
export * from './model-name-to-model-key.js';
|
|
16
|
-
export * from './get-decorator-target-type.js';
|
|
@@ -13,9 +13,5 @@ export function modelNameToModelKey(modelName) {
|
|
|
13
13
|
'without spaces, but %v was given.',
|
|
14
14
|
modelName,
|
|
15
15
|
);
|
|
16
|
-
if (modelName.toLowerCase() !== 'model')
|
|
17
|
-
modelName = modelName
|
|
18
|
-
.replace(/[-_]?Model$/, '')
|
|
19
|
-
.replace(/[-_](MODEL|model)$/, '');
|
|
20
16
|
return modelName.toLowerCase().replace(/[-_]/g, '');
|
|
21
17
|
}
|
|
@@ -36,29 +36,6 @@ describe('modelNameToModelKey', function () {
|
|
|
36
36
|
expect(modelNameToModelKey(modelName)).to.be.eq(expected);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
it('should remove the "model" word from a model name', function () {
|
|
40
|
-
const modelNames = [
|
|
41
|
-
'userProfileDetailsModel',
|
|
42
|
-
'UserProfileDetailsModel',
|
|
43
|
-
'user-profile-details-model',
|
|
44
|
-
'user_profile_details_model',
|
|
45
|
-
'User-Profile-Details-Model',
|
|
46
|
-
'User_Profile_Details_Model',
|
|
47
|
-
'USER-PROFILE-DETAILS-MODEL',
|
|
48
|
-
'USER_PROFILE_DETAILS_MODEL',
|
|
49
|
-
];
|
|
50
|
-
modelNames.forEach(v =>
|
|
51
|
-
expect(modelNameToModelKey(v)).to.be.eq('userprofiledetails'),
|
|
52
|
-
);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should not remove the "model" suffix as a part of last word in a model name', function () {
|
|
56
|
-
const exceptions = ['SUPERMODEL', 'supermodel'];
|
|
57
|
-
exceptions.forEach(v =>
|
|
58
|
-
expect(modelNameToModelKey(v)).to.be.eq('supermodel'),
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
39
|
it('should throw an error for an empty string', function () {
|
|
63
40
|
const throwable = () => modelNameToModelKey('');
|
|
64
41
|
expect(throwable).to.throw(
|
package/tsconfig.json
CHANGED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Adapter} from '../adapter.js';
|
|
2
|
-
import {Service} from '@e22m4u/js-service';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Data transformation decorator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class DataTransformationDecorator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Decorate.
|
|
10
|
-
*
|
|
11
|
-
* @param adapter
|
|
12
|
-
*/
|
|
13
|
-
decorate(adapter: Adapter): void;
|
|
14
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import {Adapter} from '../adapter.js';
|
|
2
|
-
import {Service} from '@e22m4u/js-service';
|
|
3
|
-
import {InvalidArgumentError} from '../../errors/index.js';
|
|
4
|
-
import {ModelDataTransformer} from '../../definition/index.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Data transformation decorator.
|
|
8
|
-
*/
|
|
9
|
-
export class DataTransformationDecorator extends Service {
|
|
10
|
-
/**
|
|
11
|
-
* Decorate.
|
|
12
|
-
*
|
|
13
|
-
* @param {Adapter} adapter
|
|
14
|
-
*/
|
|
15
|
-
decorate(adapter) {
|
|
16
|
-
if (!adapter || !(adapter instanceof Adapter))
|
|
17
|
-
throw new InvalidArgumentError(
|
|
18
|
-
'The first argument of DataTransformerDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v was given.',
|
|
20
|
-
adapter,
|
|
21
|
-
);
|
|
22
|
-
const transformer = this.getService(ModelDataTransformer);
|
|
23
|
-
|
|
24
|
-
const create = adapter.create;
|
|
25
|
-
adapter.create = async function (modelName, modelData, filter) {
|
|
26
|
-
modelData = await transformer.transform(modelName, modelData);
|
|
27
|
-
return create.call(this, modelName, modelData, filter);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const replaceById = adapter.replaceById;
|
|
31
|
-
adapter.replaceById = async function (modelName, id, modelData, filter) {
|
|
32
|
-
modelData = await transformer.transform(modelName, modelData);
|
|
33
|
-
return replaceById.call(this, modelName, id, modelData, filter);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const replaceOrCreate = adapter.replaceOrCreate;
|
|
37
|
-
adapter.replaceOrCreate = async function (modelName, modelData, filter) {
|
|
38
|
-
modelData = await transformer.transform(modelName, modelData);
|
|
39
|
-
return replaceOrCreate.call(this, modelName, modelData, filter);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const patch = adapter.patch;
|
|
43
|
-
adapter.patch = async function (modelName, modelData, where) {
|
|
44
|
-
modelData = await transformer.transform(modelName, modelData, true);
|
|
45
|
-
return patch.call(this, modelName, modelData, where);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const patchById = adapter.patchById;
|
|
49
|
-
adapter.patchById = async function (modelName, id, modelData, filter) {
|
|
50
|
-
modelData = await transformer.transform(modelName, modelData, true);
|
|
51
|
-
return patchById.call(this, modelName, id, modelData, filter);
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
@@ -1,193 +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 {ModelDataTransformer} from '../../definition/index.js';
|
|
6
|
-
|
|
7
|
-
const MODEL_NAME = 'myModel';
|
|
8
|
-
const MODEL_DATA = {kind: 'modelData'};
|
|
9
|
-
const TRANSFORMED_DATA = {kind: 'transformedData'};
|
|
10
|
-
const WHERE_CLAUSE = {kind: {existed: true}};
|
|
11
|
-
const FILTER_CLAUSE = {where: WHERE_CLAUSE};
|
|
12
|
-
const DUMMY_ID = 1;
|
|
13
|
-
|
|
14
|
-
class TestAdapter extends Adapter {
|
|
15
|
-
create(modelName, modelData, filter = undefined) {
|
|
16
|
-
expect(modelName).to.be.eq(MODEL_NAME);
|
|
17
|
-
expect(modelData).to.be.eql(TRANSFORMED_DATA);
|
|
18
|
-
expect(filter).to.be.eql(FILTER_CLAUSE);
|
|
19
|
-
return Promise.resolve(modelData);
|
|
20
|
-
}
|
|
21
|
-
replaceById(modelName, id, modelData, filter = undefined) {
|
|
22
|
-
expect(modelName).to.be.eq(MODEL_NAME);
|
|
23
|
-
expect(id).to.be.eq(DUMMY_ID);
|
|
24
|
-
expect(modelData).to.be.eql(TRANSFORMED_DATA);
|
|
25
|
-
expect(filter).to.be.eql(FILTER_CLAUSE);
|
|
26
|
-
return Promise.resolve(modelData);
|
|
27
|
-
}
|
|
28
|
-
replaceOrCreate(modelName, modelData, filter = undefined) {
|
|
29
|
-
expect(modelName).to.be.eq(MODEL_NAME);
|
|
30
|
-
expect(modelData).to.be.eql(TRANSFORMED_DATA);
|
|
31
|
-
expect(filter).to.be.eql(FILTER_CLAUSE);
|
|
32
|
-
return Promise.resolve(modelData);
|
|
33
|
-
}
|
|
34
|
-
patch(modelName, modelData, where = undefined) {
|
|
35
|
-
expect(modelName).to.be.eq(MODEL_NAME);
|
|
36
|
-
expect(modelData).to.be.eql(TRANSFORMED_DATA);
|
|
37
|
-
expect(where).to.be.eql(WHERE_CLAUSE);
|
|
38
|
-
return Promise.resolve(modelData);
|
|
39
|
-
}
|
|
40
|
-
patchById(modelName, id, modelData, filter = undefined) {
|
|
41
|
-
expect(modelName).to.be.eq(MODEL_NAME);
|
|
42
|
-
expect(id).to.be.eq(DUMMY_ID);
|
|
43
|
-
expect(modelData).to.be.eql(TRANSFORMED_DATA);
|
|
44
|
-
expect(filter).to.be.eql(FILTER_CLAUSE);
|
|
45
|
-
return Promise.resolve(modelData);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const dbs = new DatabaseSchema();
|
|
50
|
-
dbs.defineModel({name: MODEL_NAME});
|
|
51
|
-
const A = dbs.getService(TestAdapter);
|
|
52
|
-
const T = dbs.getService(ModelDataTransformer);
|
|
53
|
-
const sandbox = chai.spy.sandbox();
|
|
54
|
-
|
|
55
|
-
describe('DataTransformationDecorator', function () {
|
|
56
|
-
afterEach(function () {
|
|
57
|
-
sandbox.restore();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
describe('overrides the "create" method', function () {
|
|
61
|
-
it('transforms the given data', async function () {
|
|
62
|
-
sandbox.on(T, 'transform', () => TRANSFORMED_DATA);
|
|
63
|
-
const res = await A.create(MODEL_NAME, MODEL_DATA, FILTER_CLAUSE);
|
|
64
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
65
|
-
expect(T.transform).to.be.called.once;
|
|
66
|
-
expect(T.transform).to.be.called.with.exactly(MODEL_NAME, MODEL_DATA);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('resolves the transformation promise', async function () {
|
|
70
|
-
sandbox.on(T, 'transform', () => Promise.resolve(TRANSFORMED_DATA));
|
|
71
|
-
const res = await A.create(MODEL_NAME, MODEL_DATA, FILTER_CLAUSE);
|
|
72
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
73
|
-
expect(T.transform).to.be.called.once;
|
|
74
|
-
expect(T.transform).to.be.called.with.exactly(MODEL_NAME, MODEL_DATA);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
describe('overrides the "replaceById" method', function () {
|
|
79
|
-
it('transforms the given data', async function () {
|
|
80
|
-
sandbox.on(T, 'transform', () => TRANSFORMED_DATA);
|
|
81
|
-
const res = await A.replaceById(
|
|
82
|
-
MODEL_NAME,
|
|
83
|
-
DUMMY_ID,
|
|
84
|
-
MODEL_DATA,
|
|
85
|
-
FILTER_CLAUSE,
|
|
86
|
-
);
|
|
87
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
88
|
-
expect(T.transform).to.be.called.once;
|
|
89
|
-
expect(T.transform).to.be.called.with.exactly(MODEL_NAME, MODEL_DATA);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('resolves the transformation promise', async function () {
|
|
93
|
-
sandbox.on(T, 'transform', () => Promise.resolve(TRANSFORMED_DATA));
|
|
94
|
-
const res = await A.replaceById(
|
|
95
|
-
MODEL_NAME,
|
|
96
|
-
DUMMY_ID,
|
|
97
|
-
MODEL_DATA,
|
|
98
|
-
FILTER_CLAUSE,
|
|
99
|
-
);
|
|
100
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
101
|
-
expect(T.transform).to.be.called.once;
|
|
102
|
-
expect(T.transform).to.be.called.with.exactly(MODEL_NAME, MODEL_DATA);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe('overrides the "replaceOrCreate" method', function () {
|
|
107
|
-
it('transforms the given data', async function () {
|
|
108
|
-
sandbox.on(T, 'transform', () => TRANSFORMED_DATA);
|
|
109
|
-
const res = await A.replaceOrCreate(
|
|
110
|
-
MODEL_NAME,
|
|
111
|
-
MODEL_DATA,
|
|
112
|
-
FILTER_CLAUSE,
|
|
113
|
-
);
|
|
114
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
115
|
-
expect(T.transform).to.be.called.once;
|
|
116
|
-
expect(T.transform).to.be.called.with.exactly(MODEL_NAME, MODEL_DATA);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it('resolves the transformation promise', async function () {
|
|
120
|
-
sandbox.on(T, 'transform', () => Promise.resolve(TRANSFORMED_DATA));
|
|
121
|
-
const res = await A.replaceOrCreate(
|
|
122
|
-
MODEL_NAME,
|
|
123
|
-
MODEL_DATA,
|
|
124
|
-
FILTER_CLAUSE,
|
|
125
|
-
);
|
|
126
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
127
|
-
expect(T.transform).to.be.called.once;
|
|
128
|
-
expect(T.transform).to.be.called.with.exactly(MODEL_NAME, MODEL_DATA);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
describe('overrides the "patch" method', function () {
|
|
133
|
-
it('transforms the given data', async function () {
|
|
134
|
-
sandbox.on(T, 'transform', () => TRANSFORMED_DATA);
|
|
135
|
-
const res = await A.patch(MODEL_NAME, MODEL_DATA, WHERE_CLAUSE);
|
|
136
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
137
|
-
expect(T.transform).to.be.called.once;
|
|
138
|
-
expect(T.transform).to.be.called.with.exactly(
|
|
139
|
-
MODEL_NAME,
|
|
140
|
-
MODEL_DATA,
|
|
141
|
-
true,
|
|
142
|
-
);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it('resolves the transformation promise', async function () {
|
|
146
|
-
sandbox.on(T, 'transform', () => Promise.resolve(TRANSFORMED_DATA));
|
|
147
|
-
const res = await A.patch(MODEL_NAME, MODEL_DATA, WHERE_CLAUSE);
|
|
148
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
149
|
-
expect(T.transform).to.be.called.once;
|
|
150
|
-
expect(T.transform).to.be.called.with.exactly(
|
|
151
|
-
MODEL_NAME,
|
|
152
|
-
MODEL_DATA,
|
|
153
|
-
true,
|
|
154
|
-
);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
describe('overrides the "patchById" method', function () {
|
|
159
|
-
it('transforms the given data', async function () {
|
|
160
|
-
sandbox.on(T, 'transform', () => TRANSFORMED_DATA);
|
|
161
|
-
const res = await A.patchById(
|
|
162
|
-
MODEL_NAME,
|
|
163
|
-
DUMMY_ID,
|
|
164
|
-
MODEL_DATA,
|
|
165
|
-
FILTER_CLAUSE,
|
|
166
|
-
);
|
|
167
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
168
|
-
expect(T.transform).to.be.called.once;
|
|
169
|
-
expect(T.transform).to.be.called.with.exactly(
|
|
170
|
-
MODEL_NAME,
|
|
171
|
-
MODEL_DATA,
|
|
172
|
-
true,
|
|
173
|
-
);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it('resolves the transformation promise', async function () {
|
|
177
|
-
sandbox.on(T, 'transform', () => Promise.resolve(TRANSFORMED_DATA));
|
|
178
|
-
const res = await A.patchById(
|
|
179
|
-
MODEL_NAME,
|
|
180
|
-
DUMMY_ID,
|
|
181
|
-
MODEL_DATA,
|
|
182
|
-
FILTER_CLAUSE,
|
|
183
|
-
);
|
|
184
|
-
expect(res).to.be.eql(TRANSFORMED_DATA);
|
|
185
|
-
expect(T.transform).to.be.called.once;
|
|
186
|
-
expect(T.transform).to.be.called.with.exactly(
|
|
187
|
-
MODEL_NAME,
|
|
188
|
-
MODEL_DATA,
|
|
189
|
-
true,
|
|
190
|
-
);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
});
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Service} from '@e22m4u/js-service';
|
|
2
|
-
import {Adapter} from '../adapter.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Data validation decorator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class DataValidationDecorator extends Service {
|
|
8
|
-
/**
|
|
9
|
-
* Decorate.
|
|
10
|
-
*
|
|
11
|
-
* @param adapter
|
|
12
|
-
*/
|
|
13
|
-
decorate(adapter: Adapter): void;
|
|
14
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import {Adapter} from '../adapter.js';
|
|
2
|
-
import {Service} from '@e22m4u/js-service';
|
|
3
|
-
import {InvalidArgumentError} from '../../errors/index.js';
|
|
4
|
-
import {ModelDataValidator} from '../../definition/index.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Data validation decorator.
|
|
8
|
-
*/
|
|
9
|
-
export class DataValidationDecorator extends Service {
|
|
10
|
-
/**
|
|
11
|
-
* Decorate.
|
|
12
|
-
*
|
|
13
|
-
* @param {Adapter} adapter
|
|
14
|
-
*/
|
|
15
|
-
decorate(adapter) {
|
|
16
|
-
if (!adapter || !(adapter instanceof Adapter))
|
|
17
|
-
throw new InvalidArgumentError(
|
|
18
|
-
'The first argument of DataValidationDecorator.decorate should be ' +
|
|
19
|
-
'an Adapter instance, but %v was given.',
|
|
20
|
-
adapter,
|
|
21
|
-
);
|
|
22
|
-
const validator = this.getService(ModelDataValidator);
|
|
23
|
-
|
|
24
|
-
const create = adapter.create;
|
|
25
|
-
adapter.create = function (modelName, modelData, filter) {
|
|
26
|
-
validator.validate(modelName, modelData);
|
|
27
|
-
return create.call(this, modelName, modelData, filter);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const replaceById = adapter.replaceById;
|
|
31
|
-
adapter.replaceById = function (modelName, id, modelData, filter) {
|
|
32
|
-
validator.validate(modelName, modelData);
|
|
33
|
-
return replaceById.call(this, modelName, id, modelData, filter);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const replaceOrCreate = adapter.replaceOrCreate;
|
|
37
|
-
adapter.replaceOrCreate = function (modelName, modelData, filter) {
|
|
38
|
-
validator.validate(modelName, modelData);
|
|
39
|
-
return replaceOrCreate.call(this, modelName, modelData, filter);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const patch = adapter.patch;
|
|
43
|
-
adapter.patch = function (modelName, modelData, where) {
|
|
44
|
-
validator.validate(modelName, modelData, true);
|
|
45
|
-
return patch.call(this, modelName, modelData, where);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const patchById = adapter.patchById;
|
|
49
|
-
adapter.patchById = function (modelName, id, modelData, filter) {
|
|
50
|
-
validator.validate(modelName, modelData, true);
|
|
51
|
-
return patchById.call(this, modelName, id, modelData, filter);
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|