@expo/entity 0.43.0 → 0.44.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 (62) hide show
  1. package/build/AuthorizationResultBasedEntityMutator.d.ts +87 -2
  2. package/build/AuthorizationResultBasedEntityMutator.js +122 -8
  3. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
  4. package/build/EntityLoaderUtils.d.ts +15 -3
  5. package/build/EntityLoaderUtils.js +25 -10
  6. package/build/EntityLoaderUtils.js.map +1 -1
  7. package/build/EntityQueryContext.d.ts +53 -7
  8. package/build/EntityQueryContext.js +65 -10
  9. package/build/EntityQueryContext.js.map +1 -1
  10. package/build/EntityQueryContextProvider.d.ts +5 -1
  11. package/build/EntityQueryContextProvider.js +11 -4
  12. package/build/EntityQueryContextProvider.js.map +1 -1
  13. package/build/IEntityGenericCacher.d.ts +2 -2
  14. package/build/internal/CompositeFieldHolder.d.ts +13 -0
  15. package/build/internal/CompositeFieldHolder.js +7 -0
  16. package/build/internal/CompositeFieldHolder.js.map +1 -1
  17. package/build/internal/CompositeFieldValueMap.d.ts +3 -0
  18. package/build/internal/CompositeFieldValueMap.js +3 -0
  19. package/build/internal/CompositeFieldValueMap.js.map +1 -1
  20. package/build/internal/EntityDataManager.d.ts +22 -3
  21. package/build/internal/EntityDataManager.js +99 -11
  22. package/build/internal/EntityDataManager.js.map +1 -1
  23. package/build/internal/EntityFieldTransformationUtils.d.ts +20 -0
  24. package/build/internal/EntityFieldTransformationUtils.js +15 -0
  25. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  26. package/build/internal/EntityLoadInterfaces.d.ts +8 -0
  27. package/build/internal/EntityLoadInterfaces.js +2 -0
  28. package/build/internal/EntityLoadInterfaces.js.map +1 -1
  29. package/build/internal/EntityTableDataCoordinator.d.ts +2 -0
  30. package/build/internal/EntityTableDataCoordinator.js +2 -0
  31. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  32. package/build/internal/ReadThroughEntityCache.d.ts +8 -0
  33. package/build/internal/ReadThroughEntityCache.js +5 -0
  34. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  35. package/build/internal/SingleFieldHolder.d.ts +7 -0
  36. package/build/internal/SingleFieldHolder.js +7 -0
  37. package/build/internal/SingleFieldHolder.js.map +1 -1
  38. package/build/metrics/EntityMetricsUtils.d.ts +4 -3
  39. package/build/metrics/EntityMetricsUtils.js +6 -3
  40. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  41. package/build/metrics/IEntityMetricsAdapter.d.ts +21 -0
  42. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  43. package/package.json +13 -13
  44. package/src/AuthorizationResultBasedEntityMutator.ts +133 -15
  45. package/src/EntityLoaderUtils.ts +43 -12
  46. package/src/EntityQueryContext.ts +68 -13
  47. package/src/EntityQueryContextProvider.ts +20 -3
  48. package/src/IEntityGenericCacher.ts +2 -2
  49. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +98 -0
  50. package/src/__tests__/EntityQueryContext-test.ts +141 -26
  51. package/src/internal/CompositeFieldHolder.ts +15 -0
  52. package/src/internal/CompositeFieldValueMap.ts +3 -0
  53. package/src/internal/EntityDataManager.ts +170 -10
  54. package/src/internal/EntityFieldTransformationUtils.ts +20 -0
  55. package/src/internal/EntityLoadInterfaces.ts +8 -0
  56. package/src/internal/EntityTableDataCoordinator.ts +2 -0
  57. package/src/internal/ReadThroughEntityCache.ts +8 -0
  58. package/src/internal/SingleFieldHolder.ts +7 -0
  59. package/src/internal/__tests__/EntityDataManager-test.ts +708 -186
  60. package/src/metrics/EntityMetricsUtils.ts +7 -0
  61. package/src/metrics/IEntityMetricsAdapter.ts +27 -0
  62. package/src/utils/__testfixtures__/StubDatabaseAdapter.ts +13 -1
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EntityNestedTransactionalQueryContext = exports.EntityTransactionalQueryContext = exports.EntityNonTransactionalQueryContext = exports.EntityQueryContext = exports.TransactionIsolationLevel = void 0;
6
+ exports.EntityNestedTransactionalQueryContext = exports.EntityTransactionalQueryContext = exports.EntityNonTransactionalQueryContext = exports.EntityQueryContext = exports.TransactionalDataLoaderMode = exports.TransactionIsolationLevel = void 0;
7
7
  const assert_1 = __importDefault(require("assert"));
8
8
  var TransactionIsolationLevel;
9
9
  (function (TransactionIsolationLevel) {
@@ -11,6 +11,12 @@ var TransactionIsolationLevel;
11
11
  TransactionIsolationLevel["REPEATABLE_READ"] = "REPEATABLE_READ";
12
12
  TransactionIsolationLevel["SERIALIZABLE"] = "SERIALIZABLE";
13
13
  })(TransactionIsolationLevel || (exports.TransactionIsolationLevel = TransactionIsolationLevel = {}));
14
+ var TransactionalDataLoaderMode;
15
+ (function (TransactionalDataLoaderMode) {
16
+ TransactionalDataLoaderMode["ENABLED"] = "ENABLED";
17
+ TransactionalDataLoaderMode["ENABLED_BATCH_ONLY"] = "ENABLED_BATCH_ONLY";
18
+ TransactionalDataLoaderMode["DISABLED"] = "DISABLED";
19
+ })(TransactionalDataLoaderMode || (exports.TransactionalDataLoaderMode = TransactionalDataLoaderMode = {}));
14
20
  /**
15
21
  * Entity framework representation of transactional and non-transactional database
16
22
  * query execution units.
@@ -55,12 +61,24 @@ exports.EntityNonTransactionalQueryContext = EntityNonTransactionalQueryContext;
55
61
  */
56
62
  class EntityTransactionalQueryContext extends EntityQueryContext {
57
63
  entityQueryContextProvider;
64
+ transactionId;
65
+ transactionalDataLoaderMode;
66
+ /**
67
+ * @internal
68
+ */
69
+ childQueryContexts = [];
58
70
  postCommitInvalidationCallbacks = [];
59
71
  postCommitCallbacks = [];
60
72
  preCommitCallbacks = [];
61
- constructor(queryInterface, entityQueryContextProvider) {
73
+ constructor(queryInterface, entityQueryContextProvider,
74
+ /**
75
+ * @internal
76
+ */
77
+ transactionId, transactionalDataLoaderMode) {
62
78
  super(queryInterface);
63
79
  this.entityQueryContextProvider = entityQueryContextProvider;
80
+ this.transactionId = transactionId;
81
+ this.transactionalDataLoaderMode = transactionalDataLoaderMode;
64
82
  }
65
83
  /**
66
84
  * Schedule a pre-commit callback. These will be run within the transaction right before it is
@@ -90,6 +108,9 @@ class EntityTransactionalQueryContext extends EntityQueryContext {
90
108
  appendPostCommitCallback(callback) {
91
109
  this.postCommitCallbacks.push(callback);
92
110
  }
111
+ /**
112
+ * @internal
113
+ */
93
114
  async runPreCommitCallbacksAsync() {
94
115
  const callbacks = [...this.preCommitCallbacks]
95
116
  .sort((a, b) => a.order - b.order)
@@ -99,6 +120,9 @@ class EntityTransactionalQueryContext extends EntityQueryContext {
99
120
  await callback(this);
100
121
  }
101
122
  }
123
+ /**
124
+ * @internal
125
+ */
102
126
  async runPostCommitCallbacksAsync() {
103
127
  const invalidationCallbacks = [...this.postCommitInvalidationCallbacks];
104
128
  this.postCommitInvalidationCallbacks.length = 0;
@@ -110,6 +134,9 @@ class EntityTransactionalQueryContext extends EntityQueryContext {
110
134
  isInTransaction() {
111
135
  return true;
112
136
  }
137
+ isInNestedTransaction() {
138
+ return false;
139
+ }
113
140
  async runInTransactionIfNotInTransactionAsync(transactionScope, transactionConfig) {
114
141
  (0, assert_1.default)(transactionConfig === undefined, 'Should not pass transactionConfig to a nested transaction');
115
142
  return await transactionScope(this);
@@ -131,23 +158,51 @@ class EntityNestedTransactionalQueryContext extends EntityTransactionalQueryCont
131
158
  parentQueryContext;
132
159
  postCommitInvalidationCallbacksToTransfer = [];
133
160
  postCommitCallbacksToTransfer = [];
134
- constructor(queryInterface, parentQueryContext, entityQueryContextProvider) {
135
- super(queryInterface, entityQueryContextProvider);
161
+ constructor(queryInterface,
162
+ /**
163
+ * @internal
164
+ */
165
+ parentQueryContext, entityQueryContextProvider, transactionId, transactionalDataLoaderMode) {
166
+ super(queryInterface, entityQueryContextProvider, transactionId, transactionalDataLoaderMode);
136
167
  this.parentQueryContext = parentQueryContext;
168
+ parentQueryContext.childQueryContexts.push(this);
137
169
  }
138
- appendPostCommitCallback(callback) {
139
- this.postCommitInvalidationCallbacksToTransfer.push(callback);
170
+ isInNestedTransaction() {
171
+ return true;
140
172
  }
141
- appendPostCommitInvalidationCallback(callback) {
173
+ appendPostCommitCallback(callback) {
174
+ // explicitly do not add to the super-class's post-commit callbacks
175
+ // instead, we will add them to the parent transaction's post-commit callbacks
176
+ // after the nested transaction has been committed
142
177
  this.postCommitCallbacksToTransfer.push(callback);
143
178
  }
144
- runPostCommitCallbacksAsync() {
145
- throw new Error('Must not call runPostCommitCallbacksAsync on EntityNestedTransactionalQueryContext');
179
+ appendPostCommitInvalidationCallback(callback) {
180
+ super.appendPostCommitInvalidationCallback(callback);
181
+ this.postCommitInvalidationCallbacksToTransfer.push(callback);
146
182
  }
147
- transferPostCommitCallbacksToParent() {
183
+ /**
184
+ * The behavior of callbacks for nested transactions are a bit different than for normal
185
+ * transactions.
186
+ * - Post-commit (non-invalidation) callbacks are run at the end of the outermost transaction
187
+ * since they often contain side-effects that only should run if the transaction doesn't roll back.
188
+ * The outermost transaction has the final say on the commit state of itself and all sub-transactions.
189
+ * - Invalidation callbacks are run at the end of both the nested transaction iteself but also transferred
190
+ * to the parent transaction to be run at the end of it (and recurse upwards, accumulating invalations).
191
+ * This is to ensure the dataloader cache is never stale no matter the DBMS transaction isolation
192
+ * semantics. See the note in `AuthorizationResultBasedBaseMutator` for more details.
193
+ *
194
+ * @internal
195
+ */
196
+ async runPostCommitCallbacksAsync() {
197
+ // run the post-commit callbacks for the nested transaction now
198
+ // (this technically also would run regular post-commit callbacks, but they are empty)
199
+ await super.runPostCommitCallbacksAsync();
200
+ // transfer a copy of the post-commit invalidation callbacks to the parent transaction
201
+ // to also be run at the end of it (or recurse in the case of the parent transaction being nested as well)
148
202
  for (const callback of this.postCommitInvalidationCallbacksToTransfer) {
149
203
  this.parentQueryContext.appendPostCommitInvalidationCallback(callback);
150
204
  }
205
+ // transfer post-commit callbacks to patent
151
206
  for (const callback of this.postCommitCallbacksToTransfer) {
152
207
  this.parentQueryContext.appendPostCommitCallback(callback);
153
208
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityQueryContext.js","sourceRoot":"","sources":["../src/EntityQueryContext.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAU5B,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,8DAAiC,CAAA;IACjC,gEAAmC,CAAA;IACnC,0DAA6B,CAAA;AAC/B,CAAC,EAJW,yBAAyB,yCAAzB,yBAAyB,QAIpC;AAMD;;;;;;GAMG;AACH,MAAsB,kBAAkB;IACT;IAA7B,YAA6B,cAAmB;QAAnB,mBAAc,GAAd,cAAc,CAAK;IAAG,CAAC;IAIpD,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CAMF;AAbD,gDAaC;AAED;;;;;GAKG;AACH,MAAa,kCAAmC,SAAQ,kBAAkB;IAGrD;IAFnB,YACE,cAAmB,EACF,0BAAsD;QAEvE,KAAK,CAAC,cAAc,CAAC,CAAC;QAFL,+BAA0B,GAA1B,0BAA0B,CAA4B;IAGzE,CAAC;IAED,eAAe;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,uCAAuC,CAC3C,gBAA+E,EAC/E,iBAAqC;QAErC,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,CAChE,gBAAgB,EAChB,iBAAiB,CAClB,CAAC;IACJ,CAAC;CACF;AArBD,gFAqBC;AAED;;;;GAIG;AACH,MAAa,+BAAgC,SAAQ,kBAAkB;IAQlD;IAPF,+BAA+B,GAAyB,EAAE,CAAC;IAC3D,mBAAmB,GAAyB,EAAE,CAAC;IAE/C,kBAAkB,GAAqD,EAAE,CAAC;IAE3F,YACE,cAAmB,EACF,0BAAsD;QAEvE,KAAK,CAAC,cAAc,CAAC,CAAC;QAFL,+BAA0B,GAA1B,0BAA0B,CAA4B;IAGzE,CAAC;IAED;;;;;;;OAOG;IACI,uBAAuB,CAAC,QAA2B,EAAE,KAAa;QACvE,IAAA,gBAAM,EACJ,KAAK,IAAI,MAAM,CAAC,gBAAgB,IAAI,KAAK,IAAI,MAAM,CAAC,gBAAgB,EACpE,4BAA4B,KAAK,EAAE,CACpC,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACI,oCAAoC,CAAC,QAA4B;QACtE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,wBAAwB,CAAC,QAA4B;QAC1D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,0BAA0B;QACrC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;aAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,2BAA2B;QACtC,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACxE,IAAI,CAAC,+BAA+B,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,uCAAuC,CAC3C,gBAA+E,EAC/E,iBAAqC;QAErC,IAAA,gBAAM,EACJ,iBAAiB,KAAK,SAAS,EAC/B,2DAA2D,CAC5D,CAAC;QACF,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,2BAA2B,CAC/B,gBAAoF;QAEpF,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,2BAA2B,CACtE,IAAI,EACJ,gBAAgB,CACjB,CAAC;IACJ,CAAC;CACF;AA3FD,0EA2FC;AAED;;;;;;;GAOG;AACH,MAAa,qCAAsC,SAAQ,+BAA+B;IAMrE;IALF,yCAAyC,GAAyB,EAAE,CAAC;IACrE,6BAA6B,GAAyB,EAAE,CAAC;IAE1E,YACE,cAAmB,EACF,kBAAmD,EACpE,0BAAsD;QAEtD,KAAK,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAHjC,uBAAkB,GAAlB,kBAAkB,CAAiC;IAItE,CAAC;IAEe,wBAAwB,CAAC,QAA4B;QACnE,IAAI,CAAC,yCAAyC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEe,oCAAoC,CAAC,QAA4B;QAC/E,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAEe,2BAA2B;QACzC,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IAEM,mCAAmC;QACxC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,yCAAyC,EAAE,CAAC;YACtE,IAAI,CAAC,kBAAkB,CAAC,oCAAoC,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,6BAA6B,EAAE,CAAC;YAC1D,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF;AAnCD,sFAmCC"}
1
+ {"version":3,"file":"EntityQueryContext.js","sourceRoot":"","sources":["../src/EntityQueryContext.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { EntityTransactionalQueryContext, EntityNonTransactionalQueryContext, EntityNestedTransactionalQueryContext, TransactionConfig } from './EntityQueryContext';
1
+ import { EntityTransactionalQueryContext, EntityNonTransactionalQueryContext, EntityNestedTransactionalQueryContext, TransactionConfig, TransactionalDataLoaderMode } from './EntityQueryContext';
2
2
  /**
3
3
  * A query context provider vends transactional and non-transactional query contexts.
4
4
  */
@@ -11,6 +11,10 @@ export default abstract class EntityQueryContextProvider {
11
11
  * Get the query interface for constructing a query context.
12
12
  */
13
13
  protected abstract getQueryInterface(): any;
14
+ /**
15
+ * @returns true if the transactional dataloader should be disabled for all transactions.
16
+ */
17
+ protected defaultTransactionalDataLoaderMode(): TransactionalDataLoaderMode;
14
18
  /**
15
19
  * Vend a transaction runner for use in runInTransactionAsync.
16
20
  */
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_crypto_1 = require("node:crypto");
3
4
  const EntityQueryContext_1 = require("./EntityQueryContext");
4
5
  /**
5
6
  * A query context provider vends transactional and non-transactional query contexts.
@@ -11,13 +12,19 @@ class EntityQueryContextProvider {
11
12
  getQueryContext() {
12
13
  return new EntityQueryContext_1.EntityNonTransactionalQueryContext(this.getQueryInterface(), this);
13
14
  }
15
+ /**
16
+ * @returns true if the transactional dataloader should be disabled for all transactions.
17
+ */
18
+ defaultTransactionalDataLoaderMode() {
19
+ return EntityQueryContext_1.TransactionalDataLoaderMode.ENABLED;
20
+ }
14
21
  /**
15
22
  * Start a transaction and execute the provided transaction-scoped closure within the transaction.
16
23
  * @param transactionScope - async callback to execute within the transaction
17
24
  */
18
25
  async runInTransactionAsync(transactionScope, transactionConfig) {
19
26
  const [returnedValue, queryContext] = await this.createTransactionRunner(transactionConfig)(async (queryInterface) => {
20
- const queryContext = new EntityQueryContext_1.EntityTransactionalQueryContext(queryInterface, this);
27
+ const queryContext = new EntityQueryContext_1.EntityTransactionalQueryContext(queryInterface, this, (0, node_crypto_1.randomUUID)(), transactionConfig?.transactionalDataLoaderMode ?? this.defaultTransactionalDataLoaderMode());
21
28
  const result = await transactionScope(queryContext);
22
29
  await queryContext.runPreCommitCallbacksAsync();
23
30
  return [result, queryContext];
@@ -33,13 +40,13 @@ class EntityQueryContextProvider {
33
40
  */
34
41
  async runInNestedTransactionAsync(outerQueryContext, transactionScope) {
35
42
  const [returnedValue, innerQueryContext] = await this.createNestedTransactionRunner(outerQueryContext.getQueryInterface())(async (innerQueryInterface) => {
36
- const innerQueryContext = new EntityQueryContext_1.EntityNestedTransactionalQueryContext(innerQueryInterface, outerQueryContext, this);
43
+ const innerQueryContext = new EntityQueryContext_1.EntityNestedTransactionalQueryContext(innerQueryInterface, outerQueryContext, this, (0, node_crypto_1.randomUUID)(), outerQueryContext.transactionalDataLoaderMode);
37
44
  const result = await transactionScope(innerQueryContext);
38
45
  await innerQueryContext.runPreCommitCallbacksAsync();
39
46
  return [result, innerQueryContext];
40
47
  });
41
- // post-commit callbacks are appended to parent transaction instead of run, but only after the transaction has succeeded
42
- innerQueryContext.transferPostCommitCallbacksToParent();
48
+ // behavior of this call differs for nested transaction query contexts from regular transaction query contexts
49
+ await innerQueryContext.runPostCommitCallbacksAsync();
43
50
  return returnedValue;
44
51
  }
45
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityQueryContextProvider.js","sourceRoot":"","sources":["../src/EntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,6DAK8B;AAE9B;;GAEG;AACH,MAA8B,0BAA0B;IACtD;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,uDAAkC,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAkBD;;;OAGG;IACH,KAAK,CAAC,qBAAqB,CACzB,gBAA+E,EAC/E,iBAAqC;QAErC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAEtE,iBAAiB,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;YAC5C,MAAM,YAAY,GAAG,IAAI,oDAA+B,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,2BAA2B,EAAE,CAAC;QACjD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,2BAA2B,CAC/B,iBAAkD,EAClD,gBAA0F;QAE1F,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAEjF,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE;YACrE,MAAM,iBAAiB,GAAG,IAAI,0DAAqC,CACjE,mBAAmB,EACnB,iBAAiB,EACjB,IAAI,CACL,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,iBAAiB,CAAC,0BAA0B,EAAE,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,wHAAwH;QACxH,iBAAiB,CAAC,mCAAmC,EAAE,CAAC;QACxD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AAtED,6CAsEC"}
1
+ {"version":3,"file":"EntityQueryContextProvider.js","sourceRoot":"","sources":["../src/EntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,6CAAyC;AAEzC,6DAM8B;AAE9B;;GAEG;AACH,MAA8B,0BAA0B;IACtD;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,uDAAkC,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAOD;;OAEG;IACO,kCAAkC;QAC1C,OAAO,gDAA2B,CAAC,OAAO,CAAC;IAC7C,CAAC;IAaD;;;OAGG;IACH,KAAK,CAAC,qBAAqB,CACzB,gBAA+E,EAC/E,iBAAqC;QAErC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAEtE,iBAAiB,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;YAC5C,MAAM,YAAY,GAAG,IAAI,oDAA+B,CACtD,cAAc,EACd,IAAI,EACJ,IAAA,wBAAU,GAAE,EACZ,iBAAiB,EAAE,2BAA2B,IAAI,IAAI,CAAC,kCAAkC,EAAE,CAC5F,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,2BAA2B,EAAE,CAAC;QACjD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,2BAA2B,CAC/B,iBAAkD,EAClD,gBAA0F;QAE1F,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAEjF,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE;YACrE,MAAM,iBAAiB,GAAG,IAAI,0DAAqC,CACjE,mBAAmB,EACnB,iBAAiB,EACjB,IAAI,EACJ,IAAA,wBAAU,GAAE,EACZ,iBAAiB,CAAC,2BAA2B,CAC9C,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,iBAAiB,CAAC,0BAA0B,EAAE,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,8GAA8G;QAC9G,MAAM,iBAAiB,CAAC,2BAA2B,EAAE,CAAC;QACtD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AApFD,6CAoFC"}
@@ -43,8 +43,8 @@ export default interface IEntityGenericCacher<TFields extends Record<string, any
43
43
  * from makeCacheKeyForStorage because invalidation can optionally be configured to invalidate a larger set of keys than
44
44
  * the one for just the current cache version, which can be useful for things like push safety.
45
45
  *
46
- * @param key - load key of the cache key
47
- * @param values - load values of the cache key
46
+ * @param key - load key for the cache keys
47
+ * @param value - load value for the cache keys
48
48
  */
49
49
  makeCacheKeysForInvalidation<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(key: TLoadKey, value: TLoadValue): readonly string[];
50
50
  }
@@ -1,12 +1,17 @@
1
1
  import EntityConfiguration, { EntityCompositeField, EntityCompositeFieldValue } from '../EntityConfiguration';
2
2
  import { EntityLoadMethodType, IEntityLoadKey, IEntityLoadValue, LoadValueMap } from '../internal/EntityLoadInterfaces';
3
3
  declare const CompositeFieldHolderSerializedBrand: unique symbol;
4
+ /**
5
+ * @internal
6
+ */
4
7
  export type SerializedCompositeFieldHolder = string & {
5
8
  readonly [CompositeFieldHolderSerializedBrand]: true;
6
9
  };
7
10
  /**
8
11
  * A load key that represents a composite field (set of fieldName) on an entity.
9
12
  * Must be defined in the entity configuration composite field definition.
13
+ *
14
+ * @internal
10
15
  */
11
16
  export declare class CompositeFieldHolder<TFields extends Record<string, any>, TIDField extends keyof TFields> implements IEntityLoadKey<TFields, TIDField, SerializedCompositeFieldValueHolder, CompositeFieldValueHolder<TFields, EntityCompositeField<TFields>>> {
12
17
  readonly compositeField: EntityCompositeField<TFields>;
@@ -28,11 +33,16 @@ export declare class CompositeFieldHolder<TFields extends Record<string, any>, T
28
33
  vendNewLoadValueMap<V>(): LoadValueMap<SerializedCompositeFieldValueHolder, CompositeFieldValueHolder<TFields, EntityCompositeField<TFields>>, V>;
29
34
  }
30
35
  declare const CompositeFieldValueHolderSerializedBrand: unique symbol;
36
+ /**
37
+ * @internal
38
+ */
31
39
  export type SerializedCompositeFieldValueHolder = string & {
32
40
  readonly [CompositeFieldValueHolderSerializedBrand]: true;
33
41
  };
34
42
  /**
35
43
  * A load value for a CompositeFieldHolder.
44
+ *
45
+ * @internal
36
46
  */
37
47
  export declare class CompositeFieldValueHolder<TFields extends Record<string, any>, TCompositeField extends EntityCompositeField<TFields>> implements IEntityLoadValue<SerializedCompositeFieldValueHolder> {
38
48
  readonly compositeFieldValue: EntityCompositeFieldValue<TFields, TCompositeField>;
@@ -42,6 +52,9 @@ export declare class CompositeFieldValueHolder<TFields extends Record<string, an
42
52
  static deserialize<TFields extends Record<string, any>, TCompositeField extends EntityCompositeField<TFields>>(serialized: SerializedCompositeFieldValueHolder): CompositeFieldValueHolder<TFields, TCompositeField>;
43
53
  serialize(): SerializedCompositeFieldValueHolder;
44
54
  }
55
+ /**
56
+ * @internal
57
+ */
45
58
  export declare class CompositeFieldValueHolderMap<TFields extends Record<string, any>, N extends EntityCompositeField<TFields>, V> extends LoadValueMap<SerializedCompositeFieldValueHolder, CompositeFieldValueHolder<TFields, N>, V> {
46
59
  protected deserializeKey(serializedKey: SerializedCompositeFieldValueHolder): CompositeFieldValueHolder<TFields, N>;
47
60
  }
@@ -11,6 +11,8 @@ const EntityLoadInterfaces_1 = require("../internal/EntityLoadInterfaces");
11
11
  /**
12
12
  * A load key that represents a composite field (set of fieldName) on an entity.
13
13
  * Must be defined in the entity configuration composite field definition.
14
+ *
15
+ * @internal
14
16
  */
15
17
  class CompositeFieldHolder {
16
18
  compositeField;
@@ -80,6 +82,8 @@ class CompositeFieldHolder {
80
82
  exports.CompositeFieldHolder = CompositeFieldHolder;
81
83
  /**
82
84
  * A load value for a CompositeFieldHolder.
85
+ *
86
+ * @internal
83
87
  */
84
88
  class CompositeFieldValueHolder {
85
89
  compositeFieldValue;
@@ -107,6 +111,9 @@ class CompositeFieldValueHolder {
107
111
  }
108
112
  }
109
113
  exports.CompositeFieldValueHolder = CompositeFieldValueHolder;
114
+ /**
115
+ * @internal
116
+ */
110
117
  class CompositeFieldValueHolderMap extends EntityLoadInterfaces_1.LoadValueMap {
111
118
  deserializeKey(serializedKey) {
112
119
  return CompositeFieldValueHolder.deserialize(serializedKey);
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeFieldHolder.js","sourceRoot":"","sources":["../../src/internal/CompositeFieldHolder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CompositeFieldHolder.js","sourceRoot":"","sources":["../../src/internal/CompositeFieldHolder.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAkC;AAMlC,gDAAsC;AACtC,qFAAkF;AAClF,2EAK0C;AAW1C;;;;;GAKG;AACH,MAAa,oBAAoB;IAWf,cAAc,CAAgC;IAE9D,YAAY,mBAAkD;QAC5D,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,QAAQ;QACN,OAAO,kBAAkB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5D,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAEM,gDAAgD,CACrD,YAAqB;QAErB,MAAM,SAAS,GAAG,IAAA,kBAAI,EAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YACpF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAmC,CAAC;IAC/E,CAAC;IAED,WAAW,CAAC,mBAA2D;QACrE,OAAO,mBAAmB,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5F,CAAC;IAED,kBAAkB,CAChB,mBAA2D;QAE3D,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC3C,IAAA,+DAA8B,EAAC,mBAAmB,EAAE,SAAS,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,iBAAiB,CACf,KAAwE;QAExE,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,qBAAqB,CACnB,MAAyB;QAEzB,OAAO,IAAI,CAAC,gDAAgD,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,+BAA+B,CAC7B,mBAA2D,EAC3D,KAAwE;QAExE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACxD,MAAM,UAAU,GAAG,mBAAmB,CAAC,0BAA0B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjF,IAAA,mBAAS,EAAC,UAAU,EAAE,sCAAsC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACjF,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAClD,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CACpD,CAAC;QACF,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,iBAAiB;QACf,OAAO,2CAAoB,CAAC,SAAS,CAAC;IACxC,CAAC;IAED,2BAA2B;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED,kBAAkB,CAChB,KAAwE;QAExE,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB,CAClB,KAA0C;QAE1C,OAAO,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,iDAAiD,CAC/C,MAAoF,EACpF,eAAuB;QAEvB,MAAM,mCAAmC,GAAG,CAC1C,KAAwE,EAC/D,EAAE,CACX,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAC3C,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,CAChE,CAAC;QAEJ,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAChF,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,iBAAiB,eAAe,KAAK,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAC9D,MAAM,CAAC,iBAAiB,CAC1B,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mBAAmB;QAKjB,OAAO,IAAI,4BAA4B,EAAE,CAAC;IAC5C,CAAC;CACF;AA9HD,oDA8HC;AAWD;;;;GAIG;AACH,MAAa,yBAAyB;IAMlB;IADlB,YACkB,mBAAwE;QAAxE,wBAAmB,GAAnB,mBAAmB,CAAqD;IACvF,CAAC;IAEJ,QAAQ;QACN,OAAO,uBAAuB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;aACnE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;aAC9D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAsB,CAAC,CAAC;IAC7E,CAAC;IAEM,MAAM,CAAC,WAAW,CAIvB,UAA+C;QAE/C,OAAO,IAAI,yBAAyB,CAClC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAwD,CAC9E,CAAC;IACJ,CAAC;IAEM,SAAS;QACd,8FAA8F;QAC9F,mEAAmE;QACnE,0FAA0F;QAC1F,iEAAiE;QACjE,0FAA0F;QAC1F,OAAO,IAAI,CAAC,SAAS,CACnB,IAAI,CAAC,mBAAmB,EACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CACN,CAAC;IAC3C,CAAC;CACF;AAzCD,8DAyCC;AAED;;GAEG;AACH,MAAa,4BAIX,SAAQ,mCAIT;IACoB,cAAc,CAC/B,aAAkD;QAElD,OAAO,yBAAyB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;CACF;AAdD,oEAcC"}
@@ -1,5 +1,8 @@
1
1
  import { EntityCompositeField, EntityCompositeFieldValue } from '../EntityConfiguration';
2
2
  import { CompositeFieldValueHolder } from './CompositeFieldHolder';
3
+ /**
4
+ * @internal
5
+ */
3
6
  export declare class CompositeFieldValueMap<TFields extends Record<string, any>, N extends EntityCompositeField<TFields>, TOutput> implements ReadonlyMap<EntityCompositeFieldValue<TFields, N>, TOutput> {
4
7
  private readonly map;
5
8
  constructor(entries: [CompositeFieldValueHolder<TFields, N>, TOutput][]);
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CompositeFieldValueMap = void 0;
4
4
  const CompositeFieldHolder_1 = require("./CompositeFieldHolder");
5
+ /**
6
+ * @internal
7
+ */
5
8
  class CompositeFieldValueMap {
6
9
  map;
7
10
  constructor(entries) {
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeFieldValueMap.js","sourceRoot":"","sources":["../../src/internal/CompositeFieldValueMap.ts"],"names":[],"mappings":";;;AACA,iEAGgC;AAEhC,MAAa,sBAAsB;IAMhB,GAAG,CAAoD;IAExE,YAAY,OAA2D;QACrE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgD,CAAC;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,mBAA0D;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,gDAAyB,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,GAAG,CAAC,mBAA0D;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,gDAAyB,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,CACL,UAIS,EACT,OAAa;QAEb,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CACb,OAAO,EACP,KAAK,EACL,gDAAyB,CAAC,WAAW,CAAa,GAAG,CAAC,CAAC,mBAAmB,EAC1E,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,CAAC,OAAO;QACN,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,gDAAyB,CAAC,WAAW,CAAa,GAAG,CAAC,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,CAAC,IAAI;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,gDAAyB,CAAC,WAAW,CAAa,GAAG,CAAC,CAAC,mBAAmB,CAAC;QACnF,CAAC;IACH,CAAC;IAED,CAAC,MAAM;QACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,wBAAwB,CAAC;IAClC,CAAC;CACF;AAvED,wDAuEC"}
1
+ {"version":3,"file":"CompositeFieldValueMap.js","sourceRoot":"","sources":["../../src/internal/CompositeFieldValueMap.ts"],"names":[],"mappings":";;;AACA,iEAGgC;AAEhC;;GAEG;AACH,MAAa,sBAAsB;IAMhB,GAAG,CAAoD;IAExE,YAAY,OAA2D;QACrE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgD,CAAC;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,mBAA0D;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,gDAAyB,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,GAAG,CAAC,mBAA0D;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,gDAAyB,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,CACL,UAIS,EACT,OAAa;QAEb,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CACb,OAAO,EACP,KAAK,EACL,gDAAyB,CAAC,WAAW,CAAa,GAAG,CAAC,CAAC,mBAAmB,EAC1E,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,CAAC,OAAO;QACN,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,gDAAyB,CAAC,WAAW,CAAa,GAAG,CAAC,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,CAAC,IAAI;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,gDAAyB,CAAC,WAAW,CAAa,GAAG,CAAC,CAAC,mBAAmB,CAAC;QACnF,CAAC;IACH,CAAC;IAED,CAAC,MAAM;QACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,wBAAwB,CAAC;IAClC,CAAC;CACF;AAvED,wDAuEC"}
@@ -1,6 +1,6 @@
1
1
  import ReadThroughEntityCache from './ReadThroughEntityCache';
2
2
  import EntityDatabaseAdapter, { FieldEqualityCondition, QuerySelectionModifiers, QuerySelectionModifiersWithOrderByRaw } from '../EntityDatabaseAdapter';
3
- import { EntityQueryContext } from '../EntityQueryContext';
3
+ import { EntityQueryContext, EntityTransactionalQueryContext } from '../EntityQueryContext';
4
4
  import EntityQueryContextProvider from '../EntityQueryContextProvider';
5
5
  import { IEntityLoadKey, IEntityLoadValue, LoadPair } from './EntityLoadInterfaces';
6
6
  import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
@@ -9,6 +9,8 @@ import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
9
9
  * data including local caches, EntityCacheAdapter, and EntityDatabaseAdapter.
10
10
  *
11
11
  * It is also responsible for invalidating all sources of data when mutated using EntityMutator.
12
+ *
13
+ * @internal
12
14
  */
13
15
  export default class EntityDataManager<TFields extends Record<string, any>, TIDField extends keyof TFields> {
14
16
  private readonly databaseAdapter;
@@ -16,10 +18,13 @@ export default class EntityDataManager<TFields extends Record<string, any>, TIDF
16
18
  private readonly queryContextProvider;
17
19
  private readonly metricsAdapter;
18
20
  private readonly entityClassName;
19
- private readonly dataloaders;
21
+ private readonly dataLoaders;
22
+ private readonly transactionalDataLoaders;
20
23
  constructor(databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>, entityCache: ReadThroughEntityCache<TFields, TIDField>, queryContextProvider: EntityQueryContextProvider, metricsAdapter: IEntityMetricsAdapter, entityClassName: string);
21
24
  private getDataLoaderForLoadKey;
22
- private loadManyForDataLoaderAsync;
25
+ private loadManyForNonTransactionalDataLoaderAsync;
26
+ private getTransactionalDataLoaderForLoadKey;
27
+ private loadManyForTransactionalDataLoaderAsync;
23
28
  /**
24
29
  * Load many objects through read-through dataloader (batcher) and cache (optional).
25
30
  *
@@ -51,9 +56,23 @@ export default class EntityDataManager<TFields extends Record<string, any>, TIDF
51
56
  */
52
57
  loadManyByRawWhereClauseAsync(queryContext: EntityQueryContext, rawWhereClause: string, bindings: any[] | object, querySelectionModifiers: QuerySelectionModifiersWithOrderByRaw<TFields>): Promise<readonly Readonly<TFields>[]>;
53
58
  private invalidateOneAsync;
59
+ private invalidateOneForTransaction;
54
60
  /**
55
61
  * Invalidate all caches, in-memory or otherwise, for sets of key-value pairs.
56
62
  * @param pairs - key-value pairs to invalidate
57
63
  */
58
64
  invalidateKeyValuePairsAsync(pairs: readonly LoadPair<TFields, TIDField, any, any, any>[]): Promise<void>;
65
+ /**
66
+ * Invalidate all in-memory caches for sets of key-value pairs for all transactions and parent transactions.
67
+ * @param pairs - key-value pairs to invalidate
68
+ */
69
+ invalidateKeyValuePairsForTransaction(queryContext: EntityTransactionalQueryContext, pairs: readonly LoadPair<TFields, TIDField, any, any, any>[]): void;
70
+ /**
71
+ * Traverse to root of transactional query context tree.
72
+ */
73
+ private static getOutermostTransactionalQueryContextIfInNestedTransaction;
74
+ /**
75
+ * Get a list of all child query contexts recursively for a given query context.
76
+ */
77
+ private static getAllDescendantTransactionalQueryContexts;
59
78
  }
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const dataloader_1 = __importDefault(require("dataloader"));
7
7
  const invariant_1 = __importDefault(require("invariant"));
8
+ const EntityQueryContext_1 = require("../EntityQueryContext");
8
9
  const entityUtils_1 = require("../entityUtils");
9
10
  const EntityMetricsUtils_1 = require("../metrics/EntityMetricsUtils");
10
11
  const IEntityMetricsAdapter_1 = require("../metrics/IEntityMetricsAdapter");
@@ -14,6 +15,8 @@ const maps_1 = require("../utils/collections/maps");
14
15
  * data including local caches, EntityCacheAdapter, and EntityDatabaseAdapter.
15
16
  *
16
17
  * It is also responsible for invalidating all sources of data when mutated using EntityMutator.
18
+ *
19
+ * @internal
17
20
  */
18
21
  class EntityDataManager {
19
22
  databaseAdapter;
@@ -21,7 +24,10 @@ class EntityDataManager {
21
24
  queryContextProvider;
22
25
  metricsAdapter;
23
26
  entityClassName;
24
- dataloaders = new Map();
27
+ // map from (load method type + data manager data loader key) to dataloader
28
+ dataLoaders = new Map();
29
+ // map from transaction id to dataloader map
30
+ transactionalDataLoaders = new Map();
25
31
  constructor(databaseAdapter, entityCache, queryContextProvider, metricsAdapter, entityClassName) {
26
32
  this.databaseAdapter = databaseAdapter;
27
33
  this.entityCache = entityCache;
@@ -30,17 +36,18 @@ class EntityDataManager {
30
36
  this.entityClassName = entityClassName;
31
37
  }
32
38
  getDataLoaderForLoadKey(key) {
33
- return (0, maps_1.computeIfAbsent)(this.dataloaders, key.getLoadMethodType() + key.getDataManagerDataLoaderKey(), () => {
39
+ return (0, maps_1.computeIfAbsent)(this.dataLoaders, key.getLoadMethodType() + key.getDataManagerDataLoaderKey(), () => {
34
40
  return new dataloader_1.default(async (serializedLoadValues) => {
35
41
  const values = serializedLoadValues.map((serializedLoadValue) => key.deserializeLoadValue(serializedLoadValue));
36
- const objectMap = await this.loadManyForDataLoaderAsync(key, values);
42
+ const objectMap = await this.loadManyForNonTransactionalDataLoaderAsync(key, values);
37
43
  return values.map((value) => objectMap.get(value) ?? []);
38
44
  });
39
45
  });
40
46
  }
41
- async loadManyForDataLoaderAsync(key, values) {
47
+ async loadManyForNonTransactionalDataLoaderAsync(key, values) {
42
48
  this.metricsAdapter.incrementDataManagerLoadCount({
43
49
  type: IEntityMetricsAdapter_1.IncrementLoadCountEventType.CACHE,
50
+ isInTransaction: false,
44
51
  fieldValueCount: values.length,
45
52
  entityClassName: this.entityClassName,
46
53
  loadType: key.getLoadMethodType(),
@@ -48,6 +55,7 @@ class EntityDataManager {
48
55
  return await this.entityCache.readManyThroughAsync(key, values, async (fetcherValues) => {
49
56
  this.metricsAdapter.incrementDataManagerLoadCount({
50
57
  type: IEntityMetricsAdapter_1.IncrementLoadCountEventType.DATABASE,
58
+ isInTransaction: false,
51
59
  fieldValueCount: fetcherValues.length,
52
60
  entityClassName: this.entityClassName,
53
61
  loadType: key.getLoadMethodType(),
@@ -55,6 +63,29 @@ class EntityDataManager {
55
63
  return await this.databaseAdapter.fetchManyWhereAsync(this.queryContextProvider.getQueryContext(), key, fetcherValues);
56
64
  });
57
65
  }
66
+ getTransactionalDataLoaderForLoadKey(queryContext, key) {
67
+ const dataLoaderMapForTransaction = (0, maps_1.computeIfAbsent)(this.transactionalDataLoaders, queryContext.transactionId, () => new Map());
68
+ return (0, maps_1.computeIfAbsent)(dataLoaderMapForTransaction, key.getLoadMethodType() + key.getDataManagerDataLoaderKey(), () => {
69
+ return new dataloader_1.default(async (serializedLoadValues) => {
70
+ const values = serializedLoadValues.map((serializedLoadValue) => key.deserializeLoadValue(serializedLoadValue));
71
+ const objectMap = await this.loadManyForTransactionalDataLoaderAsync(queryContext, key, values);
72
+ return values.map((value) => objectMap.get(value) ?? []);
73
+ }, {
74
+ // only cache if transactional dataloader caching is enabled for the transactional query context
75
+ cache: queryContext.transactionalDataLoaderMode === EntityQueryContext_1.TransactionalDataLoaderMode.ENABLED,
76
+ });
77
+ });
78
+ }
79
+ async loadManyForTransactionalDataLoaderAsync(queryContext, key, values) {
80
+ this.metricsAdapter.incrementDataManagerLoadCount({
81
+ type: IEntityMetricsAdapter_1.IncrementLoadCountEventType.DATABASE,
82
+ isInTransaction: true,
83
+ fieldValueCount: values.length,
84
+ entityClassName: this.entityClassName,
85
+ loadType: key.getLoadMethodType(),
86
+ });
87
+ return await this.databaseAdapter.fetchManyWhereAsync(queryContext, key, values);
88
+ }
58
89
  /**
59
90
  * Load many objects through read-through dataloader (batcher) and cache (optional).
60
91
  *
@@ -64,21 +95,31 @@ class EntityDataManager {
64
95
  * @returns map from load value to objects that match the query for that load value
65
96
  */
66
97
  async loadManyEqualingAsync(queryContext, key, values) {
67
- return await (0, EntityMetricsUtils_1.timeAndLogLoadMapEventAsync)(this.metricsAdapter, IEntityMetricsAdapter_1.EntityMetricsLoadType.LOAD_MANY, this.entityClassName)(this.loadManyEqualingInternalAsync(queryContext, key, values));
98
+ return await (0, EntityMetricsUtils_1.timeAndLogLoadMapEventAsync)(this.metricsAdapter, IEntityMetricsAdapter_1.EntityMetricsLoadType.LOAD_MANY, this.entityClassName, queryContext)(this.loadManyEqualingInternalAsync(queryContext, key, values));
68
99
  }
69
100
  async loadManyEqualingInternalAsync(queryContext, key, values) {
70
101
  key.validateRuntimeLoadValuesForDataManagerDataLoader(values, this.entityClassName);
71
- // don't cache when in transaction, as rollbacks complicate things significantly
72
- if (queryContext.isInTransaction()) {
102
+ if (queryContext.isInTransaction() &&
103
+ queryContext.transactionalDataLoaderMode === EntityQueryContext_1.TransactionalDataLoaderMode.DISABLED) {
104
+ this.metricsAdapter.incrementDataManagerLoadCount({
105
+ type: IEntityMetricsAdapter_1.IncrementLoadCountEventType.DATABASE,
106
+ isInTransaction: true,
107
+ fieldValueCount: values.length,
108
+ entityClassName: this.entityClassName,
109
+ loadType: key.getLoadMethodType(),
110
+ });
73
111
  return await this.databaseAdapter.fetchManyWhereAsync(queryContext, key, values);
74
112
  }
75
113
  this.metricsAdapter.incrementDataManagerLoadCount({
76
114
  type: IEntityMetricsAdapter_1.IncrementLoadCountEventType.DATALOADER,
115
+ isInTransaction: queryContext.isInTransaction(),
77
116
  fieldValueCount: values.length,
78
117
  entityClassName: this.entityClassName,
79
118
  loadType: key.getLoadMethodType(),
80
119
  });
81
- const dataLoader = this.getDataLoaderForLoadKey(key);
120
+ const dataLoader = queryContext.isInTransaction()
121
+ ? this.getTransactionalDataLoaderForLoadKey(queryContext, key)
122
+ : this.getDataLoaderForLoadKey(key);
82
123
  const results = await dataLoader.loadMany(values.map((v) => key.serializeLoadValue(v)));
83
124
  const [successfulValues, errors] = (0, entityUtils_1.partitionErrors)(results);
84
125
  if (errors.length > 0) {
@@ -102,7 +143,7 @@ class EntityDataManager {
102
143
  * @returns array of objects matching the query
103
144
  */
104
145
  async loadManyByFieldEqualityConjunctionAsync(queryContext, fieldEqualityOperands, querySelectionModifiers) {
105
- return await (0, EntityMetricsUtils_1.timeAndLogLoadEventAsync)(this.metricsAdapter, IEntityMetricsAdapter_1.EntityMetricsLoadType.LOAD_MANY_EQUALITY_CONJUNCTION, this.entityClassName)(this.databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(queryContext, fieldEqualityOperands, querySelectionModifiers));
146
+ return await (0, EntityMetricsUtils_1.timeAndLogLoadEventAsync)(this.metricsAdapter, IEntityMetricsAdapter_1.EntityMetricsLoadType.LOAD_MANY_EQUALITY_CONJUNCTION, this.entityClassName, queryContext)(this.databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(queryContext, fieldEqualityOperands, querySelectionModifiers));
106
147
  }
107
148
  /**
108
149
  * Loads many objects matching the raw WHERE clause.
@@ -114,20 +155,67 @@ class EntityDataManager {
114
155
  * @returns array of objects matching the query
115
156
  */
116
157
  async loadManyByRawWhereClauseAsync(queryContext, rawWhereClause, bindings, querySelectionModifiers) {
117
- return await (0, EntityMetricsUtils_1.timeAndLogLoadEventAsync)(this.metricsAdapter, IEntityMetricsAdapter_1.EntityMetricsLoadType.LOAD_MANY_RAW, this.entityClassName)(this.databaseAdapter.fetchManyByRawWhereClauseAsync(queryContext, rawWhereClause, bindings, querySelectionModifiers));
158
+ return await (0, EntityMetricsUtils_1.timeAndLogLoadEventAsync)(this.metricsAdapter, IEntityMetricsAdapter_1.EntityMetricsLoadType.LOAD_MANY_RAW, this.entityClassName, queryContext)(this.databaseAdapter.fetchManyByRawWhereClauseAsync(queryContext, rawWhereClause, bindings, querySelectionModifiers));
118
159
  }
119
160
  async invalidateOneAsync(key, value) {
120
161
  await this.entityCache.invalidateManyAsync(key, [value]);
121
162
  this.getDataLoaderForLoadKey(key).clear(key.serializeLoadValue(value));
122
163
  }
164
+ invalidateOneForTransaction(queryContext, key, value) {
165
+ this.getTransactionalDataLoaderForLoadKey(queryContext, key).clear(key.serializeLoadValue(value));
166
+ }
123
167
  /**
124
168
  * Invalidate all caches, in-memory or otherwise, for sets of key-value pairs.
125
169
  * @param pairs - key-value pairs to invalidate
126
170
  */
127
171
  async invalidateKeyValuePairsAsync(pairs) {
128
- // TODO(wschurman): check for races with load
129
172
  await Promise.all(pairs.map(([key, value]) => this.invalidateOneAsync(key, value)));
130
173
  }
174
+ /**
175
+ * Invalidate all in-memory caches for sets of key-value pairs for all transactions and parent transactions.
176
+ * @param pairs - key-value pairs to invalidate
177
+ */
178
+ invalidateKeyValuePairsForTransaction(queryContext, pairs) {
179
+ if (queryContext.transactionalDataLoaderMode === EntityQueryContext_1.TransactionalDataLoaderMode.DISABLED) {
180
+ return;
181
+ }
182
+ // invalidate all query contexts in transaction tree
183
+ const outermostTransactionalQueryContext = EntityDataManager.getOutermostTransactionalQueryContextIfInNestedTransaction(queryContext);
184
+ const allQueryContextsToInvalidate = [
185
+ outermostTransactionalQueryContext,
186
+ ...EntityDataManager.getAllDescendantTransactionalQueryContexts(outermostTransactionalQueryContext),
187
+ ];
188
+ for (const currentQueryContext of allQueryContextsToInvalidate) {
189
+ for (const [key, value] of pairs) {
190
+ this.invalidateOneForTransaction(currentQueryContext, key, value);
191
+ }
192
+ }
193
+ }
194
+ /**
195
+ * Traverse to root of transactional query context tree.
196
+ */
197
+ static getOutermostTransactionalQueryContextIfInNestedTransaction(queryContext) {
198
+ if (queryContext.isInNestedTransaction()) {
199
+ return EntityDataManager.getOutermostTransactionalQueryContextIfInNestedTransaction(queryContext.parentQueryContext);
200
+ }
201
+ else {
202
+ return queryContext;
203
+ }
204
+ }
205
+ /**
206
+ * Get a list of all child query contexts recursively for a given query context.
207
+ */
208
+ static getAllDescendantTransactionalQueryContexts(queryContext) {
209
+ if (queryContext.childQueryContexts.length === 0) {
210
+ return [];
211
+ }
212
+ return queryContext.childQueryContexts.flatMap((childQueryContext) => {
213
+ return [
214
+ childQueryContext,
215
+ ...EntityDataManager.getAllDescendantTransactionalQueryContexts(childQueryContext),
216
+ ];
217
+ });
218
+ }
131
219
  }
132
220
  exports.default = EntityDataManager;
133
221
  //# sourceMappingURL=EntityDataManager.js.map