@e22m4u/js-repository 0.2.7 → 0.3.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 (35) hide show
  1. package/README.md +79 -80
  2. package/dist/cjs/index.cjs +2472 -2472
  3. package/eslint.config.js +1 -1
  4. package/package.json +12 -12
  5. package/src/adapter/adapter-registry.spec.js +7 -7
  6. package/src/adapter/adapter.spec.js +11 -11
  7. package/src/adapter/builtin/memory-adapter.spec.js +537 -537
  8. package/src/adapter/decorator/data-sanitizing-decorator.spec.js +5 -5
  9. package/src/adapter/decorator/data-transformation-decorator.spec.js +5 -5
  10. package/src/adapter/decorator/data-validation-decorator.spec.js +5 -5
  11. package/src/adapter/decorator/default-values-decorator.spec.js +5 -5
  12. package/src/adapter/decorator/fields-filtering-decorator.spec.js +5 -5
  13. package/src/adapter/decorator/inclusion-decorator.spec.js +5 -5
  14. package/src/adapter/decorator/property-uniqueness-decorator.spec.js +5 -5
  15. package/src/{schema.d.ts → database-schema.d.ts} +2 -2
  16. package/src/{schema.js → database-schema.js} +2 -2
  17. package/src/database-schema.spec.ts +86 -0
  18. package/src/definition/model/model-data-transformer.spec.js +93 -93
  19. package/src/definition/model/model-data-validator.spec.js +514 -528
  20. package/src/definition/model/model-definition-utils.spec.js +343 -341
  21. package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +36 -36
  22. package/src/definition/model/properties/property-uniqueness-validator.spec.js +410 -377
  23. package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +36 -36
  24. package/src/filter/fields-clause-tool.spec.js +4 -4
  25. package/src/index.d.ts +1 -1
  26. package/src/index.js +1 -1
  27. package/src/relations/belongs-to-resolver.spec.js +166 -166
  28. package/src/relations/has-many-resolver.spec.js +281 -281
  29. package/src/relations/has-one-resolver.spec.js +281 -281
  30. package/src/relations/references-many-resolver.spec.js +92 -92
  31. package/src/repository/repository-registry.spec.js +10 -10
  32. package/src/repository/repository.spec.js +73 -73
  33. package/src/utils/is-promise.spec.js +1 -2
  34. package/src/utils/transform-promise.spec.js +0 -1
  35. package/src/schema.spec.ts +0 -86
@@ -1,11 +1,11 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
4
+ import {DatabaseSchema} from '../../database-schema.js';
5
5
  import {ModelDataSanitizer} from '../../definition/index.js';
6
6
 
7
- const S = new Schema();
8
- S.defineModel({name: 'model'});
7
+ const dbs = new DatabaseSchema();
8
+ dbs.defineModel({name: 'model'});
9
9
 
10
10
  class TestAdapter extends Adapter {
11
11
  // eslint-disable-next-line no-unused-vars
@@ -34,8 +34,8 @@ class TestAdapter extends Adapter {
34
34
  }
35
35
  }
36
36
 
37
- const A = S.getService(TestAdapter);
38
- const V = S.getService(ModelDataSanitizer);
37
+ const A = dbs.getService(TestAdapter);
38
+ const V = dbs.getService(ModelDataSanitizer);
39
39
  const sandbox = chai.spy.sandbox();
40
40
 
41
41
  describe('DataSanitizingDecorator', function () {
@@ -1,7 +1,7 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
4
+ import {DatabaseSchema} from '../../database-schema.js';
5
5
  import {ModelDataTransformer} from '../../definition/index.js';
6
6
 
7
7
  const MODEL_NAME = 'myModel';
@@ -46,10 +46,10 @@ class TestAdapter extends Adapter {
46
46
  }
47
47
  }
48
48
 
49
- const S = new Schema();
50
- S.defineModel({name: MODEL_NAME});
51
- const A = S.getService(TestAdapter);
52
- const T = S.getService(ModelDataTransformer);
49
+ const dbs = new DatabaseSchema();
50
+ dbs.defineModel({name: MODEL_NAME});
51
+ const A = dbs.getService(TestAdapter);
52
+ const T = dbs.getService(ModelDataTransformer);
53
53
  const sandbox = chai.spy.sandbox();
54
54
 
55
55
  describe('DataTransformationDecorator', function () {
@@ -1,11 +1,11 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
4
+ import {DatabaseSchema} from '../../database-schema.js';
5
5
  import {ModelDataValidator} from '../../definition/index.js';
6
6
 
7
- const S = new Schema();
8
- S.defineModel({name: 'model'});
7
+ const dbs = new DatabaseSchema();
8
+ dbs.defineModel({name: 'model'});
9
9
 
10
10
  class TestAdapter extends Adapter {
11
11
  // eslint-disable-next-line no-unused-vars
@@ -34,8 +34,8 @@ class TestAdapter extends Adapter {
34
34
  }
35
35
  }
36
36
 
37
- const A = S.getService(TestAdapter);
38
- const V = S.getService(ModelDataValidator);
37
+ const A = dbs.getService(TestAdapter);
38
+ const V = dbs.getService(ModelDataValidator);
39
39
  const sandbox = chai.spy.sandbox();
40
40
 
41
41
  describe('DataValidationDecorator', function () {
@@ -1,12 +1,12 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
5
4
  import {DataType} from '../../definition/index.js';
5
+ import {DatabaseSchema} from '../../database-schema.js';
6
6
  import {ModelDefinitionUtils} from '../../definition/index.js';
7
7
 
8
- const S = new Schema();
9
- S.defineModel({
8
+ const dbs = new DatabaseSchema();
9
+ dbs.defineModel({
10
10
  name: 'model',
11
11
  properties: {
12
12
  prop: {
@@ -56,8 +56,8 @@ class TestAdapter extends Adapter {
56
56
  }
57
57
  }
58
58
 
59
- const A = S.getService(TestAdapter);
60
- const U = S.getService(ModelDefinitionUtils);
59
+ const A = dbs.getService(TestAdapter);
60
+ const U = dbs.getService(ModelDefinitionUtils);
61
61
  const sandbox = chai.spy.sandbox();
62
62
 
63
63
  describe('DefaultValuesDecorator', function () {
@@ -1,12 +1,12 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
5
4
  import {FieldsClauseTool} from '../../filter/index.js';
5
+ import {DatabaseSchema} from '../../database-schema.js';
6
6
 
7
- const S = new Schema();
7
+ const dbs = new DatabaseSchema();
8
8
  const MODEL_NAME = 'model';
9
- S.defineModel({name: MODEL_NAME});
9
+ dbs.defineModel({name: MODEL_NAME});
10
10
 
11
11
  const FILTER = {fields: ['foo', 'bar']};
12
12
  const MODEL_DATA = {
@@ -53,8 +53,8 @@ class TestAdapter extends Adapter {
53
53
  }
54
54
  }
55
55
 
56
- const A = S.getService(TestAdapter);
57
- const T = S.getService(FieldsClauseTool);
56
+ const A = dbs.getService(TestAdapter);
57
+ const T = dbs.getService(FieldsClauseTool);
58
58
  const sandbox = chai.spy.sandbox();
59
59
 
60
60
  describe('FieldsFilteringDecorator', function () {
@@ -1,11 +1,11 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
4
+ import {DatabaseSchema} from '../../database-schema.js';
5
5
  import {IncludeClauseTool} from '../../filter/index.js';
6
6
 
7
- const S = new Schema();
8
- S.defineModel({name: 'model'});
7
+ const dbs = new DatabaseSchema();
8
+ dbs.defineModel({name: 'model'});
9
9
  const FILTER = {include: 'parent'};
10
10
 
11
11
  const MODEL_DATA = {
@@ -51,8 +51,8 @@ class TestAdapter extends Adapter {
51
51
  }
52
52
  }
53
53
 
54
- const A = S.getService(TestAdapter);
55
- const T = S.getService(IncludeClauseTool);
54
+ const A = dbs.getService(TestAdapter);
55
+ const T = dbs.getService(IncludeClauseTool);
56
56
  const sandbox = chai.spy.sandbox();
57
57
 
58
58
  describe('InclusionDecorator', function () {
@@ -1,11 +1,11 @@
1
1
  import {expect} from 'chai';
2
2
  import {chai} from '../../chai.js';
3
3
  import {Adapter} from '../adapter.js';
4
- import {Schema} from '../../schema.js';
4
+ import {DatabaseSchema} from '../../database-schema.js';
5
5
  import {PropertyUniquenessValidator} from '../../definition/index.js';
6
6
 
7
- const S = new Schema();
8
- S.defineModel({name: 'model'});
7
+ const dbs = new DatabaseSchema();
8
+ dbs.defineModel({name: 'model'});
9
9
 
10
10
  class TestAdapter extends Adapter {
11
11
  // eslint-disable-next-line no-unused-vars
@@ -34,8 +34,8 @@ class TestAdapter extends Adapter {
34
34
  }
35
35
  }
36
36
 
37
- const A = S.getService(TestAdapter);
38
- const V = S.getService(PropertyUniquenessValidator);
37
+ const A = dbs.getService(TestAdapter);
38
+ const V = dbs.getService(PropertyUniquenessValidator);
39
39
  const sandbox = chai.spy.sandbox();
40
40
 
41
41
  describe('PropertyUniquenessDecorator', function () {
@@ -7,9 +7,9 @@ import {DatasourceDefinition} from './definition/index.js';
7
7
  import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME} from './definition/index.js';
8
8
 
9
9
  /**
10
- * Schema.
10
+ * Database schema.
11
11
  */
12
- export declare class Schema extends Service {
12
+ export declare class DatabaseSchema extends Service {
13
13
  /**
14
14
  * Define datasource.
15
15
  *
@@ -4,9 +4,9 @@ import {DefinitionRegistry} from './definition/index.js';
4
4
  import {RepositoryRegistry} from './repository/index.js';
5
5
 
6
6
  /**
7
- * Schema.
7
+ * Database schema.
8
8
  */
9
- export class Schema extends Service {
9
+ export class DatabaseSchema extends Service {
10
10
  /**
11
11
  * Define datasource.
12
12
  *
@@ -0,0 +1,86 @@
1
+ import {expect} from 'chai';
2
+ import {Repository} from './repository/index.js';
3
+ import {DatabaseSchema} from './database-schema.js';
4
+ import {DefinitionRegistry} from './definition/index.js';
5
+
6
+ describe('DatabaseSchema', function () {
7
+ describe('defineDatasource', function () {
8
+ it('returns this', function () {
9
+ const dbs = new DatabaseSchema();
10
+ const res = dbs.defineDatasource({
11
+ name: 'datasource',
12
+ adapter: 'memory',
13
+ });
14
+ expect(res).to.be.eq(dbs);
15
+ });
16
+
17
+ it('sets the datasource definition', function () {
18
+ const dbs = new DatabaseSchema();
19
+ dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
20
+ const res =
21
+ dbs.getService(DefinitionRegistry).getDatasource('datasource');
22
+ expect(res).to.be.eql({name: 'datasource', adapter: 'memory'});
23
+ });
24
+
25
+ it('throws an error if the datasource name already defined', function () {
26
+ const dbs = new DatabaseSchema();
27
+ dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
28
+ const throwable =
29
+ () => dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
30
+ expect(throwable).to.throw(
31
+ 'The datasource "datasource" is already defined.',
32
+ );
33
+ });
34
+ });
35
+
36
+ describe('defineModel', function () {
37
+ it('returns this', function () {
38
+ const dbs = new DatabaseSchema();
39
+ const res = dbs.defineModel({name: 'model'});
40
+ expect(res).to.be.eq(dbs);
41
+ });
42
+
43
+ it('sets the model definition', function () {
44
+ const dbs = new DatabaseSchema();
45
+ dbs.defineModel({name: 'model'});
46
+ const res = dbs.getService(DefinitionRegistry).getModel('model');
47
+ expect(res).to.be.eql({name: 'model'});
48
+ });
49
+
50
+ it('throws an error if the model name already defined', function () {
51
+ const dbs = new DatabaseSchema();
52
+ dbs.defineModel({name: 'model'});
53
+ const throwable = () => dbs.defineModel({name: 'model'});
54
+ expect(throwable).to.throw('The model "model" is already defined.');
55
+ });
56
+ });
57
+
58
+ describe('getRepository', function () {
59
+ it('returns a repository by the model name', function () {
60
+ const dbs = new DatabaseSchema();
61
+ dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
62
+ dbs.defineModel({name: 'model', datasource: 'datasource'});
63
+ const res = dbs.getRepository('model');
64
+ expect(res).to.be.instanceof(Repository);
65
+ });
66
+
67
+ it('throws an error if the model is not defined', function () {
68
+ const dbs = new DatabaseSchema();
69
+ const throwable = () => dbs.getRepository('model');
70
+ expect(throwable).to.throw('The model "model" is not defined.');
71
+ });
72
+
73
+ it('uses generic types to define the repository type', function () {
74
+ const dbs = new DatabaseSchema();
75
+ dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
76
+ dbs.defineModel({name: 'model', datasource: 'datasource'});
77
+ interface MyModel {
78
+ myId: number;
79
+ }
80
+ const res1: Repository = dbs.getRepository('model');
81
+ const res2: Repository<MyModel, number, 'myId'> =
82
+ dbs.getRepository<MyModel, number, 'myId'>('model');
83
+ expect(res1).to.be.eq(res2);
84
+ });
85
+ });
86
+ });