@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.
- package/README.md +79 -80
- package/dist/cjs/index.cjs +2472 -2472
- package/eslint.config.js +1 -1
- package/package.json +12 -12
- 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,15 +1,15 @@
|
|
|
1
1
|
import {expect} from 'chai';
|
|
2
|
-
import {
|
|
2
|
+
import {DatabaseSchema} from '../database-schema.js';
|
|
3
3
|
import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME as DEF_PK} from '../definition/index.js';
|
|
4
4
|
|
|
5
5
|
describe('Repository', function () {
|
|
6
6
|
describe('create', function () {
|
|
7
7
|
it('creates a new item from the given data', async function () {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const dbs = new DatabaseSchema();
|
|
9
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
10
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
11
11
|
const data = {foo: 'bar'};
|
|
12
|
-
const rep =
|
|
12
|
+
const rep = dbs.getRepository('model');
|
|
13
13
|
const result = await rep.create(data);
|
|
14
14
|
expect(result).to.be.eql({[DEF_PK]: result[DEF_PK], ...data});
|
|
15
15
|
});
|
|
@@ -17,10 +17,10 @@ describe('Repository', function () {
|
|
|
17
17
|
|
|
18
18
|
describe('replaceById', function () {
|
|
19
19
|
it('replaces an item by the given id', async function () {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const rep =
|
|
20
|
+
const dbs = new DatabaseSchema();
|
|
21
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
22
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
23
|
+
const rep = dbs.getRepository('model');
|
|
24
24
|
const created = await rep.create({foo: 'bar'});
|
|
25
25
|
const result = await rep.replaceById(created[DEF_PK], {baz: 'qux'});
|
|
26
26
|
expect(result).to.be.eql({[DEF_PK]: created[DEF_PK], baz: 'qux'});
|
|
@@ -29,20 +29,20 @@ describe('Repository', function () {
|
|
|
29
29
|
|
|
30
30
|
describe('replaceOrCreate', function () {
|
|
31
31
|
it('creates a new item from the given data', async function () {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const dbs = new DatabaseSchema();
|
|
33
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
34
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
35
35
|
const data = {foo: 'bar'};
|
|
36
|
-
const rep =
|
|
36
|
+
const rep = dbs.getRepository('model');
|
|
37
37
|
const result = await rep.replaceOrCreate(data);
|
|
38
38
|
expect(result).to.be.eql({[DEF_PK]: result[DEF_PK], ...data});
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
it('replaces an existing item', async function () {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const rep =
|
|
42
|
+
const dbs = new DatabaseSchema();
|
|
43
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
44
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
45
|
+
const rep = dbs.getRepository('model');
|
|
46
46
|
const created = await rep.create({foo: 'bar'});
|
|
47
47
|
const replacer = {[DEF_PK]: created[DEF_PK], bar: 'qux'};
|
|
48
48
|
const result = await rep.replaceOrCreate(replacer);
|
|
@@ -52,10 +52,10 @@ describe('Repository', function () {
|
|
|
52
52
|
|
|
53
53
|
describe('patch', function () {
|
|
54
54
|
it('patches all items', async function () {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const rep =
|
|
55
|
+
const dbs = new DatabaseSchema();
|
|
56
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
57
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
58
|
+
const rep = dbs.getRepository('model');
|
|
59
59
|
await rep.create({foo: 'a1', bar: 'b1'});
|
|
60
60
|
await rep.create({foo: 'a2', bar: 'b2'});
|
|
61
61
|
await rep.create({foo: 'a3', bar: 'b3'});
|
|
@@ -64,10 +64,10 @@ describe('Repository', function () {
|
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
it('patches found items by the "where" clause', async function () {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const rep =
|
|
67
|
+
const dbs = new DatabaseSchema();
|
|
68
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
69
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
70
|
+
const rep = dbs.getRepository('model');
|
|
71
71
|
await rep.create({foo: 'a', bar: '1'});
|
|
72
72
|
await rep.create({foo: 'b', bar: '2'});
|
|
73
73
|
await rep.create({foo: 'c', bar: '2'});
|
|
@@ -78,10 +78,10 @@ describe('Repository', function () {
|
|
|
78
78
|
|
|
79
79
|
describe('patchById', function () {
|
|
80
80
|
it('patches an item by the given id', async function () {
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const rep =
|
|
81
|
+
const dbs = new DatabaseSchema();
|
|
82
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
83
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
84
|
+
const rep = dbs.getRepository('model');
|
|
85
85
|
const created = await rep.create({foo: 'bar'});
|
|
86
86
|
const result = await rep.patchById(created[DEF_PK], {baz: 'qux'});
|
|
87
87
|
expect(result).to.be.eql({
|
|
@@ -94,10 +94,10 @@ describe('Repository', function () {
|
|
|
94
94
|
|
|
95
95
|
describe('find', function () {
|
|
96
96
|
it('returns all items', async function () {
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const rep =
|
|
97
|
+
const dbs = new DatabaseSchema();
|
|
98
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
99
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
100
|
+
const rep = dbs.getRepository('model');
|
|
101
101
|
const created1 = await rep.create({foo: 'bar'});
|
|
102
102
|
const created2 = await rep.create({baz: 'qux'});
|
|
103
103
|
const result = await rep.find();
|
|
@@ -105,10 +105,10 @@ describe('Repository', function () {
|
|
|
105
105
|
});
|
|
106
106
|
|
|
107
107
|
it('returns found items by the "where" clause', async function () {
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const rep =
|
|
108
|
+
const dbs = new DatabaseSchema();
|
|
109
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
110
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
111
|
+
const rep = dbs.getRepository('model');
|
|
112
112
|
await rep.create({foo: 'bar'});
|
|
113
113
|
const created = await rep.create({baz: 'qux'});
|
|
114
114
|
const result = await rep.find({where: {baz: 'qux'}});
|
|
@@ -118,10 +118,10 @@ describe('Repository', function () {
|
|
|
118
118
|
|
|
119
119
|
describe('findOne', function () {
|
|
120
120
|
it('returns a first item', async function () {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const rep =
|
|
121
|
+
const dbs = new DatabaseSchema();
|
|
122
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
123
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
124
|
+
const rep = dbs.getRepository('model');
|
|
125
125
|
const created = await rep.create({foo: 'bar'});
|
|
126
126
|
await rep.create({baz: 'qux'});
|
|
127
127
|
const result = await rep.findOne();
|
|
@@ -129,10 +129,10 @@ describe('Repository', function () {
|
|
|
129
129
|
});
|
|
130
130
|
|
|
131
131
|
it('returns a found item by the "where" clause', async function () {
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const rep =
|
|
132
|
+
const dbs = new DatabaseSchema();
|
|
133
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
134
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
135
|
+
const rep = dbs.getRepository('model');
|
|
136
136
|
await rep.create({foo: 'bar'});
|
|
137
137
|
const created = await rep.create({baz: 'qux'});
|
|
138
138
|
const result = await rep.findOne({where: {baz: 'qux'}});
|
|
@@ -142,10 +142,10 @@ describe('Repository', function () {
|
|
|
142
142
|
|
|
143
143
|
describe('findById', function () {
|
|
144
144
|
it('returns an item by the given id', async function () {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const rep =
|
|
145
|
+
const dbs = new DatabaseSchema();
|
|
146
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
147
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
148
|
+
const rep = dbs.getRepository('model');
|
|
149
149
|
const created = await rep.create({foo: 'bar'});
|
|
150
150
|
const result = await rep.findById(created[DEF_PK]);
|
|
151
151
|
expect(result).to.be.eql(created);
|
|
@@ -154,10 +154,10 @@ describe('Repository', function () {
|
|
|
154
154
|
|
|
155
155
|
describe('delete', function () {
|
|
156
156
|
it('removes all items', async function () {
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const rep =
|
|
157
|
+
const dbs = new DatabaseSchema();
|
|
158
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
159
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
160
|
+
const rep = dbs.getRepository('model');
|
|
161
161
|
await rep.create({foo: 'bar'});
|
|
162
162
|
await rep.create({baz: 'qux'});
|
|
163
163
|
const result = await rep.delete();
|
|
@@ -165,10 +165,10 @@ describe('Repository', function () {
|
|
|
165
165
|
});
|
|
166
166
|
|
|
167
167
|
it('removes found items by the "where" clause', async function () {
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const rep =
|
|
168
|
+
const dbs = new DatabaseSchema();
|
|
169
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
170
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
171
|
+
const rep = dbs.getRepository('model');
|
|
172
172
|
await rep.create({foo: 'bar'});
|
|
173
173
|
await rep.create({foo: 'bar'});
|
|
174
174
|
await rep.create({baz: 'qux'});
|
|
@@ -179,10 +179,10 @@ describe('Repository', function () {
|
|
|
179
179
|
|
|
180
180
|
describe('deleteById', function () {
|
|
181
181
|
it('removes an item by the given id', async function () {
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
const rep =
|
|
182
|
+
const dbs = new DatabaseSchema();
|
|
183
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
184
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
185
|
+
const rep = dbs.getRepository('model');
|
|
186
186
|
const created = await rep.create({foo: 'bar'});
|
|
187
187
|
const result = await rep.deleteById(created[DEF_PK]);
|
|
188
188
|
expect(result).to.be.true;
|
|
@@ -191,10 +191,10 @@ describe('Repository', function () {
|
|
|
191
191
|
|
|
192
192
|
describe('exists', function () {
|
|
193
193
|
it('returns true if the given id exists', async function () {
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const rep =
|
|
194
|
+
const dbs = new DatabaseSchema();
|
|
195
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
196
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
197
|
+
const rep = dbs.getRepository('model');
|
|
198
198
|
const created = await rep.create({foo: 'bar'});
|
|
199
199
|
const result = await rep.exists(created[DEF_PK]);
|
|
200
200
|
expect(result).to.be.true;
|
|
@@ -203,10 +203,10 @@ describe('Repository', function () {
|
|
|
203
203
|
|
|
204
204
|
describe('count', function () {
|
|
205
205
|
it('counts all items', async function () {
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
const rep =
|
|
206
|
+
const dbs = new DatabaseSchema();
|
|
207
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
208
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
209
|
+
const rep = dbs.getRepository('model');
|
|
210
210
|
await rep.create({foo: 'bar'});
|
|
211
211
|
await rep.create({baz: 'qux'});
|
|
212
212
|
const result = await rep.count();
|
|
@@ -214,10 +214,10 @@ describe('Repository', function () {
|
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
it('counts found items by the "where" clause', async function () {
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
const rep =
|
|
217
|
+
const dbs = new DatabaseSchema();
|
|
218
|
+
dbs.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
219
|
+
dbs.defineModel({name: 'model', datasource: 'datasource'});
|
|
220
|
+
const rep = dbs.getRepository('model');
|
|
221
221
|
await rep.create({foo: 'bar'});
|
|
222
222
|
await rep.create({foo: 'bar'});
|
|
223
223
|
await rep.create({baz: 'qux'});
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import {expect} from 'chai';
|
|
2
|
-
import {describe} from 'mocha';
|
|
3
2
|
import {isPromise} from './is-promise.js';
|
|
4
3
|
|
|
5
|
-
describe('isPromise', ()
|
|
4
|
+
describe('isPromise', function () {
|
|
6
5
|
it('returns true if the given value has type of PromiseLike', function () {
|
|
7
6
|
expect(isPromise(Promise.resolve())).to.be.true;
|
|
8
7
|
expect(isPromise('string')).to.be.false;
|
package/src/schema.spec.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import {expect} from 'chai';
|
|
2
|
-
import {Schema} from './schema.js';
|
|
3
|
-
import {Repository} from './repository/index.js';
|
|
4
|
-
import {DefinitionRegistry} from './definition/index.js';
|
|
5
|
-
|
|
6
|
-
describe('Schema', function () {
|
|
7
|
-
describe('defineDatasource', function () {
|
|
8
|
-
it('returns this', function () {
|
|
9
|
-
const schema = new Schema();
|
|
10
|
-
const res = schema.defineDatasource({
|
|
11
|
-
name: 'datasource',
|
|
12
|
-
adapter: 'memory',
|
|
13
|
-
});
|
|
14
|
-
expect(res).to.be.eq(schema);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('sets the datasource definition', function () {
|
|
18
|
-
const schema = new Schema();
|
|
19
|
-
schema.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
20
|
-
const res =
|
|
21
|
-
schema.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 schema = new Schema();
|
|
27
|
-
schema.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
28
|
-
const throwable =
|
|
29
|
-
() => schema.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 schema = new Schema();
|
|
39
|
-
const res = schema.defineModel({name: 'model'});
|
|
40
|
-
expect(res).to.be.eq(schema);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('sets the model definition', function () {
|
|
44
|
-
const schema = new Schema();
|
|
45
|
-
schema.defineModel({name: 'model'});
|
|
46
|
-
const res = schema.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 schema = new Schema();
|
|
52
|
-
schema.defineModel({name: 'model'});
|
|
53
|
-
const throwable = () => schema.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 schema = new Schema();
|
|
61
|
-
schema.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
62
|
-
schema.defineModel({name: 'model', datasource: 'datasource'});
|
|
63
|
-
const res = schema.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 schema = new Schema();
|
|
69
|
-
const throwable = () => schema.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 schema = new Schema();
|
|
75
|
-
schema.defineDatasource({name: 'datasource', adapter: 'memory'});
|
|
76
|
-
schema.defineModel({name: 'model', datasource: 'datasource'});
|
|
77
|
-
interface MyModel {
|
|
78
|
-
myId: number;
|
|
79
|
-
}
|
|
80
|
-
const res1: Repository = schema.getRepository('model');
|
|
81
|
-
const res2: Repository<MyModel, number, 'myId'> =
|
|
82
|
-
schema.getRepository<MyModel, number, 'myId'>('model');
|
|
83
|
-
expect(res1).to.be.eq(res2);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
});
|