@expo/entity 0.23.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/build/ComposedEntityCacheAdapter.d.ts +19 -0
  2. package/build/ComposedEntityCacheAdapter.js +66 -0
  3. package/build/ComposedEntityCacheAdapter.js.map +1 -0
  4. package/build/ComposedSecondaryEntityCache.d.ts +15 -0
  5. package/build/ComposedSecondaryEntityCache.js +37 -0
  6. package/build/ComposedSecondaryEntityCache.js.map +1 -0
  7. package/build/Entity.js +6 -6
  8. package/build/Entity.js.map +1 -1
  9. package/build/EntityAssociationLoader.js +4 -4
  10. package/build/EntityAssociationLoader.js.map +1 -1
  11. package/build/EntityFieldDefinition.d.ts +8 -0
  12. package/build/EntityFieldDefinition.js +5 -0
  13. package/build/EntityFieldDefinition.js.map +1 -1
  14. package/build/EntityFields.d.ts +38 -0
  15. package/build/EntityFields.js +38 -0
  16. package/build/EntityFields.js.map +1 -1
  17. package/build/EntityLoader.d.ts +3 -2
  18. package/build/EntityLoader.js +5 -4
  19. package/build/EntityLoader.js.map +1 -1
  20. package/build/EntityLoaderFactory.d.ts +2 -2
  21. package/build/EntityLoaderFactory.js +2 -2
  22. package/build/EntityLoaderFactory.js.map +1 -1
  23. package/build/EntityMutationInfo.d.ts +12 -3
  24. package/build/EntityMutator.d.ts +5 -4
  25. package/build/EntityMutator.js +31 -24
  26. package/build/EntityMutator.js.map +1 -1
  27. package/build/EntityMutatorFactory.d.ts +4 -4
  28. package/build/EntityMutatorFactory.js +6 -6
  29. package/build/EntityMutatorFactory.js.map +1 -1
  30. package/build/EntityPrivacyPolicy.d.ts +15 -4
  31. package/build/EntityPrivacyPolicy.js +14 -14
  32. package/build/EntityPrivacyPolicy.js.map +1 -1
  33. package/build/GenericSecondaryEntityCache.d.ts +19 -0
  34. package/build/GenericSecondaryEntityCache.js +74 -0
  35. package/build/GenericSecondaryEntityCache.js.map +1 -0
  36. package/build/IEntityGenericCacher.d.ts +11 -0
  37. package/build/IEntityGenericCacher.js +3 -0
  38. package/build/IEntityGenericCacher.js.map +1 -0
  39. package/build/ReadonlyEntity.js +1 -1
  40. package/build/ReadonlyEntity.js.map +1 -1
  41. package/build/ViewerScopedEntityLoaderFactory.d.ts +2 -2
  42. package/build/ViewerScopedEntityLoaderFactory.js +2 -2
  43. package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
  44. package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
  45. package/build/ViewerScopedEntityMutatorFactory.js +6 -6
  46. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  47. package/build/__tests__/ComposedCacheAdapter-test.d.ts +1 -0
  48. package/build/__tests__/ComposedCacheAdapter-test.js +198 -0
  49. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -0
  50. package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +1 -0
  51. package/build/__tests__/ComposedSecondaryEntityCache-test.js +65 -0
  52. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +1 -0
  53. package/build/__tests__/EntityCommonUseCases-test.js +1 -1
  54. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  55. package/build/__tests__/EntityEdges-test.js +260 -37
  56. package/build/__tests__/EntityEdges-test.js.map +1 -1
  57. package/build/__tests__/EntityLoader-constructor-test.js +2 -1
  58. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  59. package/build/__tests__/EntityLoader-test.js +19 -11
  60. package/build/__tests__/EntityLoader-test.js.map +1 -1
  61. package/build/__tests__/EntityMutator-test.js +96 -43
  62. package/build/__tests__/EntityMutator-test.js.map +1 -1
  63. package/build/__tests__/EntityPrivacyPolicy-test.js +23 -12
  64. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  65. package/build/__tests__/EntitySecondaryCacheLoader-test.js +1 -1
  66. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  67. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +3 -2
  68. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +1 -1
  69. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +3 -2
  70. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +1 -1
  71. package/build/index.d.ts +4 -0
  72. package/build/index.js +7 -1
  73. package/build/index.js.map +1 -1
  74. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -1
  75. package/build/rules/AlwaysAllowPrivacyPolicyRule.js +1 -1
  76. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  77. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -1
  78. package/build/rules/AlwaysDenyPrivacyPolicyRule.js +1 -1
  79. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  80. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -1
  81. package/build/rules/AlwaysSkipPrivacyPolicyRule.js +1 -1
  82. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  83. package/build/rules/PrivacyPolicyRule.d.ts +2 -1
  84. package/build/rules/PrivacyPolicyRule.js.map +1 -1
  85. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +1 -0
  86. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +1 -1
  87. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +1 -0
  88. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +1 -1
  89. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +1 -0
  90. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +1 -1
  91. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +2 -0
  92. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +6 -6
  93. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +1 -1
  94. package/package.json +1 -1
  95. package/src/ComposedEntityCacheAdapter.ts +86 -0
  96. package/src/ComposedSecondaryEntityCache.ts +63 -0
  97. package/src/Entity.ts +6 -4
  98. package/src/EntityAssociationLoader.ts +4 -4
  99. package/src/EntityFieldDefinition.ts +8 -0
  100. package/src/EntityFields.ts +45 -0
  101. package/src/EntityLoader.ts +5 -1
  102. package/src/EntityLoaderFactory.ts +4 -2
  103. package/src/EntityMutationInfo.ts +13 -3
  104. package/src/EntityMutator.ts +44 -21
  105. package/src/EntityMutatorFactory.ts +10 -4
  106. package/src/EntityPrivacyPolicy.ts +31 -1
  107. package/src/GenericSecondaryEntityCache.ts +98 -0
  108. package/src/IEntityGenericCacher.ts +15 -0
  109. package/src/ReadonlyEntity.ts +1 -1
  110. package/src/ViewerScopedEntityLoaderFactory.ts +8 -3
  111. package/src/ViewerScopedEntityMutatorFactory.ts +22 -7
  112. package/src/__tests__/ComposedCacheAdapter-test.ts +280 -0
  113. package/src/__tests__/ComposedSecondaryEntityCache-test.ts +101 -0
  114. package/src/__tests__/EntityCommonUseCases-test.ts +2 -1
  115. package/src/__tests__/EntityEdges-test.ts +286 -45
  116. package/src/__tests__/EntityLoader-constructor-test.ts +3 -1
  117. package/src/__tests__/EntityLoader-test.ts +26 -1
  118. package/src/__tests__/EntityMutator-test.ts +99 -37
  119. package/src/__tests__/EntityPrivacyPolicy-test.ts +66 -7
  120. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +1 -0
  121. package/src/__tests__/ViewerScopedEntityLoaderFactory-test.ts +4 -2
  122. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +6 -2
  123. package/src/index.ts +4 -0
  124. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +2 -0
  125. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +2 -0
  126. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +2 -0
  127. package/src/rules/PrivacyPolicyRule.ts +2 -0
  128. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +2 -0
  129. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +2 -0
  130. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +2 -0
  131. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +14 -6
@@ -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: readonly string[]): Promise<void>;
10
+ invalidateManyAsync(keys: readonly 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":""}
@@ -89,7 +89,7 @@ class ReadonlyEntity {
89
89
  return viewerContext
90
90
  .getViewerScopedEntityCompanionForClass(this)
91
91
  .getLoaderFactory()
92
- .forLoad(queryContext);
92
+ .forLoad(queryContext, { cascadingDeleteCause: null });
93
93
  }
94
94
  }
95
95
  exports.default = ReadonlyEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"ReadonlyEntity.js","sourceRoot":"","sources":["../src/ReadonlyEntity.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAGlC,wFAAgE;AAMhE,+CAAqC;AAErC;;;;;;;GAOG;AACH,MAA8B,cAAc;IAS1C;;;;;;OAMG;IACH,YACmB,aAA6B,EAC7B,cAAiC;QADjC,kBAAa,GAAb,aAAa,CAAgB;QAC7B,mBAAc,GAAd,cAAc,CAAmB;QAElD,MAAM,mBAAmB,GACvB,IAAI,CAAC,WACN,CAAC,sBAAsB,EAOvB,CAAC;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,OAGvD,CAAC;QACF,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACnC,IAAA,mBAAS,EAAC,EAAE,EAAE,qCAAqC,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,GAAG,EAAS,CAAC;QAEpB,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,oBAAyC,CAAC;QAC3F,IAAI,CAAC,SAAS,GAAG,IAAA,kBAAI,EAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;IAC9D,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IACrD,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB;QAOf,OAAO,IAAI,iCAAuB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,QAAQ,CACN,SAAY;QAEZ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAuBX,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,aAAa;aACjB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,gBAAgB,EAAE;aAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;CACF;AA7ID,iCA6IC"}
1
+ {"version":3,"file":"ReadonlyEntity.js","sourceRoot":"","sources":["../src/ReadonlyEntity.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAGlC,wFAAgE;AAMhE,+CAAqC;AAErC;;;;;;;GAOG;AACH,MAA8B,cAAc;IAS1C;;;;;;OAMG;IACH,YACmB,aAA6B,EAC7B,cAAiC;QADjC,kBAAa,GAAb,aAAa,CAAgB;QAC7B,mBAAc,GAAd,cAAc,CAAmB;QAElD,MAAM,mBAAmB,GACvB,IAAI,CAAC,WACN,CAAC,sBAAsB,EAOvB,CAAC;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,OAGvD,CAAC;QACF,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACnC,IAAA,mBAAS,EAAC,EAAE,EAAE,qCAAqC,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,GAAG,EAAS,CAAC;QAEpB,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,oBAAyC,CAAC;QAC3F,IAAI,CAAC,SAAS,GAAG,IAAA,kBAAI,EAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;IAC9D,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IACrD,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB;QAOf,OAAO,IAAI,iCAAuB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,QAAQ,CACN,SAAY;QAEZ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAuBX,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,aAAa;aACjB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,gBAAgB,EAAE;aAClB,OAAO,CAAC,YAAY,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;CACF;AA7ID,iCA6IC"}
@@ -1,6 +1,6 @@
1
1
  import EntityLoader from './EntityLoader';
2
2
  import EntityLoaderFactory from './EntityLoaderFactory';
3
- import EntityPrivacyPolicy from './EntityPrivacyPolicy';
3
+ import EntityPrivacyPolicy, { EntityPrivacyPolicyEvaluationContext } from './EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from './EntityQueryContext';
5
5
  import ReadonlyEntity from './ReadonlyEntity';
6
6
  import ViewerContext from './ViewerContext';
@@ -11,5 +11,5 @@ export default class ViewerScopedEntityLoaderFactory<TFields, TID extends NonNul
11
11
  private readonly entityLoaderFactory;
12
12
  private readonly viewerContext;
13
13
  constructor(entityLoaderFactory: EntityLoaderFactory<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, viewerContext: TViewerContext);
14
- forLoad(queryContext: EntityQueryContext): EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
14
+ forLoad(queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext): EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
15
15
  }
@@ -8,8 +8,8 @@ class ViewerScopedEntityLoaderFactory {
8
8
  this.entityLoaderFactory = entityLoaderFactory;
9
9
  this.viewerContext = viewerContext;
10
10
  }
11
- forLoad(queryContext) {
12
- return this.entityLoaderFactory.forLoad(this.viewerContext, queryContext);
11
+ forLoad(queryContext, privacyPolicyEvaluationContext) {
12
+ return this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, privacyPolicyEvaluationContext);
13
13
  }
14
14
  }
15
15
  exports.default = ViewerScopedEntityLoaderFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerScopedEntityLoaderFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityLoaderFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,+BAA+B;IAclD,YACmB,mBAOhB,EACgB,aAA6B;QAR7B,wBAAmB,GAAnB,mBAAmB,CAOnC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,OAAO,CACL,YAAgC;QAEhC,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5E,CAAC;CACF;AA/BD,kDA+BC"}
1
+ {"version":3,"file":"ViewerScopedEntityLoaderFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityLoaderFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,+BAA+B;IAclD,YACmB,mBAOhB,EACgB,aAA6B;QAR7B,wBAAmB,GAAnB,mBAAmB,CAOnC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,OAAO,CACL,YAAgC,EAChC,8BAAoE;QAEpE,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACrC,IAAI,CAAC,aAAa,EAClB,YAAY,EACZ,8BAA8B,CAC/B,CAAC;IACJ,CAAC;CACF;AApCD,kDAoCC"}
@@ -1,6 +1,6 @@
1
1
  import { CreateMutator, UpdateMutator, DeleteMutator } from './EntityMutator';
2
2
  import EntityMutatorFactory from './EntityMutatorFactory';
3
- import EntityPrivacyPolicy from './EntityPrivacyPolicy';
3
+ import EntityPrivacyPolicy, { EntityPrivacyPolicyEvaluationContext } from './EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from './EntityQueryContext';
5
5
  import ReadonlyEntity from './ReadonlyEntity';
6
6
  import ViewerContext from './ViewerContext';
@@ -11,7 +11,7 @@ export default class ViewerScopedEntityMutatorFactory<TFields, TID extends NonNu
11
11
  private readonly entityMutatorFactory;
12
12
  private readonly viewerContext;
13
13
  constructor(entityMutatorFactory: EntityMutatorFactory<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, viewerContext: TViewerContext);
14
- forCreate(queryContext: EntityQueryContext): CreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
15
- forUpdate(existingEntity: TEntity, queryContext: EntityQueryContext): UpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
16
- forDelete(existingEntity: TEntity, queryContext: EntityQueryContext): DeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
14
+ forCreate(queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext): CreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
15
+ forUpdate(existingEntity: TEntity, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext): UpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
16
+ forDelete(existingEntity: TEntity, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext): DeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
17
17
  }
@@ -8,14 +8,14 @@ class ViewerScopedEntityMutatorFactory {
8
8
  this.entityMutatorFactory = entityMutatorFactory;
9
9
  this.viewerContext = viewerContext;
10
10
  }
11
- forCreate(queryContext) {
12
- return this.entityMutatorFactory.forCreate(this.viewerContext, queryContext);
11
+ forCreate(queryContext, privacyPolicyEvaluationContext) {
12
+ return this.entityMutatorFactory.forCreate(this.viewerContext, queryContext, privacyPolicyEvaluationContext);
13
13
  }
14
- forUpdate(existingEntity, queryContext) {
15
- return this.entityMutatorFactory.forUpdate(existingEntity, queryContext);
14
+ forUpdate(existingEntity, queryContext, privacyPolicyEvaluationContext) {
15
+ return this.entityMutatorFactory.forUpdate(existingEntity, queryContext, privacyPolicyEvaluationContext);
16
16
  }
17
- forDelete(existingEntity, queryContext) {
18
- return this.entityMutatorFactory.forDelete(existingEntity, queryContext);
17
+ forDelete(existingEntity, queryContext, privacyPolicyEvaluationContext) {
18
+ return this.entityMutatorFactory.forDelete(existingEntity, queryContext, privacyPolicyEvaluationContext);
19
19
  }
20
20
  }
21
21
  exports.default = ViewerScopedEntityMutatorFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerScopedEntityMutatorFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityMutatorFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,gCAAgC;IAcnD,YACmB,oBAOhB,EACgB,aAA6B;QAR7B,yBAAoB,GAApB,oBAAoB,CAOpC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,SAAS,CACP,YAAgC;QAEhC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/E,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC;QAEhC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC;QAEhC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;CACF;AA7CD,mDA6CC"}
1
+ {"version":3,"file":"ViewerScopedEntityMutatorFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityMutatorFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,gCAAgC;IAcnD,YACmB,oBAOhB,EACgB,aAA6B;QAR7B,yBAAoB,GAApB,oBAAoB,CAOpC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,SAAS,CACP,YAAgC,EAChC,8BAAoE;QAEpE,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CACxC,IAAI,CAAC,aAAa,EAClB,YAAY,EACZ,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC,EAChC,8BAAoE;QAEpE,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CACxC,cAAc,EACd,YAAY,EACZ,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC,EAChC,8BAAoE;QAEpE,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CACxC,cAAc,EACd,YAAY,EACZ,8BAA8B,CAC/B,CAAC;IACJ,CAAC;CACF;AA5DD,mDA4DC"}
@@ -0,0 +1 @@
1
+ export declare const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE: unique symbol;
@@ -0,0 +1,198 @@
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
+ exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = void 0;
7
+ const invariant_1 = __importDefault(require("invariant"));
8
+ const ComposedEntityCacheAdapter_1 = __importDefault(require("../ComposedEntityCacheAdapter"));
9
+ const EntityCacheAdapter_1 = __importDefault(require("../EntityCacheAdapter"));
10
+ const EntityConfiguration_1 = __importDefault(require("../EntityConfiguration"));
11
+ const EntityFields_1 = require("../EntityFields");
12
+ const ReadThroughEntityCache_1 = require("../internal/ReadThroughEntityCache");
13
+ const entityConfiguration = new EntityConfiguration_1.default({
14
+ idField: 'id',
15
+ tableName: 'blah',
16
+ schema: {
17
+ id: new EntityFields_1.UUIDField({ columnName: 'id', cache: true }),
18
+ },
19
+ databaseAdapterFlavor: 'postgres',
20
+ cacheAdapterFlavor: 'local-memory-and-redis',
21
+ });
22
+ exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist');
23
+ class TestLocalCacheAdapter extends EntityCacheAdapter_1.default {
24
+ constructor(entityConfiguration, cache) {
25
+ super(entityConfiguration);
26
+ this.cache = cache;
27
+ }
28
+ async loadManyAsync(fieldName, fieldValues) {
29
+ const localMemoryCacheKeyToFieldValueMapping = new Map(fieldValues.map((fieldValue) => [this.makeCacheKey(fieldName, fieldValue), fieldValue]));
30
+ const cacheResults = new Map();
31
+ for (const [cacheKey, fieldValue] of localMemoryCacheKeyToFieldValueMapping) {
32
+ const cacheResult = this.cache.get(cacheKey);
33
+ if (cacheResult === exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE) {
34
+ cacheResults.set(fieldValue, {
35
+ status: ReadThroughEntityCache_1.CacheStatus.NEGATIVE,
36
+ });
37
+ }
38
+ else if (cacheResult) {
39
+ cacheResults.set(fieldValue, {
40
+ status: ReadThroughEntityCache_1.CacheStatus.HIT,
41
+ item: cacheResult,
42
+ });
43
+ }
44
+ else {
45
+ cacheResults.set(fieldValue, {
46
+ status: ReadThroughEntityCache_1.CacheStatus.MISS,
47
+ });
48
+ }
49
+ }
50
+ return cacheResults;
51
+ }
52
+ async cacheManyAsync(fieldName, objectMap) {
53
+ for (const [fieldValue, item] of objectMap) {
54
+ const cacheKey = this.makeCacheKey(fieldName, fieldValue);
55
+ this.cache.set(cacheKey, item);
56
+ }
57
+ }
58
+ async cacheDBMissesAsync(fieldName, fieldValues) {
59
+ for (const fieldValue of fieldValues) {
60
+ const cacheKey = this.makeCacheKey(fieldName, fieldValue);
61
+ this.cache.set(cacheKey, exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
62
+ }
63
+ }
64
+ async invalidateManyAsync(fieldName, fieldValues) {
65
+ for (const fieldValue of fieldValues) {
66
+ const cacheKey = this.makeCacheKey(fieldName, fieldValue);
67
+ this.cache.delete(cacheKey);
68
+ }
69
+ }
70
+ makeCacheKey(fieldName, fieldValue) {
71
+ const columnName = this.entityConfiguration.entityToDBFieldsKeyMapping.get(fieldName);
72
+ (0, invariant_1.default)(columnName, `database field mapping missing for ${fieldName}`);
73
+ const parts = [
74
+ this.entityConfiguration.tableName,
75
+ `${this.entityConfiguration.cacheKeyVersion}`,
76
+ columnName,
77
+ String(fieldValue),
78
+ ];
79
+ const delimiter = ':';
80
+ const escapedParts = parts.map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
81
+ return escapedParts.join(delimiter);
82
+ }
83
+ }
84
+ function makeTestCacheAdapters() {
85
+ const primaryCache = new Map();
86
+ const primaryCacheAdapter = new TestLocalCacheAdapter(entityConfiguration, primaryCache);
87
+ const fallbackCache = new Map();
88
+ const fallbackCacheAdapter = new TestLocalCacheAdapter(entityConfiguration, fallbackCache);
89
+ const cacheAdapter = new ComposedEntityCacheAdapter_1.default(entityConfiguration, [
90
+ primaryCacheAdapter,
91
+ fallbackCacheAdapter,
92
+ ]);
93
+ return {
94
+ primaryCache,
95
+ primaryCacheAdapter,
96
+ fallbackCache,
97
+ fallbackCacheAdapter,
98
+ cacheAdapter,
99
+ };
100
+ }
101
+ describe(ComposedEntityCacheAdapter_1.default, () => {
102
+ describe('loadManyAsync', () => {
103
+ it('returns primary results when populated', async () => {
104
+ const { primaryCacheAdapter, cacheAdapter } = makeTestCacheAdapters();
105
+ const cacheHits = new Map([['test-id-1', { id: 'test-id-1' }]]);
106
+ await primaryCacheAdapter.cacheManyAsync('id', cacheHits);
107
+ await primaryCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
108
+ const results = await cacheAdapter.loadManyAsync('id', [
109
+ 'test-id-1',
110
+ 'test-id-2',
111
+ 'test-id-3',
112
+ ]);
113
+ expect(results.get('test-id-1')).toMatchObject({
114
+ status: ReadThroughEntityCache_1.CacheStatus.HIT,
115
+ item: { id: 'test-id-1' },
116
+ });
117
+ expect(results.get('test-id-2')).toMatchObject({ status: ReadThroughEntityCache_1.CacheStatus.NEGATIVE });
118
+ expect(results.get('test-id-3')).toMatchObject({ status: ReadThroughEntityCache_1.CacheStatus.MISS });
119
+ expect(results.size).toBe(3);
120
+ });
121
+ it('returns fallback adapter results primary is empty', async () => {
122
+ const { primaryCacheAdapter, cacheAdapter } = makeTestCacheAdapters();
123
+ const cacheHits = new Map([['test-id-1', { id: 'test-id-1' }]]);
124
+ await primaryCacheAdapter.cacheManyAsync('id', cacheHits);
125
+ await primaryCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
126
+ const results = await cacheAdapter.loadManyAsync('id', [
127
+ 'test-id-1',
128
+ 'test-id-2',
129
+ 'test-id-3',
130
+ ]);
131
+ expect(results.get('test-id-1')).toMatchObject({
132
+ status: ReadThroughEntityCache_1.CacheStatus.HIT,
133
+ item: { id: 'test-id-1' },
134
+ });
135
+ expect(results.get('test-id-2')).toMatchObject({ status: ReadThroughEntityCache_1.CacheStatus.NEGATIVE });
136
+ expect(results.get('test-id-3')).toMatchObject({ status: ReadThroughEntityCache_1.CacheStatus.MISS });
137
+ expect(results.size).toBe(3);
138
+ });
139
+ it('returns empty map when passed empty array of fieldValues', async () => {
140
+ const { cacheAdapter } = makeTestCacheAdapters();
141
+ const results = await cacheAdapter.loadManyAsync('id', []);
142
+ expect(results).toEqual(new Map());
143
+ });
144
+ it('handles 0 cache adapter compose case', async () => {
145
+ const cacheAdapter = new ComposedEntityCacheAdapter_1.default(entityConfiguration, []);
146
+ const results = await cacheAdapter.loadManyAsync('id', []);
147
+ expect(results).toEqual(new Map());
148
+ });
149
+ });
150
+ describe('cacheManyAsync', () => {
151
+ it('correctly caches all objects', async () => {
152
+ const { primaryCache, primaryCacheAdapter, fallbackCache, fallbackCacheAdapter, cacheAdapter, } = makeTestCacheAdapters();
153
+ await cacheAdapter.cacheManyAsync('id', new Map([['test-id-1', { id: 'test-id-1' }]]));
154
+ const primaryLocalMemoryCacheKey = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
155
+ expect(primaryCache.get(primaryLocalMemoryCacheKey)).toMatchObject({
156
+ id: 'test-id-1',
157
+ });
158
+ const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
159
+ expect(fallbackCache.get(fallbackLocalMemoryCacheKey)).toMatchObject({
160
+ id: 'test-id-1',
161
+ });
162
+ });
163
+ });
164
+ describe('cacheDBMissesAsync', () => {
165
+ it('correctly caches misses', async () => {
166
+ const { primaryCache, primaryCacheAdapter, fallbackCache, fallbackCacheAdapter, cacheAdapter, } = makeTestCacheAdapters();
167
+ await cacheAdapter.cacheDBMissesAsync('id', ['test-id-1']);
168
+ const primaryLocalMemoryCacheKey = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
169
+ expect(primaryCache.get(primaryLocalMemoryCacheKey)).toBe(exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
170
+ const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
171
+ expect(fallbackCache.get(fallbackLocalMemoryCacheKey)).toBe(exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
172
+ });
173
+ });
174
+ describe('invalidateManyAsync', () => {
175
+ it('invalidates correctly', async () => {
176
+ const { primaryCache, primaryCacheAdapter, fallbackCache, fallbackCacheAdapter, cacheAdapter, } = makeTestCacheAdapters();
177
+ const cacheHits = new Map([['test-id-1', { id: 'test-id-1' }]]);
178
+ await primaryCacheAdapter.cacheManyAsync('id', cacheHits);
179
+ await primaryCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
180
+ await fallbackCacheAdapter.cacheManyAsync('id', cacheHits);
181
+ await fallbackCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
182
+ await cacheAdapter.invalidateManyAsync('id', ['test-id-1', 'test-id-2']);
183
+ const primaryLocalMemoryCacheKey1 = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
184
+ expect(primaryCache.get(primaryLocalMemoryCacheKey1)).toBe(undefined);
185
+ const primaryLocalMemoryCacheKey2 = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
186
+ expect(primaryCache.get(primaryLocalMemoryCacheKey2)).toBe(undefined);
187
+ const fallbackLocalMemoryCacheKey1 = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
188
+ expect(fallbackCache.get(fallbackLocalMemoryCacheKey1)).toBe(undefined);
189
+ const fallbackLocalMemoryCacheKey2 = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
190
+ expect(fallbackCache.get(fallbackLocalMemoryCacheKey2)).toBe(undefined);
191
+ });
192
+ it('returns when passed empty array of fieldValues', async () => {
193
+ const { cacheAdapter } = makeTestCacheAdapters();
194
+ await cacheAdapter.invalidateManyAsync('id', []);
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=ComposedCacheAdapter-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposedCacheAdapter-test.js","sourceRoot":"","sources":["../../src/__tests__/ComposedCacheAdapter-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
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 nullthrows_1 = __importDefault(require("nullthrows"));
8
+ const ComposedSecondaryEntityCache_1 = __importDefault(require("../ComposedSecondaryEntityCache"));
9
+ class TestEntitySecondaryCache {
10
+ constructor(prefilledResults) {
11
+ this.prefilledResults = prefilledResults;
12
+ }
13
+ async loadManyThroughAsync(loadParamsArray, fetcher) {
14
+ // this does an unusual method of calling fetcher, but there's no constraint that says fetcher can only be called once
15
+ // so this tests that
16
+ const retMap = new Map();
17
+ for (const loadParams of loadParamsArray) {
18
+ if (this.prefilledResults.has(loadParams)) {
19
+ retMap.set(loadParams, (0, nullthrows_1.default)(this.prefilledResults.get(loadParams)));
20
+ }
21
+ else {
22
+ const fetcherResult = await fetcher([loadParams]);
23
+ const toSet = fetcherResult.get(loadParams);
24
+ (0, invariant_1.default)(toSet !== undefined, 'should be set');
25
+ retMap.set(loadParams, toSet);
26
+ }
27
+ }
28
+ return retMap;
29
+ }
30
+ async invalidateManyAsync(loadParamsArray) {
31
+ for (const loadParams of loadParamsArray) {
32
+ this.prefilledResults.delete(loadParams);
33
+ }
34
+ }
35
+ }
36
+ describe(ComposedSecondaryEntityCache_1.default, () => {
37
+ it('composes correctly', async () => {
38
+ // TODO(wschurman): investigate whether we can use immutable or something to do better object equality for the map keys
39
+ const lp1 = { lp: '1' };
40
+ const lp2 = { lp: '2' };
41
+ const lp3 = { lp: '3' };
42
+ const primarySecondaryEntityCache = new TestEntitySecondaryCache(new Map([[lp1, { id: 'primary-1' }]]));
43
+ const fallbackSecondaryEntityCache = new TestEntitySecondaryCache(new Map([[lp2, { id: 'fallback-2' }]]));
44
+ const composedSecondaryEntityCache = new ComposedSecondaryEntityCache_1.default([
45
+ primarySecondaryEntityCache,
46
+ fallbackSecondaryEntityCache,
47
+ ]);
48
+ const results = await composedSecondaryEntityCache.loadManyThroughAsync([lp1, lp2, lp3], async (fetcherLoadParamsArray) => new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }])));
49
+ expect(results.get(lp1)).toEqual({ id: 'primary-1' });
50
+ expect(results.get(lp2)).toEqual({ id: 'fallback-2' });
51
+ expect(results.get(lp3)).toEqual({ id: 'db-fetched-3' });
52
+ await composedSecondaryEntityCache.invalidateManyAsync([lp1, lp2, lp3]);
53
+ const resultsAfterInvalidate = await composedSecondaryEntityCache.loadManyThroughAsync([lp1, lp2, lp3], async (fetcherLoadParamsArray) => new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }])));
54
+ expect(resultsAfterInvalidate.get(lp1)).toEqual({ id: 'db-fetched-1' });
55
+ expect(resultsAfterInvalidate.get(lp2)).toEqual({ id: 'db-fetched-2' });
56
+ expect(resultsAfterInvalidate.get(lp3)).toEqual({ id: 'db-fetched-3' });
57
+ });
58
+ it('handles n=0 compose case', async () => {
59
+ const lp1 = { lp: '1' };
60
+ const composedSecondaryEntityCache = new ComposedSecondaryEntityCache_1.default([]);
61
+ const results = await composedSecondaryEntityCache.loadManyThroughAsync([lp1], async (fetcherLoadParamsArray) => new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }])));
62
+ expect(results.get(lp1)).toEqual({ id: 'db-fetched-1' });
63
+ });
64
+ });
65
+ //# sourceMappingURL=ComposedSecondaryEntityCache-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposedSecondaryEntityCache-test.js","sourceRoot":"","sources":["../../src/__tests__/ComposedSecondaryEntityCache-test.ts"],"names":[],"mappings":"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"}
@@ -51,7 +51,7 @@ class BlahEntity extends Entity_1.default {
51
51
  }
52
52
  }
53
53
  class DenyIfNotOwnerPrivacyPolicyRule extends PrivacyPolicyRule_1.default {
54
- async evaluateAsync(viewerContext, _queryContext, entity) {
54
+ async evaluateAsync(viewerContext, _queryContext, _evaluationContext, entity) {
55
55
  if (viewerContext.getUserID() === entity.getField('ownerID')) {
56
56
  return PrivacyPolicyRule_1.RuleEvaluationResult.SKIP;
57
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityCommonUseCases-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityCommonUseCases-test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityCommonUseCases-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityCommonUseCases-test.ts"],"names":[],"mappings":"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"}