@expo/entity 0.21.0 → 0.24.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/build/EntityCacheAdapter.d.ts +2 -9
  2. package/build/EntityCacheAdapter.js.map +1 -1
  3. package/build/EntityFieldDefinition.d.ts +8 -0
  4. package/build/EntityFieldDefinition.js +5 -0
  5. package/build/EntityFieldDefinition.js.map +1 -1
  6. package/build/EntityFields.d.ts +38 -0
  7. package/build/EntityFields.js +38 -0
  8. package/build/EntityFields.js.map +1 -1
  9. package/build/GenericSecondaryEntityCache.d.ts +19 -0
  10. package/build/GenericSecondaryEntityCache.js +74 -0
  11. package/build/GenericSecondaryEntityCache.js.map +1 -0
  12. package/build/IEntityGenericCacher.d.ts +11 -0
  13. package/build/IEntityGenericCacher.js +3 -0
  14. package/build/IEntityGenericCacher.js.map +1 -0
  15. package/build/index.d.ts +2 -0
  16. package/build/index.js +3 -1
  17. package/build/index.js.map +1 -1
  18. package/build/internal/ReadThroughEntityCache.d.ts +2 -3
  19. package/build/internal/ReadThroughEntityCache.js +2 -6
  20. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  21. package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -32
  22. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  23. package/build/utils/testing/StubCacheAdapter.d.ts +6 -9
  24. package/build/utils/testing/StubCacheAdapter.js +0 -6
  25. package/build/utils/testing/StubCacheAdapter.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/EntityCacheAdapter.ts +2 -10
  28. package/src/EntityFieldDefinition.ts +8 -0
  29. package/src/EntityFields.ts +45 -0
  30. package/src/GenericSecondaryEntityCache.ts +98 -0
  31. package/src/IEntityGenericCacher.ts +15 -0
  32. package/src/index.ts +2 -0
  33. package/src/internal/ReadThroughEntityCache.ts +6 -28
  34. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +0 -44
  35. package/src/utils/testing/StubCacheAdapter.ts +11 -17
@@ -1,5 +1,4 @@
1
1
  import EntityConfiguration from './EntityConfiguration';
2
- import { FieldTransformerMap } from './internal/EntityFieldTransformationUtils';
3
2
  import { CacheLoadResult } from './internal/ReadThroughEntityCache';
4
3
  /**
5
4
  * A cache adapter is an interface by which objects can be
@@ -8,25 +7,19 @@ import { CacheLoadResult } from './internal/ReadThroughEntityCache';
8
7
  export default abstract class EntityCacheAdapter<TFields> {
9
8
  protected readonly entityConfiguration: EntityConfiguration<TFields>;
10
9
  constructor(entityConfiguration: EntityConfiguration<TFields>);
11
- /**
12
- * Transformer definitions for field types. Used to modify values as they are read from or written to
13
- * the cache. Override in concrete subclasses to change transformation behavior.
14
- * If a field type is not present in the map, then fields of that type will not be transformed.
15
- */
16
- abstract getFieldTransformerMap(): FieldTransformerMap;
17
10
  /**
18
11
  * Load many objects from cache.
19
12
  * @param fieldName - object field being queried
20
13
  * @param fieldValues - fieldName field values being queried
21
14
  * @returns map from all field values to a CacheLoadResult for each input value
22
15
  */
23
- abstract loadManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult>>;
16
+ abstract loadManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>>;
24
17
  /**
25
18
  * Cache many objects fetched from the DB.
26
19
  * @param fieldName - object field being queried
27
20
  * @param objectMap - map from field value to object to cache
28
21
  */
29
- abstract cacheManyAsync<N extends keyof TFields>(fieldName: N, objectMap: ReadonlyMap<NonNullable<TFields[N]>, object>): Promise<void>;
22
+ abstract cacheManyAsync<N extends keyof TFields>(fieldName: N, objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>): Promise<void>;
30
23
  /**
31
24
  * Negatively cache objects that could not be found in the cache or DB.
32
25
  * @param fieldName - object field being queried
@@ -1 +1 @@
1
- {"version":3,"file":"EntityCacheAdapter.js","sourceRoot":"","sources":["../src/EntityCacheAdapter.ts"],"names":[],"mappings":";;AAIA;;;GAGG;AACH,MAA8B,kBAAkB;IAC9C,YAA+B,mBAAiD;QAAjD,wBAAmB,GAAnB,mBAAmB,CAA8B;IAAG,CAAC;CAkDrF;AAnDD,qCAmDC"}
1
+ {"version":3,"file":"EntityCacheAdapter.js","sourceRoot":"","sources":["../src/EntityCacheAdapter.ts"],"names":[],"mappings":";;AAGA;;;GAGG;AACH,MAA8B,kBAAkB;IAC9C,YAA+B,mBAAiD;QAAjD,wBAAmB,GAAnB,mBAAmB,CAA8B;IAAG,CAAC;CA2CrF;AA5CD,qCA4CC"}
@@ -24,6 +24,9 @@ export declare enum EntityEdgeDeletionBehavior {
24
24
  */
25
25
  SET_NULL = 2
26
26
  }
27
+ /**
28
+ * Defines an association between entities. An association is primarily used to define cascading deletion behavior.
29
+ */
27
30
  export interface EntityAssociationDefinition<TViewerContext extends ViewerContext, TAssociatedFields, TAssociatedID extends NonNullable<TAssociatedFields[TAssociatedSelectedFields]>, TAssociatedEntity extends ReadonlyEntity<TAssociatedFields, TAssociatedID, TViewerContext, TAssociatedSelectedFields>, TAssociatedPrivacyPolicy extends EntityPrivacyPolicy<TAssociatedFields, TAssociatedID, TViewerContext, TAssociatedEntity, TAssociatedSelectedFields>, TAssociatedSelectedFields extends keyof TAssociatedFields = keyof TAssociatedFields> {
28
31
  /**
29
32
  * Class of entity on the other end of this edge.
@@ -51,6 +54,10 @@ export interface EntityAssociationDefinition<TViewerContext extends ViewerContex
51
54
  */
52
55
  edgeDeletionBehavior?: EntityEdgeDeletionBehavior;
53
56
  }
57
+ /**
58
+ * Definition for a field referencing a column in the underlying database. Specifies things like
59
+ * cache behavior and associations, and handles input validation.
60
+ */
54
61
  export declare abstract class EntityFieldDefinition<T> {
55
62
  readonly columnName: string;
56
63
  readonly cache: boolean;
@@ -61,6 +68,7 @@ export declare abstract class EntityFieldDefinition<T> {
61
68
  * @param cache - Whether or not to cache loaded instances of the entity by this field. The column name is
62
69
  * used to derive a cache key for the cache entry. If true, this column must be able uniquely
63
70
  * identify the entity.
71
+ * @param association - Defines the association behavior for an entity that this column references.
64
72
  */
65
73
  constructor({ columnName, cache, association, }: {
66
74
  columnName: string;
@@ -24,6 +24,10 @@ var EntityEdgeDeletionBehavior;
24
24
  */
25
25
  EntityEdgeDeletionBehavior[EntityEdgeDeletionBehavior["SET_NULL"] = 2] = "SET_NULL";
26
26
  })(EntityEdgeDeletionBehavior = exports.EntityEdgeDeletionBehavior || (exports.EntityEdgeDeletionBehavior = {}));
27
+ /**
28
+ * Definition for a field referencing a column in the underlying database. Specifies things like
29
+ * cache behavior and associations, and handles input validation.
30
+ */
27
31
  class EntityFieldDefinition {
28
32
  /**
29
33
  *
@@ -31,6 +35,7 @@ class EntityFieldDefinition {
31
35
  * @param cache - Whether or not to cache loaded instances of the entity by this field. The column name is
32
36
  * used to derive a cache key for the cache entry. If true, this column must be able uniquely
33
37
  * identify the entity.
38
+ * @param association - Defines the association behavior for an entity that this column references.
34
39
  */
35
40
  constructor({ columnName, cache = false, association, }) {
36
41
  this.columnName = columnName;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFieldDefinition.js","sourceRoot":"","sources":["../src/EntityFieldDefinition.ts"],"names":[],"mappings":";;;AAKA,IAAY,0BAuBX;AAvBD,WAAY,0BAA0B;IACpC;;;;;;OAMG;IACH,iIAA+B,CAAA;IAE/B;;;;OAIG;IACH,+FAAc,CAAA;IAEd;;;;OAIG;IACH,mFAAQ,CAAA;AACV,CAAC,EAvBW,0BAA0B,GAA1B,kCAA0B,KAA1B,kCAA0B,QAuBrC;AAyDD,MAAsB,qBAAqB;IAIzC;;;;;;OAMG;IACH,YAAY,EACV,UAAU,EACV,KAAK,GAAG,KAAK,EACb,WAAW,GAKZ;QACC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,KAA2B;QACnD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;YACzC,OAAO,IAAI,CAAC;SACb;QAED,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CAEF;AAtCD,sDAsCC"}
1
+ {"version":3,"file":"EntityFieldDefinition.js","sourceRoot":"","sources":["../src/EntityFieldDefinition.ts"],"names":[],"mappings":";;;AAKA,IAAY,0BAuBX;AAvBD,WAAY,0BAA0B;IACpC;;;;;;OAMG;IACH,iIAA+B,CAAA;IAE/B;;;;OAIG;IACH,+FAAc,CAAA;IAEd;;;;OAIG;IACH,mFAAQ,CAAA;AACV,CAAC,EAvBW,0BAA0B,GAA1B,kCAA0B,KAA1B,kCAA0B,QAuBrC;AA4DD;;;GAGG;AACH,MAAsB,qBAAqB;IAIzC;;;;;;;OAOG;IACH,YAAY,EACV,UAAU,EACV,KAAK,GAAG,KAAK,EACb,WAAW,GAKZ;QACC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,KAA2B;QACnD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;YACzC,OAAO,IAAI,CAAC;SACb;QAED,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CAEF;AAvCD,sDAuCC"}
@@ -1,34 +1,72 @@
1
1
  import { EntityFieldDefinition } from './EntityFieldDefinition';
2
+ /**
3
+ * {@link EntityFieldDefinition} for a column with a JS string type.
4
+ */
2
5
  export declare class StringField extends EntityFieldDefinition<string> {
3
6
  protected validateInputValueInternal(value: string): boolean;
4
7
  }
8
+ /**
9
+ * {@link EntityFieldDefinition} for a column with a JS string type.
10
+ * Enforces that the string is a valid UUID.
11
+ */
5
12
  export declare class UUIDField extends StringField {
6
13
  protected validateInputValueInternal(value: string): boolean;
7
14
  }
15
+ /**
16
+ * {@link EntityFieldDefinition} for a column with a JS Date type.
17
+ */
8
18
  export declare class DateField extends EntityFieldDefinition<Date> {
9
19
  protected validateInputValueInternal(value: Date): boolean;
10
20
  }
21
+ /**
22
+ * {@link EntityFieldDefinition} for a column with a JS boolean type.
23
+ */
11
24
  export declare class BooleanField extends EntityFieldDefinition<boolean> {
12
25
  protected validateInputValueInternal(value: boolean): boolean;
13
26
  }
27
+ /**
28
+ * {@link EntityFieldDefinition} for a column with a JS number type.
29
+ * Enforces that the number is an integer.
30
+ */
14
31
  export declare class IntField extends EntityFieldDefinition<number> {
15
32
  protected validateInputValueInternal(value: number): boolean;
16
33
  }
34
+ /**
35
+ * {@link EntityFieldDefinition} for a column with a JS number type.
36
+ * Enforces that the number is a float (which includes integers in JS).
37
+ */
17
38
  export declare class FloatField extends EntityFieldDefinition<number> {
18
39
  protected validateInputValueInternal(value: number): boolean;
19
40
  }
41
+ /**
42
+ * {@link EntityFieldDefinition} for a column with a JS string array type.
43
+ * Enforces that every member of the string array is a string.
44
+ */
20
45
  export declare class StringArrayField extends EntityFieldDefinition<string[]> {
21
46
  protected validateInputValueInternal(value: string[]): boolean;
22
47
  }
48
+ /**
49
+ * {@link EntityFieldDefinition} for a column with a JS JSON object type.
50
+ */
23
51
  export declare class JSONObjectField extends EntityFieldDefinition<object> {
24
52
  protected validateInputValueInternal(value: object): boolean;
25
53
  }
54
+ /**
55
+ * {@link EntityFieldDefinition} for a enum column with a JS string or number type.
56
+ */
26
57
  export declare class EnumField extends EntityFieldDefinition<string | number> {
27
58
  protected validateInputValueInternal(value: string | number): boolean;
28
59
  }
60
+ /**
61
+ * {@link EntityFieldDefinition} for a column with a JS JSON array type.
62
+ */
29
63
  export declare class JSONArrayField extends EntityFieldDefinition<any[]> {
30
64
  protected validateInputValueInternal(value: any[]): boolean;
31
65
  }
66
+ /**
67
+ * {@link EntityFieldDefinition} for a column that may be a JS JSON array type.
68
+ * Does not do any validation.
69
+ */
32
70
  export declare class MaybeJSONArrayField extends EntityFieldDefinition<any | any[]> {
33
71
  protected validateInputValueInternal(_value: any): boolean;
34
72
  }
@@ -3,66 +3,104 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MaybeJSONArrayField = exports.JSONArrayField = exports.EnumField = exports.JSONObjectField = exports.StringArrayField = exports.FloatField = exports.IntField = exports.BooleanField = exports.DateField = exports.UUIDField = exports.StringField = void 0;
4
4
  const uuid_1 = require("uuid");
5
5
  const EntityFieldDefinition_1 = require("./EntityFieldDefinition");
6
+ /**
7
+ * {@link EntityFieldDefinition} for a column with a JS string type.
8
+ */
6
9
  class StringField extends EntityFieldDefinition_1.EntityFieldDefinition {
7
10
  validateInputValueInternal(value) {
8
11
  return typeof value === 'string';
9
12
  }
10
13
  }
11
14
  exports.StringField = StringField;
15
+ /**
16
+ * {@link EntityFieldDefinition} for a column with a JS string type.
17
+ * Enforces that the string is a valid UUID.
18
+ */
12
19
  class UUIDField extends StringField {
13
20
  validateInputValueInternal(value) {
14
21
  return (0, uuid_1.validate)(value);
15
22
  }
16
23
  }
17
24
  exports.UUIDField = UUIDField;
25
+ /**
26
+ * {@link EntityFieldDefinition} for a column with a JS Date type.
27
+ */
18
28
  class DateField extends EntityFieldDefinition_1.EntityFieldDefinition {
19
29
  validateInputValueInternal(value) {
20
30
  return value instanceof Date;
21
31
  }
22
32
  }
23
33
  exports.DateField = DateField;
34
+ /**
35
+ * {@link EntityFieldDefinition} for a column with a JS boolean type.
36
+ */
24
37
  class BooleanField extends EntityFieldDefinition_1.EntityFieldDefinition {
25
38
  validateInputValueInternal(value) {
26
39
  return typeof value === 'boolean';
27
40
  }
28
41
  }
29
42
  exports.BooleanField = BooleanField;
43
+ /**
44
+ * {@link EntityFieldDefinition} for a column with a JS number type.
45
+ * Enforces that the number is an integer.
46
+ */
30
47
  class IntField extends EntityFieldDefinition_1.EntityFieldDefinition {
31
48
  validateInputValueInternal(value) {
32
49
  return typeof value === 'number' && Number.isInteger(value);
33
50
  }
34
51
  }
35
52
  exports.IntField = IntField;
53
+ /**
54
+ * {@link EntityFieldDefinition} for a column with a JS number type.
55
+ * Enforces that the number is a float (which includes integers in JS).
56
+ */
36
57
  class FloatField extends EntityFieldDefinition_1.EntityFieldDefinition {
37
58
  validateInputValueInternal(value) {
38
59
  return typeof value === 'number';
39
60
  }
40
61
  }
41
62
  exports.FloatField = FloatField;
63
+ /**
64
+ * {@link EntityFieldDefinition} for a column with a JS string array type.
65
+ * Enforces that every member of the string array is a string.
66
+ */
42
67
  class StringArrayField extends EntityFieldDefinition_1.EntityFieldDefinition {
43
68
  validateInputValueInternal(value) {
44
69
  return Array.isArray(value) && value.every((subValue) => typeof subValue === 'string');
45
70
  }
46
71
  }
47
72
  exports.StringArrayField = StringArrayField;
73
+ /**
74
+ * {@link EntityFieldDefinition} for a column with a JS JSON object type.
75
+ */
48
76
  class JSONObjectField extends EntityFieldDefinition_1.EntityFieldDefinition {
49
77
  validateInputValueInternal(value) {
50
78
  return typeof value === 'object' && !Array.isArray(value);
51
79
  }
52
80
  }
53
81
  exports.JSONObjectField = JSONObjectField;
82
+ /**
83
+ * {@link EntityFieldDefinition} for a enum column with a JS string or number type.
84
+ */
54
85
  class EnumField extends EntityFieldDefinition_1.EntityFieldDefinition {
55
86
  validateInputValueInternal(value) {
56
87
  return typeof value === 'number' || typeof value === 'string';
57
88
  }
58
89
  }
59
90
  exports.EnumField = EnumField;
91
+ /**
92
+ * {@link EntityFieldDefinition} for a column with a JS JSON array type.
93
+ */
60
94
  class JSONArrayField extends EntityFieldDefinition_1.EntityFieldDefinition {
61
95
  validateInputValueInternal(value) {
62
96
  return Array.isArray(value);
63
97
  }
64
98
  }
65
99
  exports.JSONArrayField = JSONArrayField;
100
+ /**
101
+ * {@link EntityFieldDefinition} for a column that may be a JS JSON array type.
102
+ * Does not do any validation.
103
+ */
66
104
  class MaybeJSONArrayField extends EntityFieldDefinition_1.EntityFieldDefinition {
67
105
  validateInputValueInternal(_value) {
68
106
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFields.js","sourceRoot":"","sources":["../src/EntityFields.ts"],"names":[],"mappings":";;;AAAA,+BAAgD;AAEhD,mEAAgE;AAEhE,MAAa,WAAY,SAAQ,6CAA6B;IAClD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,kCAIC;AACD,MAAa,SAAU,SAAQ,WAAW;IACrB,0BAA0B,CAAC,KAAa;QACzD,OAAO,IAAA,eAAY,EAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAJD,8BAIC;AACD,MAAa,SAAU,SAAQ,6CAA2B;IAC9C,0BAA0B,CAAC,KAAW;QAC9C,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;CACF;AAJD,8BAIC;AACD,MAAa,YAAa,SAAQ,6CAA8B;IACpD,0BAA0B,CAAC,KAAc;QACjD,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;IACpC,CAAC;CACF;AAJD,oCAIC;AAED,MAAa,QAAS,SAAQ,6CAA6B;IAC/C,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAJD,4BAIC;AAED,MAAa,UAAW,SAAQ,6CAA6B;IACjD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,gCAIC;AAED,MAAa,gBAAiB,SAAQ,6CAA+B;IACzD,0BAA0B,CAAC,KAAe;QAClD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzF,CAAC;CACF;AAJD,4CAIC;AACD,MAAa,eAAgB,SAAQ,6CAA6B;IACtD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF;AAJD,0CAIC;AACD,MAAa,SAAU,SAAQ,6CAAsC;IACzD,0BAA0B,CAAC,KAAsB;QACzD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;IAChE,CAAC;CACF;AAJD,8BAIC;AACD,MAAa,cAAe,SAAQ,6CAA4B;IACpD,0BAA0B,CAAC,KAAY;QAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAJD,wCAIC;AACD,MAAa,mBAAoB,SAAQ,6CAAkC;IAC/D,0BAA0B,CAAC,MAAW;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAJD,kDAIC"}
1
+ {"version":3,"file":"EntityFields.js","sourceRoot":"","sources":["../src/EntityFields.ts"],"names":[],"mappings":";;;AAAA,+BAAgD;AAEhD,mEAAgE;AAEhE;;GAEG;AACH,MAAa,WAAY,SAAQ,6CAA6B;IAClD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,kCAIC;AAED;;;GAGG;AACH,MAAa,SAAU,SAAQ,WAAW;IACrB,0BAA0B,CAAC,KAAa;QACzD,OAAO,IAAA,eAAY,EAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,6CAA2B;IAC9C,0BAA0B,CAAC,KAAW;QAC9C,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,6CAA8B;IACpD,0BAA0B,CAAC,KAAc;QACjD,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;IACpC,CAAC;CACF;AAJD,oCAIC;AAED;;;GAGG;AACH,MAAa,QAAS,SAAQ,6CAA6B;IAC/C,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAJD,4BAIC;AAED;;;GAGG;AACH,MAAa,UAAW,SAAQ,6CAA6B;IACjD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,gCAIC;AAED;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,6CAA+B;IACzD,0BAA0B,CAAC,KAAe;QAClD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzF,CAAC;CACF;AAJD,4CAIC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,6CAA6B;IACtD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF;AAJD,0CAIC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,6CAAsC;IACzD,0BAA0B,CAAC,KAAsB;QACzD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;IAChE,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,cAAe,SAAQ,6CAA4B;IACpD,0BAA0B,CAAC,KAAY;QAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAJD,wCAIC;AAED;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,6CAAkC;IAC/D,0BAA0B,CAAC,MAAW;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAJD,kDAIC"}
@@ -0,0 +1,19 @@
1
+ import { ISecondaryEntityCache } from './EntitySecondaryCacheLoader';
2
+ import IEntityGenericCacher from './IEntityGenericCacher';
3
+ /**
4
+ * A custom secondary read-through entity cache is a way to add a custom second layer of caching for a particular
5
+ * single entity load. One common way this may be used is to add a second layer of caching in a hot path that makes
6
+ * a call to {@link EntityLoader.loadManyByFieldEqualityConjunctionAsync} is guaranteed to return at most one entity.
7
+ */
8
+ export default abstract class GenericSecondaryEntityCache<TFields, TLoadParams> implements ISecondaryEntityCache<TFields, TLoadParams> {
9
+ protected readonly cacher: IEntityGenericCacher<TFields>;
10
+ protected readonly constructCacheKey: (params: Readonly<TLoadParams>) => string;
11
+ constructor(cacher: IEntityGenericCacher<TFields>, constructCacheKey: (params: Readonly<TLoadParams>) => string);
12
+ loadManyThroughAsync(loadParamsArray: readonly Readonly<TLoadParams>[], fetcher: (fetcherLoadParamsArray: readonly Readonly<TLoadParams>[]) => Promise<ReadonlyMap<Readonly<TLoadParams>, Readonly<TFields> | null>>): Promise<ReadonlyMap<Readonly<TLoadParams>, Readonly<TFields> | null>>;
13
+ /**
14
+ * Invalidate the cache for objects cached by constructCacheKey(loadParams).
15
+ *
16
+ * @param loadParamsArray - load params to invalidate
17
+ */
18
+ invalidateManyAsync(loadParamsArray: readonly Readonly<TLoadParams>[]): Promise<void>;
19
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const invariant_1 = __importDefault(require("invariant"));
7
+ const ReadThroughEntityCache_1 = require("./internal/ReadThroughEntityCache");
8
+ const maps_1 = require("./utils/collections/maps");
9
+ /**
10
+ * A custom secondary read-through entity cache is a way to add a custom second layer of caching for a particular
11
+ * single entity load. One common way this may be used is to add a second layer of caching in a hot path that makes
12
+ * a call to {@link EntityLoader.loadManyByFieldEqualityConjunctionAsync} is guaranteed to return at most one entity.
13
+ */
14
+ class GenericSecondaryEntityCache {
15
+ constructor(cacher, constructCacheKey) {
16
+ this.cacher = cacher;
17
+ this.constructCacheKey = constructCacheKey;
18
+ }
19
+ async loadManyThroughAsync(loadParamsArray, fetcher) {
20
+ const cacheKeys = loadParamsArray.map(this.constructCacheKey);
21
+ const cacheKeyToLoadParamsMap = (0, maps_1.zipToMap)(cacheKeys, loadParamsArray);
22
+ const cacheLoadResults = await this.cacher.loadManyAsync(cacheKeys);
23
+ (0, invariant_1.default)(cacheLoadResults.size === loadParamsArray.length, `${this.constructor.name} loadMany should return a result for each key`);
24
+ const cacheKeysToFetch = Array.from((0, maps_1.filterMap)(cacheLoadResults, (cacheLoadResult) => cacheLoadResult.status === ReadThroughEntityCache_1.CacheStatus.MISS).keys());
25
+ // put cache hits in result map
26
+ const results = new Map();
27
+ cacheLoadResults.forEach((cacheLoadResult, cacheKey) => {
28
+ if (cacheLoadResult.status === ReadThroughEntityCache_1.CacheStatus.HIT) {
29
+ const loadParams = cacheKeyToLoadParamsMap.get(cacheKey);
30
+ (0, invariant_1.default)(loadParams !== undefined, 'load params should be in cache key map');
31
+ results.set(loadParams, cacheLoadResult.item);
32
+ }
33
+ });
34
+ // fetch any misses from DB, add DB objects to results, cache DB results, inform cache of any missing DB results
35
+ if (cacheKeysToFetch.length > 0) {
36
+ const loadParamsToFetch = cacheKeysToFetch.map((cacheKey) => {
37
+ const loadParams = cacheKeyToLoadParamsMap.get(cacheKey);
38
+ (0, invariant_1.default)(loadParams !== undefined, 'load params should be in cache key map');
39
+ return loadParams;
40
+ });
41
+ const fetchResults = await fetcher(loadParamsToFetch);
42
+ const fetchMisses = loadParamsToFetch.filter((loadParams) => {
43
+ // all values of fetchResults should be field objects or undefined
44
+ return !fetchResults.get(loadParams);
45
+ });
46
+ for (const fetchMiss of fetchMisses) {
47
+ results.set(fetchMiss, null);
48
+ }
49
+ const objectsToCache = new Map();
50
+ for (const [loadParams, object] of fetchResults.entries()) {
51
+ if (object) {
52
+ objectsToCache.set(this.constructCacheKey(loadParams), object);
53
+ results.set(loadParams, object);
54
+ }
55
+ }
56
+ await Promise.all([
57
+ this.cacher.cacheManyAsync(objectsToCache),
58
+ this.cacher.cacheDBMissesAsync(fetchMisses.map(this.constructCacheKey)),
59
+ ]);
60
+ }
61
+ return results;
62
+ }
63
+ /**
64
+ * Invalidate the cache for objects cached by constructCacheKey(loadParams).
65
+ *
66
+ * @param loadParamsArray - load params to invalidate
67
+ */
68
+ invalidateManyAsync(loadParamsArray) {
69
+ const cacheKeys = loadParamsArray.map(this.constructCacheKey);
70
+ return this.cacher.invalidateManyAsync(cacheKeys);
71
+ }
72
+ }
73
+ exports.default = GenericSecondaryEntityCache;
74
+ //# sourceMappingURL=GenericSecondaryEntityCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenericSecondaryEntityCache.js","sourceRoot":"","sources":["../src/GenericSecondaryEntityCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { CacheLoadResult } from './internal/ReadThroughEntityCache';
2
+ /**
3
+ * A cacher stores and loads key-value pairs. It also supports negative caching - it stores the absence
4
+ * of keys that don't exist in the backing datastore.
5
+ */
6
+ export default interface IEntityGenericCacher<TFields> {
7
+ loadManyAsync(keys: readonly string[]): Promise<ReadonlyMap<string, CacheLoadResult<TFields>>>;
8
+ cacheManyAsync(objectMap: ReadonlyMap<string, Readonly<TFields>>): Promise<void>;
9
+ cacheDBMissesAsync(keys: string[]): Promise<void>;
10
+ invalidateManyAsync(keys: string[]): Promise<void>;
11
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IEntityGenericCacher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEntityGenericCacher.js","sourceRoot":"","sources":["../src/IEntityGenericCacher.ts"],"names":[],"mappings":""}
package/build/index.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * @packageDocumentation
3
3
  * @module @expo/entity
4
4
  */
5
+ export { default as GenericSecondaryEntityCache } from './GenericSecondaryEntityCache';
5
6
  export { default as EnforcingEntityLoader } from './EnforcingEntityLoader';
6
7
  export { default as Entity } from './Entity';
7
8
  export * from './Entity';
@@ -41,6 +42,7 @@ export * from './EntityQueryContext';
41
42
  export { default as IEntityCacheAdapterProvider } from './IEntityCacheAdapterProvider';
42
43
  export { default as IEntityDatabaseAdapterProvider } from './IEntityDatabaseAdapterProvider';
43
44
  export { default as EntityQueryContextProvider } from './EntityQueryContextProvider';
45
+ export { default as IEntityGenericCacher } from './IEntityGenericCacher';
44
46
  export { default as ReadonlyEntity } from './ReadonlyEntity';
45
47
  export { default as ViewerContext } from './ViewerContext';
46
48
  export { default as ViewerScopedEntityCompanion } from './ViewerScopedEntityCompanion';
package/build/index.js CHANGED
@@ -18,7 +18,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
18
18
  return (mod && mod.__esModule) ? mod : { "default": mod };
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.StubQueryContextProvider = exports.StubDatabaseAdapterProvider = exports.StubDatabaseAdapter = exports.describeFieldTestCase = exports.PrivacyPolicyRule = exports.AlwaysSkipPrivacyPolicyRule = exports.AlwaysDenyPrivacyPolicyRule = exports.AlwaysAllowPrivacyPolicyRule = exports.NoOpEntityMetricsAdapter = exports.ReadThroughEntityCache = exports.EntityDataManager = exports.ViewerScopedEntityMutatorFactory = exports.ViewerScopedEntityLoaderFactory = exports.ViewerScopedEntityCompanionProvider = exports.ViewerScopedEntityCompanion = exports.ViewerContext = exports.ReadonlyEntity = exports.EntityQueryContextProvider = exports.EntityPrivacyPolicy = exports.EntityMutatorFactory = exports.EntityMutationValidator = exports.EntitySecondaryCacheLoader = exports.EntityLoaderFactory = exports.EntityLoader = exports.EntityNotFoundError = exports.EntityNotAuthorizedError = exports.EntityError = exports.EntityCacheAdapterError = exports.EntityDatabaseAdapterError = exports.EntityDatabaseAdapter = exports.EntityConfiguration = exports.EntityCompanionProvider = exports.EntityCompanion = exports.EntityCacheAdapter = exports.EntityAssociationLoader = exports.Entity = exports.EnforcingEntityLoader = void 0;
21
+ exports.StubQueryContextProvider = exports.StubDatabaseAdapterProvider = exports.StubDatabaseAdapter = exports.describeFieldTestCase = exports.PrivacyPolicyRule = exports.AlwaysSkipPrivacyPolicyRule = exports.AlwaysDenyPrivacyPolicyRule = exports.AlwaysAllowPrivacyPolicyRule = exports.NoOpEntityMetricsAdapter = exports.ReadThroughEntityCache = exports.EntityDataManager = exports.ViewerScopedEntityMutatorFactory = exports.ViewerScopedEntityLoaderFactory = exports.ViewerScopedEntityCompanionProvider = exports.ViewerScopedEntityCompanion = exports.ViewerContext = exports.ReadonlyEntity = exports.EntityQueryContextProvider = exports.EntityPrivacyPolicy = exports.EntityMutatorFactory = exports.EntityMutationValidator = exports.EntitySecondaryCacheLoader = exports.EntityLoaderFactory = exports.EntityLoader = exports.EntityNotFoundError = exports.EntityNotAuthorizedError = exports.EntityError = exports.EntityCacheAdapterError = exports.EntityDatabaseAdapterError = exports.EntityDatabaseAdapter = exports.EntityConfiguration = exports.EntityCompanionProvider = exports.EntityCompanion = exports.EntityCacheAdapter = exports.EntityAssociationLoader = exports.Entity = exports.EnforcingEntityLoader = exports.GenericSecondaryEntityCache = void 0;
22
+ var GenericSecondaryEntityCache_1 = require("./GenericSecondaryEntityCache");
23
+ Object.defineProperty(exports, "GenericSecondaryEntityCache", { enumerable: true, get: function () { return __importDefault(GenericSecondaryEntityCache_1).default; } });
22
24
  var EnforcingEntityLoader_1 = require("./EnforcingEntityLoader");
23
25
  Object.defineProperty(exports, "EnforcingEntityLoader", { enumerable: true, get: function () { return __importDefault(EnforcingEntityLoader_1).default; } });
24
26
  var Entity_1 = require("./Entity");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC;;;GAGG;;;;;;;;;;;;;;;;AAEH,iEAA2E;AAAlE,+IAAA,OAAO,OAAyB;AACzC,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,2CAAyB;AACzB,qEAA+E;AAAtE,mJAAA,OAAO,OAA2B;AAC3C,4DAA0C;AAC1C,2DAAqE;AAA5D,yIAAA,OAAO,OAAsB;AACtC,qDAA+D;AAAtD,mIAAA,OAAO,OAAmB;AACnC,oDAAkC;AAClC,qEAA+E;AAAtE,mJAAA,OAAO,OAA2B;AAC3C,4DAA0C;AAC1C,6DAAuE;AAA9D,2IAAA,OAAO,OAAuB;AACvC,iEAA2E;AAAlE,+IAAA,OAAO,OAAyB;AACzC,0DAAwC;AACxC,kFAA4F;AAAnF,yJAAA,OAAO,OAA8B;AAC9C,sEAAoD;AACpD,4EAAsF;AAA7E,mJAAA,OAAO,OAA2B;AAC3C,mEAAiD;AACjD,uDAAqC;AACrC,oDAA8D;AAArD,2HAAA,OAAO,OAAe;AAC/B,8EAAwF;AAA/E,qJAAA,OAAO,OAA4B;AAC5C,oEAA8E;AAArE,2IAAA,OAAO,OAAuB;AACvC,iDAA+B;AAC/B,0DAAwC;AACxC,+CAAyD;AAAhD,6HAAA,OAAO,OAAgB;AAChC,6DAAuE;AAA9D,2IAAA,OAAO,OAAuB;AACvC,2EAAqF;AAA5E,yJAAA,OAAO,OAA8B;AAC9C,+DAA6C;AAC7C,kDAAgC;AAChC,qEAA+E;AAAtE,mJAAA,OAAO,OAA2B;AAC3C,uDAAqC;AACrC,uEAAqD;AAErD,+DAAyE;AAAhE,6IAAA,OAAO,OAAwB;AACxC,6DAAuE;AAA9D,2IAAA,OAAO,OAAuB;AACvC,wDAAsC;AACtC,uDAAqC;AAGrC,2EAAqF;AAA5E,yJAAA,OAAO,OAA8B;AAC9C,mDAA6D;AAApD,iIAAA,OAAO,OAAkB;AAClC,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6EAAuF;AAA9E,2JAAA,OAAO,OAA+B;AAC/C,6FAAuG;AAA9F,2KAAA,OAAO,OAAuC;AACvD,qFAA+F;AAAtF,mKAAA,OAAO,OAAmC;AACnD,uFAAiG;AAAxF,qKAAA,OAAO,OAAoC;AACpD,gDAA8B;AAC9B,kEAA4E;AAAnE,uIAAA,OAAO,OAAqB;AACrC,4EAA0D;AAC1D,4EAAsF;AAA7E,iJAAA,OAAO,OAA0B;AAC1C,oEAAkD;AAClD,+DAA6C;AAE7C,kEAAgD;AAChD,+EAAyF;AAAhF,qJAAA,OAAO,OAA4B;AAC5C,qFAA+F;AAAtF,6JAAA,OAAO,OAAgC;AAChD,mFAA6F;AAApF,2JAAA,OAAO,OAA+B;AAC/C,mFAA6F;AAApF,2JAAA,OAAO,OAA+B;AAC/C,+DAAyE;AAAhE,uIAAA,OAAO,OAAqB;AACrC,4DAA0C;AAC1C,6EAA2D;AAC3D,mEAAiD;AACjD,+EAAyF;AAAhF,+IAAA,OAAO,OAAyB;AACzC,2EAAqF;AAA5E,2IAAA,OAAO,OAAuB;AACvC,2FAAqG;AAA5F,2JAAA,OAAO,OAA+B;AAC/C,qFAA+F;AAAtF,qJAAA,OAAO,OAA4B;AAC5C,wFAAsE;AACtE,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC;;;GAGG;;;;;;;;;;;;;;;;AAEH,6EAAuF;AAA9E,2JAAA,OAAO,OAA+B;AAC/C,iEAA2E;AAAlE,+IAAA,OAAO,OAAyB;AACzC,mCAA6C;AAApC,iHAAA,OAAO,OAAU;AAC1B,2CAAyB;AACzB,qEAA+E;AAAtE,mJAAA,OAAO,OAA2B;AAC3C,4DAA0C;AAC1C,2DAAqE;AAA5D,yIAAA,OAAO,OAAsB;AACtC,qDAA+D;AAAtD,mIAAA,OAAO,OAAmB;AACnC,oDAAkC;AAClC,qEAA+E;AAAtE,mJAAA,OAAO,OAA2B;AAC3C,4DAA0C;AAC1C,6DAAuE;AAA9D,2IAAA,OAAO,OAAuB;AACvC,iEAA2E;AAAlE,+IAAA,OAAO,OAAyB;AACzC,0DAAwC;AACxC,kFAA4F;AAAnF,yJAAA,OAAO,OAA8B;AAC9C,sEAAoD;AACpD,4EAAsF;AAA7E,mJAAA,OAAO,OAA2B;AAC3C,mEAAiD;AACjD,uDAAqC;AACrC,oDAA8D;AAArD,2HAAA,OAAO,OAAe;AAC/B,8EAAwF;AAA/E,qJAAA,OAAO,OAA4B;AAC5C,oEAA8E;AAArE,2IAAA,OAAO,OAAuB;AACvC,iDAA+B;AAC/B,0DAAwC;AACxC,+CAAyD;AAAhD,6HAAA,OAAO,OAAgB;AAChC,6DAAuE;AAA9D,2IAAA,OAAO,OAAuB;AACvC,2EAAqF;AAA5E,yJAAA,OAAO,OAA8B;AAC9C,+DAA6C;AAC7C,kDAAgC;AAChC,qEAA+E;AAAtE,mJAAA,OAAO,OAA2B;AAC3C,uDAAqC;AACrC,uEAAqD;AAErD,+DAAyE;AAAhE,6IAAA,OAAO,OAAwB;AACxC,6DAAuE;AAA9D,2IAAA,OAAO,OAAuB;AACvC,wDAAsC;AACtC,uDAAqC;AAGrC,2EAAqF;AAA5E,yJAAA,OAAO,OAA8B;AAE9C,mDAA6D;AAApD,iIAAA,OAAO,OAAkB;AAClC,iDAA2D;AAAlD,+HAAA,OAAO,OAAiB;AACjC,6EAAuF;AAA9E,2JAAA,OAAO,OAA+B;AAC/C,6FAAuG;AAA9F,2KAAA,OAAO,OAAuC;AACvD,qFAA+F;AAAtF,mKAAA,OAAO,OAAmC;AACnD,uFAAiG;AAAxF,qKAAA,OAAO,OAAoC;AACpD,gDAA8B;AAC9B,kEAA4E;AAAnE,uIAAA,OAAO,OAAqB;AACrC,4EAA0D;AAC1D,4EAAsF;AAA7E,iJAAA,OAAO,OAA0B;AAC1C,oEAAkD;AAClD,+DAA6C;AAE7C,kEAAgD;AAChD,+EAAyF;AAAhF,qJAAA,OAAO,OAA4B;AAC5C,qFAA+F;AAAtF,6JAAA,OAAO,OAAgC;AAChD,mFAA6F;AAApF,2JAAA,OAAO,OAA+B;AAC/C,mFAA6F;AAApF,2JAAA,OAAO,OAA+B;AAC/C,+DAAyE;AAAhE,uIAAA,OAAO,OAAqB;AACrC,4DAA0C;AAC1C,6EAA2D;AAC3D,mEAAiD;AACjD,+EAAyF;AAAhF,+IAAA,OAAO,OAAyB;AACzC,2EAAqF;AAA5E,2IAAA,OAAO,OAAuB;AACvC,2FAAqG;AAA5F,2JAAA,OAAO,OAA+B;AAC/C,qFAA+F;AAAtF,qJAAA,OAAO,OAA4B;AAC5C,wFAAsE;AACtE,2DAAyC"}
@@ -5,9 +5,9 @@ export declare enum CacheStatus {
5
5
  MISS = 1,
6
6
  NEGATIVE = 2
7
7
  }
8
- export declare type CacheLoadResult = {
8
+ export declare type CacheLoadResult<TFields> = {
9
9
  status: CacheStatus.HIT;
10
- item: Readonly<object>;
10
+ item: Readonly<TFields>;
11
11
  } | {
12
12
  status: CacheStatus.MISS;
13
13
  } | {
@@ -20,7 +20,6 @@ export declare type CacheLoadResult = {
20
20
  export default class ReadThroughEntityCache<TFields> {
21
21
  private readonly entityConfiguration;
22
22
  private readonly entityCacheAdapter;
23
- private readonly fieldTransformerMap;
24
23
  constructor(entityConfiguration: EntityConfiguration<TFields>, entityCacheAdapter: EntityCacheAdapter<TFields>);
25
24
  private isFieldCacheable;
26
25
  /**
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CacheStatus = void 0;
7
7
  const invariant_1 = __importDefault(require("invariant"));
8
8
  const maps_1 = require("../utils/collections/maps");
9
- const EntityFieldTransformationUtils_1 = require("./EntityFieldTransformationUtils");
10
9
  var CacheStatus;
11
10
  (function (CacheStatus) {
12
11
  CacheStatus[CacheStatus["HIT"] = 0] = "HIT";
@@ -21,7 +20,6 @@ class ReadThroughEntityCache {
21
20
  constructor(entityConfiguration, entityCacheAdapter) {
22
21
  this.entityConfiguration = entityConfiguration;
23
22
  this.entityCacheAdapter = entityCacheAdapter;
24
- this.fieldTransformerMap = entityCacheAdapter.getFieldTransformerMap();
25
23
  }
26
24
  isFieldCacheable(fieldName) {
27
25
  return this.entityConfiguration.cacheableKeys.has(fieldName);
@@ -54,9 +52,7 @@ class ReadThroughEntityCache {
54
52
  const results = new Map();
55
53
  cacheLoadResults.forEach((cacheLoadResult, fieldValue) => {
56
54
  if (cacheLoadResult.status === CacheStatus.HIT) {
57
- results.set(fieldValue, [
58
- (0, EntityFieldTransformationUtils_1.transformCacheObjectToFields)(this.entityConfiguration, this.fieldTransformerMap, cacheLoadResult.item),
59
- ]);
55
+ results.set(fieldValue, [cacheLoadResult.item]);
60
56
  }
61
57
  });
62
58
  // fetch any misses from DB, add DB objects to results, cache DB results, inform cache of any missing DB results
@@ -77,7 +73,7 @@ class ReadThroughEntityCache {
77
73
  }
78
74
  const uniqueObject = objects[0];
79
75
  if (uniqueObject) {
80
- objectsToCache.set(fieldValue, (0, EntityFieldTransformationUtils_1.transformFieldsToCacheObject)(this.entityConfiguration, this.fieldTransformerMap, uniqueObject));
76
+ objectsToCache.set(fieldValue, uniqueObject);
81
77
  results.set(fieldValue, [uniqueObject]);
82
78
  }
83
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ReadThroughEntityCache.js","sourceRoot":"","sources":["../../src/internal/ReadThroughEntityCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReadThroughEntityCache.js","sourceRoot":"","sources":["../../src/internal/ReadThroughEntityCache.ts"],"names":[],"mappings":"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"}
@@ -51,7 +51,6 @@ describe(ReadThroughEntityCache_1.default, () => {
51
51
  describe('readManyThroughAsync', () => {
52
52
  it('fetches from DB upon cache miss and caches the result', async () => {
53
53
  const cacheAdapterMock = (0, ts_mockito_1.mock)();
54
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map());
55
54
  const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
56
55
  const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(true), cacheAdapter);
57
56
  const fetcher = createIdFetcher(['wat', 'who']);
@@ -73,7 +72,6 @@ describe(ReadThroughEntityCache_1.default, () => {
73
72
  });
74
73
  it('does not fetch from the DB or cache results when all cache fetches are hits', async () => {
75
74
  const cacheAdapterMock = (0, ts_mockito_1.mock)();
76
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map());
77
75
  const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
78
76
  const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(true), cacheAdapter);
79
77
  const fetcher = createIdFetcher(['wat', 'who']);
@@ -95,7 +93,6 @@ describe(ReadThroughEntityCache_1.default, () => {
95
93
  });
96
94
  it('negatively caches db misses', async () => {
97
95
  const cacheAdapterMock = (0, ts_mockito_1.mock)();
98
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map());
99
96
  const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
100
97
  const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(true), cacheAdapter);
101
98
  // simulate db miss
@@ -109,7 +106,6 @@ describe(ReadThroughEntityCache_1.default, () => {
109
106
  });
110
107
  it('does not return or fetch negatively cached results from DB', async () => {
111
108
  const cacheAdapterMock = (0, ts_mockito_1.mock)();
112
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map());
113
109
  const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
114
110
  const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(true), cacheAdapter);
115
111
  const fetcher = createIdFetcher([]);
@@ -122,7 +118,6 @@ describe(ReadThroughEntityCache_1.default, () => {
122
118
  });
123
119
  it('does a mix and match of hit, miss, and negative', async () => {
124
120
  const cacheAdapterMock = (0, ts_mockito_1.mock)();
125
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map());
126
121
  const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
127
122
  const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(true), cacheAdapter);
128
123
  const fetcher = createIdFetcher(['wat', 'who', 'why']);
@@ -143,7 +138,6 @@ describe(ReadThroughEntityCache_1.default, () => {
143
138
  });
144
139
  it('does not call into cache for field that is not cacheable', async () => {
145
140
  const cacheAdapterMock = (0, ts_mockito_1.mock)();
146
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map());
147
141
  const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
148
142
  const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(false), cacheAdapter);
149
143
  const fetcher = createIdFetcher(['wat']);
@@ -151,32 +145,6 @@ describe(ReadThroughEntityCache_1.default, () => {
151
145
  (0, ts_mockito_1.verify)(cacheAdapterMock.loadManyAsync('id', (0, ts_mockito_1.anything)())).never();
152
146
  expect(result).toEqual(new Map([['wat', [{ id: 'wat' }]]]));
153
147
  });
154
- it('transforms fields for cache storage', async () => {
155
- const cacheAdapterMock = (0, ts_mockito_1.mock)();
156
- (0, ts_mockito_1.when)(cacheAdapterMock.getFieldTransformerMap()).thenReturn(new Map([
157
- [
158
- EntityFields_1.UUIDField.name,
159
- {
160
- read: (val) => val.split('-')[0],
161
- write: (val) => `${val}-in-cache`,
162
- },
163
- ],
164
- ]));
165
- const cacheAdapter = (0, ts_mockito_1.instance)(cacheAdapterMock);
166
- const entityCache = new ReadThroughEntityCache_1.default(makeEntityConfiguration(true), cacheAdapter);
167
- const fetcher = createIdFetcher(['wat', 'who']);
168
- (0, ts_mockito_1.when)(cacheAdapterMock.loadManyAsync('id', (0, ts_mockito_1.deepEqual)(['wat', 'who']))).thenResolve(new Map([
169
- ['wat', { status: ReadThroughEntityCache_1.CacheStatus.MISS }],
170
- ['who', { status: ReadThroughEntityCache_1.CacheStatus.HIT, item: { id: 'who-in-cache' } }],
171
- ]));
172
- const result = await entityCache.readManyThroughAsync('id', ['wat', 'who'], fetcher);
173
- (0, ts_mockito_1.verify)(cacheAdapterMock.loadManyAsync('id', (0, ts_mockito_1.deepEqual)(['wat', 'who']))).once();
174
- (0, ts_mockito_1.verify)(cacheAdapterMock.cacheManyAsync('id', (0, ts_mockito_1.deepEqual)(new Map([['wat', { id: 'wat-in-cache' }]])))).once();
175
- expect(result).toEqual(new Map([
176
- ['wat', [{ id: 'wat' }]],
177
- ['who', [{ id: 'who' }]],
178
- ]));
179
- });
180
148
  });
181
149
  describe('invalidateManyAsync', () => {
182
150
  it('calls cache adapter invalidate', async () => {