@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
@@ -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;
@@ -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';
@@ -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,11 +1,11 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "strict": true,
4
- "rootDir": "src",
5
4
  "noEmit": true,
6
5
  "target": "es2022",
7
6
  "module": "NodeNext",
8
7
  "moduleResolution": "NodeNext",
9
- "strictNullChecks": true
8
+ "strictNullChecks": true,
9
+ "allowJs": true
10
10
  }
11
11
  }
@@ -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
- }