@expo/entity 0.48.0 → 0.50.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 (55) hide show
  1. package/build/src/EntityDatabaseAdapter.js +12 -5
  2. package/build/src/EntityDatabaseAdapter.js.map +1 -1
  3. package/build/src/EntityFields.d.ts +3 -1
  4. package/build/src/EntityFields.js +4 -2
  5. package/build/src/EntityFields.js.map +1 -1
  6. package/build/src/EntityMutationValidator.js +2 -0
  7. package/build/src/EntityMutationValidator.js.map +1 -1
  8. package/build/src/IEntityCacheAdapter.js +2 -0
  9. package/build/src/IEntityCacheAdapter.js.map +1 -1
  10. package/build/src/IEntityCacheAdapterProvider.js +2 -0
  11. package/build/src/IEntityCacheAdapterProvider.js.map +1 -1
  12. package/build/src/IEntityDatabaseAdapterProvider.js +2 -0
  13. package/build/src/IEntityDatabaseAdapterProvider.js.map +1 -1
  14. package/build/src/IEntityGenericCacher.js +2 -0
  15. package/build/src/IEntityGenericCacher.js.map +1 -1
  16. package/build/src/entityUtils.d.ts +2 -2
  17. package/build/src/entityUtils.js.map +1 -1
  18. package/build/src/errors/EntityCacheAdapterError.d.ts +7 -0
  19. package/build/src/errors/EntityCacheAdapterError.js +7 -0
  20. package/build/src/errors/EntityCacheAdapterError.js.map +1 -1
  21. package/build/src/errors/EntityDatabaseAdapterError.d.ts +78 -0
  22. package/build/src/errors/EntityDatabaseAdapterError.js +84 -1
  23. package/build/src/errors/EntityDatabaseAdapterError.js.map +1 -1
  24. package/build/src/errors/EntityError.d.ts +14 -0
  25. package/build/src/errors/EntityError.js +14 -0
  26. package/build/src/errors/EntityError.js.map +1 -1
  27. package/build/src/errors/EntityInvalidFieldValueError.d.ts +3 -0
  28. package/build/src/errors/EntityInvalidFieldValueError.js +3 -0
  29. package/build/src/errors/EntityInvalidFieldValueError.js.map +1 -1
  30. package/build/src/errors/EntityNotAuthorizedError.d.ts +3 -0
  31. package/build/src/errors/EntityNotAuthorizedError.js +3 -0
  32. package/build/src/errors/EntityNotAuthorizedError.js.map +1 -1
  33. package/build/src/errors/EntityNotFoundError.d.ts +3 -0
  34. package/build/src/errors/EntityNotFoundError.js +3 -0
  35. package/build/src/errors/EntityNotFoundError.js.map +1 -1
  36. package/package.json +2 -2
  37. package/src/EntityDatabaseAdapter.ts +18 -5
  38. package/src/EntityFields.ts +4 -2
  39. package/src/EntityMutationValidator.ts +4 -0
  40. package/src/IEntityCacheAdapter.ts +4 -0
  41. package/src/IEntityCacheAdapterProvider.ts +4 -0
  42. package/src/IEntityDatabaseAdapterProvider.ts +4 -0
  43. package/src/IEntityGenericCacher.ts +4 -0
  44. package/src/__tests__/EntityDatabaseAdapter-test.ts +12 -5
  45. package/src/__tests__/EntityFields-test.ts +1 -1
  46. package/src/__tests__/GenericEntityCacheAdapter-test.ts +24 -0
  47. package/src/__tests__/GenericSecondaryEntityCache-test.ts +180 -0
  48. package/src/entityUtils.ts +5 -3
  49. package/src/errors/EntityCacheAdapterError.ts +7 -0
  50. package/src/errors/EntityDatabaseAdapterError.ts +83 -0
  51. package/src/errors/EntityError.ts +14 -0
  52. package/src/errors/EntityInvalidFieldValueError.ts +3 -0
  53. package/src/errors/EntityNotAuthorizedError.ts +3 -0
  54. package/src/errors/EntityNotFoundError.ts +3 -0
  55. package/src/utils/__testfixtures__/StubDatabaseAdapter.ts +11 -1
@@ -1,11 +1,17 @@
1
1
  import ES6Error from 'es6-error';
2
2
 
3
+ /**
4
+ * The state of an entity error, indicating whether it may be transient/retryable.
5
+ */
3
6
  export enum EntityErrorState {
4
7
  UNKNOWN,
5
8
  TRANSIENT,
6
9
  PERMANENT,
7
10
  }
8
11
 
12
+ /**
13
+ * Error code for an entity error. Each error code should map to a specific class of Entity error.
14
+ */
9
15
  export enum EntityErrorCode {
10
16
  ERR_ENTITY_NOT_AUTHORIZED = 'ERR_ENTITY_NOT_AUTHORIZED',
11
17
  ERR_ENTITY_NOT_FOUND = 'ERR_ENTITY_NOT_FOUND',
@@ -17,9 +23,17 @@ export enum EntityErrorCode {
17
23
  ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT',
18
24
  ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT',
19
25
  ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT',
26
+ ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT',
27
+ ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT',
28
+ ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_UPDATE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_UPDATE_RESULT',
29
+ ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT',
30
+ ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT',
20
31
  ERR_ENTITY_CACHE_ADAPTER_TRANSIENT = 'ERR_ENTITY_CACHE_ADAPTER_TRANSIENT',
21
32
  }
22
33
 
34
+ /**
35
+ * Base class for all known errors thrown by the entity system.
36
+ */
23
37
  export abstract class EntityError extends ES6Error {
24
38
  public abstract readonly state: EntityErrorState;
25
39
  public abstract readonly code: EntityErrorCode;
@@ -4,6 +4,9 @@ import { ReadonlyEntity } from '../ReadonlyEntity';
4
4
  import { ViewerContext } from '../ViewerContext';
5
5
  import { EntityError, EntityErrorCode, EntityErrorState } from './EntityError';
6
6
 
7
+ /**
8
+ * Error thrown when an entity field has an invalid value, either during load or mutation.
9
+ */
7
10
  export class EntityInvalidFieldValueError<
8
11
  TFields extends Record<string, any>,
9
12
  TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
@@ -3,6 +3,9 @@ import { ReadonlyEntity } from '../ReadonlyEntity';
3
3
  import { ViewerContext } from '../ViewerContext';
4
4
  import { EntityError, EntityErrorCode, EntityErrorState } from './EntityError';
5
5
 
6
+ /**
7
+ * Error thrown when viewer context is not authorized to perform an action on an entity.
8
+ */
6
9
  export class EntityNotAuthorizedError<
7
10
  TFields extends Record<string, any>,
8
11
  TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
@@ -31,6 +31,9 @@ type EntityNotFoundOptions<
31
31
  fieldValue: TFields[N];
32
32
  };
33
33
 
34
+ /**
35
+ * Error thrown when an entity is not found during certain load methods.
36
+ */
34
37
  export class EntityNotFoundError<
35
38
  TFields extends Record<string, any>,
36
39
  TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
@@ -234,7 +234,13 @@ export class StubDatabaseAdapter<
234
234
  const objectIndex = objectCollection.findIndex((obj) => {
235
235
  return obj[tableIdField] === id;
236
236
  });
237
- invariant(objectIndex >= 0, 'should exist');
237
+
238
+ // SQL updates to a nonexistent row succeed but affect 0 rows,
239
+ // mirror that behavior here for better test simulation
240
+ if (objectIndex < 0) {
241
+ return [];
242
+ }
243
+
238
244
  objectCollection[objectIndex] = {
239
245
  ...objectCollection[objectIndex],
240
246
  ...object,
@@ -253,9 +259,13 @@ export class StubDatabaseAdapter<
253
259
  const objectIndex = objectCollection.findIndex((obj) => {
254
260
  return obj[tableIdField] === id;
255
261
  });
262
+
263
+ // SQL deletes to a nonexistent row succeed and affect 0 rows,
264
+ // mirror that behavior here for better test simulation
256
265
  if (objectIndex < 0) {
257
266
  return 0;
258
267
  }
268
+
259
269
  objectCollection.splice(objectIndex, 1);
260
270
  return 1;
261
271
  }