@e22m4u/js-repository 0.2.7 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -80
- package/dist/cjs/index.cjs +2472 -2472
- package/eslint.config.js +1 -1
- package/package.json +14 -14
- package/src/adapter/adapter-registry.spec.js +7 -7
- package/src/adapter/adapter.spec.js +11 -11
- package/src/adapter/builtin/memory-adapter.spec.js +537 -537
- package/src/adapter/decorator/data-sanitizing-decorator.spec.js +5 -5
- package/src/adapter/decorator/data-transformation-decorator.spec.js +5 -5
- package/src/adapter/decorator/data-validation-decorator.spec.js +5 -5
- package/src/adapter/decorator/default-values-decorator.spec.js +5 -5
- package/src/adapter/decorator/fields-filtering-decorator.spec.js +5 -5
- package/src/adapter/decorator/inclusion-decorator.spec.js +5 -5
- package/src/adapter/decorator/property-uniqueness-decorator.spec.js +5 -5
- package/src/{schema.d.ts → database-schema.d.ts} +2 -2
- package/src/{schema.js → database-schema.js} +2 -2
- package/src/database-schema.spec.ts +86 -0
- package/src/definition/model/model-data-transformer.spec.js +93 -93
- package/src/definition/model/model-data-validator.spec.js +514 -528
- package/src/definition/model/model-definition-utils.spec.js +343 -341
- package/src/definition/model/properties/property-transformer/property-transformer-registry.spec.js +36 -36
- package/src/definition/model/properties/property-uniqueness-validator.spec.js +410 -377
- package/src/definition/model/properties/property-validator/property-validator-registry.spec.js +36 -36
- package/src/filter/fields-clause-tool.spec.js +4 -4
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -1
- package/src/relations/belongs-to-resolver.spec.js +166 -166
- package/src/relations/has-many-resolver.spec.js +281 -281
- package/src/relations/has-one-resolver.spec.js +281 -281
- package/src/relations/references-many-resolver.spec.js +92 -92
- package/src/repository/repository-registry.spec.js +10 -10
- package/src/repository/repository.spec.js +73 -73
- package/src/utils/is-promise.spec.js +1 -2
- package/src/utils/transform-promise.spec.js +0 -1
- 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 {
|
|
4
|
+
import {DatabaseSchema} from '../../database-schema.js';
|
|
5
5
|
import {ModelDataSanitizer} from '../../definition/index.js';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
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 =
|
|
38
|
-
const V =
|
|
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 {
|
|
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
|
|
50
|
-
|
|
51
|
-
const A =
|
|
52
|
-
const T =
|
|
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 {
|
|
4
|
+
import {DatabaseSchema} from '../../database-schema.js';
|
|
5
5
|
import {ModelDataValidator} from '../../definition/index.js';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
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 =
|
|
38
|
-
const V =
|
|
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
|
|
9
|
-
|
|
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 =
|
|
60
|
-
const U =
|
|
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
|
|
7
|
+
const dbs = new DatabaseSchema();
|
|
8
8
|
const MODEL_NAME = 'model';
|
|
9
|
-
|
|
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 =
|
|
57
|
-
const T =
|
|
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 {
|
|
4
|
+
import {DatabaseSchema} from '../../database-schema.js';
|
|
5
5
|
import {IncludeClauseTool} from '../../filter/index.js';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
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 =
|
|
55
|
-
const T =
|
|
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 {
|
|
4
|
+
import {DatabaseSchema} from '../../database-schema.js';
|
|
5
5
|
import {PropertyUniquenessValidator} from '../../definition/index.js';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
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 =
|
|
38
|
-
const V =
|
|
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
|
-
*
|
|
10
|
+
* Database schema.
|
|
11
11
|
*/
|
|
12
|
-
export declare class
|
|
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
|
-
*
|
|
7
|
+
* Database schema.
|
|
8
8
|
*/
|
|
9
|
-
export class
|
|
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
|
+
});
|