@expo/entity 0.53.0 → 0.54.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/build/src/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/src/ComposedSecondaryEntityCache.js.map +1 -1
- package/build/src/EntityDatabaseAdapter.js.map +1 -1
- package/build/src/EntityFieldDefinition.js.map +1 -1
- package/build/src/EntityLoaderUtils.js +14 -18
- package/build/src/EntityLoaderUtils.js.map +1 -1
- package/build/src/GenericEntityCacheAdapter.js.map +1 -1
- package/build/src/GenericSecondaryEntityCache.js.map +1 -1
- package/build/src/entityUtils.js +7 -2
- package/build/src/entityUtils.js.map +1 -1
- package/build/src/errors/EntityCacheAdapterError.d.ts +2 -2
- package/build/src/errors/EntityCacheAdapterError.js +12 -2
- package/build/src/errors/EntityCacheAdapterError.js.map +1 -1
- package/build/src/errors/EntityDatabaseAdapterError.d.ts +24 -24
- package/build/src/errors/EntityDatabaseAdapterError.js +111 -24
- package/build/src/errors/EntityDatabaseAdapterError.js.map +1 -1
- package/build/src/errors/EntityError.d.ts +2 -4
- package/build/src/errors/EntityError.js +5 -8
- package/build/src/errors/EntityError.js.map +1 -1
- package/build/src/errors/EntityInvalidFieldValueError.d.ts +2 -2
- package/build/src/errors/EntityInvalidFieldValueError.js +9 -2
- package/build/src/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/src/errors/EntityNotAuthorizedError.d.ts +2 -2
- package/build/src/errors/EntityNotAuthorizedError.js +9 -2
- package/build/src/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/src/errors/EntityNotFoundError.d.ts +2 -2
- package/build/src/errors/EntityNotFoundError.js +9 -2
- package/build/src/errors/EntityNotFoundError.js.map +1 -1
- package/build/src/internal/CompositeFieldHolder.js.map +1 -1
- package/build/src/internal/CompositeFieldValueMap.js.map +1 -1
- package/build/src/internal/SingleFieldHolder.js.map +1 -1
- package/build/src/utils/EntityPrivacyUtils.js +34 -15
- package/build/src/utils/EntityPrivacyUtils.js.map +1 -1
- package/package.json +10 -13
- package/src/ComposedEntityCacheAdapter.ts +1 -2
- package/src/ComposedSecondaryEntityCache.ts +4 -3
- package/src/EntityDatabaseAdapter.ts +3 -2
- package/src/EntityFieldDefinition.ts +1 -2
- package/src/EntityLoaderUtils.ts +17 -20
- package/src/GenericEntityCacheAdapter.ts +1 -2
- package/src/GenericSecondaryEntityCache.ts +1 -2
- package/src/__tests__/ComposedCacheAdapter-test.ts +4 -3
- package/src/__tests__/EntityFields-test.ts +2 -8
- package/src/entityUtils.ts +7 -4
- package/src/errors/EntityCacheAdapterError.ts +16 -3
- package/src/errors/EntityDatabaseAdapterError.ts +137 -25
- package/src/errors/EntityError.ts +7 -8
- package/src/errors/EntityInvalidFieldValueError.ts +11 -2
- package/src/errors/EntityNotAuthorizedError.ts +11 -2
- package/src/errors/EntityNotFoundError.ts +11 -2
- package/src/errors/__tests__/EntityDatabaseAdapterError-test.ts +68 -11
- package/src/errors/__tests__/EntityError-test.ts +36 -0
- package/src/internal/CompositeFieldHolder.ts +7 -10
- package/src/internal/CompositeFieldValueMap.ts +1 -2
- package/src/internal/SingleFieldHolder.ts +10 -6
- package/src/utils/EntityPrivacyUtils.ts +61 -20
- package/src/utils/__testfixtures__/StubCacheAdapter.ts +2 -4
- package/src/utils/__testfixtures__/StubDatabaseAdapter.ts +1 -1
- package/src/utils/__tests__/EntityPrivacyUtils-test.ts +295 -0
|
@@ -3,15 +3,28 @@ import { EntityError, EntityErrorCode, EntityErrorState } from './EntityError';
|
|
|
3
3
|
/**
|
|
4
4
|
* Base class for all errors related to the database adapter.
|
|
5
5
|
*/
|
|
6
|
-
export abstract class EntityDatabaseAdapterError extends EntityError {
|
|
6
|
+
export abstract class EntityDatabaseAdapterError extends EntityError {
|
|
7
|
+
static {
|
|
8
|
+
this.prototype.name = 'EntityDatabaseAdapterError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
7
11
|
|
|
8
12
|
/**
|
|
9
13
|
* Thrown when a transient error occurrs within the database adapter.
|
|
10
14
|
* Transient errors may succeed if retried.
|
|
11
15
|
*/
|
|
12
16
|
export class EntityDatabaseAdapterTransientError extends EntityDatabaseAdapterError {
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
static {
|
|
18
|
+
this.prototype.name = 'EntityDatabaseAdapterTransientError';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
get state(): EntityErrorState.TRANSIENT {
|
|
22
|
+
return EntityErrorState.TRANSIENT;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT {
|
|
26
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT;
|
|
27
|
+
}
|
|
15
28
|
}
|
|
16
29
|
|
|
17
30
|
/**
|
|
@@ -19,8 +32,17 @@ export class EntityDatabaseAdapterTransientError extends EntityDatabaseAdapterEr
|
|
|
19
32
|
* This is a catch-all error class for DBMS-specific errors that do not fit into other categories.
|
|
20
33
|
*/
|
|
21
34
|
export class EntityDatabaseAdapterUnknownError extends EntityDatabaseAdapterError {
|
|
22
|
-
|
|
23
|
-
|
|
35
|
+
static {
|
|
36
|
+
this.prototype.name = 'EntityDatabaseAdapterUnknownError';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get state(): EntityErrorState.UNKNOWN {
|
|
40
|
+
return EntityErrorState.UNKNOWN;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN {
|
|
44
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN;
|
|
45
|
+
}
|
|
24
46
|
}
|
|
25
47
|
|
|
26
48
|
/**
|
|
@@ -28,8 +50,17 @@ export class EntityDatabaseAdapterUnknownError extends EntityDatabaseAdapterErro
|
|
|
28
50
|
* This indicates that a value being inserted or updated does not satisfy a defined data integrity constraint.
|
|
29
51
|
*/
|
|
30
52
|
export class EntityDatabaseAdapterCheckConstraintError extends EntityDatabaseAdapterError {
|
|
31
|
-
|
|
32
|
-
|
|
53
|
+
static {
|
|
54
|
+
this.prototype.name = 'EntityDatabaseAdapterCheckConstraintError';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get state(): EntityErrorState.PERMANENT {
|
|
58
|
+
return EntityErrorState.PERMANENT;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT {
|
|
62
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT;
|
|
63
|
+
}
|
|
33
64
|
}
|
|
34
65
|
|
|
35
66
|
/**
|
|
@@ -37,8 +68,17 @@ export class EntityDatabaseAdapterCheckConstraintError extends EntityDatabaseAda
|
|
|
37
68
|
* This indicates that a value being inserted or updated conflicts with an existing value based on a defined exclusion constraint.
|
|
38
69
|
*/
|
|
39
70
|
export class EntityDatabaseAdapterExclusionConstraintError extends EntityDatabaseAdapterError {
|
|
40
|
-
|
|
41
|
-
|
|
71
|
+
static {
|
|
72
|
+
this.prototype.name = 'EntityDatabaseAdapterExclusionConstraintError';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get state(): EntityErrorState.PERMANENT {
|
|
76
|
+
return EntityErrorState.PERMANENT;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT {
|
|
80
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT;
|
|
81
|
+
}
|
|
42
82
|
}
|
|
43
83
|
|
|
44
84
|
/**
|
|
@@ -47,8 +87,17 @@ export class EntityDatabaseAdapterExclusionConstraintError extends EntityDatabas
|
|
|
47
87
|
* or is referenced in a related table.
|
|
48
88
|
*/
|
|
49
89
|
export class EntityDatabaseAdapterForeignKeyConstraintError extends EntityDatabaseAdapterError {
|
|
50
|
-
|
|
51
|
-
|
|
90
|
+
static {
|
|
91
|
+
this.prototype.name = 'EntityDatabaseAdapterForeignKeyConstraintError';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
get state(): EntityErrorState.PERMANENT {
|
|
95
|
+
return EntityErrorState.PERMANENT;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT {
|
|
99
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT;
|
|
100
|
+
}
|
|
52
101
|
}
|
|
53
102
|
|
|
54
103
|
/**
|
|
@@ -56,8 +105,17 @@ export class EntityDatabaseAdapterForeignKeyConstraintError extends EntityDataba
|
|
|
56
105
|
* This indicates that a null value is being inserted or updated into a column that does not allow null values.
|
|
57
106
|
*/
|
|
58
107
|
export class EntityDatabaseAdapterNotNullConstraintError extends EntityDatabaseAdapterError {
|
|
59
|
-
|
|
60
|
-
|
|
108
|
+
static {
|
|
109
|
+
this.prototype.name = 'EntityDatabaseAdapterNotNullConstraintError';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get state(): EntityErrorState.PERMANENT {
|
|
113
|
+
return EntityErrorState.PERMANENT;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT {
|
|
117
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT;
|
|
118
|
+
}
|
|
61
119
|
}
|
|
62
120
|
|
|
63
121
|
/**
|
|
@@ -66,8 +124,17 @@ export class EntityDatabaseAdapterNotNullConstraintError extends EntityDatabaseA
|
|
|
66
124
|
* that require unique values.
|
|
67
125
|
*/
|
|
68
126
|
export class EntityDatabaseAdapterUniqueConstraintError extends EntityDatabaseAdapterError {
|
|
69
|
-
|
|
70
|
-
|
|
127
|
+
static {
|
|
128
|
+
this.prototype.name = 'EntityDatabaseAdapterUniqueConstraintError';
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
get state(): EntityErrorState.PERMANENT {
|
|
132
|
+
return EntityErrorState.PERMANENT;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT {
|
|
136
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT;
|
|
137
|
+
}
|
|
71
138
|
}
|
|
72
139
|
|
|
73
140
|
/**
|
|
@@ -76,8 +143,17 @@ export class EntityDatabaseAdapterUniqueConstraintError extends EntityDatabaseAd
|
|
|
76
143
|
* triggers or something similar.
|
|
77
144
|
*/
|
|
78
145
|
export class EntityDatabaseAdapterExcessiveInsertResultError extends EntityDatabaseAdapterError {
|
|
79
|
-
|
|
80
|
-
|
|
146
|
+
static {
|
|
147
|
+
this.prototype.name = 'EntityDatabaseAdapterExcessiveInsertResultError';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
get state(): EntityErrorState.PERMANENT {
|
|
151
|
+
return EntityErrorState.PERMANENT;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT {
|
|
155
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT;
|
|
156
|
+
}
|
|
81
157
|
}
|
|
82
158
|
|
|
83
159
|
/**
|
|
@@ -86,8 +162,17 @@ export class EntityDatabaseAdapterExcessiveInsertResultError extends EntityDatab
|
|
|
86
162
|
* triggers or something similar.
|
|
87
163
|
*/
|
|
88
164
|
export class EntityDatabaseAdapterEmptyInsertResultError extends EntityDatabaseAdapterError {
|
|
89
|
-
|
|
90
|
-
|
|
165
|
+
static {
|
|
166
|
+
this.prototype.name = 'EntityDatabaseAdapterEmptyInsertResultError';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
get state(): EntityErrorState.PERMANENT {
|
|
170
|
+
return EntityErrorState.PERMANENT;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT {
|
|
174
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT;
|
|
175
|
+
}
|
|
91
176
|
}
|
|
92
177
|
|
|
93
178
|
/**
|
|
@@ -96,8 +181,17 @@ export class EntityDatabaseAdapterEmptyInsertResultError extends EntityDatabaseA
|
|
|
96
181
|
* primary key column.
|
|
97
182
|
*/
|
|
98
183
|
export class EntityDatabaseAdapterExcessiveUpdateResultError extends EntityDatabaseAdapterError {
|
|
99
|
-
|
|
100
|
-
|
|
184
|
+
static {
|
|
185
|
+
this.prototype.name = 'EntityDatabaseAdapterExcessiveUpdateResultError';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
get state(): EntityErrorState.PERMANENT {
|
|
189
|
+
return EntityErrorState.PERMANENT;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_UPDATE_RESULT {
|
|
193
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_UPDATE_RESULT;
|
|
194
|
+
}
|
|
101
195
|
}
|
|
102
196
|
|
|
103
197
|
/**
|
|
@@ -106,8 +200,17 @@ export class EntityDatabaseAdapterExcessiveUpdateResultError extends EntityDatab
|
|
|
106
200
|
* was deleted by a different process between fetching and updating it in this process.
|
|
107
201
|
*/
|
|
108
202
|
export class EntityDatabaseAdapterEmptyUpdateResultError extends EntityDatabaseAdapterError {
|
|
109
|
-
|
|
110
|
-
|
|
203
|
+
static {
|
|
204
|
+
this.prototype.name = 'EntityDatabaseAdapterEmptyUpdateResultError';
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
get state(): EntityErrorState.PERMANENT {
|
|
208
|
+
return EntityErrorState.PERMANENT;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT {
|
|
212
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT;
|
|
213
|
+
}
|
|
111
214
|
}
|
|
112
215
|
|
|
113
216
|
/**
|
|
@@ -116,6 +219,15 @@ export class EntityDatabaseAdapterEmptyUpdateResultError extends EntityDatabaseA
|
|
|
116
219
|
* primary key column.
|
|
117
220
|
*/
|
|
118
221
|
export class EntityDatabaseAdapterExcessiveDeleteResultError extends EntityDatabaseAdapterError {
|
|
119
|
-
|
|
120
|
-
|
|
222
|
+
static {
|
|
223
|
+
this.prototype.name = 'EntityDatabaseAdapterExcessiveDeleteResultError';
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
get state(): EntityErrorState.PERMANENT {
|
|
227
|
+
return EntityErrorState.PERMANENT;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT {
|
|
231
|
+
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT;
|
|
232
|
+
}
|
|
121
233
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import ES6Error from 'es6-error';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* The state of an entity error, indicating whether it may be transient/retryable.
|
|
5
3
|
*/
|
|
@@ -34,14 +32,15 @@ export enum EntityErrorCode {
|
|
|
34
32
|
/**
|
|
35
33
|
* Base class for all known errors thrown by the entity system.
|
|
36
34
|
*/
|
|
37
|
-
export abstract class EntityError extends
|
|
35
|
+
export abstract class EntityError extends Error {
|
|
36
|
+
static {
|
|
37
|
+
this.prototype.name = 'EntityError';
|
|
38
|
+
}
|
|
39
|
+
|
|
38
40
|
public abstract readonly state: EntityErrorState;
|
|
39
41
|
public abstract readonly code: EntityErrorCode;
|
|
40
42
|
|
|
41
|
-
constructor(
|
|
42
|
-
message
|
|
43
|
-
public override readonly cause?: Error,
|
|
44
|
-
) {
|
|
45
|
-
super(message);
|
|
43
|
+
constructor(message: string, cause?: Error) {
|
|
44
|
+
super(message, { cause });
|
|
46
45
|
}
|
|
47
46
|
}
|
|
@@ -22,8 +22,17 @@ export class EntityInvalidFieldValueError<
|
|
|
22
22
|
N extends keyof TFields,
|
|
23
23
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
24
24
|
> extends EntityError {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
static {
|
|
26
|
+
this.prototype.name = 'EntityInvalidFieldValueError';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get state(): EntityErrorState.PERMANENT {
|
|
30
|
+
return EntityErrorState.PERMANENT;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get code(): EntityErrorCode.ERR_ENTITY_INVALID_FIELD_VALUE {
|
|
34
|
+
return EntityErrorCode.ERR_ENTITY_INVALID_FIELD_VALUE;
|
|
35
|
+
}
|
|
27
36
|
|
|
28
37
|
constructor(
|
|
29
38
|
entityClass: IEntityClass<
|
|
@@ -13,8 +13,17 @@ export class EntityNotAuthorizedError<
|
|
|
13
13
|
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
14
14
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
15
15
|
> extends EntityError {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
static {
|
|
17
|
+
this.prototype.name = 'EntityNotAuthorizedError';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
get state(): EntityErrorState.PERMANENT {
|
|
21
|
+
return EntityErrorState.PERMANENT;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get code(): EntityErrorCode.ERR_ENTITY_NOT_AUTHORIZED {
|
|
25
|
+
return EntityErrorCode.ERR_ENTITY_NOT_AUTHORIZED;
|
|
26
|
+
}
|
|
18
27
|
|
|
19
28
|
public readonly entityClassName: string;
|
|
20
29
|
|
|
@@ -49,8 +49,17 @@ export class EntityNotFoundError<
|
|
|
49
49
|
N extends keyof TFields,
|
|
50
50
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
51
51
|
> extends EntityError {
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
static {
|
|
53
|
+
this.prototype.name = 'EntityNotFoundError';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
get state(): EntityErrorState.PERMANENT {
|
|
57
|
+
return EntityErrorState.PERMANENT;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get code(): EntityErrorCode.ERR_ENTITY_NOT_FOUND {
|
|
61
|
+
return EntityErrorCode.ERR_ENTITY_NOT_FOUND;
|
|
62
|
+
}
|
|
54
63
|
|
|
55
64
|
constructor(message: string);
|
|
56
65
|
constructor(
|
|
@@ -2,7 +2,12 @@ import { describe, expect, it } from '@jest/globals';
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
EntityDatabaseAdapterCheckConstraintError,
|
|
5
|
+
EntityDatabaseAdapterEmptyInsertResultError,
|
|
6
|
+
EntityDatabaseAdapterEmptyUpdateResultError,
|
|
5
7
|
EntityDatabaseAdapterError,
|
|
8
|
+
EntityDatabaseAdapterExcessiveDeleteResultError,
|
|
9
|
+
EntityDatabaseAdapterExcessiveInsertResultError,
|
|
10
|
+
EntityDatabaseAdapterExcessiveUpdateResultError,
|
|
6
11
|
EntityDatabaseAdapterExclusionConstraintError,
|
|
7
12
|
EntityDatabaseAdapterForeignKeyConstraintError,
|
|
8
13
|
EntityDatabaseAdapterNotNullConstraintError,
|
|
@@ -10,20 +15,72 @@ import {
|
|
|
10
15
|
EntityDatabaseAdapterUniqueConstraintError,
|
|
11
16
|
EntityDatabaseAdapterUnknownError,
|
|
12
17
|
} from '../EntityDatabaseAdapterError';
|
|
18
|
+
import { EntityErrorCode, EntityErrorState } from '../EntityError';
|
|
13
19
|
|
|
14
20
|
describe(EntityDatabaseAdapterError, () => {
|
|
15
21
|
// necessary for coverage within the entity package since these errors are
|
|
16
22
|
// currently only ever instantiated by database adapter implementations
|
|
17
|
-
it('instantiates all errors
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
expect(
|
|
23
|
+
it('instantiates all errors with correct state and code', () => {
|
|
24
|
+
const transientError = new EntityDatabaseAdapterTransientError('test');
|
|
25
|
+
expect(transientError.state).toBe(EntityErrorState.TRANSIENT);
|
|
26
|
+
expect(transientError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT);
|
|
27
|
+
|
|
28
|
+
const unknownError = new EntityDatabaseAdapterUnknownError('test');
|
|
29
|
+
expect(unknownError.state).toBe(EntityErrorState.UNKNOWN);
|
|
30
|
+
expect(unknownError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN);
|
|
31
|
+
|
|
32
|
+
const checkError = new EntityDatabaseAdapterCheckConstraintError('test');
|
|
33
|
+
expect(checkError.state).toBe(EntityErrorState.PERMANENT);
|
|
34
|
+
expect(checkError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT);
|
|
35
|
+
|
|
36
|
+
const exclusionError = new EntityDatabaseAdapterExclusionConstraintError('test');
|
|
37
|
+
expect(exclusionError.state).toBe(EntityErrorState.PERMANENT);
|
|
38
|
+
expect(exclusionError.code).toBe(
|
|
39
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const foreignKeyError = new EntityDatabaseAdapterForeignKeyConstraintError('test');
|
|
43
|
+
expect(foreignKeyError.state).toBe(EntityErrorState.PERMANENT);
|
|
44
|
+
expect(foreignKeyError.code).toBe(
|
|
45
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const notNullError = new EntityDatabaseAdapterNotNullConstraintError('test');
|
|
49
|
+
expect(notNullError.state).toBe(EntityErrorState.PERMANENT);
|
|
50
|
+
expect(notNullError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT);
|
|
51
|
+
|
|
52
|
+
const uniqueError = new EntityDatabaseAdapterUniqueConstraintError('test');
|
|
53
|
+
expect(uniqueError.state).toBe(EntityErrorState.PERMANENT);
|
|
54
|
+
expect(uniqueError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT);
|
|
55
|
+
|
|
56
|
+
const excessiveInsertError = new EntityDatabaseAdapterExcessiveInsertResultError('test');
|
|
57
|
+
expect(excessiveInsertError.state).toBe(EntityErrorState.PERMANENT);
|
|
58
|
+
expect(excessiveInsertError.code).toBe(
|
|
59
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const emptyInsertError = new EntityDatabaseAdapterEmptyInsertResultError('test');
|
|
63
|
+
expect(emptyInsertError.state).toBe(EntityErrorState.PERMANENT);
|
|
64
|
+
expect(emptyInsertError.code).toBe(
|
|
65
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT,
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const excessiveUpdateError = new EntityDatabaseAdapterExcessiveUpdateResultError('test');
|
|
69
|
+
expect(excessiveUpdateError.state).toBe(EntityErrorState.PERMANENT);
|
|
70
|
+
expect(excessiveUpdateError.code).toBe(
|
|
71
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_UPDATE_RESULT,
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const emptyUpdateError = new EntityDatabaseAdapterEmptyUpdateResultError('test');
|
|
75
|
+
expect(emptyUpdateError.state).toBe(EntityErrorState.PERMANENT);
|
|
76
|
+
expect(emptyUpdateError.code).toBe(
|
|
77
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const excessiveDeleteError = new EntityDatabaseAdapterExcessiveDeleteResultError('test');
|
|
81
|
+
expect(excessiveDeleteError.state).toBe(EntityErrorState.PERMANENT);
|
|
82
|
+
expect(excessiveDeleteError.code).toBe(
|
|
83
|
+
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT,
|
|
84
|
+
);
|
|
28
85
|
});
|
|
29
86
|
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jest/globals';
|
|
2
|
+
|
|
3
|
+
import { EntityCacheAdapterTransientError } from '../EntityCacheAdapterError';
|
|
4
|
+
import { EntityErrorCode, EntityErrorState } from '../EntityError';
|
|
5
|
+
import { EntityInvalidFieldValueError } from '../EntityInvalidFieldValueError';
|
|
6
|
+
import { EntityNotAuthorizedError } from '../EntityNotAuthorizedError';
|
|
7
|
+
import { EntityNotFoundError } from '../EntityNotFoundError';
|
|
8
|
+
|
|
9
|
+
describe('EntityError subclasses', () => {
|
|
10
|
+
it('EntityNotFoundError has correct state and code', () => {
|
|
11
|
+
const error = new EntityNotFoundError('not found');
|
|
12
|
+
expect(error.state).toBe(EntityErrorState.PERMANENT);
|
|
13
|
+
expect(error.code).toBe(EntityErrorCode.ERR_ENTITY_NOT_FOUND);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('EntityNotAuthorizedError has correct state and code', () => {
|
|
17
|
+
const mockEntity = { constructor: { name: 'TestEntity' }, toString: () => 'TestEntity' } as any;
|
|
18
|
+
const mockViewerContext = { toString: () => 'TestViewer' } as any;
|
|
19
|
+
const error = new EntityNotAuthorizedError(mockEntity, mockViewerContext, 0, 0);
|
|
20
|
+
expect(error.state).toBe(EntityErrorState.PERMANENT);
|
|
21
|
+
expect(error.code).toBe(EntityErrorCode.ERR_ENTITY_NOT_AUTHORIZED);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('EntityInvalidFieldValueError has correct state and code', () => {
|
|
25
|
+
const mockEntityClass = { name: 'TestEntity' } as any;
|
|
26
|
+
const error = new EntityInvalidFieldValueError(mockEntityClass, 'testField', 'badValue');
|
|
27
|
+
expect(error.state).toBe(EntityErrorState.PERMANENT);
|
|
28
|
+
expect(error.code).toBe(EntityErrorCode.ERR_ENTITY_INVALID_FIELD_VALUE);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('EntityCacheAdapterTransientError has correct state and code', () => {
|
|
32
|
+
const error = new EntityCacheAdapterTransientError('cache error');
|
|
33
|
+
expect(error.state).toBe(EntityErrorState.TRANSIENT);
|
|
34
|
+
expect(error.code).toBe(EntityErrorCode.ERR_ENTITY_CACHE_ADAPTER_TRANSIENT);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -32,14 +32,12 @@ export type SerializedCompositeFieldHolder = string & {
|
|
|
32
32
|
export class CompositeFieldHolder<
|
|
33
33
|
TFields extends Record<string, any>,
|
|
34
34
|
TIDField extends keyof TFields,
|
|
35
|
-
> implements
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
>
|
|
42
|
-
{
|
|
35
|
+
> implements IEntityLoadKey<
|
|
36
|
+
TFields,
|
|
37
|
+
TIDField,
|
|
38
|
+
SerializedCompositeFieldValueHolder,
|
|
39
|
+
CompositeFieldValueHolder<TFields, EntityCompositeField<TFields>>
|
|
40
|
+
> {
|
|
43
41
|
public readonly compositeField: EntityCompositeField<TFields>;
|
|
44
42
|
|
|
45
43
|
constructor(compositeFieldInput: EntityCompositeField<TFields>) {
|
|
@@ -174,8 +172,7 @@ export type SerializedCompositeFieldValueHolder = string & {
|
|
|
174
172
|
export class CompositeFieldValueHolder<
|
|
175
173
|
TFields extends Record<string, any>,
|
|
176
174
|
TCompositeField extends EntityCompositeField<TFields>,
|
|
177
|
-
> implements IEntityLoadValue<SerializedCompositeFieldValueHolder>
|
|
178
|
-
{
|
|
175
|
+
> implements IEntityLoadValue<SerializedCompositeFieldValueHolder> {
|
|
179
176
|
constructor(
|
|
180
177
|
public readonly compositeFieldValue: EntityCompositeFieldValue<TFields, TCompositeField>,
|
|
181
178
|
) {}
|
|
@@ -11,8 +11,7 @@ export class CompositeFieldValueMap<
|
|
|
11
11
|
TFields extends Record<string, any>,
|
|
12
12
|
N extends EntityCompositeField<TFields>,
|
|
13
13
|
TOutput,
|
|
14
|
-
> implements ReadonlyMap<EntityCompositeFieldValue<TFields, N>, TOutput>
|
|
15
|
-
{
|
|
14
|
+
> implements ReadonlyMap<EntityCompositeFieldValue<TFields, N>, TOutput> {
|
|
16
15
|
private readonly map: Map<SerializedCompositeFieldValueHolder, TOutput>;
|
|
17
16
|
|
|
18
17
|
constructor(entries: [CompositeFieldValueHolder<TFields, N>, TOutput][]) {
|
|
@@ -18,9 +18,12 @@ export class SingleFieldHolder<
|
|
|
18
18
|
TFields extends Record<string, any>,
|
|
19
19
|
TIDField extends keyof TFields,
|
|
20
20
|
N extends keyof TFields,
|
|
21
|
-
> implements
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
> implements IEntityLoadKey<
|
|
22
|
+
TFields,
|
|
23
|
+
TIDField,
|
|
24
|
+
NonNullable<TFields[N]>,
|
|
25
|
+
SingleFieldValueHolder<TFields, N>
|
|
26
|
+
> {
|
|
24
27
|
constructor(public readonly fieldName: N) {}
|
|
25
28
|
|
|
26
29
|
toString(): string {
|
|
@@ -102,9 +105,10 @@ export class SingleFieldHolder<
|
|
|
102
105
|
*
|
|
103
106
|
* @internal
|
|
104
107
|
*/
|
|
105
|
-
export class SingleFieldValueHolder<
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
export class SingleFieldValueHolder<
|
|
109
|
+
TFields extends Record<string, any>,
|
|
110
|
+
N extends keyof TFields,
|
|
111
|
+
> implements IEntityLoadValue<NonNullable<TFields[N]>> {
|
|
108
112
|
constructor(public readonly fieldValue: NonNullable<TFields[N]>) {}
|
|
109
113
|
|
|
110
114
|
toString(): string {
|